View Javadoc
1   /**
2    * This file Copyright (c) 2011-2018 Magnolia International
3    * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
4    *
5    *
6    * This file is dual-licensed under both the Magnolia
7    * Network Agreement and the GNU General Public License.
8    * You may elect to use one or the other of these licenses.
9    *
10   * This file is distributed in the hope that it will be
11   * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
12   * implied warranty of MERCHANTABILITY or FITNESS FOR A
13   * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
14   * Redistribution, except as permitted by whichever of the GPL
15   * or MNA you select, is prohibited.
16   *
17   * 1. For the GPL license (GPL), you can redistribute and/or
18   * modify this file under the terms of the GNU General
19   * Public License, Version 3, as published by the Free Software
20   * Foundation.  You should have received a copy of the GNU
21   * General Public License, Version 3 along with this program;
22   * if not, write to the Free Software Foundation, Inc., 51
23   * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24   *
25   * 2. For the Magnolia Network Agreement (MNA), this file
26   * and the accompanying materials are made available under the
27   * terms of the MNA which accompanies this distribution, and
28   * is available at http://www.magnolia-cms.com/mna.html
29   *
30   * Any modifications to this file must keep this entire header
31   * intact.
32   *
33   */
34  package info.magnolia.ui.vaadin.gwt.client.magnoliashell.viewport.widget;
35  
36  import info.magnolia.ui.vaadin.gwt.client.magnoliashell.viewport.ShellAppsTransitionDelegate;
37  
38  import java.util.Iterator;
39  
40  import com.google.gwt.core.client.Scheduler;
41  import com.google.gwt.dom.client.Style;
42  import com.google.gwt.user.client.DOM;
43  import com.google.gwt.user.client.Element;
44  import com.google.gwt.user.client.Event;
45  import com.google.gwt.user.client.ui.Widget;
46  import com.googlecode.mgwt.dom.client.event.touch.TouchEndEvent;
47  import com.googlecode.mgwt.dom.client.event.touch.TouchEndHandler;
48  import com.googlecode.mgwt.ui.client.widget.touch.TouchDelegate;
49  
50  /**
51   * Shell apps viewport client side.
52   */
53  public class ShellAppsViewportWidget extends ViewportWidget<ShellAppsTransitionDelegate> {
54  
55      private Listener listener;
56  
57      private boolean active;
58  
59      public void onShellAppsHidden() {
60          listener.onShellAppsHidden();
61      }
62  
63      /**
64       * Listener interface for {@link ShellAppsViewportWidget}.
65       */
66      public interface Listener {
67  
68          void onShellAppLoaded(Widget shellAppWidget);
69  
70          void outerContentClicked();
71  
72          void onShellAppsHidden();
73      }
74  
75      public ShellAppsViewportWidget(final Listener listener) {
76          this.listener = listener;
77          new TouchDelegate(this).addTouchEndHandler(new TouchEndHandler() {
78              @Override
79              public void onTouchEnd(TouchEndEvent event) {
80                  final Element target = event.getNativeEvent().getEventTarget().cast();
81                  if (target.isOrHasChild(getElement())) {
82                      listener.outerContentClicked();
83                  }
84              }
85          });
86  
87          /**
88           * Make sure that initially the shell-app viewport is shifted out of view - so
89           * that it slides down when AdminCentral is ready.
90           */
91          Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
92              @Override
93              public void execute() {
94                  getElement().getStyle().setTop(-getOffsetHeight(), Style.Unit.PX);
95              }
96          });
97  
98          DOM.sinkEvents(getElement(), Event.TOUCHEVENTS | Event.MOUSEEVENTS);
99      }
100 
101     public boolean isActive() {
102         return active;
103     }
104 
105     public void setActiveNoTransition(boolean isActive) {
106         setVisible(isActive);
107         this.active = isActive;
108     }
109 
110     public void setActive(boolean active) {
111         getTransitionDelegate().setActive(active);
112         this.active = active;
113     }
114 
115     public void onShellAppLoaded(Widget w) {
116         Iterator<Widget> it = iterator();
117         while (it.hasNext() && w != null) {
118             Widget curW = it.next();
119             curW.getElement().getStyle().setDisplay(w == curW ? Style.Display.BLOCK : Style.Display.NONE);
120         }
121         if (w != null) {
122             listener.onShellAppLoaded(w);
123         }
124     }
125 }