From 1d1ca6bd9902c8dc48caee924aa13ba2eacf8c54 Mon Sep 17 00:00:00 2001 From: Thomas Bayen Date: Wed, 23 Jan 2013 00:59:37 +0100 Subject: [PATCH 01/20] IDEMPIERE-587 Swing: Toolbar Button to start Process from button fields --- .../src/org/compiere/apps/APanel.java | 193 ++++++++++++++++-- .../src/org/compiere/grid/GridController.java | 5 +- 2 files changed, 182 insertions(+), 16 deletions(-) diff --git a/org.adempiere.ui.swing/src/org/compiere/apps/APanel.java b/org.adempiere.ui.swing/src/org/compiere/apps/APanel.java index 1b4418d0fc..282c2d6024 100644 --- a/org.adempiere.ui.swing/src/org/compiere/apps/APanel.java +++ b/org.adempiere.ui.swing/src/org/compiere/apps/APanel.java @@ -19,8 +19,12 @@ package org.compiere.apps; import static org.compiere.model.SystemIDs.PROCESS_AD_CHANGELOG_REDO; import static org.compiere.model.SystemIDs.PROCESS_AD_CHANGELOG_UNDO; +import static org.compiere.model.SystemIDs.REFERENCE_DOCUMENTACTION; +import static org.compiere.model.SystemIDs.REFERENCE_PAYMENTRULE; +import static org.compiere.model.SystemIDs.REFERENCE_POSTED; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; @@ -33,6 +37,9 @@ import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.io.File; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -46,13 +53,17 @@ import java.util.logging.Level; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; +import javax.swing.ImageIcon; +import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JMenu; import javax.swing.JMenuBar; +import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTable; @@ -63,6 +74,7 @@ import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import org.adempiere.ui.swing.factory.DefaultEditorFactory; import org.adempiere.util.Callback; import org.adempiere.util.IProcessUI; import org.compiere.apps.form.FormFrame; @@ -78,6 +90,7 @@ import org.compiere.grid.VSortTab; import org.compiere.grid.VTabbedPane; import org.compiere.grid.ed.VButton; import org.compiere.grid.ed.VDocAction; +import org.compiere.grid.ed.VEditor; import org.compiere.model.DataStatusEvent; import org.compiere.model.DataStatusListener; import org.compiere.model.GridField; @@ -87,10 +100,12 @@ import org.compiere.model.GridWindow; import org.compiere.model.GridWindowVO; import org.compiere.model.GridWorkbench; import org.compiere.model.Lookup; +import org.compiere.model.MLookup; import org.compiere.model.MLookupFactory; import org.compiere.model.MProcess; import org.compiere.model.MQuery; import org.compiere.model.MRole; +import org.compiere.model.MToolBarButton; import org.compiere.model.MToolBarButtonRestrict; import org.compiere.model.MUser; import org.compiere.model.MWindow; @@ -104,9 +119,11 @@ import org.compiere.swing.CPanel; import org.compiere.util.CLogMgt; import org.compiere.util.CLogger; import org.compiere.util.DB; +import org.compiere.util.DisplayType; import org.compiere.util.Env; import org.compiere.util.Language; import org.compiere.util.Msg; +import org.compiere.util.NamePair; import org.compiere.util.Util; /** @@ -308,7 +325,8 @@ public final class APanel extends CPanel aNew, aCopy, aDelete, aPrint, aPrintPreview, aExport = null, aRefresh, aHistory, aAttachment, aChat, aMulti, aFind, - aWorkflow, aZoomAcross, aRequest, aWinSize, aArchive; + aWorkflow, aZoomAcross, aRequest, aWinSize, aArchive, + aProcess; /** Ignore Button */ public AppsAction aIgnore; /** Save Button */ @@ -482,6 +500,9 @@ public final class APanel extends CPanel aOnline = addAction("Online", mHelp, null, false); aMailSupport = addAction("EMailSupport", mHelp, null, false); aAbout = addAction("About", mHelp, null, false); + + // + aProcess=addAction("Process",null,null,false); /** * ToolBar @@ -495,6 +516,7 @@ public final class APanel extends CPanel toolBar.add(aDeleteSelection.getButton()); toolBar.add(aSave.getButton()); toolBar.add(aSaveAndCreate.getButton()); + toolBar.add(aProcess.getButton()); toolBar.addSeparator(); toolBar.add(aRefresh.getButton()); // F5 toolBar.add(aFind.getButton()); @@ -1573,7 +1595,19 @@ public final class APanel extends CPanel aRefresh.setEnabled(true); aAttachment.setEnabled(true); aChat.setEnabled(true); + + // IDEMPIERE-587 - Swing: Toolbar Button to start Process from button fields + // tbayen - 2013-01-22 + GridField[] fields = m_curGC.getMTab().getFields(); + aProcess.setEnabled(false); + for(GridField field:fields){ + if (field.isToolbarButton() && field.isDisplayed()){ + aProcess.setEnabled(true); + break; + } + } } + // m_curWinTab.requestFocusInWindow(); setBusy(false, true); @@ -1725,6 +1759,8 @@ public final class APanel extends CPanel cmd_find(); else if (m_isPersonalLock && cmd.equals(aLock.getName())) cmd_lock(); + else if (cmd.equals(aProcess.getName())) + cmd_process(); // View else if (cmd.equals(aAttachment.getName())) cmd_attachment(); @@ -2088,6 +2124,129 @@ public final class APanel extends CPanel return retValue; } + /** + * opens a pulldown menu to start processes from "Button" type fields. + */ + // IDEMPIERE-587 - Swing: Toolbar Button to start Process from button fields + // tbayen - 2013-01-22 + public void cmd_process() { + GridField[] fields = m_curGC.getMTab().getFields(); + final ArrayList processFields = new ArrayList(); + for (GridField field : fields) { + if (field.isToolbarButton() && field.isDisplayed()) { + processFields.add(field); + } + } + JPopupMenu popup = new JPopupMenu(); + for (GridField field : processFields) { + if (field.isDisplayed(true)) { + ImageIcon icon = Env.getImageIcon2("Process16"); + String text = field.getHeader(); + Color color = null; + // preparing data like lookup tables + // code to find the text and icons to display is shameless + // stolen from org.compiere.grid.ed.VButton + MLookup m_lookup = null; + // Record_ID for Zoom Buttons (see + // http://www.adempiere.com/Entering_Data_-_Fields_and_Buttons#Button) + if (field.getColumnName().endsWith("_ID") + && !field.getColumnName().equals("Record_ID")) { + m_lookup = MLookupFactory.get(Env.getCtx(), + field.getWindowNo(), 0, field.getAD_Column_ID(), + DisplayType.Search); + } else if (field.getAD_Reference_Value_ID() != 0) { + // Assuming List + m_lookup = MLookupFactory.get(Env.getCtx(), + field.getWindowNo(), 0, field.getAD_Column_ID(), + DisplayType.List); + } + + // Special Buttons + int AD_Reference_ID = -1; + String columnName = field.getColumnName(); + if (columnName.equals("PaymentRule")) { + AD_Reference_ID = REFERENCE_PAYMENTRULE; + color = Color.blue; + icon = Env.getImageIcon("Payment16.gif"); // 29*14 + } else if (columnName.equals("DocAction")) { + AD_Reference_ID = REFERENCE_DOCUMENTACTION; + color = Color.blue; + icon = Env.getImageIcon("Process16.gif"); // 16*16 + } else if (columnName.equals("CreateFrom")) { + icon = Env.getImageIcon("Copy16.gif"); // 16*16 + } else if (columnName.equals("Record_ID")) { + icon = Env.getImageIcon("Zoom16.gif"); // 16*16 + text = Msg.getMsg(Env.getCtx(), "ZoomDocument"); + } else if (columnName.equals("Posted")) { + AD_Reference_ID = REFERENCE_POSTED; + color = Color.magenta; + icon = Env.getImageIcon("InfoAccount16.gif"); // 16*16 + } + + Map values = null; + if (AD_Reference_ID > 0) { + values = new HashMap(); + String SQL; + if (Env.isBaseLanguage(Env.getCtx(), "AD_Ref_List")) + SQL = "SELECT Value, Name FROM AD_Ref_List WHERE AD_Reference_ID=?"; + else + SQL = "SELECT l.Value, t.Name FROM AD_Ref_List l, AD_Ref_List_Trl t " + + "WHERE l.AD_Ref_List_ID=t.AD_Ref_List_ID" + + " AND t.AD_Language='" + + Env.getAD_Language(Env.getCtx()) + + "'" + + " AND l.AD_Reference_ID=?"; + try { + PreparedStatement pstmt = DB + .prepareStatement(SQL, null); + pstmt.setInt(1, AD_Reference_ID); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + String value = rs.getString(1); + String name = rs.getString(2); + values.put(value, name); + } + rs.close(); + pstmt.close(); + } catch (SQLException e) { + log.log(Level.SEVERE, SQL, e); + } + + // Nothing to show or Record_ID + if (field.getValue() == null + || field.getColumnName().equals("Record_ID")) + ; + else if (values != null) + text = (String) values.get(field.getValue()); + else if (m_lookup != null) { + NamePair pp = m_lookup.get(field.getValue()); + if (pp != null) + text = pp.getName(); + } + // Display it + } // setValue + + JMenuItem item = new JMenuItem(text, icon); + item.setForeground(color); + item.setName(field.getColumnName()); + popup.add(item); + item.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + JMenuItem menuItem = ((JMenuItem)e.getSource()); + String columnName=menuItem.getName(); + GridField callingField = m_curTab.getField(columnName); + // + setStatusLine(m_curTab.processCallout(callingField), true); + actionButtonCleanUp(menuItem.getName(), + callingField.getAD_Process_ID(), callingField.getHeader()); + } + }); + } + } + popup.show(aProcess.getButton(), 0, aProcess.getButton().getHeight()); + } + /** * Ignore */ @@ -2469,9 +2628,16 @@ public final class APanel extends CPanel * Start Button Process * @param vButton button */ - private void actionButton (VButton vButton) - { + private void actionButton (VButton vButton){ log.info(vButton.toString()); + String title = vButton.getDescription(); + if (title == null || title.length() == 0) + title = vButton.getName(); + actionButtonCleanUp(vButton.getColumnName(), vButton.getProcess_ID(), title); + } + + private void actionButtonCleanUp(String columnName, int processID, String title) + { if (m_curTab.hasChangedCurrentTabAndParents()) { String msg = CLogger.retrieveErrorString("Please ReQuery Window"); @@ -2481,7 +2647,7 @@ public final class APanel extends CPanel boolean startWOasking = false; // boolean batch = false; - String col = vButton.getColumnName(); + String col = columnName; // Zoom if (col.equals("Record_ID")) @@ -2512,7 +2678,7 @@ public final class APanel extends CPanel record_ID = Env.getContextAsInt (m_ctx, m_curWindowNo, "AD_Language_ID"); // Record_ID - Change Log ID if (record_ID == -1 - && (vButton.getProcess_ID() == PROCESS_AD_CHANGELOG_UNDO || vButton.getProcess_ID() == PROCESS_AD_CHANGELOG_REDO)) + && (processID == PROCESS_AD_CHANGELOG_UNDO || processID == PROCESS_AD_CHANGELOG_REDO)) { Integer id = (Integer)m_curTab.getValue("AD_ChangeLog_ID"); record_ID = id.intValue(); @@ -2529,7 +2695,7 @@ public final class APanel extends CPanel if (col.equals("DocAction")) { isProcessMandatory = true; - VDocAction vda = new VDocAction(m_curWindowNo, m_curTab, vButton, record_ID); + VDocAction vda = new VDocAction(m_curWindowNo, m_curTab, null, record_ID); // Something to select from? if (vda.getNumberOfOptions() == 0) { @@ -2552,7 +2718,7 @@ public final class APanel extends CPanel else if (col.equals("CreateFrom")) { // Run form only if the button has no process defined - teo_sarca [ 1974354 ] - if (vButton.getProcess_ID() <= 0) + if (processID <= 0) { ICreateFrom cf = VCreateFromFactory.create(m_curTab); if(cf != null) @@ -2628,8 +2794,8 @@ public final class APanel extends CPanel * or invoke user form */ - log.config("Process_ID=" + vButton.getProcess_ID() + ", Record_ID=" + record_ID); - if (vButton.getProcess_ID() == 0) + log.config("Process_ID=" + processID + ", Record_ID=" + record_ID); + if (processID == 0) { if (isProcessMandatory) { @@ -2643,7 +2809,7 @@ public final class APanel extends CPanel return; // call form - MProcess pr = new MProcess(m_ctx, vButton.getProcess_ID(), null); + MProcess pr = new MProcess(m_ctx, processID, null); int form_ID = pr.getAD_Form_ID(); if (form_ID != 0 ) { @@ -2653,10 +2819,7 @@ public final class APanel extends CPanel return; FormFrame ff = new FormFrame(getGraphicsConfiguration()); - String title = vButton.getDescription(); - if (title == null || title.length() == 0) - title = vButton.getName(); - ProcessInfo pi = new ProcessInfo (title, vButton.getProcess_ID(), table_ID, record_ID); + ProcessInfo pi = new ProcessInfo (title, processID, table_ID, record_ID); pi.setAD_User_ID (Env.getAD_User_ID(m_ctx)); pi.setAD_Client_ID (Env.getAD_Client_ID(m_ctx)); ff.setProcessInfo(pi); @@ -2667,7 +2830,7 @@ public final class APanel extends CPanel } else { ProcessModalDialog dialog = new ProcessModalDialog(m_ctx, AEnv.getWindow(m_curWindowNo), Env.getHeader(m_ctx, m_curWindowNo), - this, m_curWindowNo, vButton.getProcess_ID(), table_ID, + this, m_curWindowNo, processID, table_ID, record_ID, startWOasking); if (dialog.isValidDialog()) { diff --git a/org.adempiere.ui.swing/src/org/compiere/grid/GridController.java b/org.adempiere.ui.swing/src/org/compiere/grid/GridController.java index 626c3a7a31..06511cd5a0 100644 --- a/org.adempiere.ui.swing/src/org/compiere/grid/GridController.java +++ b/org.adempiere.ui.swing/src/org/compiere/grid/GridController.java @@ -370,6 +370,7 @@ public class GridController extends CPanel { vPanel.setBorder(BorderFactory.createLineBorder(AdempierePLAF.getPrimary2())); } + vPane.getVerticalScrollBar().setUnitIncrement(16); // IDEMPIERE-572 - tbayen 2013-01-20 vPane.getViewport().add(xPanel, null); xPanel.add(vPanel, BorderLayout.CENTER); @@ -414,7 +415,9 @@ public class GridController extends CPanel for (int i = 0; i < size; i++) { GridField mField = m_mTab.getField(i); - if (mField.isDisplayed()) + if (mField.isDisplayed() + // IDEMPIERE-587 Swing: Toolbar Button to start Process from button fields + && mField.getDisplayType()!=DisplayType.Button) { VEditor vEditor = VEditorFactory.getEditor(m_mTab, mField, false); if (vEditor == null) From 92a269f2007df09b46db970a4fcc444150426d86 Mon Sep 17 00:00:00 2001 From: Nicolas Micoud Date: Thu, 24 Jan 2013 12:15:23 +0100 Subject: [PATCH 02/20] IDEMPIERE 90 --- .../oracle/2013012430719_IDEMPIERE-90.sql | 40 ++++++++++ .../postgresql/2013012430719_IDEMPIERE-90.sql | 40 ++++++++++ .../src/org/compiere/model/Lookup.java | 23 ++++-- .../org/compiere/model/MAccountLookup.java | 2 +- .../org/compiere/model/MLocationLookup.java | 2 +- .../org/compiere/model/MLocatorLookup.java | 2 +- .../src/org/compiere/model/MLookup.java | 54 ++++++++++++- .../org/compiere/model/MPAttributeLookup.java | 2 +- .../org/compiere/model/MPaymentLookup.java | 4 +- .../src/org/compiere/grid/XLookup.java | 2 +- .../org/compiere/grid/ed/VLocatorDialog.java | 2 +- .../src/org/compiere/grid/ed/VLookup.java | 79 ++++++++++++++++++- .../org/compiere/grid/ed/VPaymentEditor.java | 4 +- .../src/org/compiere/pos/PosPayment.java | 2 +- .../src/org/compiere/swing/CComboBox.java | 17 ++++ .../src/org/adempiere/webui/apps/AEnv.java | 6 +- .../webui/editor/WTableDirEditor.java | 58 +++++++++++++- .../webui/window/WLocatorDialog.java | 2 +- .../org/idempiere/adinterface/ADLookup.java | 4 +- .../adinterface/ModelADServiceImpl.java | 2 +- .../org/idempiere/adinterface/Process.java | 2 +- 21 files changed, 317 insertions(+), 32 deletions(-) create mode 100644 migration/i1.0a-release/oracle/2013012430719_IDEMPIERE-90.sql create mode 100644 migration/i1.0a-release/postgresql/2013012430719_IDEMPIERE-90.sql diff --git a/migration/i1.0a-release/oracle/2013012430719_IDEMPIERE-90.sql b/migration/i1.0a-release/oracle/2013012430719_IDEMPIERE-90.sql new file mode 100644 index 0000000000..eab6751c50 --- /dev/null +++ b/migration/i1.0a-release/oracle/2013012430719_IDEMPIERE-90.sql @@ -0,0 +1,40 @@ +-- Jan 24, 2013 12:10:51 PM CET +-- IDEMPIERE 90 +INSERT INTO AD_Element (AD_Client_ID,AD_Element_ID,AD_Element_UU,AD_Org_ID,ColumnName,Created,CreatedBy,Description,EntityType,Help,IsActive,Name,PrintName,Updated,UpdatedBy) VALUES (0,202202,'7d389ba2-a5c9-4a9f-a93c-a42588b6e62d',0,'IsShortList',TO_DATE('2013-01-24 12:10:49','YYYY-MM-DD HH24:MI:SS'),100,'This record is in the short list','D','The most used records could be set into the short list in order to be selected faster','Y','Short list','Short list',TO_DATE('2013-01-24 12:10:49','YYYY-MM-DD HH24:MI:SS'),100) +; + +-- Jan 24, 2013 12:10:51 PM CET +-- IDEMPIERE 90 +INSERT INTO AD_Element_Trl (AD_Language,AD_Element_ID, Description,Help,Name,PO_Description,PO_Help,PO_Name,PO_PrintName,PrintName, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Element_Trl_UU ) SELECT l.AD_Language,t.AD_Element_ID, t.Description,t.Help,t.Name,t.PO_Description,t.PO_Help,t.PO_Name,t.PO_PrintName,t.PrintName, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Element t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Element_ID=202202 AND NOT EXISTS (SELECT * FROM AD_Element_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Element_ID=t.AD_Element_ID) +; + +-- Jan 24, 2013 12:11:24 PM CET +-- IDEMPIERE 90 +INSERT INTO AD_Message (AD_Client_ID,AD_Message_ID,AD_Message_UU,AD_Org_ID,Created,CreatedBy,EntityType,IsActive,MsgText,MsgType,Updated,UpdatedBy,Value) VALUES (0,200136,'a8e26155-174f-4fdb-b575-ba4bd3fe0523',0,TO_DATE('2013-01-24 12:11:23','YYYY-MM-DD HH24:MI:SS'),100,'D','Y','All records','I',TO_DATE('2013-01-24 12:11:23','YYYY-MM-DD HH24:MI:SS'),100,'ShortListListAllItems') +; + +-- Jan 24, 2013 12:11:24 PM CET +-- IDEMPIERE 90 +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200136 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; + +-- Jan 24, 2013 12:11:32 PM CET +-- IDEMPIERE 90 +INSERT INTO AD_Message (AD_Client_ID,AD_Message_ID,AD_Message_UU,AD_Org_ID,Created,CreatedBy,EntityType,IsActive,MsgText,MsgType,Updated,UpdatedBy,Value) VALUES (0,200137,'eb83b9c3-95c6-4324-870b-975965aa033f',0,TO_DATE('2013-01-24 12:11:32','YYYY-MM-DD HH24:MI:SS'),100,'D','Y','Short list items','I',TO_DATE('2013-01-24 12:11:32','YYYY-MM-DD HH24:MI:SS'),100,'ShortListShortListItems') +; + +-- Jan 24, 2013 12:11:32 PM CET +-- IDEMPIERE 90 +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200137 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; + +-- Jan 24, 2013 12:11:41 PM CET +-- IDEMPIERE 90 +INSERT INTO AD_Message (AD_Client_ID,AD_Message_ID,AD_Message_UU,AD_Org_ID,Created,CreatedBy,EntityType,IsActive,MsgText,MsgType,Updated,UpdatedBy,Value) VALUES (0,200138,'ac962f08-3465-4be3-b330-ba0b4e8e388f',0,TO_DATE('2013-01-24 12:11:40','YYYY-MM-DD HH24:MI:SS'),100,'D','Y','Short list / All','I',TO_DATE('2013-01-24 12:11:40','YYYY-MM-DD HH24:MI:SS'),100,'ShortListSwitchSearchMode') +; + +-- Jan 24, 2013 12:11:41 PM CET +-- IDEMPIERE 90 +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200138 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; + diff --git a/migration/i1.0a-release/postgresql/2013012430719_IDEMPIERE-90.sql b/migration/i1.0a-release/postgresql/2013012430719_IDEMPIERE-90.sql new file mode 100644 index 0000000000..6ace886f75 --- /dev/null +++ b/migration/i1.0a-release/postgresql/2013012430719_IDEMPIERE-90.sql @@ -0,0 +1,40 @@ +-- Jan 24, 2013 12:10:51 PM CET +-- IDEMPIERE 90 +INSERT INTO AD_Element (AD_Client_ID,AD_Element_ID,AD_Element_UU,AD_Org_ID,ColumnName,Created,CreatedBy,Description,EntityType,Help,IsActive,Name,PrintName,Updated,UpdatedBy) VALUES (0,202202,'7d389ba2-a5c9-4a9f-a93c-a42588b6e62d',0,'IsShortList',TO_TIMESTAMP('2013-01-24 12:10:49','YYYY-MM-DD HH24:MI:SS'),100,'This record is in the short list','D','The most used records could be set into the short list in order to be selected faster','Y','Short list','Short list',TO_TIMESTAMP('2013-01-24 12:10:49','YYYY-MM-DD HH24:MI:SS'),100) +; + +-- Jan 24, 2013 12:10:51 PM CET +-- IDEMPIERE 90 +INSERT INTO AD_Element_Trl (AD_Language,AD_Element_ID, Description,Help,Name,PO_Description,PO_Help,PO_Name,PO_PrintName,PrintName, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Element_Trl_UU ) SELECT l.AD_Language,t.AD_Element_ID, t.Description,t.Help,t.Name,t.PO_Description,t.PO_Help,t.PO_Name,t.PO_PrintName,t.PrintName, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Element t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Element_ID=202202 AND NOT EXISTS (SELECT * FROM AD_Element_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Element_ID=t.AD_Element_ID) +; + +-- Jan 24, 2013 12:11:24 PM CET +-- IDEMPIERE 90 +INSERT INTO AD_Message (AD_Client_ID,AD_Message_ID,AD_Message_UU,AD_Org_ID,Created,CreatedBy,EntityType,IsActive,MsgText,MsgType,Updated,UpdatedBy,Value) VALUES (0,200136,'a8e26155-174f-4fdb-b575-ba4bd3fe0523',0,TO_TIMESTAMP('2013-01-24 12:11:23','YYYY-MM-DD HH24:MI:SS'),100,'D','Y','All records','I',TO_TIMESTAMP('2013-01-24 12:11:23','YYYY-MM-DD HH24:MI:SS'),100,'ShortListListAllItems') +; + +-- Jan 24, 2013 12:11:24 PM CET +-- IDEMPIERE 90 +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200136 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; + +-- Jan 24, 2013 12:11:32 PM CET +-- IDEMPIERE 90 +INSERT INTO AD_Message (AD_Client_ID,AD_Message_ID,AD_Message_UU,AD_Org_ID,Created,CreatedBy,EntityType,IsActive,MsgText,MsgType,Updated,UpdatedBy,Value) VALUES (0,200137,'eb83b9c3-95c6-4324-870b-975965aa033f',0,TO_TIMESTAMP('2013-01-24 12:11:32','YYYY-MM-DD HH24:MI:SS'),100,'D','Y','Short list items','I',TO_TIMESTAMP('2013-01-24 12:11:32','YYYY-MM-DD HH24:MI:SS'),100,'ShortListShortListItems') +; + +-- Jan 24, 2013 12:11:32 PM CET +-- IDEMPIERE 90 +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200137 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; + +-- Jan 24, 2013 12:11:41 PM CET +-- IDEMPIERE 90 +INSERT INTO AD_Message (AD_Client_ID,AD_Message_ID,AD_Message_UU,AD_Org_ID,Created,CreatedBy,EntityType,IsActive,MsgText,MsgType,Updated,UpdatedBy,Value) VALUES (0,200138,'ac962f08-3465-4be3-b330-ba0b4e8e388f',0,TO_TIMESTAMP('2013-01-24 12:11:40','YYYY-MM-DD HH24:MI:SS'),100,'D','Y','Short list / All','I',TO_TIMESTAMP('2013-01-24 12:11:40','YYYY-MM-DD HH24:MI:SS'),100,'ShortListSwitchSearchMode') +; + +-- Jan 24, 2013 12:11:41 PM CET +-- IDEMPIERE 90 +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200138 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; + diff --git a/org.adempiere.base/src/org/compiere/model/Lookup.java b/org.adempiere.base/src/org/compiere/model/Lookup.java index e3bafc583e..b74d8a15f0 100644 --- a/org.adempiere.base/src/org/compiere/model/Lookup.java +++ b/org.adempiere.base/src/org/compiere/model/Lookup.java @@ -76,6 +76,8 @@ public abstract class Lookup extends AbstractListModel private boolean m_loaded; + private boolean m_shortList; // IDEMPIERE 90 + /** * Get Display Type * @return display type @@ -259,7 +261,7 @@ public abstract class Lookup extends AbstractListModel * @param temporary save current values - restore via fillComboBox (true) */ public void fillComboBox (boolean mandatory, boolean onlyValidated, - boolean onlyActive, boolean temporary) + boolean onlyActive, boolean temporary, boolean shortList) // IDEMPIERE 90 { long startTime = System.currentTimeMillis(); m_loaded = false; @@ -279,7 +281,7 @@ public abstract class Lookup extends AbstractListModel p_data.clear(); // may cause delay *** The Actual Work *** - p_data = getData (mandatory, onlyValidated, onlyActive, temporary); + p_data = getData (mandatory, onlyValidated, onlyActive, temporary, shortList); // IDEMPIERE 90 // Selected Object changed if (obj != m_selectedObject) @@ -335,7 +337,7 @@ public abstract class Lookup extends AbstractListModel return; } if (p_data != null) - fillComboBox(isMandatory(), true, true, false); + fillComboBox(isMandatory(), true, true, false, false); // IDEMPIERE 90 } // fillComboBox @@ -363,7 +365,7 @@ public abstract class Lookup extends AbstractListModel * @return ArrayList */ public abstract ArrayList getData (boolean mandatory, - boolean onlyValidated, boolean onlyActive, boolean temporary); + boolean onlyValidated, boolean onlyActive, boolean temporary, boolean shortlist); // IDEMPIERE 90 /** * Get underlying fully qualified Table.Column Name. @@ -503,5 +505,16 @@ public abstract class Lookup extends AbstractListModel { return m_loaded; } - + + // IDEMPIERE 90 + public void setShortList(boolean shortlist) + { + m_shortList = shortlist; + } + + public boolean isShortList() + { + return m_shortList; + } + // IDEMPIERE 90 } // Lookup diff --git a/org.adempiere.base/src/org/compiere/model/MAccountLookup.java b/org.adempiere.base/src/org/compiere/model/MAccountLookup.java index 1f08b62883..4ee55f2d48 100644 --- a/org.adempiere.base/src/org/compiere/model/MAccountLookup.java +++ b/org.adempiere.base/src/org/compiere/model/MAccountLookup.java @@ -173,7 +173,7 @@ public final class MAccountLookup extends Lookup implements Serializable * @return ArrayList with KeyNamePair */ public ArrayList getData (boolean mandatory, boolean onlyValidated, - boolean onlyActive, boolean temporary) + boolean onlyActive, boolean temporary, boolean isshortlist) // IDEMPIERE 90 { ArrayList list = new ArrayList(); if (!mandatory) diff --git a/org.adempiere.base/src/org/compiere/model/MLocationLookup.java b/org.adempiere.base/src/org/compiere/model/MLocationLookup.java index 85f3b3286d..91c8d8747b 100644 --- a/org.adempiere.base/src/org/compiere/model/MLocationLookup.java +++ b/org.adempiere.base/src/org/compiere/model/MLocationLookup.java @@ -144,7 +144,7 @@ public final class MLocationLookup extends Lookup * @param temporary force load for temporary display * @return null */ - public ArrayList getData (boolean mandatory, boolean onlyValidated, boolean onlyActive, boolean temporary) + public ArrayList getData (boolean mandatory, boolean onlyValidated, boolean onlyActive, boolean temporary, boolean shortlist) // IDEMPIERE 90 { log.log(Level.SEVERE, "not implemented"); return null; diff --git a/org.adempiere.base/src/org/compiere/model/MLocatorLookup.java b/org.adempiere.base/src/org/compiere/model/MLocatorLookup.java index 26c2b17a36..9bddcbeac2 100644 --- a/org.adempiere.base/src/org/compiere/model/MLocatorLookup.java +++ b/org.adempiere.base/src/org/compiere/model/MLocatorLookup.java @@ -414,7 +414,7 @@ public final class MLocatorLookup extends Lookup implements Serializable * @param temporary force load for temporary display * @return ArrayList of lookup values */ - public ArrayList getData (boolean mandatory, boolean onlyValidated, boolean onlyActive, boolean temporary) + public ArrayList getData (boolean mandatory, boolean onlyValidated, boolean onlyActive, boolean temporary, boolean shortlist) // IDEMPIERE 90 { // create list Collection collection = getData(); diff --git a/org.adempiere.base/src/org/compiere/model/MLookup.java b/org.adempiere.base/src/org/compiere/model/MLookup.java index 7fb3a8331b..4af0858f21 100644 --- a/org.adempiere.base/src/org/compiere/model/MLookup.java +++ b/org.adempiere.base/src/org/compiere/model/MLookup.java @@ -103,7 +103,6 @@ public final class MLookup extends Lookup implements Serializable /** Indicator for Null */ private static Integer MINUS_ONE = new Integer(-1); - /** The Lookup Info Value Object */ private MLookupInfo m_info = null; @@ -122,7 +121,14 @@ public final class MLookup extends Lookup implements Serializable private boolean m_refreshing = false; /** Next Read for Parent */ private long m_nextRead = 0; - + + /** Not in short List item Marker Start IDEMPIERE 90 */ + public static final String SHORTLIST_S = "*"; + /** Not in short List item Marker End IDEMPIERE 90 */ + public static final String SHORTLIST_E = "*"; + + private boolean m_hasShortListItems = false; // IDEMPIERE 90 + /** * Dispose */ @@ -391,9 +397,10 @@ public final class MLookup extends Lookup implements Serializable * @param onlyValidated only validated * @param onlyActive only active * @param temporary force load for temporary display + * @param isshortlist * @return list */ - public ArrayList getData (boolean mandatory, boolean onlyValidated, boolean onlyActive, boolean temporary) + public ArrayList getData (boolean mandatory, boolean onlyValidated, boolean onlyActive, boolean temporary, boolean shortlist) // idempiere 90 { // create list ArrayList list = getData (onlyValidated, true); @@ -414,6 +421,23 @@ public final class MLookup extends Lookup implements Serializable } } + // Remove non short list items IDEMPIERE 90 + if (shortlist && m_hasShortListItems) + { + // list from the back + for (int i = list.size(); i > 0; i--) + { + Object o = list.get(i-1); + if (o != null) + { + String s = o.toString(); + if (s.startsWith(SHORTLIST_S) && s.endsWith(SHORTLIST_E)) + list.remove(i-1); + } + } + } + // End Remove non short list items IDEMPIERE 90 + // Add Optional (empty) selection if (!mandatory) { @@ -597,7 +621,7 @@ public final class MLookup extends Lookup implements Serializable m_refreshing = true; //force refresh m_lookup.clear(); - fillComboBox(isMandatory(), true, true, false); + fillComboBox(isMandatory(), true, true, false, isShortList()); // idempiere 90 m_refreshing = false; return m_lookup.size(); } // refresh @@ -677,6 +701,17 @@ public final class MLookup extends Lookup implements Serializable MLookupCache.loadStart (m_info); StringBuilder sql = new StringBuilder().append(m_info.Query); + // IDEMPIERE 90 + if (isShortList()) + { + // Adding ", IsShortList" to the sql SELECT clause + int posFirstPoint = sql.indexOf("."); + String tableName = sql.substring(7, posFirstPoint); + int posFirstFrom = sql.indexOf(tableName+".IsActive FROM "+tableName) + tableName.length() + 9 ; // 9 = .IsActive + String ClauseFromWhereOrder = sql.substring(posFirstFrom, sql.length()); + sql = new StringBuilder(sql.substring(0, posFirstFrom) + ", " + tableName + ".IsShortList" + ClauseFromWhereOrder); + } // IDEMPIERE 90 + // not validated if (!m_info.IsValidated) { @@ -768,6 +803,17 @@ public final class MLookup extends Lookup implements Serializable name = new StringBuilder(INACTIVE_S).append(name).append(INACTIVE_E); m_hasInactive = true; } + // IDEMPIERE 90 + if (isShortList()) + { + boolean isShortListItem = rs.getString(5).equals("Y"); + if (!isShortListItem) + { + name = new StringBuilder(SHORTLIST_S).append(name).append(SHORTLIST_S); + m_hasShortListItems = true; + } + } + // IDEMPIERE 90 if (isNumber) { int key = rs.getInt(1); diff --git a/org.adempiere.base/src/org/compiere/model/MPAttributeLookup.java b/org.adempiere.base/src/org/compiere/model/MPAttributeLookup.java index 08471716b7..2f0b4556d2 100644 --- a/org.adempiere.base/src/org/compiere/model/MPAttributeLookup.java +++ b/org.adempiere.base/src/org/compiere/model/MPAttributeLookup.java @@ -168,7 +168,7 @@ public class MPAttributeLookup extends Lookup * @param temporary force load for temporary display * @return null */ - public ArrayList getData (boolean mandatory, boolean onlyValidated, boolean onlyActive, boolean temporary) + public ArrayList getData (boolean mandatory, boolean onlyValidated, boolean onlyActive, boolean temporary, boolean shortlist) // IDEMPIERE 90 { log.log(Level.SEVERE, "Not implemented"); return null; diff --git a/org.adempiere.base/src/org/compiere/model/MPaymentLookup.java b/org.adempiere.base/src/org/compiere/model/MPaymentLookup.java index 1aad341ce0..9d0610145b 100644 --- a/org.adempiere.base/src/org/compiere/model/MPaymentLookup.java +++ b/org.adempiere.base/src/org/compiere/model/MPaymentLookup.java @@ -199,7 +199,7 @@ public class MPaymentLookup extends Lookup implements Serializable { @Override public ArrayList getData(boolean mandatory, boolean onlyValidated, - boolean onlyActive, boolean temporary) { + boolean onlyActive, boolean temporary, boolean shortlist) { // IDEMPIERE 90 ArrayList list = new ArrayList(); ValueNamePair[] values = getData(); @@ -220,7 +220,7 @@ public class MPaymentLookup extends Lookup implements Serializable { @Override public int refresh() { - fillComboBox(isMandatory(), true, true, false); + fillComboBox(isMandatory(), true, true, false, false); // IDEMPIERE 90 return super.getSize(); } } diff --git a/org.adempiere.ui.swing/src/org/compiere/grid/XLookup.java b/org.adempiere.ui.swing/src/org/compiere/grid/XLookup.java index 478648521b..b9b32f5e3c 100644 --- a/org.adempiere.ui.swing/src/org/compiere/grid/XLookup.java +++ b/org.adempiere.ui.swing/src/org/compiere/grid/XLookup.java @@ -125,7 +125,7 @@ public class XLookup extends Lookup * @return list of data */ public ArrayList getData (boolean mandatory, - boolean onlyValidated, boolean onlyActive, boolean temporary) + boolean onlyValidated, boolean onlyActive, boolean temporary, boolean shortlist) // IDEMPIERE 90 { ArrayList list = new ArrayList(p_data); diff --git a/org.adempiere.ui.swing/src/org/compiere/grid/ed/VLocatorDialog.java b/org.adempiere.ui.swing/src/org/compiere/grid/ed/VLocatorDialog.java index 7811783123..736c3cd8fb 100644 --- a/org.adempiere.ui.swing/src/org/compiere/grid/ed/VLocatorDialog.java +++ b/org.adempiere.ui.swing/src/org/compiere/grid/ed/VLocatorDialog.java @@ -243,7 +243,7 @@ public class VLocatorDialog extends CDialog log.fine("Warehouses=" + fWarehouse.getItemCount()); // Load existing Locators - m_mLocator.fillComboBox(m_mandatory, true, true, false); + m_mLocator.fillComboBox(m_mandatory, true, true, false, false); // IDEMPIERE 90 log.fine(m_mLocator.toString()); fLocator.setModel(m_mLocator); fLocator.setValue(m_M_Locator_ID); diff --git a/org.adempiere.ui.swing/src/org/compiere/grid/ed/VLookup.java b/org.adempiere.ui.swing/src/org/compiere/grid/ed/VLookup.java index fd65f8c548..8c7406b950 100644 --- a/org.adempiere.ui.swing/src/org/compiere/grid/ed/VLookup.java +++ b/org.adempiere.ui.swing/src/org/compiere/grid/ed/VLookup.java @@ -64,6 +64,7 @@ import org.compiere.model.MLookup; import org.compiere.model.MLookupFactory; import org.compiere.model.MQuery; import org.compiere.model.MRole; +import org.compiere.model.MTable; import org.compiere.swing.CButton; import org.compiere.swing.CMenuItem; import org.compiere.swing.CTextField; @@ -272,12 +273,39 @@ public class VLookup extends JComponent else m_button.setIcon(Env.getImageIcon("PickOpen10.gif")); + // IDEMPIERE 90 + boolean isShortListAvailable = false; // Short List available for this lookup + if (m_lookup != null && (m_lookup.getDisplayType() == DisplayType.TableDir || m_lookup.getDisplayType() == DisplayType.Table)) // only for Table & TableDir + { + String tableName_temp = m_lookup.getColumnName(); // Returns AD_Org.AD_Org_ID + int posPoint = tableName_temp.indexOf("."); + String tableName = tableName_temp.substring(0, posPoint); + int table_id = MTable.getTable_ID(tableName); // now we got the ad_table_id + + String sql = "SELECT COUNT(*) FROM AD_Column WHERE ColumnName = 'IsShortList' AND IsActive='Y' AND AD_Table_ID = " + table_id; + isShortListAvailable = DB.getSQLValue(null, sql) == 1; // if the table has an active IsShortList column, we could use the restrict search ! + + if (isShortListAvailable) + { + setComboShortList(true); + m_lookup.setShortList(true); + + m_buttonSL.addActionListener(this); + m_buttonSL.addMouseListener(mouseAdapter); + m_buttonSL.setFocusable(false); // don't focus when tabbing + m_buttonSL.setMargin(new Insets(0, 0, 0, 0)); + m_buttonSL.setIcon(Env.getImageIcon("LockX16.gif")); + m_buttonSL.setToolTipText(Msg.getMsg(Env.getCtx(), "ShortListShortListItems")); + } + } + // IDEMPIERE 90 + // *** VComboBox *** if (m_lookup != null && m_lookup.getDisplayType() != DisplayType.Search) // No Search { // Don't have to fill up combobox if it is readonly if (!isReadOnly && isUpdateable) - m_lookup.fillComboBox (isMandatory(), true, true, false); + m_lookup.fillComboBox (isMandatory(), true, true, false, isShortListAvailable); // IDEMPIERE 90 m_combo.setModel(m_lookup); // // AutoCompletion.enable(m_combo); @@ -342,6 +370,7 @@ public class VLookup extends JComponent m_button = null; m_lookup = null; m_mField = null; + m_buttonSL = null; // IDEMPIERE 90 // m_combo.getEditor().getEditorComponent().removeFocusListener(this); m_combo.getEditor().getEditorComponent().removeMouseListener(mouseAdapter); @@ -394,6 +423,11 @@ public class VLookup extends JComponent // Mouse Listener private VLookup_mouseAdapter mouseAdapter; + /** ShortList button IDEMPIERE 90 */ + private CButton m_buttonSL = new CButton(); + + /** All items or only those of the short list ?*/ + boolean onlyShortListItems = false; // Field for Value Preference private GridField m_mField = null; @@ -417,11 +451,13 @@ public class VLookup extends JComponent m_text.setBorder(null); Dimension bSize = new Dimension(size.height, size.height); m_button.setPreferredSize (bSize); + m_buttonSL.setPreferredSize (bSize); // IDEMPIERE 90 } // What to show this.remove(m_combo); this.remove(m_button); + this.remove(m_buttonSL); // IDEMPIERE 90 this.remove(m_text); // if (!isReadWrite()) // r/o - show text only @@ -437,6 +473,9 @@ public class VLookup extends JComponent this.setBorder(null); this.add(m_combo, BorderLayout.CENTER); m_comboActive = true; + // IDEMPIERE 90 + if (isComboShortList()) + this.add(m_buttonSL, BorderLayout.EAST); // add a button for short list items <-> all items } else // Search or unstable - show text & button { @@ -761,6 +800,8 @@ public class VLookup extends JComponent actionBPartner(false); else if (e.getSource() == m_location) actionLocation(); + else if (e.getSource() == m_buttonSL) // IDEMPIERE 90 + actionShortList(); } // actionPerformed /** @@ -1463,7 +1504,7 @@ public class VLookup extends JComponent else { m_lookup.refresh(); - m_lookup.fillComboBox(isMandatory(), true, true, false); + m_lookup.fillComboBox(isMandatory(), true, true, false, isComboShortList()); // IDEMPIERE 90 m_combo.setSelectedItem(obj); //m_combo.revalidate(); } @@ -1501,7 +1542,7 @@ public class VLookup extends JComponent + " - Start Count=" + m_combo.getItemCount() + ", Selected=" + obj); // log.fine( "VLookupHash=" + this.hashCode()); boolean popupVisible = m_combo.isPopupVisible(); - m_lookup.fillComboBox(isMandatory(), true, true, false); // only validated & active + m_lookup.fillComboBox(isMandatory(), true, true, false, isComboShortList()); // only validated & active + IDEMPIERE 90 if (popupVisible) { //refresh @@ -1525,6 +1566,7 @@ public class VLookup extends JComponent { if (e.isTemporary() || m_lookup == null + || !m_buttonSL.isEnabled() // IDEMPIERE 90 || !m_button.isEnabled() ) // set by actionButton return; // Text Lost focus @@ -1642,5 +1684,36 @@ public class VLookup extends JComponent m_stopediting = stopediting; } + // IDEMPIERE 90 + private void actionShortList () + { + if (onlyShortListItems) + { + onlyShortListItems = false; + m_lookup.setShortList(true); + refresh(); + m_lookup.fillComboBox(isMandatory(), true, true, false, isComboShortList()); + m_buttonSL.setIcon(Env.getImageIcon("LockX16.gif")); + m_buttonSL.setToolTipText(Msg.getMsg(Env.getCtx(), "ShortListOnlyShortListItems")); + }else{ + onlyShortListItems = true; + m_lookup.setShortList(false); + m_buttonSL.setIcon(Env.getImageIcon("Lock16.gif")); + m_buttonSL.setToolTipText(Msg.getMsg(Env.getCtx(), "ShortListAllItems")); + } + + actionRefresh(); + } // actionShortList + + public void setComboShortList (boolean shortList) + { + m_combo.setShortListSearch(shortList); + } // setComboShortList + + public boolean isComboShortList() + { + return m_combo.isShortListSearch(); + } // isComboShortList + // IDEMPIERE 90 } // VLookup \ No newline at end of file diff --git a/org.adempiere.ui.swing/src/org/compiere/grid/ed/VPaymentEditor.java b/org.adempiere.ui.swing/src/org/compiere/grid/ed/VPaymentEditor.java index c9cbfc06e3..842d2a073a 100644 --- a/org.adempiere.ui.swing/src/org/compiere/grid/ed/VPaymentEditor.java +++ b/org.adempiere.ui.swing/src/org/compiere/grid/ed/VPaymentEditor.java @@ -104,7 +104,7 @@ public class VPaymentEditor extends JComponent implements VEditor, ActionListene { // Don't have to fill up combobox if it is readonly if (!isReadOnly && isUpdateable) - m_lookup.fillComboBox (isMandatory(), true, true, false); + m_lookup.fillComboBox (isMandatory(), true, true, false, false); // IDEMPIERE 90 m_combo.setModel(m_lookup); // // AutoCompletion.enable(m_combo); @@ -472,7 +472,7 @@ public class VPaymentEditor extends JComponent implements VEditor, ActionListene + " - Start Count=" + m_combo.getItemCount() + ", Selected=" + obj); // log.fine( "VLookupHash=" + this.hashCode()); boolean popupVisible = m_combo.isPopupVisible(); - m_lookup.fillComboBox(isMandatory(), true, true, false); // only validated & active + m_lookup.fillComboBox(isMandatory(), true, true, false, false); // only validated & active + IDEMPIERE 90 if (popupVisible) { //refresh diff --git a/org.adempiere.ui.swing/src/org/compiere/pos/PosPayment.java b/org.adempiere.ui.swing/src/org/compiere/pos/PosPayment.java index 7c0279aa41..71d2169968 100644 --- a/org.adempiere.ui.swing/src/org/compiere/pos/PosPayment.java +++ b/org.adempiere.ui.swing/src/org/compiere/pos/PosPayment.java @@ -250,7 +250,7 @@ public class PosPayment extends CDialog implements PosKeyListener, VetoableChang // Payment type selection int AD_Column_ID = COLUMN_C_PAYMENT_V_TENDERTYPE; //C_Payment_v.TenderType MLookup lookup = MLookupFactory.get(Env.getCtx(), 0, 0, AD_Column_ID, DisplayType.List); - ArrayList types = lookup.getData(true, false, true, true); + ArrayList types = lookup.getData(true, false, true, true, false); // IDEMPIERE 90 DefaultComboBoxModel typeModel = new DefaultComboBoxModel(types.toArray()); tenderTypePick.setModel(typeModel); diff --git a/org.adempiere.ui.swing/src/org/compiere/swing/CComboBox.java b/org.adempiere.ui.swing/src/org/compiere/swing/CComboBox.java index 53b712308f..1e98c2ff60 100644 --- a/org.adempiere.ui.swing/src/org/compiere/swing/CComboBox.java +++ b/org.adempiere.ui.swing/src/org/compiere/swing/CComboBox.java @@ -984,4 +984,21 @@ public class CComboBox extends JComboBox } } // ReducibleKeyListener + // IDEMPIERE 90 + /** show only short list items or all ? */ + private boolean m_ShortListSearch = false; + + /** set the editor to return only short list items */ + public void setShortListSearch (boolean shortList) + { + m_ShortListSearch = shortList; + } // setShortListSearch + + /** does the search should return only short list items ? */ + public boolean isShortListSearch() + { + return m_ShortListSearch; + } // isShortListSearch + + // IDEMPIERE 90 } // CComboBox diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AEnv.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AEnv.java index 555e1a1acd..4cc2770b49 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AEnv.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AEnv.java @@ -407,16 +407,16 @@ public final class AEnv } // canAccessInfo - public static void actionRefresh(Lookup lookup, Object value, boolean mandatory) + public static void actionRefresh(Lookup lookup, Object value, boolean mandatory, boolean shortList) // IDEMPIERE 90 { if (lookup == null) return; lookup.refresh(); if (lookup.isValidated()) - lookup.fillComboBox(mandatory, false, false, false); + lookup.fillComboBox(mandatory, false, false, false, shortList); // IDEMPIERE 90 else - lookup.fillComboBox(mandatory, true, false, false); + lookup.fillComboBox(mandatory, true, false, false, shortList); // IDEMPIERE 90 } /** * diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WTableDirEditor.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WTableDirEditor.java index 4a5a12eece..ded84de208 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WTableDirEditor.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WTableDirEditor.java @@ -36,7 +36,9 @@ import org.compiere.model.GridField; import org.compiere.model.Lookup; import org.compiere.model.MBPartnerLocation; import org.compiere.model.MLocation; +import org.compiere.model.MTable; import org.compiere.util.CLogger; +import org.compiere.util.DB; import org.compiere.util.DisplayType; import org.compiere.util.Env; import org.compiere.util.KeyNamePair; @@ -47,6 +49,7 @@ 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.Comboitem; +import org.zkoss.zul.Menuitem; /** * @@ -69,7 +72,10 @@ ContextMenuListener, IZoomableEditor private Lookup lookup; private Object oldValue; - + + public static final String SHORT_LIST_EVENT = "SHORT_LIST"; // IDEMPIERE 90 + protected boolean onlyShortListItems; // IDEMPIERE 90 + public WTableDirEditor(GridField gridField) { super(new Combobox(), gridField); @@ -159,6 +165,37 @@ ContextMenuListener, IZoomableEditor popupMenu = new WEditorPopupMenu(zoom, true, isShowPreference(), false, false, false, lookup); } addChangeLogMenu(popupMenu); + + // IDEMPIERE 90 + boolean isShortListAvailable = false; // Short List available for this lookup + if (lookup != null && (lookup.getDisplayType() == DisplayType.TableDir || lookup.getDisplayType() == DisplayType.Table)) // only for Table & TableDir + { + String tableName_temp = lookup.getColumnName(); // Returns AD_Org.AD_Org_ID + int posPoint = tableName_temp.indexOf("."); + String tableName = tableName_temp.substring(0, posPoint); + int table_id = MTable.getTable_ID(tableName); // now we got the ad_table_id + + String sql = "SELECT COUNT(*) FROM AD_Column WHERE ColumnName = 'IsShortList' AND IsActive='Y' AND AD_Table_ID = " + table_id; + isShortListAvailable = DB.getSQLValue(null, sql) == 1; // if the table has an active isShortList column, we could use the restrict search ! + + if (isShortListAvailable) + { + onlyShortListItems=true; + lookup.setShortList(true); + getLabel().setText(">" + getGridField().getHeader() + "<"); + actionRefresh(); + + // add in popup menu + Menuitem searchMode; + searchMode = new Menuitem(); + searchMode.setAttribute(WEditorPopupMenu.EVENT_ATTRIBUTE, SHORT_LIST_EVENT); + searchMode.setLabel(Msg.getMsg(Env.getCtx(), "ShortListSwitchSearchMode")); + searchMode.setImage("/images/Lock16.png"); + searchMode.addEventListener(Events.ON_CLICK, popupMenu); + popupMenu.appendChild(searchMode); + } + } + // IDEMPIERE 90 } } @@ -493,6 +530,25 @@ ContextMenuListener, IZoomableEditor { actionLocation(); } + // IDEMPIERE 90 + else if (SHORT_LIST_EVENT.equals(evt.getContextEvent())) + { + String champ = getGridField().getHeader(); + + if(onlyShortListItems) + { + onlyShortListItems=false; + lookup.setShortList(false); + actionRefresh(); + getLabel().setText(champ); + }else{ + onlyShortListItems=true; + lookup.setShortList(true); + actionRefresh(); + getLabel().setText(">" + champ + "<"); + } + } + // IDEMPIERE 90 } public void propertyChange(PropertyChangeEvent evt) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WLocatorDialog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WLocatorDialog.java index 454e89d211..79ee5c72e7 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WLocatorDialog.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WLocatorDialog.java @@ -328,7 +328,7 @@ public class WLocatorDialog extends Window implements EventListener // Load existing Locators - m_mLocator.fillComboBox(m_mandatory, true, true, false); + m_mLocator.fillComboBox(m_mandatory, true, true, false, false); // IDEMPIERE 90 log.fine(m_mLocator.toString()); diff --git a/org.idempiere.webservices/WEB-INF/src/org/idempiere/adinterface/ADLookup.java b/org.idempiere.webservices/WEB-INF/src/org/idempiere/adinterface/ADLookup.java index c0b11ae5c3..ac7a96b4cf 100644 --- a/org.idempiere.webservices/WEB-INF/src/org/idempiere/adinterface/ADLookup.java +++ b/org.idempiere.webservices/WEB-INF/src/org/idempiere/adinterface/ADLookup.java @@ -19,12 +19,12 @@ public class ADLookup { protected static CLogger log = CLogger.getCLogger(ADLookup.class); - public static void fillLookupValues( LookupValues lvs, Lookup lookup, boolean isMandatory, boolean isReadOnly ) + public static void fillLookupValues( LookupValues lvs, Lookup lookup, boolean isMandatory, boolean isReadOnly, boolean isShortList) // IDEMPIERE 90 { if(lookup.getSize() == 0) lookup.refresh(); - Object[] list = lookup.getData(isMandatory, true, !isReadOnly, false).toArray(); + Object[] list = lookup.getData(isMandatory, true, !isReadOnly, false, isShortList).toArray(); // IDEMPIERE 90 for (int i=0; i Date: Thu, 24 Jan 2013 17:41:49 +0100 Subject: [PATCH 03/20] IDEMPIERE-587 - Swing: Toolbar Button to start Process from button fields --- .../src/org/compiere/apps/APanel.java | 29 ++++++++++++++----- .../src/org/compiere/grid/GridController.java | 5 +++- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/org.adempiere.ui.swing/src/org/compiere/apps/APanel.java b/org.adempiere.ui.swing/src/org/compiere/apps/APanel.java index 282c2d6024..df07d5af10 100644 --- a/org.adempiere.ui.swing/src/org/compiere/apps/APanel.java +++ b/org.adempiere.ui.swing/src/org/compiere/apps/APanel.java @@ -54,7 +54,6 @@ import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.ImageIcon; -import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JList; @@ -73,8 +72,9 @@ import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; -import org.adempiere.ui.swing.factory.DefaultEditorFactory; import org.adempiere.util.Callback; import org.adempiere.util.IProcessUI; import org.compiere.apps.form.FormFrame; @@ -90,7 +90,6 @@ import org.compiere.grid.VSortTab; import org.compiere.grid.VTabbedPane; import org.compiere.grid.ed.VButton; import org.compiere.grid.ed.VDocAction; -import org.compiere.grid.ed.VEditor; import org.compiere.model.DataStatusEvent; import org.compiere.model.DataStatusListener; import org.compiere.model.GridField; @@ -105,7 +104,6 @@ import org.compiere.model.MLookupFactory; import org.compiere.model.MProcess; import org.compiere.model.MQuery; import org.compiere.model.MRole; -import org.compiere.model.MToolBarButton; import org.compiere.model.MToolBarButtonRestrict; import org.compiere.model.MUser; import org.compiere.model.MWindow; @@ -275,7 +273,7 @@ public final class APanel extends CPanel // Prepare GC this.removeAll(); } // dispose - + /** * The Layout. */ @@ -1599,13 +1597,14 @@ public final class APanel extends CPanel // IDEMPIERE-587 - Swing: Toolbar Button to start Process from button fields // tbayen - 2013-01-22 GridField[] fields = m_curGC.getMTab().getFields(); - aProcess.setEnabled(false); + boolean processEnabled=false; for(GridField field:fields){ if (field.isToolbarButton() && field.isDisplayed()){ - aProcess.setEnabled(true); + processEnabled=true; break; } } + aProcess.setEnabled(processEnabled); } // @@ -2124,12 +2123,16 @@ public final class APanel extends CPanel return retValue; } + private long m_popup_closingtime=0; + /** * opens a pulldown menu to start processes from "Button" type fields. */ // IDEMPIERE-587 - Swing: Toolbar Button to start Process from button fields // tbayen - 2013-01-22 public void cmd_process() { + if(System.currentTimeMillis()-m_popup_closingtime<200) + return; // closed through the same click - user has clicked to close the menu GridField[] fields = m_curGC.getMTab().getFields(); final ArrayList processFields = new ArrayList(); for (GridField field : fields) { @@ -2138,6 +2141,16 @@ public final class APanel extends CPanel } } JPopupMenu popup = new JPopupMenu(); + popup.addPopupMenuListener(new PopupMenuListener() { + @Override + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + m_popup_closingtime=System.currentTimeMillis(); + } + + @Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) {} + @Override public void popupMenuCanceled(PopupMenuEvent e) {} + }); + for (GridField field : processFields) { if (field.isDisplayed(true)) { ImageIcon icon = Env.getImageIcon2("Process16"); @@ -2244,7 +2257,7 @@ public final class APanel extends CPanel }); } } - popup.show(aProcess.getButton(), 0, aProcess.getButton().getHeight()); + popup.show(aProcess.getButton(), -1, aProcess.getButton().getHeight()); } /** diff --git a/org.adempiere.ui.swing/src/org/compiere/grid/GridController.java b/org.adempiere.ui.swing/src/org/compiere/grid/GridController.java index 06511cd5a0..4c37b8050d 100644 --- a/org.adempiere.ui.swing/src/org/compiere/grid/GridController.java +++ b/org.adempiere.ui.swing/src/org/compiere/grid/GridController.java @@ -417,7 +417,10 @@ public class GridController extends CPanel GridField mField = m_mTab.getField(i); if (mField.isDisplayed() // IDEMPIERE-587 Swing: Toolbar Button to start Process from button fields - && mField.getDisplayType()!=DisplayType.Button) + && !( + mField.getDisplayType()==DisplayType.Button + && mField.isToolbarButton()) + ) { VEditor vEditor = VEditorFactory.getEditor(m_mTab, mField, false); if (vEditor == null) From dc784cb325f4a1174921fa56ed559d20fb5fe083 Mon Sep 17 00:00:00 2001 From: "Hesham S. Ahmed" Date: Sat, 26 Jan 2013 05:30:55 +0300 Subject: [PATCH 04/20] IDEMPIERE-595 Swing Login Screen does not show role combo --- org.adempiere.ui.swing/src/org/compiere/apps/ALogin.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/org.adempiere.ui.swing/src/org/compiere/apps/ALogin.java b/org.adempiere.ui.swing/src/org/compiere/apps/ALogin.java index f25e531c9e..73c60d8a0e 100644 --- a/org.adempiere.ui.swing/src/org/compiere/apps/ALogin.java +++ b/org.adempiere.ui.swing/src/org/compiere/apps/ALogin.java @@ -924,12 +924,11 @@ public final class ALogin extends CDialog { clientCombo.setSelectedIndex(0); clientCombo.setVisible(false); - clientCombo.setVisible(false); clientLabel.setVisible(false); } else { - clientCombo.setVisible(true); + clientLabel.setVisible(true); clientCombo.setVisible(true); } @@ -973,6 +972,10 @@ public final class ALogin extends CDialog } // KeyNamePair[] roles = m_login.getRoles(userTextField.getText(), client); + // Make role Combo visible + roleCombo.setVisible(true); + roleLabel.setVisible(true); + // delete existing rol/org items if (roleCombo.getItemCount() > 0) roleCombo.removeAllItems(); @@ -1005,7 +1008,6 @@ public final class ALogin extends CDialog { roleCombo.setSelectedIndex(0); roleCombo.setVisible(false); - roleCombo.setVisible(false); roleLabel.setVisible(false); } From 61dbe33afa8f619a0e9241ead9cd63c3678581c2 Mon Sep 17 00:00:00 2001 From: Thomas Bayen Date: Sat, 26 Jan 2013 17:37:39 +0100 Subject: [PATCH 05/20] IDEMPIERE-90 shortcut Ctrl-L --- .../src/org/compiere/grid/ed/VLookup.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/org.adempiere.ui.swing/src/org/compiere/grid/ed/VLookup.java b/org.adempiere.ui.swing/src/org/compiere/grid/ed/VLookup.java index 8c7406b950..4669786766 100644 --- a/org.adempiere.ui.swing/src/org/compiere/grid/ed/VLookup.java +++ b/org.adempiere.ui.swing/src/org/compiere/grid/ed/VLookup.java @@ -40,6 +40,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.logging.Level; +import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.DefaultComboBoxModel; @@ -296,6 +297,15 @@ public class VLookup extends JComponent m_buttonSL.setMargin(new Insets(0, 0, 0, 0)); m_buttonSL.setIcon(Env.getImageIcon("LockX16.gif")); m_buttonSL.setToolTipText(Msg.getMsg(Env.getCtx(), "ShortListShortListItems")); + ActionMap am = m_combo.getActionMap(); + am.put("shortlist", new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + actionShortList(); + } + }); + m_combo.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) + .put(KeyStroke.getKeyStroke(KeyEvent.VK_L, KeyEvent.CTRL_DOWN_MASK), "shortlist"); } } // IDEMPIERE 90 From 6efdf383dc5282f82155b4ac2e3d527a77cdca09 Mon Sep 17 00:00:00 2001 From: Thomas Bayen Date: Tue, 29 Jan 2013 00:15:48 +0100 Subject: [PATCH 06/20] IDEMPIERE-596 Report hangs if column for "next line" does not exist --- .../src/org/compiere/print/layout/TableElement.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/org.adempiere.base/src/org/compiere/print/layout/TableElement.java b/org.adempiere.base/src/org/compiere/print/layout/TableElement.java index 7a6067018b..060382895e 100644 --- a/org.adempiere.base/src/org/compiere/print/layout/TableElement.java +++ b/org.adempiere.base/src/org/compiere/print/layout/TableElement.java @@ -528,7 +528,10 @@ public class TableElement extends PrintElement if (col != dataCol) { m_columnWidths.add(new Float(0.0)); // for the data column - Float origWidth = (Float)m_columnWidths.get(col); + Float origWidth=null; + try{ + origWidth = (Float)m_columnWidths.get(col); + }catch(IndexOutOfBoundsException e){} if (origWidth == null) log.log(Level.SEVERE, "Column " + dataCol + " below " + col + " - no value for orig width"); else From 6b50b40a423953ad8f1faa2923004ab4b4623b46 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 6 Feb 2013 08:26:39 -0500 Subject: [PATCH 07/20] IDEMPIERE-600 Use User Org Access in Role didn't work - thanks to Juliana Corredor --- org.adempiere.base/src/org/compiere/util/Login.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/util/Login.java b/org.adempiere.base/src/org/compiere/util/Login.java index 1bcfe90733..1b440bbb1a 100644 --- a/org.adempiere.base/src/org/compiere/util/Login.java +++ b/org.adempiere.base/src/org/compiere/util/Login.java @@ -532,12 +532,9 @@ public class Login // String sql = " SELECT DISTINCT r.UserLevel, r.ConnectionProfile,o.AD_Org_ID,o.Name,o.IsSummary " +" FROM AD_Org o" - +" INNER JOIN AD_Role_OrgAccess ra ON (ra.AD_Org_ID=o.AD_Org_ID)" - +" INNER JOIN AD_Role r on (ra.AD_Role_ID=r.AD_Role_ID) " - +" INNER JOIN AD_Client c on (ra.AD_Client_ID=c.AD_Client_ID)" - +" WHERE r.AD_Role_ID=?" - +" AND c.AD_Client_ID=?" - +" AND o.IsActive='Y' " + +" INNER JOIN AD_Role r on (r.AD_Role_ID=?)" + +" INNER JOIN AD_Client c on (c.AD_Client_ID=?)" + +" WHERE o.IsActive='Y' " +" AND o.IsSummary='N'" +" AND (r.IsAccessAllOrgs='Y'" +" OR (r.IsUseUserOrgAccess='N' AND o.AD_Org_ID IN (SELECT AD_Org_ID FROM AD_Role_OrgAccess ra" From de43068deed945a5751e264f5a3dbf5a13284cd9 Mon Sep 17 00:00:00 2001 From: Nicolas Micoud Date: Wed, 30 Jan 2013 12:39:05 +0100 Subject: [PATCH 08/20] Error with semi-colons --- .../i1.0a-release/oracle/201301291717_IDEMPIERE-294.sql | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/migration/i1.0a-release/oracle/201301291717_IDEMPIERE-294.sql b/migration/i1.0a-release/oracle/201301291717_IDEMPIERE-294.sql index c621615c15..534a8469e8 100644 --- a/migration/i1.0a-release/oracle/201301291717_IDEMPIERE-294.sql +++ b/migration/i1.0a-release/oracle/201301291717_IDEMPIERE-294.sql @@ -1,10 +1,11 @@ -- IDEMPIERE-294 Maintenance / Fix wrong datatype of column on DB -ALTER TABLE ad_broadcastmessage DROP COLUMN notification_client_id; +ALTER TABLE ad_broadcastmessage DROP COLUMN notification_client_id ; -ALTER TABLE ad_broadcastmessage ADD (notification_client_id NUMBER(10,0) NULL); +ALTER TABLE ad_broadcastmessage ADD (notification_client_id NUMBER(10,0) NULL) ; + SELECT register_migration_script('201301291717_IDEMPIERE-294.sql') FROM dual ; From 8d66ca7fe791ed15428be1534e5f2d168be6eaa6 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 6 Feb 2013 10:10:26 -0500 Subject: [PATCH 09/20] IDEMPIERE-610 Import of BankStatement does not work (can not create new bank statements) - thanks to Thomas Bayen --- .../org/compiere/process/ImportBankStatement.java | 13 ++++++++----- .../src/org/compiere/model/MBankStatement.java | 1 + 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/org.adempiere.base.process/src/org/compiere/process/ImportBankStatement.java b/org.adempiere.base.process/src/org/compiere/process/ImportBankStatement.java index f608302731..d3ba73baf2 100644 --- a/org.adempiere.base.process/src/org/compiere/process/ImportBankStatement.java +++ b/org.adempiere.base.process/src/org/compiere/process/ImportBankStatement.java @@ -433,14 +433,17 @@ public class ImportBankStatement extends SvrProcess statement.setEndingBalance(Env.ZERO); // Copy statement data - if (imp.getName() != null) - { + if (imp.getName() != null) { statement.setName(imp.getName()); } - if (imp.getStatementDate() != null) - { + if (imp.getStatementDate() != null) { statement.setStatementDate(imp.getStatementDate()); } + if (imp.getDateAcct() != null) { + statement.setDateAcct(imp.getDateAcct()); + } else { + statement.setDateAcct(statement.getStatementDate()); + } statement.setDescription(imp.getDescription()); statement.setEftStatementReference(imp.getEftStatementReference()); statement.setEftStatementDate(imp.getEftStatementDate()); @@ -460,7 +463,7 @@ public class ImportBankStatement extends SvrProcess line.setReferenceNo(imp.getReferenceNo()); line.setDescription(imp.getLineDescription()); line.setStatementLineDate(imp.getStatementLineDate()); - line.setDateAcct(imp.getStatementLineDate()); + // line.setDateAcct(imp.getStatementLineDate()); // set on beforeSave line.setValutaDate(imp.getValutaDate()); line.setIsReversal(imp.isReversal()); line.setC_Currency_ID(imp.getC_Currency_ID()); diff --git a/org.adempiere.base/src/org/compiere/model/MBankStatement.java b/org.adempiere.base/src/org/compiere/model/MBankStatement.java index fff3eb2bfb..d5a41708dc 100644 --- a/org.adempiere.base/src/org/compiere/model/MBankStatement.java +++ b/org.adempiere.base/src/org/compiere/model/MBankStatement.java @@ -100,6 +100,7 @@ public class MBankStatement extends X_C_BankStatement implements DocAction setClientOrg(account); setC_BankAccount_ID(account.getC_BankAccount_ID()); setStatementDate(new Timestamp(System.currentTimeMillis())); + setDateAcct(new Timestamp(System.currentTimeMillis())); setBeginningBalance(account.getCurrentBalance()); setName(getStatementDate().toString()); setIsManual(isManual); From 1640fec33370f06f4bbea3201bef4cb8414d1791 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 6 Feb 2013 10:50:35 -0500 Subject: [PATCH 10/20] IDEMPIERE-90 Restricted items on Combobox / refactor to avoid direct SQL and use cache --- .../src/org/compiere/model/MTable.java | 50 +++++++++++++++++-- .../src/org/compiere/grid/ed/VLookup.java | 7 +-- .../webui/editor/WTableDirEditor.java | 8 +-- 3 files changed, 51 insertions(+), 14 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/MTable.java b/org.adempiere.base/src/org/compiere/model/MTable.java index 390ece0e89..2ceb8c62a0 100644 --- a/org.adempiere.base/src/org/compiere/model/MTable.java +++ b/org.adempiere.base/src/org/compiere/model/MTable.java @@ -20,8 +20,10 @@ package org.compiere.model; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Properties; import java.util.logging.Level; @@ -53,7 +55,7 @@ public class MTable extends X_AD_Table /** * */ - private static final long serialVersionUID = 8264472455498363565L; + private static final long serialVersionUID = -8904670462021706436L; public final static int MAX_OFFICIAL_ID = 999999; @@ -211,6 +213,10 @@ public class MTable extends X_AD_Table /** Columns */ private MColumn[] m_columns = null; + /** column name to index map **/ + private Map m_columnNameMap; + /** ad_column_id to index map **/ + private Map m_columnIdMap; /** * Get Columns @@ -221,6 +227,8 @@ public class MTable extends X_AD_Table { if (m_columns != null && !requery) return m_columns; + m_columnNameMap = new HashMap(); + m_columnIdMap = new HashMap(); String sql = "SELECT * FROM AD_Column WHERE AD_Table_ID=? ORDER BY ColumnName"; ArrayList list = new ArrayList(); PreparedStatement pstmt = null; @@ -229,8 +237,12 @@ public class MTable extends X_AD_Table pstmt = DB.prepareStatement (sql, get_TrxName()); pstmt.setInt (1, getAD_Table_ID()); ResultSet rs = pstmt.executeQuery (); - while (rs.next ()) - list.add (new MColumn (getCtx(), rs, get_TrxName())); + while (rs.next ()) { + MColumn column = new MColumn (getCtx(), rs, get_TrxName()); + list.add (column); + m_columnNameMap.put(column.getColumnName().toUpperCase(), list.size() - 1); + m_columnIdMap.put(column.getAD_Column_ID(), list.size() - 1); + } rs.close (); pstmt.close (); pstmt = null; @@ -274,6 +286,38 @@ public class MTable extends X_AD_Table return null; } // getColumn + /** + * Get Column Index + * @param ColumnName column name + * @return index of column with ColumnName or -1 if not found + */ + public int getColumnIndex (String ColumnName) + { + if (m_columns == null) + getColumns(false); + Integer i = m_columnNameMap.get(ColumnName.toUpperCase()); + if (i != null) + return i.intValue(); + + return -1; + } // getColumnIndex + + /** + * Get Column Index + * @param AD_Column_ID column + * @return index of column with ColumnName or -1 if not found + */ + public int getColumnIndex (int AD_Column_ID) + { + if (m_columns == null) + getColumns(false); + Integer i = m_columnIdMap.get(AD_Column_ID); + if (i != null) + return i.intValue(); + + return -1; + } // getColumnIndex + /** * Table has a single Key * @return true if table has single key column diff --git a/org.adempiere.ui.swing/src/org/compiere/grid/ed/VLookup.java b/org.adempiere.ui.swing/src/org/compiere/grid/ed/VLookup.java index 4669786766..4d05bc30f2 100644 --- a/org.adempiere.ui.swing/src/org/compiere/grid/ed/VLookup.java +++ b/org.adempiere.ui.swing/src/org/compiere/grid/ed/VLookup.java @@ -281,11 +281,8 @@ public class VLookup extends JComponent String tableName_temp = m_lookup.getColumnName(); // Returns AD_Org.AD_Org_ID int posPoint = tableName_temp.indexOf("."); String tableName = tableName_temp.substring(0, posPoint); - int table_id = MTable.getTable_ID(tableName); // now we got the ad_table_id - - String sql = "SELECT COUNT(*) FROM AD_Column WHERE ColumnName = 'IsShortList' AND IsActive='Y' AND AD_Table_ID = " + table_id; - isShortListAvailable = DB.getSQLValue(null, sql) == 1; // if the table has an active IsShortList column, we could use the restrict search ! - + MTable table = MTable.get(Env.getCtx(), tableName); + isShortListAvailable = (table.getColumnIndex("IsShortList") >= 0); if (isShortListAvailable) { setComboShortList(true); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WTableDirEditor.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WTableDirEditor.java index ded84de208..68986a0589 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WTableDirEditor.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WTableDirEditor.java @@ -38,7 +38,6 @@ import org.compiere.model.MBPartnerLocation; import org.compiere.model.MLocation; import org.compiere.model.MTable; import org.compiere.util.CLogger; -import org.compiere.util.DB; import org.compiere.util.DisplayType; import org.compiere.util.Env; import org.compiere.util.KeyNamePair; @@ -173,11 +172,8 @@ ContextMenuListener, IZoomableEditor String tableName_temp = lookup.getColumnName(); // Returns AD_Org.AD_Org_ID int posPoint = tableName_temp.indexOf("."); String tableName = tableName_temp.substring(0, posPoint); - int table_id = MTable.getTable_ID(tableName); // now we got the ad_table_id - - String sql = "SELECT COUNT(*) FROM AD_Column WHERE ColumnName = 'IsShortList' AND IsActive='Y' AND AD_Table_ID = " + table_id; - isShortListAvailable = DB.getSQLValue(null, sql) == 1; // if the table has an active isShortList column, we could use the restrict search ! - + MTable table = MTable.get(Env.getCtx(), tableName); + isShortListAvailable = (table.getColumnIndex("IsShortList") >= 0); if (isShortListAvailable) { onlyShortListItems=true; From 4356fa8f64d96ad3fca5176849e90206e943439e Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Thu, 7 Feb 2013 11:14:24 -0500 Subject: [PATCH 11/20] IDEMPIERE-455 Discover and fix FindBugs problems / Eclipse warnings on pipo.legacy --- .../src/org/adempiere/pipo/PackOut.java | 2 ++ .../src/org/adempiere/pipo/PackRoll.java | 2 ++ .../pipo/handler/CodeSnipitElementHandler.java | 2 ++ .../adempiere/pipo/handler/DataElementHandler.java | 11 +++++------ .../pipo/handler/DistFileElementHandler.java | 1 + .../pipo/handler/FormAccessElementHandler.java | 2 ++ .../adempiere/pipo/handler/MenuElementHandler.java | 8 ++++---- .../adempiere/pipo/handler/OrgRoleElementHandler.java | 2 ++ .../pipo/handler/ProcessAccessElementHandler.java | 2 ++ .../pipo/handler/ReferenceListElementHandler.java | 1 + .../pipo/handler/ReferenceTableElementHandler.java | 2 ++ .../pipo/handler/SQLStatementElementHandler.java | 4 ++++ .../pipo/handler/TaskAccessElementHandler.java | 2 ++ .../pipo/handler/UserRoleElementHandler.java | 2 ++ .../pipo/handler/WindowAccessElementHandler.java | 2 ++ .../pipo/handler/WorkflowAccessElementHandler.java | 2 ++ .../pipo/handler/WorkflowNodeNextElementHandler.java | 3 ++- .../src/test/functional/PackOutTest.java | 3 +++ 18 files changed, 42 insertions(+), 11 deletions(-) diff --git a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/PackOut.java b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/PackOut.java index 541c6e5e9a..a1b7b326e4 100644 --- a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/PackOut.java +++ b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/PackOut.java @@ -170,6 +170,7 @@ public class PackOut extends SvrProcess packagedir += File.separator; packagename = packagedir + rs1.getString(X_AD_Package_Exp.COLUMNNAME_Name); includesdir = rs1.getString(X_AD_Package_Exp.COLUMNNAME_Name) + File.separator +"**"; + @SuppressWarnings("unused") boolean success = (new File(packagename+File.separator+"doc"+File.separator)).mkdirs(); String file_document = packagename+File.separator+"doc"+File.separator+rs1.getString(X_AD_Package_Exp.COLUMNNAME_Name)+"Doc.xml"; packageDocStream = new FileOutputStream (file_document, false); @@ -457,6 +458,7 @@ public class PackOut extends SvrProcess File destGZipFile = new File(packagename+".tar.gz"); //delete the old packages if necessary + @SuppressWarnings("unused") boolean success = destZipFile.delete(); success = destTarFile.delete(); success = destGZipFile.delete(); diff --git a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/PackRoll.java b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/PackRoll.java index 8e7af1ab4e..4ed8ff5093 100644 --- a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/PackRoll.java +++ b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/PackRoll.java @@ -60,6 +60,7 @@ import org.compiere.util.Env; public class PackRoll extends SvrProcess { /** Package from Record */ private int m_AD_Package_Imp_ID = 0; + @SuppressWarnings("unused") private String m_Processing = null; StringBuffer sql = null; StringBuffer sqlB = null; @@ -96,6 +97,7 @@ public class PackRoll extends SvrProcess { sqlB = new StringBuffer("UPDATE AD_Package_Imp " + "SET PK_Status = 'Uninstalling' " + "WHERE AD_Package_Imp_ID = " + m_AD_Package_Imp_ID); + @SuppressWarnings("unused") int no = DB.executeUpdate(sqlB.toString(), get_TrxName()); log.info("Starting Package Reversal"); diff --git a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/CodeSnipitElementHandler.java b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/CodeSnipitElementHandler.java index c0108c622d..f02183f271 100644 --- a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/CodeSnipitElementHandler.java +++ b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/CodeSnipitElementHandler.java @@ -45,6 +45,7 @@ public class CodeSnipitElementHandler extends AbstractElementHandler { public void startElement(Properties ctx, Element element) throws SAXException { String elementValue = element.getElementValue(); + @SuppressWarnings("unused") int AD_Backup_ID = -1; String Object_Status = null; log.info(elementValue); @@ -61,6 +62,7 @@ public class CodeSnipitElementHandler extends AbstractElementHandler { int idDetail=0; InputStream source; // Stream for reading from the source file. OutputStream copy; // Stream for writing the copy. + @SuppressWarnings("unused") File currentDirectory = new File("."); String packagePath=null; diff --git a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/DataElementHandler.java b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/DataElementHandler.java index c56f98abfd..a677ecea92 100644 --- a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/DataElementHandler.java +++ b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/DataElementHandler.java @@ -36,7 +36,6 @@ import org.adempiere.pipo.IDFinder; import org.adempiere.pipo.exception.POSaveFailedException; import org.compiere.model.MTable; import org.compiere.model.PO; -import org.compiere.model.POInfo; import org.compiere.model.X_AD_Package_Exp_Detail; import org.compiere.util.DB; import org.compiere.util.Env; @@ -200,13 +199,13 @@ public class DataElementHandler extends AbstractElementHandler { genericPO.set_ValueOfColumn("Name", d_rowname); // Set defaults. //TODO: get defaults from configuration - HashMap defaults = new HashMap(); - HashMap thisDefault = (HashMap)defaults.get(d_tablename); + HashMap defaults = new HashMap(); + HashMap thisDefault = (HashMap)defaults.get(d_tablename); if (thisDefault != null) { - Iterator iter = thisDefault.values().iterator(); - ArrayList thisValue = null; + Iterator iter = thisDefault.values().iterator(); + ArrayList thisValue = null; while (iter.hasNext()) { - thisValue = (ArrayList)iter.next(); + thisValue = (ArrayList)iter.next(); if (((String)(thisValue.get(2))).equals("String")) genericPO.set_ValueOfColumn((String)thisValue.get(0), (String)thisValue.get(1)); else if (((String)(thisValue.get(2))).equals("Integer")) diff --git a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/DistFileElementHandler.java b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/DistFileElementHandler.java index dafc17fc9e..26fbe8eeab 100644 --- a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/DistFileElementHandler.java +++ b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/DistFileElementHandler.java @@ -40,6 +40,7 @@ public class DistFileElementHandler extends AbstractElementHandler { public void startElement(Properties ctx, Element element) throws SAXException { String elementValue = element.getElementValue(); + @SuppressWarnings("unused") int AD_Backup_ID = -1; String Object_Status = null; Attributes atts = element.attributes; diff --git a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/FormAccessElementHandler.java b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/FormAccessElementHandler.java index 72568ad5dd..13689f274a 100644 --- a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/FormAccessElementHandler.java +++ b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/FormAccessElementHandler.java @@ -54,7 +54,9 @@ public class FormAccessElementHandler extends AbstractElementHandler { sqlB = new StringBuffer ("SELECT count(*) FROM AD_Form_Access WHERE AD_Role_ID=? and AD_Form_ID=?"); int count = DB.getSQLValue(getTrxName(ctx),sqlB.toString(),roleid,formid); + @SuppressWarnings("unused") String Object_Status = null; + @SuppressWarnings("unused") int AD_Backup_ID = -1; if (count>0){ Object_Status = "Update"; diff --git a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/MenuElementHandler.java b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/MenuElementHandler.java index 52f3463994..75b594cac4 100644 --- a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/MenuElementHandler.java +++ b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/MenuElementHandler.java @@ -108,7 +108,7 @@ public class MenuElementHandler extends AbstractElementHandler { m_Menu.setAD_Task_ID(id); } - name = atts.getValue("ADWorkbenchNameID"); + /*name = atts.getValue("ADWorkbenchNameID"); if (name != null && name.trim().length() > 0) { int id = get_IDWithColumn(ctx, "AD_Workbench", "Name", name); if (id <= 0) { @@ -116,7 +116,7 @@ public class MenuElementHandler extends AbstractElementHandler { return; } m_Menu.setAD_Workbench_ID(id); - } + }*/ name = atts.getValue("ADWorkflowNameID"); if (name != null && name.trim().length() > 0) { @@ -319,12 +319,12 @@ public class MenuElementHandler extends AbstractElementHandler { atts.addAttribute("", "", "ADTaskNameID", "CDATA", name); } else atts.addAttribute("", "", "ADTaskNameID", "CDATA", ""); - if (m_Menu.getAD_Workbench_ID() > 0) { + /*if (m_Menu.getAD_Workbench_ID() > 0) { sql = "SELECT Name FROM AD_Workbench WHERE AD_Workbench_ID=?"; name = DB.getSQLValueString(null, sql, m_Menu.getAD_Workbench_ID()); atts.addAttribute("", "", "ADWorkbenchNameID", "CDATA", name); } else - atts.addAttribute("", "", "ADWorkbenchNameID", "CDATA", ""); + atts.addAttribute("", "", "ADWorkbenchNameID", "CDATA", "");*/ if (m_Menu.getAD_Workflow_ID() > 0) { sql = "SELECT Name FROM AD_Workflow WHERE AD_Workflow_ID=?"; name = DB.getSQLValueString(null, sql, m_Menu.getAD_Workflow_ID()); diff --git a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/OrgRoleElementHandler.java b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/OrgRoleElementHandler.java index f4c56d85c0..b837b24e66 100644 --- a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/OrgRoleElementHandler.java +++ b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/OrgRoleElementHandler.java @@ -52,7 +52,9 @@ public class OrgRoleElementHandler extends AbstractElementHandler { sqlB = new StringBuffer ("SELECT count(*) FROM AD_Role_OrgAccess WHERE AD_Role_ID=? and AD_Org_ID=?"); int count = DB.getSQLValue(getTrxName(ctx),sqlB.toString(),roleid,orgid); + @SuppressWarnings("unused") int AD_Backup_ID = -1; + @SuppressWarnings("unused") String Object_Status = null; if (count>0){ Object_Status = "Update"; diff --git a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/ProcessAccessElementHandler.java b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/ProcessAccessElementHandler.java index 7f2ad54e9e..fe550200f3 100644 --- a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/ProcessAccessElementHandler.java +++ b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/ProcessAccessElementHandler.java @@ -54,7 +54,9 @@ public class ProcessAccessElementHandler extends AbstractElementHandler { sqlB = new StringBuffer ("SELECT count(*) FROM AD_Process_Access WHERE AD_Role_ID=? and AD_Process_ID=?"); int count = DB.getSQLValue(getTrxName(ctx),sqlB.toString(),roleid,processid); + @SuppressWarnings("unused") int AD_Backup_ID = -1; + @SuppressWarnings("unused") String Object_Status = null; if (count>0){ diff --git a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/ReferenceListElementHandler.java b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/ReferenceListElementHandler.java index 0f6bd4a490..bc7ef2f6fb 100644 --- a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/ReferenceListElementHandler.java +++ b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/ReferenceListElementHandler.java @@ -47,6 +47,7 @@ public class ReferenceListElementHandler extends AbstractElementHandler { element.skip = true; return; } + @SuppressWarnings("unused") String name = atts.getValue("Name"); String value = atts.getValue("Value"); int AD_Reference_ID = 0; diff --git a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/ReferenceTableElementHandler.java b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/ReferenceTableElementHandler.java index 1368f5d733..981957ea1e 100644 --- a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/ReferenceTableElementHandler.java +++ b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/ReferenceTableElementHandler.java @@ -42,7 +42,9 @@ public class ReferenceTableElementHandler extends AbstractElementHandler { public void startElement(Properties ctx, Element element) throws SAXException { String elementValue = element.getElementValue(); + @SuppressWarnings("unused") int AD_Backup_ID = -1; + @SuppressWarnings("unused") String Object_Status = null; log.info(elementValue); diff --git a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/SQLStatementElementHandler.java b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/SQLStatementElementHandler.java index 58decdf3bc..ce323e9584 100644 --- a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/SQLStatementElementHandler.java +++ b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/SQLStatementElementHandler.java @@ -37,7 +37,9 @@ public class SQLStatementElementHandler extends AbstractElementHandler { public void startElement(Properties ctx, Element element) throws SAXException { String elementValue = element.getElementValue(); + @SuppressWarnings("unused") int AD_Backup_ID = -1; + @SuppressWarnings("unused") String Object_Status = null; log.info(elementValue); @@ -49,6 +51,7 @@ public class SQLStatementElementHandler extends AbstractElementHandler { PreparedStatement pstmt = DB.prepareStatement(sql, getTrxName(ctx)); try { if(DBType.equals("ALL")) { + @SuppressWarnings("unused") int n = pstmt.executeUpdate(); log.info("Executed SQL Statement: "+ atts.getValue("statement")); } @@ -69,6 +72,7 @@ public class SQLStatementElementHandler extends AbstractElementHandler { Connection m_con = DB.getConnectionRW(true); try { Statement stmt = m_con.createStatement(); + @SuppressWarnings("unused") int n = stmt.executeUpdate (atts.getValue("statement")); log.info("Executed SQL Statement for PostgreSQL: "+ atts.getValue("statement")); // Postgres needs to commit DDL statements diff --git a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/TaskAccessElementHandler.java b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/TaskAccessElementHandler.java index e74c2ebd0d..d2f495d9a1 100644 --- a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/TaskAccessElementHandler.java +++ b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/TaskAccessElementHandler.java @@ -54,7 +54,9 @@ public class TaskAccessElementHandler extends AbstractElementHandler { sqlB = new StringBuffer ("SELECT count(*) FROM AD_Task_Access WHERE AD_Role_ID=? and AD_Task_ID=?"); int count = DB.getSQLValue(getTrxName(ctx),sqlB.toString(),roleid,taskid); + @SuppressWarnings("unused") int AD_Backup_ID = -1; + @SuppressWarnings("unused") String Object_Status = null; if (count>0){ Object_Status = "Update"; diff --git a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/UserRoleElementHandler.java b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/UserRoleElementHandler.java index 72299b01c4..ba94d7b00d 100644 --- a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/UserRoleElementHandler.java +++ b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/UserRoleElementHandler.java @@ -62,7 +62,9 @@ public class UserRoleElementHandler extends AbstractElementHandler { sqlB = new StringBuffer ("SELECT count(*) FROM AD_User_Roles WHERE AD_User_ID = ? and AD_Role_ID = ?"); int count = DB.getSQLValue(getTrxName(ctx),sqlB.toString(),userid,roleid); + @SuppressWarnings("unused") int AD_Backup_ID = -1; + @SuppressWarnings("unused") String Object_Status = null; if (count>0){ //AD_Backup_ID = copyRecord("AD_Role",m_Role); diff --git a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/WindowAccessElementHandler.java b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/WindowAccessElementHandler.java index eb8f2df4f1..5afcfaa20d 100644 --- a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/WindowAccessElementHandler.java +++ b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/WindowAccessElementHandler.java @@ -61,7 +61,9 @@ public class WindowAccessElementHandler extends AbstractElementHandler { sqlB = new StringBuffer ("SELECT count(*) FROM AD_Window_Access WHERE AD_Role_ID=? and AD_Window_ID=?"); int count = DB.getSQLValue(getTrxName(ctx),sqlB.toString(),roleid,windowid); + @SuppressWarnings("unused") int AD_Backup_ID = -1; + @SuppressWarnings("unused") String Object_Status = null; if (count>0){ Object_Status = "Update"; diff --git a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/WorkflowAccessElementHandler.java b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/WorkflowAccessElementHandler.java index f6de4462b2..f6701525e5 100644 --- a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/WorkflowAccessElementHandler.java +++ b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/WorkflowAccessElementHandler.java @@ -54,7 +54,9 @@ public class WorkflowAccessElementHandler extends AbstractElementHandler { sqlB = new StringBuffer ("SELECT count(*) FROM AD_Workflow_Access WHERE AD_Role_ID=? and AD_Workflow_ID=?"); int count = DB.getSQLValue(getTrxName(ctx),sqlB.toString(),roleid,workflowid); + @SuppressWarnings("unused") int AD_Backup_ID = -1; + @SuppressWarnings("unused") String Object_Status = null; if (count>0){ Object_Status = "Update"; diff --git a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/WorkflowNodeNextElementHandler.java b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/WorkflowNodeNextElementHandler.java index 463ad7ead8..72999feb49 100644 --- a/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/WorkflowNodeNextElementHandler.java +++ b/org.adempiere.pipo.legacy/src/org/adempiere/pipo/handler/WorkflowNodeNextElementHandler.java @@ -24,7 +24,6 @@ import org.adempiere.pipo.AbstractElementHandler; import org.adempiere.pipo.Element; import org.adempiere.pipo.PackOut; import org.adempiere.pipo.exception.POSaveFailedException; -import org.compiere.model.X_AD_WF_NextCondition; import org.compiere.model.X_AD_WF_NodeNext; import org.compiere.util.DB; import org.compiere.util.Env; @@ -187,6 +186,7 @@ public class WorkflowNodeNextElementHandler extends AbstractElementHandler { return atts; } + /* private AttributesImpl createWorkflowNodeNextConditionBinding( AttributesImpl atts, X_AD_WF_NextCondition m_WF_NodeNextCondition) { String sql = null; @@ -271,4 +271,5 @@ public class WorkflowNodeNextElementHandler extends AbstractElementHandler { return atts; } + */ } diff --git a/org.adempiere.pipo.legacy/src/test/functional/PackOutTest.java b/org.adempiere.pipo.legacy/src/test/functional/PackOutTest.java index c9288d47e7..b50cd6e29c 100644 --- a/org.adempiere.pipo.legacy/src/test/functional/PackOutTest.java +++ b/org.adempiere.pipo.legacy/src/test/functional/PackOutTest.java @@ -15,11 +15,13 @@ import test.AdempiereTestCase; public class PackOutTest extends AdempiereTestCase { // Test: Specific variables + @SuppressWarnings("unused") private MLocation location = null; public void testPackOut() { PackOut m_PackOut = new PackOut(); + @SuppressWarnings("unused") PackInHandler m_PackInHandler = new PackInHandler(); Trx m_trx = Trx.get(getTrxName(), true); int m_ad_process_id = IDFinder.get_IDWithColumn("ad_process", "Name", "PackOut", getAD_Client_ID(), getTrxName()); @@ -70,6 +72,7 @@ public class PackOutTest extends AdempiereTestCase { saveResult = m_PackDetail.save(); assertTrue("X_AD_Package_Exp_Detail.save()", saveResult); + @SuppressWarnings("unused") int m_ad_record_id = IDFinder.get_IDWithColumn("ad_package_exp", "Name", "test2packJunit", getAD_Client_ID(), getTrxName()); ProcessInfo m_ProcessInfo = new ProcessInfo("PackOut", m_ad_process_id, m_ad_table_id, m_MPackageExp.get_ID()); From a2080d5d84bf25522c7bfc9aa108a52f04bea1e1 Mon Sep 17 00:00:00 2001 From: Richard Morales Date: Thu, 7 Feb 2013 11:57:17 -0500 Subject: [PATCH 12/20] IDEMPIERE-512 Fix similar positioning problem in other forms --- .../webui/apps/form/WAllocation.java | 46 ++++++++++--------- .../adempiere/webui/apps/form/WInOutGen.java | 28 ++++++----- .../webui/apps/form/WInvoiceGen.java | 28 ++++++----- .../webui/apps/form/WTrxMaterial.java | 28 ++++++----- 4 files changed, 73 insertions(+), 57 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WAllocation.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WAllocation.java index 4efe074587..6b29eb2374 100755 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WAllocation.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WAllocation.java @@ -183,30 +183,33 @@ public class WAllocation extends Allocation Rows rows = null; Row row = null; - parameterLayout.setWidth("800px"); + parameterLayout.setWidth("80%"); rows = parameterLayout.newRows(); row = rows.newRow(); - row.appendChild(bpartnerLabel.rightAlign()); - row.appendChild(bpartnerSearch.getComponent()); - row.appendChild(dateLabel.rightAlign()); - row.appendChild(dateField.getComponent()); - row.appendChild(organizationLabel.rightAlign()); - row.appendChild(organizationPick.getComponent()); + row.appendCellChild(bpartnerLabel.rightAlign()); + bpartnerSearch.getComponent().setHflex("true"); + row.appendCellChild(bpartnerSearch.getComponent(),1); + row.appendCellChild(dateLabel.rightAlign()); + row.appendCellChild(dateField.getComponent()); + row.appendCellChild(organizationLabel.rightAlign()); + organizationPick.getComponent().setHflex("true"); + row.appendCellChild(organizationPick.getComponent(),1); row = rows.newRow(); row.appendCellChild(currencyLabel.rightAlign(),1); + currencyPick.getComponent().setHflex("true"); row.appendCellChild(currencyPick.getComponent(),1); row.appendCellChild(multiCurrency,2); row.appendCellChild(new Space(),1); row.appendCellChild(new Space(),1); row = rows.newRow(); - row.appendChild(new Space()); - row.appendChild(autoWriteOff); - row.appendChild(new Space()); - row.appendChild(new Space()); - row.appendChild(new Space()); - row.appendChild(new Space()); + row.appendCellChild(new Space()); + row.appendCellChild(autoWriteOff); + row.appendCellChild(new Space()); + row.appendCellChild(new Space()); + row.appendCellChild(new Space()); + row.appendCellChild(new Space()); South south = new South(); south.setStyle("border: none"); @@ -217,14 +220,15 @@ public class WAllocation extends Allocation allocationLayout.setWidth("600px"); rows = allocationLayout.newRows(); row = rows.newRow(); - row.appendChild(differenceLabel.rightAlign()); - row.appendChild(allocCurrencyLabel.rightAlign()); - row.appendChild(differenceField); - row.appendChild(new Space()); - row.appendChild(chargeLabel.rightAlign()); - row.appendChild(chargePick.getComponent()); - row.appendChild(new Space()); - row.appendChild(allocateButton); + row.appendCellChild(differenceLabel.rightAlign()); + row.appendCellChild(allocCurrencyLabel.rightAlign()); + differenceField.setHflex("true"); + row.appendCellChild(differenceField); + row.appendCellChild(chargeLabel.rightAlign()); + chargePick.getComponent().setHflex("true"); + row.appendCellChild(chargePick.getComponent(),2); + allocateButton.setHflex("true"); + row.appendCellChild(allocateButton); paymentPanel.appendChild(paymentLayout); paymentPanel.setWidth("100%"); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WInOutGen.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WInOutGen.java index b23985dc17..3b90957bac 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WInOutGen.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WInOutGen.java @@ -99,21 +99,25 @@ public class WInOutGen extends InOutGen implements IFormController, EventListene lBPartner.setText(Msg.translate(Env.getCtx(), "C_BPartner_ID")); Row row = form.getParameterPanel().newRows().newRow(); - row.appendChild(lWarehouse.rightAlign()); - row.appendChild(fWarehouse.getComponent()); - row.appendChild(new Space()); - row.appendChild(lBPartner.rightAlign()); - row.appendChild(fBPartner.getComponent()); - row.appendChild(new Space()); + row.appendCellChild(lWarehouse.rightAlign()); + fWarehouse.getComponent().setHflex("true"); + row.appendCellChild(fWarehouse.getComponent()); + row.appendCellChild(new Space()); + row.appendCellChild(lBPartner.rightAlign()); + fBPartner.getComponent().setHflex("true"); + row.appendCellChild(fBPartner.getComponent()); + row.appendCellChild(new Space()); row = new Row(); form.getParameterPanel().getRows().appendChild(row); - row.appendChild(lDocType.rightAlign()); - row.appendChild(cmbDocType); - row.appendChild(new Space()); - row.appendChild(lDocAction.rightAlign()); - row.appendChild(docAction.getComponent()); - row.appendChild(new Space()); + row.appendCellChild(lDocType.rightAlign()); + cmbDocType.setHflex("true"); + row.appendCellChild(cmbDocType); + row.appendCellChild(new Space()); + row.appendCellChild(lDocAction.rightAlign()); + docAction.getComponent().setHflex("true"); + row.appendCellChild(docAction.getComponent()); + row.appendCellChild(new Space()); } // jbInit /** diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WInvoiceGen.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WInvoiceGen.java index b52460a513..7d51eb5610 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WInvoiceGen.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WInvoiceGen.java @@ -99,21 +99,25 @@ public class WInvoiceGen extends InvoiceGen implements IFormController, EventLis lBPartner.setText(Msg.translate(Env.getCtx(), "C_BPartner_ID")); Row row = form.getParameterPanel().newRows().newRow(); - row.appendChild(lOrg.rightAlign()); - row.appendChild(fOrg.getComponent()); - row.appendChild(new Space()); - row.appendChild(lBPartner.rightAlign()); - row.appendChild(fBPartner.getComponent()); - row.appendChild(new Space()); + row.appendCellChild(lOrg.rightAlign()); + fOrg.getComponent().setHflex("true"); + row.appendCellChild(fOrg.getComponent()); + row.appendCellChild(new Space()); + row.appendCellChild(lBPartner.rightAlign()); + fBPartner.getComponent().setHflex("true"); + row.appendCellChild(fBPartner.getComponent()); + row.appendCellChild(new Space()); row = new Row(); form.getParameterPanel().getRows().appendChild(row); - row.appendChild(lDocType.rightAlign()); - row.appendChild(cmbDocType); - row.appendChild(new Space()); - row.appendChild(lDocAction.rightAlign()); - row.appendChild(docAction.getComponent()); - row.appendChild(new Space()); + row.appendCellChild(lDocType.rightAlign()); + cmbDocType.setHflex("true"); + row.appendCellChild(cmbDocType); + row.appendCellChild(new Space()); + row.appendCellChild(lDocAction.rightAlign()); + docAction.getComponent().setHflex("true"); + row.appendCellChild(docAction.getComponent()); + row.appendCellChild(new Space()); } // jbInit /** diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WTrxMaterial.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WTrxMaterial.java index f10c79b6b6..d0bdef7e4b 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WTrxMaterial.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WTrxMaterial.java @@ -142,20 +142,24 @@ public class WTrxMaterial extends TrxMaterial Rows rows = parameterLayout.newRows(); Row row = rows.newRow(); - row.appendChild(orgLabel.rightAlign()); - row.appendChild(orgField.getComponent()); - row.appendChild(mtypeLabel.rightAlign()); - row.appendChild(mtypeField.getComponent()); - row.appendChild(dateFLabel.rightAlign()); - row.appendChild(dateFField.getComponent()); + row.appendCellChild(orgLabel.rightAlign()); + orgField.getComponent().setHflex("true"); + row.appendCellChild(orgField.getComponent()); + row.appendCellChild(mtypeLabel.rightAlign()); + mtypeField.getComponent().setHflex("true"); + row.appendCellChild(mtypeField.getComponent()); + row.appendCellChild(dateFLabel.rightAlign()); + row.appendCellChild(dateFField.getComponent()); row = rows.newRow(); - row.appendChild(locatorLabel.rightAlign()); - row.appendChild(locatorField.getComponent()); - row.appendChild(productLabel.rightAlign()); - row.appendChild(productField.getComponent()); - row.appendChild(dateTLabel.rightAlign()); - row.appendChild(dateTField.getComponent()); + row.appendCellChild(locatorLabel.rightAlign()); + locatorField.getComponent().setHflex("true"); + row.appendCellChild(locatorField.getComponent()); + row.appendCellChild(productLabel.rightAlign()); + productField.getComponent().setHflex("true"); + row.appendCellChild(productField.getComponent()); + row.appendCellChild(dateTLabel.rightAlign()); + row.appendCellChild(dateTField.getComponent()); // southPanel.appendChild(confirmPanel); southPanel.appendChild(new Separator()); From 0becbfbf3e19dd31a5d3d52df7a0d29c74ab8306 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Thu, 7 Feb 2013 13:20:27 -0500 Subject: [PATCH 13/20] IDEMPIERE-617 Enable logging of authentication failures --- .../org/adempiere/util/LogAuthFailure.java | 77 +++++++++++++++++++ .../src/org/compiere/util/Login.java | 2 +- .../org/adempiere/webui/panel/LoginPanel.java | 19 ++++- 3 files changed, 93 insertions(+), 5 deletions(-) create mode 100644 org.adempiere.base/src/org/adempiere/util/LogAuthFailure.java diff --git a/org.adempiere.base/src/org/adempiere/util/LogAuthFailure.java b/org.adempiere.base/src/org/adempiere/util/LogAuthFailure.java new file mode 100644 index 0000000000..0509fd0924 --- /dev/null +++ b/org.adempiere.base/src/org/adempiere/util/LogAuthFailure.java @@ -0,0 +1,77 @@ +/****************************************************************************** + * Product: iDempiere ERP & CRM Smart Business Solution * + * Copyright (C) Trek Global 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. * + * * + * @author Juliana Corredor, jcorredor@trekglobal.com * + * @author Carlos Ruiz * + *****************************************************************************/ +package org.adempiere.util; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; + +import org.compiere.util.CLogger; +import org.compiere.util.DisplayType; +import org.compiere.util.Ini; + + +public class LogAuthFailure { + + private static FileOutputStream file = null; + private static Writer writer; + /** Logger */ + private static CLogger log = CLogger.getCLogger(LogAuthFailure.class); + + public LogAuthFailure() { + + String path = Ini.getAdempiereHome() + File.separator + "log"; + String name = path + File.separator + "AuthFailure.log"; + File fileName; + try { + fileName = new File(name); + file = new FileOutputStream(fileName, true); + writer = new BufferedWriter(new OutputStreamWriter(file, "UTF8")); + } catch (IOException e) { + log.fine(e.getMessage()); + e.printStackTrace(); + } + } + + public void log(String clientIP, String context, String username, String msg) { + try { + SimpleDateFormat format = DisplayType.getTimestampFormat_Default(); + String dateTimeText = format.format(new Timestamp(System.currentTimeMillis())); + + writer.append("["); + writer.append(dateTimeText); + writer.append("] [error] [client "); + writer.append(clientIP); + writer.append("] [context "); + writer.append(context); + writer.append("] [username "); + writer.append(username); + writer.append("] "); + writer.append(msg); + writer.append("\n"); + writer.flush(); + } catch (Exception e) { + log.fine(e.getMessage()); + } + } + +} diff --git a/org.adempiere.base/src/org/compiere/util/Login.java b/org.adempiere.base/src/org/compiere/util/Login.java index 1b440bbb1a..22b1c3694b 100644 --- a/org.adempiere.base/src/org/compiere/util/Login.java +++ b/org.adempiere.base/src/org/compiere/util/Login.java @@ -1201,7 +1201,7 @@ public class Login public KeyNamePair[] getClients(String app_user, String app_pwd) { log.info("User=" + app_user); - if (app_user == null) + if (Util.isEmpty(app_user)) { log.warning("No Apps User"); return null; diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/LoginPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/LoginPanel.java index e64153b95e..1558e2407c 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/LoginPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/LoginPanel.java @@ -31,6 +31,7 @@ import java.util.Locale; import java.util.Properties; import java.util.logging.Level; +import org.adempiere.util.LogAuthFailure; import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.component.Button; @@ -100,6 +101,8 @@ public class LoginPanel extends Window implements EventListener */ private static final long serialVersionUID = -3181808670168474967L; + private static LogAuthFailure logAuthFailure = new LogAuthFailure(); + private static final String ON_LOAD_TOKEN = "onLoadToken"; private static CLogger logger = CLogger.getCLogger(LoginPanel.class); @@ -522,13 +525,21 @@ public class LoginPanel extends Window implements EventListener Session currSess = Executions.getCurrent().getDesktop().getSession(); KeyNamePair clientsKNPairs[] = login.getClients(userId, userPassword); + if (clientsKNPairs == null || clientsKNPairs.length == 0) { String loginErrMsg = login.getLoginErrMsg(); - if (loginErrMsg != null && loginErrMsg.length() > 0) - throw new WrongValueException(loginErrMsg); - else - throw new WrongValueException(Msg.getMsg(ctx,"FailedLogin", true)); + if (Util.isEmpty(loginErrMsg)) + loginErrMsg = Msg.getMsg(ctx,"FailedLogin", true); + + // IDEMPIERE-617 + String x_Forward_IP = Executions.getCurrent().getHeader("X-Forwarded-For"); + if (x_Forward_IP == null) { + x_Forward_IP = currSess.getRemoteAddr(); + } + logAuthFailure.log(x_Forward_IP, "/webui", userId, loginErrMsg); + + throw new WrongValueException(loginErrMsg); } else { From 9af1992d057dffc10c69c504636d9c314f0b986f Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Thu, 7 Feb 2013 17:50:43 -0500 Subject: [PATCH 14/20] IDEMPIERE-605 Error message when saving new Business Partner / related to IDEMPIERE-362 Hide things that don't work on iDempiere --- org.adempiere.base/src/org/compiere/model/MBPartner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.adempiere.base/src/org/compiere/model/MBPartner.java b/org.adempiere.base/src/org/compiere/model/MBPartner.java index aef09a051a..7e891cf618 100644 --- a/org.adempiere.base/src/org/compiere/model/MBPartner.java +++ b/org.adempiere.base/src/org/compiere/model/MBPartner.java @@ -991,7 +991,7 @@ public class MBPartner extends X_C_BPartner StringBuilder msgacc = new StringBuilder("p.C_BP_Group_ID=").append(getC_BP_Group_ID()); insert_Accounting("C_BP_Customer_Acct", "C_BP_Group_Acct", msgacc.toString()); insert_Accounting("C_BP_Vendor_Acct", "C_BP_Group_Acct",msgacc.toString()); - insert_Accounting("C_BP_Employee_Acct", "C_AcctSchema_Default", null); + // insert_Accounting("C_BP_Employee_Acct", "C_AcctSchema_Default", null); } // Value/Name change From c621ead859ca777f7f2891b7db3f0745e804b061 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Fri, 8 Feb 2013 11:11:25 +0800 Subject: [PATCH 15/20] IDEMPIERE-618 Zk: Binary editor not working. --- .../adempiere/webui/editor/WBinaryEditor.java | 56 ++++++++++++++----- .../adempiere/webui/window/WMediaDialog.java | 38 ++----------- 2 files changed, 48 insertions(+), 46 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WBinaryEditor.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WBinaryEditor.java index 9241e6abf1..ab85531301 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WBinaryEditor.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WBinaryEditor.java @@ -14,12 +14,18 @@ package org.adempiere.webui.editor; +import org.adempiere.webui.LayoutUtils; +import org.adempiere.webui.adwindow.ADWindow; +import org.adempiere.webui.adwindow.ADWindowContent; +import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.component.Button; +import org.adempiere.webui.event.DialogEvents; import org.adempiere.webui.event.ValueChangeEvent; import org.adempiere.webui.window.WMediaDialog; import org.compiere.model.GridField; import org.compiere.util.CLogger; import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; /** @@ -34,6 +40,8 @@ public class WBinaryEditor extends WEditor private boolean m_mandatory; private Object m_data; + + private ADWindow adwindow; public WBinaryEditor(GridField gridField) { @@ -124,20 +132,40 @@ public class WBinaryEditor extends WEditor { if (Events.ON_CLICK.equals(event.getName())) { - WMediaDialog dialog = new WMediaDialog(gridField.getHeader(), m_data); - if (!dialog.isCancel() && dialog.isChange()) - { - Object oldValue = m_data; - Object newValue = dialog.getData(); - if (oldValue != null && newValue != null && oldValue.equals(newValue)) { - return; - } - if (oldValue == null && newValue == null) { - return; - } - ValueChangeEvent changeEvent = new ValueChangeEvent(this, this.getColumnName(), oldValue, newValue); - super.fireValueChange(changeEvent); - setValue(newValue); + final WMediaDialog dialog = new WMediaDialog(gridField.getHeader(), m_data); + dialog.addEventListener(DialogEvents.ON_WINDOW_CLOSE, new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + if (adwindow != null) + { + adwindow.getADWindowContent().hideBusyMask(); + adwindow = null; + } + if (!dialog.isCancel() && dialog.isChange()) + { + Object oldValue = m_data; + Object newValue = dialog.getData(); + if (oldValue != null && newValue != null && oldValue.equals(newValue)) { + return; + } + if (oldValue == null && newValue == null) { + return; + } + ValueChangeEvent changeEvent = new ValueChangeEvent(WBinaryEditor.this, getColumnName(), oldValue, newValue); + fireValueChange(changeEvent); + setValue(newValue); + } + } + }); + adwindow = ADWindow.findADWindow(getComponent()); + if (adwindow != null) { + ADWindowContent content = adwindow.getADWindowContent(); + content.showBusyMask(); + content.getComponent().getParent().appendChild(dialog); + LayoutUtils.openOverlappedWindow(content.getComponent().getParent(), dialog, "middle_center"); + } else { + AEnv.showWindow(dialog); } } } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WMediaDialog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WMediaDialog.java index e204426e81..fd37ccd7e6 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WMediaDialog.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WMediaDialog.java @@ -21,11 +21,10 @@ import java.sql.Clob; import java.sql.SQLException; import java.util.logging.Level; -import org.adempiere.webui.AdempiereWebUI; -import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.component.Button; import org.adempiere.webui.component.Panel; import org.adempiere.webui.component.Window; +import org.adempiere.webui.component.ZkCssHelper; import org.compiere.util.CLogger; import org.compiere.util.Env; import org.compiere.util.Msg; @@ -40,7 +39,6 @@ import org.zkoss.zul.Center; import org.zkoss.zul.North; import org.zkoss.zul.South; import org.zkoss.zul.Filedownload; -import org.zkoss.zul.Fileupload; import org.zkoss.zul.Hbox; import org.zkoss.zul.Iframe; @@ -102,14 +100,6 @@ public class WMediaDialog extends Window implements EventListener catch (Exception ex) { log.log(Level.SEVERE, "", ex); - } - - try - { - AEnv.showWindow(this); - } - catch (Exception e) - { } } // WAttachment @@ -132,7 +122,7 @@ public class WMediaDialog extends Window implements EventListener void staticInit() throws Exception { this.setWidth("500px"); - this.setHeight("600px"); + this.setHeight("500px"); this.setClosable(true); this.setBorder("normal"); this.appendChild(mainPanel); @@ -159,13 +149,15 @@ public class WMediaDialog extends Window implements EventListener bLoad.setImage("/images/Import24.png"); bLoad.setTooltiptext(Msg.getMsg(Env.getCtx(), "Load")); - bLoad.addEventListener(Events.ON_CLICK, this); + bLoad.addEventListener(Events.ON_UPLOAD, this); + bLoad.setUpload("true"); bDelete.setImage("/images/Delete24.png"); bDelete.setTooltiptext(Msg.getMsg(Env.getCtx(), "Delete")); bDelete.addEventListener(Events.ON_CLICK, this); previewPanel.appendChild(preview); + ZkCssHelper.appendStyle(previewPanel, "margin-top: 10px; margin-bottom: 10px;"); preview.setHeight("100%"); preview.setWidth("100%"); @@ -188,9 +180,7 @@ public class WMediaDialog extends Window implements EventListener bCancel.addEventListener(Events.ON_CLICK, this); confirmPanel.appendChild(bOk); - confirmPanel.appendChild(bCancel); - - addEventListener(Events.ON_UPLOAD, this); + confirmPanel.appendChild(bCancel); } /** @@ -301,11 +291,6 @@ public class WMediaDialog extends Window implements EventListener displayData(); } - // Load Attachment - - else if (e.getTarget() == bLoad) - loadFile(); - // Open Attachment else if (e.getTarget() == bSave) @@ -319,17 +304,6 @@ public class WMediaDialog extends Window implements EventListener } } // onEvent - /************************************************************************** - * Load file - */ - - private void loadFile() - { - Media media = Fileupload.get(); - if (AdempiereWebUI.isEventThreadEnabled()) - processUploadMedia(media); - } // getFileName - private void processUploadMedia(Media media) { if (media == null) return; From 8e8f0e1cd79b1e98f7afc96d605a36aeabcaa383 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Fri, 8 Feb 2013 11:13:33 +0800 Subject: [PATCH 16/20] IDEMPIERE-604 Error if window has more than 1000 rows. --- .../src/org/compiere/model/GridTab.java | 2 ++ .../src/org/compiere/model/GridTable.java | 12 ++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/GridTab.java b/org.adempiere.base/src/org/compiere/model/GridTab.java index d6de605fe6..482539456a 100644 --- a/org.adempiere.base/src/org/compiere/model/GridTab.java +++ b/org.adempiere.base/src/org/compiere/model/GridTab.java @@ -2392,6 +2392,8 @@ public class GridTab implements DataStatusListener, Evaluatee, Serializable newRow = 0; log.fine("Set to first Row"); } + + m_mTable.waitLoadingForRow(newRow); return newRow; } // verifyRow diff --git a/org.adempiere.base/src/org/compiere/model/GridTable.java b/org.adempiere.base/src/org/compiere/model/GridTable.java index aa95094c85..73d1467d8e 100644 --- a/org.adempiere.base/src/org/compiere/model/GridTable.java +++ b/org.adempiere.base/src/org/compiere/model/GridTable.java @@ -1002,7 +1002,7 @@ public class GridTable extends AbstractTableModel return null; } - waitLoadm_sort(row); + waitLoadingForRow(row); // empty buffer if (row >= m_sort.size()) @@ -1022,10 +1022,11 @@ public class GridTable extends AbstractTableModel return rowData[col]; } // getValueAt - private void waitLoadm_sort(int row) { + public void waitLoadingForRow(int row) { // need to wait for data read into buffer int loops = 0; - while (row >= m_sort.size() && m_loaderFuture != null && !m_loaderFuture.isDone() && loops < 15) + //wait for 30 seconds + while (row >= m_sort.size() && m_loaderFuture != null && !m_loaderFuture.isDone() && loops < 60) { log.fine("Waiting for loader row=" + row + ", size=" + m_sort.size()); try @@ -1036,6 +1037,9 @@ public class GridTable extends AbstractTableModel {} loops++; } + if (row >= m_sort.size()) { + throw new IllegalStateException("Timeout loading row " + (row+1)); + } } private Object[] getDataAtRow(int row) @@ -1045,7 +1049,7 @@ public class GridTable extends AbstractTableModel private Object[] getDataAtRow(int row, boolean fetchIfNotFound) { - waitLoadm_sort(row); + waitLoadingForRow(row); MSort sort = (MSort)m_sort.get(row); Object[] rowData = null; if (m_virtual) From 833c126b4d85678487b8e1a22a46ef99f608020e Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Fri, 8 Feb 2013 11:15:51 +0800 Subject: [PATCH 17/20] IDEMPIERE-166 Rebranding of logo and product name. --- org.adempiere.ui.zk/timeout.zul | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.adempiere.ui.zk/timeout.zul b/org.adempiere.ui.zk/timeout.zul index 18746d7f64..ce8d7ce825 100644 --- a/org.adempiere.ui.zk/timeout.zul +++ b/org.adempiere.ui.zk/timeout.zul @@ -1,4 +1,4 @@ - + Date: Fri, 8 Feb 2013 11:16:22 +0800 Subject: [PATCH 18/20] IDEMPIERE-166 Rebranding of logo and product name. --- .../src/org/adempiere/webui/window/AboutWindow.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/AboutWindow.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/AboutWindow.java index d4029cee15..ac9c79d1d8 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/AboutWindow.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/AboutWindow.java @@ -229,12 +229,12 @@ public class AboutWindow extends Window implements EventListener { levelListBox.setEnabled(true); levelListBox.setTooltiptext("Set trace level. Warning: this will effect all session not just the current session"); levelLabel.setTooltiptext("Set trace level. Warning: this will effect all session not just the current session"); - btnAdempiereLog = new Button("Adempiere Log"); - btnAdempiereLog.setTooltiptext("Download adempiere log file from server"); + btnAdempiereLog = new Button("iDempiere Log"); + btnAdempiereLog.setTooltiptext("Download iDempiere log file from server"); btnAdempiereLog.addEventListener(Events.ON_CLICK, this); - btnServerLog = new Button("JBoss Log"); - btnServerLog.setTooltiptext("Download JBoss console log file from server"); + btnServerLog = new Button("Server Log"); + btnServerLog.setTooltiptext("Download iDempiere server log file"); btnServerLog.addEventListener(Events.ON_CLICK, this); hbox.appendChild(new Space()); From b0c4522e1bf650db331cae712ef4c88c88e81ef0 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Fri, 8 Feb 2013 12:06:59 +0800 Subject: [PATCH 19/20] IDEMPIERE-599 Zk: Clean up shortcut key implementation. Key listener js changes break combobox. --- org.adempiere.ui.zk/WEB-INF/src/web/js/zkforge/KeyListener.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/web/js/zkforge/KeyListener.js b/org.adempiere.ui.zk/WEB-INF/src/web/js/zkforge/KeyListener.js index 83b67ac6c5..d51562a4e1 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/web/js/zkforge/KeyListener.js +++ b/org.adempiere.ui.zk/WEB-INF/src/web/js/zkforge/KeyListener.js @@ -96,8 +96,6 @@ zkforge.KeyListener = zk.$extends(zul.Widget, { } evt.preventDefault(); - evt.stopImmediatePropagation(); - evt.stop(); zAu.send(new zk.Event(zk.Widget.$(this), 'onCtrlKey', {keyCode: keycode, ctrlKey: evt.ctrlKey, shiftKey: evt.shiftKey, altKey: evt.altKey}, {toServer: true})); From 3e5608734b209c35eacf3a3f21591764b3e1c845 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Fri, 8 Feb 2013 12:58:04 +0800 Subject: [PATCH 20/20] IDEMPIERE-619 Zk: Always show processing prompt when server is processing login request. --- .../src/org/adempiere/webui/AdempiereWebUI.java | 4 ++++ .../src/org/adempiere/webui/panel/LoginPanel.java | 2 ++ .../src/org/adempiere/webui/panel/RolePanel.java | 5 +++++ .../src/org/adempiere/webui/window/LoginWindow.java | 11 +++++++---- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereWebUI.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereWebUI.java index f29493414b..6ce954d507 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereWebUI.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereWebUI.java @@ -51,6 +51,7 @@ import org.compiere.util.Language; import org.zkforge.keylistener.Keylistener; import org.zkoss.web.Attributes; import org.zkoss.web.servlet.Servlets; +import org.zkoss.zk.au.out.AuScript; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.Page; @@ -67,6 +68,7 @@ import org.zkoss.zk.ui.sys.ExecutionCtrl; import org.zkoss.zk.ui.sys.ExecutionsCtrl; import org.zkoss.zk.ui.sys.SessionCtrl; import org.zkoss.zk.ui.sys.Visualizer; +import org.zkoss.zk.ui.util.Clients; import org.zkoss.zul.Window; /** @@ -344,6 +346,8 @@ public class AdempiereWebUI extends Window implements EventListener, IWeb keyListener.setPage(this.getPage()); keyListener.setCtrlKeys("@a@c@d@e@f@h@n@o@p@r@s@t@z@x@#left@#right@#up@#down@#home@#end#enter"); keyListener.setAutoBlur(false); + + Clients.response(new AuScript("zAu.cmd0.clearBusy()")); } /** diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/LoginPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/LoginPanel.java index 1558e2407c..2d0d9eb6cf 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/LoginPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/LoginPanel.java @@ -243,6 +243,8 @@ public class LoginPanel extends Window implements EventListener div.setSclass(ITheme.LOGIN_BOX_FOOTER_CLASS); ConfirmPanel pnlButtons = new ConfirmPanel(false, false, false, false, false, false, true); pnlButtons.addActionListener(this); + Button okBtn = pnlButtons.getButton(ConfirmPanel.A_OK); + okBtn.setWidgetListener("onClick", "zAu.cmd0.showBusy(null)"); Button helpButton = pnlButtons.createButton(ConfirmPanel.A_HELP); helpButton.addEventListener(Events.ON_CLICK, this); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/RolePanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/RolePanel.java index 76e5242acf..03257fab01 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/RolePanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/RolePanel.java @@ -51,6 +51,7 @@ import org.zkoss.zhtml.Table; import org.zkoss.zhtml.Td; import org.zkoss.zhtml.Tr; import org.zkoss.zk.au.out.AuFocus; +import org.zkoss.zk.au.out.AuScript; import org.zkoss.zk.ui.WrongValueException; import org.zkoss.zk.ui.event.Deferrable; import org.zkoss.zk.ui.event.Event; @@ -136,6 +137,7 @@ public class RolePanel extends Window implements EventListener, Deferrabl private void init() { + Clients.response(new AuScript("zAu.cmd0.clearBusy()")); Div div = new Div(); div.setSclass(ITheme.LOGIN_BOX_HEADER_CLASS); Label label = new Label("Login"); @@ -225,6 +227,9 @@ public class RolePanel extends Window implements EventListener, Deferrabl div.setSclass(ITheme.LOGIN_BOX_FOOTER_CLASS); ConfirmPanel pnlButtons = new ConfirmPanel(true, false, false, false, false, false, true); pnlButtons.addActionListener(this); + Button okBtn = pnlButtons.getButton(ConfirmPanel.A_OK); + okBtn.setWidgetListener("onClick", "zAu.cmd0.showBusy(null)"); + LayoutUtils.addSclass(ITheme.LOGIN_BOX_FOOTER_PANEL_CLASS, pnlButtons); pnlButtons.setWidth(null); pnlButtons.getButton(ConfirmPanel.A_OK).setSclass(ITheme.LOGIN_BUTTON_CLASS); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/LoginWindow.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/LoginWindow.java index a199ecbb77..b8d739fc54 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/LoginWindow.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/LoginWindow.java @@ -73,6 +73,7 @@ public class LoginWindow extends FWindow implements EventListener init(); // add listener on 'ENTER' key for the login window addEventListener(Events.ON_OK,this); + setWidgetListener("onOK", "zAu.cmd0.showBusy(null)"); } private void init() @@ -135,11 +136,13 @@ public class LoginWindow extends FWindow implements EventListener { rolePanel.validateRoles(); } - - LoginPanel loginPanel = (LoginPanel)this.getFellowIfAny("loginPanel"); - if (loginPanel != null) + else { - loginPanel.validateLogin(); + LoginPanel loginPanel = (LoginPanel)this.getFellowIfAny("loginPanel"); + if (loginPanel != null) + { + loginPanel.validateLogin(); + } } } }