/* * JUMP is Copyright (C) 2003 Vivid Solutions * * This program implements extensions to JUMP and is * Copyright (C) 2009 Integrated Systems Analysts, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * 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 more information, contact: * * Integrated Systems Analysts, Inc. * 630C Anchors St., Suite 101 * Fort Walton Beach, Florida 32548 * USA * * (850)862-7321 */ package org.openjump.core.ui.plugin.view; import java.awt.Component; import java.awt.GridBagConstraints; import java.awt.GridLayout; 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.MouseListener; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.SwingUtilities; import javax.swing.event.MenuListener; import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; import com.vividsolutions.jump.I18N; import com.vividsolutions.jump.util.Blackboard; import com.vividsolutions.jump.workbench.WorkbenchContext; import com.vividsolutions.jump.workbench.plugin.MultiEnableCheck; import com.vividsolutions.jump.workbench.plugin.PlugIn; import com.vividsolutions.jump.workbench.plugin.PlugInContext; import com.vividsolutions.jump.workbench.ui.LayerViewPanel; import com.vividsolutions.jump.workbench.ui.plugin.FeatureInstaller; import com.vividsolutions.jump.workbench.ui.plugin.PersistentBlackboardPlugIn; import com.vividsolutions.jump.workbench.ui.toolbox.ToolboxDialog; public class EasyPanel extends JPanel { public final static String EZ_LIST_KEY = EasyPanel.class.getName()+"EZ_LIST_KEY"; //private final String UNUSED_BUTTON_NAME = "Right Click to Assign Button F"; //private final String RIGHT_CLICK_MENU = "Map Right Click"; private String UNUSED_BUTTON_NAME = I18N.get("org.openjump.core.ui.plugin.view.EasyPanel.Right-Click-to-Assign-Button-F"); private String RIGHT_CLICK_MENU = I18N.get("org.openjump.core.ui.plugin.view.EasyPanel.Map-Right-Click"); private JPanel buttonPanel = new JPanel(); private GridLayout gridLayout1 = new GridLayout(); private final int MAX_BUTTONS = 10; private CustomButton[] buttons = new CustomButton[MAX_BUTTONS]; private CustomButton activeButton = null; private JPopupMenu masterPopup = new JPopupMenu(); private JMenu rightClickMenu = new JMenu(RIGHT_CLICK_MENU); private ArrayList<JMenuItem> menuItemList = new ArrayList<JMenuItem>(); private ArrayList<String> menuNameList = new ArrayList<String>(); private ToolboxDialog toolbox; public EasyPanel(ToolboxDialog toolbox) { this.toolbox = toolbox; this.add(buttonPanel); buttonPanel.setLayout(gridLayout1); gridLayout1.setColumns(1); gridLayout1.setRows(MAX_BUTTONS); addButtons(); populatePopupMenu(toolbox.getContext()); recallButtonAssignments(); toolbox.pack(); } private void addButtons(){ GridBagConstraints gbc = new GridBagConstraints(); for (int i=0; i<MAX_BUTTONS; i++) { buttons[i] = new CustomButton(i); buttonPanel.add( buttons[i],gbc); MouseListener popupListener = new PopupListener(masterPopup); buttons[i].addMouseListener(popupListener); buttons[i].addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { buttonActionPerformed(e); } }); } } private void recallButtonAssignments() { ArrayList buttonNameList = getPersistentButtonList(toolbox.getContext()); int buttonNumber = 0; int n = 0; for (Iterator i=buttonNameList.iterator(); i.hasNext(); ) { String name = (String) i.next(); int index = menuNameList.indexOf(name); if (index > -1) { JMenuItem jMenuItemToSet = menuItemList.get(index); buttons[buttonNumber].setMenuItem(jMenuItemToSet); String buttonName = buttons[buttonNumber].getText(); buttons[buttonNumber].setText(buttonName + " F" +(++n)); } else{ buttons[buttonNumber].setText(UNUSED_BUTTON_NAME+(++n)); } buttonNumber++; } } private void buttonActionPerformed(ActionEvent e) { String name = e.getActionCommand(); CustomButton button = null; for (int i=0; i<buttons.length; i++) { if (buttons[i].getText().equalsIgnoreCase(name)) { button = buttons[i]; break; } } if (button != null) button.executeMenuItem(); } private void populatePopupMenu(WorkbenchContext context) { JMenuBar jMenuBar = context.getWorkbench().getFrame().getJMenuBar(); int menuCount = jMenuBar.getMenuCount(); for (int i=0; i<menuCount; i++) { JMenu jMenuRef = jMenuBar.getMenu(i); masterPopup.add(populateMenu(jMenuRef)); } //skip Layer Name right click for now // JPopupMenu jPopupMenu = context.getWorkbench().getFrame().getLayerNamePopupMenu(); // MenuElement[] menuElement = jPopupMenu.getSubElements(); JPopupMenu jPopupMenu = LayerViewPanel.popupMenu(); int itemCount = jPopupMenu.getComponentCount(); //menuElement.length; for (int j=0; j<itemCount; j++) { if (jPopupMenu.getComponent(j) instanceof JMenuItem) { JMenuItem jMenuItemRef = (JMenuItem) jPopupMenu.getComponent(j); JMenuItem jMenuItem = new CustomJMenuItem(jMenuItemRef); rightClickMenu.add(jMenuItem); jMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemActionPerformed(e); } }); } else { rightClickMenu.insertSeparator(j); } } masterPopup.add(rightClickMenu); } private JMenuItem populateMenu(JMenu jMenuRef) { JMenu jMenu = new JMenu(jMenuRef.getText()); int itemCount = jMenuRef.getItemCount(); for (int j=0; j<itemCount; j++) { JMenuItem jMenuItemRef = jMenuRef.getItem(j); if (jMenuItemRef instanceof JMenu) { jMenu.add( populateMenu((JMenu) jMenuItemRef)); //Recurse } else { if (jMenuItemRef instanceof JMenuItem) { JMenuItem jMenuItem = new CustomJMenuItem(jMenuItemRef); menuNameList.add(jMenuItem.getText()); menuItemList.add(jMenuItemRef); jMenu.add(jMenuItem); jMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { menuItemActionPerformed(e); } }); } else { jMenu.insertSeparator(j); } } } return jMenu; } private void menuItemActionPerformed(ActionEvent e) { Object source = e.getSource(); String name = e.getActionCommand(); if (activeButton != null) { if (source instanceof CustomJMenuItem) { CustomJMenuItem jMenuItem = (CustomJMenuItem) source; JMenuItem referencedJMenuItem = jMenuItem.getReferencedJMenuItem(); activeButton.setMenuItem(referencedJMenuItem); } } toolbox.pack(); } private ArrayList getPersistentButtonList(WorkbenchContext context) { Blackboard blackboard = PersistentBlackboardPlugIn.get(context); if (blackboard.get(EZ_LIST_KEY) == null) { ArrayList list = new ArrayList(MAX_BUTTONS); for (int i=0; i<MAX_BUTTONS; i++) { list.add(new String(UNUSED_BUTTON_NAME+(i+1))); } blackboard.put(EZ_LIST_KEY, list); } ArrayList list = (ArrayList) blackboard.get(EZ_LIST_KEY); return list; } private void setPersistentButtonList(WorkbenchContext context, int index, String buttonName) { ArrayList buttonNameList = getPersistentButtonList(context); if (index < MAX_BUTTONS) buttonNameList.set(index,buttonName); Blackboard blackboard = PersistentBlackboardPlugIn.get(context); blackboard.put(EZ_LIST_KEY, buttonNameList); } class PopupListener extends MouseAdapter { JPopupMenu popup; PopupListener(JPopupMenu popupMenu) { popup = popupMenu; } public void mousePressed(MouseEvent e) { maybeShowPopup(e); } public void mouseReleased(MouseEvent e) { maybeShowPopup(e); } private void maybeShowPopup(MouseEvent e) { if (e.isPopupTrigger()) { Component component = e.getComponent(); popup.show(component, e.getX(), e.getY()); if (component instanceof CustomButton) { activeButton = (CustomButton) component; } } } } class CustomButton extends JButton { //implements ChangeListener{ private JMenuItem jMenuItem = null; private int buttonNumber = 0; public CustomButton(int buttonNumber) { super(UNUSED_BUTTON_NAME+(buttonNumber+1)); this.buttonNumber = buttonNumber; this.setToolTipText("F"+(buttonNumber+1)); // this.setMnemonic(KeyEvent.VK_F1+buttonNumber); //Mnenoics are useless - need focus toolbox.getContext().getWorkbench().getFrame() .addKeyboardShortcut(KeyEvent.VK_F1+buttonNumber, 0, new PlugIn() { //inline a plugin public boolean execute(PlugInContext context) throws Exception { executeMenuItem(); return false; } public String getName() { return null; } public void initialize(PlugInContext context) throws Exception { } } , new MultiEnableCheck()); } public void setMenuItem(JMenuItem jMenuItemToSet) { jMenuItem = jMenuItemToSet; this.setText(jMenuItem.getText()); setPersistentButtonList(toolbox.getContext(), buttonNumber, jMenuItem.getText()); //ChangeListener isn't fired unless you drop down a menu // if (jMenuItem != null) { // ChangeListener[] changeListeners = jMenuItem.getChangeListeners(); // for (int i=0; i<changeListeners.length; i++) { // if (changeListeners[i] == this) { // instanceof CustomButton) { // jMenuItem.removeChangeListener(changeListeners[i]); // } // } // } // this.setToolTipText(jMenuItem.getToolTipText()); // jMenuItem.addChangeListener(this); } public void executeMenuItem() { if (jMenuItem != null) { //fire an event to run the EnableCheck Component component = ((JPopupMenu) jMenuItem.getParent()).getInvoker(); if (component instanceof JMenu) { JMenu jMenu = (JMenu) component; MenuListener[] menuListeners = jMenu.getMenuListeners(); for (int i=0; i<menuListeners.length; i++) { if (menuListeners[i] instanceof FeatureInstaller.JumpMenuListener) { ((FeatureInstaller.JumpMenuListener) menuListeners[i]).menuSelected(null); } } } else { JPopupMenu popupMenu = ((JPopupMenu) jMenuItem.getParent()); PopupMenuListener[] listeners = popupMenu.getListeners(PopupMenuListener.class); for (int i=0; i<listeners.length; i++) { if (listeners[i] instanceof PopupMenuListener) { ((PopupMenuListener) listeners[i]) .popupMenuWillBecomeVisible(new PopupMenuEvent(popupMenu)); } } } SwingUtilities.invokeLater(new Runnable() { public void run() { if (jMenuItem.isEnabled()) jMenuItem.doClick(); else { String toolTip = jMenuItem.getToolTipText(); setToolTip(toolTip); } }}); } } public void setButtonEnabled(boolean enabled){ this.setEnabled(enabled); } // public void stateChanged(ChangeEvent e) { // setButtonEnabled(jMenuItem.isEnabled()); // } private void setToolTip(String toolTip) { this.setToolTipText(toolTip); toolbox.getContext().getWorkbench().getFrame().warnUser(toolTip); } } class CustomJMenuItem extends JMenuItem { private JMenuItem referencedJMenuItem = null; public CustomJMenuItem(JMenuItem jMenuItem) { super(jMenuItem.getText()); referencedJMenuItem = jMenuItem; } public JMenuItem getReferencedJMenuItem() { return referencedJMenuItem; } } }