/* Copyright (c) 2011, Geert Bergman (geert@scrivo.nl)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of "Scrivo" nor the names of its contributors may be
* used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* $Id: Panel.js 616 2013-04-22 23:48:38Z geert $
*/
"use strict";
SUI.Panel = SUI.defineClass(
/** @lends SUI.Panel.prototype */{
/** @ignore */ baseClass: SUI.AnchorLayout,
/**
* @class
* SUI.Panel a very straightforward implementation of a container. It is
* just a colored pane with an inner an outer border (all customizable)
* to which you can add other boxes. It is the standard background panel
* for most forms. Alternatively you can insert HTML of the client area of
* the panel directly.
* TODO: split this in a HTMLPanel and a Container Panel.
*
* @augments SUI.AnchorLayout
*
* @description
* Construct a SUI.Panel object. Actually nothing more than a
* SUI.AnchorLayout but with some extra cosmetical extras.
*
* @constructs
* @param see base class
* @param {SUI.Border} arg.innerBorder (optional) The inner border to use
* @param {String} arg.color A color code for the color of the client area
*/
initializer: function(arg) {
SUI.Panel.initializeBase(this, arg);
// set the style of the main panel
this.addClass("sui-panel");
// removing these breaks scrivo why?
this.border(arg.border);
this.padding(arg.padding);
// create the inner (client) box and set the style
this.inner = new SUI.Box({parent: this});
this.inner.addClass("sui-panel-inner");
if (arg.innerBorder) {
this.inner.border(arg.innerBorder);
}
// if a color for the inner panel was given ...
if (arg.color) {
// ... the use that color
this.inner.el().style.backgroundColor = arg.color;
} else {
// ... else use the system default style
this.inner.addClass("sui-panel-gradient");
}
},
/**
* Add an box to the panel.
* @param {SUI.AnchorLayout} child box to add
*/
add: function(child) {
// add the child to the inner box
SUI.Panel.parentMethod(this, "add", child, this.inner);
},
/**
* Get the client box element. Return reference to the inner/client box.
* @return {SUI.Box} a reference to the client box
*/
clientBox: function() {
// in the case of SUI.Box the outer box is the inner
return this.inner;
},
/**
* Display the panel. Set the CSS positions of the element's box(es) and
* for the children of the box.
*/
display: function() {
this.setDim();
// type html has a CSS position of relative so don't use setDim on
// the inner panel then.
if (this._type == "sui") {
this.inner.setDim();
SUI.Panel.parentMethod(this, "display");
}
},
/**
* Lay out the panel. Calculate the position of the panel and
* its contents.
*/
layOut: function() {
// type html has a CSS position of relative so don't use layOut on the
// inner panel then.
if (this._type == "sui") {
this.inner.setRect(0, 0, this.clientWidth(), this.clientHeight());
SUI.Panel.parentMethod(this, "layOut");
}
},
/**
* Set or get the (HTML) content of the panel.
* @param {String} content the new panel content
* @return {String} the panel content
*/
content: function(content) {
// if is a "sui" panel change it into a "html" panel
if (this._type !== "html") {
this._createHTMLPanel();
}
if (content === undefined) {
return this.inner.el().innerHTML;
}
this.inner.el().innerHTML = content;
// when the content is set make it unselectable in IE
if (SUI.browser.isIE) {
if (this.inner.el().unselectable) {
var l = this.inner.el().getElementsByTagName("*");
for (var i=0; i<l.length; i++) {
l[i].unselectable = true;
}
}
}
return null;
},
/* Turn the inner box into a relatively positioned div and use the
* outer div as a viewport for that div.
*/
_createHTMLPanel: function() {
// set the type to html
this._type = "html";
// use the background color of the inner panel for the outer panel
this.el().style.backgroundColor =
this.inner.el().style.backgroundColor;
// if the inner panel has the system CSS use that for the outer panel
if (this.inner.el().className.indexOf("sui-panel-gradient") !== -1) {
this.inner.removeClass("sui-panel-gradient");
this.addClass("sui-panel-gradient");
}
// the outer panel get a scroll bar
this.el().style.overflow = "auto";
// and the inner panel is reset to a relatively positioned div
this.inner.el().style.width = "auto";
this.inner.el().style.height = "auto";
this.inner.el().style.position = "relative";
this.inner.el().style.top = 0;
this.inner.el().style.left = 0;
this.inner.el().style.overflow = "visible";
},
// type of the panel "sui" or "html"
_type: "sui"
});