123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404 |
- if (!dojo._hasResource["dojox.layout.FloatingPane"]) { // _hasResource checks
- // added by build. Do
- // not use _hasResource
- // directly in your
- // code.
- dojo._hasResource["dojox.layout.FloatingPane"] = true;
- dojo.provide("dojox.layout.FloatingPane");
- dojo.experimental("dojox.layout.FloatingPane");
- dojo.require("dojox.layout.ContentPane");
- dojo.require("dijit._Templated");
- dojo.require("dijit._Widget");
- dojo.require("dojo.dnd.move");
- dojo.require("dojox.layout.ResizeHandle");
- dojo.declare("dojox.layout.FloatingPane", [dojox.layout.ContentPane,
- dijit._Templated], {
- // summary:
- //
- // Makes a dijit.ContentPane float and draggable by it's title
- // [similar to TitlePane]
- // and over-rides onClick to onDblClick for wipeIn/Out of
- // containerNode
- // provides minimize(dock) / show() and hide() methods, and
- // resize [almost]
- // closable: Boolean
- // allow closure of this Node
- closable : true,
- // dockable: Boolean
- // allow minimizing of pane true/false
- dockable : true,
- // resizable: Boolean
- // allow resizing of pane true/false
- resizable : false,
- // maxable: Boolean
- // horrible param name for "Can you maximize this floating pane"
- maxable : false,
- // resizeAxis: String
- // x | xy | y to limit pane's sizing direction
- resizeAxis : "xy",
- // title: String
- // title to put in titlebar
- title : "",
- // dockTo: DomNode || null
- // if null, will create private layout.Dock that scrolls with
- // viewport
- // on bottom span of viewport.
- dockTo : null,
- // duration: Integer
- // time is MS to spend toggling in/out node
- duration : 400,
- // animation holders for toggle
- _showAnim : null,
- _hideAnim : null,
- // node in the dock (if docked)
- _dockNode : null,
- // iconSrc: String
- // [not implemented yet] will be either icon in titlepane to
- // left
- // of Title, and/or icon show when docked in a fisheye-like dock
- // or maybe dockIcon would be better?
- iconSrc : null,
- contentClass : "dojoxFloatingPaneContent",
- templateString : null,
- templateString : "<div class=\"dojoxFloatingPane\" id=\"${id}\">\n\t<div tabindex=\"0\" waiRole=\"button\" class=\"dojoxFloatingPaneTitle\" dojoAttachPoint=\"focusNode\">\n\t\t<span dojoAttachPoint=\"closeNode\" dojoAttachEvent=\"onclick: close\" class=\"dojoxFloatingCloseIcon\"></span>\n\t\t<span dojoAttachPoint=\"maxNode\" dojoAttachEvent=\"onclick: maximize\" class=\"dojoxFloatingMaximizeIcon\"></span>\n\t\t<span dojoAttachPoint=\"restoreNode\" dojoAttachEvent=\"onclick: _restore\" class=\"dojoxFloatingRestoreIcon\"></span>\t\n\t\t<span dojoAttachPoint=\"dockNode\" dojoAttachEvent=\"onclick: minimize\" class=\"dojoxFloatingMinimizeIcon\"></span>\n\t\t<span dojoAttachPoint=\"titleNode\" class=\"dijitInline dijitTitleNode\"></span>\n\t</div>\n\t<div dojoAttachPoint=\"canvas\" class=\"dojoxFloatingPaneCanvas\">\n\t\t<div dojoAttachPoint=\"containerNode\" waiRole=\"region\" tabindex=\"-1\" class=\"${contentClass}\">\n\t\t</div>\n\t\t<span dojoAttachPoint=\"resizeHandle\" class=\"dojoxFloatingResizeHandle\"></span>\n\t</div>\n</div>\n",
- _restoreState : {},
- _allFPs : [],
- postCreate : function() {
- // summary:
- this.setTitle(this.title);
- this.inherited("postCreate", arguments);
- var move = new dojo.dnd.Moveable(this.domNode, {
- handle : this.focusNode
- });
- // this._listener =
- // dojo.subscribe("/dnd/move/start",this,"bringToTop");
- if (!this.dockable) {
- this.dockNode.style.display = "none";
- }
- if (!this.closable) {
- this.closeNode.style.display = "none";
- }
- if (!this.maxable) {
- this.maxNode.style.display = "none";
- this.restoreNode.style.display = "none";
- }
- if (!this.resizable) {
- this.resizeHandle.style.display = "none";
- } else {
- var foo = dojo.marginBox(this.domNode);
- this.domNode.style.width = foo.w + "px";
- }
- this._allFPs.push(this);
- },
- startup : function() {
- this.inherited("startup", arguments);
- if (this.resizable) {
- if (dojo.isIE) {
- this.canvas.style.overflow = "auto";
- } else {
- this.containerNode.style.overflow = "auto";
- }
- var tmp = new dojox.layout.ResizeHandle({
- // targetContainer: this.containerNode,
- targetId : this.id,
- resizeAxis : this.resizeAxis
- }, this.resizeHandle);
- }
- if (this.dockable) {
- // FIXME: argh.
- tmpName = this.dockTo;
- if (this.dockTo) {
- this.dockTo = dijit.byId(this.dockTo);
- } else {
- this.dockTo = dijit.byId('dojoxGlobalFloatingDock');
- }
- if (!this.dockTo) {
- // we need to make our dock node, and position it
- // against
- // .dojoxDockDefault .. this is a lot. either
- // dockto="node"
- // and fail if node doesn't exist or make the global
- // one
- // once, and use it on empty OR invalid dockTo=""
- // node?
- if (tmpName) {
- var tmpId = tmpName;
- var tmpNode = dojo.byId(tmpName);
- } else {
- var tmpNode = document.createElement('div');
- dojo.body().appendChild(tmpNode);
- dojo.addClass(tmpNode,
- "dojoxFloatingDockDefault");
- var tmpId = 'dojoxGlobalFloatingDock';
- }
- this.dockTo = new dojox.layout.Dock({
- id : tmpId,
- autoPosition : "south"
- }, tmpNode);
- this.dockTo.startup();
- }
- if ((this.domNode.style.display == "none")
- || (this.domNode.style.visibility == "hidden")) {
- // If the FP is created dockable and non-visible,
- // start up docked.
- this.minimize();
- }
- }
- this.connect(this.focusNode, "onmousedown", "bringToTop");
- this.connect(this.domNode, "onmousedown", "bringToTop");
- },
- setTitle : function(/* String */title) {
- // summary: Update the string in the titleNode
- this.titleNode.innerHTML = title;
- },
- close : function() {
- // summary: close and destroy this widget
- if (!this.closable) {
- return;
- }
- dojo.unsubscribe(this._listener);
- this.hide(dojo.hitch(this, "destroy"));
- },
- hide : function(/* Function? */callback) {
- // summary: close but do not destroy this widget
- dojo.fadeOut({
- node : this.domNode,
- duration : this.duration,
- onEnd : dojo.hitch(this, function() {
- this.domNode.style.display = "none";
- this.domNode.style.visibility = "hidden";
- if (this.dockTo) {
- this.dockTo._positionDock(null);
- }
- if (callback) {
- callback();
- }
- })
- }).play();
- },
- show : function(/* Function? */callback) {
- // summary: show the FloatingPane
- var anim = dojo.fadeIn({
- node : this.domNode,
- duration : this.duration,
- beforeBegin : dojo.hitch(this, function() {
- this.domNode.style.display = "";
- this.domNode.style.visibility = "visible";
- this.dockTo._positionDock(null);
- if (this.dockTo) {
- this.dockTo._positionDock(null);
- }
- if (typeof callback == "function") {
- callback();
- }
- this._isDocked = false;
- if (this._dockNode) {
- this._dockNode.destroy();
- this._dockNode = null;
- }
- })
- }).play();
- this.resize(dojo.coords(this.domNode));
- },
- minimize : function() {
- // summary: hide and dock the FloatingPane
- if (!this._isDocked) {
- this.hide(dojo.hitch(this, "_dock"));
- }
- },
- maximize : function() {
- // summary: Make this floatingpane fullscreen (viewport)
- if (this._maximized) {
- return;
- }
- this._naturalState = dojo.coords(this.domNode);
- if (this._isDocked) {
- this.show();
- setTimeout(dojo.hitch(this, "maximize"), this.duration);
- }
- dojo.addClass(this.focusNode, "floatingPaneMaximized");
- this.resize(dijit.getViewport());
- this._maximized = true;
- },
- _restore : function() {
- if (this._maximized) {
- this.resize(this._naturalState);
- dojo.removeClass(this.focusNode,
- "floatingPaneMaximized");
- this._maximized = false;
- }
- },
- _dock : function() {
- if (!this._isDocked) {
- this._dockNode = this.dockTo.addNode(this);
- this._isDocked = true;
- }
- },
- resize : function(/* Object */dim) {
- // summary: size the widget and place accordingly
- this._currentState = dim;
- var dns = this.domNode.style;
- dns.top = dim.t + "px";
- dns.left = dim.l + "px";
- dns.width = dim.w + "px";
- this.canvas.style.width = dim.w + "px";
- dns.height = dim.h + "px";
- this.canvas.style.height = (dim.h - this.focusNode.offsetHeight)
- + "px";
- },
- _startZ : 100,
- bringToTop : function() {
- // summary: bring this FloatingPane above all other panes
- var windows = dojo.filter(this._allFPs, function(i) {
- return i !== this;
- }, this);
- windows.sort(function(a, b) {
- return a.domNode.style.zIndex
- - b.domNode.style.zIndex;
- });
- windows.push(this);
- dojo.forEach(windows, function(w, x) {
- w.domNode.style.zIndex = (this._startZ + x * 2);
- dojo.removeClass(w.domNode,
- "dojoxFloatingPaneFg");
- }, this);
- dojo.addClass(this.domNode, "dojoxFloatingPaneFg");
- },
- destroy : function() {
- // summary: Destroy this FloatingPane completely
- this._allFPs.splice(dojo.indexOf(this._allFPs, this), 1);
- this.inherited("destroy", arguments);
- }
- });
- dojo.declare("dojox.layout.Dock", [dijit._Widget, dijit._Templated], {
- // summary:
- // a widget that attaches to a node and keeps track of incoming /
- // outgoing FloatingPanes
- // and handles layout
- templateString : '<div class="dojoxDock"><ul dojoAttachPoint="containerNode" class="dojoxDockList"></ul></div>',
- // private _docked: array of panes currently in our dock
- _docked : [],
- _inPositioning : false,
- autoPosition : false,
- addNode : function(refNode) {
- // summary: instert a dockNode refernce into the dock
- var div = document.createElement('li');
- this.containerNode.appendChild(div);
- var node = new dojox.layout._DockNode({
- title : refNode.title,
- paneRef : refNode
- }, div);
- node.startup();
- return node;
- },
- startup : function() {
- // summary: attaches some event listeners
- if (this.id == "dojoxGlobalFloatingDock" || this.isFixedDock) {
- // attach window.onScroll, and a position like in
- // presentation/dialog
- dojo.connect(window, 'onresize', this, "_positionDock");
- dojo.connect(window, 'onscroll', this, "_positionDock");
- if (dojo.isIE) {
- dojo.connect(this.domNode, 'onresize', this,
- "_positionDock");
- }
- }
- this._positionDock(null);
- this.inherited("startup", arguments);
- },
- _positionDock : function(/* Event? */e) {
- if (!this._inPositioning) {
- if (this.autoPosition == "south") {
- // Give some time for scrollbars to appear/disappear
- setTimeout(dojo.hitch(this, function() {
- this._inPositiononing = true;
- var viewport = dijit.getViewport();
- var s = this.domNode.style;
- s.left = viewport.l + "px";
- s.width = (viewport.w - 2) + "px";
- s.top = (viewport.h + viewport.t)
- - this.domNode.offsetHeight
- + "px";
- this._inPositioning = false;
- }), 500);
- }
- }
- }
- });
- dojo.declare("dojox.layout._DockNode", [dijit._Widget, dijit._Templated], {
- // summary:
- // dojox.layout._DockNode is a private widget used to keep track of
- // which pane is docked.
- // title: String
- // shown in dock icon. should read parent iconSrc?
- title : "",
- // paneRef: Widget
- // reference to the FloatingPane we reprasent in any given dock
- paneRef : null,
- templateString : '<li dojoAttachEvent="onclick: restore" class="dojoxDockNode">'
- + '<span dojoAttachPoint="restoreNode" class="dojoxDockRestoreButton" dojoAttachEvent="onclick: restore"></span>'
- + '<span class="dojoxDockTitleNode" dojoAttachPoint="titleNode">${title}</span>'
- + '</li>',
- restore : function() {
- // summary: remove this dock item from parent dock, and call show()
- // on reffed floatingpane
- this.paneRef.show();
- this.paneRef.bringToTop();
- this.destroy();
- }
- });
- }
|