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

/* 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);
}
}
}
};