/* 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: Label.js 616 2013-04-22 23:48:38Z geert $
*/
"use strict";
SUI.form.Label = SUI.defineClass(
/** @lends SUI.form.Label.prototype */{
/** @ignore */ baseClass: SUI.Box,
/**
* @class
* SUI.form.Label is a simple box component to create an HTML label.
*
* @augments SUI.Box
*
* @description
* Create a label.
*
* @constructs
* @param see base class
* @param {String} arg.title The text on the label.
* @param {SUI.Box} arg.forBox The box where this label's for.
*/
initializer: function(arg) {
arg.tag = "LABEL";
arg.height = arg.height || this.HEIGHT;
SUI.form.Label.initializeBase(this, arg);
this.forBox(arg.forBox || null);
this.el().innerHTML = arg.title || "";
this.el().style.overflow = "hidden";
this.el().style.whiteSpace = "nowrap";
var that = this;
// but we do want to show the content if it is truncated
// that and cell are the tow closure variables
SUI.browser.addEventListener(this.el(), "mouseover",
function(e) {
if (!that._setTitleOnOverflow()) {
SUI.browser.noPropagation(e);
}
}
);
},
/**
* Default height of the label.
*/
HEIGHT: 20,
/**
* Correction to add to the top of the label to vertically align the text
* with the control.
*/
TOP_PATCH: 2,
/**
* Get or set the box where the label is for.
* @param {SUI.Box} f (optional) the new box where this label points to
* @return {SUI.Box} the box where this label points to (null if method
* was used as setter)
*/
forBox: function(f) {
return f !== undefined ? (this._forBox = f) && null : this._forBox;
},
/**
* Display the label. Set the CSS size and postion.
*/
display: function() {
// do the normal lay out
SUI.form.Label.parentMethod(this, "display");
// and a little adjustment, note this only works because
// parentMethod.display() sets this.el().style.top, thus there is
// no chance of a 'growing' top margin when calling display multiple
// times.
this.el().style.top =
(this.TOP_PATCH + parseInt(this.el().style.top,10)) + "px";
},
/**
* Lay out the label. Set it's size and position.
*/
layOut: function() {
// if the label points to a box ...
if (this._forBox) {
// ... set the for attribute of the box's element
this.el().setAttribute("for", this._forBox.el().id);
}
SUI.form.Label.parentMethod(this, "layOut");
},
// reference to the box where this label points to
_forBox: null,
// the top of the box (uncorrected)
_lTop: 0,
/* Set the label title if the contents of the label did overflow
*/
_setTitleOnOverflow: function() {
var of = this.el().clientWidth - this.el().scrollWidth;
this.el().title =
of >= 0 ? "" : this.el().innerHTML .replace(/<[^>]+>/g,"");
}
});