/*
Copyright 2008-2010 Gephi
Authors : Mathieu Bastian <mathieu.bastian@gephi.org>
Website : http://www.gephi.org
This file is part of Gephi.
Gephi is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
Gephi 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with Gephi. If not, see <http://www.gnu.org/licenses/>.
*/
package org.gephi.visualization.apiimpl;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import org.gephi.project.api.ProjectController;
import org.gephi.project.api.Workspace;
import org.gephi.project.api.WorkspaceInformation;
import org.gephi.project.api.WorkspaceProvider;
import org.gephi.visualization.VizController;
import org.gephi.visualization.bridge.DHNSEventBridge;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.util.ImageUtilities;
import org.openide.util.Lookup;
import org.openide.util.NbBundle;
/**
*
* @author Mathieu Bastian
*/
public class GraphContextMenu {
private VizConfig config;
private DHNSEventBridge eventBridge;
public GraphContextMenu() {
config = VizController.getInstance().getVizConfig();
eventBridge = (DHNSEventBridge) VizController.getInstance().getEventBridge();
}
public JPopupMenu getMenu() {
//Group
GraphContextMenuAction groupAction = new GraphContextMenuImpl("GraphContextMenu_Group", "org/gephi/visualization/api/resources/group.png") {
@Override
public void actionPerformed(ActionEvent e) {
eventBridge.group();
}
};
groupAction.setEnabled(eventBridge.canGroup());
//Ungroup
GraphContextMenuAction ungroupAction = new GraphContextMenuImpl("GraphContextMenu_Ungroup", "org/gephi/visualization/api/resources/ungroup.png") {
@Override
public void actionPerformed(ActionEvent e) {
eventBridge.ungroup();
}
};
ungroupAction.setEnabled(eventBridge.canUngroup());
//Expand
GraphContextMenuAction expandAction = new GraphContextMenuImpl("GraphContextMenu_Expand", "org/gephi/visualization/api/resources/expand.png") {
@Override
public void actionPerformed(ActionEvent e) {
eventBridge.expand();
}
};
expandAction.setEnabled(eventBridge.canExpand());
//Contract
GraphContextMenuAction contractAction = new GraphContextMenuImpl("GraphContextMenu_Contract", "org/gephi/visualization/api/resources/contract.png") {
@Override
public void actionPerformed(ActionEvent e) {
eventBridge.contract();
}
};
contractAction.setEnabled(eventBridge.canContract());
//Settle
GraphContextMenuAction settleAction = new GraphContextMenuImpl("GraphContextMenu_Settle", "org/gephi/visualization/api/resources/settle.png") {
@Override
public void actionPerformed(ActionEvent e) {
eventBridge.settle();
}
};
settleAction.setEnabled(eventBridge.canSettle());
//Free
GraphContextMenuAction freeAction = new GraphContextMenuImpl("GraphContextMenu_Free") {
@Override
public void actionPerformed(ActionEvent e) {
eventBridge.free();
}
};
freeAction.setEnabled(eventBridge.canFree());
//Free
GraphContextMenuAction deleteAction = new GraphContextMenuImpl("GraphContextMenu_Delete") {
@Override
public void actionPerformed(ActionEvent e) {
NotifyDescriptor.Confirmation notifyDescriptor = new NotifyDescriptor.Confirmation(
NbBundle.getMessage(GraphContextMenu.class, "GraphContextMenu.Delete.message"),
NbBundle.getMessage(GraphContextMenu.class, "GraphContextMenu.Delete.message.title"), NotifyDescriptor.YES_NO_OPTION);
if (DialogDisplayer.getDefault().notify(notifyDescriptor).equals(NotifyDescriptor.YES_OPTION)) {
eventBridge.delete();
}
}
};
deleteAction.setEnabled(eventBridge.canDelete());
//Move workspace
JMenu moveToWorkspaceMenu = new JMenu(NbBundle.getMessage(GraphContextMenu.class, "GraphContextMenu_MoveToWorkspace"));
boolean moveOrCopyEnabled = eventBridge.canMoveOrCopyWorkspace();
if (moveOrCopyEnabled) {
moveToWorkspaceMenu.add(new GraphContextMenuImpl("GraphContextMenu_MoveToWorkspace_NewWorkspace", "org/gephi/visualization/api/resources/new-wokspace.png") {
@Override
public void actionPerformed(ActionEvent e) {
eventBridge.moveToNewWorkspace();
}
});
moveToWorkspaceMenu.addSeparator();
ProjectController projectController = Lookup.getDefault().lookup(ProjectController.class);
for (final Workspace w : projectController.getCurrentProject().getLookup().lookup(WorkspaceProvider.class).getWorkspaces()) {
JMenuItem item = new JMenuItem(w.getLookup().lookup(WorkspaceInformation.class).getName());
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
eventBridge.moveToWorkspace(w);
}
});
moveToWorkspaceMenu.add(item);
item.setEnabled(w != projectController.getCurrentWorkspace());
}
}
moveToWorkspaceMenu.setEnabled(moveOrCopyEnabled);
//Copy workspace
JMenu copyToWorkspaceMenu = new JMenu(NbBundle.getMessage(GraphContextMenu.class, "GraphContextMenu_CopyToWorkspace"));
if (moveOrCopyEnabled) {
copyToWorkspaceMenu.add(new GraphContextMenuImpl("GraphContextMenu_CopyToWorkspace_NewWorkspace", "org/gephi/visualization/api/resources/new-wokspace.png") {
@Override
public void actionPerformed(ActionEvent e) {
eventBridge.copyToNewWorkspace();
}
});
copyToWorkspaceMenu.addSeparator();
ProjectController projectController = Lookup.getDefault().lookup(ProjectController.class);
for (final Workspace w : projectController.getCurrentProject().getLookup().lookup(WorkspaceProvider.class).getWorkspaces()) {
JMenuItem item = new JMenuItem(w.getLookup().lookup(WorkspaceInformation.class).getName());
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
eventBridge.copyToWorkspace(w);
}
});
copyToWorkspaceMenu.add(item);
item.setEnabled(w != projectController.getCurrentWorkspace());
}
}
copyToWorkspaceMenu.setEnabled(moveOrCopyEnabled);
//Popup
JPopupMenu popupMenu = new JPopupMenu();
popupMenu.add(groupAction);
popupMenu.add(ungroupAction);
popupMenu.addSeparator();
popupMenu.add(expandAction);
popupMenu.add(contractAction);
popupMenu.addSeparator();
popupMenu.add(deleteAction);
popupMenu.add(moveToWorkspaceMenu);
popupMenu.add(copyToWorkspaceMenu);
popupMenu.addSeparator();
popupMenu.add(settleAction);
popupMenu.add(freeAction);
return popupMenu;
}
public static interface GraphContextMenuAction extends Action {
public boolean isVisible();
}
private static class GraphContextMenuImpl extends AbstractAction implements GraphContextMenuAction {
public GraphContextMenuImpl(String key) {
putValue(Action.NAME, NbBundle.getMessage(GraphContextMenu.class, key));
}
public GraphContextMenuImpl(String key, String icon) {
putValue(Action.NAME, NbBundle.getMessage(GraphContextMenu.class, key));
putValue(Action.SMALL_ICON, ImageUtilities.loadImageIcon(icon, false));
}
public void actionPerformed(ActionEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
public boolean isVisible() {
return true;
}
}
}