cleanup
[cdm-vaadin.git] / src / main / java / eu / etaxonomy / vaadin / ui / navigation / PopupViewRegistration.java
1 /**
2 * Copyright (C) 2018 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9 package eu.etaxonomy.vaadin.ui.navigation;
10
11 import java.util.HashMap;
12 import java.util.Map;
13
14 import org.apache.logging.log4j.LogManager;
15 import org.apache.logging.log4j.Logger;
16
17 import com.vaadin.server.ClientConnector;
18 import com.vaadin.server.ClientConnector.DetachEvent;
19 import com.vaadin.server.ClientConnector.DetachListener;
20 import com.vaadin.ui.Field;
21 import com.vaadin.ui.Window;
22
23 import eu.etaxonomy.vaadin.mvp.ApplicationView;
24 import eu.etaxonomy.vaadin.ui.view.PopupView;
25
26 /**
27 * @author a.kohlbecker
28 * @since May 16, 2018
29 */
30 public class PopupViewRegistration implements DetachListener {
31
32 private static final long serialVersionUID = -5946913287379095637L;
33
34 private static final Logger logger = LogManager.getLogger();
35
36 private Map<PopupView, Window> popupWindowMap = new HashMap<>();
37
38 private Map<ApplicationView<?>, Map<PopupView, Field<?>>> popupViewFieldMap = new HashMap<>();
39
40 /**
41 * @param view
42 * @param popup
43 * @param field can be <code>null</code>
44 * @return the previous Field associated with the popup that has been opened in the view
45 */
46 public Field<?> put(Window window, ApplicationView parentView, PopupView popup, Field<?> field){
47
48 ((ClientConnector)parentView).addDetachListener(this);
49 popupWindowMap.put(popup, window);
50
51 if(!popupViewFieldMap.containsKey(parentView)){
52 popupViewFieldMap.put(parentView, new HashMap<>());
53 }
54 Map<PopupView, Field<?>> popupFieldMap = popupViewFieldMap.get(parentView);
55 return popupFieldMap.put(popup, field);
56 }
57
58 public Field<?> get(ApplicationView view, PopupView popup){
59 if(!popupViewFieldMap.containsKey(view)){
60 popupViewFieldMap.get(view).get(popup);
61 }
62 return null;
63 }
64
65 public Field<?> get(PopupView popup){
66 for(Map<PopupView, Field<?>> popupFieldMap : popupViewFieldMap.values()){
67 if(popupFieldMap.containsKey(popup)){
68 return popupFieldMap.get(popup);
69 }
70 }
71 return null;
72 }
73
74 /**
75 * @param popup
76 */
77 public void remove(PopupView popup) {
78
79 popupWindowMap.remove(popup);
80
81 for(Map<PopupView, Field<?>> popupFieldMap : popupViewFieldMap.values()){
82 if(popupFieldMap.containsKey(popup)){
83 popupFieldMap.remove(popup);
84 if(logger.isDebugEnabled()){
85 logger.debug(popup + " removed from popupViewFieldMap");
86 }
87 }
88 }
89 }
90
91 /**
92 * @param popup
93 * @return
94 */
95 public Window getWindow(PopupView popup) {
96 return popupWindowMap.get(popup);
97 }
98
99 /**
100 * {@inheritDoc}
101 */
102 @Override
103 public void detach(DetachEvent event) {
104 ClientConnector connector = event.getConnector();
105 if(ApplicationView.class.isAssignableFrom(connector.getClass())){
106 Map<PopupView, Field<?>> removal = popupViewFieldMap.remove(connector);
107 if(logger.isDebugEnabled() && removal != null){
108 logger.debug( connector + " removed from popupViewFieldMap");
109 }
110 } else if(PopupView.class.isAssignableFrom(connector.getClass())){
111 remove((PopupView)connector);
112 }
113
114 }
115
116 }