164 lines
4.6 KiB
JavaScript
164 lines
4.6 KiB
JavaScript
![]() |
/*
|
||
|
Copyright (c) 2004-2006, The Dojo Foundation
|
||
|
All Rights Reserved.
|
||
|
|
||
|
Licensed under the Academic Free License version 2.1 or above OR the
|
||
|
modified BSD license. For more information on Dojo licensing, see:
|
||
|
|
||
|
http://dojotoolkit.org/community/licensing.shtml
|
||
|
*/
|
||
|
|
||
|
dojo.provide("dojo.widget.HtmlWidget");
|
||
|
dojo.require("dojo.widget.DomWidget");
|
||
|
dojo.require("dojo.html");
|
||
|
dojo.require("dojo.html.extras");
|
||
|
dojo.require("dojo.lang.extras");
|
||
|
dojo.require("dojo.lang.func");
|
||
|
dojo.require("dojo.lfx.toggle");
|
||
|
|
||
|
dojo.declare("dojo.widget.HtmlWidget", dojo.widget.DomWidget, {
|
||
|
widgetType: "HtmlWidget",
|
||
|
|
||
|
templateCssPath: null,
|
||
|
templatePath: null,
|
||
|
|
||
|
// for displaying/hiding widget
|
||
|
toggle: "plain",
|
||
|
toggleDuration: 150,
|
||
|
|
||
|
animationInProgress: false,
|
||
|
|
||
|
initialize: function(args, frag){
|
||
|
},
|
||
|
|
||
|
postMixInProperties: function(args, frag){
|
||
|
// now that we know the setting for toggle, get toggle object
|
||
|
// (default to plain toggler if user specified toggler not present)
|
||
|
this.toggleObj =
|
||
|
dojo.lfx.toggle[this.toggle.toLowerCase()] || dojo.lfx.toggle.plain;
|
||
|
},
|
||
|
|
||
|
getContainerHeight: function(){
|
||
|
// NOTE: container height must be returned as the INNER height
|
||
|
dojo.unimplemented("dojo.widget.HtmlWidget.getContainerHeight");
|
||
|
},
|
||
|
|
||
|
getContainerWidth: function(){
|
||
|
return this.parent.domNode.offsetWidth;
|
||
|
},
|
||
|
|
||
|
setNativeHeight: function(height){
|
||
|
var ch = this.getContainerHeight();
|
||
|
},
|
||
|
|
||
|
createNodesFromText: function(txt, wrap){
|
||
|
return dojo.html.createNodesFromText(txt, wrap);
|
||
|
},
|
||
|
|
||
|
destroyRendering: function(finalize){
|
||
|
try{
|
||
|
if(!finalize){
|
||
|
dojo.event.browser.clean(this.domNode);
|
||
|
}
|
||
|
this.domNode.parentNode.removeChild(this.domNode);
|
||
|
delete this.domNode;
|
||
|
}catch(e){ /* squelch! */ }
|
||
|
},
|
||
|
|
||
|
/////////////////////////////////////////////////////////
|
||
|
// Displaying/hiding the widget
|
||
|
/////////////////////////////////////////////////////////
|
||
|
isShowing: function(){
|
||
|
return dojo.style.isShowing(this.domNode);
|
||
|
},
|
||
|
|
||
|
toggleShowing: function(){
|
||
|
// dojo.style.toggleShowing(this.domNode);
|
||
|
if(this.isHidden){
|
||
|
this.show();
|
||
|
}else{
|
||
|
this.hide();
|
||
|
}
|
||
|
},
|
||
|
|
||
|
show: function(){
|
||
|
this.animationInProgress=true;
|
||
|
this.isHidden = false;
|
||
|
this.toggleObj.show(this.domNode, this.toggleDuration, null,
|
||
|
dojo.lang.hitch(this, this.onShow), this.explodeSrc);
|
||
|
},
|
||
|
|
||
|
// called after the show() animation has completed
|
||
|
onShow: function(){
|
||
|
this.animationInProgress=false;
|
||
|
this.checkSize();
|
||
|
},
|
||
|
|
||
|
hide: function(){
|
||
|
this.animationInProgress = true;
|
||
|
this.isHidden = true;
|
||
|
this.toggleObj.hide(this.domNode, this.toggleDuration, null,
|
||
|
dojo.lang.hitch(this, this.onHide), this.explodeSrc);
|
||
|
},
|
||
|
|
||
|
// called after the hide() animation has completed
|
||
|
onHide: function(){
|
||
|
this.animationInProgress=false;
|
||
|
},
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
// Sizing related methods
|
||
|
// If the parent changes size then for each child it should call either
|
||
|
// - resizeTo(): size the child explicitly
|
||
|
// - or checkSize(): notify the child the the parent has changed size
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
// Test if my size has changed.
|
||
|
// If width & height are specified then that's my new size; otherwise,
|
||
|
// query outerWidth/outerHeight of my domNode
|
||
|
_isResized: function(w, h){
|
||
|
// If I'm not being displayed then disregard (show() must
|
||
|
// check if the size has changed)
|
||
|
if(!this.isShowing()){ return false; }
|
||
|
|
||
|
// If my parent has been resized and I have style="height: 100%"
|
||
|
// or something similar then my size has changed too.
|
||
|
w=w||dojo.style.getOuterWidth(this.domNode);
|
||
|
h=h||dojo.style.getOuterHeight(this.domNode);
|
||
|
if(this.width == w && this.height == h){ return false; }
|
||
|
|
||
|
this.width=w;
|
||
|
this.height=h;
|
||
|
return true;
|
||
|
},
|
||
|
|
||
|
// Called when my parent has changed size, but my parent won't call resizeTo().
|
||
|
// This is useful if my size is height:100% or something similar.
|
||
|
// Also called whenever I am shown, because the first time I am shown I may need
|
||
|
// to do size calculations.
|
||
|
checkSize: function(){
|
||
|
if(!this._isResized()){ return; }
|
||
|
this.onResized();
|
||
|
},
|
||
|
|
||
|
// Explicitly set this widget's size (in pixels).
|
||
|
resizeTo: function(w, h){
|
||
|
if(!this._isResized(w,h)){ return; }
|
||
|
dojo.style.setOuterWidth(this.domNode, w);
|
||
|
dojo.style.setOuterHeight(this.domNode, h);
|
||
|
this.onResized();
|
||
|
},
|
||
|
|
||
|
resizeSoon: function(){
|
||
|
if(this.isShowing()){
|
||
|
dojo.lang.setTimeout(this, this.onResized, 0);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
// Called when my size has changed.
|
||
|
// Must notify children if their size has (possibly) changed
|
||
|
onResized: function(){
|
||
|
dojo.lang.forEach(this.children, function(child){ child.checkSize(); });
|
||
|
}
|
||
|
});
|