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.List;
47
48 import com.google.gwt.dom.client.Element;
49 import com.google.gwt.event.shared.HandlerRegistration;
50 import com.google.gwt.user.client.Event;
51 import com.google.gwt.user.client.History;
52 import com.google.gwt.user.client.ui.Widget;
53 import com.google.web.bindery.event.shared.EventBus;
54 import com.google.web.bindery.event.shared.SimpleEventBus;
55 import com.vaadin.client.communication.StateChangeEvent;
56 import com.vaadin.client.communication.StateChangeEvent.StateChangeHandler;
57 import com.vaadin.client.ui.AbstractComponentConnector;
58 import com.vaadin.shared.ui.Connect;
59
60
61
62
63 @Connect(AppLauncher.class)
64 public class AppLauncherConnector extends AbstractComponentConnector {
65
66 private AppLauncherView view;
67
68 private EventBus eventBus = new SimpleEventBus();
69
70 private HandlerRegistration eventPreviewHandle;
71
72 public AppLauncherConnector() {
73
74 addStateChangeHandler("appGroups", new StateChangeHandler() {
75 @Override
76 public void onStateChanged(StateChangeEvent stateChangeEvent) {
77
78 List<AppGroup> groups = new ArrayList<AppGroup>(getState().appGroups.values());
79 Collections.sort(groups, new GroupComparator(getState().groupsOrder));
80
81
82 view.clear();
83 for (final AppGroup appGroup : groups) {
84 view.addAppGroup(appGroup);
85 for (final AppTile tile : appGroup.getAppTiles()) {
86 view.addAppTile(tile, appGroup);
87 }
88 }
89
90 updateRunningAppTiles();
91 }
92 });
93
94 addStateChangeHandler("runningApps", new StateChangeHandler() {
95 @Override
96 public void onStateChanged(StateChangeEvent stateChangeEvent) {
97 updateRunningAppTiles();
98 }
99 });
100 }
101
102 @Override
103 protected void init() {
104 super.init();
105 this.eventPreviewHandle = Event.addNativePreviewHandler(new Event.NativePreviewHandler() {
106 @Override
107 public void onPreviewNativeEvent(Event.NativePreviewEvent event) {
108 int eventCode = event.getTypeInt();
109 boolean isTouchOrMouse = (eventCode & Event.MOUSEEVENTS) > 0 || (eventCode & Event.TOUCHEVENTS) > 0;
110
111 final Element eventTarget = event.getNativeEvent().getEventTarget().cast();
112
113 if (!getWidget().getElement().isOrHasChild(eventTarget)) {
114 return;
115 }
116
117 if ((isTouchOrMouse && eventCode != Event.ONMOUSEOVER && eventCode != Event.ONMOUSEOUT && getConnection().hasActiveRequest())) {
118 event.cancel();
119 }
120 }
121 });
122 }
123
124 private void updateRunningAppTiles() {
125 for (final AppGroup appGroup : getState().appGroups.values()) {
126 for (final AppTile tile : appGroup.getAppTiles()) {
127 if (getState().runningApps.contains(tile.getName())) {
128 view.setAppActive(tile.getName(), true);
129 } else {
130 view.setAppActive(tile.getName(), false);
131 }
132 }
133 }
134 }
135
136 @Override
137 public Widget getWidget() {
138 return super.getWidget();
139 }
140
141 @Override
142 protected Widget createWidget() {
143 this.view = new AppLauncherViewImpl(eventBus);
144 this.view.setPresenter(new Presenter() {
145 @Override
146 public void activateApp(final String appName) {
147 History.newItem("app:" + appName, true);
148 }
149 });
150 return view.asWidget();
151 }
152
153 @Override
154 public AppLauncherState getState() {
155 return (AppLauncherState) super.getState();
156 }
157
158 @Override
159 protected AppLauncherState createState() {
160 return new AppLauncherState();
161 }
162
163
164 @Override
165 public void onUnregister() {
166 super.onUnregister();
167 eventPreviewHandle.removeHandler();
168 }
169
170
171
172
173
174 static class GroupComparator implements Comparator<AppGroup> {
175
176 private List<String> groupOrder;
177
178 public GroupComparator(List<String> groupOrder) {
179 this.groupOrder = groupOrder;
180 }
181
182 @Override
183 public int compare(AppGroup o1, AppGroup o2) {
184 boolean perm1 = o1.isPermanent();
185 boolean perm2 = o2.isPermanent();
186 if (perm1 == perm2) {
187 Integer idx1 = groupOrder.indexOf(o1.getName());
188 Integer idx2 = groupOrder.indexOf(o2.getName());
189 return idx1.compareTo(idx2);
190 }
191 return perm1 == true ? -1 : 1;
192 }
193 }
194
195 }