/****************************************************************************** * 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.BorderLayout; import java.awt.ComponentOrientation; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Event; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Insets; import java.awt.KeyboardFocusManager; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.math.BigDecimal; import java.text.MessageFormat; import java.util.Properties; import java.util.logging.Level; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JProgressBar; import javax.swing.KeyStroke; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.adempiere.apps.graph.PAPanel; import org.adempiere.plaf.AdempierePLAF; import org.compiere.Adempiere; import org.compiere.apps.wf.WFActivity; import org.compiere.apps.wf.WFPanel; import org.compiere.grid.tree.VTreePanel; import org.compiere.model.MRole; import org.compiere.model.MSession; import org.compiere.model.MSysConfig; import org.compiere.model.MSystem; import org.compiere.model.MTreeNode; import org.compiere.model.MUser; import org.compiere.swing.CButton; import org.compiere.swing.CFrame; import org.compiere.swing.CPanel; import org.compiere.swing.CScrollPane; import org.compiere.swing.CTabbedPane; import org.compiere.util.CLogger; import org.compiere.util.DB; import org.compiere.util.Env; import org.compiere.util.Ini; import org.compiere.util.Language; import org.compiere.util.Msg; import org.compiere.util.Splash; import org.omidp.util.LocaleUtil; /** * Application Menu Controller * * @author Jorg Janke * @version $Id: AMenu.java,v 1.2 2006/07/30 00:51:27 jjanke Exp $ * * @author Colin Rooney (croo) RFE#1670185 restrict access to info queries * @author victor.perez@e-evolution.com <li>FR [ 1966328 ] New Window Info to * MRP and CRP into View <li> * http://sourceforge.net/tracker/index.php?func * =detail&aid=1966328&group_id=176962&atid=879335 <li>BF[2992649] Issue * in Workflow Activities when the records are ordered <li> * https://sourceforge * .net/tracker/?func=detail&aid=2992649&group_id=176962&atid=879332 * */ public final class AMenu extends CFrame implements ActionListener, PropertyChangeListener, ChangeListener { /** * generated serialVersionUID */ private static final long serialVersionUID = 5255914306969824011L; static { AdempierePLAF.setPLAF(); } /** * Application Start and Menu */ public AMenu() { super(); log.info("CodeBase=" + Adempiere.getCodeBase()); Splash splash = Splash.getSplash(); // m_WindowNo = Env.createWindowNo(this); // Login initSystem(splash); // login splash.setText(Msg.getMsg(m_ctx, "Loading")); splash.toFront(); splash.paint(splash.getGraphics()); // if (!Adempiere.startupEnvironment(true)) // Load Environment System.exit(1); MSession.get(Env.getCtx(), true); // Start Session // Setting close operation/listener - teo_sarca [ 1684168 ] setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowListener() { public void windowClosing(WindowEvent e) { if (!ADialog.ask(0, null, "ExitApplication?")) return; dispose(); } public void windowActivated(WindowEvent e) { } public void windowClosed(WindowEvent e) { } public void windowDeactivated(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowIconified(WindowEvent e) { } public void windowOpened(WindowEvent e) { } }); // Preparation wfActivity = new WFActivity(this); wfPanel = new WFPanel(this); treePanel = new VTreePanel(m_WindowNo, true, false); // !editable & // hasBar try { jbInit(); createMenu(); } catch (Exception ex) { log.log(Level.SEVERE, "AMenu", ex); } // initialize & load tree int AD_Role_ID = Env.getAD_Role_ID(Env.getCtx()); int AD_Tree_ID = DB .getSQLValue( null, "SELECT COALESCE(r.AD_Tree_Menu_ID, ci.AD_Tree_Menu_ID)" + "FROM AD_ClientInfo ci" + " INNER JOIN AD_Role r ON (ci.AD_Client_ID=r.AD_Client_ID) " + "WHERE AD_Role_ID=?", AD_Role_ID); if (AD_Tree_ID <= 0) AD_Tree_ID = 10; // Menu treePanel.initTree(AD_Tree_ID); // Translate Env.setContext(m_ctx, m_WindowNo, "WindowName", Msg.getMsg(m_ctx, "Menu")); setTitle(Env.getHeader(m_ctx, m_WindowNo)); progressBar.setString(Msg.getMsg(m_ctx, "SelectProgram")); // Finish UI Point loc = Ini.getWindowLocation(0); if (loc == null) loc = new Point(0, 0); this.setLocation(loc); this.pack(); this.setVisible(true); if (Ini.isPropertyBool(Ini.P_OPEN_WINDOW_MAXIMIZED)) this.setExtendedState(Frame.MAXIMIZED_BOTH); else this.setState(Frame.NORMAL); this.validate(); m_AD_User_ID = Env.getContextAsInt(m_ctx, "#AD_User_ID"); m_AD_Role_ID = Env.getContextAsInt(m_ctx, "#AD_Role_ID"); updateInfo(); // infoUpdater = new InfoUpdater(); infoUpdaterThread = new Thread(infoUpdater, "InfoUpdater"); infoUpdaterThread.start(); // splash.dispose(); splash = null; } // AMenu private int m_WindowNo; private Properties m_ctx = Env.getCtx(); private boolean m_startingItem = false; /** The User */ private int m_AD_User_ID; /** The Role */ private int m_AD_Role_ID; /** Center Tabbed Pane index: Menu */ private int m_tabMenu = 0; /** Center Tabbed Pane index: Activities */ private int m_tabActivities = 1; /** Center Tabbed Pane index: Workflow */ private int m_tabWorkflow = 2; // Links private int m_request_Menu_ID = 0; private int m_note_Menu_ID = 0; private String m_requestSQL = null; // private DecimalFormat m_memoryFormat = // DisplayType.getNumberFormat(DisplayType.Integer); /** Logger */ private static CLogger log = CLogger.getCLogger(AMenu.class); /** The Info Update instance **/ private InfoUpdater infoUpdater = null; /** The Info Update thread **/ private Thread infoUpdaterThread = null; private WindowManager windowManager = new WindowManager(); /************************************************************************** * Init System. -- do not get Msg as environment not initialized yet -- * * <pre> * - Login - in not successful, exit * </pre> * * @param splash * splash window */ private void initSystem(Splash splash) { // Default Image this.setIconImage(Adempiere.getImage16()); // Focus Traversal KeyboardFocusManager .setCurrentKeyboardFocusManager(AKeyboardFocusManager.get()); // FocusManager.getCurrentManager().setDefaultFocusTraversalPolicy(AFocusTraversalPolicy.get()); // this.setFocusTraversalPolicy(AFocusTraversalPolicy.get()); /** * Show Login Screen - if not successful - exit */ log.finer("Login"); ALogin login = new ALogin(splash); if (!login.initLogin()) // no automatic login { // Center the window try { AEnv.showCenterScreen(login); // HTML load errors } catch (Exception ex) { log.severe(ex.toString()); } if (!login.isConnected() || !login.isOKpressed()) AEnv.exit(1); } // Check Build if (!DB.isBuildOK(m_ctx)) AEnv.exit(1); // Check DB (AppsServer Version checked in Login) DB.isDatabaseOK(m_ctx); } // initSystem // UI private CPanel mainPanel = new CPanel(); private BorderLayout mainLayout = new BorderLayout(); private CTabbedPane centerPane = new CTabbedPane(); private CPanel southPanel = new CPanel(); private BorderLayout southLayout = new BorderLayout(); private JMenuBar menuBar = new JMenuBar(); protected JProgressBar progressBar = new JProgressBar(0, 100); private CPanel infoPanel = new CPanel(); private CButton bNotes = new CButton(); private CButton bRequests = new CButton(); private GridLayout infoLayout = new GridLayout(); private JProgressBar memoryBar = new JProgressBar(); // Tabs private PAPanel paPanel = null; private VTreePanel treePanel = null; private WFActivity wfActivity = null; private WFPanel wfPanel = null; private WindowMenu m_WindowMenu; /** * Static Init. * * <pre> * -mainPanel - centerPane - treePanel - wfActivity - wfPanel - southPanel * - infoPanel - bNotes - bTask - memoryBar - wfPanel - progressBar * </pre> * * @throws Exception */ void jbInit() throws Exception { this.setName("Menu"); this.setLocale(Language.getLoginLanguage().getLocale()); this.setJMenuBar(menuBar); //This code Added By omidp LocaleUtil.applyComponentOrientation(centerPane, treePanel, southPanel, infoPanel, menuBar); // mainPanel.setLayout(mainLayout); mainLayout.setHgap(0); mainLayout.setVgap(2); // treePanel.addPropertyChangeListener(VTreePanel.NODE_SELECTION, this); // infoPanel.setLayout(infoLayout); infoLayout.setColumns(2); infoLayout.setHgap(4); infoLayout.setVgap(0); // bNotes.setRequestFocusEnabled(false); bNotes.setToolTipText(""); bNotes.setActionCommand("Notes"); bNotes.addActionListener(this); bNotes.setIcon(Env.getImageIcon("GetMail24.gif")); bNotes.setMargin(new Insets(0, 0, 0, 0)); // bRequests.setRequestFocusEnabled(false); bRequests.setActionCommand("Requests"); bRequests.addActionListener(this); bRequests.setIcon(Env.getImageIcon("Request24.gif")); bRequests.setMargin(new Insets(0, 0, 0, 0)); // southLayout.setHgap(0); southLayout.setVgap(1); // memoryBar.setStringPainted(true); memoryBar.setOpaque(false); memoryBar.setBorderPainted(false); memoryBar.addMouseListener(new AMenu_MouseAdapter()); // progressBar.setStringPainted(true); progressBar.setOpaque(false); // getContentPane().add(mainPanel); mainPanel.add(centerPane, BorderLayout.CENTER); mainPanel.add(southPanel, BorderLayout.SOUTH); mainPanel.add(Box.createHorizontalStrut(3), BorderLayout.EAST); mainPanel.add(Box.createHorizontalStrut(3), BorderLayout.WEST); // Tabs centerPane.setFont(centerPane.getFont().deriveFont( centerPane.getFont().getSize2D() + 1)); paPanel = PAPanel.get(); if (paPanel != null) { // centerPane.add(paPanel, Msg.getMsg(m_ctx, "PAPanel")); centerPane.addTab(Msg.getMsg(m_ctx, "PAPanel"), Env.getImageIcon2("InfoAccount16"), paPanel); m_tabMenu++; m_tabActivities++; m_tabWorkflow++; } treePanel.setBorder(BorderFactory.createEmptyBorder(2, 3, 2, 3)); // centerPane.add(treePanel, Msg.getMsg(m_ctx, "Menu")); centerPane.addTab(Msg.getMsg(m_ctx, "Menu"), Env.getImageIcon2("Home16"), treePanel); // centerPane.add(new CScrollPane(wfActivity), Msg.getMsg (m_ctx, // "WorkflowActivities") + ": 0"); centerPane.addTab(Msg.getMsg(m_ctx, "WorkflowActivities") + ": 0", Env.getImageIcon2("Assignment16"), new CScrollPane(wfActivity)); // centerPane.add(new CScrollPane(wfPanel), Msg.getMsg (m_ctx, // "WorkflowPanel")); centerPane.addTab(Msg.getMsg(m_ctx, "WorkflowPanel"), Env.getImageIcon2("WorkFlow16"), new CScrollPane(wfPanel)); centerPane.addChangeListener(this); // southPanel.setLayout(southLayout); southPanel.add(infoPanel, BorderLayout.NORTH); southPanel.add(progressBar, BorderLayout.SOUTH); // infoPanel.add(bNotes, null); infoPanel.add(bRequests, null); infoPanel.add(memoryBar, null); // int loc = Ini.getDividerLocation(); if (loc > 0) treePanel.setDividerLocation(loc); } // jbInit /** * Get Preferred Size * * @return preferred Size */ public Dimension getPreferredSize() { Dimension dim = Ini.getWindowDimension(0); if (dim == null) dim = new Dimension(350, 500); return dim; } // getPreferredSize /** * Create Menu */ private void createMenu() { // File JMenu mFile = AEnv.getMenu("File"); menuBar.add(mFile); 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 JMenu mView = AEnv.getMenu("View"); menuBar.add(mView); if (MRole.getDefault().isAllow_Info_Product()) { AEnv.addMenuItem("InfoProduct", null, KeyStroke.getKeyStroke(KeyEvent.VK_I, Event.ALT_MASK), mView, this); } if (MRole.getDefault().isAllow_Info_BPartner()) { AEnv.addMenuItem( "InfoBPartner", null, KeyStroke.getKeyStroke(KeyEvent.VK_I, Event.ALT_MASK + Event.CTRL_MASK), mView, this); } if (MRole.getDefault().isShowAcct() && MRole.getDefault().isAllow_Info_Account()) { AEnv.addMenuItem( "InfoAccount", null, KeyStroke.getKeyStroke(KeyEvent.VK_I, Event.ALT_MASK + Event.CTRL_MASK), mView, this); } if (MRole.getDefault().isAllow_Info_Schedule()) { AEnv.addMenuItem("InfoSchedule", null, null, mView, this); } // FR [ 1966328 ] if (MRole.getDefault().isAllow_Info_MRP()) { AEnv.addMenuItem("InfoMRP", "Info", null, mView, this); } if (MRole.getDefault().isAllow_Info_CRP()) { AEnv.addMenuItem("InfoCRP", "Info", null, mView, this); } mView.addSeparator(); if (MRole.getDefault().isAllow_Info_Order()) { AEnv.addMenuItem("InfoOrder", "Info", null, mView, this); } if (MRole.getDefault().isAllow_Info_Invoice()) { AEnv.addMenuItem("InfoInvoice", "Info", null, mView, this); } if (MRole.getDefault().isAllow_Info_InOut()) { AEnv.addMenuItem("InfoInOut", "Info", null, mView, this); } if (MRole.getDefault().isAllow_Info_Payment()) { AEnv.addMenuItem("InfoPayment", "Info", null, mView, this); } if (MRole.getDefault().isAllow_Info_CashJournal()) { AEnv.addMenuItem("InfoCashLine", "Info", null, mView, this); } if (MRole.getDefault().isAllow_Info_Resource()) { AEnv.addMenuItem("InfoAssignment", "Info", null, mView, this); } if (MRole.getDefault().isAllow_Info_Asset()) { AEnv.addMenuItem("InfoAsset", "Info", null, mView, this); } // Tools JMenu mTools = AEnv.getMenu("Tools"); menuBar.add(mTools); AEnv.addMenuItem("Calculator", null, null, mTools, this); AEnv.addMenuItem("Calendar", null, null, mTools, this); AEnv.addMenuItem("Editor", null, null, mTools, this); MUser user = MUser.get(Env.getCtx()); if (user.isAdministrator()) AEnv.addMenuItem("Script", null, null, mTools, this); if (AEnv.isWorkflowProcess()) AEnv.addMenuItem("WorkFlow", null, null, mTools, this); if (MRole.getDefault().isShowPreference()) { mTools.addSeparator(); AEnv.addMenuItem("Preference", null, null, mTools, this); } // Window Menu m_WindowMenu = new WindowMenu(windowManager, this); menuBar.add(m_WindowMenu); KeyStroke ks = KeyStroke .getKeyStroke(KeyEvent.VK_W, KeyEvent.CTRL_MASK); this.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(ks, "ShowAllWindow"); AppsAction action = new AppsAction("ShowAllWindow", ks, false); this.getRootPane().getActionMap().put("ShowAllWindow", action); action.setDelegate(this); // Help JMenu mHelp = AEnv.getMenu("Help"); menuBar.add(mHelp); AEnv.addMenuItem("Online", null, null, mHelp, this); AEnv.addMenuItem("EMailSupport", null, null, mHelp, this); AEnv.addMenuItem("About", null, null, mHelp, this); } // createMenu /** * Dispose - end system */ public void dispose() { preDispose(); // super.dispose(); AEnv.exit(0); } // dispose private void preDispose() { // clean up - save window state Ini.setWindowDimension(0, getSize()); Ini.setDividerLocation(treePanel.getDividerLocation()); Ini.setWindowLocation(0, getLocation()); Ini.saveProperties(true); // infoUpdater.stop = true; try { infoUpdaterThread.join(50); } catch (InterruptedException ire) { } finally { infoUpdaterThread = null; infoUpdater = null; } } public void logout() { windowManager.close(); preDispose(); super.dispose(); AEnv.logout(); } /** * Window Events - requestFocus * * @param e * event */ protected void processWindowEvent(WindowEvent e) { super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_OPENED) { treePanel.getSearchField().requestFocusInWindow(); // this.toFront(); } } // processWindowEvent /** * Set Busy * * @param value * true if buzy */ protected void setBusy(boolean value) { m_startingItem = value; if (value) setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); else setCursor(Cursor.getDefaultCursor()); // setEnabled (!value); // causes flicker } // setBusy /** * Selection in tree - launch Application * * @param e * PropertyChangeEvent */ public void propertyChange(PropertyChangeEvent e) { MTreeNode nd = (MTreeNode) e.getNewValue(); log.info(nd.getNode_ID() + " - " + nd.toString()); // ignore summary items & when loading if (m_startingItem || nd.isSummary()) return; String sta = nd.toString(); progressBar.setString(sta); int cmd = nd.getNode_ID(); (new AMenuStartItem(cmd, true, sta, this)).start(); // async load // hengsin, updateInfo is call again in AMenuStartItem // updateInfo(); } // propertyChange /************************************************************************** * ActionListener * * @param e * ActionEvent */ public void actionPerformed(ActionEvent e) { // Buttons if (e.getSource() == bNotes) gotoNotes(); else if (e.getSource() == bRequests) gotoRequests(); else if (e.getActionCommand().equals("ShowAllWindow")) m_WindowMenu.expose(); else if (!AEnv.actionPerformed(e.getActionCommand(), m_WindowNo, this)) log.log(Level.SEVERE, "unknown action=" + e.getActionCommand()); // updateInfo(); } // actionPerformed /** * Get number of open Notes * * @return number of notes */ private int getNotes() { String sql = "SELECT COUNT(1) FROM AD_Note " + "WHERE AD_Client_ID=? AND AD_User_ID IN (0,?)" + " AND Processed='N'"; int retValue = DB.getSQLValue(null, sql, Env.getAD_Client_ID(Env.getCtx()), m_AD_User_ID); return retValue; } // getNotes /** * Open Note Window */ private void gotoNotes() { // AD_Table_ID for AD_Note = 389 HARDCODED if (m_note_Menu_ID == 0) m_note_Menu_ID = DB .getSQLValue( null, "SELECT AD_Menu_ID " + "FROM AD_Menu m" + " INNER JOIN AD_TABLE t ON (t.AD_Window_ID=m.AD_Window_ID) " + "WHERE t.AD_Table_ID=?", 389); if (m_note_Menu_ID == 0) m_note_Menu_ID = 233; // fallback HARDCODED (new AMenuStartItem(m_note_Menu_ID, true, Msg.translate(m_ctx, "AD_Note_ID"), this)).start(); // async load } // gotoMessage /** * Ger Number of open Requests * * @return number of requests */ private int getRequests() { if (m_requestSQL == null) m_requestSQL = MRole .getDefault() .addAccessSQL( "SELECT COUNT(1) FROM R_Request " + "WHERE (SalesRep_ID=? OR AD_Role_ID=?) AND Processed='N'" + " AND (DateNextAction IS NULL OR TRUNC(DateNextAction, 'DD') <= TRUNC(SysDate, 'DD'))" + " AND (R_Status_ID IS NULL OR R_Status_ID IN (SELECT R_Status_ID FROM R_Status WHERE IsClosed='N'))", "R_Request", false, true); // not qualified - RW int retValue = DB.getSQLValue(null, m_requestSQL, m_AD_User_ID, m_AD_Role_ID); return retValue; } // getRequests /** * Open Request Window */ private void gotoRequests() { // AD_Table_ID for R_Request = 417 HARDCODED // if (m_request_Menu_ID == 0) // Goes to Request (all) // m_request_Menu_ID = DB.getSQLValue (null, "SELECT AD_Menu_ID " // + "FROM AD_Menu m" // + " INNER JOIN AD_TABLE t ON (t.AD_Window_ID=m.AD_Window_ID) " // + "WHERE t.AD_Table_ID=?", 417); if (m_request_Menu_ID == 0) m_request_Menu_ID = 237; // My Requests (new AMenuStartItem(m_request_Menu_ID, true, Msg.translate(m_ctx, "R_Request_ID"), this)).start(); // async load } // gotoRequests /** * Show Memory Info - run GC if required - Update Requests/Memos/Activities */ public void updateInfo() { double total = Runtime.getRuntime().totalMemory() / 1024; double free = Runtime.getRuntime().freeMemory() / 1024; double used = total - free; double percent = used * 100 / total; // memoryBar.setMaximum((int) total); memoryBar.setValue((int) used); String msg = MessageFormat .format("{0,number,integer} MB - {1,number,integer}%", new Object[] { new BigDecimal(total / 1024), new BigDecimal(percent) }); memoryBar.setString(msg); // // msg = // MessageFormat.format("Total Memory {0,number,integer} kB - Free {1,number,integer} kB", msg = Msg.getMsg(m_ctx, "MemoryInfo", new Object[] { new BigDecimal(total), new BigDecimal(free) }); memoryBar.setToolTipText(msg); // progressBar.repaint(); // CarlosRuiz - globalqss - [ 1881285 ] Remove unnecessary calls to // System.gc // if (percent > 50) // System.gc(); if (DB.isConnected()) { // Requests int requests = getRequests(); bRequests.setText(Msg.translate(m_ctx, "R_Request_ID") + ": " + requests); // Memo int notes = getNotes(); bNotes.setText(Msg.translate(m_ctx, "AD_Note_ID") + ": " + notes); // Activities int activities = wfActivity.getActivitiesCount(); centerPane .setTitleAt(m_tabActivities, Msg.getMsg(m_ctx, "WorkflowActivities") + ": " + activities); /* * log.config(msg + ", Processors=" + * Runtime.getRuntime().availableProcessors() + ", Requests=" + * requests + ", Notes=" + notes + ", Activities=" + activities + * "," + CConnection.get().getStatus() ); */ MSystem.get(m_ctx).info(); } } // updateInfo /** * Update Activities Label */ public void updateActivities(int act_length) { centerPane.setTitleAt(m_tabActivities, Msg.getMsg(m_ctx, "WorkflowActivities") + ": " + act_length); } // updateInfo /************************************************************************* * Start Workflow Activity * * @param AD_Workflow_ID * id */ protected void startWorkFlow(int AD_Workflow_ID) { centerPane.setSelectedIndex(m_tabWorkflow); // switch wfPanel.load(AD_Workflow_ID, false); } // startWorkFlow /** * Change Listener (tab) * * @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent) * @param e * event */ public void stateChanged(ChangeEvent e) { // updateInfo(); // show activities if (centerPane.getSelectedIndex() == m_tabActivities) { wfActivity.loadActivities(); } } // stateChanged public WindowManager getWindowManager() { return windowManager; } /************************************************************************** * Mouse Listener */ class AMenu_MouseAdapter extends MouseAdapter { /** * Invoked when the mouse has been clicked on a component. * * @param e * event */ public void mouseClicked(MouseEvent e) { if (e.getClickCount() > 1) { System.gc(); // updateInfo(); } } } // AMenu_MouseAdapter /************************************************************************** * OS Start * * @param args * Array of String arguments (ignored) */ public static void main(String[] args) { Splash.getSplash(); Adempiere.startup(true); // needs to be here for UI new AMenu(); } // main class InfoUpdater implements Runnable { boolean stop = false; public void run() { int sleep = MSysConfig.getIntValue("MENU_INFOUPDATER_SLEEP_MS", 60000, Env.getAD_Client_ID(Env.getCtx())); while (stop == false) { updateInfo(); try { Thread.sleep(sleep); } catch (InterruptedException ire) { } } } } } // AMenu