package org.openswing.swing.mdi.client; import java.beans.*; import java.util.*; import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.*; import javax.swing.event.*; import org.openswing.swing.util.client.*; import java.util.List; import java.util.Collections; /** * <p>Title: OpenSwing Framework</p> * <p>Description: Panel used to show the last opened windows and to switch between them. * It can contains a toggle button for each added internal frame. * User can click on the button to set to front the related internal frame or * can reduce to icon or close internal frame by means of the popup menu opened by clicking with the right mouse button on the toggle button or * can set to front the internal frame by entering the toggle button with the left mouse button clicked. * <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 WinIconsPanel extends JPanel { FlowLayout flowLayout1 = new FlowLayout(); /** collection of button, linked frame */ private Hashtable buttons = new Hashtable(); /** collection of pairs <frame title, SortedSet of associated Integer number> */ private Hashtable buttonsNr = new Hashtable(); /* toggle button width */ private static final int len = 120; /** current horizontal position when locating a new toggle button */ private int x = 0; /** used to show a popup menu containing a "close frame" menu item */ private JPopupMenu menu = new JPopupMenu(); /** menu item inserted into the popup menu */ private JMenuItem closeMenu = new JMenuItem(ClientSettings.getInstance().getResources().getResource("close window")); /** menu item inserted into the popup menu */ private JMenuItem iconMenu = new JMenuItem(ClientSettings.getInstance().getResources().getResource("reduce to icon")); /** internal frame to close */ private InternalFrame frameToClose = null; public WinIconsPanel() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } public final void init() { this.removeAll(); buttons.clear(); buttonsNr.clear(); this.setMinimumSize(new Dimension(2000,26)); this.setPreferredSize(new Dimension(2000,26)); } private void jbInit() throws Exception { this.setBorder(BorderFactory.createLoweredBevelBorder()); flowLayout1.setAlignment(FlowLayout.LEFT); flowLayout1.setHgap(0); flowLayout1.setVgap(0); this.setLayout(flowLayout1); menu.add(closeMenu); closeMenu.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { x = x-len; frameToClose.closeFrame(); frameToClose = null; } catch (PropertyVetoException ex) { } } }); closeMenu.setVisible(ClientSettings.SHOW_POPUP_MENU_CLOSE); if(ClientSettings.ICON_MENU_WINDOW_CLOSE!=null) closeMenu.setIcon(new ImageIcon(ClientUtils.getImage(ClientSettings.ICON_MENU_WINDOW_CLOSE))); menu.add(iconMenu); iconMenu.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { frameToClose.setIcon(true); } catch (PropertyVetoException ex) { ex.printStackTrace(); } frameToClose = null; } }); iconMenu.setVisible(ClientSettings.SHOW_ICON_POPUP_MENU_REDUCE_ICON); if(ClientSettings.ICON_POPUP_MENU_REDUCE_ICON!=null) iconMenu.setIcon(new ImageIcon(ClientUtils.getImage(ClientSettings.ICON_POPUP_MENU_REDUCE_ICON))); } /** * Add an internal frame icon to the panel. * Add an internal frame listener. * @param frame internal frame to add */ public final void add(final InternalFrame frame) { try { Integer n = null; SortedSet list = (SortedSet)buttonsNr.get(frame.getTitle()); if (list==null) { list = new TreeSet(); n = new Integer(1); list.add(n); buttonsNr.put(frame.getTitle(),list); } else { n = new Integer( ((Integer)list.last()).intValue()+1 ); for(int i=1;i<n.intValue();i++) if (!list.contains(new Integer(i))) { n = new Integer(i); break; } list.add(n); } final JToggleButton btn = new JToggleButton((n.intValue()>1?" ["+n.intValue()+"] ":"")+frame.getTitle()); if (ClientSettings.ICON_ENABLE_FRAME!=null) btn.setIcon(new ImageIcon(ClientUtils.getImage(ClientSettings.ICON_ENABLE_FRAME))); btn.setHorizontalAlignment(SwingConstants.LEFT); btn.setToolTipText(frame.getTitle()); // int len = btn.getFontMetrics(btn.getFont()).stringWidth(btn.getText()); // btn.setMinimumSize(new Dimension(len+20,24)); btn.setMinimumSize(new Dimension(len,24)); btn.setMaximumSize(new Dimension(len,24)); btn.setPreferredSize(new Dimension(len,24)); btn.setSize(new Dimension(len,24)); // while (x+len+20>this.getWidth()-200) { // x = x-this.getComponent(0).getWidth(); // this.remove(0); // // this.revalidate(); // this.repaint(); // } while (x+len+20>this.getWidth()-200) { if (this.getComponentCount()>0) x = x-this.getComponent(0).getWidth(); if (this.getComponentCount()>0) this.remove(0); this.revalidate(); this.repaint(); } this.add(btn,null); //x = x+len+20; x = x+len; buttons.put(btn,frame); btn.setSelected(true); this.revalidate(); this.repaint(); btn.addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { if (e.getX()<25) { if (ClientSettings.ICON_CLOSE_FRAME_SELECTED!=null) btn.setIcon(new ImageIcon(ClientUtils.getImage(ClientSettings.ICON_CLOSE_FRAME_SELECTED))); } else { if (ClientSettings.ICON_CLOSE_FRAME!=null) btn.setIcon(new ImageIcon(ClientUtils.getImage(ClientSettings.ICON_CLOSE_FRAME))); } } }); btn.addMouseListener(new MouseAdapter() { public void mouseExited(MouseEvent e) { if (frame.isSelected()) { if (ClientSettings.ICON_ENABLE_FRAME!=null) btn.setIcon(new ImageIcon(ClientUtils.getImage(ClientSettings.ICON_ENABLE_FRAME))); } else { if(!btn.isSelected()) if(ClientSettings.ICON_DISABLE_FRAME!=null) btn.setIcon(new ImageIcon(ClientUtils.getImage(ClientSettings.ICON_DISABLE_FRAME))); } } public void mouseClicked(MouseEvent e) { if (SwingUtilities.isRightMouseButton(e)) { frameToClose = (InternalFrame)buttons.get(btn); if (frameToClose!=null && frameToClose.getDesktopPane()!=null && ((DesktopPane)frameToClose.getDesktopPane()).isModal() && !frameToClose.isModal()) { e.consume(); return; } iconMenu.setVisible( frameToClose.isIconifiable() ); menu.show(btn,e.getX(),e.getY()); }else{ if(e.getX() < 25){ frameToClose = (InternalFrame)buttons.get(btn); try { frameToClose.closeFrame(); } catch (PropertyVetoException ex) { } } } } public void mouseEntered(MouseEvent e) { if (SwingUtilities.isLeftMouseButton(e)) { btn.setSelected(true); InternalFrame f = (InternalFrame)buttons.get(btn); if (f!=null && f.getDesktopPane()!=null && ((DesktopPane)f.getDesktopPane()).isModal()) { e.consume(); return; } f.toFront(); try { f.setSelected(true); } catch (Exception ex) { } } } }); btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (btn.isSelected()) { InternalFrame f = (InternalFrame)buttons.get(btn); if (f!=null && f.getDesktopPane()!=null && ((DesktopPane)f.getDesktopPane()).isModal() && !f.isModal()) { btn.setSelected(!btn.isSelected()); return; } f.toFront(); try { f.setSelected(true); } catch (Exception ex) { } } else { InternalFrame f = (InternalFrame)buttons.get(btn); if (f!=null && f.getDesktopPane()!=null && ((DesktopPane)f.getDesktopPane()).isModal() && !f.isModal()) { btn.setSelected(!btn.isSelected()); return; } try { f.setSelected(false); } catch (Exception ex) { } f.toBack(); } } }); frame.addInternalFrameListener(new InternalFrameAdapter() { public void internalFrameClosed(InternalFrameEvent e) { try { buttons.remove(btn); try { SortedSet list = (SortedSet)buttonsNr.get(frame.getTitle()); if (list!=null) { if (list.size() == 1) { buttonsNr.remove(frame.getTitle()); } else { String aux = btn.getText(); if (aux.indexOf("[")!=-1 && aux.indexOf("]")!=-1) aux = aux.substring(aux.indexOf("[")+1,aux.indexOf("]")); else aux = "1"; list.remove(new Integer(aux)); } } } catch (Exception ex) { } WinIconsPanel.this.remove(btn); WinIconsPanel.this.revalidate(); WinIconsPanel.this.repaint(); //x = x - btn.getWidth() - 20; x = x - btn.getWidth(); } catch (Exception ex1) { } } public void internalFrameActivated(InternalFrameEvent e) { btn.setSelected(true); if (ClientSettings.ICON_ENABLE_FRAME!=null) btn.setIcon(new ImageIcon(ClientUtils.getImage(ClientSettings.ICON_ENABLE_FRAME))); } public void internalFrameDeactivated(InternalFrameEvent e) { btn.setSelected(false); if(!btn.isFocusOwner()) if(ClientSettings.ICON_DISABLE_FRAME!=null) btn.setIcon(new ImageIcon(ClientUtils.getImage(ClientSettings.ICON_DISABLE_FRAME))); } }); } catch (Exception ex) { ex.printStackTrace(); } } }