Implement [ 1795398 ] Process Parameter: add display and readonly logic

This commit is contained in:
Carlos Ruiz 2008-08-02 22:19:08 +00:00
parent 19beaeaf8b
commit 373b60f28e
5 changed files with 183 additions and 16 deletions

View File

@ -54,6 +54,7 @@ import org.compiere.util.Evaluator;
* @author Jorg Janke * @author Jorg Janke
* @author Victor Perez , e-Evolution.SC FR [ 1757088 ], [1877902] Implement JSR 223 Scripting APIs to Callout * @author Victor Perez , e-Evolution.SC FR [ 1757088 ], [1877902] Implement JSR 223 Scripting APIs to Callout
* @author Carlos Ruiz, qss FR [1877902] * @author Carlos Ruiz, qss FR [1877902]
* @author Juan David Arboleda (arboleda), GlobalQSS, [ 1795398 ] Process Parameter: add display and readonly logic
* @see http://sourceforge.net/tracker/?func=detail&atid=879335&aid=1877902&group_id=176962 to FR [1877902] * @see http://sourceforge.net/tracker/?func=detail&atid=879335&aid=1877902&group_id=176962 to FR [1877902]
* @version $Id: GridField.java,v 1.5 2006/07/30 00:51:02 jjanke Exp $ * @version $Id: GridField.java,v 1.5 2006/07/30 00:51:02 jjanke Exp $
*/ */
@ -324,6 +325,25 @@ public class GridField
return isDisplayed (checkContext); return isDisplayed (checkContext);
} // isMandatory } // isMandatory
/**
* Is parameter Editable - checks if parameter is Read Only
* @param checkContext if true checks Context
* @return true, if editable
*/
public boolean isEditablePara(boolean checkContext) {
if (checkContext && m_vo.ReadOnlyLogic.length() > 0)
{
boolean retValue = !Evaluator.evaluateLogic(this, m_vo.ReadOnlyLogic);
log.finest(m_vo.ColumnName + " R/O(" + m_vo.ReadOnlyLogic + ") => R/W-" + retValue);
if (!retValue)
return false;
}
// ultimately visibility decides
return isDisplayed (checkContext);
}
/** /**
* Is it Editable - checks IsActive, IsUpdateable, and isDisplayed * Is it Editable - checks IsActive, IsUpdateable, and isDisplayed
* @param checkContext if true checks Context for Active, IsProcessed, LinkColumn * @param checkContext if true checks Context for Active, IsProcessed, LinkColumn
@ -413,7 +433,7 @@ public class GridField
if (checkContext && !Env.getContext(m_vo.ctx, m_vo.WindowNo, "IsActive").equals("Y")) if (checkContext && !Env.getContext(m_vo.ctx, m_vo.WindowNo, "IsActive").equals("Y"))
return false; return false;
// ultimately visibily decides // ultimately visibility decides
return isDisplayed (checkContext); return isDisplayed (checkContext);
} // isEditable } // isEditable

View File

@ -36,6 +36,7 @@ import org.compiere.util.Env;
* @author Jorg Janke * @author Jorg Janke
* @author Victor Perez , e-Evolution.SC FR [ 1757088 ] , [1877902] Implement JSR 223 Scripting APIs to Callout * @author Victor Perez , e-Evolution.SC FR [ 1757088 ] , [1877902] Implement JSR 223 Scripting APIs to Callout
* @author Carlos Ruiz, qss FR [1877902] * @author Carlos Ruiz, qss FR [1877902]
* @author Juan David Arboleda (arboleda), GlobalQSS, [ 1795398 ] Process Parameter: add display and readonly logic
* @see http://sourceforge.net/tracker/?func=detail&atid=879335&aid=1877902&group_id=176962 to FR [1877902] * @see http://sourceforge.net/tracker/?func=detail&atid=879335&aid=1877902&group_id=176962 to FR [1877902]
* @version $Id: GridFieldVO.java,v 1.3 2006/07/30 00:58:04 jjanke Exp $ * @version $Id: GridFieldVO.java,v 1.3 2006/07/30 00:58:04 jjanke Exp $
*/ */
@ -292,6 +293,9 @@ public class GridFieldVO implements Serializable
// //
vo.AD_Reference_Value_ID = rs.getInt("AD_Reference_Value_ID"); vo.AD_Reference_Value_ID = rs.getInt("AD_Reference_Value_ID");
vo.ValidationCode = rs.getString("ValidationCode"); vo.ValidationCode = rs.getString("ValidationCode");
vo.ReadOnlyLogic = rs.getString("ReadOnlyLogic");
vo.DisplayLogic= rs.getString("DisplayLogic");
} }
catch (SQLException e) catch (SQLException e)
{ {

View File

@ -188,6 +188,19 @@ public interface I_AD_Process_Para
*/ */
public String getDescription(); public String getDescription();
/** Column name DisplayLogic */
public static final String COLUMNNAME_DisplayLogic = "DisplayLogic";
/** Set Display Logic.
* If the Field is displayed, the result determines if the field is actually displayed
*/
public void setDisplayLogic (String DisplayLogic);
/** Get Display Logic.
* If the Field is displayed, the result determines if the field is actually displayed
*/
public String getDisplayLogic();
/** Column name EntityType */ /** Column name EntityType */
public static final String COLUMNNAME_EntityType = "EntityType"; public static final String COLUMNNAME_EntityType = "EntityType";
@ -281,6 +294,19 @@ public interface I_AD_Process_Para
*/ */
public String getName(); public String getName();
/** Column name ReadOnlyLogic */
public static final String COLUMNNAME_ReadOnlyLogic = "ReadOnlyLogic";
/** Set Read Only Logic.
* Logic to determine if field is read only (applies only when field is read-write)
*/
public void setReadOnlyLogic (String ReadOnlyLogic);
/** Get Read Only Logic.
* Logic to determine if field is read only (applies only when field is read-write)
*/
public String getReadOnlyLogic();
/** Column name SeqNo */ /** Column name SeqNo */
public static final String COLUMNNAME_SeqNo = "SeqNo"; public static final String COLUMNNAME_SeqNo = "SeqNo";

View File

@ -339,6 +339,23 @@ public class X_AD_Process_Para extends PO implements I_AD_Process_Para, I_Persis
return (String)get_Value(COLUMNNAME_Description); return (String)get_Value(COLUMNNAME_Description);
} }
/** Set Display Logic.
@param DisplayLogic
If the Field is displayed, the result determines if the field is actually displayed
*/
public void setDisplayLogic (String DisplayLogic)
{
set_Value (COLUMNNAME_DisplayLogic, DisplayLogic);
}
/** Get Display Logic.
@return If the Field is displayed, the result determines if the field is actually displayed
*/
public String getDisplayLogic ()
{
return (String)get_Value(COLUMNNAME_DisplayLogic);
}
/** EntityType AD_Reference_ID=389 */ /** EntityType AD_Reference_ID=389 */
public static final int ENTITYTYPE_AD_Reference_ID=389; public static final int ENTITYTYPE_AD_Reference_ID=389;
/** Set Entity Type. /** Set Entity Type.
@ -494,6 +511,23 @@ public class X_AD_Process_Para extends PO implements I_AD_Process_Para, I_Persis
return new KeyNamePair(get_ID(), getName()); return new KeyNamePair(get_ID(), getName());
} }
/** Set Read Only Logic.
@param ReadOnlyLogic
Logic to determine if field is read only (applies only when field is read-write)
*/
public void setReadOnlyLogic (String ReadOnlyLogic)
{
set_Value (COLUMNNAME_ReadOnlyLogic, ReadOnlyLogic);
}
/** Get Read Only Logic.
@return Logic to determine if field is read only (applies only when field is read-write)
*/
public String getReadOnlyLogic ()
{
return (String)get_Value(COLUMNNAME_ReadOnlyLogic);
}
/** Set Sequence. /** Set Sequence.
@param SeqNo @param SeqNo
Method of ordering records; lowest number comes first Method of ordering records; lowest number comes first

View File

@ -50,6 +50,8 @@ import org.compiere.util.Env;
* - checks, if parameters exist and inquires and saves them * - checks, if parameters exist and inquires and saves them
* *
* @author Low Heng Sin * @author Low Heng Sin
* @author Juan David Arboleda (arboleda), GlobalQSS, [ 1795398 ] Process
* Parameter: add display and readonly logic
* @version 2006-12-01 * @version 2006-12-01
*/ */
@SuppressWarnings("serial") @SuppressWarnings("serial")
@ -91,6 +93,7 @@ public class ProcessParameterPanel extends CPanel implements VetoableChangeListe
private ArrayList<VEditor> m_vEditors2 = new ArrayList<VEditor>(); // for ranges private ArrayList<VEditor> m_vEditors2 = new ArrayList<VEditor>(); // for ranges
private ArrayList<GridField> m_mFields = new ArrayList<GridField>(); private ArrayList<GridField> m_mFields = new ArrayList<GridField>();
private ArrayList<GridField> m_mFields2 = new ArrayList<GridField>(); private ArrayList<GridField> m_mFields2 = new ArrayList<GridField>();
private ArrayList<JLabel> m_separators = new ArrayList<JLabel>();
// //
private BorderLayout mainLayout = new BorderLayout(); private BorderLayout mainLayout = new BorderLayout();
private CPanel centerPanel = new CPanel(); private CPanel centerPanel = new CPanel();
@ -116,6 +119,7 @@ public class ProcessParameterPanel extends CPanel implements VetoableChangeListe
m_vEditors2.clear(); m_vEditors2.clear();
m_mFields.clear(); m_mFields.clear();
m_mFields2.clear(); m_mFields2.clear();
m_separators.clear();
this.removeAll(); this.removeAll();
} // dispose } // dispose
@ -182,7 +186,7 @@ public class ProcessParameterPanel extends CPanel implements VetoableChangeListe
+ "p.AD_Reference_ID, p.AD_Process_Para_ID, " + "p.AD_Reference_ID, p.AD_Process_Para_ID, "
+ "p.FieldLength, p.IsMandatory, p.IsRange, p.ColumnName, " + "p.FieldLength, p.IsMandatory, p.IsRange, p.ColumnName, "
+ "p.DefaultValue, p.DefaultValue2, p.VFormat, p.ValueMin, p.ValueMax, " + "p.DefaultValue, p.DefaultValue2, p.VFormat, p.ValueMin, p.ValueMax, "
+ "p.SeqNo, p.AD_Reference_Value_ID, vr.Code AS ValidationCode " + "p.SeqNo, p.AD_Reference_Value_ID, vr.Code AS ValidationCode, p.ReadOnlyLogic, p.DisplayLogic "
+ "FROM AD_Process_Para p" + "FROM AD_Process_Para p"
+ " LEFT OUTER JOIN AD_Val_Rule vr ON (p.AD_Val_Rule_ID=vr.AD_Val_Rule_ID) " + " LEFT OUTER JOIN AD_Val_Rule vr ON (p.AD_Val_Rule_ID=vr.AD_Val_Rule_ID) "
+ "WHERE p.AD_Process_ID=?" // 1 + "WHERE p.AD_Process_ID=?" // 1
@ -193,7 +197,7 @@ public class ProcessParameterPanel extends CPanel implements VetoableChangeListe
+ "p.AD_Reference_ID, p.AD_Process_Para_ID, " + "p.AD_Reference_ID, p.AD_Process_Para_ID, "
+ "p.FieldLength, p.IsMandatory, p.IsRange, p.ColumnName, " + "p.FieldLength, p.IsMandatory, p.IsRange, p.ColumnName, "
+ "p.DefaultValue, p.DefaultValue2, p.VFormat, p.ValueMin, p.ValueMax, " + "p.DefaultValue, p.DefaultValue2, p.VFormat, p.ValueMin, p.ValueMax, "
+ "p.SeqNo, p.AD_Reference_Value_ID, vr.Code AS ValidationCode " + "p.SeqNo, p.AD_Reference_Value_ID, vr.Code AS ValidationCode, p.ReadOnlyLogic, p.DisplayLogic "
+ "FROM AD_Process_Para p" + "FROM AD_Process_Para p"
+ " INNER JOIN AD_Process_Para_Trl t ON (p.AD_Process_Para_ID=t.AD_Process_Para_ID)" + " 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) " + " LEFT OUTER JOIN AD_Val_Rule vr ON (p.AD_Val_Rule_ID=vr.AD_Val_Rule_ID) "
@ -204,23 +208,29 @@ public class ProcessParameterPanel extends CPanel implements VetoableChangeListe
// Create Fields // Create Fields
boolean hasFields = false; boolean hasFields = false;
PreparedStatement pstmt = null;
ResultSet rs = null;
try try
{ {
PreparedStatement pstmt = DB.prepareStatement(sql, null); pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, m_processInfo.getAD_Process_ID()); pstmt.setInt(1, m_processInfo.getAD_Process_ID());
ResultSet rs = pstmt.executeQuery(); rs = pstmt.executeQuery();
while (rs.next()) while (rs.next())
{ {
hasFields = true; hasFields = true;
createField (rs); createField (rs);
} }
rs.close();
pstmt.close();
} }
catch(SQLException e) catch(SQLException e)
{ {
log.log(Level.SEVERE, sql, e); log.log(Level.SEVERE, sql, e);
} }
finally
{
DB.close(rs, pstmt);
rs = null;
pstmt = null;
}
// both vectors the same? // both vectors the same?
if (m_mFields.size() != m_mFields2.size() if (m_mFields.size() != m_mFields2.size()
@ -235,18 +245,18 @@ public class ProcessParameterPanel extends CPanel implements VetoableChangeListe
centerPanel.add(Box.createVerticalStrut(10), gbc); // bottom gap centerPanel.add(Box.createVerticalStrut(10), gbc); // bottom gap
gbc.gridx = 3; gbc.gridx = 3;
centerPanel.add(Box.createHorizontalStrut(12), gbc); // right gap centerPanel.add(Box.createHorizontalStrut(12), gbc); // right gap
dynamicDisplay();
} }
else else
dispose(); dispose();
return hasFields; return hasFields;
} // initDialog } // init
/** /**
* Create Field. * Create Field.
* - creates Fields and adds it to m_mFields list * - creates Fields and adds it to m_mFields list
* - creates Editor and adds it to m_vEditors list * - creates Editor and adds it to m_vEditors list
* Handeles Ranges by adding additional mField/vEditor. * Handles Ranges by adding additional mField/vEditor.
* <p> * <p>
* mFields are used for default value and mandatory checking; * mFields are used for default value and mandatory checking;
* vEditors are used to retrieve the value (no data binding) * vEditors are used to retrieve the value (no data binding)
@ -303,7 +313,9 @@ public class ProcessParameterPanel extends CPanel implements VetoableChangeListe
gbc.gridx = 2; gbc.gridx = 2;
gbc.weightx = 0; gbc.weightx = 0;
gbc.fill = GridBagConstraints.NONE; gbc.fill = GridBagConstraints.NONE;
centerPanel.add (new JLabel(" - "), gbc); JLabel dash = new JLabel(" - ");
centerPanel.add (dash, gbc);
m_separators.add(dash);
// To Field // To Field
gbc.gridx = 3; gbc.gridx = 3;
gbc.insets = fieldInsetRight; gbc.insets = fieldInsetRight;
@ -327,6 +339,7 @@ public class ProcessParameterPanel extends CPanel implements VetoableChangeListe
} }
else else
{ {
m_separators.add(null);
m_mFields2.add (null); m_mFields2.add (null);
m_vEditors2.add (null); m_vEditors2.add (null);
} }
@ -340,10 +353,81 @@ public class ProcessParameterPanel extends CPanel implements VetoableChangeListe
public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException
{ {
// log.fine( "ProcessParameterPanel.vetoableChange"); // log.fine( "ProcessParameterPanel.vetoableChange");
String value = evt.getNewValue() == null ? "" : evt.getNewValue().toString(); processNewValue(evt.getNewValue(), evt.getPropertyName());
Env.setContext(Env.getCtx(), m_WindowNo, evt.getPropertyName(), value);
} // vetoableChange } // vetoableChange
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());
dynamicDisplay();
}
/**
* Dynamic Display.
*
**/
public void dynamicDisplay() {
Component[] comps = centerPanel.getComponents();
for (int i = 0; i < comps.length; i++) {
Component comp = comps[i];
String columnName = comp.getName();
if (columnName != null && columnName.length() > 0) {
int index = getIndex(columnName);
if (m_mFields.get(index) != null) {
if (m_mFields.get(index).isDisplayed(true)) { // check
// context
if (!comp.isVisible()) {
comp.setVisible(true); // visibility
if (m_mFields.get(index).getVO().isRange)
m_separators.get(index).setText(" - ");
}
boolean rw = m_mFields.get(index).isEditablePara(true); // r/w - check if field is Editable
m_vEditors.get(index).setReadWrite(rw);
if (m_mFields.get(index).getVO().isRange)
m_vEditors2.get(index).setReadWrite(rw);
} else {
if (comp.isVisible()) {
comp.setVisible(false);
if (m_mFields.get(index).getVO().isRange)
m_separators.get(index).setText("");
}
}
}
}
}
} // Dynamic Display.
/**
* getIndex. Get m_mFields index from columnName
*
* @param columnName
* @return int
**/
private int getIndex(String columnName) {
for (int i = 0; i < m_mFields.size(); i++) {
if (m_mFields.get(i).getColumnName().equals(columnName)) {
return i;
}
}
return 0;
} // getIndex
/* (non-Javadoc) /* (non-Javadoc)
* @see org.compiere.apps.ProcessParameters#saveParameters() * @see org.compiere.apps.ProcessParameters#saveParameters()
*/ */
@ -496,4 +580,3 @@ public class ProcessParameterPanel extends CPanel implements VetoableChangeListe
} }
} }
} // ProcessParameterPanel } // ProcessParameterPanel