diff options
Diffstat (limited to 'webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/ui/window/Window.js')
-rw-r--r-- | webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/ui/window/Window.js | 1441 |
1 files changed, 1441 insertions, 0 deletions
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/ui/window/Window.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/ui/window/Window.js new file mode 100644 index 0000000000..3f55963727 --- /dev/null +++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/ui/window/Window.js @@ -0,0 +1,1441 @@ +/* ************************************************************************ + + qooxdoo - the new era of web development + + http://qooxdoo.org + + Copyright: + 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org + + License: + LGPL 2.1: http://www.gnu.org/licenses/lgpl.html + + Authors: + * Sebastian Werner (wpbasti) + * Andreas Ecker (ecker) + +************************************************************************ */ + +/* ************************************************************************ + +#module(ui_window) + +************************************************************************ */ + +qx.OO.defineClass("qx.ui.window.Window", qx.ui.popup.Popup, +function(vCaption, vIcon, vWindowManager) +{ + qx.ui.popup.Popup.call(this); + + // ************************************************************************ + // FUNCTIONAL STYLE + // ************************************************************************ + + this.setMinWidth("auto"); + this.setMinHeight("auto"); + this.setAutoHide(false); + + + + // ************************************************************************ + // MANAGER + // ************************************************************************ + + // Init Focus Manager + this.activateFocusRoot(); + + // Init Window Manager + this.setWindowManager(vWindowManager || qx.ui.window.Window.getDefaultWindowManager()); + + + + // ************************************************************************ + // RESIZE AND MOVE FRAME + // ************************************************************************ + + var f = this._frame = new qx.ui.basic.Terminator; + f.setAppearance("window-resize-frame"); + + + // ************************************************************************ + // LAYOUT + // ************************************************************************ + + var l = this._layout = new qx.ui.layout.VerticalBoxLayout; + l.setEdge(0); + this.add(l); + + + // ************************************************************************ + // CAPTIONBAR + // ************************************************************************ + + var cb = this._captionBar = new qx.ui.layout.HorizontalBoxLayout; + cb.setAppearance("window-captionbar"); + l.add(cb); + + + // ************************************************************************ + // CAPTIONICON + // ************************************************************************ + + if (qx.util.Validation.isValidString(vIcon)) + { + var ci = this._captionIcon = new qx.ui.basic.Image(vIcon); + ci.setAppearance("window-captionbar-icon"); + cb.add(ci); + } + + + // ************************************************************************ + // CAPTIONTITLE + // ************************************************************************ + + var ct = this._captionTitle = new qx.ui.basic.Label(vCaption); + ct.setAppearance("window-captionbar-title"); + ct.setSelectable(false); + cb.add(ct); + + + // ************************************************************************ + // CAPTIONFLEX + // ************************************************************************ + + var cf = this._captionFlex = new qx.ui.basic.HorizontalSpacer; + cb.add(cf); + + + // ************************************************************************ + // CAPTIONBUTTONS: MINIMIZE + // ************************************************************************ + + var bm = this._minimizeButton = new qx.ui.form.Button(null, "widget/window/minimize.gif"); + + bm.setAppearance("window-captionbar-minimize-button"); + bm.setTabIndex(-1); + + bm.addEventListener("execute", this._onminimizebuttonclick, this); + bm.addEventListener("mousedown", this._onbuttonmousedown, this); + + cb.add(bm); + + + // ************************************************************************ + // CAPTIONBUTTONS: RESTORE + // ************************************************************************ + + var br = this._restoreButton = new qx.ui.form.Button(null, "widget/window/restore.gif"); + + br.setAppearance("window-captionbar-restore-button"); + br.setTabIndex(-1); + + br.addEventListener("execute", this._onrestorebuttonclick, this); + br.addEventListener("mousedown", this._onbuttonmousedown, this); + + // don't add initially + // cb.add(br); + + + // ************************************************************************ + // CAPTIONBUTTONS: MAXIMIZE + // ************************************************************************ + + var bx = this._maximizeButton = new qx.ui.form.Button(null, "widget/window/maximize.gif"); + + bx.setAppearance("window-captionbar-maximize-button"); + bx.setTabIndex(-1); + + bx.addEventListener("execute", this._onmaximizebuttonclick, this); + bx.addEventListener("mousedown", this._onbuttonmousedown, this); + + cb.add(bx); + + + // ************************************************************************ + // CAPTIONBUTTONS: CLOSE + // ************************************************************************ + + var bc = this._closeButton = new qx.ui.form.Button(null, "widget/window/close.gif"); + + bc.setAppearance("window-captionbar-close-button"); + bc.setTabIndex(-1); + + bc.addEventListener("execute", this._onclosebuttonclick, this); + bc.addEventListener("mousedown", this._onbuttonmousedown, this); + + cb.add(bc); + + + // ************************************************************************ + // PANE + // ************************************************************************ + + var p = this._pane = new qx.ui.layout.CanvasLayout; + p.setHeight("1*"); + p.setOverflow("hidden"); + l.add(p); + + + // ************************************************************************ + // STATUSBAR + // ************************************************************************ + + var sb = this._statusBar = new qx.ui.layout.HorizontalBoxLayout; + sb.setAppearance("window-statusbar"); + + + // ************************************************************************ + // STATUSTEXT + // ************************************************************************ + + var st = this._statusText = new qx.ui.basic.Label("Ready"); + st.setAppearance("window-statusbar-text"); + st.setSelectable(false); + sb.add(st); + + + // ************************************************************************ + // INIT + // ************************************************************************ + + this.setCaption(vCaption); + this.setIcon(vIcon); + + + // ************************************************************************ + // EVENTS: WINDOW + // ************************************************************************ + + this.addEventListener("mousedown", this._onwindowmousedown, this); + this.addEventListener("mouseup", this._onwindowmouseup, this); + this.addEventListener("mousemove", this._onwindowmousemove, this); + this.addEventListener("click", this._onwindowclick, this); + + + // ************************************************************************ + // EVENTS: CAPTIONBAR + // ************************************************************************ + + cb.addEventListener("mousedown", this._oncaptionmousedown, this); + cb.addEventListener("mouseup", this._oncaptionmouseup, this); + cb.addEventListener("mousemove", this._oncaptionmousemove, this); + cb.addEventListener("dblclick", this._oncaptiondblblick, this); + + + // ************************************************************************ + // REMAPPING + // ************************************************************************ + this.remapChildrenHandlingTo(this._pane); +}); + + + + + +/* +--------------------------------------------------------------------------- + PROPERTIES +--------------------------------------------------------------------------- +*/ + +/*! + Appearance of the widget +*/ +qx.OO.changeProperty({ name : "appearance", type : "string", defaultValue : "window" }); + +/*! + The windowManager to use for. +*/ +qx.OO.addProperty({ name : "windowManager", type : "object" }); + +/*! + If the window is active, only one window in a single qx.manager.object.WindowManager could + have set this to true at the same time. +*/ +qx.OO.addProperty({ name : "active", type : "boolean", defaultValue : false }); + +/*! + Should be window be modal (this disable minimize and maximize buttons) +*/ +qx.OO.addProperty({ name : "modal", type : "boolean", defaultValue : false }); + +/*! + Should be window be modal (this disable minimize and maximize buttons) +*/ +qx.OO.addProperty({ name : "mode", type : "string", defaultValue : null, possibleValues : [ "minimized", "maximized" ], allowNull : true }); + +/*! + The opener (button) of the window +*/ +qx.OO.addProperty({ name : "opener", type : "object" }); + +/*! + The text of the caption +*/ +qx.OO.addProperty({ name : "caption", type : "string" }); + +/*! + The icon of the caption +*/ +qx.OO.addProperty({ name : "icon", type : "string" }); + +/*! + The text of the statusbar +*/ +qx.OO.addProperty({ name : "status", type : "string", defaultValue : "Ready" }); + +/*! + Should the close button be shown +*/ +qx.OO.addProperty({ name : "showClose", type : "boolean", defaultValue : true }); + +/*! + Should the maximize button be shown +*/ +qx.OO.addProperty({ name : "showMaximize", type : "boolean", defaultValue : true }); + +/*! + Should the minimize button be shown +*/ +qx.OO.addProperty({ name : "showMinimize", type : "boolean", defaultValue : true }); + +/*! + Should the statusbar be shown +*/ +qx.OO.addProperty({ name : "showStatusbar", type : "boolean", defaultValue : false }); + +/*! + Should the user have the ability to close the window +*/ +qx.OO.addProperty({ name : "allowClose", type : "boolean", defaultValue : true }); + +/*! + Should the user have the ability to maximize the window +*/ +qx.OO.addProperty({ name : "allowMaximize", type : "boolean", defaultValue : true }); + +/*! + Should the user have the ability to minimize the window +*/ +qx.OO.addProperty({ name : "allowMinimize", type : "boolean", defaultValue : true }); + +/*! + If the text (in the captionbar) should be visible +*/ +qx.OO.addProperty({ name : "showCaption", type : "boolean", defaultValue : true }); + +/*! + If the icon (in the captionbar) should be visible +*/ +qx.OO.addProperty({ name : "showIcon", type : "boolean", defaultValue : true }); + +/*! + If the window is resizeable +*/ +qx.OO.addProperty({ name : "resizeable", type : "boolean", defaultValue : true }); + +/*! + If the window is moveable +*/ +qx.OO.addProperty({ name : "moveable", type : "boolean", defaultValue : true }); + +/*! + The resize method to use +*/ +qx.OO.addProperty({ name : "resizeMethod", type : "string", defaultValue : "frame", possibleValues : [ "opaque", "lazyopaque", "frame", "translucent" ] }); + +/*! + The move method to use +*/ +qx.OO.addProperty({ name : "moveMethod", type : "string", defaultValue : "opaque", possibleValues : [ "opaque", "frame", "translucent" ] }); + + + + +/* +--------------------------------------------------------------------------- + MANAGER HANDLING +--------------------------------------------------------------------------- +*/ + +qx.ui.window.Window.getDefaultWindowManager = function() +{ + if (!qx.ui.window.Window._defaultWindowManager) { + qx.ui.window.Window._defaultWindowManager = new qx.manager.object.WindowManager; + } + + return qx.ui.window.Window._defaultWindowManager; +} + + + + + +/* +--------------------------------------------------------------------------- + UTILITIES +--------------------------------------------------------------------------- +*/ + +qx.Proto.getPane = function() { + return this._pane; +} + +qx.Proto.getCaptionBar = function() { + return this._captionBar; +} + +qx.Proto.getStatusBar = function() { + return this._statusBar; +} + +qx.Proto.close = function() { + this.hide(); +} + +qx.Proto.open = function(vOpener) +{ + if (qx.util.Validation.isValid(vOpener)) { + this.setOpener(vOpener); + } + + if (this.getCentered()) { + this.centerToBrowser(); + } + + this.show(); +} + +qx.Proto.focus = function() { + this.setActive(true); +} + +qx.Proto.blur = function() { + this.setActive(false); +} + +qx.Proto.maximize = function() { + this.setMode("maximized"); +} + +qx.Proto.minimize = function() { + this.setMode("minimized"); +} + +qx.Proto.restore = function() { + this.setMode(null); +} + + + + + + + + +/* +--------------------------------------------------------------------------- + APPEAR/DISAPPEAR +--------------------------------------------------------------------------- +*/ + +qx.Proto._beforeAppear = function() +{ + // Intentionally bypass superclass and call super.super._beforeAppear + qx.ui.layout.CanvasLayout.prototype._beforeAppear.call(this); + + // Hide popups + qx.manager.object.PopupManager.getInstance().update(); + + // Configure the focus root to be the current opened window + qx.event.handler.EventHandler.getInstance().setFocusRoot(this); + + this.getWindowManager().add(this); + this._makeActive(); +} + +qx.Proto._beforeDisappear = function() +{ + // Intentionally bypass superclass and call super.super._beforeDisappear + qx.ui.layout.CanvasLayout.prototype._beforeDisappear.call(this); + + // Reset focus root + var vFocusRoot = qx.event.handler.EventHandler.getInstance().getFocusRoot(); + if (vFocusRoot == this || this.contains(vFocusRoot)) { + qx.event.handler.EventHandler.getInstance().setFocusRoot(null); + } + + // Be sure to disable any capturing inside invisible parts + // Is this to much overhead? + // Are there any other working solutions? + var vWidget = qx.event.handler.EventHandler.getInstance().getCaptureWidget(); + if (vWidget && this.contains(vWidget)) { + vWidget.setCapture(false); + } + + this.getWindowManager().remove(this); + this._makeInactive(); +} + + + + + +/* +--------------------------------------------------------------------------- + ZIndex Positioning +--------------------------------------------------------------------------- +*/ + +qx.Proto._minZIndex = 1e5; + +qx.Proto._sendTo = function() +{ + var vAll = qx.lang.Object.getValues(this.getWindowManager().getAll()).sort(qx.util.Compare.byZIndex); + var vLength = vAll.length; + var vIndex = this._minZIndex; + + for (var i=0; i<vLength; i++) { + vAll[i].setZIndex(vIndex++); + } +} + + + + + + +/* +--------------------------------------------------------------------------- + MODIFIERS +--------------------------------------------------------------------------- +*/ + +qx.Proto._modifyActive = function(propValue, propOldValue, propData) +{ + if (propOldValue) + { + if (this.getFocused()) { + this.setFocused(false); + } + + if (this.getWindowManager().getActiveWindow() == this) { + this.getWindowManager().setActiveWindow(null); + } + + this.removeState("active"); + this._captionBar.removeState("active"); + } + else + { + // Switch focus + // Also do this if gets inactive as this moved the focus outline + // away from any focused child. + if (!this.getFocusedChild()) { + this.setFocused(true); + } + + this.getWindowManager().setActiveWindow(this); + this.bringToFront(); + + this.addState("active"); + this._captionBar.addState("active"); + } + + return true; +} + +qx.Proto._modifyModal = function(propValue, propOldValue, propData) +{ + // Inform blocker + if (this._initialLayoutDone && this.getVisibility() && this.getDisplay()) + { + var vTop = this.getTopLevelWidget(); + propValue ? vTop.block(this) : vTop.release(this); + } + + return true; +} + +qx.Proto._modifyAllowClose = function(propValue, propOldValue, propData) { + return this._closeButtonManager(); +} + +qx.Proto._modifyAllowMaximize = function(propValue, propOldValue, propData) { + return this._maximizeButtonManager(); +} + +qx.Proto._modifyAllowMinimize = function(propValue, propOldValue, propData) { + return this._minimizeButtonManager(); +} + +qx.Proto._modifyMode = function(propValue, propOldValue, propData) +{ + switch(propValue) + { + case "minimized": + this._minimize(); + break; + + case "maximized": + this._maximize(); + break; + + default: + switch(propOldValue) + { + case "maximized": + this._restoreFromMaximized(); + break; + + case "minimized": + this._restoreFromMinimized(); + break; + } + } + + return true; +} + +qx.Proto._modifyShowCaption = function(propValue, propOldValue, propData) +{ + if (propValue) + { + this._captionBar.addAt(this._captionTitle, this.getShowIcon() ? 1 : 0); + } + else + { + this._captionBar.remove(this._captionTitle); + } + + return true; +} + +qx.Proto._modifyShowIcon = function(propValue, propOldValue, propData) +{ + if (propValue) + { + this._captionBar.addAtBegin(this._captionIcon); + } + else + { + this._captionBar.remove(this._captionIcon); + } + + return true; +} + +qx.Proto._modifyShowStatusbar = function(propValue, propOldValue, propData) +{ + if (propValue) + { + this._layout.addAtEnd(this._statusBar); + } + else + { + this._layout.remove(this._statusBar); + } + + return true; +} + +qx.Proto._modifyShowClose = function(propValue, propOldValue, propData) +{ + if (propValue) + { + this._captionBar.addAtEnd(this._closeButton); + } + else + { + this._captionBar.remove(this._closeButton); + } + + return true; +} + +qx.Proto._modifyShowMaximize = function(propValue, propOldValue, propData) +{ + if (propValue) + { + var t = this.getMode() == "maximized" ? this._restoreButton : this._maximizeButton; + + if (this.getShowMinimize()) + { + this._captionBar.addAfter(t, this._minimizeButton); + } + else + { + this._captionBar.addAfter(t, this._captionFlex); + } + } + else + { + this._captionBar.remove(this._maximizeButton); + this._captionBar.remove(this._restoreButton); + } + + return true; +} + +qx.Proto._modifyShowMinimize = function(propValue, propOldValue, propData) +{ + if (propValue) + { + this._captionBar.addAfter(this._minimizeButton, this._captionFlex); + } + else + { + this._captionBar.remove(this._minimizeButton); + } + + return true; +} + +qx.Proto._minimizeButtonManager = function() +{ + this._minimizeButton.setEnabled(this.getAllowMinimize()); + + return true; +} + +qx.Proto._closeButtonManager = function() +{ + this._closeButton.setEnabled(this.getAllowClose()); + + return true; +} + +qx.Proto._maximizeButtonManager = function() +{ + var b = this.getAllowMaximize() && this.getResizeable() && this._computedMaxWidthTypeNull && this._computedMaxHeightTypeNull; + + this._maximizeButton.setEnabled(b); + this._restoreButton.setEnabled(b); + + return true; +} + +qx.Proto._modifyStatus = function(propValue, propOldValue, propData) +{ + this._statusText.setHtml(propValue); + + return true; +} + +qx.Proto._modifyMaxWidth = function(propValue, propOldValue, propData) { + return this._maximizeButtonManager(); +} + +qx.Proto._modifyMaxHeight = function(propValue, propOldValue, propData) { + return this._maximizeButtonManager(); +} + +qx.Proto._modifyResizeable = function(propValue, propOldValue, propData) { + return this._maximizeButtonManager(); +} + +qx.Proto._modifyCaption = function(propValue, propOldValue, propData) +{ + this._captionTitle.setHtml(propValue); + return true; +} + + + + + +/* +--------------------------------------------------------------------------- + STATE LAYOUT IMPLEMENTATION +--------------------------------------------------------------------------- +*/ + +qx.Proto._minimize = function() +{ + this.blur(); + this.hide(); +} + +qx.Proto._restoreFromMaximized = function() +{ + // restore previous dimension and location + this.setLeft(this._previousLeft ? this._previousLeft : null); + this.setWidth(this._previousWidth ? this._previousWidth : null); + this.setRight(this._previousRight ? this._previousRight : null); + + this.setTop(this._previousTop ? this._previousTop : null); + this.setHeight(this._previousHeight ? this._previousHeight : null); + this.setBottom(this._previousBottom ? this._previousBottom : null); + + // update state + this.removeState("maximized"); + + // toggle button + if (this.getShowMaximize()) + { + var cb = this._captionBar; + var v = cb.indexOf(this._restoreButton); + + cb.remove(this._restoreButton); + cb.addAt(this._maximizeButton, v); + } + + // finally focus the window + this.focus(); +} + +qx.Proto._restoreFromMinimized = function() +{ + if (this.hasState("maximized")) + { + this.setMode("maximized"); + } + + this.show(); + this.focus(); +} + +qx.Proto._maximize = function() +{ + if (this.hasState("maximized")) + { + return; + } + + // store current dimension and location + this._previousLeft = this.getLeft(); + this._previousWidth = this.getWidth(); + this._previousRight = this.getRight(); + this._previousTop = this.getTop(); + this._previousHeight = this.getHeight(); + this._previousBottom = this.getBottom(); + + // setup new dimension and location + this.setWidth(null); + this.setLeft(0); + this.setRight(0); + this.setHeight(null); + this.setTop(0); + this.setBottom(0); + + // update state + this.addState("maximized"); + + // toggle button + if (this.getShowMaximize()) + { + var cb = this._captionBar; + var v = cb.indexOf(this._maximizeButton); + + cb.remove(this._maximizeButton); + cb.addAt(this._restoreButton, v); + } + + // finally focus the window + this.focus(); +} + + + + + + + +/* +--------------------------------------------------------------------------- + EVENTS: WINDOW +--------------------------------------------------------------------------- +*/ + +qx.Proto._onwindowmousedown = function(e) +{ + this.focus(); + + if (this._resizeNorth || this._resizeSouth || this._resizeWest || this._resizeEast) + { + // enable capturing + this.setCapture(true); + + // activate global cursor + this.getTopLevelWidget().setGlobalCursor(this.getCursor()); + + // caching element + var el = this.getElement(); + + // measuring and caching of values for resize session + var pa = this.getParent(); + var pl = pa.getElement(); + + var l = qx.dom.Location.getPageAreaLeft(pl); + var t = qx.dom.Location.getPageAreaTop(pl); + var r = qx.dom.Location.getPageAreaRight(pl); + var b = qx.dom.Location.getPageAreaBottom(pl); + + // handle frame and translucently + switch(this.getResizeMethod()) + { + case "translucent": + this.setOpacity(0.5); + break; + + case "frame": + var f = this._frame; + + if (f.getParent() != this.getParent()) + { + f.setParent(this.getParent()); + qx.ui.core.Widget.flushGlobalQueues(); + } + + f._applyRuntimeLeft(qx.dom.Location.getPageBoxLeft(el) - l); + f._applyRuntimeTop(qx.dom.Location.getPageBoxTop(el) - t); + + f._applyRuntimeWidth(qx.dom.Dimension.getBoxWidth(el)); + f._applyRuntimeHeight(qx.dom.Dimension.getBoxHeight(el)); + + f.setZIndex(this.getZIndex() + 1); + + break; + } + + // create resize session + var s = this._resizeSession = {}; + + if (this._resizeWest) + { + s.boxWidth = qx.dom.Dimension.getBoxWidth(el); + s.boxRight = qx.dom.Location.getPageBoxRight(el); + } + + if (this._resizeWest || this._resizeEast) + { + s.boxLeft = qx.dom.Location.getPageBoxLeft(el); + + s.parentAreaOffsetLeft = l; + s.parentAreaOffsetRight = r; + + s.minWidth = this.getMinWidthValue(); + s.maxWidth = this.getMaxWidthValue(); + } + + if (this._resizeNorth) + { + s.boxHeight = qx.dom.Dimension.getBoxHeight(el); + s.boxBottom = qx.dom.Location.getPageBoxBottom(el); + } + + if (this._resizeNorth || this._resizeSouth) + { + s.boxTop = qx.dom.Location.getPageBoxTop(el); + + s.parentAreaOffsetTop = t; + s.parentAreaOffsetBottom = b; + + s.minHeight = this.getMinHeightValue(); + s.maxHeight = this.getMaxHeightValue(); + } + } + else + { + // cleanup resize session + delete this._resizeSession; + } + + // stop event + e.stopPropagation(); +} + +qx.Proto._onwindowmouseup = function(e) +{ + var s = this._resizeSession; + + if (s) + { + // disable capturing + this.setCapture(false); + + // deactivate global cursor + this.getTopLevelWidget().setGlobalCursor(null); + + // sync sizes to frame + switch(this.getResizeMethod()) + { + case "frame": + var o = this._frame; + if (!(o && o.getParent())) { + break; + } + // no break here + + case "lazyopaque": + if (qx.util.Validation.isValidNumber(s.lastLeft)) { + this.setLeft(s.lastLeft); + } + + if (qx.util.Validation.isValidNumber(s.lastTop)) { + this.setTop(s.lastTop); + } + + if (qx.util.Validation.isValidNumber(s.lastWidth)) { + this.setWidth(s.lastWidth); + } + + if (qx.util.Validation.isValidNumber(s.lastHeight)) { + this.setHeight(s.lastHeight); + } + + if (this.getResizeMethod() == "frame") { + this._frame.setParent(null); + } + break; + + case "translucent": + this.setOpacity(null); + break; + } + + // cleanup session + delete this._resizeNorth; + delete this._resizeEast; + delete this._resizeSouth; + delete this._resizeWest; + + delete this._resizeSession; + } + + // stop event + e.stopPropagation(); +} + +qx.Proto._near = function(p, e) { + return e > (p - 5) && e < (p + 5); +} + +qx.Proto._onwindowmousemove = function(e) +{ + if (!this.getResizeable() || this.getMode() != null) { + return; + } + + var s = this._resizeSession; + + if (s) + { + if (this._resizeWest) + { + s.lastWidth = qx.lang.Number.limit(s.boxWidth + s.boxLeft - Math.max(e.getPageX(), s.parentAreaOffsetLeft), s.minWidth, s.maxWidth); + s.lastLeft = s.boxRight - s.lastWidth - s.parentAreaOffsetLeft; + } + else if (this._resizeEast) + { + s.lastWidth = qx.lang.Number.limit(Math.min(e.getPageX(), s.parentAreaOffsetRight) - s.boxLeft, s.minWidth, s.maxWidth); + } + + if (this._resizeNorth) + { + s.lastHeight = qx.lang.Number.limit(s.boxHeight + s.boxTop - Math.max(e.getPageY(), s.parentAreaOffsetTop), s.minHeight, s.maxHeight); + s.lastTop = s.boxBottom - s.lastHeight - s.parentAreaOffsetTop; + } + else if (this._resizeSouth) + { + s.lastHeight = qx.lang.Number.limit(Math.min(e.getPageY(), s.parentAreaOffsetBottom) - s.boxTop, s.minHeight, s.maxHeight); + } + + switch(this.getResizeMethod()) + { + case "opaque": + case "translucent": + if (this._resizeWest || this._resizeEast) + { + this.setWidth(s.lastWidth); + + if (this._resizeWest) { + this.setLeft(s.lastLeft); + } + } + + if (this._resizeNorth || this._resizeSouth) + { + this.setHeight(s.lastHeight); + + if (this._resizeNorth) { + this.setTop(s.lastTop); + } + } + + break; + + default: + var o = this.getResizeMethod() == "frame" ? this._frame : this; + + if (this._resizeWest || this._resizeEast) + { + o._applyRuntimeWidth(s.lastWidth); + + if (this._resizeWest) { + o._applyRuntimeLeft(s.lastLeft); + } + } + + if (this._resizeNorth || this._resizeSouth) + { + o._applyRuntimeHeight(s.lastHeight); + + if (this._resizeNorth) { + o._applyRuntimeTop(s.lastTop); + } + } + } + } + else + { + var resizeMode = ""; + var el = this.getElement(); + + this._resizeNorth = this._resizeSouth = this._resizeWest = this._resizeEast = false; + + if (this._near(qx.dom.Location.getPageBoxTop(el), e.getPageY())) + { + resizeMode = "n"; + this._resizeNorth = true; + } + else if (this._near(qx.dom.Location.getPageBoxBottom(el), e.getPageY())) + { + resizeMode = "s"; + this._resizeSouth = true; + } + + if (this._near(qx.dom.Location.getPageBoxLeft(el), e.getPageX())) + { + resizeMode += "w"; + this._resizeWest = true; + } + else if (this._near(qx.dom.Location.getPageBoxRight(el), e.getPageX())) + { + resizeMode += "e"; + this._resizeEast = true; + } + + if (this._resizeNorth || this._resizeSouth || this._resizeWest || this._resizeEast) + { + this.setCursor(resizeMode + "-resize"); + } + else + { + this.setCursor(null); + } + } + + // stop event + e.stopPropagation(); +} + +qx.Proto._onwindowclick = function(e) +{ + // stop event + e.stopPropagation(); +}; + + + + + +/* +--------------------------------------------------------------------------- + EVENTS: BUTTONS +--------------------------------------------------------------------------- +*/ + +qx.Proto._onbuttonmousedown = function(e) { + e.stopPropagation(); +} + +qx.Proto._onminimizebuttonclick = function(e) +{ + this.minimize(); + + // we need to be sure that the button gets the right states after clicking + // because the button will move and does not get the mouseup event anymore + this._minimizeButton.removeState("pressed"); + this._minimizeButton.removeState("abandoned"); + this._minimizeButton.removeState("over"); + + e.stopPropagation(); +} + +qx.Proto._onrestorebuttonclick = function(e) +{ + this.restore(); + + // we need to be sure that the button gets the right states after clicking + // because the button will move and does not get the mouseup event anymore + this._restoreButton.removeState("pressed"); + this._restoreButton.removeState("abandoned"); + this._restoreButton.removeState("over"); + + e.stopPropagation(); +} + +qx.Proto._onmaximizebuttonclick = function(e) +{ + this.maximize(); + + // we need to be sure that the button gets the right states after clicking + // because the button will move and does not get the mouseup event anymore + this._maximizeButton.removeState("pressed"); + this._maximizeButton.removeState("abandoned"); + this._maximizeButton.removeState("over"); + + e.stopPropagation(); +} + +qx.Proto._onclosebuttonclick = function(e) +{ + this.close(); + + // we need to be sure that the button gets the right states after clicking + // because the button will move and does not get the mouseup event anymore + this._closeButton.removeState("pressed"); + this._closeButton.removeState("abandoned"); + this._closeButton.removeState("over"); + + e.stopPropagation(); +} + + + + + + + +/* +--------------------------------------------------------------------------- + EVENTS: CAPTIONBAR +--------------------------------------------------------------------------- +*/ + +qx.Proto._oncaptionmousedown = function(e) +{ + if (!e.isLeftButtonPressed() || !this.getMoveable() || this.getMode() != null) { + return; + } + + // enable capturing + this._captionBar.setCapture(true); + + // element cache + var el = this.getElement(); + + // measuring and caching of values for drag session + var pa = this.getParent(); + var pl = pa.getElement(); + + var l = qx.dom.Location.getPageAreaLeft(pl); + var t = qx.dom.Location.getPageAreaTop(pl); + var r = qx.dom.Location.getPageAreaRight(pl); + var b = qx.dom.Location.getPageAreaBottom(pl); + + this._dragSession = + { + offsetX : e.getPageX() - qx.dom.Location.getPageBoxLeft(el) + l, + offsetY : e.getPageY() - qx.dom.Location.getPageBoxTop(el) + t, + + parentAvailableAreaLeft : l + 5, + parentAvailableAreaTop : t + 5, + parentAvailableAreaRight : r - 5, + parentAvailableAreaBottom : b - 5 + } + + // handle frame and translucently + switch(this.getMoveMethod()) + { + case "translucent": + this.setOpacity(0.5); + break; + + case "frame": + var f = this._frame; + + if (f.getParent() != this.getParent()) + { + f.setParent(this.getParent()); + qx.ui.core.Widget.flushGlobalQueues(); + } + + f._applyRuntimeLeft(qx.dom.Location.getPageBoxLeft(el) - l); + f._applyRuntimeTop(qx.dom.Location.getPageBoxTop(el) - t); + + f._applyRuntimeWidth(qx.dom.Dimension.getBoxWidth(el)); + f._applyRuntimeHeight(qx.dom.Dimension.getBoxHeight(el)); + + f.setZIndex(this.getZIndex() + 1); + + break; + } +} + +qx.Proto._oncaptionmouseup = function(e) +{ + var s = this._dragSession; + + if (!s) { + return; + } + + // disable capturing + this._captionBar.setCapture(false); + + // move window to last position + if (qx.util.Validation.isValidNumber(s.lastX)) { + this.setLeft(s.lastX); + } + + if (qx.util.Validation.isValidNumber(s.lastY)) { + this.setTop(s.lastY); + } + + // handle frame and translucently + switch(this.getMoveMethod()) + { + case "translucent": + this.setOpacity(null); + break; + + case "frame": + this._frame.setParent(null); + break; + } + + // cleanup session + delete this._dragSession; +} + +qx.Proto._oncaptionmousemove = function(e) +{ + var s = this._dragSession; + + // pre check for active session and capturing + if (!s || !this._captionBar.getCapture()) { + return; + } + + // pre check if we go out of the available area + if (!qx.lang.Number.isBetweenRange(e.getPageX(), s.parentAvailableAreaLeft, s.parentAvailableAreaRight) || !qx.lang.Number.isBetweenRange(e.getPageY(), s.parentAvailableAreaTop, s.parentAvailableAreaBottom)) { + return; + } + + // use the fast and direct dom methods + var o = this.getMoveMethod() == "frame" ? this._frame : this; + + o._applyRuntimeLeft(s.lastX = e.getPageX() - s.offsetX); + o._applyRuntimeTop(s.lastY = e.getPageY() - s.offsetY); +} + +qx.Proto._oncaptiondblblick = function() +{ + if (!this._maximizeButton.getEnabled()) { + return; + } + + return this.getMode() == "maximized" ? this.restore() : this.maximize(); +} + + + + + + + + +/* +--------------------------------------------------------------------------- + DISPOSER +--------------------------------------------------------------------------- +*/ + +qx.Proto.dispose = function() +{ + if (this.getDisposed()) { + return true; + } + + if (this._layout) + { + this._layout.dispose(); + this._layout = null; + } + + if (this._frame) + { + this._frame.dispose(); + this._frame = null; + } + + if (this._captionBar) + { + this._captionBar.dispose(); + this._captionBar = null; + } + + if (this._captionIcon) + { + this._captionIcon.dispose(); + this._captionIcon = null; + } + + if (this._captionTitle) + { + this._captionTitle.dispose(); + this._captionTitle = null; + } + + if (this._captionFlex) + { + this._captionFlex.dispose(); + this._captionFlex = null; + } + + if (this._closeButton) + { + this._closeButton.dispose(); + this._closeButton = null; + } + + if (this._minimizeButton) + { + this._minimizeButton.dispose(); + this._minimizeButton = null; + } + + if (this._maximizeButton) + { + this._maximizeButton.dispose(); + this._maximizeButton = null; + } + + if (this._restoreButton) + { + this._restoreButton.dispose(); + this._restoreButton = null; + } + + if (this._pane) + { + this._pane.dispose(); + this._pane = null; + } + + if (this._statusBar) + { + this._statusBar.dispose(); + this._statusBar = null; + } + + if (this._statusText) + { + this._statusText.dispose(); + this._statusText = null; + } + + return qx.ui.popup.Popup.prototype.dispose.call(this); +} |