View Javadoc

1   /**
2    * This file Copyright (c) 2012 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.templating.editor.client.widget;
35  
36  
37  import static info.magnolia.templating.editor.client.jsni.JavascriptUtils.getI18nMessage;
38  
39  import com.google.gwt.core.client.GWT;
40  import com.google.gwt.event.dom.client.ClickEvent;
41  import com.google.gwt.event.dom.client.ClickHandler;
42  import com.google.gwt.event.dom.client.HasClickHandlers;
43  import com.google.gwt.event.dom.client.KeyCodes;
44  import com.google.gwt.event.shared.HandlerRegistration;
45  import com.google.gwt.user.client.Event;
46  import com.google.gwt.user.client.Event.NativePreviewEvent;
47  import com.google.gwt.user.client.ui.Frame;
48  import com.google.gwt.user.client.ui.PopupPanel;
49  
50  /**
51   * PreviewChannelWidget.
52   * TODO extract base class with common functionality. Make this a MobilePreviewChannelWidget extending an AbstractPreviewChannelWidget.
53   */
54  public class PreviewChannel extends PopupPanel implements ClickHandler, HasClickHandlers {
55  
56      private String landscapeCssStyleSuffix = "Landscape";
57      private String portraitCssStyleSuffix = "Portrait";
58      private String channelName = "";
59  
60      /**
61       * Orientation modes for this widget.
62       */
63      public enum Orientation {
64          PORTRAIT, LANDSCAPE
65      }
66  
67      private Orientation currentOrientation = Orientation.LANDSCAPE;
68  
69      public PreviewChannel(final String url, final Orientation orientation, final String channelName) {
70          this.channelName = channelName;
71          this.currentOrientation = orientation;
72  
73          setStylePrimaryName("mobilePreview");
74          //TODO have a look at GWT add dependent style mechanism instead of doing it yourself.
75          addStyleName(orientation == Orientation.LANDSCAPE ? channelName + landscapeCssStyleSuffix : channelName + portraitCssStyleSuffix);
76  
77          setAnimationEnabled(true);
78          setAutoHideEnabled(true);
79          setModal(true);
80          setGlassEnabled(true);
81          setGlassStyleName("mgnlEditorPreviewBackground");
82  
83          getElement().setTitle(getI18nMessage("editor.preview.rotate.js"));
84  
85          addClickHandler(this);
86  
87          final Frame iframe = new Frame(url);
88          iframe.setStylePrimaryName("mobilePreviewIframe");
89          /*
90          iframe.addLoadHandler(new LoadHandler() {
91  
92              @Override
93              public void onLoad(LoadEvent event) {
94                 //TODO nice animation before displaying the page preview?
95                  //Window.alert("iframe onload");
96              }
97          });
98          */
99          add(iframe);
100     }
101 
102     public Orientation getOrientation() {
103         return currentOrientation;
104     }
105 
106     public String getChannelName() {
107         return channelName;
108     }
109 
110     public String getLandscapeCssStyleSuffix() {
111         return landscapeCssStyleSuffix;
112     }
113 
114     public String getPortraitCssStyleSuffix() {
115         return portraitCssStyleSuffix;
116     }
117 
118     @Override
119     public void onClick(ClickEvent event) {
120         //change orientation
121         GWT.log("currentOrientation is "+currentOrientation.toString());
122 
123         if(currentOrientation == Orientation.LANDSCAPE) {
124             currentOrientation = Orientation.PORTRAIT;
125             removeStyleName(getChannelName() + landscapeCssStyleSuffix);
126             addStyleName(getChannelName() + portraitCssStyleSuffix);
127         } else {
128             currentOrientation = Orientation.LANDSCAPE;
129             removeStyleName(getChannelName() + portraitCssStyleSuffix);
130             addStyleName(getChannelName() + landscapeCssStyleSuffix);
131         }
132         center();
133     }
134 
135     @Override
136     public HandlerRegistration addClickHandler(ClickHandler handler) {
137         return addDomHandler(handler, ClickEvent.getType());
138     }
139 
140     @Override
141     //key press or key down handlers have issues, that's why we had to resort to this. See also http://code.google.com/p/google-web-toolkit/issues/detail?id=5558.
142     protected void onPreviewNativeEvent(NativePreviewEvent event) {
143         super.onPreviewNativeEvent(event);
144         if (event.getTypeInt() == Event.ONKEYDOWN && event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ESCAPE) {
145             hide();
146         }
147     }
148 }