package org.adempiere.webui.apps;
import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.logging.Level;
import org.adempiere.webui.component.Column;
import org.adempiere.webui.component.Columns;
import org.adempiere.webui.component.Grid;
import org.adempiere.webui.component.GridFactory;
import org.adempiere.webui.component.Panel;
import org.adempiere.webui.component.Row;
import org.adempiere.webui.component.Rows;
import org.adempiere.webui.editor.WEditor;
import org.adempiere.webui.editor.WEditorPopupMenu;
import org.adempiere.webui.editor.WebEditorFactory;
import org.adempiere.webui.event.ContextMenuListener;
import org.adempiere.webui.event.ValueChangeEvent;
import org.adempiere.webui.event.ValueChangeListener;
import org.adempiere.webui.window.FDialog;
import org.compiere.apps.IProcessParameter;
import org.compiere.model.GridField;
import org.compiere.model.GridFieldVO;
import org.compiere.model.MClient;
import org.compiere.model.MLookup;
import org.compiere.model.MPInstancePara;
import org.compiere.process.ProcessInfo;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.zkoss.zul.Div;
import org.zkoss.zul.Hbox;
import org.zkoss.zul.Label;
implements ValueChangeListener, IProcessParameter
{
private static final long serialVersionUID = 3372945363384709062L;
private String width;
{
this(WindowNo, pi, "100%");
}
{
m_WindowNo = WindowNo;
m_processInfo = pi;
this.width = width;
initComponent();
}
centerPanel = GridFactory.newGridLayout();
centerPanel.setInnerWidth(width);
this.appendChild(centerPanel);
Columns columns = new Columns();
centerPanel.appendChild(columns);
Column col = new Column();
col.setWidth("30%");
columns.appendChild(col);
col = new Column();
col.setWidth("65%");
columns.appendChild(col);
col = new Column();
col.setWidth("5%");
columns.appendChild(col);
}
private int m_WindowNo;
private ProcessInfo m_processInfo;
private static CLogger log = CLogger.getCLogger(ProcessParameterPanel.class);
private ArrayList<WEditor> m_wEditors = new ArrayList<WEditor>();
private ArrayList<WEditor> m_wEditors2 = new ArrayList<WEditor>();
private ArrayList<GridField> m_mFields = new ArrayList<GridField>();
private ArrayList<GridField> m_mFields2 = new ArrayList<GridField>();
private ArrayList<Label> m_separators = new ArrayList<Label>();
private Grid centerPanel = null;
public static final int DEFAULT_MODE = 1;
public static final int BROWSER_MODE = 2;
private int mode=1;
{
this.mode = mode;
}
{
m_wEditors.clear();
m_wEditors2.clear();
m_mFields.clear();
m_mFields2.clear();
}
{
log.config("");
MClient client = MClient.get(Env.getCtx());
String ASPFilter = "";
if (client.isUseASP())
ASPFilter =
" AND ( p.AD_Process_Para_ID IN ( "
+ " SELECT pp.AD_Process_Para_ID "
+ " FROM ASP_Process_Para pp, ASP_Process p, ASP_Level l, ASP_ClientLevel cl "
+ " WHERE p.ASP_Level_ID = l.ASP_Level_ID "
+ " AND cl.AD_Client_ID = " + client.getAD_Client_ID()
+ " AND cl.ASP_Level_ID = l.ASP_Level_ID "
+ " AND pp.ASP_Process_ID = p.ASP_Process_ID "
+ " AND pp.IsActive = 'Y' "
+ " AND p.IsActive = 'Y' "
+ " AND l.IsActive = 'Y' "
+ " AND cl.IsActive = 'Y' "
+ " AND pp.ASP_Status = 'S') "
+ " OR p.AD_Process_Para_ID IN ( "
+ " SELECT AD_Process_Para_ID "
+ " FROM ASP_ClientException ce "
+ " WHERE ce.AD_Client_ID = " + client.getAD_Client_ID()
+ " AND ce.IsActive = 'Y' "
+ " AND ce.AD_Process_Para_ID IS NOT NULL "
+ " AND ce.AD_Tab_ID IS NULL "
+ " AND ce.AD_Field_ID IS NULL "
+ " AND ce.ASP_Status = 'S') "
+ " ) "
+ " AND p.AD_Process_Para_ID NOT IN ( "
+ " SELECT AD_Process_Para_ID "
+ " FROM ASP_ClientException ce "
+ " WHERE ce.AD_Client_ID = " + client.getAD_Client_ID()
+ " AND ce.IsActive = 'Y' "
+ " AND ce.AD_Process_Para_ID IS NOT NULL "
+ " AND ce.AD_Tab_ID IS NULL "
+ " AND ce.AD_Field_ID IS NULL "
+ " AND ce.ASP_Status = 'H')";
String sql = null;
if (Env.isBaseLanguage(Env.getCtx(), "AD_Process_Para"))
sql = "SELECT p.Name, p.Description, p.Help, "
+ "p.AD_Reference_ID, p.AD_Process_Para_ID, "
+ "p.FieldLength, p.IsMandatory, p.IsRange, p.ColumnName, "
+ "p.DefaultValue, p.DefaultValue2, p.VFormat, p.ValueMin, p.ValueMax, "
+ "p.SeqNo, p.AD_Reference_Value_ID, vr.Code AS ValidationCode, "
+ "p.ReadOnlyLogic, p.DisplayLogic "
+ "FROM AD_Process_Para p"
+ " LEFT OUTER JOIN AD_Val_Rule vr ON (p.AD_Val_Rule_ID=vr.AD_Val_Rule_ID) "
+ "WHERE p.AD_Process_ID=?"
+ " AND p.IsActive='Y' "
+ ASPFilter + " ORDER BY SeqNo";
else
sql = "SELECT t.Name, t.Description, t.Help, "
+ "p.AD_Reference_ID, p.AD_Process_Para_ID, "
+ "p.FieldLength, p.IsMandatory, p.IsRange, p.ColumnName, "
+ "p.DefaultValue, p.DefaultValue2, p.VFormat, p.ValueMin, p.ValueMax, "
+ "p.SeqNo, p.AD_Reference_Value_ID, vr.Code AS ValidationCode, "
+ "p.ReadOnlyLogic, p.DisplayLogic "
+ "FROM AD_Process_Para p"
+ " INNER JOIN AD_Process_Para_Trl t ON (p.AD_Process_Para_ID=t.AD_Process_Para_ID)"
+ " LEFT OUTER JOIN AD_Val_Rule vr ON (p.AD_Val_Rule_ID=vr.AD_Val_Rule_ID) "
+ "WHERE p.AD_Process_ID=?"
+ " AND t.AD_Language='" + Env.getAD_Language(Env.getCtx()) + "'"
+ " AND p.IsActive='Y' "
+ ASPFilter + " ORDER BY SeqNo";
boolean hasFields = false;
Rows rows = new Rows();
try
{
PreparedStatement pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, m_processInfo.getAD_Process_ID());
ResultSet rs = pstmt.executeQuery();
int field = 0;
Row row = null;
while (rs.next())
{
hasFields = true;
field++;
if(field % 2 ==0 && mode==BROWSER_MODE)
{
row = createField (rs, rows, row);
}
else
{
row = createField (rs, rows, null);
}
}
rs.close();
pstmt.close();
}
catch(SQLException e)
{
log.log(Level.SEVERE, sql, e);
}
if (m_mFields.size() != m_mFields2.size()
|| m_mFields.size() != m_wEditors.size()
|| m_mFields2.size() != m_wEditors2.size())
log.log(Level.SEVERE, "View & Model vector size is different");
if (hasFields)
{
centerPanel.appendChild(rows);
dynamicDisplay();
}
else
dispose();
return hasFields;
}
private Row
createField (ResultSet rs, Rows rows, Row rw)
{
GridFieldVO voF = GridFieldVO.createParameter(Env.getCtx(), m_WindowNo, rs);
GridField mField = new GridField (voF);
m_mFields.add(mField);
Row row;
if(rw==null)
row = new Row();
else
row = rw;
WEditor editor = WebEditorFactory.getEditor(mField, false);
editor.addValueChangeListener(this);
editor.dynamicDisplay();
mField.addPropertyChangeListener(editor);
Object defaultObject = mField.getDefault();
mField.setValue (defaultObject, true);
if(mode==DEFAULT_MODE)
editor.fillHorizontal();
WEditorPopupMenu popupMenu = editor.getPopupMenu();
if (popupMenu != null)
{
popupMenu.addMenuListener((ContextMenuListener)editor);
this.appendChild(popupMenu);
}
m_wEditors.add (editor);
Div div = new Div();
div.setAlign("right");
org.adempiere.webui.component.Label label = editor.getLabel();
div.appendChild(label);
if (label.getDecorator() != null)
div.appendChild(label.getDecorator());
row.appendChild(div);
if (voF.isRange)
{
Hbox box = new Hbox();
box.appendChild(editor.getComponent());
GridFieldVO voF2 = GridFieldVO.createParameter(voF);
GridField mField2 = new GridField (voF2);
m_mFields2.add (mField2);
WEditor editor2 = WebEditorFactory.getEditor(mField2, false);
mField2.addPropertyChangeListener(editor2);
editor2.dynamicDisplay();
editor2.fillHorizontal();
popupMenu = editor2.getPopupMenu();
if (popupMenu != null)
{
popupMenu.addMenuListener((ContextMenuListener)editor2);
this.appendChild(popupMenu);
}
Object defaultObject2 = mField2.getDefault();
mField2.setValue (defaultObject2, true);
m_wEditors2.add (editor2);
Label separator = new Label(" - ");
m_separators.add(separator);
box.appendChild(separator);
box.appendChild(editor2.getComponent());
row.appendChild(box);
}
else
{
row.appendChild(editor.getComponent());
m_mFields2.add (null);
m_wEditors2.add (null);
m_separators.add(null);
}
if(rw==null)
rows.appendChild(row);
return row;
}
{
log.config("");
StringBuffer sb = new StringBuffer();
int size = m_mFields.size();
for (int i = 0; i < size; i++)
{
GridField field = (GridField)m_mFields.get(i);
if (field.isMandatory(true))
{
WEditor wEditor = (WEditor)m_wEditors.get(i);
Object data = wEditor.getValue();
if (data == null || data.toString().length() == 0)
{
field.setInserting (true);
field.setError(true);
if (sb.length() > 0)
sb.append(", ");
sb.append(field.getHeader());
}
else
field.setError(false);
WEditor wEditor2 = (WEditor)m_wEditors2.get(i);
if (wEditor2 != null)
{
Object data2 = wEditor.getValue();
GridField field2 = (GridField)m_mFields2.get(i);
if (data2 == null || data2.toString().length() == 0)
{
field.setInserting (true);
field2.setError(true);
if (sb.length() > 0)
sb.append(", ");
sb.append(field.getHeader());
}
else
field2.setError(false);
}
}
}
if (sb.length() != 0)
{
FDialog.error(m_WindowNo, this, "FillMandatory", sb.toString());
return false;
}
return true;
}
{
log.config("");
if (!validateParameters())
return false;
for (int i = 0; i < m_mFields.size(); i++)
{
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();
MPInstancePara para = new MPInstancePara (Env.getCtx(), m_processInfo.getAD_PInstance_ID(), i);
GridField mField = (GridField)m_mFields.get(i);
para.setParameterName(mField.getColumnName());
if (result instanceof Timestamp || result2 instanceof Timestamp)
{
para.setP_Date((Timestamp)result);
if (editor2 != null && result2 != null)
para.setP_Date_To((Timestamp)result2);
}
else if (result instanceof Integer || result2 instanceof Integer)
{
if (result != null)
{
Integer ii = (Integer)result;
para.setP_Number(ii.intValue());
}
if (editor2 != null && result2 != null)
{
Integer ii = (Integer)result2;
para.setP_Number_To(ii.intValue());
}
}
else if (result instanceof BigDecimal || result2 instanceof BigDecimal)
{
para.setP_Number ((BigDecimal)result);
if (editor2 != null && result2 != null)
para.setP_Number_To ((BigDecimal)result2);
}
else if (result instanceof Boolean)
{
Boolean bb = (Boolean)result;
String value = bb.booleanValue() ? "Y" : "N";
para.setP_String (value);
}
else
{
if (result != null)
para.setP_String (result.toString());
if (editor2 != null && result2 != null)
para.setP_String_To (result2.toString());
}
para.setInfo (editor.getDisplay());
if (editor2 != null)
para.setInfo_To (editor2.getDisplay());
para.save();
log.fine(para.toString());
}
return true;
}
{
if (evt.getSource() instanceof WEditor) {
GridField changedField = ((WEditor) evt.getSource()).getGridField();
if (changedField != null) {
processDependencies (changedField);
}
}
processNewValue(evt.getNewValue(), evt.getPropertyName());
}
{
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);
}
}
ArrayList<String> list = field.getDependentOn();
if (list.contains(columnName)) {
if (field.getLookup() instanceof MLookup)
{
MLookup mLookup = (MLookup)field.getLookup();
if (mLookup.getValidation().indexOf("@"+columnName+"@") != -1)
{
log.fine(columnName + " changed - "
+ field.getColumnName() + " set to null");
field.setValue(null, true);
}
}
}
}
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());
dynamicDisplay();
}
for(int i = 0; i < m_wEditors.size(); i++) {
WEditor editor = m_wEditors.get(i);
GridField mField = editor.getGridField();
if (mField.isDisplayed(true)) {
if (!editor.isVisible()) {
editor.setVisible(true);
if (mField.getVO().isRange) {
m_separators.get(i).setVisible(true);
m_wEditors2.get(i).setVisible(true);
}
}
boolean rw = mField.isEditablePara(true);
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);
if (mField.getVO().isRange) {
m_separators.get(i).setVisible(false);
m_wEditors2.get(i).setVisible(false);
}
}
}
}
for (GridField f : m_mFields) {
if (f != null)
f.restoreValue();
}
for (GridField f : m_mFields2) {
if (f != null)
f.restoreValue();
}
}
}