From 003627ee53749fdd2ffce3ccb73f6190a819ffbf Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Thu, 10 Jul 2008 02:17:49 +0000 Subject: [PATCH] * Implemented value preference dialog. --- .../org/adempiere/webui/ValuePreference.java | 523 ++++++++++++++++++ .../adempiere/webui/editor/WNumberEditor.java | 4 +- .../adempiere/webui/editor/WSearchEditor.java | 2 +- .../adempiere/webui/editor/WStringEditor.java | 14 +- .../webui/editor/WTableDirEditor.java | 2 +- .../org/adempiere/webui/panel/ADTabpanel.java | 2 + 6 files changed, 541 insertions(+), 6 deletions(-) create mode 100644 extension/posterita/webui/WEB-INF/src/org/adempiere/webui/ValuePreference.java diff --git a/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/ValuePreference.java b/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/ValuePreference.java new file mode 100644 index 0000000000..10a8a963fe --- /dev/null +++ b/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/ValuePreference.java @@ -0,0 +1,523 @@ +/****************************************************************************** + * Product: Adempiere ERP & CRM Smart Business Solution * + * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + * For the text or an alternative of this public license, you may reach us * + * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * + * or via info@compiere.org or http://www.compiere.org/license.html * + *****************************************************************************/ +package org.adempiere.webui; + +import java.util.*; +import java.util.logging.*; + +import org.adempiere.webui.apps.AEnv; +import org.adempiere.webui.component.Button; +import org.adempiere.webui.component.Checkbox; +import org.adempiere.webui.component.ConfirmPanel; +import org.adempiere.webui.component.Grid; +import org.adempiere.webui.component.Label; +import org.adempiere.webui.component.Panel; +import org.adempiere.webui.component.Row; +import org.adempiere.webui.component.Rows; +import org.adempiere.webui.component.Textbox; +import org.adempiere.webui.component.Window; +import org.adempiere.webui.window.FDialog; +import org.compiere.model.*; +import org.compiere.util.*; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.Events; +import org.zkoss.zul.Div; +import org.zkoss.zul.Separator; +import org.zkoss.zul.Vbox; + +/** + * Maintain Value Preferences. + * To delete a preference, select a null value and save. + * + * @author Jorg Janke + * @version $Id: ValuePreference.java,v 1.2 2006/07/30 00:51:28 jjanke Exp $ + */ +public class ValuePreference extends Window implements EventListener +{ + /** + * Factory + * @param mField field + * @param aValue value + * @return ValuePreference or null + */ + public static ValuePreference start (GridField mField, Object aValue) + { + return start (mField, aValue, null); + } // start + + /** + * Factory + * @param mField field + * @param aValue value + * @param aDisplayValue display value + * @return ValuePreference or null + */ + public static ValuePreference start (GridField mField, Object aValue, String aDisplayValue) + { + if (!mField.isEditable(false)) + { + log.info("Field not editable (R/O)"); + return null; + } + + // Set Value/DisplayValue + String Value = null; + String DisplayValue = null; + if (aValue != null) + { + Value = aValue.toString(); + DisplayValue = (aDisplayValue == null) ? Value : aDisplayValue; + } + + // Get from mField + // AD_Window_ID, DisplayAttribute, Attribute, DisplayType, AD_Referenece_ID + int AD_Window_ID = mField.getAD_Window_ID(); + String Attribute = mField.getColumnName(); + String DisplayAttribute = mField.getHeader(); + int displayType = mField.getDisplayType(); + int AD_Reference_ID = 0; + int WindowNo = mField.getWindowNo(); + + // Get from Environment (WindowNo) + // AD_Client_ID, AD_Org_ID, AD_User_ID, Frame + int AD_Client_ID = Env.getAD_Client_ID(Env.getCtx()); + int AD_Org_ID = Env.getContextAsInt(Env.getCtx(), WindowNo, "AD_Org_ID"); + int AD_User_ID = Env.getAD_User_ID(Env.getCtx()); + + // Create Editor + ValuePreference vp = new ValuePreference (WindowNo, + AD_Client_ID, AD_Org_ID, AD_User_ID, AD_Window_ID, + Attribute, DisplayAttribute, Value, DisplayValue, + displayType, AD_Reference_ID); + return vp; + } // create + + /** + * Create the popup menu item to start the ValuePreference editor. + * + * .. add method + * public void setField (MField mField) + * { + * m_mField = mField; + * if (m_mField != null) + * ValuePreference.addMenu (this, m_popupMenu); + * } // setField + * + * .. in actionPerformed add .. + * if (e.getActionCommand().equals(ValuePreference.NAME)) + * { + * ValuePreference.start (m_mField, getValue(), DisplayValue); + * return; + * } + * + * @param l listener + * @param popupMenu menu + * @return JMenuItem + */ + /* + public static CMenuItem addMenu (ActionListener l, JPopupMenu popupMenu) + { + CMenuItem mi = new CMenuItem (Msg.getMsg(Env.getCtx(), NAME), s_icon); + mi.setActionCommand(NAME); + mi.addActionListener(l); + popupMenu.add(mi); + return mi; + }*/ // addMenu + + /** The Name of the Editor */ + public static final String NAME = "ValuePreference"; + /** The Menu Icon */ + private static String ICON_URL = "images/VPreference16.gif"; + /** Logger */ + private static CLogger log = CLogger.getCLogger(ValuePreference.class); + + /** + * Constructor + * + * @param WindowNo window no + * @param AD_Client_ID client + * @param AD_Org_ID org + * @param AD_User_ID user + * @param AD_Window_ID window id + * @param Attribute attribute + * @param DisplayAttribute attribute display + * @param Value value + * @param DisplayValue calue display + * @param displayType display type + * @param AD_Reference_ID reference + */ + public ValuePreference (int WindowNo, + int AD_Client_ID, int AD_Org_ID, int AD_User_ID, int AD_Window_ID, + String Attribute, String DisplayAttribute, String Value, String DisplayValue, + int displayType, int AD_Reference_ID) + { + super(); + this.setTitle(Msg.getMsg(Env.getCtx(), NAME) + " " + DisplayAttribute); + + log.config("WindowNo=" + WindowNo + + ", Client_ID=" + AD_Client_ID + ", Org_ID=" + AD_Org_ID + ", User_ID=" + AD_User_ID + ", Window_ID=" + AD_Window_ID + + ", Attribute=" + Attribute + "/" + DisplayAttribute + ", Value=" + Value + "/" + DisplayValue + + ", DisplayType=" + displayType + ", Reference_ID=" + AD_Reference_ID); + + m_ctx = Env.getCtx(); + m_WindowNo = WindowNo; + m_AD_Client_ID = AD_Client_ID; + m_AD_Org_ID = AD_Org_ID; + m_AD_User_ID = AD_User_ID; + m_AD_Window_ID = AD_Window_ID; + m_Attribute = Attribute; + m_DisplayAttribute = DisplayAttribute; + m_Value = Value; + m_DisplayValue = DisplayValue; + m_DisplayType = displayType; + // + m_role = MRole.getDefault(); + try + { + init(); + dynInit(); + } + catch(Exception ex) + { + log.log(Level.SEVERE, "", ex); + } + + this.setClosable(true); + AEnv.showCenterScreen(this); + } // ValuePreference + + private Properties m_ctx; + private int m_WindowNo; + private int m_AD_Client_ID; + private int m_AD_Org_ID; + private int m_AD_User_ID; + private int m_AD_Window_ID; + private String m_Attribute; + private String m_DisplayAttribute; + private String m_Value; + private String m_DisplayValue; + private int m_DisplayType; + private MRole m_role; + + // Display + private Panel setPanel = new Panel(); + private Grid setLayout = new Grid(); + private Label lAttribute = new Label(); + private Textbox fAttribute = new Textbox(); + private Label lAttributeValue = new Label(); + private Label lValue = new Label(); + private Label lValueValue = new Label(); + private Textbox fValue = new Textbox(); + private Label lSetFor = new Label(); + private Checkbox cbClient = new Checkbox(); + private Checkbox cbOrg = new Checkbox(); + private Checkbox cbUser = new Checkbox(); + private Checkbox cbWindow = new Checkbox(); + private Label lExplanation = new Label(); + + private ConfirmPanel confirmPanel = new ConfirmPanel(true); + private Button bDelete; + + /** + * Static Layout + * @throws Exception + */ + private void init() throws Exception + { + // + lAttribute.setValue(Msg.translate(m_ctx, "Attribute").replace("&", "")); + lValue.setValue(Msg.translate(m_ctx, "Value").replace("&", "")); + lSetFor.setValue(Msg.getMsg(m_ctx, "ValuePreferenceSetFor")); + cbClient.setLabel(Msg.translate(m_ctx, "AD_Client_ID")); + cbOrg.setLabel(Msg.translate(m_ctx, "AD_Org_ID")); + cbUser.setLabel(Msg.translate(m_ctx, "AD_User_ID")); + cbUser.setChecked(true); + cbWindow.setLabel(Msg.translate(m_ctx, "AD_Window_ID")); + cbWindow.setChecked(true); + // + setPanel.appendChild(setLayout); + fAttribute.setReadonly(true); + fValue.setReadonly(true); + + Vbox box = new Vbox(); + box.setWidth("100%"); + box.setHeight("100%"); + box.setParent(this); + box.appendChild(setPanel); + + Rows rows = new Rows(); + rows.setParent(setLayout); + + Row row = new Row(); + row.setSpans("1, 4, 1"); + Div div = new Div(); + div.setStyle("text-align: right"); + div.appendChild(lAttribute); + row.appendChild(div); + row.appendChild(fAttribute); + fAttribute.setWidth("100%"); + row.appendChild(lAttributeValue); + rows.appendChild(row); + + row = new Row(); + row.setSpans("1, 4, 1"); + div = new Div(); + div.setStyle("text-align: right"); + div.appendChild(lValue); + row.appendChild(div); + row.appendChild(fValue); + fValue.setWidth("100%"); + row.appendChild(lValueValue); + rows.appendChild(row); + + row = new Row(); + div = new Div(); + div.setStyle("text-align: right"); + div.appendChild(lSetFor); + row.appendChild(div); + row.appendChild(cbClient); + row.appendChild(cbOrg); + row.appendChild(cbUser); + row.appendChild(cbWindow); + rows.appendChild(row); + + // + Separator separator = new Separator(); + separator.setBar(true); + separator.setHeight("20px"); + box.appendChild(separator); + box.appendChild(confirmPanel); + + this.setBorder("normal"); + setLayout.setSclass("grid-no-striped"); + setLayout.setOddRowSclass("even"); + + } // jbInit + + /** + * Dynamic Init + */ + private void dynInit() + { + // Set Attribute/Value + fAttribute.setText(m_DisplayAttribute); + lAttributeValue.setValue(m_Attribute); + fValue.setText(m_DisplayValue); + lValueValue.setValue(m_Value); + if (CLogMgt.isLevelFine()) + { + lAttributeValue.setVisible(false); + lValueValue.setVisible(false); + } + + // ActionListener + cbClient.setEnabled(false); + cbClient.setChecked(true); + // cbClient.addActionListener(this); + + // Can Change Org + if (MRole.PREFERENCETYPE_Client.equals(m_role.getPreferenceType())) + cbOrg.addEventListener(Events.ON_CHECK, this); + else + { + cbOrg.setEnabled(false); + cbOrg.setChecked(true); + } + + // Can Change User + if (MRole.PREFERENCETYPE_Client.equals(m_role.getPreferenceType()) + || MRole.PREFERENCETYPE_Organization.equals(m_role.getPreferenceType())) + cbUser.addEventListener(Events.ON_CHECK, this); + else + { + cbUser.setEnabled(false); + cbUser.setChecked(true); + } + // Can change all/specific + cbWindow.addEventListener(Events.ON_CHECK, this); + + // Other + confirmPanel.addComponentsLeft(confirmPanel.createButton("Delete")); + confirmPanel.addActionListener(Events.ON_CLICK, this); + bDelete = confirmPanel.getButton("Delete"); + setExplanation(); + } // dynInit + + /** + * Action Listener + * @param e event + */ + public void onEvent(Event e) throws Exception + { + if (e.getTarget().getId().equals("Cancel")) + { + this.detach(); + } + else if (e.getTarget().getId().equals("Ok")) + { + insert(); + detach(); + } + else if (e.getTarget() == bDelete) + { + int no = delete(); + if (no == 0) + FDialog.warn(m_WindowNo, this.getTitle(), "ValuePreferenceNotFound"); + else + FDialog.info(m_WindowNo, this, "ValuePreferenceDeleted", String.valueOf(no)); + detach(); + } + else + setExplanation(); + } // actionPerformed + + /** + * Set Explanation + */ + private void setExplanation() + { + /** @todo translation */ + StringBuffer expl = new StringBuffer("For "); + if (cbClient.isChecked() && cbOrg.isChecked() ) + expl.append("this Client and Organization"); + else if (cbClient.isChecked() && !cbOrg.isChecked()) + expl.append("all Organizations of this Client"); + else if (!cbClient.isChecked() && cbOrg.isChecked()) + { + cbOrg.setChecked(false); + expl.append("entire System"); + } + else + expl.append("entire System"); + // + if (cbUser.isChecked()) + expl.append(", this User"); + else + expl.append(", all Users"); + // + if (cbWindow.isChecked()) + expl.append(" and this Window"); + else + expl.append(" and all Windows"); + // + if (Env.getLanguage(Env.getCtx()).isBaseLanguage()) + { + lExplanation.setValue(expl.toString ()); + this.invalidate(); + } + } // setExplanation + + /** + * Delete Preference + * @return number of rows deleted + */ + public int delete() + { + log.info(""); + + StringBuffer sql = new StringBuffer ("DELETE FROM AD_Preference WHERE "); + sql.append("AD_Client_ID=").append(cbClient.isChecked() ? m_AD_Client_ID : 0); + sql.append(" AND AD_Org_ID=").append(cbOrg.isChecked() ? m_AD_Org_ID : 0); + if (cbUser.isChecked()) + sql.append(" AND AD_User_ID=").append(m_AD_User_ID); + else + sql.append(" AND AD_User_ID IS NULL"); + if (cbWindow.isChecked()) + sql.append(" AND AD_Window_ID=").append(m_AD_Window_ID); + else + sql.append(" AND AD_Window_ID IS NULL"); + sql.append(" AND Attribute='").append(m_Attribute).append("'"); + // + log.fine( sql.toString()); + int no = DB.executeUpdate(sql.toString(), null); + if (no > 0) + Env.setContext(m_ctx, getContextKey(), (String)null); + return no; + } // delete + + /** + * Get Context Key + * @return Context Key + */ + private String getContextKey() + { + if (cbWindow.isChecked()) + return "P" + m_AD_Window_ID + "|" + m_Attribute; + else + return "P|" + m_Attribute; + } // getContextKey + + /** + * Save to Disk + */ + public void insert() + { + log.info(""); + + // --- Delete first + int no = delete(); + + // Handle NULL + if (m_Value == null || m_Value.length() == 0) + { + if (DisplayType.isLookup(m_DisplayType)) + m_Value = "-1"; // -1 may cause problems (BPartner - M_DiscountSchema + else if (DisplayType.isDate(m_DisplayType)) + m_Value = " "; + else + { + FDialog.warn(m_WindowNo, this.getTitle(), "ValuePreferenceNotInserted"); + return; + } + } + + // --- Inserting + int Client_ID = cbClient.isChecked() ? m_AD_Client_ID : 0; + int Org_ID = cbOrg.isChecked() ? m_AD_Org_ID : 0; + int AD_Preference_ID = DB.getNextID(m_ctx, "AD_Preference", null); + // + StringBuffer sql = new StringBuffer ("INSERT INTO AD_Preference (" + + "AD_Preference_ID, AD_Client_ID, AD_Org_ID, IsActive, Created,CreatedBy,Updated,UpdatedBy," + + "AD_Window_ID, AD_User_ID, Attribute, Value) VALUES ("); + sql.append(AD_Preference_ID).append(",").append(Client_ID).append(",").append(Org_ID) + .append(", 'Y',SysDate,").append(m_AD_User_ID).append(",SysDate,").append(m_AD_User_ID).append(", "); + if (cbWindow.isChecked()) + sql.append(m_AD_Window_ID).append(","); + else + sql.append("NULL,") ; + if (cbUser.isChecked()) + sql.append(m_AD_User_ID).append(","); + else + sql.append("NULL,"); + // + sql.append(DB.TO_STRING(m_Attribute)).append(",").append(DB.TO_STRING(m_Value)).append(")"); + // + log.fine( sql.toString()); + no = DB.executeUpdate(sql.toString(), null); + if (no == 1) + { + Env.setContext(m_ctx, getContextKey(), m_Value); + FDialog.info(m_WindowNo, this, "ValuePreferenceInserted"); + } + else + FDialog.warn(m_WindowNo, this.getTitle(), "ValuePreferenceNotInserted"); + + } // insert + + +} // ValuePreference diff --git a/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/editor/WNumberEditor.java b/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/editor/WNumberEditor.java index 157f00c99d..77417bce31 100644 --- a/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/editor/WNumberEditor.java +++ b/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/editor/WNumberEditor.java @@ -17,10 +17,12 @@ package org.adempiere.webui.editor; +import org.adempiere.webui.ValuePreference; import org.adempiere.webui.component.NumberBox; import org.adempiere.webui.event.ContextMenuEvent; import org.adempiere.webui.event.ValueChangeEvent; import org.compiere.model.GridField; +import org.compiere.model.MRole; import org.compiere.util.DisplayType; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.Events; @@ -117,13 +119,11 @@ public class WNumberEditor extends WEditor public void onMenu(ContextMenuEvent evt) { - /* Wrong implementation for Value Preference - Swing is being called if (WEditorPopupMenu.PREFERENCE_EVENT.equals(evt.getContextEvent())) { if (MRole.getDefault().isShowPreference()) ValuePreference.start (this.getGridField(), getValue()); return; } - */ } } diff --git a/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/editor/WSearchEditor.java b/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/editor/WSearchEditor.java index 82e2a7401c..e90f165f87 100644 --- a/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/editor/WSearchEditor.java +++ b/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/editor/WSearchEditor.java @@ -24,6 +24,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.logging.Level; +import org.adempiere.webui.ValuePreference; import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.component.Searchbox; import org.adempiere.webui.event.ContextMenuEvent; @@ -34,7 +35,6 @@ import org.adempiere.webui.grid.WBPartner; import org.adempiere.webui.panel.InfoBPartnerPanel; import org.adempiere.webui.panel.InfoPanel; import org.adempiere.webui.panel.InfoProductPanel; -import org.compiere.grid.ed.ValuePreference; import org.compiere.model.GridField; import org.compiere.model.Lookup; import org.compiere.model.MLookup; diff --git a/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/editor/WStringEditor.java b/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/editor/WStringEditor.java index 5f39d9525e..4985d0c6f7 100644 --- a/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/editor/WStringEditor.java +++ b/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/editor/WStringEditor.java @@ -17,10 +17,11 @@ package org.adempiere.webui.editor; +import org.adempiere.webui.ValuePreference; import org.adempiere.webui.component.Textbox; import org.adempiere.webui.event.ContextMenuEvent; +import org.adempiere.webui.event.ContextMenuListener; import org.adempiere.webui.event.ValueChangeEvent; -import org.compiere.grid.ed.ValuePreference; import org.compiere.model.GridField; import org.compiere.model.MRole; import org.compiere.util.DisplayType; @@ -33,7 +34,7 @@ import org.zkoss.zk.ui.event.Events; * @date Mar 11, 2007 * @version $Revision: 0.10 $ */ -public class WStringEditor extends WEditor +public class WStringEditor extends WEditor implements ContextMenuListener { private static final String[] LISTENER_EVENTS = {Events.ON_CHANGE}; @@ -41,6 +42,8 @@ public class WStringEditor extends WEditor private String oldText; + private WEditorPopupMenu popupMenu; + public WStringEditor(GridField gridField) { @@ -75,6 +78,8 @@ public class WStringEditor extends WEditor textbox.setMultiline(true); textbox.setRows(8); } + + popupMenu = new WEditorPopupMenu(false, false, true); } public void onEvent(Event event) @@ -129,6 +134,11 @@ public class WStringEditor extends WEditor return LISTENER_EVENTS; } + public WEditorPopupMenu getPopupMenu() + { + return popupMenu; + } + public void onMenu(ContextMenuEvent evt) { if (WEditorPopupMenu.PREFERENCE_EVENT.equals(evt.getContextEvent())) diff --git a/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/editor/WTableDirEditor.java b/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/editor/WTableDirEditor.java index 96dae48253..f50d57f1c5 100644 --- a/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/editor/WTableDirEditor.java +++ b/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/editor/WTableDirEditor.java @@ -22,13 +22,13 @@ import java.beans.PropertyChangeEvent; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; +import org.adempiere.webui.ValuePreference; import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.component.ListItem; import org.adempiere.webui.component.Listbox; import org.adempiere.webui.event.ContextMenuEvent; import org.adempiere.webui.event.ContextMenuListener; import org.adempiere.webui.event.ValueChangeEvent; -import org.compiere.grid.ed.ValuePreference; import org.compiere.model.GridField; import org.compiere.model.Lookup; import org.compiere.model.MRole; diff --git a/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/panel/ADTabpanel.java b/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/panel/ADTabpanel.java index ed26f3178a..163d587555 100644 --- a/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/panel/ADTabpanel.java +++ b/extension/posterita/webui/WEB-INF/src/org/adempiere/webui/panel/ADTabpanel.java @@ -308,6 +308,8 @@ DataStatusListener, ValueChangeListener label.setStyle("cursor: pointer; text-decoration: underline;"); label.addEventListener(Events.ON_CLICK, new ZoomListener((IZoomableEditor) comp)); } + + label.setContext(popupMenu.getId()); } } }