/*
* Copyright (c) 2000-2006 JetBrains s.r.o. All Rights Reserved.
*/
package com.intellij.openapi.graph.builder.util;
import com.intellij.ide.DataManager;
import com.intellij.ide.structureView.StructureView;
import com.intellij.ide.structureView.StructureViewBuilder;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.graph.GraphManager;
import com.intellij.openapi.graph.base.Edge;
import com.intellij.openapi.graph.base.Node;
import com.intellij.openapi.graph.builder.actions.*;
import com.intellij.openapi.graph.builder.actions.export.ExportToFileAction;
import com.intellij.openapi.graph.builder.actions.layout.ApplyCurrentLayoutAction;
import com.intellij.openapi.graph.builder.actions.printing.PrintGraphAction;
import com.intellij.openapi.graph.builder.actions.printing.PrintPreviewAction;
import com.intellij.openapi.graph.view.*;
import com.intellij.openapi.graph.view.hierarchy.GroupNodeRealizer;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Condition;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.util.List;
import java.util.Map;
public class GraphViewUtil {
@NonNls public static String GRAPH_KEY = "GRAPH_KEY";
@Nullable
public static Object getData(final Graph2DView view, final String data) {
DataProvider dataProvider = (DataProvider)view.getJComponent().getClientProperty(DataManager.CLIENT_PROPERTY_DATA_PROVIDER);
if (dataProvider == null) return null;
return dataProvider.getData(data);
}
public static Graph2DView createView(final DataProvider dataProvider) {
final Graph2DView graph2DView = GraphManager.getGraphManager().createGraph2DView();
addDataProvider(graph2DView, dataProvider);
return graph2DView;
}
public static void addDataProvider(final Graph2DView graph2DView, @NotNull final DataProvider dataProvider) {
DataProvider oldDataProvider = (DataProvider)graph2DView.getJComponent().getClientProperty(DataManager.CLIENT_PROPERTY_DATA_PROVIDER);
CompositeDataProvider compositeDataProvider;
if (oldDataProvider == null) {
compositeDataProvider = new CompositeDataProvider();
compositeDataProvider.add(createDefaultGraphDataProvider(graph2DView));
} else if (oldDataProvider instanceof CompositeDataProvider) {
compositeDataProvider = (CompositeDataProvider)oldDataProvider;
} else {
compositeDataProvider = new CompositeDataProvider();
compositeDataProvider.add(oldDataProvider);
}
compositeDataProvider.add(dataProvider);
graph2DView.getJComponent().putClientProperty(DataManager.CLIENT_PROPERTY_DATA_PROVIDER, compositeDataProvider);
}
private static DataProvider createDefaultGraphDataProvider(final Graph2DView graph2DView) {
return new DataProvider() {
@Nullable
public Object getData(@NonNls String dataId) {
if (GRAPH_KEY.equals(dataId)) return graph2DView.getGraph2D();
return null;
}
};
}
public static List<Node> getSelectedNodes(final Graph2D graph) {
return ContainerUtil.findAll(graph.getNodeArray(), new Condition<Node>() {
public boolean value(final Node node) {
return graph.getRealizer(node).isSelected();
}
});
}
public static List<Edge> getSelectedEdges(final Graph2D graph) {
return ContainerUtil.findAll(graph.getEdgeArray(), new Condition<Edge>() {
public boolean value(final Edge edge) {
return graph.getRealizer(edge).isSelected();
}
});
}
public static NodeRealizer createNodeRealizer(@NonNls final String configuration, final NodeCellRenderer nodeCellRenderer) {
final GenericNodeRealizer nodeRealizer = GraphManager.getGraphManager().createGenericNodeRealizer();
GenericNodeRealizer.Factory factory = GenericNodeRealizer.Statics.getFactory();
Map map = factory.createDefaultConfigurationMap();
map.put(GenericNodeRealizer.Painter.class,
GraphManager.getGraphManager().createNodeCellRendererPainter(nodeCellRenderer, NodeCellRendererPainter.USER_DATA_MAP));
factory.addConfiguration(configuration, map);
nodeRealizer.setConfiguration(configuration);
nodeRealizer.setUserData(nodeCellRenderer);
return nodeRealizer;
}
public static void setRenderedNodeSizes(final Graph2D graph, final Graph2DView view, final Node node) {
NodeRealizer nodeRealizer = graph.getRealizer(node);
if (nodeRealizer instanceof GenericNodeRealizer) {
GenericNodeRealizer realizer = (GenericNodeRealizer)nodeRealizer;
final Object o = realizer.getUserData();
if (o instanceof NodeCellRenderer) {
final Dimension size = ((NodeCellRenderer)o).getNodeCellRendererComponent(view, nodeRealizer, null, false).getPreferredSize();
graph.setSize(nodeRealizer.getNode(), GraphManager.getGraphManager().createYDimension(size.width, size.height));
}
}
if (nodeRealizer instanceof GroupNodeRealizer) {
final GroupNodeRealizer groupNodeRealizer = (GroupNodeRealizer)nodeRealizer;
if (groupNodeRealizer.isGroupClosed()) {
final NodeLabel nodeLabel = groupNodeRealizer.getLabel();
if (nodeLabel != null) {
graph.setSize(node, nodeLabel.getWidth(), groupNodeRealizer.getHeight());
}
}
}
}
public static JComponent createCommonToolbarPane(Graph2D graph) {
DefaultActionGroup actions = getBasicToolbar(graph);
final ActionToolbar actionToolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, actions, true);
return actionToolbar.getComponent();
}
public static DefaultActionGroup getBasicToolbar(final Graph2D graph) {
DefaultActionGroup actions = new DefaultActionGroup();
actions.add(new ShowHideGridAction(graph));
actions.add(new SnapToGridAction(graph));
actions.addSeparator();
actions.add(new ZoomInAction(graph));
actions.add(new ZoomOutAction(graph));
actions.add(new ActualZoomAction(graph));
actions.add(new FitContentAction(graph));
actions.addSeparator();
actions.add(new ApplyCurrentLayoutAction(graph));
actions.addSeparator();
actions.add(new ExportToFileAction(graph));
actions.add(new PrintGraphAction(graph));
actions.add(new PrintPreviewAction(graph));
actions.addSeparator();
actions.add(new DeleteSelectionAction());
return actions;
}
public static AnAction getCommonPopupActions() {
return ActionManager.getInstance().getAction("Graph.DefaultGraphPopup");
}
public static void updateWorldRect(Graph2DView view) {
Rectangle rectangle = getActualSize(view);
final int x = (int)rectangle.getX() - 20;
final int y = (int)rectangle.getY() - 20;
final int width = (int)rectangle.getWidth() + 40;
final int hight = (int)rectangle.getHeight() + 40;
view.setWorldRect(x, y, width, hight);
}
public static Rectangle getActualSize(Graph2DView view) {
return view.getGraph2D().getBoundingBox();
}
public static StructureViewBuilder createStructureViewBuilder(final Overview overview) {
return new StructureViewBuilder() {
@NotNull
public StructureView createStructureView(final FileEditor fileEditor, Project project) {
return new StructureView() {
public FileEditor getFileEditor() {
return fileEditor;
}
public boolean navigateToSelectedElement(boolean requestFocus) {
return false;
}
public JComponent getComponent() {
return overview.getJComponent();
}
public void dispose() {
}
public void centerSelectedRow() {
}
public void restoreState() {
}
public void storeState() {
}
};
}
};
}
}