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.
230 lines
7.5 KiB
230 lines
7.5 KiB
|
|
/*
|
|
================================================================================
|
|
StackedTab
|
|
================================================================================
|
|
*/
|
|
bobj.crv.newStackedTab = function(kwArgs) {
|
|
var UPDATE = MochiKit.Base.update;
|
|
|
|
kwArgs = UPDATE({
|
|
id: bobj.uniqueId(),
|
|
label: '',
|
|
width: 300,
|
|
height: null, // null height means grow as big as necessary
|
|
openAdvCB: null,
|
|
name : '',
|
|
isDataFetching: false
|
|
}, kwArgs);
|
|
|
|
var o = newWidget(kwArgs.id);
|
|
o.widgetType = 'StackedTab';
|
|
bobj.fillIn(o, kwArgs);
|
|
|
|
o._content = null;
|
|
|
|
if(o.openAdvCB) {
|
|
o._advanceButton = newIconWidget(
|
|
o.id + '_advBtn',
|
|
bobj.crv.allInOne.uri,
|
|
o.openAdvCB,
|
|
null, //text
|
|
L_bobj_crv_paramsOpenAdvance.replace("%1", o.name),//tooltip,
|
|
10, 10, 3, bobj.crv.allInOne.openParameterArrowDy + (_ie ? 2 : 3)); //width, height, dx, dy, disDx, disDy, cancelEventPropagation
|
|
bobj.crv.setAllClasses(o._advanceButton, 'arrow_button');
|
|
o._advanceButton.margin = 0;
|
|
}
|
|
|
|
o._initWidget = o.init;
|
|
o._resizeWidget = o.resize;
|
|
UPDATE(o, bobj.crv.StackedTab);
|
|
|
|
return o;
|
|
};
|
|
|
|
bobj.crv.StackedTab = {
|
|
setTabDisabled : function(dis) {
|
|
if (this._content)
|
|
this._content.setTabDisabled (dis);
|
|
|
|
if (this._advanceButton && this._advanceButton.layer)
|
|
bobj.disableTabbingKey (this._advanceButton.layer, dis);
|
|
|
|
if (this._textCtn)
|
|
bobj.disableTabbingKey (this._textCtn, dis);
|
|
|
|
if(this._dataFetchLayer)
|
|
bobj.disableTabbingKey (this._dataFetchLayer, dis);
|
|
},
|
|
|
|
init : function() {
|
|
var connect = MochiKit.Signal.connect;
|
|
var signal = MochiKit.Signal.signal;
|
|
var partial = MochiKit.Base.partial;
|
|
|
|
this._initWidget ();
|
|
|
|
if (this._content) {
|
|
this._content.init ();
|
|
}
|
|
|
|
if (this._advanceButton) {
|
|
this._advanceButton.init ();
|
|
this._onAdvanceButtonClickOld = MochiKit.Base.bind(this._advanceButton.layer.onclick, this._advanceButton.layer);
|
|
this._advanceButton.layer.onclick = MochiKit.Base.bind(this.advButtonOnClick, this);
|
|
this._advanceButton.css.width = "14px";
|
|
}
|
|
|
|
this._dataFetchLayer = getLayer(this.id + "_df");
|
|
this._labelCtn = getLayer (this.id + '_labelCtn');
|
|
this._textCtn = getLayer (this.id + '_textCtn');
|
|
this._contentCtn = getLayer (this.id + '_contentCtn');
|
|
|
|
if (this._advanceButton) {
|
|
var advButtonLayer = this._advanceButton.layer;
|
|
var bind = bobj.bindFunctionToObject;
|
|
connect (this.layer, 'onclick', bind(IconWidget_upCB, advButtonLayer));
|
|
connect (this.layer, 'onmouseover', bind(IconWidget_realOverCB, advButtonLayer));
|
|
connect (this.layer, 'onmouseout', bind(IconWidget_realOutCB, advButtonLayer));
|
|
connect (this.layer, 'onmousedown', bind(IconWidget_downCB, advButtonLayer));
|
|
|
|
}
|
|
|
|
connect(this._content, 'ParameterUIResized', partial (signal, this, "StackedTabResized"));
|
|
},
|
|
|
|
getHTML : function() {
|
|
var h = bobj.html;
|
|
var DIV = h.DIV;
|
|
var IMG = h.IMG;
|
|
|
|
var stackedTabAtt = {
|
|
'class' : 'stackedTab',
|
|
cellpadding : "0",
|
|
id : this.id,
|
|
style : {
|
|
cursor : this._advanceButton ? _hand : 'default'
|
|
}
|
|
};
|
|
|
|
var labelCtnAtt = {
|
|
id: this.id + '_labelCtn',
|
|
cellpadding : "0",
|
|
'class': 'crvnoselect stackedTabTitle'
|
|
};
|
|
|
|
var contentHTML = this._content ? this._content.getHTML() : '';
|
|
var advButtonHTML = this._advanceButton ? h.TD ({width : '17px'}, this._advanceButton.getHTML()) : ''; /* 14 for arrow height + 3px right margin */
|
|
var dataFetchHTML = "";
|
|
|
|
if (this.isDataFetching) {
|
|
var URL_TAG = "url(%1);"
|
|
dataFetchHTML = h.TD ({width : '20px'}, IMG ( {
|
|
src : _skin + '../transp.gif',
|
|
title : L_bobj_crv_ParamsDataTip,
|
|
tabindex: 0,
|
|
id: this.id + "_df",
|
|
style : {
|
|
width : "16px",
|
|
height : "16px",
|
|
"background-image" : URL_TAG.replace("%1", bobj.crv.allInOne.uri),
|
|
"background-position" : "0px " + (-bobj.crv.allInOne.paramDataFetchingDy) + "px",
|
|
"margin-right" : '4px',
|
|
'vertical-align' : 'middle'
|
|
}
|
|
}));
|
|
}
|
|
|
|
var html = DIV (stackedTabAtt, DIV (labelCtnAtt, h.TABLE ( {
|
|
cellpadding : "0",
|
|
width : '100%',
|
|
height : '20px',
|
|
style : {
|
|
'table-layout' : 'fixed'
|
|
}
|
|
}, h.TD ({style : {"vertical-align" : "top", "overflow" : "hidden"}}, DIV ( {
|
|
'class' :'stackedTabText',
|
|
id :this.id + '_textCtn',
|
|
title :this.label,
|
|
'tabIndex' :0,
|
|
style : {
|
|
'font-weight' : 'bold',
|
|
'color' : '#4F5C72'
|
|
}
|
|
}, convStr (this.label))
|
|
), dataFetchHTML, advButtonHTML)
|
|
), DIV ( {
|
|
id :this.id + '_contentCtn',
|
|
'class' :'stackedTabContentCtn'
|
|
}, contentHTML));
|
|
|
|
return html;
|
|
},
|
|
|
|
setDirty : function(isDirty) {
|
|
if(this._textCtn) {
|
|
this._textCtn.style.fontStyle = isDirty ? "italic" : "";
|
|
this._textCtn.title = isDirty ? this.label + " " + L_bobj_crv_ParamsDirtyTip : this.label;
|
|
}
|
|
|
|
if(this._labelCtn) {
|
|
var titleClassName = isDirty ? "stackedTabTitleDirty" : "stackedTabTitle";
|
|
|
|
// IE 7 uses "className"
|
|
this._labelCtn.setAttribute("className", titleClassName);
|
|
|
|
// IE 8, FireFox, and Safari use "class"
|
|
this._labelCtn.setAttribute("class", titleClassName);
|
|
}
|
|
},
|
|
|
|
resize : function(w) {
|
|
w = w - 4; // TODO exclude margins properly
|
|
if(this._labelCtn) {
|
|
// Exclude margins for safari as it miscalculates left/top margins
|
|
var excludeMargins = !_saf;
|
|
bobj.setOuterSize(this._labelCtn, w , null, excludeMargins);
|
|
}
|
|
if (this._content) {
|
|
this._content.resize(w -2);
|
|
}
|
|
bobj.setOuterSize(this.layer, w);
|
|
},
|
|
|
|
/**
|
|
* Set the widget that is displayed below the tab. Must be called before getHTML.
|
|
*
|
|
* @param widget [Widget] Widget that appears below the tab when the tab is expanded
|
|
*/
|
|
setContent : function(widget) {
|
|
this._content = widget;
|
|
},
|
|
|
|
/**
|
|
* Get the widget that is displayed below the tab.
|
|
*
|
|
* @return [Widget] Widget that appears below the tab
|
|
*/
|
|
getContent : function() {
|
|
return this._content;
|
|
},
|
|
|
|
/**
|
|
* Focus the advanced button if available
|
|
*/
|
|
focusAdvButton : function() {
|
|
if (this._advanceButton && this._advanceButton.focus)
|
|
this._advanceButton.focus();
|
|
},
|
|
|
|
/**
|
|
* Override default onclick for the advanced button to cancel propagating the event.
|
|
*/
|
|
advButtonOnClick : function(e) {
|
|
if (this._onAdvanceButtonClickOld)
|
|
{
|
|
this._onAdvanceButtonClickOld(e);
|
|
eventCancelBubble(e);
|
|
}
|
|
}
|
|
}; |