1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.ui.vaadin.gwt.client.applauncher.connector;
35
36 import info.magnolia.ui.vaadin.applauncher.AppLauncher;
37 import info.magnolia.ui.vaadin.gwt.client.applauncher.shared.AppGroup;
38 import info.magnolia.ui.vaadin.gwt.client.applauncher.shared.AppTile;
39 import info.magnolia.ui.vaadin.gwt.client.applauncher.widget.AppLauncherView;
40 import info.magnolia.ui.vaadin.gwt.client.applauncher.widget.AppLauncherView.Presenter;
41 import info.magnolia.ui.vaadin.gwt.client.applauncher.widget.AppLauncherViewImpl;
42
43 import java.util.ArrayList;
44 import java.util.Collections;
45 import java.util.Comparator;
46 import java.util.HashMap;
47 import java.util.Iterator;
48 import java.util.List;
49 import java.util.Map;
50
51 import com.google.gwt.dom.client.Element;
52 import com.google.gwt.event.shared.HandlerRegistration;
53 import com.google.gwt.user.client.Event;
54 import com.google.gwt.user.client.History;
55 import com.google.gwt.user.client.ui.Widget;
56 import com.google.web.bindery.event.shared.EventBus;
57 import com.google.web.bindery.event.shared.SimpleEventBus;
58 import com.vaadin.client.communication.StateChangeEvent;
59 import com.vaadin.client.communication.StateChangeEvent.StateChangeHandler;
60 import com.vaadin.client.ui.AbstractComponentConnector;
61 import com.vaadin.client.ui.layout.ElementResizeListener;
62 import com.vaadin.shared.ui.Connect;
63
64
65
66
67 @Connect(AppLauncher.class)
68 public class AppLauncherConnector extends AbstractComponentConnector implements Presenter {
69
70 private AppLauncherView view;
71
72 private EventBus eventBus = new SimpleEventBus();
73
74 private HandlerRegistration eventPreviewHandle;
75
76 private Map<Element, ElementResizeListener> resizeListeners = new HashMap<Element, ElementResizeListener>();
77
78 public AppLauncherConnector() {
79
80 addStateChangeHandler("appGroups", new StateChangeHandler() {
81 @Override
82 public void onStateChanged(StateChangeEvent stateChangeEvent) {
83
84 List<AppGroup> groups = new ArrayList<AppGroup>(getState().appGroups.values());
85 Collections.sort(groups, new GroupComparator(getState().groupsOrder));
86
87
88 view.clear();
89 for (final AppGroup appGroup : groups) {
90 view.addAppGroup(appGroup);
91 for (final AppTile tile : appGroup.getAppTiles()) {
92 view.addAppTile(tile, appGroup);
93 }
94 }
95
96 updateRunningAppTiles();
97 }
98 });
99
100 addStateChangeHandler("runningApps", new StateChangeHandler() {
101 @Override
102 public void onStateChanged(StateChangeEvent stateChangeEvent) {
103 updateRunningAppTiles();
104 }
105 });
106 }
107
108 @Override
109 protected void init() {
110 super.init();
111 this.eventPreviewHandle = Event.addNativePreviewHandler(new Event.NativePreviewHandler() {
112 @Override
113 public void onPreviewNativeEvent(Event.NativePreviewEvent event) {
114 int eventCode = event.getTypeInt();
115 boolean isTouchOrMouse = (eventCode & Event.MOUSEEVENTS) > 0 || (eventCode & Event.TOUCHEVENTS) > 0;
116
117 final Element eventTarget = event.getNativeEvent().getEventTarget().cast();
118
119 if (!getWidget().getElement().isOrHasChild(eventTarget)) {
120 return;
121 }
122
123 if ((isTouchOrMouse && eventCode != Event.ONMOUSEOVER && eventCode != Event.ONMOUSEOUT && getConnection().getMessageSender().hasActiveRequest())) {
124 event.cancel();
125 }
126 }
127 });
128 }
129
130 private void updateRunningAppTiles() {
131 for (final AppGroup appGroup : getState().appGroups.values()) {
132 for (final AppTile tile : appGroup.getAppTiles()) {
133 if (getState().runningApps.contains(tile.getName())) {
134 view.setAppActive(tile.getName(), true);
135 } else {
136 view.setAppActive(tile.getName(), false);
137 }
138 }
139 }
140 }
141
142 @Override
143 public Widget getWidget() {
144 return super.getWidget();
145 }
146
147 @Override
148 protected Widget createWidget() {
149 this.view = new AppLauncherViewImpl(eventBus);
150 this.view.setPresenter(this);
151 return view.asWidget();
152 }
153
154 @Override
155 public AppLauncherState getState() {
156 return (AppLauncherState) super.getState();
157 }
158
159 @Override
160 protected AppLauncherState createState() {
161 return new AppLauncherState();
162 }
163
164 @Override
165 public void onUnregister() {
166 super.onUnregister();
167 eventPreviewHandle.removeHandler();
168 final Iterator<Map.Entry<Element,ElementResizeListener>> it = resizeListeners.entrySet().iterator();
169 while (it.hasNext()) {
170 final Map.Entry<Element,ElementResizeListener> entry = it.next();
171 getLayoutManager().removeElementResizeListener(entry.getKey(), entry.getValue());
172 }
173 }
174
175 @Override
176 public void activateApp(String appName) {
177 History.newItem("app:" + appName, true);
178 }
179
180 @Override
181 public void registerElementResizeListener(Element element, ElementResizeListener elementResizeListener) {
182 resizeListeners.put(element, elementResizeListener);
183 getLayoutManager().addElementResizeListener(element, elementResizeListener);
184 }
185
186
187
188
189
190 static class GroupComparator implements Comparator<AppGroup> {
191
192 private List<String> groupOrder;
193
194 public GroupComparator(List<String> groupOrder) {
195 this.groupOrder = groupOrder;
196 }
197
198 @Override
199 public int compare(AppGroup o1, AppGroup o2) {
200 boolean perm1 = o1.isPermanent();
201 boolean perm2 = o2.isPermanent();
202 if (perm1 == perm2) {
203 Integer idx1 = groupOrder.indexOf(o1.getName());
204 Integer idx2 = groupOrder.indexOf(o2.getName());
205 return idx1.compareTo(idx2);
206 }
207 return perm1 == true ? -1 : 1;
208 }
209 }
210
211 }