View Javadoc
1   /**
2    * This file Copyright (c) 2011-2015 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 java.util.Iterator;
37  
38  import com.google.gwt.core.client.Scheduler;
39  import com.google.gwt.dom.client.Style;
40  import com.google.gwt.user.client.DOM;
41  import com.google.gwt.user.client.Element;
42  import com.google.gwt.user.client.Event;
43  import com.google.gwt.user.client.ui.Widget;
44  import com.googlecode.mgwt.dom.client.event.touch.TouchEndEvent;
45  import com.googlecode.mgwt.dom.client.event.touch.TouchEndHandler;
46  import com.googlecode.mgwt.ui.client.widget.touch.TouchDelegate;
47  
48  /**
49   * Shell apps viewport client side.
50   */
51  public class ShellAppsViewportWidget extends ViewportWidget {
52  
53      private Listener listener;
54  
55      private boolean active;
56  
57      public void onShellAppsHidden() {
58          listener.onShellAppsHidden();
59      }
60  
61      /**
62       * Listener interface for {@link ShellAppsViewportWidget}.
63       */
64      public interface Listener {
65  
66          void onShellAppLoaded(Widget shellAppWidget);
67  
68          void outerContentClicked();
69  
70          void onShellAppsHidden();
71      }
72  
73      public ShellAppsViewportWidget(final Listener listener) {
74          this.listener = listener;
75          new TouchDelegate(this).addTouchEndHandler(new TouchEndHandler() {
76              @Override
77              public void onTouchEnd(TouchEndEvent event) {
78                  final Element target = event.getNativeEvent().getEventTarget().cast();
79                  if (target.isOrHasChild(getElement())) {
80                      listener.outerContentClicked();
81                  }
82              }
83          });
84  
85          /**
86           * Make sure that initially the shell-app viewport is shifted out of view - so
87           * that it slides down when AdminCentral is ready.
88           */
89          Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
90              @Override
91              public void execute() {
92                  getElement().getStyle().setTop(-getOffsetHeight(), Style.Unit.PX);
93              }
94          });
95  
96          DOM.sinkEvents(getElement(), Event.TOUCHEVENTS | Event.MOUSEEVENTS);
97      }
98  
99      public boolean isActive() {
100         return active;
101     }
102 
103     public void setActiveNoTransition(boolean isActive) {
104         setVisible(isActive);
105         this.active = isActive;
106     }
107 
108     public void setActive(boolean active) {
109         getTransitionDelegate().setActive(this, active);
110         this.active = active;
111     }
112 
113     public void onShellAppLoaded(Widget w) {
114         Iterator<Widget> it = iterator();
115         while (it.hasNext() && w != null) {
116             Widget curW = it.next();
117             curW.getElement().getStyle().setDisplay(w == curW ? Style.Display.BLOCK : Style.Display.NONE);
118         }
119         if (w != null) {
120             listener.onShellAppLoaded(w);
121         }
122     }
123 }