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.
506 lines
15 KiB
506 lines
15 KiB
/*
|
|
================================================================================
|
|
ParameterValueRow
|
|
|
|
Internal class for use by ParameterUI. Darws a UI for a single parameter value.
|
|
================================================================================
|
|
*/
|
|
|
|
bobj.crv.params.newParameterValueRow = function(kwArgs) {
|
|
kwArgs = MochiKit.Base.update({
|
|
id: bobj.uniqueId(),
|
|
value: '',
|
|
defaultValues: null,
|
|
isReadOnlyParam: true,
|
|
canChangeOnPanel: false,
|
|
isRangeValue : false,
|
|
allowCustom: false,
|
|
isPassword: false,
|
|
calendarProperties : {displayValueFormat : '' , isTimeShown : false, hasButton : false, iconUrl : '', clickCB : null},
|
|
changeCB: null,
|
|
enterCB: null,
|
|
defaultValuesMenu: null,
|
|
tooltip : null,
|
|
canOpenAdvDialog : false
|
|
}, kwArgs);
|
|
|
|
var o = newWidget(kwArgs.id);
|
|
o.widgetType = 'ParameterValueRow';
|
|
o._prevValueString = kwArgs.value;
|
|
o._warning = null;
|
|
|
|
// Update instance with constructor arguments
|
|
bobj.fillIn(o, kwArgs);
|
|
|
|
// Update instance with member functions
|
|
MochiKit.Base.update(o, bobj.crv.params.ParameterValueRow);
|
|
|
|
return o;
|
|
};
|
|
|
|
bobj.crv.params.ParameterValueRow = {
|
|
setTabDisabled : function(dis) {
|
|
if (this._valueWidget)
|
|
this._valueWidget.setTabDisabled (dis);
|
|
|
|
if (this._calendarButton)
|
|
bobj.disableTabbingKey (this._calendarButton.layer, dis);
|
|
},
|
|
|
|
/**
|
|
* Resets widget, Restores old value, hides warning and adv dialog icons
|
|
*/
|
|
reset : function(value) {
|
|
this.value = value;
|
|
this._prevValueString = value;
|
|
this.setWarning(null);
|
|
/* Removing Red border color if previous value was errorneous */
|
|
MochiKit.DOM.removeElementClass(this.layer, "hasError");
|
|
|
|
if(this._valueWidget) {
|
|
this._valueWidget.reset(value);
|
|
}
|
|
},
|
|
|
|
init : function() {
|
|
Widget_init.call (this);
|
|
this._valueWidget.init ();
|
|
if (this._calendarButton) {
|
|
this._calendarButton.init ();
|
|
}
|
|
|
|
this._valueCtn = getLayer (this.id + '_vc');
|
|
this._btnCtn = getLayer (this.id + '_bc');
|
|
this._valBtnCtn = getLayer (this.id + '_vab');
|
|
|
|
if (MochiKit.Base.isIE ()) {
|
|
/* IE's 100% is different than other browsers,
|
|
even in standards compliant mode.... */
|
|
var marg = parseInt (MochiKit.Style.computedStyle (this._valueCtn, 'margin-right'), 10);
|
|
if (bobj.isNumber (marg)) {
|
|
this._valueWidget.layer.style.marginRight = (-1 * marg) + 'px';
|
|
}
|
|
}
|
|
},
|
|
|
|
calendarSetValue : function(value) {
|
|
this.setValue (value);
|
|
this.changeCB ();
|
|
},
|
|
|
|
getHTML : function() {
|
|
if (!this._valueWidget) {
|
|
this._valueWidget = this._getValueWidget ();
|
|
}
|
|
if (this.calendarProperties.hasButton && !this._calendarButton) {
|
|
var getValueCB = bobj.bindFunctionToObject (this.getValue, this);
|
|
var setValueCB = bobj.bindFunctionToObject (this.calendarSetValue, this);
|
|
this._calendarButton = bobj.crv.params.newCalendarButton ( {
|
|
calendarProperties : this.calendarProperties,
|
|
getValueCB : getValueCB,
|
|
setValueCB : setValueCB
|
|
});
|
|
}
|
|
|
|
var DIV = bobj.html.DIV;
|
|
var IMG = bobj.html.IMG;
|
|
|
|
var cssClass = ' iactParamRow';
|
|
|
|
if (this.canChangeOnPanel)
|
|
cssClass += ' editable';
|
|
else
|
|
cssClass += ' readOnly';
|
|
|
|
if (MochiKit.Base.isIE () && bobj.isQuirksMode ()) {
|
|
cssClass += ' ' + 'iactParamRowIE';
|
|
}
|
|
|
|
return DIV ( {
|
|
id : this.id,
|
|
'class' : cssClass
|
|
}, this.calendarProperties.hasButton ? this._getValueAndCalendarHTML () : this._getValueHTML ());
|
|
},
|
|
|
|
|
|
/**
|
|
* @return [String] Returns HTML for the the value
|
|
*/
|
|
_getValueHTML : function() {
|
|
var DIV = bobj.html.DIV;
|
|
var style = {};
|
|
|
|
if (MochiKit.Base.isIE () && bobj.isQuirksMode ()) {
|
|
style.position = "absolute";
|
|
style.top = "0px";
|
|
style.left = "0px";
|
|
}
|
|
|
|
return DIV ( {
|
|
id : this.id + '_vc',
|
|
'class' : 'iactParamValue',
|
|
style : style
|
|
}, this._valueWidget.getHTML ());
|
|
},
|
|
|
|
/**
|
|
* @return [String] Returns HTML for the value and a button beside it
|
|
*/
|
|
_getValueAndCalendarHTML : function() {
|
|
var style = {};
|
|
if (MochiKit.Base.isIE () && bobj.isQuirksMode ()) {
|
|
style.width = '100%';
|
|
}
|
|
|
|
var DIV = bobj.html.DIV;
|
|
|
|
var buttonRightOffset = (this._valueWidget.widgetType == "TextCombo") ? 16 : 0;
|
|
buttonRightOffset += "px";
|
|
|
|
var html = DIV ( {
|
|
id : this.id + "_vab",
|
|
style : style,
|
|
'class' : "iactParamValueAndButton"
|
|
}, this._getValueHTML (), DIV ( {
|
|
id : this.id + "_bc",
|
|
'class' : "iactValueIcon",
|
|
style : {
|
|
position : "absolute",
|
|
right : buttonRightOffset,
|
|
top : "0",
|
|
cursor : _hand
|
|
}
|
|
}, this._calendarButton.getHTML ()));
|
|
|
|
return html;
|
|
},
|
|
|
|
getNewValueWidgetConstructor : function() {
|
|
var showDefVals = this.defaultValuesMenu !== null && !this.isReadOnlyParam && this.canChangeOnPanel;
|
|
|
|
if (this.isRangeValue)
|
|
return bobj.crv.params.newRangeField;
|
|
else if (showDefVals)
|
|
return bobj.crv.params.newTextCombo;
|
|
else
|
|
return bobj.crv.params.newTextField;
|
|
},
|
|
|
|
getNewValueWidgetArgs : function() {
|
|
var isEditable = this.allowCustom && this.canChangeOnPanel;
|
|
return {
|
|
password : this.isPassword,
|
|
cleanValue : this.value,
|
|
editable : isEditable,
|
|
enterCB : bobj.bindFunctionToObject (this._onEnterPress, this),
|
|
keyUpCB : isEditable ? bobj.bindFunctionToObject (this._onKeyUp, this) : null,
|
|
tooltip : this.tooltip,
|
|
foreColor : this.isReadOnlyParam ? bobj.Colors.GRAY : bobj.Colors.BLACK,
|
|
focusCB : bobj.bindFunctionToObject (this.onFocus, this),
|
|
blurCB : bobj.bindFunctionToObject (this.onBlur, this),
|
|
canOpenAdvDialog : this.canOpenAdvDialog
|
|
};
|
|
},
|
|
|
|
/**
|
|
* Creates a widget to display/edit the value.
|
|
*
|
|
* @return [Widget]
|
|
*/
|
|
_getValueWidget : function() {
|
|
var cons = this.getNewValueWidgetConstructor ();
|
|
var widget = cons (this.getNewValueWidgetArgs ());
|
|
var showDefVals = this.defaultValuesMenu !== null && !this.isReadOnlyParam && this.canChangeOnPanel;
|
|
|
|
if (showDefVals) {
|
|
widget.setMenu (this.defaultValuesMenu);
|
|
widget.changeCB = bobj.bindFunctionToObject (this._onChange, this);
|
|
}
|
|
|
|
return widget;
|
|
},
|
|
|
|
onFocus : function() {
|
|
this.refreshWarningPopup ();
|
|
MochiKit.DOM.removeElementClass (this.layer, "hasError");
|
|
},
|
|
|
|
refreshWarningPopup : function() {
|
|
if (this._warning) {
|
|
var pos = getPosScrolled (this.layer);
|
|
var fontFamily = MochiKit.Style.computedStyle (this.layer, 'fontFamily');
|
|
var fontSize = MochiKit.Style.computedStyle (this.layer, 'fontSize');
|
|
var valueWidth = bobj.getStringWidth (this.getValue (), fontFamily, fontSize);
|
|
var leftOffset = this.layer.offsetWidth < valueWidth ? this.layer.offsetWidth : valueWidth;
|
|
var topOffset = 33;
|
|
bobj.crv.WarningPopup.getInstance ().show (this._warning.message, pos.x + leftOffset, pos.y + topOffset);
|
|
} else {
|
|
bobj.crv.WarningPopup.getInstance ().hide ();
|
|
MochiKit.DOM.removeElementClass (this.layer, "hasError");
|
|
}
|
|
|
|
var tooltipText = this._warning ? this.tooltip + this._warning.message : this.tooltip;
|
|
if (this._valueWidget)
|
|
this._valueWidget.setTooltip (tooltipText);
|
|
},
|
|
|
|
onBlur : function() {
|
|
if (this._warning) {
|
|
bobj.crv.WarningPopup.getInstance ().hide ();
|
|
MochiKit.DOM.addElementClass (this.layer, "hasError");
|
|
}
|
|
},
|
|
|
|
getValue : function() {
|
|
return this.value;
|
|
},
|
|
|
|
setValue : function(value) {
|
|
this.value = value;
|
|
if (this._valueWidget)
|
|
this._valueWidget.setValue (value);
|
|
},
|
|
|
|
setCleanValue : function(value) {
|
|
if (this._valueWidget)
|
|
this._valueWidget.setCleanValue(value);
|
|
|
|
},
|
|
|
|
/**
|
|
* Set keyboard focus to the widget and mark it as selected
|
|
*/
|
|
focus : function() {
|
|
if (this._valueWidget.widgetType == "TextCombo")
|
|
this._valueWidget.text.focus ();
|
|
else
|
|
this._valueWidget.focus ();
|
|
},
|
|
|
|
/**
|
|
* Display a warning icon with a tooltip message
|
|
*
|
|
* @param warning
|
|
* [String] Tooltip message. If null, warning is hidden.
|
|
*/
|
|
setWarning : function(warning) {
|
|
this._warning = warning;
|
|
this.refreshWarningPopup ();
|
|
},
|
|
|
|
getWarning : function() {
|
|
return this._warning;
|
|
},
|
|
|
|
/**
|
|
* Change the outer dimensions of the widget
|
|
*
|
|
* @param w
|
|
* [int, optional] Width in pixels
|
|
* @param h
|
|
* [int, optional] Height in pixels
|
|
*/
|
|
resize : function(w, h) {
|
|
bobj.setOuterSize (this.layer, w, h);
|
|
},
|
|
|
|
deleteValue : function() {
|
|
this._valueWidget.setValue ('', true);
|
|
},
|
|
|
|
/**
|
|
* Handle keyUp events when editing values or using keyboard navigation.
|
|
*
|
|
* @param e
|
|
* [keyup event]
|
|
*/
|
|
_onKeyUp : function(e) {
|
|
var event = new MochiKit.Signal.Event (src, e);
|
|
var key = event.key ().string;
|
|
var newValueString = this._valueWidget.getValue ();
|
|
|
|
switch (key) {
|
|
case "KEY_ESCAPE":
|
|
this._valueWidget.setValue (this._valueWidget.cleanValue);
|
|
this._onChange ();
|
|
break;
|
|
|
|
case "KEY_ARROW_LEFT":
|
|
case "KEY_ARROW_RIGHT":
|
|
case "KEY_HOME":
|
|
case "KEY_END":
|
|
case "KEY_TAB":
|
|
break;
|
|
|
|
default:
|
|
if (newValueString !== this._prevValueString) {
|
|
this._onChange ()
|
|
this._prevValueString = newValueString;
|
|
}
|
|
break;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Delete the current value
|
|
*/
|
|
deleteValue : function() {
|
|
this._valueWidget.setValue ('', true);
|
|
},
|
|
|
|
_onChange : function() {
|
|
this.value = this._valueWidget.getValue();
|
|
if (this.changeCB)
|
|
this.changeCB();
|
|
},
|
|
|
|
/**
|
|
* Handles Enter key press events.
|
|
*/
|
|
_onEnterPress : function() {
|
|
if(this.enterCB)
|
|
this.enterCB();
|
|
}
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
================================================================================
|
|
CalendarButton
|
|
|
|
Internal class. Button that fits inline with parameter values
|
|
================================================================================
|
|
*/
|
|
bobj.crv.params.newCalendarButton = function(kwArgs) {
|
|
kwArgs = MochiKit.Base.update( {
|
|
id : bobj.uniqueId(),
|
|
calendarProperties : null,
|
|
getValueCB : null,
|
|
setValueCB : null,
|
|
calendarSignals : {
|
|
okSignal : null,
|
|
hideSignal : null,
|
|
cancelSignal : null
|
|
}
|
|
}, kwArgs);
|
|
|
|
if (kwArgs.getValueCB == null || kwArgs.setValueCB == null || kwArgs.calendarProperties == null)
|
|
throw "InvalidArgumentException";
|
|
|
|
var o = newIconWidget(
|
|
kwArgs.id,
|
|
kwArgs.calendarProperties.iconUrl,
|
|
null,
|
|
null,
|
|
L_bobj_crv_ParamsCalBtn,
|
|
14,14,0,0,0,0);
|
|
|
|
o.setClasses("", "", "", "iconcheckhover");
|
|
|
|
bobj.fillIn(o, kwArgs);
|
|
|
|
// Update instance with member functions
|
|
o.margin = 0;
|
|
o.oldInit = o.init;
|
|
|
|
MochiKit.Base.update(o, bobj.crv.params.CalendarButton);
|
|
o.clickCB = bobj.bindFunctionToObject(o.onClick, o);
|
|
|
|
return o;
|
|
};
|
|
|
|
bobj.crv.params.CalendarButton = {
|
|
onClick : function() {
|
|
var calendar = bobj.crv.Calendar.getInstance ();
|
|
var date = bobj.external.date.getDateFromFormat (this.getValueCB (), this.calendarProperties.displayValueFormat);
|
|
var connect = MochiKit.Signal.connect;
|
|
if (date)
|
|
calendar.setDate (date);
|
|
|
|
this.calendarSignals = {
|
|
okSignal : connect (calendar, calendar.Signals.OK_CLICK, this, 'onClickCalendarOKButton'),
|
|
cancelSignal : connect (calendar, calendar.Signals.CANCEL_CLICK, this, 'onClickCalendarCancelButton'),
|
|
hideSignal : connect (calendar, calendar.Signals.ON_HIDE, this, 'onHideCalendar')
|
|
};
|
|
|
|
var absPos = getPosScrolled (this.layer);
|
|
var x = absPos.x + this.getWidth ();
|
|
var y = absPos.y + this.getHeight () + 1;
|
|
|
|
calendar.setShowTime (this.calendarProperties.isTimeShown);
|
|
calendar.show (true, x, y);
|
|
},
|
|
|
|
onClickCalendarOKButton : function(date) {
|
|
var strValue = bobj.external.date.formatDate (date, this.calendarProperties.displayValueFormat);
|
|
this.setValueCB (strValue);
|
|
},
|
|
|
|
onClickCalendarCancelButton : function() {
|
|
this.clearCalendarSignals ();
|
|
},
|
|
|
|
clearCalendarSignals : function() {
|
|
for ( var identName in this.calendarSignals) {
|
|
bobj.crv.SignalDisposer.dispose(this.calendarSignals[identName], true);
|
|
this.calendarSignals[identName] = null;
|
|
}
|
|
},
|
|
|
|
onHideCalendar : function() {
|
|
this.clearCalendarSignals ();
|
|
if (this.layer.focus)
|
|
this.layer.focus ();
|
|
},
|
|
|
|
init : function() {
|
|
this.oldInit ();
|
|
this.layer.onfocus = IconWidget_realOverCB;
|
|
this.layer.onblur = IconWidget_realOutCB;
|
|
},
|
|
|
|
getHTML : function() {
|
|
var imgCode;
|
|
var h = bobj.html;
|
|
if (this.src) {
|
|
imgCode = h.DIV( {
|
|
style : {
|
|
overflow : 'hidden',
|
|
height : '14px',
|
|
position : 'relative',
|
|
top : '2px',
|
|
width : this.w + 'px'
|
|
}
|
|
}, simpleImgOffset(this.src, this.w, this.h, this.dx, this.dy, 'IconImg_' + this.id, null, this.alt,
|
|
'cursor:' + _hand), this.extraHTML);
|
|
} else {
|
|
imgCode = h.DIV( {
|
|
'class' : 'iconText',
|
|
'style' : {
|
|
width : '1px',
|
|
height : (this.h + this.border) + 'px'
|
|
}
|
|
});
|
|
}
|
|
|
|
var divStyle = {
|
|
margin : this.margin + 'px',
|
|
padding : '1px'
|
|
};
|
|
|
|
if (this.width) {
|
|
divStyle.width = this.width + 'px';
|
|
}
|
|
if (!this.disp) {
|
|
divStyle.display = 'none';
|
|
}
|
|
|
|
return h.DIV( {
|
|
style : divStyle,
|
|
id : this.id,
|
|
'class' : this.nocheckClass
|
|
}, (this.clickCB && _ie) ? lnk(imgCode, null, null, null, ' tabIndex="-1"') : imgCode);
|
|
}
|
|
};
|