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.viewport.widget.ViewportWidget;
37 import info.magnolia.ui.vaadin.gwt.client.shared.magnoliashell.ViewportType;
38 import info.magnolia.ui.vaadin.magnoliashell.viewport.ShellViewport;
39
40 import java.util.List;
41
42 import com.google.gwt.core.client.Scheduler;
43 import com.google.gwt.dom.client.Element;
44 import com.google.gwt.dom.client.Style;
45 import com.google.gwt.dom.client.Style.Display;
46 import com.google.gwt.dom.client.Style.Unit;
47 import com.google.gwt.user.client.ui.Widget;
48 import com.google.web.bindery.event.shared.EventBus;
49 import com.vaadin.client.ComponentConnector;
50 import com.vaadin.client.ConnectorHierarchyChangeEvent;
51 import com.vaadin.client.LayoutManager;
52 import com.vaadin.client.communication.StateChangeEvent;
53 import com.vaadin.client.communication.StateChangeEvent.StateChangeHandler;
54 import com.vaadin.client.ui.AbstractLayoutConnector;
55 import com.vaadin.client.ui.layout.ElementResizeEvent;
56 import com.vaadin.client.ui.layout.ElementResizeListener;
57 import com.vaadin.shared.ui.Connect;
58
59
60
61
62 @Connect(ShellViewport.class)
63 public class ViewportConnector extends AbstractLayoutConnector {
64
65 protected EventBus eventBus;
66
67 protected ElementResizeListener childCenterer = new ElementResizeListener() {
68 @Override
69 public void onElementResize(ElementResizeEvent e) {
70 alignContent(e.getElement(), e.getLayoutManager());
71 }
72 };
73
74 @Override
75 protected void init() {
76 addStateChangeHandler("activeComponent", new StateChangeHandler() {
77 @Override
78 public void onStateChanged(StateChangeEvent event) {
79 final ComponentConnector newActiveComponent = (ComponentConnector) getState().activeComponent;
80 if (newActiveComponent != null && getWidget().getVisibleChild() != newActiveComponent) {
81 newActiveComponent.getWidget().getElement().getStyle().clearOpacity();
82 }
83 }
84 });
85 }
86
87 protected void alignContent(Element e, LayoutManager layoutManager) {
88 if (getWidget().isVisible() && !Display.NONE.getCssName().equals(e.getStyle().getDisplay())) {
89 int width = layoutManager.getInnerWidth(e);
90 final Style style = e.getStyle();
91 style.setLeft(50, Unit.PCT);
92 style.setMarginLeft(-width / 2, Unit.PX);
93 }
94 }
95
96 @Override
97 public void updateCaption(ComponentConnector connector) {
98 }
99
100 @Override
101 public void onConnectorHierarchyChange(ConnectorHierarchyChangeEvent event) {
102 final ViewportWidget viewport = getWidget();
103 final List<ComponentConnector> children = getChildComponents();
104 final List<ComponentConnector> oldChildren = event.getOldChildren();
105 int index = 0;
106 for (final ComponentConnector cc : children) {
107 final Widget w = cc.getWidget();
108 if (w.getParent() != viewport) {
109 viewport.insert(w, index);
110 getLayoutManager().addElementResizeListener(w.getElement(), childCenterer);
111 w.getElement().getStyle().setOpacity(0d);
112 Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
113 @Override
114 public void execute() {
115 if (getWidget().getVisibleChild() != cc.getWidget()) {
116 w.getElement().getStyle().setDisplay(Display.NONE);
117 }
118 w.getElement().getStyle().clearOpacity();
119 }
120 });
121
122 }
123 ++index;
124 }
125
126 oldChildren.removeAll(children);
127 for (final ComponentConnector cc : oldChildren) {
128 cc.getLayoutManager().removeElementResizeListener(cc.getWidget().getElement(), childCenterer);
129 getWidget().removeChild(cc.getWidget());
130 }
131 }
132
133 public void setEventBus(EventBus eventBus) {
134 this.eventBus = eventBus;
135 }
136
137 @Override
138 public ViewportWidget getWidget() {
139 return (ViewportWidget) super.getWidget();
140 }
141
142 @Override
143 public ViewportState getState() {
144 return (ViewportState) super.getState();
145 }
146
147 public ViewportType getType() {
148 return getState().type;
149 }
150
151 }