@qooxdoo/framework
Version:
The JS Framework for Coders
171 lines (140 loc) • 4.65 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2004-2008 1&1 Internet AG, Germany, http://www.1und1.de
License:
MIT: https://opensource.org/licenses/MIT
See the LICENSE file in the project's top-level directory for details.
Authors:
* Sebastian Werner (wpbasti)
* Fabian Jakobs (fjakobs)
************************************************************************ */
/**
* This widget provides a root widget for popups and tooltips if qooxdoo is used
* inside a traditional HTML page. Widgets placed into a page will overlay the
* HTML content.
*
* For this reason the widget's layout is initialized with an instance of
* {@link qx.ui.layout.Basic}. The widget's layout cannot be changed.
*
* The page widget does not support paddings and decorators with insets.
*
* Note: This widget does not support decorations!
*
* If you want to place widgets inside existing DOM elements
* use {@link qx.ui.root.Inline}.
*/
qx.Class.define("qx.ui.root.Page", {
extend: qx.ui.root.Abstract,
/*
*****************************************************************************
CONSTRUCTOR
*****************************************************************************
*/
/**
* @param doc {Document} Document to use
*/
construct(doc) {
// Temporary storage of element to use
this.__doc = doc;
super();
// Use a hard-coded basic layout
this._setLayout(new qx.ui.layout.Basic());
// Set a high zIndex to make sure the widgets really overlay the HTML page.
this.setZIndex(10000);
// Directly add to layout queue
qx.ui.core.queue.Layout.add(this);
// Register resize listener
this.addListener("resize", this.__onResize, this);
// Register as root
qx.ui.core.FocusHandler.getInstance().connectTo(this);
// Avoid the automatically scroll in to view.
// See http://bugzilla.qooxdoo.org/show_bug.cgi?id=3236 for details.
if (qx.core.Environment.get("engine.name") == "mshtml") {
this.setKeepFocus(true);
}
},
/*
*****************************************************************************
MEMBERS
*****************************************************************************
*/
members: {
__timer: null,
__doc: null,
// overridden
_createContentElement() {
var elem = this.__doc.createElement("div");
this.__doc.body.appendChild(elem);
var root = new qx.html.Root(elem);
root.setStyles({
position: "absolute",
textAlign: "left"
});
// Store reference to the widget in the DOM element.
root.connectObject(this);
// Mark the element of this root with a special attribute to prevent
// that qx.event.handler.Focus is performing a focus action.
// This would end up in a scrolling to the top which is not wanted in
// an inline scenario
// see Bug #2740
if (qx.core.Environment.get("engine.name") == "gecko") {
root.setAttribute("qxIsRootPage", 1);
}
return root;
},
// overridden
_computeSizeHint() {
var width = qx.bom.Document.getWidth(this._window);
var height = qx.bom.Document.getHeight(this._window);
return {
minWidth: width,
width: width,
maxWidth: width,
minHeight: height,
height: height,
maxHeight: height
};
},
/**
* Adjust html element size on layout resizes.
*
* @param e {qx.event.type.Data} event object
*/
__onResize(e) {
// set the size to 0 so make the content element invisible
// this works because the content element has overflow "show"
this.getContentElement().setStyles({
width: 0,
height: 0
});
},
/**
* Whether the configured layout supports a maximized window
* e.g. is a Canvas.
*
* @return {Boolean} Whether the layout supports maximized windows
*/
supportsMaximize() {
return false;
},
// overridden
_applyPadding(value, old, name) {
if (value && (name == "paddingTop" || name == "paddingLeft")) {
throw new Error(
"The root widget does not support 'left', or 'top' paddings!"
);
}
super._applyPadding(value, old, name);
}
},
/*
*****************************************************************************
DESTRUCT
*****************************************************************************
*/
destruct() {
this.__doc = null;
}
});