package org.openswing.swing.mdi.client; import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.plaf.basic.*; import javax.swing.tree.*; import org.openswing.swing.logger.client.*; import org.openswing.swing.mdi.java.*; import org.openswing.swing.util.client.*; import org.openswing.swing.client.OptionPane; import java.beans.Beans; import java.beans.PropertyVetoException; import javax.swing.event.MenuListener; import javax.swing.event.MenuEvent; /** * <p>Title: OpenSwing Framework</p> * <p>Description: MDI Frame.</p> * <p>Copyright: Copyright (C) 2006 Mauro Carniel</p> * * <p> This file is part of OpenSwing Framework. * This library is free software; you can redistribute it and/or * modify it under the terms of the (LGPL) Lesser General Public * License as published by the Free Software Foundation; * * GNU LESSER GENERAL PUBLIC LICENSE * Version 2.1, February 1999 * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * The author may be contacted at: * maurocarniel@tin.it</p> * * @author Mauro Carniel * @version 1.0 */ public class MDIFrame extends JFrame implements BusyListener { static { try { if (!Beans.isDesignTime() && System.getProperty("os.name").toLowerCase().startsWith("linux") && System.getProperty("java.version").startsWith("1.6") && ClientSettings.LOOK_AND_FEEL_CLASS_NAME.endsWith("GTKLookAndFeel")) ClientSettings.LOOK_AND_FEEL_CLASS_NAME = "javax.swing.plaf.metal.MetalLookAndFeel"; UIManager.setLookAndFeel(ClientSettings.LOOK_AND_FEEL_CLASS_NAME); } catch (Throwable ex) { ex.printStackTrace(); } try { JFrame.setDefaultLookAndFeelDecorated(ClientSettings.MDI_FRAME_DECORATED); JDialog.setDefaultLookAndFeelDecorated(ClientSettings.MDI_FRAME_DECORATED); } catch (Exception ex) { ex.printStackTrace(); } } private JPanel contentPane; private JMenuBar menuBar = new JMenuBar(); private JMenu menuFile = new JMenu(); private JMenuItem menuFileChangeUser = new JMenuItem(); private JMenuItem menuFileChangeLanguage = new JMenuItem(); private JMenuItem menuFileExit = new JMenuItem(); private static WindowMenu menuWindow = new WindowMenu(); private JMenu menuHelp = new JMenu(); private JMenuItem menuHelpAbout = new JMenuItem(); private static StatusBar statusBar = new StatusBar(); private BorderLayout borderLayout1 = new BorderLayout(); private static DesktopPane desktopPane = new DesktopPane(); private JScrollPane scrollPane = new JScrollPane(desktopPane); private static TreeMenu treeMenu = null; private JSplitPane splitPane = new JSplitPane(); private BasicSplitPaneUI splitPaneUI = new BasicSplitPaneUI(); /** setBusy calls number */ private static Integer busyCount = new Integer(0); /** interface used to manage some MDI Frame settings */ private static MDIController client = null; /** panel at the bottom, containing opened window icons (optional) and status panel */ private JPanel bottomPanel = new JPanel(); /** panel containing opened window icons (optional) */ private static WinIconsPanel winIconsPanel = new WinIconsPanel(); private GridBagLayout gridBagLayout1 = new GridBagLayout(); /** last tree menu width */ private int lastTreeMenuWidth = 0; /** toolbar (optional); it will be showed only if there is at least one button added to it (through "addToolbarButton" method) */ private JToolBar toolbar = new JToolBar(); /** flag used to check if toolbar has been added to main panel */ private boolean toolbarAdded = false; /** collection of pairs <functionId,related JMenuItem> */ private Hashtable functionsHooks = new Hashtable(); /** collection of pairs <functionId,related JMenu> */ private Hashtable functionsMenuHooks = new Hashtable(); /** collection of pairs <component name,JComponent added to the status bar> */ private static Hashtable componentsHooks = new Hashtable(); /** unique instances of internal frames, expressed as Class elements */ private HashSet uniqueInstances = new HashSet(); /** * Contructor. * @param client interface used to manage some MDI Frame settings */ public MDIFrame(MDIController client) { super(client.getMDIFrameTitle()); try { ApplicationEventQueue.getInstance(); SwingUtilities.updateComponentTreeUI(this); this.client = client; ClientUtils.addBusyListener(this); statusBar.removeAll(); componentsHooks.clear(); menuWindow.init(); menuWindow.menuWindowCloseAll_actionPerformed(null); enableEvents(AWTEvent.WINDOW_EVENT_MASK); desktopPane.init(client); winIconsPanel.init(); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); setSize(screenSize); try { jbInit(); } catch (Exception e) { e.printStackTrace(); } setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { onWindowClosing(); } }); try { ClientSettings.getInstance().getUserGridProfiles().clear(); ClientSettings.getInstance().getLastUserGridDigests().clear(); ClientSettings.getInstance().getLastUserGridProfileIds().clear(); ClientSettings.getInstance().getGridProfileDescriptions().clear(); ClientSettings.getInstance().getGridPermissions().clear(); ClientSettings.getInstance().getLastGridPermissionsDigests().clear(); } catch (Exception ex2) { } if (ClientSettings.MDI_TOOLBAR!=null) { // add toolbar... toolbar.add(ClientSettings.MDI_TOOLBAR); if (!toolbarAdded) { toolbarAdded = true; contentPane.add(toolbar,BorderLayout.NORTH); } } //view MDI... try { Thread.sleep(500); } catch (Exception ex1) { } setVisible(true); SwingUtilities.invokeLater(new Runnable() { public void run() { MDIFrame.this.client.afterMDIcreation(MDIFrame.this); } }); } catch (Throwable ex) { ex.printStackTrace(); } } //Component initialization private void jbInit() throws Exception { setIconImage(ClientUtils.getImage(ClientSettings.ICON_FILENAME)); contentPane = (JPanel) this.getContentPane(); contentPane.setLayout(borderLayout1); statusBar.setText(" "); menuFile.setText(ClientSettings.getInstance().getResources().getResource("file")); menuFile.setMnemonic(ClientSettings.getInstance().getResources().getResource("filemnemonic").charAt(0)); menuFileExit.setText(ClientSettings.getInstance().getResources().getResource("exit")); menuFileExit.setMnemonic(ClientSettings.getInstance().getResources().getResource("exitmnemonic").charAt(0)); menuFileExit.setAccelerator(KeyStroke.getKeyStroke('X',Event.CTRL_MASK)); menuFileExit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { menuFileExit_actionPerformed(e); } }); if(ClientSettings.ICON_MENU_FILE_EXIT!=null) this.menuFileExit.setIcon(new ImageIcon(ClientUtils.getImage(ClientSettings.ICON_MENU_FILE_EXIT))); menuFileChangeUser.setText(ClientSettings.getInstance().getResources().getResource("change user")); menuFileChangeUser.setMnemonic(ClientSettings.getInstance().getResources().getResource("changeusermnemonic").charAt(0)); menuFileChangeUser.setAccelerator(KeyStroke.getKeyStroke('U',Event.CTRL_MASK)); menuFileChangeUser.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { menuFileChangeUser_actionPerformed(e); } }); if(ClientSettings.ICON_MENU_FILE_CHANGE_USER!=null) this.menuFileChangeUser.setIcon(new ImageIcon(ClientUtils.getImage(ClientSettings.ICON_MENU_FILE_CHANGE_USER))); menuFileChangeLanguage.setText(ClientSettings.getInstance().getResources().getResource("change language")); menuFileChangeLanguage.setMnemonic(ClientSettings.getInstance().getResources().getResource("changelanguagemnemonic").charAt(0)); menuFileChangeLanguage.setAccelerator(KeyStroke.getKeyStroke('L',Event.CTRL_MASK)); menuFileChangeLanguage.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { menuFileChangeLanguage_actionPerformed(e); } }); if(ClientSettings.ICON_MENU_FILE_CHANGE_LANGUAGE!=null) this.menuFileChangeLanguage.setIcon(new ImageIcon(ClientUtils.getImage(ClientSettings.ICON_MENU_FILE_CHANGE_LANGUAGE))); menuHelp.setText(ClientSettings.getInstance().getResources().getResource("help")); menuHelp.setMnemonic(ClientSettings.getInstance().getResources().getResource("helpmnemonic").charAt(0)); menuHelpAbout.setText(ClientSettings.getInstance().getResources().getResource("about")+" "+client.getMDIFrameTitle()); menuHelpAbout.setMnemonic(ClientSettings.getInstance().getResources().getResource("aboutmnemonic").charAt(0)); menuHelpAbout.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { menuHelpAbout_actionPerformed(e); } }); if(ClientSettings.ICON_MENU_HELP_ABOUT!=null) this.menuHelpAbout.setIcon(new ImageIcon(ClientUtils.getImage(ClientSettings.ICON_MENU_HELP_ABOUT))); if (client.viewLoginInMenuBar()) menuFile.add(menuFileChangeUser); if (client.viewChangeLanguageInMenuBar() && client.getLanguages().size()>1) menuFile.add(menuFileChangeLanguage); menuFile.addSeparator(); menuFile.add(menuFileExit); menuHelp.add(menuHelpAbout); if (client.viewFileMenu()) menuBar.add(menuFile); DefaultTreeModel functions = null; try { functions = client.getApplicationFunctions(); if (client.viewFunctionsInMenuBar()) { // creating functions menu... JMenuItem menu = null; TreeNode root = (TreeNode) functions.getRoot(); HashSet mnem = new HashSet(); for (int i = 0; i < root.getChildCount(); i++) { final ApplicationFunction function = (ApplicationFunction) root.getChildAt(i); if (function.isFolder()) { menu = new JMenu(function.toString()); if (ClientSettings.SHOW_TOOLTIP_IN_MENUBAR) menu.setToolTipText(function.getTooltipText()); maybeAddTooltipToStatusBar(menu,function); } else if (function.isSeparator()) { continue; } else { menu = new JMenu(function.toString()); if (ClientSettings.SHOW_TOOLTIP_IN_MENUBAR) menu.setToolTipText(function.getTooltipText()); maybeAddTooltipToStatusBar(menu,function); ((JMenu)menu).addMenuListener(new MenuListener() { /** * Invoked when a menu is selected. * * @param e a MenuEvent object */ public void menuSelected(MenuEvent e) { if (function.getFunctionId()!=null) executeFunction(function); } /** * Invoked when the menu is deselected. * * @param e a MenuEvent object */ public void menuDeselected(MenuEvent e) {} /** * Invoked when the menu is canceled. * * @param e a MenuEvent object */ public void menuCanceled(MenuEvent e) {} }); } int j=0; try { if (function.getShortCut()!=null && !mnem.contains(function.getShortCut().toString())) { mnem.add(function.getShortCut().toString()); menu.setMnemonic(function.getShortCut().charValue()); } else { while (j < function.toString().length() && mnem.contains(function.toString().substring(j, j + 1))) { j++; } if (j < function.toString().length()) { mnem.add(function.toString().substring(j, j + 1)); menu.setMnemonic(function.toString().substring(j, j + 1).charAt(0)); } } if (function.getAccelerator()!=null) { menu.setAccelerator(function.getAccelerator()); } } catch (Exception ex1) { } menuBar.add(menu); addSubFunctionsToMenuBar(menu, function, mnem); } } } catch (Exception ex) { Logger.error(this.getClass().getName(),"jbInit","Error while constructing the functions menu",ex); } if (ClientSettings.SHOW_WINDOW_MENU) menuBar.add(menuWindow); menuBar.add(menuHelp); this.setJMenuBar(menuBar); JFrame.setDefaultLookAndFeelDecorated(ClientSettings.MDI_FRAME_DECORATED); GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); this.setExtendedState(this.getExtendedState() | client.getExtendedState()); desktopPane.setPreferredSize(new Dimension(this.getWidth()-ClientSettings.DIVIDER_WIDTH-6-ClientSettings.MENU_WIDTH,this.getHeight()-menuBar.getHeight()-statusBar.getHeight()-103)); if (client.viewFunctionsInTreePanel() && ((TreeNode)functions.getRoot()).getChildCount()>0) { // add tree nodes... treeMenu = new TreeMenu(functions); treeMenu.setMinimumSize(new Dimension(ClientSettings.MIN_MENU_WIDTH,0)); treeMenu.setMaximumSize(new Dimension(ClientSettings.MAX_MENU_WIDTH,0)); treeMenu.addMouseListener(new MenuMouseListener()); lastTreeMenuWidth = treeMenu.getWidth(); splitPane.setLeftComponent(treeMenu); if (ClientSettings.SHOW_SCROLLBARS_IN_MDI) { scrollPane.setPreferredSize( new Dimension( this.getWidth()-ClientSettings.DIVIDER_WIDTH-6-ClientSettings.MENU_WIDTH, this.getHeight()-menuBar.getHeight()-statusBar.getHeight()-103 ) ); desktopPane.setPreferredSize( new Dimension( this.getWidth()-ClientSettings.DIVIDER_WIDTH-6-ClientSettings.MENU_WIDTH-scrollPane.getVerticalScrollBar().getPreferredSize().width, this.getHeight()-menuBar.getHeight()-statusBar.getHeight()-103-scrollPane.getHorizontalScrollBar().getPreferredSize().height-20 ) ); splitPane.setRightComponent(scrollPane); scrollPane.getViewport().add(desktopPane); } else splitPane.setRightComponent(desktopPane); resetSplitPane(); contentPane.add(splitPane, BorderLayout.CENTER); // add key listener to intercept an F3 key pressed event... ApplicationEventQueue.getInstance().addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if (e.getKeyCode()==ClientSettings.TREE_MENU_KEY.getKeyCode() && e.getModifiers()+e.getModifiersEx()==ClientSettings.TREE_MENU_KEY.getModifiers()) { // shortcut key pressed: focus will be setted on this component... treeMenu.getFindTF().requestFocus(); } } }); treeMenu.addComponentListener(new ComponentAdapter() { /** * Invoked when the component's size changes. */ public void componentResized(ComponentEvent e) { JInternalFrame[] frames = desktopPane.getAllFrames(); for(int i=0;i<frames.length;i++) frames[i].setLocation(lastTreeMenuWidth-treeMenu.getWidth()+frames[i].getX(),frames[i].getY()); lastTreeMenuWidth = treeMenu.getWidth(); } }); } else { if (ClientSettings.SHOW_SCROLLBARS_IN_MDI) { scrollPane.setPreferredSize( new Dimension( this.getWidth()-ClientSettings.DIVIDER_WIDTH-6-ClientSettings.MENU_WIDTH, this.getHeight()-menuBar.getHeight()-statusBar.getHeight()-103 ) ); desktopPane.setPreferredSize( new Dimension( this.getWidth()-ClientSettings.DIVIDER_WIDTH-6-ClientSettings.MENU_WIDTH-scrollPane.getVerticalScrollBar().getPreferredSize().width, this.getHeight()-menuBar.getHeight()-statusBar.getHeight()-103-scrollPane.getHorizontalScrollBar().getPreferredSize().height-20 ) ); scrollPane.getViewport().add(desktopPane); contentPane.add(scrollPane, BorderLayout.CENTER); } else contentPane.add(desktopPane, BorderLayout.CENTER); } contentPane.add(bottomPanel, BorderLayout.SOUTH); bottomPanel.setLayout(gridBagLayout1); if (client.viewOpenedWindowIcons()) bottomPanel.add(winIconsPanel, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0 ,GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); bottomPanel.add(statusBar, new GridBagConstraints(0, 1, 1, 1, 1.0, 1.0 ,GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); } private void maybeAddTooltipToStatusBar(JMenuItem menu,final ApplicationFunction function) { if (ClientSettings.SHOW_TOOLTIP_IN_MDISTATUSBAR) { ToolTipManager toolTipManager = ToolTipManager.sharedInstance(); menu.addMouseListener(new MouseAdapter() { public void mouseEntered(MouseEvent e) { getStatusBar().setText(function.getTooltipText()); } public void mouseExited(MouseEvent e) { getStatusBar().setText(""); } }); } } /** * Add application functions to the menu bar. * @param parentMenu menu item just added * @param parentFunction application function to expand, organized as a tree */ private void addSubFunctionsToMenuBar(JMenuItem parentMenu,ApplicationFunction parentFunction,HashSet mnem) { JMenuItem menu = null; for (int i = 0; i < parentFunction.getChildCount(); i++) { final ApplicationFunction function = (ApplicationFunction) parentFunction.getChildAt(i); if (function.isFolder()) { menu = new JMenu(function.toString()); if (ClientSettings.SHOW_TOOLTIP_IN_MENUBAR) menu.setToolTipText(function.getTooltipText()); maybeAddTooltipToStatusBar(menu,function); } else if (function.isSeparator()) { parentMenu.add(new JSeparator()); continue; } else { if (function.getIconName()==null) { menu = new JMenuItem(function.toString()); if (ClientSettings.SHOW_TOOLTIP_IN_MENUBAR) menu.setToolTipText(function.getTooltipText()); maybeAddTooltipToStatusBar(menu,function); } else { menu = new JMenuItem(function.toString(),new ImageIcon(ClientUtils.getImage(function.getIconName()))); if (ClientSettings.SHOW_TOOLTIP_IN_MENUBAR) menu.setToolTipText(function.getTooltipText()); maybeAddTooltipToStatusBar(menu,function); } menu.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { executeFunction(function); } }); if (function.getFunctionId()!=null&& !function.getFunctionId().trim().equals("")) { functionsHooks.put(function.getFunctionId(),menu); functionsMenuHooks.put(function.getFunctionId(),parentMenu); } } int j=0; if (function.getShortCut()!=null && !mnem.contains(function.getShortCut().toString())) { mnem.add(function.getShortCut().toString()); menu.setMnemonic(function.getShortCut().charValue()); } else { try { while (j < menu.getText().length() && (mnem.contains(menu.getText().substring(j, j + 1)) || !Character.isLetterOrDigit(menu.getText().charAt(j)))) { j++; } if (j < menu.getText().length()) { mnem.add(menu.getText().substring(j, j + 1)); menu.setMnemonic(menu.getText().substring(j, j + 1).charAt(0)); } } catch (Exception ex1) { } } if (function.getAccelerator()!=null) { menu.setAccelerator(function.getAccelerator()); } parentMenu.add(menu); addSubFunctionsToMenuBar(menu, function, mnem); } } /** * Method called by addSubFunctionsToMenuBar method: execute the corrisponding method in the ClientFacade. */ private void executeFunction(final ApplicationFunction node) { ClientUtils.fireBusyEvent(true); SwingUtilities.invokeLater(new Runnable() { public void run() { try { try { MDIFrame.getClientFacade().getClass().getMethod(node.getMethodName(),new Class[0]).invoke(MDIFrame.getClientFacade(),new Object[0]); ClientUtils.fireBusyEvent(false); } catch (NoSuchMethodException ex1) { MDIFrame.getClientFacade().getClass().getMethod(node.getMethodName(),new Class[]{String.class}).invoke(MDIFrame.getClientFacade(),new Object[]{node.getFunctionId()}); ClientUtils.fireBusyEvent(false); } } catch (Throwable ex) { ClientUtils.fireBusyEvent(false); ex.printStackTrace(); OptionPane.showMessageDialog( MDIFrame.this, ClientSettings.getInstance().getResources().getResource("Error while executing function")+" '"+node.getMethodName()+"'", ClientSettings.getInstance().getResources().getResource("Error"), JOptionPane.WARNING_MESSAGE ); } } }); } /** * @return <code>true</code> if menu window is locked <code>false</code> otherwise */ public final boolean isLocked() { return treeMenu.isLocked(); } /** * @param locked <code>true</code> if menu window is locked <code>false</code> otherwise */ public final void setLocked(boolean locked) { treeMenu.setLocked(locked); if (!locked && splitPane.getDividerLocation()>0) splitPane.setDividerLocation(0); } //File | Exit action performed public void menuFileExit_actionPerformed(ActionEvent e) { onWindowClosing(); } //File | Change User action performed public void menuFileChangeUser_actionPerformed(ActionEvent e) { client.viewLoginDialog(this); } //File | Chnage Language performed public void menuFileChangeLanguage_actionPerformed(ActionEvent e) { new ChangeLanguageDialog(this,client); } //Help | About action performed public void menuHelpAbout_actionPerformed(ActionEvent e) { AboutDialog dlg = new AboutDialog(this,client.getAboutText(),client.getAboutImage()); } //Overridden so we can exit when window is closed protected void processWindowEvent(WindowEvent e) { if (e.getID() == WindowEvent.WINDOW_CLOSING) { onWindowClosing(); } else super.processWindowEvent(e); } /** * Define splitpane area. */ private void resetSplitPane() { splitPane.setUI(splitPaneUI); splitPane.setPreferredSize(this.getSize()); splitPane.setOneTouchExpandable(true); splitPane.setDividerSize(ClientSettings.DIVIDER_WIDTH); splitPane.setDividerLocation(ClientSettings.MENU_WIDTH); splitPane.setLastDividerLocation(0); splitPaneUI.getDivider().addMouseListener(new DivMouseListener()); } /** * <p>Title: OpenSwing Framework</p> * <p>Description: Inner class for listening menu window mouse exit events.</p> * @author Mauro Carniel * @version 1.0 */ class MenuMouseListener extends MouseAdapter { public void mouseExited(MouseEvent e) { if (!isLocked() && (e.getY()<0 || e.getX()>treeMenu.getWidth()) ) { if (splitPane.getDividerLocation()>0) splitPane.setDividerLocation(0); } } } /** * <p>Title: OpenSwing Framework</p> * <p>Description: Inner class for listening menu window mouse exit events.</p> * @author Mauro Carniel * @version 1.0 */ class DivMouseListener extends MouseAdapter { public void mouseEntered(MouseEvent e) { if (!isLocked()) { if (splitPane.getDividerLocation()<=1) splitPane.setDividerLocation(splitPane.getLastDividerLocation()); } } public void mouseExited(MouseEvent e) { if (!isLocked()) { if (e.getX()>0 && splitPane.getDividerLocation()>0) splitPane.setDividerLocation(0); } } } /** * Add an internal frame to the desktop pane and make it visible. * @param frame internal frame */ public static final void add(InternalFrame frame) { add(frame,false); } /** * Add an internal frame to the desktop pane and make it visible and maximazed. * @param frame internal frame */ public static final void add(InternalFrame frame,boolean maximum) { if (frame.isUniqueInstance()) { if (MDIFrame.getInstance().isUniqueInstanceAlreadyOpened(frame)){ for (int i = 0;i<desktopPane.getComponents().length;i++) { if (frame.getClass().equals(desktopPane.getComponent(i).getClass())) { try { ((InternalFrame)desktopPane.getComponent(i)).setSelected(true); return; } catch (Exception ex) { } } } return; } else MDIFrame.getInstance().uniqueInstances.add(frame.getClass()); } ClientUtils.fireBusyEvent(true); try { desktopPane.add(frame, maximum); menuWindow.addWindow(frame); if (client.viewOpenedWindowIcons()) { winIconsPanel.add(frame); } } catch (Throwable ex) { } ClientUtils.fireBusyEvent(false); } /** * @return window menu */ public static WindowMenu getWindowMenu() { return menuWindow; } /** * @return desktop pane dimension */ public static Dimension getDesktopDimension() { return desktopPane.getSize(); } /** * Method called when closing the MDI Frame */ private void onWindowClosing() { Object[] opt = new Object[]{ ClientSettings.getInstance().getResources().getResource("yes"), ClientSettings.getInstance().getResources().getResource("no") }; if (JOptionPane.showOptionDialog( this, ClientSettings.getInstance().getResources().getResource("are you sure to quit application?"), ClientSettings.getInstance().getResources().getResource("quit application"), JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, opt, opt[0] )==0) { JInternalFrame[] frames = desktopPane.getAllFrames(); for (int i = 0; i < frames.length; i++) { if (frames[i] instanceof InternalFrame) try { ( (InternalFrame) frames[i]).closeFrame(); } catch (Exception ex) { } } client.stopApplication(); } } /** * Start the progress bar. * @param busy <code>true</code> to start progress bar, <code>false</code> to stop it */ public final void setBusy(boolean busy) { if (client==null) return; synchronized(busyCount) { if (busyCount.intValue()==0 && busy) { statusBar.setBusy(true); // wait cursor... try { desktopPane.setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR)); desktopPane.getToolkit().sync(); treeMenu.setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR)); treeMenu.getToolkit().sync(); } catch (Exception ex) {} } if (busy) busyCount = new Integer(busyCount.intValue()+1); else if (busyCount.intValue()>0) busyCount = new Integer(busyCount.intValue()-1); if (busyCount.intValue()==0) { statusBar.setBusy(false); // default cursor... try { desktopPane.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); desktopPane.getToolkit().sync(); treeMenu.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); treeMenu.getToolkit().sync(); } catch (Exception ex) {} } } } /** * Callback invoked by WindowMenu when closing an internal frame. */ public final void windowClosed(JInternalFrame frame) { if (frame instanceof InternalFrame && ((InternalFrame)frame).isUniqueInstance()) { uniqueInstances.remove(frame.getClass()); } stopProgressBar(); } /** * Callback invoked by windowClosed method. */ public final void stopProgressBar() { synchronized(busyCount) { busyCount = new Integer(1); } setBusy(false); } /** * Set progress bar value. Minimum value is 0 and maximum value is 15. * @param progressBarValue value to set for the progress bar; if specified value is less than 0 then 0 is setted; if specified value is greater than 15 then it is set to 15. */ public final void setProgressBarValue(int progressBarValue) { statusBar.setProgressBarValue(progressBarValue); } /** * @return current value in progress bar; minimum value is 0 and maximum value is 15 */ public final int getProgressBarValue() { return statusBar.getProgressBarValue(); } /** * @return this */ public static MDIFrame getInstance() { Container c = desktopPane.getParent(); while(c!=null && !(c instanceof JFrame)) c = c.getParent(); return (MDIFrame)c; } /** * @return client facade */ public static ClientFacade getClientFacade() { return client.getClientFacade(); } /** * @return internal frame currently selected */ public static InternalFrame getSelectedFrame() { return (InternalFrame)desktopPane.getSelectedFrame(); } /** * Set status bar message. * @param text message to view into the status bar */ public static final void setStatusBar(String text) { statusBar.setText(text); } /** * @return StatusBar object */ public static final StatusBar getStatusBar() { return statusBar; } /** * Add a new component to the status bar, from left to right. * The component just added can be identitied by its "name" property (if specified). * @param c component to add */ public static final void addStatusComponent(JComponent c) { addStatusComponent(c.getName(),c); } /** * Add a new component to the status bar, from left to right and identify it with the specified component name. * @param name component name, used to identify it * @param c component to add */ public static final void addStatusComponent(String name,JComponent c) { if (name!=null) componentsHooks.put(name,c); statusBar.addStatusComponent(c); } /** * @param name component name, used to identify it * @return component identified by its name */ public static final JComponent getStatusComponent(String name) { return (JComponent)componentsHooks.get(name); } /** * @return JMenu object related to "Help" menu in the menu bar. This hook can be used to add other menu items to "Help" menu; new menu items can be added within MDIFrameController.afterMDIcreation() method */ public final JMenu getMenuHelp() { return menuHelp; } /** * @return JMenu object related to "File" menu in the menu bar. This hook can be used to add other menu items to "File" menu; new menu items can be added within MDIFrameController.afterMDIcreation() method */ public final JMenu getMenuFile() { return menuFile; } /** * @param functionId menu item identifier * @return JMenuItem object, related to the specified functionId; null if there is not any JMenuItem having the specified functionId */ public final JMenuItem getMenuItem(String functionId) { return (JMenuItem)functionsHooks.get(functionId); } /** * Add a separator between the top menu item identifier and bottom menu item identifier, ONLY IF they are both visible. * @param topFunctionId menu item identifier that is before the separator to add * @param bottomFunctionId menu item identifier that is after the separator to add */ public final void addSeparatorToMenuBar(String topFunctionId,String bottomFunctionId) { JMenuItem topMenuItem = getMenuItem(topFunctionId); JMenu topMenu = (JMenu)functionsMenuHooks.get(topFunctionId); JMenu bottomMenu = (JMenu)functionsMenuHooks.get(bottomFunctionId); if (topMenu!=null && bottomMenu!=null) { for(int i=0;i<topMenu.getMenuComponentCount();i++) if (topMenu.getMenuComponent(i).equals(topMenuItem)) { topMenu.insertSeparator(i + 1); break; } } } /** * Add a button to the toolbar (and show toolbar if not already done). * @param button button to add to the toolbar */ public final void addButtonToToolBar(JButton button) { toolbar.add(button); if (!toolbarAdded) { toolbarAdded = true; contentPane.add(toolbar,BorderLayout.NORTH); } } /** * Add a button to the toolbar (and show toolbar if not already done). * @param imageName name of the image to show within the button * @param tooltipText tooltip text (it will be translated according to internationalization settings) * @return button just created */ public final JButton addButtonToToolBar(String imageName,String tooltipText) { return addButtonToToolBar(ClientUtils.getImage(imageName),tooltipText); } /** * Add a button to the toolbar (and show toolbar if not already done). * @param image image to show within the button * @param tooltipText tooltip text (it will be translated according to internationalization settings) * @return button just created */ public final JButton addButtonToToolBar(Image image,String tooltipText) { JButton button = new JButton(new ImageIcon(image)); button.setToolTipText(ClientSettings.getInstance().getResources().getResource(tooltipText)); toolbar.add(button); if (!toolbarAdded) { toolbarAdded = true; contentPane.add(toolbar,BorderLayout.NORTH); } return button; } /** * Add a button to the toolbar (and show toolbar if not already done). * @param imageName name of the image to show within the button * @param tooltipText tooltip text (it will be translated according to internationalization settings) * @param buttonText button text to show within the button (it will be translated according to internationalization settings) * @return button just created */ public final JButton addButtonToToolBar(String imageName,String tooltipText,String buttonText) { return addButtonToToolBar(ClientUtils.getImage(imageName),tooltipText,buttonText); } /** * Add a button to the toolbar (and show toolbar if not already done). * @param image image to show within the button * @param tooltipText tooltip text (it will be translated according to internationalization settings) * @param buttonText button text to show within the button (it will be translated according to internationalization settings) * @return button just created */ public final JButton addButtonToToolBar(Image image,String tooltipText,String buttonText) { JButton button = new JButton( ClientSettings.getInstance().getResources().getResource(buttonText), new ImageIcon(image) ); button.setToolTipText(ClientSettings.getInstance().getResources().getResource(tooltipText)); toolbar.add(button); if (!toolbarAdded) { toolbarAdded = true; contentPane.add(toolbar,BorderLayout.NORTH); } return button; } /** * Appends a separator of default size to the end of the tool bar. * The default size is determined by the current look and feel. */ public final void addSeparatorToToolBar() { toolbar.addSeparator(); if (!toolbarAdded) { toolbarAdded = true; contentPane.add(toolbar,BorderLayout.NORTH); } } /** * Appends a separator of a specified size to the end * of the tool bar. * * @param size the <code>Dimension</code> of the separator */ public final void addSeparatorOnToolBar(Dimension dim) { toolbar.addSeparator(dim); if (!toolbarAdded) { toolbarAdded = true; contentPane.add(toolbar,BorderLayout.NORTH); } } /** * Sets the <code>borderPainted</code> property, which is * <code>true</code> if the border should be painted. * The default value for this property is <code>true</code>. * Some look and feels might not implement painted borders; * they will ignore this property. * * @param b if true, the border is painted * @see #isBorderPainted * @beaninfo * description: Does the tool bar paint its borders? * bound: true * expert: true */ public final void setBorderPainterOnToolBar(boolean borderPainted) { toolbar.setBorderPainted(borderPainted); } /** * Sets the <code>floatable</code> property, * which must be <code>true</code> for the user to move the tool bar. * Typically, a floatable tool bar can be * dragged into a different position within the same container * or out into its own window. * The default value of this property is <code>true</code>. * Some look and feels might not implement floatable tool bars; * they will ignore this property. * * @param b if <code>true</code>, the tool bar can be moved; * <code>false</code> otherwise * @see #isFloatable * @beaninfo * description: Can the tool bar be made to float by the user? * bound: true * preferred: true */ public final void setFloatableOnToolBar(boolean floatable) { toolbar.setFloatable(floatable); } /** * Sets the orientation of the tool bar. The orientation must have * either the value <code>HORIZONTAL</code> or <code>VERTICAL</code>. * If <code>orientation</code> is * an invalid value, an exception will be thrown. * * @param o the new orientation -- either <code>HORIZONTAL</code> or * </code>VERTICAL</code> * @exception IllegalArgumentException if orientation is neither * <code>HORIZONTAL</code> nor <code>VERTICAL</code> * @see #getOrientation * @beaninfo * description: The current orientation of the tool bar * bound: true * preferred: true */ public final void setOrientationOnToolBar(int orientation) { toolbar.setOrientation(orientation); } /** * Sets the rollover state of this toolbar. If the rollover state is true * then the border of the toolbar buttons will be drawn only when the * mouse pointer hovers over them. The default value of this property * is false. * <p> * The implementation of a look and feel may choose to ignore this * property. * * @param rollover true for rollover toolbar buttons; otherwise false * @since 1.4 * @beaninfo * bound: true * preferred: true * attribute: visualUpdate true * description: Will draw rollover button borders in the toolbar. */ public final void setRolloverOnToolBar(boolean rollover) { toolbar.setRollover(rollover); } /** * @return <code>true</code> if the specified instance of internal frame is already opened, <code>false</code> otherwise */ public final boolean isUniqueInstanceAlreadyOpened(InternalFrame frame) { return uniqueInstances.contains(frame.getClass()); } }