package org.cristalise.gui.graph.view; import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JScrollPane; import org.cristalise.gui.graph.controller.AutoScrollController; import org.cristalise.gui.graph.controller.EdgeConstructionController; import org.cristalise.gui.graph.controller.MultiSelectionDragController; import org.cristalise.gui.graph.controller.VertexConstructionController; import org.cristalise.kernel.graph.model.EdgeFactory; import org.cristalise.kernel.graph.model.GraphModelManager; import org.cristalise.kernel.graph.model.TypeNameAndConstructionInfo; import org.cristalise.kernel.graph.model.VertexFactory; import org.cristalise.kernel.graph.model.VertexOutlineCreator; public class EditorPanel extends JPanel { // Graph Model public final GraphModelManager mGraphModelManager = new GraphModelManager(); // Graph View public GraphPanel mGraphPanel = null; protected JScrollPane mGraphScrollPane = null; // Graph Controllers protected MultiSelectionDragController mMultiSelectionDragController; protected VertexConstructionController mVertexConstructionController = new VertexConstructionController(); protected EdgeConstructionController mEdgeConstructionController = new EdgeConstructionController(); protected AutoScrollController mAutoScrollController = new AutoScrollController(); // Tool bar protected EditorToolBar mEditorToolBar = null; protected EditorPanel() { } public EditorPanel(EdgeFactory eFactory, VertexFactory vFactory, VertexOutlineCreator vOutlineCreator, boolean edgeCreationMode, // True // if // edges // can // be // created JButton[] otherButtons, GraphPanel graphPanel) { // Create the graph panel and editor tool bar setDoubleBuffered(true); mGraphPanel = graphPanel; mGraphPanel.setGraphModelManager(mGraphModelManager); mGraphScrollPane = new JScrollPane(mGraphPanel); mGraphModelManager.setExternalEdgeFactory(eFactory); mGraphModelManager.setExternalVertexFactory(vFactory); mGraphModelManager.setVertexOutlineCreator(vOutlineCreator); mEditorToolBar = new EditorToolBar(edgeCreationMode, otherButtons, graphPanel); mEditorToolBar.setGraphModelManager(mGraphModelManager); mEditorToolBar.setGraphPanel(mGraphPanel); createLayout(); // The graph panel observes the graph model mGraphModelManager.addObserver(mGraphPanel); // The multi selection drag controller modifies the graph model // and listens to the graph panel and editor tool bar mMultiSelectionDragController = new MultiSelectionDragController(mGraphModelManager, mGraphPanel); mGraphPanel.addMouseListener(mMultiSelectionDragController); mGraphPanel.addMouseMotionListener(mMultiSelectionDragController); mGraphPanel.addKeyListener(mMultiSelectionDragController); mEditorToolBar.addEditorModeListener(mMultiSelectionDragController); // The edge construction controller modifies the graph model, queries the graph panel // and listens to the graph panel and editor tool bar mEdgeConstructionController.setGraphModelManager(mGraphModelManager); mEdgeConstructionController.setGraphPanel(mGraphPanel); mGraphPanel.addMouseListener(mEdgeConstructionController); mGraphPanel.addMouseMotionListener(mEdgeConstructionController); mEdgeConstructionController.setEditorToolBar(mEditorToolBar); // The vertex construction controller modifies the graph model // and listens to the graph panel and editor tool bar mVertexConstructionController.setGraphModelManager(mGraphModelManager); mGraphPanel.addMouseListener(mVertexConstructionController); mVertexConstructionController.setEditorToolBar(mEditorToolBar); // The auto scroll controller listens to and modifies the // graph panel mAutoScrollController.setGraphPanel(mGraphPanel); } protected void createLayout() { setLayout(new BorderLayout()); add(mEditorToolBar, BorderLayout.NORTH); mGraphPanel.setPreferredSize(new Dimension(mGraphModelManager.getModel().getWidth(), mGraphModelManager.getModel().getHeight())); add(mGraphScrollPane, BorderLayout.CENTER); } public void enterSelectMode() { mEditorToolBar.enterSelectMode(); } public void updateEdgeTypes(TypeNameAndConstructionInfo[] typeNameAndConstructionInfo) { mEditorToolBar.updateEdgeTypes(typeNameAndConstructionInfo); } public void updateVertexTypes(TypeNameAndConstructionInfo[] typeNameAndConstructionInfo) { mEditorToolBar.updateVertexTypes(typeNameAndConstructionInfo); } public void setEditable(boolean editable) { mGraphModelManager.setEditable(editable); mEditorToolBar.setGraphEditable(editable); } }