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.
405 lines
12 KiB
405 lines
12 KiB
|
|
/* Copyright (c) Business Objects 2006. All rights reserved. */
|
|
|
|
/*
|
|
================================================================================
|
|
ParameterUI
|
|
|
|
Widget for displaying and editing parameter values. Contains one or many
|
|
ParameterValueRows and, optionally, UI that allows rows to be added.
|
|
================================================================================
|
|
*/
|
|
|
|
bobj.crv.params.newParameterUI = function(kwArgs) {
|
|
kwArgs = MochiKit.Base.update({
|
|
id: bobj.uniqueId(),
|
|
canChangeOnPanel: false,
|
|
allowCustom: false,
|
|
isPassword : false,
|
|
isReadOnlyParam: true,
|
|
allowRange : false,
|
|
values: [],
|
|
defaultValues: null,
|
|
width: '200px',
|
|
changeValueCB: null,
|
|
enterPressCB: null,
|
|
openAdvDialogCB: null,
|
|
maxNumParameterDefaultValues: 200,
|
|
tooltip : null,
|
|
calendarProperties : {displayValueFormat : '' , isTimeShown : false, hasButton : false, iconUrl : ''},
|
|
maxNumValuesDisplayed : 7,
|
|
canOpenAdvDialog : false
|
|
}, kwArgs);
|
|
|
|
var o = newWidget(kwArgs.id);
|
|
|
|
// Update instance with constructor arguments
|
|
bobj.fillIn(o, kwArgs);
|
|
|
|
o.displayAllValues = false;
|
|
|
|
// Update instance with member functions
|
|
MochiKit.Base.update(o, bobj.crv.params.ParameterUI);
|
|
|
|
o._createMenu();
|
|
o._rows = [];
|
|
o._infoRow = new bobj.crv.params.ParameterInfoRow(o.id);
|
|
return o;
|
|
};
|
|
|
|
bobj.crv.params.ParameterUI = {
|
|
/**
|
|
* Creates single menubar for all parameter value rows of current param UI
|
|
*/
|
|
_createMenu : function() {
|
|
var dvLength = this.defaultValues.length;
|
|
if (dvLength > 0) {
|
|
var kwArgs = {
|
|
originalValues : this.defaultValues
|
|
};
|
|
|
|
if (dvLength == this.maxNumParameterDefaultValues) {
|
|
kwArgs.originalValues[this.maxNumParameterDefaultValues] = L_bobj_crv_ParamsMaxNumDefaultValues;
|
|
MochiKit.Base.update (kwArgs, {
|
|
openAdvDialogCB : this.openAdvDialogCB,
|
|
maxNumParameterDefaultValues : this.maxNumParameterDefaultValues
|
|
});
|
|
}
|
|
|
|
this._defaultValuesMenu = bobj.crv.params.newScrollMenuWidget (kwArgs);
|
|
} else {
|
|
this._defaultValuesMenu = null;
|
|
}
|
|
},
|
|
|
|
setFocusOnRow : function(rowIndex) {
|
|
var row = this._rows[rowIndex];
|
|
if (row)
|
|
row.focus ();
|
|
},
|
|
|
|
/*
|
|
* Disables tabbing if dis is true
|
|
*/
|
|
setTabDisabled : function(dis) {
|
|
for(var i = 0, len = this._rows.length; i < len; i++) {
|
|
this._rows[i].setTabDisabled(dis);
|
|
}
|
|
|
|
this._infoRow.setTabDisabled(dis);
|
|
},
|
|
|
|
init : function() {
|
|
Widget_init.call (this);
|
|
|
|
var rows = this._rows;
|
|
for ( var i = 0, len = rows.length; i < len; ++i) {
|
|
rows[i].init ();
|
|
}
|
|
|
|
MochiKit.Signal.connect(this._infoRow, "switch", this, '_onSwitchDisplayAllValues');
|
|
this.refreshUI ();
|
|
},
|
|
|
|
/**
|
|
* Processes actions triggered by clicks on "x more values" or "collapse" button displayed in inforow
|
|
*/
|
|
_onSwitchDisplayAllValues: function() {
|
|
this.displayAllValues = !this.displayAllValues;
|
|
var TIME_INTERVAL = 10; /* 10 msec or 100 actions per second */
|
|
var timerIndex = 0;
|
|
|
|
if(this.displayAllValues) {
|
|
if (this.values.length > this._rows.length) {
|
|
for(var i = this._rows.length, l = this.values.length; i < l; i++) {
|
|
var addRow = function(paramUI, value) {
|
|
return function() { return paramUI._addRow(value); };
|
|
};
|
|
|
|
timerIndex++;
|
|
setTimeout(addRow(this, this.values[i]), TIME_INTERVAL * timerIndex);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if(this._rows.length > this.maxNumValuesDisplayed) {
|
|
for(var i = this._rows.length -1; i >= this.maxNumValuesDisplayed; i--) {
|
|
var deleteRow = function(paramUI, rowIndex) {
|
|
return function() { return paramUI.deleteValue(rowIndex); };
|
|
};
|
|
|
|
timerIndex++;
|
|
setTimeout(deleteRow(this, i), TIME_INTERVAL * timerIndex);
|
|
}
|
|
}
|
|
}
|
|
|
|
var signalResize = function(paramUI) {
|
|
return function() {MochiKit.Signal.signal(paramUI, 'ParameterUIResized'); };
|
|
};
|
|
|
|
setTimeout(signalResize(this), TIME_INTERVAL * timerIndex);
|
|
},
|
|
|
|
getHTML : function() {
|
|
var rowsHtml = '';
|
|
|
|
var values = this.values;
|
|
var rows = this._rows;
|
|
|
|
var rowsCount = Math.min (values.length, this.maxNumValuesDisplayed);
|
|
for ( var i = 0; i < rowsCount; ++i) {
|
|
rows.push (this._getRow (values[i]));
|
|
rowsHtml += rows[i].getHTML ();
|
|
}
|
|
|
|
return bobj.html.DIV ( {
|
|
id : this.id,
|
|
style : {
|
|
width : bobj.unitValue (this.width),
|
|
'padding-left' : '20px'
|
|
}
|
|
}, rowsHtml);
|
|
},
|
|
|
|
_getNewValueRowArgs : function(value) {
|
|
return {
|
|
value : value,
|
|
defaultValues : this.defaultValues,
|
|
width : this.width,
|
|
isReadOnlyParam : this.isReadOnlyParam,
|
|
canChangeOnPanel : this.canChangeOnPanel,
|
|
allowCustom : this.allowCustom,
|
|
isPassword : this.isPassword,
|
|
calendarProperties : this.calendarProperties,
|
|
defaultValuesMenu : this._defaultValuesMenu,
|
|
tooltip : this.tooltip,
|
|
isRangeValue : this.allowRange,
|
|
canOpenAdvDialog : this.canOpenAdvDialog
|
|
};
|
|
},
|
|
|
|
_getNewValueRowConstructor : function() {
|
|
return bobj.crv.params.newParameterValueRow;
|
|
},
|
|
|
|
_getRow : function(value) {
|
|
var row = this._getNewValueRowConstructor()(this._getNewValueRowArgs(value));
|
|
var bind = MochiKit.Base.bind;
|
|
|
|
row.changeCB = bind(this._onChangeValue, this, row);
|
|
row.enterCB = bind(this._onEnterValue, this, row);
|
|
|
|
return row;
|
|
},
|
|
|
|
_addRow : function(value) {
|
|
var row = this._getRow (value);
|
|
this._rows.push (row);
|
|
append (this.layer, row.getHTML ());
|
|
|
|
row.init ();
|
|
|
|
this.refreshUI ();
|
|
return row;
|
|
},
|
|
|
|
_onChangeValue : function(row) {
|
|
if (this.changeValueCB) {
|
|
this.changeValueCB (this._getRowIndex (row), row.getValue ());
|
|
}
|
|
},
|
|
|
|
_onEnterValue : function(row) {
|
|
if (this.enterPressCB) {
|
|
this.enterPressCB (this._getRowIndex (row));
|
|
}
|
|
},
|
|
|
|
_getRowIndex : function(row) {
|
|
if (row) {
|
|
var rows = this._rows;
|
|
for ( var i = 0, len = rows.length; i < len; ++i) {
|
|
if (rows[i] === row) {
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
return -1;
|
|
},
|
|
|
|
getNumValues : function() {
|
|
return this._rows.length;
|
|
},
|
|
|
|
|
|
refreshUI : function() {
|
|
if (this.allowRange)
|
|
this.alignRangeRows ();
|
|
|
|
var displayInfoRow = false;
|
|
var infoRowText = "";
|
|
|
|
if (this.values.length > this.maxNumValuesDisplayed) {
|
|
displayInfoRow = true;
|
|
|
|
if(this.displayAllValues)
|
|
infoRowText = L_bobj_crv_Collapse;
|
|
else {
|
|
var hiddenValuesCount = this.values.length - this.maxNumValuesDisplayed;
|
|
infoRowText = (hiddenValuesCount == 1) ? L_bobj_crv_ParamsMoreValue : L_bobj_crv_ParamsMoreValues;
|
|
infoRowText = infoRowText.replace ("%1", hiddenValuesCount);
|
|
}
|
|
}
|
|
|
|
this._infoRow.setText (infoRowText);
|
|
this._infoRow.setVisible (displayInfoRow);
|
|
},
|
|
|
|
getValueAt : function(index) {
|
|
var row = this._rows[index];
|
|
if (row) {
|
|
return row.getValue ();
|
|
}
|
|
return null;
|
|
},
|
|
|
|
getValues : function() {
|
|
var values = [];
|
|
for ( var i = 0, len = this._rows.length; i < len; ++i) {
|
|
values.push (this._rows[i].getValue ());
|
|
}
|
|
return values;
|
|
},
|
|
|
|
setValueAt : function(index, value) {
|
|
var row = this._rows[index];
|
|
if (row) {
|
|
row.setValue (value);
|
|
}
|
|
|
|
this.refreshUI ();
|
|
},
|
|
|
|
resetValues : function(values) {
|
|
if (!values) {
|
|
return;
|
|
}
|
|
|
|
this.values = values;
|
|
var valuesLen = values.length;
|
|
var rowsLen = this._rows.length;
|
|
|
|
//Resets value
|
|
for ( var i = 0; i < valuesLen && i < rowsLen; ++i) {
|
|
this._rows[i].reset (values[i]);
|
|
}
|
|
|
|
//removes newly added values that are not commited
|
|
if (rowsLen > valuesLen) {
|
|
for ( var i = rowsLen - 1; i >= valuesLen; --i) {
|
|
// delete from the end to minimize calls to setBgColor
|
|
this.deleteValue (i);
|
|
}
|
|
}
|
|
//re-adds removed values
|
|
else if (valuesLen > rowsLen) {
|
|
for ( var i = rowsLen; i < valuesLen && (this.displayAllValues || i < this.maxNumValuesDisplayed); ++i) {
|
|
var row = this._addRow (values[i]);
|
|
|
|
}
|
|
}
|
|
|
|
MochiKit.Signal.signal(this, 'ParameterUIResized');
|
|
this.refreshUI ();
|
|
},
|
|
|
|
alignRangeRows : function() {
|
|
if (!this.allowRange)
|
|
return;
|
|
|
|
var lowerBoundWidth = 0;
|
|
for ( var i = 0, l = this._rows.length; i < l; i++) {
|
|
var row = this._rows[i];
|
|
var rangeField = row._valueWidget;
|
|
lowerBoundWidth = Math.max (lowerBoundWidth, rangeField.getLowerBoundValueWidth ());
|
|
}
|
|
|
|
for ( var i = 0, l = this._rows.length; i < l; i++) {
|
|
var row = this._rows[i];
|
|
var rangeField = row._valueWidget;
|
|
rangeField.setLowerBoundValueWidth (lowerBoundWidth);
|
|
}
|
|
},
|
|
|
|
setValues : function(values) {
|
|
if (!values)
|
|
return;
|
|
|
|
this.values = values;
|
|
var valuesLen = values.length;
|
|
var rowsLen = this._rows.length;
|
|
|
|
for ( var i = 0; i < valuesLen && i < rowsLen; ++i) {
|
|
this._rows[i].setValue (values[i]);
|
|
}
|
|
|
|
if (rowsLen > valuesLen) {
|
|
for ( var i = rowsLen - 1; i >= valuesLen; --i) {
|
|
// delete from the end to minimize calls to setBgColor
|
|
this.deleteValue (i);
|
|
}
|
|
} else if (valuesLen > rowsLen) {
|
|
for ( var i = rowsLen; i < valuesLen && (this.displayAllValues || i < this.maxNumValuesDisplayed); ++i) {
|
|
this._addRow (values[i]);
|
|
}
|
|
}
|
|
|
|
MochiKit.Signal.signal(this, 'ParameterUIResized');
|
|
this.refreshUI ();
|
|
},
|
|
|
|
setCleanValue : function(index, value) {
|
|
var row = this._rows[index];
|
|
if (row)
|
|
row.setCleanValue (value);
|
|
},
|
|
|
|
deleteValue : function(index) {
|
|
if (index >= 0 && index < this._rows.length) {
|
|
var row = this._rows[index];
|
|
row.layer.parentNode.removeChild (row.layer);
|
|
_widgets[row.widx] = null;
|
|
|
|
this._rows.splice (index, 1);
|
|
var rowsLen = this._rows.length;
|
|
}
|
|
|
|
this.refreshUI ();
|
|
},
|
|
|
|
setWarning : function(index, warning) {
|
|
var row = this._rows[index];
|
|
if (row) {
|
|
row.setWarning (warning);
|
|
}
|
|
},
|
|
|
|
getWarning : function(index) {
|
|
var row = this._rows[index];
|
|
if (row)
|
|
return row.getWarning ();
|
|
|
|
return null;
|
|
},
|
|
|
|
resize : function(w) {
|
|
if (w !== null) {
|
|
this.width = w;
|
|
if (this.layer) {
|
|
bobj.setOuterSize (this.layer, w);
|
|
}
|
|
}
|
|
}
|
|
};
|