You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
4.9 KiB
140 lines
4.9 KiB
define(["dojo/_base/lang", "dojo/_base/declare", "dojo/sniff", "dojo/_base/window", "dojo/_base/config", |
|
"dojo/dom-attr", "dojo/topic", "dojo/dom-style", "../utils/constraints", "../Controller"], |
|
function(lang, declare, has, win, config, domAttr, topic, domStyle, constraints, Controller){ |
|
// module: |
|
// dojox/app/controllers/LayoutBase |
|
// summary: |
|
// Bind "app-initLayout", "app-layoutView" and "app-resize" events on application instance. |
|
|
|
return declare("dojox.app.controllers.LayoutBase", Controller, { |
|
|
|
constructor: function(app, events){ |
|
// summary: |
|
// bind "app-initLayout", "app-layoutView" and "app-resize" events on application instance. |
|
// |
|
// app: |
|
// dojox/app application instance. |
|
// events: |
|
// {event : handler} |
|
this.events = { |
|
"app-initLayout": this.initLayout, |
|
"app-layoutView": this.layoutView, |
|
"app-resize": this.onResize |
|
}; |
|
// if we are using dojo mobile & we are hiding address bar we need to be bit smarter and listen to |
|
// dojo mobile events instead |
|
if(config.mblHideAddressBar){ |
|
topic.subscribe("/dojox/mobile/afterResizeAll", lang.hitch(this, this.onResize)); |
|
}else{ |
|
// bind to browsers orientationchange event for ios otherwise bind to browsers resize |
|
this.bind(win.global, has("ios") ? "orientationchange" : "resize", lang.hitch(this, this.onResize)); |
|
} |
|
}, |
|
|
|
onResize: function(){ |
|
this._doResize(this.app); |
|
// this is needed to resize the children on an orientation change or a resize of the browser. |
|
// it was being done in _doResize, but was not needed for every call to _doResize. |
|
for(var hash in this.app.selectedChildren){ // need this to handle all selectedChildren |
|
if(this.app.selectedChildren[hash]){ |
|
this._doResize(this.app.selectedChildren[hash]); |
|
} |
|
} |
|
|
|
}, |
|
|
|
initLayout: function(event){ |
|
// summary: |
|
// Response to dojox/app "app-initLayout" event. |
|
// |
|
// example: |
|
// Use emit to trigger "app-initLayout" event, and this function will respond to the event. For example: |
|
// | this.app.emit("app-initLayout", view); |
|
// |
|
// event: Object |
|
// | {"view": view, "callback": function(){}}; |
|
domAttr.set(event.view.domNode, "id", event.view.id); // Set the id for the domNode |
|
if(event.callback){ // if the event has a callback, call it. |
|
event.callback(); |
|
} |
|
}, |
|
|
|
_doLayout: function(view){ |
|
// summary: |
|
// do view layout. |
|
// |
|
// view: Object |
|
// view instance needs to do layout. |
|
|
|
if(!view){ |
|
console.warn("layout empty view."); |
|
} |
|
}, |
|
|
|
_doResize: function(view){ |
|
// summary: |
|
// resize view. |
|
// |
|
// view: Object |
|
// view instance needs to do resize. |
|
this.app.log("in LayoutBase _doResize called for view.id="+view.id+" view=",view); |
|
this._doLayout(view); |
|
}, |
|
|
|
layoutView: function(event){ |
|
// summary: |
|
// Response to dojox/app "app-layoutView" event. |
|
// |
|
// example: |
|
// Use emit to trigger "app-layoutView" event, and this function will response the event. For example: |
|
// | this.app.emit("app-layoutView", view); |
|
// |
|
// event: Object |
|
// | {"parent":parent, "view":view, "removeView": boolean} |
|
var parent = event.parent || this.app; |
|
var view = event.view; |
|
|
|
if(!view){ |
|
return; |
|
} |
|
|
|
this.app.log("in LayoutBase layoutView called for event.view.id="+event.view.id); |
|
|
|
// if the parent has a child in the view constraint it has to be hidden, and this view displayed. |
|
var parentSelChild = constraints.getSelectedChild(parent, view.constraint); |
|
if(event.removeView){ // if this view is being removed set display to none and the selectedChildren entry to null |
|
view.viewShowing = false; |
|
this.hideView(view); |
|
if(view == parentSelChild){ |
|
constraints.setSelectedChild(parent, view.constraint, null); // remove from selectedChildren |
|
} |
|
}else if(view !== parentSelChild){ |
|
if(parentSelChild){ |
|
// domStyle.set(parentSelChild.domNode, "zIndex", 25); |
|
parentSelChild.viewShowing = false; |
|
if(event.transition == "none" || event.currentLastSubChildMatch !== parentSelChild){ |
|
this.hideView(parentSelChild); // only call hideView for transition none or when the transition will not hide it |
|
} |
|
} |
|
view.viewShowing = true; |
|
this.showView(view); |
|
//domStyle.set(view.domNode, "zIndex", 50); |
|
constraints.setSelectedChild(parent, view.constraint, view); |
|
}else{ // this view is already the selected child and showing |
|
view.viewShowing = true; |
|
} |
|
}, |
|
|
|
hideView: function(view){ |
|
this.app.log("logTransitions:","LayoutBase"+" setting domStyle display none for view.id=["+view.id+"], visibility=["+view.domNode.style.visibility+"]"); |
|
domStyle.set(view.domNode, "display", "none"); |
|
}, |
|
|
|
showView: function(view){ |
|
if(view.domNode){ |
|
this.app.log("logTransitions:","LayoutBase"+" setting domStyle display to display for view.id=["+view.id+"], visibility=["+view.domNode.style.visibility+"]"); |
|
domStyle.set(view.domNode, "display", ""); |
|
} |
|
} |
|
}); |
|
});
|
|
|