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.widget;
35
36 import info.magnolia.ui.vaadin.gwt.client.applauncher.event.AppActivationEvent;
37 import info.magnolia.ui.vaadin.gwt.client.applauncher.shared.AppTile;
38
39 import java.util.Optional;
40 import java.util.function.Function;
41
42 import com.google.gwt.event.dom.client.MouseOutEvent;
43 import com.google.gwt.event.dom.client.MouseOutHandler;
44 import com.google.gwt.event.dom.client.MouseOverEvent;
45 import com.google.gwt.event.dom.client.MouseOverHandler;
46 import com.google.gwt.user.client.DOM;
47 import com.google.gwt.user.client.Element;
48 import com.google.gwt.user.client.Event;
49 import com.google.gwt.user.client.ui.Widget;
50 import com.google.web.bindery.event.shared.EventBus;
51 import com.googlecode.mgwt.dom.client.event.touch.TouchEndEvent;
52 import com.googlecode.mgwt.dom.client.event.touch.TouchEndHandler;
53 import com.googlecode.mgwt.dom.client.event.touch.TouchStartEvent;
54 import com.googlecode.mgwt.dom.client.event.touch.TouchStartHandler;
55 import com.googlecode.mgwt.ui.client.widget.touch.TouchDelegate;
56 import com.vaadin.client.ui.Icon;
57
58
59
60
61 public class AppTileWidget extends Widget {
62
63 private final Element icon = DOM.createDiv();
64
65 private final Element label = DOM.createDiv();
66
67 private final Element ariaLink = DOM.createAnchor();
68
69 private final Element root = DOM.createDiv();
70
71 private final Element runningIndicator = DOM.createDiv();
72
73 private final Function<String, Icon> iconSupplier;
74
75 private final AppTile appTile;
76
77 private final EventBus eventBus;
78
79 private boolean isActive = false;
80
81 private TouchDelegatewidget/touch/TouchDelegate.html#TouchDelegate">TouchDelegate touchDelegate = new TouchDelegate(this);
82
83 public AppTileWidget(EventBus eventBus, AppTile appTile, Function<String, Icon> iconSupplier) {
84 super();
85 this.appTile = appTile;
86 this.eventBus = eventBus;
87 this.iconSupplier = iconSupplier;
88 constructDOM();
89 bindHandlers();
90 updateIcon();
91 updateCaption();
92 prepareAriaLink();
93 }
94
95 private void constructDOM() {
96 setElement(root);
97 root.appendChild(icon);
98 root.appendChild(label);
99 root.appendChild(ariaLink);
100 root.appendChild(runningIndicator);
101 addStyleName("item");
102
103 icon.addClassName("icon");
104 label.addClassName("label");
105 DOM.sinkEvents(getElement(), Event.MOUSEEVENTS);
106 }
107
108 private void bindHandlers() {
109
110
111
112
113
114
115
116
117 addDomHandler(new MouseOverHandler() {
118 @Override
119 public void onMouseOver(MouseOverEvent event) {
120 getElement().addClassName("hover");
121 }
122 }, MouseOverEvent.getType());
123
124 addDomHandler(new MouseOutHandler() {
125 @Override
126 public void onMouseOut(MouseOutEvent event) {
127 getElement().removeClassName("hover");
128 updateColors();
129 }
130 }, MouseOutEvent.getType());
131
132 touchDelegate.addTouchStartHandler(new TouchStartHandler() {
133 @Override
134 public void onTouchStart(TouchStartEvent event) {
135 getElement().removeClassName("hover");
136 setActiveState(true);
137 eventBus.fireEvent(new AppActivationEvent(appTile.getName()));
138 }
139 });
140
141 touchDelegate.addTouchEndHandler(new TouchEndHandler() {
142 @Override
143 public void onTouchEnd(TouchEndEvent event) {
144 getElement().removeClassName("hover");
145 setColorsClick();
146 }
147 });
148 }
149
150 public void setActiveState(boolean isActive) {
151 this.isActive = isActive;
152 updateColors();
153 }
154
155
156
157
158
159 public void updateColors() {
160 if (isActive()) {
161 setColorsOn();
162 } else {
163 setColorsOff();
164 }
165 }
166
167
168
169
170 private void setColorsOff() {
171 getElement().removeClassName("active");
172 }
173
174
175
176
177 private void setColorsClick() {
178 getElement().addClassName("clicked");
179 }
180
181
182
183
184 private void setColorsOn() {
185 getElement().removeClassName("clicked");
186 getElement().addClassName("active");
187 }
188
189 public String getName() {
190 return appTile.getName();
191 }
192
193 public String getCaption() {
194 return appTile.getCaption();
195 }
196
197 public boolean isActive() {
198 return isActive;
199 }
200
201 @Override
202 public VAppTileGroup getParent() {
203 return (VAppTileGroup) super.getParent();
204 }
205
206 public void updateCaption() {
207 if (appTile != null) {
208 label.setInnerText(appTile.getCaption());
209 }
210 }
211
212 public void updateIcon() {
213 Optional.ofNullable(appTile.getIcon()).ifPresent(iconReference -> {
214 icon.removeAllChildren();
215 icon.appendChild(iconSupplier.apply(appTile.getIcon().getURL()).getElement());
216 });
217 }
218
219 public void prepareAriaLink(){
220 ariaLink.setAttribute("href", "#app:" + appTile.getName());
221 ariaLink.setInnerText(appTile.getCaption());
222 ariaLink.addClassName("hidden-for-aria");
223 }
224 }