package org.freehep.application.mdi; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.HashMap; import java.util.Iterator; import java.util.Properties; import javax.swing.JMenu; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRadioButtonMenuItem; import javax.swing.JToolBar; import org.freehep.swing.layout.ToolBarLayout; import org.freehep.swing.popup.HasPopupItems; // TODO: No externally accessible toolbar menu // TODO: Undocking toobars doesnt work properly public class ToolBarHolder extends JPanel implements HasPopupItems { private static final String nameKey = "nameKey"; private static final String modeKey = "modekey"; private HashMap toolbars = new HashMap(); private HashMap autos = new HashMap(); protected ToolBarHolder() { super(new ToolBarLayout(ToolBarLayout.LEFT,5,5)); } void add(JToolBar bar, String name, int mode) { if (!toolbars.containsKey(name)) { if (mode == MDIApplication.TOOLBAR_DEFAULT) mode = MDIApplication.TOOLBAR_AUTO; if (mode == MDIApplication.TOOLBAR_AUTO) addAuto(bar); else bar.setVisible(mode == MDIApplication.TOOLBAR_VISIBLE); bar.putClientProperty(modeKey,new Integer(mode)); bar.putClientProperty(nameKey,name); toolbars.put(name,bar); add(bar); revalidate(); repaint(); } } void save(Properties props) { for (Iterator i = toolbars.values().iterator(); i.hasNext(); ) { JToolBar bar = (JToolBar) i.next(); props.setProperty("ToolBar."+bar.getClientProperty(nameKey).toString(),bar.getClientProperty(modeKey).toString()); } } void remove(JToolBar bar) { Object name = bar.getClientProperty(nameKey); if (name != null) toolbars.remove(name); removeAuto(bar); super.remove(bar); revalidate(); repaint(); } public JPopupMenu modifyPopupMenu(JPopupMenu popup,Component src, java.awt.Point p) { for (int i=0; i<getComponentCount(); i++) { final JToolBar bar = (JToolBar) getComponent(i); final String name = (String) bar.getClientProperty(nameKey); final int mode = ((Integer) bar.getClientProperty(modeKey)).intValue(); if (mode == MDIApplication.TOOLBAR_PROGRAM) continue; JMenu menu = new JMenu(name); final JRadioButtonMenuItem show = new JRadioButtonMenuItem("Show"); final JRadioButtonMenuItem hide = new JRadioButtonMenuItem("Hide"); final JRadioButtonMenuItem auto = new JRadioButtonMenuItem("Auto"); show.setSelected(mode == MDIApplication.TOOLBAR_VISIBLE); hide.setSelected(mode == MDIApplication.TOOLBAR_INVISIBLE); auto.setSelected(mode == MDIApplication.TOOLBAR_AUTO); ActionListener al = new ActionListener() { public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source == hide) { bar.putClientProperty(modeKey,new Integer(MDIApplication.TOOLBAR_INVISIBLE)); bar.setVisible(false); removeAuto(bar); } else if (source == show) { bar.putClientProperty(modeKey,new Integer(MDIApplication.TOOLBAR_VISIBLE)); bar.setVisible(true); removeAuto(bar); } else if (source == auto) { bar.putClientProperty(modeKey,new Integer(MDIApplication.TOOLBAR_AUTO)); addAuto(bar); } } }; show.addActionListener(al); hide.addActionListener(al); auto.addActionListener(al); menu.add(show); menu.add(hide); menu.add(auto); popup.add(menu); } return popup; } private void addAuto(JToolBar bar) { autos.put(bar,new AutoToolbarListener(bar)); } private void removeAuto(JToolBar bar) { AutoToolbarListener l = (AutoToolbarListener) autos.remove(bar); if (l != null) l.dispose(); } private class AutoToolbarListener implements PropertyChangeListener { private JToolBar bar; int count = 0; AutoToolbarListener(JToolBar bar) { this.bar = bar; int n = bar.getComponentCount(); boolean visible = false; for (int i=0; i<n; i++) { Component c = bar.getComponent(i); if (c.isEnabled()) count++; c.addPropertyChangeListener("enabled", this); } bar.setVisible(count>0); } void dispose() { int n = bar.getComponentCount(); for (int i=0; i<n; i++) { Component c = bar.getComponent(i); c.removePropertyChangeListener("enabled", this); } } public void propertyChange(PropertyChangeEvent evt) { Component source = (Component) evt.getSource(); if (source.isEnabled()) count++; else count--; bar.setVisible(count>0); } } }