/*
* Copyright 2000-2006 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
/*
* Created by IntelliJ IDEA.
* User: Sergey.Vasiliev
* Date: Oct 2, 2006
* Time: 5:28:50 PM
*/
package com.intellij.openapi.graph.builder.actions;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.graph.base.Edge;
import com.intellij.openapi.graph.base.EdgeCursor;
import com.intellij.openapi.graph.base.Node;
import com.intellij.openapi.graph.base.NodeCursor;
import com.intellij.openapi.graph.builder.DeleteProvider;
import com.intellij.openapi.graph.builder.GraphBuilder;
import com.intellij.openapi.graph.builder.GraphBundle;
import com.intellij.openapi.graph.view.Graph2D;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.util.Icons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
public class DeleteSelectionAction extends AbstractGraphAction {
protected void actionPerformed(final AnActionEvent e, final Graph2D graph) {
final DeleteProvider deleteProvider = getDeleteProvider(e);
final GraphBuilder graphBuilder = getGraphBuilder(e);
if (deleteProvider == null || graphBuilder == null) return;
final List<Node> nodesToBeDeleted = getNodesToBeDeleted(graph, graphBuilder, deleteProvider);
final List<Edge> edgesToBeDeleted = getEdgesToBeDeleted(graph, graphBuilder, deleteProvider);
if (nodesToBeDeleted.size() > 0 || edgesToBeDeleted.size() > 0) {
final String messageText = GraphBundle.message("graph.delete.message") + "?";
final String messageCaption = GraphBundle.message("graph.delete.message.caption");
if (DialogWrapper.OK_EXIT_CODE ==
Messages.showOkCancelDialog(messageText, messageCaption, Messages.getQuestionIcon())) {
for (Node node : nodesToBeDeleted) {
final Object nodeObject = graphBuilder.getNodeObject(node);
if (nodeObject != null) deleteProvider.deleteNode(nodeObject);
}
for (Edge edge : edgesToBeDeleted) {
final Object edgeObject = graphBuilder.getEdgeObject(edge);
if (edgeObject != null) deleteProvider.deleteEdge(edgeObject);
}
}
graphBuilder.updateGraph();
}
}
protected void update(final AnActionEvent e, final Graph2D graph) {
final DeleteProvider deleteProvider = getDeleteProvider(e);
final GraphBuilder graphBuilder = getGraphBuilder(e);
boolean enabled = false;
if (deleteProvider == null || graphBuilder == null) {
e.getPresentation().setVisible(false);
}
else {
final List<Node> toBeDeleted = getNodesToBeDeleted(graph, graphBuilder, deleteProvider);
final List<Edge> edgesToBeDeleted = getEdgesToBeDeleted(graph, graphBuilder, deleteProvider);
enabled = toBeDeleted.size() > 0 || edgesToBeDeleted.size() > 0;
}
e.getPresentation().setEnabled(enabled);
e.getPresentation().setText(GraphBundle.message("graph.delete.message"));
e.getPresentation().setIcon(Icons.DELETE_ICON);
}
private static List<Node> getNodesToBeDeleted(final Graph2D graph,
@NotNull final GraphBuilder graphBuilder,
@NotNull final DeleteProvider deleteProvider) {
List<Node> toBeDeleted = new ArrayList<Node>();
for (NodeCursor nc = graph.selectedNodes(); nc.ok(); nc.next()) {
final Node node = nc.node();
final Object nodeObject = graphBuilder.getNodeObject(node);
if (nodeObject != null && deleteProvider.canDeleteNode(nodeObject)) {
toBeDeleted.add(node);
}
}
return toBeDeleted;
}
private static List<Edge> getEdgesToBeDeleted(final Graph2D graph, final GraphBuilder graphBuilder, final DeleteProvider deleteProvider) {
List<Edge> toBeDeleted = new ArrayList<Edge>();
for (EdgeCursor edgeCursor = graph.selectedEdges(); edgeCursor.ok(); edgeCursor.next()) {
final Edge edge = edgeCursor.edge();
final Object edgeObject = graphBuilder.getEdgeObject(edge);
if (edgeObject != null && deleteProvider.canDeleteEdge(edgeObject)) {
toBeDeleted.add(edge);
}
}
return toBeDeleted;
}
@Nullable
private static DeleteProvider getDeleteProvider(final AnActionEvent e) {
return (DeleteProvider)e.getDataContext().getData(DeleteProvider.GRAPH_DELETE_PROVIDER_KEY);
}
@Nullable
private static GraphBuilder getGraphBuilder(final AnActionEvent e) {
return (GraphBuilder)e.getDataContext().getData(GraphBuilder.GRAPH_BUILDER_KEY);
}
}