diff --git a/_Project-ID-ADempiere/sqls_3.1.1/10_update_sys_sequences.sql b/_Project-ID-ADempiere/sqls_3.1.1/10_update_sys_sequences.sql new file mode 100644 index 0000000000..8c154588ee --- /dev/null +++ b/_Project-ID-ADempiere/sqls_3.1.1/10_update_sys_sequences.sql @@ -0,0 +1,3 @@ +UPDATE ad_sequence + SET currentnextsys = 50000 + WHERE istableid = 'Y' diff --git a/_Project-ID-ADempiere/sqls_3.1.1/20_insert_new_messages.sql b/_Project-ID-ADempiere/sqls_3.1.1/20_insert_new_messages.sql new file mode 100644 index 0000000000..5067f076ca --- /dev/null +++ b/_Project-ID-ADempiere/sqls_3.1.1/20_insert_new_messages.sql @@ -0,0 +1,55 @@ +INSERT INTO ad_message + (ad_message_id, ad_client_id, ad_org_id, isactive, created, + createdby, updated, updatedby, VALUE, msgtext, msgtype, + entitytype + ) + VALUES (50000, 0, 0, 'Y', SYSDATE, + 0, SYSDATE, 0, 'CloseAllWindows', 'Close All Windows', 'I', + 'D' + ); + +INSERT INTO ad_message + (ad_message_id, ad_client_id, ad_org_id, isactive, created, + createdby, updated, updatedby, VALUE, msgtext, msgtype, + entitytype + ) + VALUES (50001, 0, 0, 'Y', SYSDATE, + 0, SYSDATE, 0, 'CloseOtherWindows', 'Close Other Windows', 'I', + 'D' + ); + +INSERT INTO ad_message + (ad_message_id, ad_client_id, ad_org_id, isactive, created, + createdby, updated, updatedby, VALUE, + msgtext, msgtype, entitytype + ) + VALUES (50002, 0, 0, 'Y', SYSDATE, + 0, SYSDATE, 0, 'ValidateConnectionOnStartup', + 'Validate Connection on Startup', 'I', 'D' + ); + +INSERT INTO ad_message + (ad_message_id, ad_client_id, ad_org_id, isactive, created, + createdby, updated, updatedby, VALUE, + msgtext, msgtype, entitytype + ) + VALUES (50003, 0, 0, 'Y', SYSDATE, + 0, SYSDATE, 0, 'SingleInstancePerWindow', + 'Single Instance per Window', 'I', 'D' + ); + +INSERT INTO ad_message + (ad_message_id, ad_client_id, ad_org_id, isactive, created, + createdby, updated, updatedby, VALUE, msgtext, + msgtype, entitytype + ) + VALUES (50004, 0, 0, 'Y', SYSDATE, + 0, SYSDATE, 0, 'OpenWindowMaximized', 'Open Window Maximized', + 'I', 'D' + ); + +UPDATE ad_sequence + SET currentnextsys = 50005 + WHERE NAME = 'AD_Message'; + +COMMIT ; diff --git a/client/src/org/compiere/apps/AEnv.java b/client/src/org/compiere/apps/AEnv.java index 4cc926ab3c..a0716abb0e 100644 --- a/client/src/org/compiere/apps/AEnv.java +++ b/client/src/org/compiere/apps/AEnv.java @@ -297,6 +297,11 @@ public final class AEnv if (ADialog.ask(WindowNo, c, "ExitApplication?")) Env.exitEnv(0); } + else if (actionCommand.equals("Logout")) + { + AMenu aMenu = (AMenu)Env.getWindow(WindowNo); + aMenu.logout(); + } // View Menu ------------------------ else if (actionCommand.equals("InfoProduct")) @@ -373,8 +378,9 @@ public final class AEnv } else if (actionCommand.equals("Preference")) { - if (role.isShowPreference()) + if (role.isShowPreference()) { AEnv.showCenterScreen(new Preference (Env.getFrame(c), WindowNo)); + } } // Help Menu ------------------------ @@ -552,6 +558,24 @@ public final class AEnv Env.exitEnv(status); } // exit + public static void logout() + { + if (s_server != null) + { + try + { + s_server.remove(); + } + catch (Exception ex) + { + } + } + Env.logout(); + + //reload + new AMenu(); + } + /** * Is Workflow Process view enabled. * @return true if enabled @@ -606,9 +630,15 @@ public final class AEnv } // AWindow frame = new AWindow(); + ((AMenu)Env.getWindow(0)).getWindowManager().add(frame); if (!frame.initWindow(s_workflow_Window_ID, query)) return; - AEnv.showCenterScreen(frame); + if (Ini.isPropertyBool(Ini.P_OPEN_WINDOW_MAXIMIZED) ) { + frame.setExtendedState(Frame.MAXIMIZED_BOTH); + frame.setVisible(true); + frame.toFront(); + } else + AEnv.showCenterScreen(frame); frame = null; } // startWorkflowProcess @@ -862,4 +892,4 @@ public final class AEnv } } // cacheReset -} // AEnv +} // AEnv \ No newline at end of file diff --git a/client/src/org/compiere/apps/AMenu.java b/client/src/org/compiere/apps/AMenu.java index f9bfabebfb..ead1bef236 100644 --- a/client/src/org/compiere/apps/AMenu.java +++ b/client/src/org/compiere/apps/AMenu.java @@ -108,7 +108,7 @@ public final class AMenu extends CFrame updateInfo(); // splash.dispose(); - splash = null; + splash = null; } // AMenu private int m_WindowNo; @@ -134,6 +134,8 @@ public final class AMenu extends CFrame /** Logger */ private static CLogger log = CLogger.getCLogger(AMenu.class); + private WindowManager windowManager = new WindowManager(); + /************************************************************************** * Init System. @@ -312,6 +314,7 @@ public final class AMenu extends CFrame AEnv.addMenuItem("PrintScreen", null, KeyStroke.getKeyStroke(KeyEvent.VK_PRINTSCREEN, 0), mFile, this); AEnv.addMenuItem("ScreenShot", null, KeyStroke.getKeyStroke(KeyEvent.VK_PRINTSCREEN, KeyEvent.SHIFT_MASK), mFile, this); mFile.addSeparator(); + AEnv.addMenuItem("Logout", null, KeyStroke.getKeyStroke(KeyEvent.VK_L, Event.SHIFT_MASK+Event.ALT_MASK), mFile, this); AEnv.addMenuItem("Exit", null, KeyStroke.getKeyStroke(KeyEvent.VK_X, Event.SHIFT_MASK+Event.ALT_MASK), mFile, this); // View @@ -345,6 +348,10 @@ public final class AMenu extends CFrame mTools.addSeparator(); AEnv.addMenuItem("Preference", null, null, mTools, this); } + + //Window Menu + JMenu mWindow = new WindowMenu(windowManager, this); + menuBar.add(mWindow); // Help JMenu mHelp = AEnv.getMenu("Help"); @@ -367,6 +374,14 @@ public final class AMenu extends CFrame super.dispose(); AEnv.exit(0); } // dispose + + public void logout() + { + windowManager.close(); + Ini.saveProperties(true); + super.dispose(); + AEnv.logout(); + } /** * Window Events - requestFocus @@ -593,6 +608,9 @@ public final class AMenu extends CFrame wfActivity.display(); } // stateChanged + public WindowManager getWindowManager() { + return windowManager; + } /************************************************************************** * Mouse Listener @@ -625,4 +643,4 @@ public final class AMenu extends CFrame AMenu menu = new AMenu(); } // main -} // AMenu +} // AMenu \ No newline at end of file diff --git a/client/src/org/compiere/apps/AMenuStartItem.java b/client/src/org/compiere/apps/AMenuStartItem.java index 3a8af58fb5..2b9273a0a3 100644 --- a/client/src/org/compiere/apps/AMenuStartItem.java +++ b/client/src/org/compiere/apps/AMenuStartItem.java @@ -16,6 +16,7 @@ *****************************************************************************/ package org.compiere.apps; +import java.awt.Frame; import java.awt.event.*; import java.sql.*; import java.util.logging.*; @@ -205,11 +206,22 @@ public class AMenuStartItem extends Thread implements ActionListener */ private void startWindow(int AD_Workbench_ID, int AD_Window_ID) { - if (Env.showWindow(AD_Window_ID)) + AWindow frame = (AWindow)Env.showWindow(AD_Window_ID); + if (frame != null) { + m_menu.getWindowManager().add(frame); return; + } + + if (Ini.isPropertyBool(Ini.P_SINGLE_INSTANCE_PER_WINDOW)) { + frame = m_menu.getWindowManager().find(AD_Window_ID); + if ( frame != null ) { + frame.toFront(); + return; + } + } SwingUtilities.invokeLater(m_updatePB); // 1 - AWindow frame = new AWindow(); + frame = new AWindow(); boolean OK = false; if (AD_Workbench_ID != 0) OK = frame.initWorkbench(AD_Workbench_ID); @@ -219,11 +231,20 @@ public class AMenuStartItem extends Thread implements ActionListener return; SwingUtilities.invokeLater(m_updatePB); // 2 - frame.pack(); - + if (Ini.isPropertyBool(Ini.P_OPEN_WINDOW_MAXIMIZED) ) + frame.setExtendedState(Frame.MAXIMIZED_BOTH); + else + frame.pack(); + // Center the window SwingUtilities.invokeLater(m_updatePB); // 3 - AEnv.showCenterScreen(frame); + if (Ini.isPropertyBool(Ini.P_OPEN_WINDOW_MAXIMIZED) ) + frame.setVisible(true); + else + AEnv.showCenterScreen(frame); + frame.toFront(); + m_menu.getWindowManager().add(frame); + // if (wfPanel.isVisible()) // m_WF_Window = frame; // maintain one reference frame = null; @@ -246,6 +267,7 @@ public class AMenuStartItem extends Thread implements ActionListener if (!pd.init()) return; m_timer.start(); + m_menu.getWindowManager().add(pd); SwingUtilities.invokeLater(m_updatePB); // 2 pd.pack(); @@ -282,7 +304,7 @@ public class AMenuStartItem extends Thread implements ActionListener return; SwingUtilities.invokeLater(m_updatePB); // 2 - new ATask(m_name, task); + m_menu.getWindowManager().add(new ATask(m_name, task)); // ATask.start(m_name, task); } // startTask @@ -292,14 +314,27 @@ public class AMenuStartItem extends Thread implements ActionListener */ private void startForm (int AD_Form_ID) { - FormFrame ff = new FormFrame(); + FormFrame ff = null; + if (Ini.isPropertyBool(Ini.P_SINGLE_INSTANCE_PER_WINDOW)) { + ff = m_menu.getWindowManager().findForm(AD_Form_ID); + if ( ff != null ) { + ff.toFront(); + return; + } + } + ff = new FormFrame(); + m_menu.getWindowManager().add(ff); SwingUtilities.invokeLater(m_updatePB); // 1 ff.openForm(AD_Form_ID); SwingUtilities.invokeLater(m_updatePB); // 2 - ff.pack(); + if (Ini.isPropertyBool(Ini.P_OPEN_WINDOW_MAXIMIZED) == false) + ff.pack(); // Center the window SwingUtilities.invokeLater(m_updatePB); // 3 - AEnv.showCenterScreen(ff); + if (Ini.isPropertyBool(Ini.P_OPEN_WINDOW_MAXIMIZED) ) + ff.setExtendedState(Frame.MAXIMIZED_BOTH); + else + AEnv.showCenterScreen(ff); } // startForm -} // StartItem +} // StartItem \ No newline at end of file diff --git a/client/src/org/compiere/apps/APanel.java b/client/src/org/compiere/apps/APanel.java index 5011f11bd6..89ebd77aac 100644 --- a/client/src/org/compiere/apps/APanel.java +++ b/client/src/org/compiere/apps/APanel.java @@ -52,9 +52,11 @@ public final class APanel extends CPanel * Constructs a new instance. * Need to call initPanel for dynamic initialization */ - public APanel() + public APanel(AWindow window) { super(); + m_window = window; + m_ctx = Env.getCtx(); // try @@ -71,6 +73,8 @@ public final class APanel extends CPanel /** Logger */ private static CLogger log = CLogger.getCLogger(APanel.class); + private AWindow m_window; + /** * Dispose */ @@ -144,6 +148,8 @@ public final class APanel extends CPanel this.add(northPanel, BorderLayout.NORTH); northPanel.setLayout(northLayout); northLayout.setAlignment(FlowLayout.LEFT); + toolBar.putClientProperty("JToolBar.isRollover", Boolean.TRUE); + //toolBar.setBorderPainted(false); northPanel.add(toolBar, null); } // jbInit @@ -248,6 +254,12 @@ public final class APanel extends CPanel mTools.addSeparator(); aPreference = addAction("Preference", mTools, null, false); } + + //Window + AMenu aMenu = (AMenu)Env.getWindow(0); + JMenu mWindow = new WindowMenu(aMenu.getWindowManager(), m_window); + menuBar.add(mWindow); + // Help JMenu mHelp = AEnv.getMenu("Help"); menuBar.add(mHelp); @@ -619,7 +631,7 @@ public final class APanel extends CPanel } // Workbench Loop // stateChanged (<->) triggered - toolBar.setName(getTitle()); + toolBar.setName(getTitle()); m_curTab.getTableModel().setChanged(false); // Set Detail Button aDetail.setEnabled(0 != m_curWinTab.getTabCount()-1); @@ -1921,4 +1933,4 @@ public final class APanel extends CPanel return s; } // toString -} // APanel +} // APanel \ No newline at end of file diff --git a/client/src/org/compiere/apps/AWindow.java b/client/src/org/compiere/apps/AWindow.java index e686c36ff2..df24935644 100644 --- a/client/src/org/compiere/apps/AWindow.java +++ b/client/src/org/compiere/apps/AWindow.java @@ -49,7 +49,8 @@ public class AWindow extends CFrame /** The GlassPane */ private AGlassPane m_glassPane = new AGlassPane(); /** Application Window */ - private APanel m_APanel = new APanel(); + private APanel m_APanel = new APanel(this); + /** Logger */ private static CLogger log = CLogger.getCLogger(AWindow.class); @@ -188,4 +189,4 @@ public class AWindow extends CFrame return getName() + "_" + getWindowNo(); } // toString -} // AWindow +} // AWindow \ No newline at end of file diff --git a/client/src/org/compiere/apps/Preference.java b/client/src/org/compiere/apps/Preference.java index c0037549ba..330815baf0 100644 --- a/client/src/org/compiere/apps/Preference.java +++ b/client/src/org/compiere/apps/Preference.java @@ -83,6 +83,9 @@ public final class Preference extends CDialog private CCheckBox autoCommit = new CCheckBox(); private CCheckBox autoNew = new CCheckBox(); private CCheckBox printPreview = new CCheckBox(); + private CCheckBox validateConnectionOnStartup = new CCheckBox(); + private CCheckBox singleInstancePerWindow = new CCheckBox(); + private CCheckBox openWindowMaximized = new CCheckBox(); private CPanel southPanel = new CPanel(); private BorderLayout southLayout = new BorderLayout(); private BorderLayout icontextLayout = new BorderLayout(); @@ -161,6 +164,12 @@ public final class Preference extends CDialog adempiereSys.setToolTipText(Msg.getMsg(Env.getCtx(), "AdempiereSys", false)); printPreview.setText(Msg.getMsg(Env.getCtx(), "AlwaysPrintPreview", true)); printPreview.setToolTipText(Msg.getMsg(Env.getCtx(), "AlwaysPrintPreview", false)); + validateConnectionOnStartup.setText(Msg.getMsg(Env.getCtx(), "ValidateConnectionOnStartup", true)); + validateConnectionOnStartup.setToolTipText(Msg.getMsg(Env.getCtx(), "ValidateConnectionOnStartup", false)); + singleInstancePerWindow.setText(Msg.getMsg(Env.getCtx(), "SingleInstancePerWindow", true)); + singleInstancePerWindow.setToolTipText(Msg.getMsg(Env.getCtx(), "SingleInstancePerWindow", false)); + openWindowMaximized.setText(Msg.getMsg(Env.getCtx(), "OpenWindowMaximized", true)); + openWindowMaximized.setToolTipText(Msg.getMsg(Env.getCtx(), "OpenWindowMaximized", false)); autoLogin.setText(Msg.getMsg(Env.getCtx(), "AutoLogin", true)); autoLogin.setToolTipText(Msg.getMsg(Env.getCtx(), "AutoLogin", false)); storePassword.setText(Msg.getMsg(Env.getCtx(), "StorePassword", true)); @@ -236,6 +245,12 @@ public final class Preference extends CDialog ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); customizePane.add(printPreview, new GridBagConstraints(2, 9, 1, 1, 0.0, 0.0 ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + customizePane.add(validateConnectionOnStartup, new GridBagConstraints(1, 10, 1, 1, 0.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + customizePane.add(singleInstancePerWindow, new GridBagConstraints(2, 10, 1, 1, 0.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + customizePane.add(openWindowMaximized, new GridBagConstraints(1, 11, 1, 1, 0.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); // Info // tabPane.add(contextPane, Msg.getMsg(Env.getCtx(), "Context")); tabPane.add(contextPane, Msg.getMsg(Env.getCtx(), "Context")); @@ -393,6 +408,15 @@ public final class Preference extends CDialog // Print Preview printPreview.setSelected(Ini.isPropertyBool(Ini.P_PRINTPREVIEW)); + // Validate Connection on Startup + validateConnectionOnStartup.setSelected(Ini.isPropertyBool(Ini.P_VALIDATE_CONNECTION_ON_STARTUP)); + + // Single Instance per Window + singleInstancePerWindow.setSelected(Ini.isPropertyBool(Ini.P_SINGLE_INSTANCE_PER_WINDOW)); + + // Open Window Maximized + openWindowMaximized.setSelected(Ini.isPropertyBool(Ini.P_OPEN_WINDOW_MAXIMIZED)); + // TraceLevel traceLevel.setSelectedItem(CLogMgt.getLevel()); traceFile.setSelected(Ini.isPropertyBool(Ini.P_TRACEFILE)); @@ -460,6 +484,12 @@ public final class Preference extends CDialog // Print Preview Ini.setProperty(Ini.P_PRINTPREVIEW, (printPreview.isSelected())); + // Validate Connection on Startup + Ini.setProperty(Ini.P_VALIDATE_CONNECTION_ON_STARTUP, (validateConnectionOnStartup.isSelected())); + // Single Instance per Window + Ini.setProperty(Ini.P_SINGLE_INSTANCE_PER_WINDOW, (singleInstancePerWindow.isSelected())); + // Open Window Maximized + Ini.setProperty(Ini.P_OPEN_WINDOW_MAXIMIZED, (openWindowMaximized.isSelected())); // TraceLevel/File Level level = (Level)traceLevel.getSelectedItem(); CLogMgt.setLevel(level); diff --git a/client/src/org/compiere/apps/WindowManager.java b/client/src/org/compiere/apps/WindowManager.java new file mode 100644 index 0000000000..fb8b4c5226 --- /dev/null +++ b/client/src/org/compiere/apps/WindowManager.java @@ -0,0 +1,185 @@ +/****************************************************************************** + * Product: Adempiere ERP & CRM Smart Business Solution * + * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + * For the text or an alternative of this public license, you may reach us * + * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * + * or via info@compiere.org or http://www.compiere.org/license.html * + *****************************************************************************/ +package org.compiere.apps; + +import java.awt.Component; +import java.awt.Window; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; +import java.util.ArrayList; +import java.util.List; + +import org.compiere.apps.form.FormFrame; +import org.compiere.swing.CFrame; + +/** + * Managed a list of window. + * @author Low Heng Sin + * @version 2006/11/20 + */ +public class WindowManager { + public WindowManager() {} + private List windows = new ArrayList(); + private WindowEventListener eventListener = new WindowEventListener(this); + + /** + * Add window + * @param window + */ + public void add(CFrame window) { + windows.add(window); + window.addComponentListener(eventListener); + window.addWindowListener(eventListener); + } + + /** + * Close all windows managed by this window manager. + */ + public void close() { + for ( CFrame w : windows ) { + w.removeComponentListener(eventListener); + w.removeWindowListener(eventListener); + w.dispose(); + } + windows = new ArrayList(); + } + + /** + * Close all except one window. + * @param window + */ + public void closeOthers(CFrame window) { + for ( CFrame w : windows ) { + w.removeComponentListener(eventListener); + w.removeWindowListener(eventListener); + if ( !w.equals(window)) { + w.dispose(); + } + } + windows = new ArrayList(); + add(window); + } + + /** + * Remove window + * @param window + */ + public void remove(CFrame window) { + if ( windows.remove(window) ) { + window.removeComponentListener(eventListener); + window.removeWindowListener(eventListener); + } + } + + /** + * Get list of windows managed by this window manager + * @return Array of windows + */ + public CFrame[] getWindows() { + CFrame[] a = new CFrame[windows.size()]; + return windows.toArray(a); + } + + /** + * @return Number of windows managed by this window manager + */ + public int getWindowCount() { + return windows.size(); + } + + /** + * Find window by ID + * @param AD_Window_ID + * @return AWindow reference, null if not found + */ + public AWindow find(int AD_Window_ID) { + for ( CFrame w : windows ) { + if ( w instanceof AWindow ) { + AWindow a = (AWindow)w; + if ( a.getAD_Window_ID() == AD_Window_ID ) + return a; + } + } + return null; + } + + public FormFrame findForm(int AD_FORM_ID) { + for ( CFrame w : windows ) { + if ( w instanceof FormFrame ) { + FormFrame ff = (FormFrame)w; + if ( ff.getAD_Form_ID() == AD_FORM_ID ) + return ff; + } + } + return null; + } +} + +class WindowEventListener implements ComponentListener, WindowListener { + WindowManager windowManager; + + protected WindowEventListener(WindowManager windowManager) { + this.windowManager = windowManager; + } + + public void componentHidden(ComponentEvent e) { + Component c = e.getComponent(); + if ( c instanceof CFrame ) { + c.removeComponentListener(this); + ((CFrame)c).removeWindowListener(this); + windowManager.remove((CFrame)c); + } + } + + public void componentMoved(ComponentEvent e) { + } + + public void componentResized(ComponentEvent e) { + } + + public void componentShown(ComponentEvent e) { + } + + public void windowActivated(WindowEvent e) { + } + + public void windowClosed(WindowEvent e) { + Window w = e.getWindow(); + if ( w instanceof CFrame ) { + w.removeComponentListener(this); + w.removeWindowListener(this); + windowManager.remove((CFrame)w); + } + } + + public void windowClosing(WindowEvent e) { + } + + public void windowDeactivated(WindowEvent e) { + } + + public void windowDeiconified(WindowEvent e) { + } + + public void windowIconified(WindowEvent e) { + } + + public void windowOpened(WindowEvent e) { + } +} \ No newline at end of file diff --git a/client/src/org/compiere/apps/WindowMenu.java b/client/src/org/compiere/apps/WindowMenu.java new file mode 100644 index 0000000000..030083b32e --- /dev/null +++ b/client/src/org/compiere/apps/WindowMenu.java @@ -0,0 +1,155 @@ +/****************************************************************************** + * Product: Adempiere ERP & CRM Smart Business Solution * + * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + * For the text or an alternative of this public license, you may reach us * + * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * + * or via info@compiere.org or http://www.compiere.org/license.html * + *****************************************************************************/ +package org.compiere.apps; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.event.MenuEvent; +import javax.swing.event.MenuListener; + +import org.compiere.swing.CFrame; +import org.compiere.util.Env; +import org.compiere.util.Msg; + +/** + * Menu component that handles the functionality expected of a standard + * "Windows" menu for MDI or MDI-like applications. + * + * @author Low Heng Sin + * @version 2006/11/20 + */ +public class WindowMenu extends JMenu { + private WindowManager windowManager; + private JFrame frame; + private JMenuItem closeAll=new JMenuItem("Close All Windows"); + private JMenuItem closeOthers = new JMenuItem("Close Other Windows"); + + private void setEnvText(JMenu menu, String msg) { + String text = Msg.getMsg(Env.getCtx(), msg); + int pos = text.indexOf("&"); + if (pos != -1 && text.length() > pos) // We have a nemonic + { + char ch = text.toUpperCase().charAt(pos+1); + if (ch != ' ') + { + text = text.substring(0, pos) + text.substring(pos+1); + menu.setMnemonic(ch); + } + } + menu.setText(text); + } + + private void setEnvText(JMenuItem menu, String msg) { + String text = Msg.getMsg(Env.getCtx(), msg); + int pos = text.indexOf("&"); + if (pos != -1 && text.length() > pos) // We have a nemonic + { + char ch = text.toUpperCase().charAt(pos+1); + if (ch != ' ') + { + text = text.substring(0, pos) + text.substring(pos+1); + menu.setMnemonic(ch); + } + } + menu.setText(text); + } + + public WindowMenu(WindowManager windowManager, JFrame frame) { + this.windowManager = windowManager; + this.frame = frame; + setEnvText(this, "Window"); + closeAll.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent ae) { + WindowMenu.this.windowManager.close(); + } + }); + setEnvText(closeAll, "CloseAllWindows"); + closeOthers.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent ae) { + WindowMenu.this.windowManager.closeOthers((AWindow)WindowMenu.this.frame); + } + }); + setEnvText(closeOthers, "CloseOtherWindows"); + addMenuListener(new MenuListener() { + public void menuCanceled (MenuEvent e) {} + + public void menuDeselected (MenuEvent e) { + removeAll(); + } + + public void menuSelected (MenuEvent e) { + buildChildMenus(); + } + }); + } + + /* Sets up the children menus depending on the current desktop state */ + private void buildChildMenus() { + this.removeAll(); + int i; + ChildMenuItem menu; + CFrame[] array = windowManager.getWindows(); + + if ( !(frame instanceof AMenu) ) + add(closeOthers); + add(closeAll); + if (array.length > 0) { + closeAll.setEnabled(true); + if ( array.length > 1 ) + closeOthers.setEnabled(true); + else + closeOthers.setEnabled(false); + addSeparator(); + } else { + closeAll.setEnabled(false); + closeOthers.setEnabled(false); + } + + for (i = 0; i < array.length; i++) { + menu = new ChildMenuItem(array[i]); + menu.setState(array[i].equals(frame)); + menu.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent ae) { + CFrame frame = ((ChildMenuItem)ae.getSource()).getWindow(); + frame.toFront(); + } + }); + //menu.setIcon(array[i].getIconImage()); + add(menu); + } + } + + /* This JCheckBoxMenuItem descendant is used to track the child frame that corresponds + to a give menu. */ + class ChildMenuItem extends JCheckBoxMenuItem { + private CFrame window; + + public ChildMenuItem(CFrame window) { + super(window.getTitle()); + this.window=window; + } + + public CFrame getWindow() { + return window; + } + } +} \ No newline at end of file diff --git a/client/src/org/compiere/apps/form/FormFrame.java b/client/src/org/compiere/apps/form/FormFrame.java index afbe772a6c..194015ac4f 100644 --- a/client/src/org/compiere/apps/form/FormFrame.java +++ b/client/src/org/compiere/apps/form/FormFrame.java @@ -81,7 +81,10 @@ public class FormFrame extends CFrame public boolean m_maximize = false; /** Logger */ private static CLogger log = CLogger.getCLogger(FormFrame.class); - + + /** Form ID */ + private int p_AD_Form_ID = 0; + /** * Static Init * @throws Exception @@ -233,6 +236,7 @@ public class FormFrame extends CFrame } // m_panel.init(m_WindowNo, this); + p_AD_Form_ID = AD_Form_ID; return true; } // openForm @@ -353,5 +357,13 @@ public class FormFrame extends CFrame worker.start(); return worker; } // startBatch - + + /** + * @return Returns the AD_Form_ID. + */ + public int getAD_Form_ID () + { + return p_AD_Form_ID; + } // getAD_Window_ID + } // FormFrame diff --git a/dbPort/src/org/compiere/util/Env.java b/dbPort/src/org/compiere/util/Env.java index 697abbf3ec..5ca5a7458e 100644 --- a/dbPort/src/org/compiere/util/Env.java +++ b/dbPort/src/org/compiere/util/Env.java @@ -60,6 +60,20 @@ public final class Env System.exit (status); } // close + /** + * Logout from the system + */ + public static void logout() + { + // End Session + MSession session = MSession.get(Env.getCtx(), false); // finish + if (session != null) + session.logout(); + // + reset(true); // final cache reset + // + } + /** * Reset Cache * @param finalCall everything otherwise login data remains @@ -1345,8 +1359,15 @@ public final class Env window.setVisible(false); s_log.info(window.toString()); // window.dispatchEvent(new WindowEvent(window, WindowEvent.WINDOW_ICONIFIED)); - if (s_hiddenWindows.size() > 10) - s_hiddenWindows.remove(0); // sort of lru + if (s_hiddenWindows.size() > 10) { + CFrame toClose = s_hiddenWindows.remove(0); // sort of lru + try { + s_closingWindows = true; + toClose.dispose(); + } finally { + s_closingWindows = false; + } + } return true; } } @@ -1358,7 +1379,7 @@ public final class Env * @param AD_Window_ID window * @return true if window re-displayed */ - static public boolean showWindow (int AD_Window_ID) + static public CFrame showWindow (int AD_Window_ID) { for (int i = 0; i < s_hiddenWindows.size(); i++) { @@ -1369,10 +1390,10 @@ public final class Env s_log.info(hidden.toString()); hidden.setVisible(true); hidden.toFront(); - return true; + return hidden; } } - return false; + return null; } // showWindow /** @@ -1433,4 +1454,4 @@ public final class Env s_ctx.put(LANGUAGE, Language.getBaseAD_Language()); } // static -} // Env +} // Env \ No newline at end of file diff --git a/looks/src/org/compiere/util/Ini.java b/looks/src/org/compiere/util/Ini.java index 2a276e4cf0..c13440ba8e 100644 --- a/looks/src/org/compiere/util/Ini.java +++ b/looks/src/org/compiere/util/Ini.java @@ -126,6 +126,17 @@ public final class Ini implements Serializable /** Print Preview */ public static final String P_PRINTPREVIEW = "PrintPreview"; private static final boolean DEFAULT_PRINTPREVIEW = false; + /** Validate connection on startup */ + public static final String P_VALIDATE_CONNECTION_ON_STARTUP = "ValidateConnectionOnStartup"; + private static final boolean DEFAULT_VALIDATE_CONNECTION_ON_STARTUP = false; + + /** Single instance per window id **/ + public static final String P_SINGLE_INSTANCE_PER_WINDOW = "SingleInstancePerWindow"; + public static final boolean DEFAULT_SINGLE_INSTANCE_PER_WINDOW = false; + + /** Open new windows as maximized **/ + public static final String P_OPEN_WINDOW_MAXIMIZED = "OpenWindowMaximized"; + public static final boolean DEFAULT_OPEN_WINDOW_MAXIMIZED = false; // private static final String P_WARNING = "Warning"; private static final String DEFAULT_WARNING = "Do_not_change_any_of_the_data_as_they_will_have_undocumented_side_effects."; @@ -144,6 +155,9 @@ public final class Ini implements Serializable P_CONTEXT, P_TEMP_DIR, P_ROLE, P_CLIENT, P_ORG, P_PRINTER, P_WAREHOUSE, P_TODAY, P_PRINTPREVIEW, + P_VALIDATE_CONNECTION_ON_STARTUP, + P_SINGLE_INSTANCE_PER_WINDOW, + P_OPEN_WINDOW_MAXIMIZED, P_WARNING, P_WARNING_de }; /** Ini Property Values */ @@ -158,6 +172,9 @@ public final class Ini implements Serializable DEFAULT_CONTEXT, DEFAULT_TEMP_DIR, DEFAULT_ROLE, DEFAULT_CLIENT, DEFAULT_ORG, DEFAULT_PRINTER, DEFAULT_WAREHOUSE, DEFAULT_TODAY.toString(), DEFAULT_PRINTPREVIEW?"Y":"N", + DEFAULT_VALIDATE_CONNECTION_ON_STARTUP?"Y":"N", + DEFAULT_SINGLE_INSTANCE_PER_WINDOW?"Y":"N", + DEFAULT_OPEN_WINDOW_MAXIMIZED?"Y":"N", DEFAULT_WARNING, DEFAULT_WARNING_de };