/*** = Description
** HTabView
**
**
***/
var//RSence.Controls
HTabView = HView.extend({
/** = Description
* draw function
*
**/
draw: function(){
var _isDrawn = this.drawn;
this.base();
if(!_isDrawn){
var i=0,_styles = [
['overflow','auto']
];
for(i;i<_styles.length;i++){
this.setStyle(_styles[i][0],_styles[i][1]);
}
this.hide();
}
}
});
/** = Description
* HTab
*
**/
var//RSence.Controls
HTab = HControl.extend({
componentName: "tab",
refreshOnValueChange: true,
refreshOnLabelChange: false,
customOptions: function(_options){
this.tabs = [];
this.tabLabels = [];
this.tabLabelBounds = [];
this.tabLabelStrings = [];
},
rightmostPx: 0,
selectIdx: -1,
// overridden in the template
tabLabelHeight: 20,
// overridden in the template
tabLabelLeftEdge: 4,
// overridden in the template
tabLabelRightEdge: 4,
// overridden in the template
fontStyle: {
fontFamily: 'Helvetica, Arial, sans-serif',
fontSize: '13px'
},
tabLabelHTMLPrefix1: '
',
tabLabelHTMLSuffix: '
',
tabLabelParentElem: 'label',
tabLabelElementTagName: 'div',
tabLabelAlign: 'left',
tabLabelFillBg: false,
tabTriggerLink: false,
tabLabelNoHTMLPrefix: false,
/** = Description
* refreshValue function
*
**/
refreshValue: function(){
var _this = this;
if(typeof _value === 'number'){
this.pushTask( function(){
var _index = parseInt(_this.value,10);
if( _index < _this.tabs.length && _index !== _this.selectIdx){
_this.selectTab(_index);
}
});
}
},
/** = Description
* Sets label for the tab.
*
* = Parameters
* +_label+:: Label for the tab
*
**/
setLabel: function(_label){
this.label = _label;
},
/** = Description
* selectTab function
*
* = Parameters
* +_tabIdx+::
*
**/
selectTab: function(_tabIdx){
if(_tabIdx instanceof HTabView){
_tabIdx = _tabIdx.tabIndex;
}
if(~this.selectIdx){
var _tabSelectElemId = this.tabLabels[this.selectIdx],
_tabSelectViewId = this.tabs[this.selectIdx];
ELEM.delClassName(_tabSelectElemId,'item_fg');
ELEM.addClassName(_tabSelectElemId,'item_bg');
HSystem.views[_tabSelectViewId].hide();
}
if(~_tabIdx){
var _tabLabelElemId = this.tabLabels[_tabIdx],
_tabViewId = this.tabs[_tabIdx];
ELEM.delClassName(_tabLabelElemId,'item_bg');
ELEM.addClassName(_tabLabelElemId,'item_fg');
HSystem.views[_tabViewId].show();
}
this.selectIdx = _tabIdx;
this.setValue(_tabIdx);
},
/** = Description
* addTab function
*
* = Parameters
* +_tabLabel+::
* +_doSelect+::
*
**/
addTab: function(_tabLabel,_doSelect,_viewClass,_viewClassOptions){
var
_this = this,
_tabIdx = _this.tabs.length,
_tabLabelHTML = '',
_labelTextWidth = _this.stringWidth( _tabLabel, null, 0, _this.fontStyle ),
_labelWidth = _labelTextWidth+_this.tabLabelLeftEdge+_this.tabLabelRightEdge,
_tabLabelElemId = ELEM.make(_this.markupElemIds[_this.tabLabelParentElem],_this.tabLabelElementTagName),
_tab;
if( _viewClass === undefined ){
_tab = HTabView.nu( [0,_this.tabLabelHeight,null,null,0,0], _this);
}
else {
_tab = _viewClass.nu( [0,_this.tabLabelHeight,null,null,0,0], _this, _viewClassOptions );
}
_tabIdx = _this.tabs.length;
if(_this.tabLabelNoHTMLPrefix){
_tabLabelHTML = _tabLabel;
}
else {
_tabLabelHTML = _this.tabLabelHTMLPrefix1+_labelTextWidth+_this.tabLabelHTMLPrefix2+_tabLabel+_this.tabLabelHTMLSuffix;
}
_tab.hide();
ELEM.addClassName(_tabLabelElemId,'item_bg');
ELEM.setStyle(_tabLabelElemId,'width',_labelWidth+'px');
ELEM.setStyle(_tabLabelElemId,_this.tabLabelAlign,_this.rightmostPx+'px');
ELEM.setHTML(_tabLabelElemId,_tabLabelHTML);
_this.tabLabelStrings.push(_tabLabel);
if(_this.tabTriggerLink && !_this.isProduction){
console.log('HTab.options.tabTriggerLink is no longer supported')
}
_this.tabTriggerLink = false;
_this.setClick(true);
_this.tabLabelBounds.push([_this.rightmostPx,_this.rightmostPx+_labelWidth]);
_this.rightmostPx+=_labelWidth;
if(_this.tabLabelAlign === 'right'){
ELEM.setStyle(_this.markupElemIds[_this.tabLabelParentElem],'width',_this.rightmostPx+'px');
}
else if (_this.tabLabelFillBg) {
ELEM.setStyle(_this.markupElemIds.state,'left',_this.rightmostPx+'px');
}
_this.tabs.push(_tab.viewId);
_this.tabLabels.push(_tabLabelElemId);
_tab.tabIndex = _tabIdx;
if(_doSelect || (_this.value === _tabIdx)){
_this.selectTab(_tabIdx);
}
return _tab;
},
/** = Description
* click function
*
* = Parameters
* +x+::
* +y+::
*
**/
click: function(x,y){
if(this.tabTriggerLink){
this.setClickable(false);
return;
}
x -= this.pageX();
y -= this.pageY();
if(y<=this.tabLabelHeight){
if (this.tabLabelAlign === 'right') {
x = this.rect.width - x;
}
if(x<=this.rightmostPx){
var i=0,_labelBounds;
for(i;i=_labelBounds[0]){
this.selectTab(i);
return;
}
}
}
}
},
/** = Description
* removeTab function
*
* = Parameters
* +_tabIdx+::
*
**/
removeTab: function(_tabIdx){
var
_selIdx = this.selectIdx,
_tabViewId = this.tabs[_tabIdx],
_tabLabelElemId = this.tabLabels[_tabIdx],
_tabLabelWidth, i = 0;
this.tabs.splice(_tabIdx,1);
this.tabLabels.splice(_tabIdx,1);
this.tabLabelBounds.splice(_tabIdx,1);
this.tabLabelStrings.splice(_tabIdx,1);
if(_tabIdx===_selIdx){
this.selectIdx=-1;
if(_tabIdx===0&&this.tabs.length===0){
this.selectTab(-1);
}
else if(_tabIdx===(this.tabs.length-1)){
this.selectTab(_tabIdx-1);
}
else{
this.selectTab(_tabIdx);
}
}
else if(_tabIdx<_selIdx){
this.selectIdx--;
}
ELEM.del(_tabLabelElemId);
HSystem.views[_tabViewId].die();
//Reset labels positions
this.rightmostPx = 0;
for(; i < this.tabs.length; i++){
_tabLabelElemId = this.tabLabels[i];
_tabLabelWidth = ELEM.getIntStyle(_tabLabelElemId,'width');
ELEM.setStyle(_tabLabelElemId,this.tabLabelAlign,this.rightmostPx+'px');
this.rightmostPx += _tabLabelWidth;
}
if(this.tabLabelAlign === 'right'){
ELEM.setStyle(this.markupElemIds[this.tabLabelParentElem],'width',this.rightmostPx+'px');
}
else if (this.tabLabelFillBg) {
ELEM.setStyle(this.markupElemIds.state,'left',this.rightmostPx+'px');
}
}
});
/** = Description
* HTabItem is a wrapper for creating tabs as subviews when using JSONRenderer.
* rect is ignored
* parent is the HTab instance
* options may contain the following:
* select: true|false, passed on to addTab
* label: true|false, passed on to addTab
*
* = Returns
* a new HTabView instance returned by addTab
*
**/
var//RSence.Controls
HTabItem = {
nu: function(_rect, _parent, _options){
if( _rect && _rect.hasAncestor && _rect.hasAncestor( HView ) ){
_options = _parent;
_parent = _rect;
}
else {
console.warn( "Warning: the rect constructor argument of HTabItem is deprecated." );
}
return _parent.addTab( _options.label, _options.select );
},
'new': function(_rect, _parent, _options){
return this.nu(_rect,_parent,_options);
}
};
var//RSence.Controls
GUITreeTabView = HControl.extend({
controlDefaults: HControlDefaults.extend({
visible: false,
autoCreate: false,
autoDestroy: true
}),
jsonRenderer: false,
createJSONRenderer: function(){
var
_this = this,
_value = _this.value,
_progressView = HView.nu( [4,0, 150, 34, 0, null], _this ),
// _indicatorPhases = ['/','-','\\','|','/','-','\\','|'], // ascii
// _indicatorPhases = ['◴','◷','◶','◵'], // unicode sector ball
// _indicatorPhases = ['◑','◒','◐','◓'], // unicode half ball
// _indicator = HStringView.nu( [ 2, 2, 32, 32 ], _progressView, { value: _indicatorPhases[0], style: { 'font-size': '24px' } } ),
// _indicatorTimeout = setInterval( function(){
// _indicatorPhase = _indicatorPhases.shift();
// _indicatorPhases.push( _indicatorPhase );
// _indicator.setValue( _indicatorPhase );
// }, 100 ),
_indicatorStr = HStringView.nu( [ 34, 12, 100, 20, 4, null ], _progressView, { value: 'Rendering' } );
_this.destroyJSONRenderer();
if( _value.type === undefined || _value.version === undefined ){
_value = {
'type': 'GUITree',
'version': 1.0,
'class': 'HView',
'rect': [0,0, null,null, 0,0],
'options': { 'style': { 'overflow': 'auto' } },
'subviews': _value
};
}
setTimeout( function(){
_this.jsonRenderer = JSONRenderer.nu( _value, _this );
// clearTimeout( _indicatorTimeout );
_progressView.die();
}, 10 );
},
destroyJSONRenderer: function(){
if( this.jsonRenderer ){
this.jsonRenderer.die();
this.jsonRenderer = false;
}
},
drawSubviews: function(){
if( this.options.autoCreate ){
this.createJSONRenderer();
}
},
show: function(){
this.base();
if(!this.jsonRenderer){
this.createJSONRenderer();
}
},
hide: function(){
this.base();
if( this.options.autoDestroy ){
this.destroyJSONRenderer();
}
},
die: function(){
this.destroyJSONRenderer();
this.base();
}
});
var//RSence.Controls
GUITreeTabItem = {
nu: function( _rect, _parent, _options ){
if( _rect.hasAncestor && _rect.hasAncestor( HView ) ){
_options = _parent;
_parent = _rect;
}
else {
console.warn && console.warn( "Warning: the rect constructor argument of GUITreeTabItem is deprecated." );
}
return _parent.addTab( _options.label, _options.select, GUITreeTabView, _options );
}
};