package org.freeplane.plugin.workspace.actions; import java.awt.Component; import java.awt.event.ActionEvent; import java.net.URL; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JPopupMenu; import javax.swing.JTree; import javax.swing.tree.TreePath; import org.freeplane.core.resources.ResourceController; import org.freeplane.core.ui.AFreeplaneAction; import org.freeplane.core.util.LogUtils; import org.freeplane.core.util.TextUtils; import org.freeplane.plugin.workspace.WorkspaceController; import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenu; import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode; public abstract class AWorkspaceAction extends AFreeplaneAction { /** * */ private static final long serialVersionUID = 1L; public AWorkspaceAction(String key, String title, Icon icon) { super(key, title, icon); } public AWorkspaceAction(String key) { super(key, TextUtils.getRawText(key + ".label"), null); setIcon(); } public void setEnabledFor(AWorkspaceTreeNode node) { setEnabled(); } public void setEnabled() { setEnabled(true); } public void setSelectedFor(AWorkspaceTreeNode node) { super.setSelected(); } private void setIcon() { final String iconResource = ResourceController.getResourceController().getProperty(getIconKey(), null); if (iconResource != null) { // look in this package URL url = this.getClass().getResource(iconResource); if (url != null) { final ImageIcon icon = new ImageIcon(url); putValue(SMALL_ICON, icon); return; } // look in workspace package url = WorkspaceController.class.getResource(iconResource); if (url != null) { final ImageIcon icon = new ImageIcon(url); putValue(SMALL_ICON, icon); return; } // look in freeplane package url = ResourceController.class.getResource(iconResource); if (url != null) { final ImageIcon icon = new ImageIcon(url); putValue(SMALL_ICON, icon); return; } LogUtils.severe("can not load icon '" + iconResource + "'"); } } protected AWorkspaceTreeNode getNodeFromActionEvent(ActionEvent e) { WorkspacePopupMenu pop = getRootPopupMenu((Component) e.getSource()); if(pop == null) { return null; } int x = pop.getInvokerLocation().x; int y = pop.getInvokerLocation().y; JTree tree = (JTree)pop.getInvoker(); TreePath path = tree.getPathForLocation(x, y); if(path == null) { return null; } return (AWorkspaceTreeNode) path.getLastPathComponent(); } public WorkspacePopupMenu getRootPopupMenu(Component component) { Component parent = component; while(!(parent instanceof WorkspacePopupMenu) && parent != null) { if(parent.getParent() == null && parent instanceof JPopupMenu) { parent = getRootPopupMenu(((JPopupMenu) parent).getInvoker()); break; } else { parent = parent.getParent(); } } return (WorkspacePopupMenu) parent; } protected Component getComponentFromActionEvent(ActionEvent e) { WorkspacePopupMenu pop = getRootPopupMenu((Component) e.getSource()); //(WorkspacePopupMenu)((Component) e.getSource()).getParent(); JTree tree = (JTree)pop.getInvoker(); return tree.getComponentAt(pop.getInvokerLocation()); } }