/*
* WindowEx.java
*
* Copyright (C) 2009-12 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
package org.rstudio.core.client.dom;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArrayInteger;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.event.shared.HasHandlers;
import org.rstudio.core.client.Point;
public class WindowEx extends JavaScriptObject
{
public static native WindowEx get() /*-{
return $wnd;
}-*/;
protected WindowEx()
{
}
public final native void focus() /*-{
this.focus();
}-*/;
public final native void print() /*-{
this.print() ;
}-*/;
public final native void back() /*-{
this.history.back() ;
}-*/;
public final native void forward() /*-{
this.history.forward() ;
}-*/;
public final native void removeSelection() /*-{
selection = this.getSelection();
if (selection != null) {
selection.removeAllRanges();
}
}-*/;
public final native String getSelectedText() /*-{
return this.getSelection().toString();
}-*/;
public final native boolean find(String term,
boolean matchCase,
boolean searchUpward,
boolean wrapAround,
boolean wholeWord) /*-{
return this.find(term, matchCase, searchUpward, wrapAround, wholeWord);
}-*/;
public final native String getLocationHref() /*-{
return this.location.href ;
}-*/;
public final native boolean isSecure() /*-{
return 'https:' == this.location.protocol;
}-*/;
public final native void reload() /*-{
this.location.reload(true);
}-*/;
public final native void setLocationHref(String helpURL) /*-{
this.location.href = helpURL ;
}-*/;
public final native void replaceLocationHref(String helpURL) /*-{
this.location.replace(helpURL) ;
}-*/;
public final native void replaceHistoryState(String url) /*-{
this.history.replaceState({}, "", url);
}-*/;
public final Point getScrollPosition()
{
JsArrayInteger pos = getScrollPositionInternal();
return new Point(pos.get(0), pos.get(1));
}
public final void setScrollPosition(Point pos)
{
setScrollPositionInternal(pos.x, pos.y);
}
private final native JsArrayInteger getScrollPositionInternal() /*-{
return [this.scrollX, this.scrollY];
}-*/;
private final native void setScrollPositionInternal(int x, int y) /*-{
this.scrollTo(x, y);
}-*/;
public final native void close() /*-{
this.close();
}-*/;
public final native boolean isClosed() /*-{
// On the desktop, it is possible in some circumstances for satellite
// window objects to become decoupled from their physical windows when
// closed--they are still marked open but are effectively zombies. To work
// around this we have the desktop frame manually label the window object
// as closed with rstudioSatelliteClosed so that we can appropriately
// treat it as closed.
return this.closed || this.rstudioSatelliteClosed;
}-*/;
public final native void resizeTo(int width, int height) /*-{
this.resizeTo(width, height);
}-*/;
public final native DocumentEx getDocument() /*-{
return this.document;
}-*/;
public final native int getLeft() /*-{
return this.screenX;
}-*/;
public final native int getTop() /*-{
return this.screenY;
}-*/;
public final native int getOuterHeight() /*-{
return this.outerHeight;
}-*/;
public final native int getOuterWidth() /*-{
return this.outerWidth;
}-*/;
public final native int getInnerHeight() /*-{
return this.innerHeight;
}-*/;
public final native int getInnerWidth() /*-{
return this.innerWidth;
}-*/;
public final native void scrollTo(int x, int y) /*-{
this.scrollTo(x, y);
}-*/;
public final native int getScrollLeft() /*-{
return this.scrollX;
}-*/;
public final native int getScrollTop() /*-{
return this.scrollY;
}-*/;
public final native int getScreenX() /*-{
return this.screenX;
}-*/;
public final native int getScreenY() /*-{
return this.screenY;
}-*/;
public final native void postMessage(JavaScriptObject data,
String origin) /*-{
this.postMessage(data, origin);
}-*/;
public static HandlerRegistration addFocusHandler(FocusHandler handler)
{
return handlers_.addHandler(FocusEvent.getType(), handler);
}
public static HandlerRegistration addBlurHandler(BlurHandler handler)
{
return handlers_.addHandler(BlurEvent.getType(), handler);
}
private static void fireFocusHandlers()
{
NativeEvent nativeEvent = Document.get().createFocusEvent();
FocusEvent.fireNativeEvent(nativeEvent, new HasHandlers()
{
public void fireEvent(GwtEvent<?> event)
{
handlers_.fireEvent(event);
}
});
}
private static void fireBlurHandlers()
{
NativeEvent nativeEvent = Document.get().createBlurEvent();
BlurEvent.fireNativeEvent(nativeEvent, new HasHandlers()
{
public void fireEvent(GwtEvent<?> event)
{
handlers_.fireEvent(event);
}
});
}
static {
registerNativeListeners();
}
private static native void registerNativeListeners() /*-{
$wnd.onfocus = function() {
@org.rstudio.core.client.dom.WindowEx::fireFocusHandlers()();
};
$wnd.onblur = function() {
@org.rstudio.core.client.dom.WindowEx::fireBlurHandlers()();
};
}-*/;
private static final HandlerManager handlers_ = new HandlerManager(null);
}