/* * Copyright 2011 The authors * 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. */ package com.intellij.struts2.graph.fileEditor; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.graph.GraphManager; import com.intellij.openapi.graph.base.Node; import com.intellij.openapi.graph.builder.GraphBuilder; import com.intellij.openapi.graph.builder.GraphBuilderFactory; import com.intellij.openapi.graph.builder.util.GraphViewUtil; import com.intellij.openapi.graph.view.Graph2D; import com.intellij.openapi.graph.view.Graph2DView; import com.intellij.openapi.graph.view.Overview; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Disposer; import com.intellij.psi.xml.XmlFile; import com.intellij.struts2.graph.StrutsDataModel; import com.intellij.struts2.graph.StrutsPresentationModel; import com.intellij.struts2.graph.beans.BasicStrutsEdge; import com.intellij.struts2.graph.beans.BasicStrutsNode; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xml.DomElement; import com.intellij.util.xml.DomEventListener; import com.intellij.util.xml.DomManager; import com.intellij.util.xml.events.DomEvent; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.util.ArrayList; import java.util.List; /** * @author Yann Cébron */ public class Struts2GraphComponent extends JPanel implements DataProvider, Disposable { @NonNls private static final String STRUTS2_DESIGNER_COMPONENT = "STRUTS2_DESIGNER_COMPONENT"; private final GraphBuilder<BasicStrutsNode, BasicStrutsEdge> myBuilder; public Struts2GraphComponent(final XmlFile xmlFile) { final ProgressIndicator progress = ProgressManager.getInstance().getProgressIndicator(); progress.setText("Initializing..."); final Project project = xmlFile.getProject(); final Graph2D graph = GraphManager.getGraphManager().createGraph2D(); final Graph2DView view = GraphManager.getGraphManager().createGraph2DView(); progress.setText("Building model..."); final StrutsDataModel myDataModel = new StrutsDataModel(xmlFile); final StrutsPresentationModel presentationModel = new StrutsPresentationModel(graph); progress.setText("Setup graph..."); myBuilder = GraphBuilderFactory.getInstance(project).createGraphBuilder(graph, view, myDataModel, presentationModel); setLayout(new BorderLayout()); add(createToolbarPanel(), BorderLayout.NORTH); add(myBuilder.getView().getJComponent(), BorderLayout.CENTER); Disposer.register(this, myBuilder); myBuilder.initialize(); DomManager.getDomManager(myBuilder.getProject()).addDomEventListener(new DomEventListener() { public void eventOccured(final DomEvent event) { if (isShowing()) { myBuilder.queueUpdate(); } } }, this); } private JComponent createToolbarPanel() { final DefaultActionGroup actions = new DefaultActionGroup(); actions.add(GraphViewUtil.getBasicToolbar(myBuilder)); final ActionToolbar actionToolbar = ActionManager.getInstance().createActionToolbar("Struts2Graph", actions, true); return actionToolbar.getComponent(); } public List<DomElement> getSelectedDomElements() { final List<DomElement> selected = new ArrayList<>(); final Graph2D graph = myBuilder.getGraph(); for (final Node node : graph.getNodeArray()) { if (graph.isSelected(node)) { final BasicStrutsNode nodeObject = myBuilder.getNodeObject(node); if (nodeObject != null) { ContainerUtil.addIfNotNull(selected, nodeObject.getIdentifyingElement()); } } } return selected; } public void setSelectedDomElement(final DomElement domElement) { // TODO //if (domElement == null) return; // //final SeamPagesDomElement pageflowDomElement = domElement.getParentOfType(SeamPagesDomElement.class, false); //if (pageflowDomElement == null) return; // //final Node selectedNode = myBuilder.getNode(pageflowDomElement); // //if (selectedNode != null) { // final Graph2D graph = myBuilder.getGraph(); // // for (Node n : graph.getNodeArray()) { // final boolean selected = n.equals(selectedNode); // graph.setSelected(n, selected); // if (selected) { // final YRectangle yRectangle = graph.getRectangle(n); // if (!myBuilder.getView().getVisibleRect().contains( // new Rectangle((int)yRectangle.getX(), (int)yRectangle.getY(), (int)yRectangle.getWidth(), (int)yRectangle.getHeight()))) { // myBuilder.getView().setCenter(graph.getX(n), graph.getY(n)); // } // } // } //} //myBuilder.getView().updateView(); } public GraphBuilder getBuilder() { return myBuilder; } public Overview getOverview() { return GraphManager.getGraphManager().createOverview(myBuilder.getView()); } public void dispose() { } @Nullable public Object getData(@NonNls final String dataId) { if (Comparing.equal(dataId, STRUTS2_DESIGNER_COMPONENT)) { return this; } return null; } }