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.magnoliashell.viewport.connector;
35
36 import info.magnolia.ui.vaadin.gwt.client.magnoliashell.ShellState;
37 import info.magnolia.ui.vaadin.gwt.client.magnoliashell.event.ActivateAppEvent;
38 import info.magnolia.ui.vaadin.gwt.client.magnoliashell.event.AppRequestedEvent;
39 import info.magnolia.ui.vaadin.gwt.client.magnoliashell.event.CurrentAppCloseEvent;
40 import info.magnolia.ui.vaadin.gwt.client.magnoliashell.event.FullScreenEvent;
41 import info.magnolia.ui.vaadin.gwt.client.magnoliashell.event.HideShellAppsEvent;
42 import info.magnolia.ui.vaadin.gwt.client.magnoliashell.event.ShellAppStartingEvent;
43 import info.magnolia.ui.vaadin.gwt.client.magnoliashell.viewport.AppsTransitionDelegate;
44 import info.magnolia.ui.vaadin.gwt.client.magnoliashell.viewport.widget.AppsViewportWidget;
45 import info.magnolia.ui.vaadin.gwt.client.tabsheet.connector.MagnoliaTabSheetConnector;
46 import info.magnolia.ui.vaadin.magnoliashell.viewport.AppsViewport;
47
48 import java.util.Iterator;
49 import java.util.logging.Logger;
50
51 import com.google.gwt.dom.client.Element;
52 import com.google.gwt.user.client.Timer;
53 import com.google.gwt.user.client.ui.Widget;
54 import com.google.web.bindery.event.shared.EventBus;
55 import com.vaadin.client.ComponentConnector;
56 import com.vaadin.client.ConnectorHierarchyChangeEvent;
57 import com.vaadin.client.LayoutManager;
58 import com.vaadin.client.Util;
59 import com.vaadin.client.communication.StateChangeEvent;
60 import com.vaadin.client.ui.tabsheet.TabsheetConnector;
61 import com.vaadin.shared.ui.Connect;
62
63
64
65
66 @Connect(AppsViewport.class)
67 public class AppsViewportConnector extends ViewportConnector implements AppsViewportWidget.Listener {
68
69 private static final Logger log = Logger.getLogger(AppsViewportConnector.class.getName());
70
71 @Override
72 protected void init() {
73 super.init();
74 getWidget().setTransitionDelegate(new AppsTransitionDelegate(getWidget()));
75 addStateChangeHandler("activeComponent", new StateChangeEvent.StateChangeHandler() {
76 @Override
77 public void onStateChanged(StateChangeEvent event) {
78 final ComponentConnector newActiveComponent = (ComponentConnector) getState().activeComponent;
79 if (newActiveComponent != null && getWidget().getVisibleChild() != newActiveComponent) {
80 getWidget().showChild(newActiveComponent.getWidget());
81 newActiveComponent.getWidget().getElement().getStyle().clearOpacity();
82 } else if (newActiveComponent != null) {
83 log.warning("Switching to 'APP STARTED' state since the active component did not change");
84 ShellState.get().setAppStarted();
85 }
86 }
87 });
88 }
89
90 private boolean isAppRunning(String appName) {
91 return getState().runningAppNames.contains(appName);
92 }
93
94 private boolean isAppRegistered(String appName) {
95 return getState().registeredAppNames.contains(appName);
96 }
97
98 @Override
99 public void setEventBus(EventBus eventBus) {
100 super.setEventBus(eventBus);
101 eventBus.addHandler(AppRequestedEvent.TYPE, new AppRequestedEvent.Handler() {
102 @Override
103 public void onAppRequested(AppRequestedEvent event) {
104 getWidget().setCurtainVisible(false);
105 final String appName = event.getAppName();
106 if (isAppRegistered(appName)) {
107 if (!isAppRunning(appName)) {
108 ShellState.get().setAppStarting();
109 getWidget().showAppPreloader(appName);
110 } else {
111 final Widget appWidget = resolveAppWidgetHack(appName);
112 if (appWidget != null && appWidget != getWidget().getVisibleChild()) {
113 ShellState.get().setAppStarting();
114 getWidget().showChild(appWidget);
115 }
116 }
117 }
118 }
119 });
120
121 eventBus.addHandler(ShellAppStartingEvent.TYPE, new ShellAppStartingEvent.Handler() {
122 @Override
123 public void onShellAppStarting(ShellAppStartingEvent event) {
124 int widgetCount = getWidget().getWidgetCount();
125 if (getWidget().isAppClosing()) {
126 --widgetCount;
127 }
128 getWidget().setCurtainVisible(widgetCount > 0);
129 }
130 });
131
132 eventBus.addHandler(HideShellAppsEvent.TYPE, new HideShellAppsEvent.Handler() {
133 @Override
134 public void onHideShellApps(HideShellAppsEvent event) {
135 getWidget().setCurtainVisible(false);
136 }
137 });
138
139 eventBus.addHandler(FullScreenEvent.TYPE, new FullScreenEvent.Handler() {
140 @Override
141 public void onChangeFullScreen(FullScreenEvent event) {
142 getWidget().setFullScreen(event.getIsFullScreen());
143 }
144 });
145 }
146
147 @Override
148 public AppViewportState getState() {
149 return (AppViewportState)super.getState();
150 }
151
152 @Override
153 public void onConnectorHierarchyChange(final ConnectorHierarchyChangeEvent event) {
154 if (getWidget().hasPreloader()) {
155 new Timer() {
156 @Override
157 public void run() {
158 getWidget().removePreloader();
159 }
160 }.schedule(500);
161 }
162 AppsViewportConnector.super.onConnectorHierarchyChange(event);
163 }
164
165 @Override
166 public AppsViewportWidget getWidget() {
167 return (AppsViewportWidget) super.getWidget();
168 }
169
170 @Override
171 protected AppsViewportWidget createWidget() {
172 return new AppsViewportWidget(this);
173 }
174
175
176
177
178 @Override
179 protected void alignContent(Element e, LayoutManager layoutManager) {}
180
181 @Override
182 public void closeCurrentApp() {
183 eventBus.fireEvent(new CurrentAppCloseEvent());
184 }
185
186 @Override
187 public void activateApp(Widget appWidget) {
188 String appName = resolveAppNameHack(appWidget);
189 eventBus.fireEvent(new ActivateAppEvent(appName));
190 }
191
192
193 private String resolveAppNameHack(Widget appWidget) {
194 return ((MagnoliaTabSheetConnector) Util.findConnectorFor(appWidget)).getState().name;
195 }
196
197 private Widget resolveAppWidgetHack(String appName) {
198 final Iterator<Widget> it = getWidget().iterator();
199 while (it.hasNext()) {
200 final Widget widget = it.next();
201 final ComponentConnector componentConnector = Util.findConnectorFor(widget);
202 String name = "";
203 if (componentConnector instanceof MagnoliaTabSheetConnector) {
204 name = ((MagnoliaTabSheetConnector) componentConnector).getState().name;
205 }
206
207 if (name.isEmpty() && componentConnector instanceof TabsheetConnector) {
208 name = appName;
209 }
210
211 if (appName.equals(name)) {
212 return widget;
213 }
214 }
215 return null;
216 }
217 }