listeners = Extensions.getProcessParameterListeners(className, null);
for(IProcessParameterListener listener : listeners)
listener.onInit(this);
}
} else
dispose();
return hasFields;
} // initDialog
/**
* Create editor and adds it to {@link #m_wEditors}.
*
* For range type field, create the to field and add it to {@link #m_mFields2} and
* create the to editor and adds it to {@link #m_wEditors2}.
*
* mField is used for default value and mandatory checking and editor is
* used to capture input value from user (no data binding).
*
* @param voF GridFieldVO
* @param mField
* @param row
*/
private void createField(GridFieldVO voF, GridField mField, Row row) {
// The Editor
WEditor editor = WebEditorFactory.getEditor(mField, false);
editor.setProcessParameter(true);
editor.getComponent().addEventListener(Events.ON_FOCUS, this);
editor.addValueChangeListener(this);
editor.dynamicDisplay();
// MField => editor - New Field value to be updated to editor
mField.addPropertyChangeListener(editor);
// Set Default
Object defaultObject = mField.getDefaultForPanel();
mField.setValue(defaultObject, true);
// streach component to fill grid cell
editor.fillHorizontal();
// setup editor context menu
WEditorPopupMenu popupMenu = editor.getPopupMenu();
if (popupMenu != null)
{
popupMenu.addMenuListener((ContextMenuListener)editor);
popupMenu.setId(mField.getColumnName()+"-popup");
this.appendChild(popupMenu);
if (!mField.isFieldOnly())
{
Label label = editor.getLabel();
if (popupMenu.isZoomEnabled() && editor instanceof IZoomableEditor)
{
label.addEventListener(Events.ON_CLICK, new ZoomListener((IZoomableEditor) editor));
}
popupMenu.addContextElement(label);
if (editor.getComponent() instanceof XulElement)
{
popupMenu.addContextElement((XulElement) editor.getComponent());
}
}
}
//
m_wEditors.add(editor); // add to Editors
Div div = new Div();
if (!isLabelAboveInputForSmallWidth())
div.setStyle("text-align: right;");
org.adempiere.webui.component.Label label = editor.getLabel();
div.appendChild(label);
if (label.getDecorator() != null)
div.appendChild(label.getDecorator());
if (!isLabelAboveInputForSmallWidth())
row.appendChild(div);
//
Div box = new Div();
if (!isLabelAboveInputForSmallWidth())
box.setStyle("display: flex; align-items: center;");
ZKUpdateUtil.setWidth(box, "100%");
//create to field and editor
if (voF.isRange) {
box.appendChild(editor.getComponent());
ZKUpdateUtil.setWidth((HtmlBasedComponent) editor.getComponent(), "49%");
//
GridFieldVO voF2 = GridFieldVO.createParameter(voF);
GridField mField2 = new GridField(voF2);
m_mFields2.add(mField2);
// The Editor
WEditor editor2 = WebEditorFactory.getEditor(mField2, false);
editor2.setProcessParameter(true);
//override attribute
editor2.getComponent().setClientAttribute("columnName", mField2.getColumnName()+"_To");
editor2.getComponent().addEventListener(Events.ON_FOCUS, this);
// New Field value to be updated to editor
mField2.addPropertyChangeListener(editor2);
editor2.addValueChangeListener(this);
editor2.dynamicDisplay();
ZKUpdateUtil.setWidth((HtmlBasedComponent) editor2.getComponent(), "49%");
setEditorPlaceHolder(editor2, mField2.getPlaceholder2());
// setup editor context menu
popupMenu = editor2.getPopupMenu();
if (popupMenu != null) {
popupMenu.addMenuListener((ContextMenuListener) editor2);
this.appendChild(popupMenu);
}
// Set Default
Object defaultObject2 = mField2.getDefaultForPanel();
mField2.setValue(defaultObject2, true);
//
m_wEditors2.add(editor2);
Space separator = new Space();
separator.setStyle("margin:0; width: 2%;");
m_separators.add(separator);
box.appendChild(separator);
box.appendChild(editor2.getComponent());
row.appendChild(box);
if (((mField.getDisplayType() == DisplayType.Date) || (mField.getDisplayType() == DisplayType.DateTime))
&& ((mField2.getDisplayType() == DisplayType.Date) || (mField2.getDisplayType() == DisplayType.DateTime))) {
if(MProcessPara.DATERANGEOPTION_TextAndRangePicker.equalsIgnoreCase(mField.getDateRangeOption())) {
editor.setVisible(false, true);
editor2.setVisible(false, true);
DateRangeEditor dateRangeEditor = new DateRangeEditor(editor, editor2);
box.appendChild(dateRangeEditor);
dateRangeEditor.setVisible(mField.isDisplayed(true));
label.setVisible(dateRangeEditor.isVisible());
dateRangeEditor.setReadOnly(!(editor.isReadWrite() && editor2.isReadWrite()));
m_dateRangeEditors.add(dateRangeEditor);
}
else {
DateRangeButton dateRangeButton = new DateRangeButton(editor, editor2);
box.appendChild(dateRangeButton);
m_dateRangeEditors.add(null);
}
}
else {
m_dateRangeEditors.add(null);
}
} else {
box.appendChild(editor.getComponent());
m_mFields2.add(null);
m_wEditors2.add(null);
m_separators.add(null);
m_dateRangeEditors.add(null);
//add not in support for multi selection field
if(DisplayType.isChosenMultipleSelection(mField.getDisplayType()) && voF.IsShowNegateButton) {
Button bNegate = ButtonFactory.createButton("", null, null);
bNegate.setTooltiptext(Msg.translate(Env.getCtx(), "IncludeSelectedValues"));
bNegate.setIconSclass("z-icon-IncludeSelected");
bNegate.setSclass("btn-negate btn-negate-include");
bNegate.setAttribute("isSelected", false);
bNegate.setVisible(false);
bNegate.addActionListener(this);
box.appendChild(bNegate);
editor.getComponent().setAttribute("isNotClause", bNegate);
}
}
if (!isLabelAboveInputForSmallWidth()) {
row.appendChild(box);
} else {
Div container = new Div();
container.appendChild(div);
container.appendChild(box);
row.appendCellChild(container);
LayoutUtils.addSclass("form-label-above-input", row.getLastCell());
LayoutUtils.addSclass("form-label", div);
}
} // createField
/**
* Set place holder message
* @param editor
* @param msg
*/
private void setEditorPlaceHolder(WEditor editor, String msg) {
Component c = editor.getComponent();
if (c instanceof InputElement) {
((InputElement) c).setPlaceholder(msg);
} else {
for (Component e : c.getChildren()) {
if (e instanceof InputElement) {
((InputElement) e).setPlaceholder(msg);
break;
}
}
}
}
/**
* Validate Parameter values
*
* @return true if parameters are valid
*/
public boolean validateParameters() {
if (log.isLoggable(Level.CONFIG)) log.config("");
//mandatory fields validation
Map wrongValidateComponents = new HashMap<>();
int size = m_mFields.size();
for (int i = 0; i < size; i++) {
GridField field = (GridField) m_mFields.get(i);
GridField field2 = (GridField) m_mFields2.get(i);
WEditor wEditor = (WEditor) m_wEditors.get(i);
if (wEditor.getComponent() instanceof InputElement)
((InputElement)wEditor.getComponent()).clearErrorMessage();
WEditor wEditor2 = (WEditor) m_wEditors2.get(i);
if (wEditor2 != null && wEditor2.getComponent() instanceof InputElement)
((InputElement)wEditor2.getComponent()).clearErrorMessage();
Object data = wEditor.getValue();
String msg = validate(data, field.getValueMin(), field.getValueMax(), field.isMandatory(true), field.getDisplayType());
if (msg != null) {
field.setInserting(true); // set editable (i.e. updateable) otherwise deadlock
field.setError(true);
wrongValidateComponents.put(wEditor.getComponent(), msg);
}
if (m_wEditors2.get(i) != null) { // is a range
data = wEditor2.getValue();
msg = validate(data, field.getValueMin(), field.getValueMax(), field.isMandatory(true), field.getDisplayType());
if (msg != null) {
field2.setInserting(true); // set editable (i.e. updateable) otherwise deadlock
field2.setError(true);
wrongValidateComponents.put(wEditor2.getComponent(), msg);
}
}
} // field loop
List wrongValues = new ArrayList();
wrongValidateComponents.forEach((component, msg) -> {
WrongValueException wrongValueException = new WrongValueException(component, msg);
wrongValues.add(wrongValueException);
});
if (wrongValues.size() > 0)
throw new WrongValuesException(wrongValues.toArray(new WrongValueException[0]));
/** call {@link IProcessParameterListener} validate(ProcessParameterPanel) **/
if (m_processInfo.getAD_Process_ID() > 0) {
String className = MProcess.get(Env.getCtx(), m_processInfo.getAD_Process_ID()).getClassname();
List listeners = Extensions.getProcessParameterListeners(className, null);
for(IProcessParameterListener listener : listeners) {
String error = listener.validate(this);
if (!Util.isEmpty(error)) {
Dialog.error(m_WindowNo, error);
return false;
}
}
}
return true;
} // validateParameters
/**
* Validate mandatory and min/max value
* @param value
* @param valueMin
* @param valueMax
* @param isMandatory
* @param fieldType
* @return null if OK, any message if not OK
*/
public static String validate(Object value, String valueMin, String valueMax, boolean isMandatory, int fieldType) {
if (isMandatory) {
if (value == null || value.toString().length() == 0) {
return Msg.getMsg(Env.getCtx(), "FillMandatory");
}
}
BigDecimal value_BD = null;
BigDecimal valueMin_BD = null;
BigDecimal valueMax_BD = null;
Timestamp value_TS = null;
Timestamp valueMin_TS = null;
Timestamp valueMax_TS = null;
if (fieldType == DisplayType.Date) {
SimpleDateFormat dateFormat = new SimpleDateFormat(DisplayType.DEFAULT_DATE_FORMAT);
if (value != null) {
try { value_TS = new Timestamp(dateFormat.parse(value.toString()).getTime()); } catch (Exception ex){}
}
if (valueMin != null) {
try { valueMin_TS = new Timestamp(dateFormat.parse(valueMin).getTime()); } catch (Exception ex){}
}
if (valueMax != null) {
try { valueMax_TS = new Timestamp(dateFormat.parse(valueMax).getTime()); } catch (Exception ex){}
}
if (value_TS != null && valueMin_TS != null && value_TS.before(valueMin_TS))
return Msg.getMsg(Env.getCtx(), "LessThanMinValue", new Object[] {valueMin});
if (value_TS != null && valueMax_TS != null && value_TS.after(valueMax_TS))
return Msg.getMsg(Env.getCtx(), "MoreThanMaxValue", new Object[] {valueMax});
} else if (DisplayType.isNumeric(fieldType)) {
if (value != null) {
try { value_BD = new BigDecimal(value.toString()); } catch (Exception ex){}
}
if (valueMin != null) {
try { valueMin_BD = new BigDecimal(valueMin); } catch (Exception ex){}
}
if (valueMax != null) {
try { valueMax_BD = new BigDecimal(valueMax); } catch (Exception ex){}
}
if (value_BD != null && valueMin_BD != null && valueMin_BD.compareTo(value_BD) > 0)
return Msg.getMsg(Env.getCtx(), "LessThanMinValue", new Object[] {valueMin});
if (value_BD != null && valueMax_BD != null && valueMax_BD.compareTo(value_BD) < 0)
return Msg.getMsg(Env.getCtx(), "MoreThanMaxValue", new Object[] {valueMax});
} else {
if (value != null && valueMin != null && valueMin.compareTo(value.toString()) > 0)
return Msg.getMsg(Env.getCtx(), "LessThanMinValue", new Object[] {valueMin});
if (value != null && valueMax != null && valueMax.compareTo(value.toString()) < 0)
return Msg.getMsg(Env.getCtx(), "MoreThanMaxValue", new Object[] {valueMax});
}
return null;
}
/**
* Load parameters from saved instance
* @param instance
*/
public boolean loadParameters(MPInstance instance)
{
if (log.isLoggable(Level.CONFIG)) log.config("");
MPInstancePara[] params = instance.getParameters();
for (int j = 0; j < m_mFields.size(); j++)
{
GridField mField = (GridField)m_mFields.get(j);
if (!mField.isEditablePara(true))
continue; // Saved parameters must not change read-only parameters
// Get Values
WEditor editor = (WEditor)m_wEditors.get(j);
WEditor editor2 = (WEditor)m_wEditors2.get(j);
editor.setValue(null);
if (editor2 != null)
editor2.setValue(null);
for ( int i = 0; i paras = new ArrayList();
/** create MPInstancePara from editors and add to paras (without saving MPInstancePara to DB) **/
for (int i = 0; i < m_mFields.size(); i++) {
// Get Values
WEditor editor = (WEditor) m_wEditors.get(i);
WEditor editor2 = (WEditor) m_wEditors2.get(i);
Object result = editor.getValue();
Object result2 = null;
if (editor2 != null)
result2 = editor2.getValue();
// Create Parameter
MPInstancePara para = new MPInstancePara(Env.getCtx(), 0, i);
GridField mField = (GridField) m_mFields.get(i);
para.setParameterName(mField.getColumnName());
para.setP_Date(null);
para.setP_Date_To(null);
para.setP_Number((BigDecimal)null);
para.setP_Number_To((BigDecimal)null);
para.setP_String(null);
para.setP_String_To(null);
// Date
if (result instanceof Timestamp || result2 instanceof Timestamp) {
if (result instanceof Timestamp)
para.setP_Date((Timestamp) result);
if (editor2 != null && result2 != null && result2 instanceof Timestamp)
para.setP_Date_To((Timestamp) result2);
}
// Integer
else if (result instanceof Integer || result2 instanceof Integer) {
if (result != null && result instanceof Integer) {
Integer ii = (Integer) result;
para.setP_Number(ii.intValue());
}
if (editor2 != null && result2 != null && result2 instanceof Integer) {
Integer ii = (Integer) result2;
para.setP_Number_To(ii.intValue());
}
}
// BigDecimal
else if (result instanceof BigDecimal
|| result2 instanceof BigDecimal) {
if (result instanceof BigDecimal)
para.setP_Number((BigDecimal) result);
if (editor2 != null && result2 != null && result2 instanceof BigDecimal)
para.setP_Number_To((BigDecimal) result2);
}
// Boolean
else if (result instanceof Boolean) {
Boolean bb = (Boolean) result;
String value = bb.booleanValue() ? "Y" : "N";
para.setP_String(value);
// to does not make sense
}
// String
else {
if (result != null)
para.setP_String(result.toString());
if (editor2 != null && result2 != null)
para.setP_String_To(result2.toString());
}
// Info
para.setInfo(editor.getDisplay());
if (editor2 != null)
para.setInfo_To(editor2.getDisplay());
//
paras.add(para);
} // for every parameter
return paras.toArray(new MPInstancePara[0]);
} // saveParameters
/**
* Editor value change listener.
*
* @param evt ValueChangeEvent
*/
@Override
public void valueChange(ValueChangeEvent evt) {
String propName = evt.getPropertyName();
if (evt.getSource() instanceof WEditor) {
WEditor editor = (WEditor) evt.getSource();
if (m_wEditors2.contains(editor)) {
// is a _To editor for ranges
propName += "_2"; // same as web services
}
GridField changedField = editor.getGridField();
if (changedField != null) {
processDependencies (changedField);
// future processCallout (changedField);
}
Events.postEvent(ON_POST_EDITOR_VALUE_CHANGE_EVENT, this, evt.getSource());
}
processNewValue(evt.getNewValue(), propName);
}
@Override
public void onEvent(Event event) throws Exception {
if (event.getName().equals(Events.ON_FOCUS)) {
//update tooltip text inside desktop help panel.
for (WEditor editor : m_wEditors)
{
if (editor.isComponentOfEditor(event.getTarget()))
{
SessionManager.getAppDesktop().updateHelpTooltip(editor.getGridField());
return;
}
}
for (WEditor editor : m_wEditors2)
{
if (editor != null && editor.getComponent() != null && editor.isComponentOfEditor(event.getTarget()))
{
SessionManager.getAppDesktop().updateHelpTooltip(editor.getGridField());
return;
}
}
}
else if (event.getName().equals("onDynamicDisplay")) {
dynamicDisplay();
}
else if (event.getName().equals(ON_POST_EDITOR_VALUE_CHANGE_EVENT)) {
WEditor editor = (WEditor)event.getData();
onPostEditorValueChange(editor);
if(editor.getComponent() != null) {
Button bNegate = (Button) editor.getComponent().getAttribute("isNotClause");
if (bNegate != null) {
if (editor.getValue() != null) {
bNegate.setVisible(true);
} else {
bNegate.setVisible(false);
bNegate.setAttribute("isSelected", false);
bNegate.setTooltiptext(Msg.translate(Env.getCtx(), "IncludeSelectedValues"));
bNegate.setIconSclass("z-icon-IncludeSelected");
bNegate.setSclass("btn-negate btn-negate-include");
}
}
}
}
else if (event.getName().equals(Events.ON_CLICK)) {
if(event.getTarget() instanceof Button) {
//from not in button of multi selection field
Button bNegate = (Button)event.getTarget();
boolean isSelected = !(boolean)bNegate.getAttribute("isSelected");
if(isSelected) {
bNegate.setTooltiptext(Msg.translate(Env.getCtx(), "ExcludeSelectedValues"));
bNegate.setIconSclass("z-icon-ExcludeSelected");
bNegate.setSclass("btn-negate btn-negate-exclude");
}
else {
bNegate.setTooltiptext(Msg.translate(Env.getCtx(), "IncludeSelectedValues"));
bNegate.setIconSclass("z-icon-IncludeSelected");
bNegate.setSclass("btn-negate btn-negate-include");
}
bNegate.setAttribute("isSelected", isSelected);
}
}
}
/**
* Handle ON_POST_EDITOR_VALUE_CHANGE_EVENT event.
*
* Call {@link IProcessParameterListener#validate(ProcessParameterPanel)}.
* @param editor
*/
private void onPostEditorValueChange(WEditor editor) {
if (m_processInfo.getAD_Process_ID() > 0) {
String className = MProcess.get(Env.getCtx(), m_processInfo.getAD_Process_ID()).getClassname();
String colName = editor.getColumnName();
if (m_wEditors2.contains(editor)) {
// is a _To editor for ranges
colName += "_2"; // same as web services
}
List listeners = Extensions.getProcessParameterListeners(className, colName);
for(IProcessParameterListener listener : listeners) {
listener.onChange(this, colName, editor);
}
}
}
/**
* Notify dependent fields.
* @param changedField changed field
*/
private void processDependencies (GridField changedField)
{
String columnName = changedField.getColumnName();
for (GridField field : m_mFields) {
if (field == null || field == changedField)
continue;
verifyChangedField(field, columnName);
}
for (GridField field : m_mFields2) {
if (field == null || field == changedField)
continue;
verifyChangedField(field, columnName);
}
} // processDependencies
/**
* Reset field value to null if field depends on columnName.
* @param field
* @param columnName column name of changed field
*/
private void verifyChangedField(GridField field, String columnName) {
ArrayList list = field.getDependentOn();
if (list.contains(columnName)) {
GridField.updateDependentField(field, columnName, -1, null);
}
}
/**
* Process new value from {@link #valueChange(ValueChangeEvent)}.
* @param value
* @param name
*/
private void processNewValue(Object value, String name) {
if (value == null)
value = new String("");
if (value instanceof String)
Env.setContext(Env.getCtx(), m_WindowNo, name, (String) value);
else if (value instanceof Integer)
Env.setContext(Env.getCtx(), m_WindowNo, name,
((Integer) value).intValue());
else if (value instanceof Boolean)
Env.setContext(Env.getCtx(), m_WindowNo, name,
((Boolean) value).booleanValue());
else if (value instanceof Timestamp)
Env.setContext(Env.getCtx(), m_WindowNo, name, (Timestamp) value);
else
Env.setContext(Env.getCtx(), m_WindowNo, name, value.toString());
Events.postEvent("onDynamicDisplay", this, (Object)null);
}
/**
* Dynamic update the UI state and properties of all fields.
*/
private void dynamicDisplay() {
for (int i = 0; i < m_wEditors.size(); i++) {
WEditor editor = m_wEditors.get(i);
GridField mField = editor.getGridField();
GridField mField2 = null;
if (mField.getVO().isRange) {
mField2 = m_wEditors2.get(i).getGridField();
}
if (mField.isDisplayed(true)) {
if (!editor.isVisible()) {
editor.setVisible(true);
m_Rows.get(i).setVisible(true);
m_Rows.get(i).setAttribute(Group.GROUP_ROW_VISIBLE_KEY, "true");
if (mField.getVO().isRange) {
m_separators.get(i).setVisible(true);
m_wEditors2.get(i).setVisible(true);
}
Button bNegate = null;
if(editor.getComponent() != null)
bNegate = (Button) editor.getComponent().getAttribute("isNotClause");
if(bNegate != null) {
bNegate.setVisible(true);
}
}
boolean rw = mField.isEditablePara(true); // r/w - check if field is Editable
editor.setReadWrite(rw);
editor.dynamicDisplay();
if (mField.getVO().isRange) {
m_wEditors2.get(i).setReadWrite(rw);
m_wEditors2.get(i).dynamicDisplay();
}
} else if (editor.isVisible()) {
editor.setVisible(false);
m_Rows.get(i).setVisible(false);
m_Rows.get(i).setAttribute(Group.GROUP_ROW_VISIBLE_KEY, "false");
if (mField.getVO().isRange) {
m_separators.get(i).setVisible(false);
m_wEditors2.get(i).setVisible(false);
}
Button bNegate = null;
if(editor.getComponent() != null)
bNegate = (Button) editor.getComponent().getAttribute("isNotClause");
if(bNegate != null) {
bNegate.setVisible(false);
}
}
editor.setMandatory(mField.isMandatory(true));
editor.updateStyle();
if (mField.getVO().isRange) {
m_wEditors2.get(i).setMandatory(mField.isMandatory(true));
m_wEditors2.get(i).updateStyle();
// Add mandatory style on label when Parameter To is still blank
if (editor.isMandatory() && editor.getLabel() != null && m_wEditors2.get(i).isNullOrEmpty()) {
LayoutUtils.addSclass("idempiere-mandatory-label", editor.getLabel());
}
}
// Handle Dynamic Display for Date Range Picker
if (((mField.getDisplayType() == DisplayType.Date) || (mField.getDisplayType() == DisplayType.DateTime))
&& mField2 != null
&& ((mField2.getDisplayType() == DisplayType.Date) || (mField2.getDisplayType() == DisplayType.DateTime))
&& MProcessPara.DATERANGEOPTION_TextAndRangePicker.equalsIgnoreCase(mField.getDateRangeOption())) {
DateRangeEditor dateRangeEditor = m_dateRangeEditors.get(i);
if(dateRangeEditor != null) {
dateRangeEditor.setVisible(editor.isVisible());
m_Rows.get(i).setVisible(editor.isVisible());
m_Rows.get(i).setAttribute(Group.GROUP_ROW_VISIBLE_KEY, editor.isVisible());
editor.setVisible(false, true);
if (mField.getVO().isRange) {
m_separators.get(i).setVisible(false);
m_wEditors2.get(i).setVisible(false ,true);
}
dateRangeEditor.setFieldMandatoryStyle();
dateRangeEditor.setReadOnly(!(editor.isReadWrite() && m_wEditors2.get(i).isReadWrite()));
}
}
}
if (getParent() != null) {
getParent().invalidate();
}
}
/**
* Restore window context.
*
* author teo_sarca [ 1699826 ]
* @see org.compiere.model.GridField#restoreValue()
*/
protected void restoreContext() {
for (GridField f : m_mFields) {
if (f != null)
f.restoreValue();
}
for (GridField f : m_mFields2) {
if (f != null)
f.restoreValue();
}
}
/**
* @param processInfo
*/
public void setProcessInfo(ProcessInfo processInfo) {
m_processInfo = processInfo;
}
/**
* Get process info
* @return process info
*/
public ProcessInfo getProcessInfo() {
return m_processInfo;
}
/**
* Focus to first visible field editor.
* @return true if there is at least one visible field editor.
*/
public boolean focusToFirstEditor() {
if (m_wEditors.isEmpty())
return false;
for(WEditor editor : m_wEditors) {
if (editor.isVisible()) {
focusToEditor(editor);
return true;
}
}
return false;
}
/**
* @param toFocus
*/
private void focusToEditor(WEditor toFocus) {
Component c = toFocus.getComponent();
if (c instanceof EditorBox) {
c = ((EditorBox)c).getTextbox();
} else if (c instanceof NumberBox) {
c = ((NumberBox)c).getDecimalbox();
} else if (c instanceof Urlbox) {
c = ((Urlbox)c).getTextbox();
}
((HtmlBasedComponent)c).focus();
}
/**
* Get parameter field editor by column name
* @param columnName
* @return editor
*/
public WEditor getEditor(String columnName) {
for(int i = 0; i < m_mFields.size(); i++) {
if (m_mFields.get(i).getColumnName().equals(columnName)) {
return m_wEditors.get(i);
}
}
return null;
}
/**
* Get parameter field to editor by column name
* @param columnName
* @return editor
*/
public WEditor getEditorTo(String columnName) {
for(int i = 0; i < m_mFields.size(); i++) {
if (m_mFields.get(i).getColumnName().equals(columnName)) {
return m_wEditors2.get(i);
}
}
return null;
}
/**
* Is WSearchEditor showing dialog that is awaiting user action
* @return true if WSearchEditor is showing dialog that is awaiting user action (usually info window).
*/
public boolean isWaitingForDialog() {
for (int i = 0; i < m_mFields.size(); i++) {
// Get Values
WEditor editor = (WEditor) m_wEditors.get(i);
WEditor editor2 = (WEditor) m_wEditors2.get(i);
if (editor != null && editor instanceof WSearchEditor) {
if (((WSearchEditor)editor).isShowingDialog())
return true;
} else if (editor2 != null && editor2 instanceof WSearchEditor) {
if (((WSearchEditor)editor2).isShowingDialog())
return true;
}
}
return false;
}
/**
* Field label ON_CLICK listener for {@link IZoomableEditor}.
*/
static class ZoomListener implements EventListener {
private IZoomableEditor searchEditor;
ZoomListener(IZoomableEditor editor) {
searchEditor = editor;
}
public void onEvent(Event event) throws Exception {
if (Events.ON_CLICK.equals(event.getName())) {
searchEditor.actionZoom();
}
}
}
/**
* @return register window number.
*/
public int getWindowNo() {
return m_WindowNo;
}
@Override
public String get_ValueAsString(String variableName) {
DefaultEvaluatee evaluatee = new DefaultEvaluatee(new FieldEditorDataProvider(), m_WindowNo, m_TabNo);
return evaluatee.get_ValueAsString(variableName);
}
/**
* Data provider implementation backed by parameter field editors
*/
private class FieldEditorDataProvider implements DefaultEvaluatee.DataProvider {
@Override
public Object getValue(String columnName) {
for(WEditor editor : m_wEditors) {
if (editor.getGridField().getColumnName().equals(columnName)) {
//base on code in GridField.updateContext() method
int displayType = editor.getGridField().getVO().displayType;
if (displayType == DisplayType.Text
|| displayType == DisplayType.Memo
|| displayType == DisplayType.TextLong
|| displayType == DisplayType.JSON
|| displayType == DisplayType.Binary
|| displayType == DisplayType.RowID
|| editor.getGridField().isEncrypted())
return ""; // ignore
Object value = editor.getValue();
if (value == null)
return "";
else if (value instanceof Boolean)
{
return (((Boolean)value) ? "Y" : "N");
}
else if (value instanceof Timestamp)
{
String stringValue = null;
if (value != null && !value.toString().equals("")) {
Calendar c1 = Calendar.getInstance();
c1.setTime((Date) value);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
stringValue = sdf.format(c1.getTime());
}
return stringValue;
}
else
{
return value.toString();
}
}
}
return null;
}
@Override
public Object getProperty(String propertyName) {
return null;
}
@Override
public MColumn getColumn(String columnName) {
return null;
}
@Override
public String getTrxName() {
return null;
}
}
} // ProcessParameterPanel