/*______________
| ______ | U I Z E J A V A S C R I P T F R A M E W O R K
| / / | ---------------------------------------------------
| / O / | MODULE : Uize.Widget.Options.Popup Class
| / / / |
| / / / /| | ONLINE : http://uize.com
| /____/ /__/_| | COPYRIGHT : (c)2007-2014 UIZE
| /___ | LICENSE : Available under MIT License or GNU General Public License
|_______________| http://uize.com/license.html
*/
/* Module Meta Data
type: Class
importance: 3
codeCompleteness: 100
docCompleteness: 2
*/
/*?
Introduction
The =Uize.Widget.Options.Popup= widget lets the user click a button to bring up a popup palette, with a button-based option set for selecting an option.
*DEVELOPERS:* `Chris van Rensburg`
*/
Uize.module ({
name:'Uize.Widget.Options.Popup',
required:[
'Uize.Widget.PopupPalette',
'Uize.Dom.Text'
],
builder:function (_superclass) {
'use strict';
/*** Private Instance Methods ***/
function _getSelectedOptionNode (m) {
var _selectedOption = m.children ['option' + m.get ('valueNo')];
return _selectedOption ? _selectedOption.getNode () : null;
}
return _superclass.subclass ({
omegastructor:function () {
var
m = this,
_popupPalette = m._popupPalette = m.addChild (
'popupPalette',Uize.Widget.PopupPalette,{idPrefixConstruction:'same as parent'}
)
;
_popupPalette.fade.set ({duration:0});
_popupPalette.wire (
'Palette Shown',
function () {
if (m.get ('valueNo') > -1) {
/* IMPORTANT:
- code can be optimized, and perhaps shouldn't always set scrollTop (depends on viewport dims?)
- code makes assumption about HTML nodes used in implementation of option buttons
*/
var _selectedOptionNode = _getSelectedOptionNode (m);
_selectedOptionNode &&
_popupPalette.setNodeProperties (
'Palette',
{
scrollLeft:_selectedOptionNode.offsetLeft,
scrollTop:_selectedOptionNode.offsetTop
}
)
;
}
}
);
m.wire('Changed.value', function () { m.updateUi() });
},
instanceMethods:{
updateUi:function () {
var m = this;
if (m.isWired) {
_superclass.doMy (m,'updateUi');
m._popupPalette.updateUi ();
var _selector = m._popupPalette.children.selector;
/* NOTE: need to investigate why it's not initially safe to assume that the selector widget exists -- may have something to do with a non-standard wireUi sequence for this code */
_selector && _selector.set ({enabled:m.get ('values').length > 1 ? 'inherit' : false});
m.setNodeInnerHtml ('label',Uize.Dom.Text.getText (_getSelectedOptionNode (m)) || m._emptyLabel);
}
}
},
stateProperties:{
_emptyLabel:{
name:'emptyLabel',
value:''
}
}
});
}
});