summaryrefslogtreecommitdiff
path: root/src/main/java/com/c2kernel/gui/graph
diff options
context:
space:
mode:
authorAndrew Branson <andrew.branson@cern.ch>2012-06-29 16:21:42 +0200
committerAndrew Branson <andrew.branson@cern.ch>2012-06-29 16:21:42 +0200
commitd6f6211306708d22ddcbe4e350f906c63220d7a4 (patch)
tree15bc138b301680b3db240ddc2ca5f8170c6990fa /src/main/java/com/c2kernel/gui/graph
parent3069ddf81b3cce2303cc1528e5de4708a798841f (diff)
More graph gui components. Selection moved from GraphModel to GraphPanel
Diffstat (limited to 'src/main/java/com/c2kernel/gui/graph')
-rw-r--r--src/main/java/com/c2kernel/gui/graph/controller/DeletionController.java16
-rw-r--r--src/main/java/com/c2kernel/gui/graph/controller/EdgeConstructionController.java3
-rw-r--r--src/main/java/com/c2kernel/gui/graph/controller/MultiSelectionDragController.java51
-rw-r--r--src/main/java/com/c2kernel/gui/graph/controller/StartVertexController.java12
-rw-r--r--src/main/java/com/c2kernel/gui/graph/controller/VertexConstructionController.java3
-rw-r--r--src/main/java/com/c2kernel/gui/graph/view/EditorPanel.java4
-rw-r--r--src/main/java/com/c2kernel/gui/graph/view/EditorToolBar.java17
-rw-r--r--src/main/java/com/c2kernel/gui/graph/view/GraphPanel.java367
-rw-r--r--src/main/java/com/c2kernel/gui/graph/view/VertexPropertyPanel.java2
9 files changed, 388 insertions, 87 deletions
diff --git a/src/main/java/com/c2kernel/gui/graph/controller/DeletionController.java b/src/main/java/com/c2kernel/gui/graph/controller/DeletionController.java
index 4a8fb47..d83a588 100644
--- a/src/main/java/com/c2kernel/gui/graph/controller/DeletionController.java
+++ b/src/main/java/com/c2kernel/gui/graph/controller/DeletionController.java
@@ -9,10 +9,11 @@ import java.util.Observer;
import javax.swing.JButton;
-import com.c2kernel.graph.event.SelectionChangedEvent;
import com.c2kernel.graph.model.DirectedEdge;
import com.c2kernel.graph.model.GraphModelManager;
import com.c2kernel.graph.model.Vertex;
+import com.c2kernel.gui.graph.event.SelectionChangedEvent;
+import com.c2kernel.gui.graph.view.GraphPanel;
// The deletion controller is responsible for deleting the present
@@ -29,6 +30,7 @@ import com.c2kernel.graph.model.Vertex;
public class DeletionController extends KeyAdapter implements Observer, ActionListener
{
private GraphModelManager mGraphModelManager = null;
+ private GraphPanel mGraphPanel = null;
private JButton mDeleteButton = null;
@@ -37,6 +39,11 @@ public class DeletionController extends KeyAdapter implements Observer, ActionLi
mGraphModelManager = graphModelManager;
mGraphModelManager.addObserver(this);
}
+
+ public void setGraphPanel(GraphPanel graphPanel)
+ {
+ mGraphPanel = graphPanel;
+ }
public void setDeleteButton(JButton deleteButton)
@@ -63,8 +70,7 @@ public class DeletionController extends KeyAdapter implements Observer, ActionLi
selectedEdge = event.mSelection.mEdge;
selectedVertices = event.mSelection.mVertices;
-
- mDeleteButton.setEnabled((selectedEdge != null) || (selectedVertices != null));
+ mDeleteButton.setEnabled(selectedEdge != null || selectedVertices != null);
}
}
@@ -75,7 +81,7 @@ public class DeletionController extends KeyAdapter implements Observer, ActionLi
{
if(e.getKeyCode() == KeyEvent.VK_DELETE && mGraphModelManager.isEditable())
{
- mGraphModelManager.getModel().deleteSelection();
+ mGraphPanel.deleteSelection();
}
}
@@ -86,7 +92,7 @@ public class DeletionController extends KeyAdapter implements Observer, ActionLi
{
if(mGraphModelManager != null && mGraphModelManager.isEditable())
{
- mGraphModelManager.getModel().deleteSelection();
+ mGraphPanel.deleteSelection();
}
}
}
diff --git a/src/main/java/com/c2kernel/gui/graph/controller/EdgeConstructionController.java b/src/main/java/com/c2kernel/gui/graph/controller/EdgeConstructionController.java
index f76d314..b200991 100644
--- a/src/main/java/com/c2kernel/gui/graph/controller/EdgeConstructionController.java
+++ b/src/main/java/com/c2kernel/gui/graph/controller/EdgeConstructionController.java
@@ -66,7 +66,8 @@ public class EdgeConstructionController extends MouseAdapter implements EditorMo
{
if(mGraphModelManager != null)
{
- mGraphModelManager.getModel().setNewEdgeEndPoint((Point)data);
+ Point mouse = (Point)data;
+ mGraphModelManager.getModel().setNewEdgeEndPoint(new GraphPoint(mouse.x, mouse.y));
}
}
};
diff --git a/src/main/java/com/c2kernel/gui/graph/controller/MultiSelectionDragController.java b/src/main/java/com/c2kernel/gui/graph/controller/MultiSelectionDragController.java
index 2d77996..498f3d9 100644
--- a/src/main/java/com/c2kernel/gui/graph/controller/MultiSelectionDragController.java
+++ b/src/main/java/com/c2kernel/gui/graph/controller/MultiSelectionDragController.java
@@ -8,20 +8,20 @@ import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import com.c2kernel.graph.model.DirectedEdge;
-import com.c2kernel.graph.model.ElasticBand;
import com.c2kernel.graph.model.GraphModelManager;
import com.c2kernel.graph.model.GraphPoint;
import com.c2kernel.graph.model.GraphableVertex;
-import com.c2kernel.graph.model.Selection;
import com.c2kernel.graph.model.Vertex;
import com.c2kernel.gui.graph.view.EditorModeListener;
+import com.c2kernel.gui.graph.view.GraphPanel;
public class MultiSelectionDragController
extends MouseAdapter
implements EditorModeListener, KeyListener
{
- private class ResizeInf
+
+ private class ResizeInf
{
public int mMousePressedX = 0;
public int mMousePressedY = 0;
@@ -49,6 +49,7 @@ implements EditorModeListener, KeyListener
}
protected GraphModelManager mGraphModelManager = null;
+ private GraphPanel mGraphPanel = null;
/**********/
@@ -97,7 +98,7 @@ implements EditorModeListener, KeyListener
mResizeInf.mMousePressedX = mousePoint.x;
mResizeInf.mMousePressedY = mousePoint.y;
- mResizeInf.mSelectedVertex = mGraphModelManager.getModel().getSelection().mVertices[0];
+ mResizeInf.mSelectedVertex = mGraphPanel.getSelection().mVertices[0];
mResizeInf.mOldOutline = mResizeInf.mSelectedVertex.getOutlinePoints();
centre = mResizeInf.mSelectedVertex.getCentrePoint();
mResizeInf.mCentreX = centre.x;
@@ -192,7 +193,7 @@ implements EditorModeListener, KeyListener
{
Selection selection = new Selection((DirectedEdge)data, null, 0, 0, 0, 0);
- mGraphModelManager.getModel().setSelection(selection);
+ mGraphPanel.setSelection(selection);
}
};
@@ -211,7 +212,7 @@ implements EditorModeListener, KeyListener
centrePoint.x,
centrePoint.y);
- mGraphModelManager.getModel().setSelection(selection);
+ mGraphPanel.setSelection(selection);
mDispForSelection = new DispForSelection();
mDispForSelection.mXDisp = vertexAndDisp.mXDisp;
mDispForSelection.mYDisp = vertexAndDisp.mYDisp;
@@ -236,13 +237,13 @@ implements EditorModeListener, KeyListener
{
Vertex vertex = (Vertex)data;
- if(mGraphModelManager.getModel().inSelection(vertex))
+ if(mGraphPanel.inSelection(vertex))
{
- mGraphModelManager.getModel().removeFromSelection(vertex);
+ mGraphPanel.removeFromSelection(vertex);
}
else
{
- mGraphModelManager.getModel().addToSelection(vertex);
+ mGraphPanel.addToSelection(vertex);
}
}
};
@@ -253,7 +254,7 @@ implements EditorModeListener, KeyListener
@Override
public void doIt(Object data)
{
- mGraphModelManager.getModel().selectAll();
+ mGraphPanel.selectAll();
}
};
@@ -263,9 +264,10 @@ implements EditorModeListener, KeyListener
@Override
public void doIt(Object data)
{
- Point fixedCorner = (Point)data;
+ Point mouse = (Point)data;
+ GraphPoint fixedCorner = new GraphPoint(mouse.x, mouse.y);
- mGraphModelManager.getModel().setElasticBand(new ElasticBand(fixedCorner, fixedCorner));
+ mGraphPanel.setElasticBand(new ElasticBand(fixedCorner, fixedCorner));
}
};
@@ -279,7 +281,7 @@ implements EditorModeListener, KeyListener
int topLeftX = mousePoint.x - mDispForSelection.mXDisp;
int topLeftY = mousePoint.y - mDispForSelection.mYDisp;
if (mGraphModelManager.isEditable()) {
- mGraphModelManager.getModel().moveAbsoluteSelection(topLeftX, topLeftY);
+ mGraphPanel.moveAbsoluteSelection(topLeftX, topLeftY);
}
}
};
@@ -290,7 +292,8 @@ implements EditorModeListener, KeyListener
@Override
public void doIt(Object data)
{
- mGraphModelManager.getModel().resizeElasticBand((Point)data);
+ Point mouse = (Point)data;
+ mGraphPanel.resizeElasticBand(new GraphPoint(mouse.x, mouse.y));
}
};
@@ -300,7 +303,7 @@ implements EditorModeListener, KeyListener
@Override
public void doIt(Object data)
{
- mGraphModelManager.getModel().selectContentsOfElasticBand();
+ mGraphPanel.selectContentsOfElasticBand();
}
};
@@ -344,8 +347,7 @@ implements EditorModeListener, KeyListener
private Integer mState = kWaiting;
-
- /**************************/
+ /**************************/
/* Event processing logic */
/**************************/
@@ -377,11 +379,12 @@ implements EditorModeListener, KeyListener
/* Public interface */
/********************/
- public void setGraphModelManager(GraphModelManager graphModelManager)
- {
- mGraphModelManager = graphModelManager;
- }
+ public MultiSelectionDragController(GraphModelManager graphModelManager,
+ GraphPanel graphPanel) {
+ mGraphModelManager = graphModelManager;
+ mGraphPanel = graphPanel;
+ }
@Override
public void editorModeChanged(String idOfNewMode)
@@ -448,9 +451,9 @@ implements EditorModeListener, KeyListener
}
else if(vertex != null)
{
- if(mGraphModelManager.getModel().inSelection(vertex))
+ if(mGraphPanel.inSelection(vertex))
{
- selection = mGraphModelManager.getModel().getSelection();
+ selection = mGraphPanel.getSelection();
dispForSelection = new DispForSelection();
dispForSelection.mXDisp = mousePoint.x - selection.mTopLeftX;
dispForSelection.mYDisp = mousePoint.y - selection.mTopLeftY;
@@ -486,7 +489,7 @@ implements EditorModeListener, KeyListener
private boolean onResizePad(GraphPoint mouseGPoint)
{
- Selection selection = mGraphModelManager.getModel().getSelection();
+ Selection selection = mGraphPanel.getSelection();
GraphPoint vertexCentre = null;
int bottomRightX = 0;
int bottomRightY = 0;
diff --git a/src/main/java/com/c2kernel/gui/graph/controller/StartVertexController.java b/src/main/java/com/c2kernel/gui/graph/controller/StartVertexController.java
index e973132..41a53b3 100644
--- a/src/main/java/com/c2kernel/gui/graph/controller/StartVertexController.java
+++ b/src/main/java/com/c2kernel/gui/graph/controller/StartVertexController.java
@@ -7,9 +7,9 @@ import java.util.Observer;
import javax.swing.JButton;
-import com.c2kernel.graph.event.SelectionChangedEvent;
import com.c2kernel.graph.model.GraphModelManager;
import com.c2kernel.graph.model.Vertex;
+import com.c2kernel.gui.graph.event.SelectionChangedEvent;
// The start vertex controller is responsible for selecting
@@ -28,6 +28,7 @@ public class StartVertexController implements Observer, ActionListener
{
private GraphModelManager mGraphModelManager = null;
private JButton mStartButton = null;
+ private Vertex selectedVertex = null;
public void setGraphModelManager(GraphModelManager graphModelManager)
@@ -56,13 +57,14 @@ public class StartVertexController implements Observer, ActionListener
event = (SelectionChangedEvent)arg;
selectedVertices = event.mSelection.mVertices;
- if(selectedVertices == null)
+ if(selectedVertices == null || selectedVertices.length != 1)
{
mStartButton.setEnabled(false);
}
else if (mGraphModelManager.isEditable())
{
- mStartButton.setEnabled(selectedVertices.length == 1);
+ mStartButton.setEnabled(true);
+ selectedVertex = selectedVertices[0];
}
}
}
@@ -71,9 +73,9 @@ public class StartVertexController implements Observer, ActionListener
@Override
public void actionPerformed(ActionEvent ae)
{
- if(mGraphModelManager != null)
+ if(selectedVertex != null)
{
- mGraphModelManager.getModel().setSelectedVertexToBeStart();
+ mGraphModelManager.getModel().setStartVertexId(selectedVertex.getID());
}
}
}
diff --git a/src/main/java/com/c2kernel/gui/graph/controller/VertexConstructionController.java b/src/main/java/com/c2kernel/gui/graph/controller/VertexConstructionController.java
index 5d5dd5f..849675e 100644
--- a/src/main/java/com/c2kernel/gui/graph/controller/VertexConstructionController.java
+++ b/src/main/java/com/c2kernel/gui/graph/controller/VertexConstructionController.java
@@ -4,6 +4,7 @@ import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import com.c2kernel.graph.model.GraphModelManager;
+import com.c2kernel.graph.model.GraphPoint;
import com.c2kernel.gui.MainFrame;
import com.c2kernel.gui.graph.view.EditorModeListener;
import com.c2kernel.gui.graph.view.EditorToolBar;
@@ -42,7 +43,7 @@ public class VertexConstructionController extends MouseAdapter implements Editor
if(mCreatingVertices && (mGraphModelManager != null) && (mEditorToolBar != null) && mGraphModelManager.isEditable())
{
try {
- mGraphModelManager.getModel().createVertex(me.getPoint(), mEditorToolBar.getSelectedVertexType());
+ mGraphModelManager.getModel().createVertex(new GraphPoint(me.getPoint().x, me.getPoint().y), mEditorToolBar.getSelectedVertexType());
} catch (Exception e) {
MainFrame.exceptionDialog(e);
}
diff --git a/src/main/java/com/c2kernel/gui/graph/view/EditorPanel.java b/src/main/java/com/c2kernel/gui/graph/view/EditorPanel.java
index 1feb691..a27482d 100644
--- a/src/main/java/com/c2kernel/gui/graph/view/EditorPanel.java
+++ b/src/main/java/com/c2kernel/gui/graph/view/EditorPanel.java
@@ -23,7 +23,7 @@ public class EditorPanel extends JPanel
public GraphPanel mGraphPanel = null;
protected JScrollPane mGraphScrollPane = null;
// Graph Controllers
- protected MultiSelectionDragController mMultiSelectionDragController = new MultiSelectionDragController();
+ protected MultiSelectionDragController mMultiSelectionDragController;
protected VertexConstructionController mVertexConstructionController = new VertexConstructionController();
protected EdgeConstructionController mEdgeConstructionController = new EdgeConstructionController();
protected AutoScrollController mAutoScrollController = new AutoScrollController();
@@ -56,7 +56,7 @@ public class EditorPanel extends JPanel
mGraphModelManager.addObserver(mGraphPanel);
// The multi selection drag controller modifies the graph model
// and listens to the graph panel and editor tool bar
- mMultiSelectionDragController.setGraphModelManager(mGraphModelManager);
+ mMultiSelectionDragController = new MultiSelectionDragController(mGraphModelManager, mGraphPanel);
mGraphPanel.addMouseListener(mMultiSelectionDragController);
mGraphPanel.addMouseMotionListener(mMultiSelectionDragController);
mGraphPanel.addKeyListener(mMultiSelectionDragController);
diff --git a/src/main/java/com/c2kernel/gui/graph/view/EditorToolBar.java b/src/main/java/com/c2kernel/gui/graph/view/EditorToolBar.java
index deeaebb..b60c1ba 100644
--- a/src/main/java/com/c2kernel/gui/graph/view/EditorToolBar.java
+++ b/src/main/java/com/c2kernel/gui/graph/view/EditorToolBar.java
@@ -27,11 +27,11 @@ import javax.swing.JToggleButton;
import com.c2kernel.graph.model.GraphModelManager;
import com.c2kernel.graph.model.TypeNameAndConstructionInfo;
+import com.c2kernel.gui.ImageLoader;
import com.c2kernel.gui.graph.controller.DeletionController;
import com.c2kernel.gui.graph.controller.StartVertexController;
import com.c2kernel.utils.Language;
import com.c2kernel.utils.Logger;
-import com.c2kernel.utils.Resource;
/**
* Tool bar with mode toggle buttons, start and delete buttons, and the possibility to add other arbitrary buttons at constructions time.
*/
@@ -62,15 +62,15 @@ public class EditorToolBar extends Box implements Printable
protected JComboBox mEdgeTypeBox = new JComboBox();
// Mode buttons
protected ButtonGroup mModeButtonGroup = new ButtonGroup();
- protected JToggleButton mVertexModeButton = new JToggleButton(Resource.findImage("graph/newvertex.png"));
- protected JToggleButton mSelectModeButton = new JToggleButton(Resource.findImage("graph/selection.gif"));
- protected JToggleButton mEdgeModeButton = new JToggleButton(Resource.findImage("graph/edge.png"));
+ protected JToggleButton mVertexModeButton = new JToggleButton(ImageLoader.findImage("graph/newvertex.png"));
+ protected JToggleButton mSelectModeButton = new JToggleButton(ImageLoader.findImage("graph/selection.gif"));
+ protected JToggleButton mEdgeModeButton = new JToggleButton(ImageLoader.findImage("graph/edge.png"));
// Normal buttons
protected JButton[] mOtherButtons = null;
- protected JButton mStartButton = new JButton(Resource.findImage("graph/start.png"));
- protected JButton mDeleteButton = new JButton(Resource.findImage("graph/delete.png"));
- protected JButton mPrintButton = new JButton(Resource.findImage("graph/print.png"));
- protected JButton mCopyButton = new JButton(Resource.findImage("graph/copy.png"));
+ protected JButton mStartButton = new JButton(ImageLoader.findImage("graph/start.png"));
+ protected JButton mDeleteButton = new JButton(ImageLoader.findImage("graph/delete.png"));
+ protected JButton mPrintButton = new JButton(ImageLoader.findImage("graph/print.png"));
+ protected JButton mCopyButton = new JButton(ImageLoader.findImage("graph/copy.png"));
// Controllers
protected StartVertexController mStartVertexController = new StartVertexController();
protected DeletionController mDeletionController = new DeletionController();
@@ -309,6 +309,7 @@ public class EditorToolBar extends Box implements Printable
public void setGraphPanel(GraphPanel graphPanel)
{
graphPanel.addKeyListener(mDeletionController);
+ mDeletionController.setGraphPanel(graphPanel);
}
public void addEditorModeListener(EditorModeListener listener)
{
diff --git a/src/main/java/com/c2kernel/gui/graph/view/GraphPanel.java b/src/main/java/com/c2kernel/gui/graph/view/GraphPanel.java
index fa7ed6f..a234d65 100644
--- a/src/main/java/com/c2kernel/gui/graph/view/GraphPanel.java
+++ b/src/main/java/com/c2kernel/gui/graph/view/GraphPanel.java
@@ -6,33 +6,46 @@ import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Paint;
-import java.awt.Point;
+import java.awt.Polygon;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
+import com.c2kernel.gui.graph.event.ElasticBandResizedEvent;
+import com.c2kernel.gui.graph.event.ElasticBandSetEvent;
+import com.c2kernel.gui.graph.event.SelectionMovedEvent;
import java.util.Observable;
import java.util.Observer;
+import java.util.Vector;
import javax.swing.JPanel;
import com.c2kernel.graph.event.EntireModelChangedEvent;
import com.c2kernel.graph.event.GraphModelResizedEvent;
import com.c2kernel.graph.model.DirectedEdge;
-import com.c2kernel.graph.model.ElasticBand;
import com.c2kernel.graph.model.GraphModelManager;
import com.c2kernel.graph.model.GraphPoint;
-import com.c2kernel.graph.model.Selection;
import com.c2kernel.graph.model.Vertex;
-import com.c2kernel.utils.Resource;
+import com.c2kernel.gui.ImageLoader;
+import com.c2kernel.gui.graph.controller.ElasticBand;
+import com.c2kernel.gui.graph.controller.Selection;
+import com.c2kernel.gui.graph.event.SelectionChangedEvent;
public class GraphPanel extends JPanel implements Observer
{
+ // There should always be a Selection object
+ protected Selection mSelection = new Selection(null, null, 0, 0, 0, 0);
+ private ElasticBand mElasticBand = null;
protected final Paint mSelectionPaint = Color.black;
protected final Paint mStartPaint = Color.green;
- protected final Image mResizePadImg = Resource.findImage("graph/resizepad.gif").getImage();
+ protected final Image mResizePadImg = ImageLoader.findImage("graph/resizepad.gif").getImage();
protected final BasicStroke mDashed =
new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, new float[] { 5.0f }, 0.0f);
protected GraphModelManager mGraphModelManager = null;
protected VertexRenderer mVertexRenderer = null;
protected DirectedEdgeRenderer mDirectedEdgeRenderer = null;
+ private final SelectionChangedEvent mSelectionChangedEvent = new SelectionChangedEvent();
+ private final SelectionMovedEvent mSelectionMovedEvent = new SelectionMovedEvent();
+ private final ElasticBandResizedEvent mElasticBandResizedEvent = new ElasticBandResizedEvent();
+ private final ElasticBandSetEvent mElasticBandSetEvent = new ElasticBandSetEvent();
+
public GraphPanel(DirectedEdgeRenderer eRenderer, VertexRenderer vRenderer)
{
mVertexRenderer = vRenderer;
@@ -55,6 +68,10 @@ public class GraphPanel extends JPanel implements Observer
@Override
public void update(Observable o, Object arg)
{
+ if (arg instanceof EntireModelChangedEvent)
+ {
+ mSelection = new Selection(null, null, 0, 0, 0, 0);
+ }
if (arg instanceof GraphModelResizedEvent || arg instanceof EntireModelChangedEvent)
{
setPreferredSize(new Dimension(mGraphModelManager.getModel().getWidth(), mGraphModelManager.getModel().getHeight()));
@@ -62,6 +79,282 @@ public class GraphPanel extends JPanel implements Observer
}
repaint();
}
+ // Updates the top left and bottom right corners of the selection
+ private void updateSelectionCorners() {
+ Vertex vertex = mSelection.mVertices[0];
+ GraphPoint centrePoint = vertex.getCentrePoint();
+ if (centrePoint == null) return;
+ mSelection.mTopLeftX = centrePoint.x;
+ mSelection.mTopLeftY = centrePoint.y;
+ mSelection.mBottomRightX = centrePoint.x;
+ mSelection.mBottomRightY = centrePoint.y;
+ for (Vertex mVertice : mSelection.mVertices) {
+ vertex = mVertice;
+ centrePoint = vertex.getCentrePoint();
+ if (centrePoint.x < mSelection.mTopLeftX) {
+ mSelection.mTopLeftX = centrePoint.x;
+ }
+ if (centrePoint.y < mSelection.mTopLeftY) {
+ mSelection.mTopLeftY = centrePoint.y;
+ }
+ if (centrePoint.x > mSelection.mBottomRightX) {
+ mSelection.mBottomRightX = centrePoint.x;
+ }
+ if (centrePoint.y > mSelection.mBottomRightY) {
+ mSelection.mBottomRightY = centrePoint.y;
+ }
+ }
+ }
+
+ public void deleteSelection() {
+ int i = 0;
+ if (mSelection.mVertices != null) {
+ for (i = 0; i < mSelection.mVertices.length; i++) {
+ mGraphModelManager.getModel().removeVertex(mSelection.mVertices[i]);
+ }
+ }
+ else if (mSelection.mEdge != null) {
+ mGraphModelManager.getModel().removeEdge(mSelection.mEdge);
+ }
+ // Make sure nothing is selected
+ if ((mSelection.mEdge != null) || (mSelection.mVertices != null)) {
+ mSelection.mEdge = null;
+ mSelection.mVertices = null;
+ mSelectionChangedEvent.mSelection = mSelection;
+ mGraphModelManager.notifyObservers(mSelectionChangedEvent);
+ }
+ }
+
+ public void selectAll() {
+ Vertex[] allVertices = mGraphModelManager.getModel().getVertices();
+ if (allVertices.length > 0) {
+ mSelection.mEdge = null;
+ mSelection.mVertices = allVertices;
+ updateSelectionCorners();
+ mSelectionChangedEvent.mSelection = mSelection;
+ mGraphModelManager.notifyObservers(mSelectionChangedEvent);
+ }
+ }
+
+ public void selectContentsOfElasticBand() {
+ if (mElasticBand == null) return;
+ Polygon bandPolygon = new Polygon();
+ Vertex[] allVertices = mGraphModelManager.getModel().getVertices();
+ GraphPoint centrePoint = null;
+ Vector<Vertex> verticesInside = new Vector<Vertex>(10, 10);
+ int i = 0;
+ // Create a polygon representing the elastic band
+ bandPolygon.addPoint(mElasticBand.mFixedCorner.x, mElasticBand.mFixedCorner.y);
+ bandPolygon.addPoint(mElasticBand.mMovingCorner.x, mElasticBand.mFixedCorner.y);
+ bandPolygon.addPoint(mElasticBand.mMovingCorner.x, mElasticBand.mMovingCorner.y);
+ bandPolygon.addPoint(mElasticBand.mFixedCorner.x, mElasticBand.mMovingCorner.y);
+ // Create a vector of all of the vertices within the elastic band polygon
+ for (i = 0; i < allVertices.length; i++) {
+ centrePoint = allVertices[i].getCentrePoint();
+ if (bandPolygon.contains(centrePoint.x, centrePoint.y)) {
+ verticesInside.add(allVertices[i]);
+ }
+ }
+
+ // Select the vertices found within the elastic band polygon
+ if (verticesInside.size() == 0) {
+ mSelection.mTopLeftX = 0;
+ mSelection.mTopLeftY = 0;
+ mSelection.mBottomRightX = 0;
+ mSelection.mBottomRightY = 0;
+ mSelection.mEdge = null;
+ // select parent vertex if we have selected the 'paper'
+ if (mGraphModelManager.getModel().getContainingVertex() != null)
+ verticesInside.add(mGraphModelManager.getModel().getContainingVertex());
+ else
+ mSelection.mVertices = null;
+ }
+
+ if (verticesInside.size() > 0) {
+ mSelection.mEdge = null;
+ mSelection.mVertices = new Vertex[verticesInside.size()];
+ for (i = 0; i < verticesInside.size(); i++) {
+ mSelection.mVertices[i] = verticesInside.elementAt(i);
+ }
+ updateSelectionCorners();
+ }
+ // Remove the elastic band
+ mElasticBand = null;
+ mSelectionChangedEvent.mSelection = mSelection;
+ mGraphModelManager.notifyObservers(mSelectionChangedEvent);
+ }
+
+
+
+ public void setSelectedVertexToBeStart() {
+ if (mSelection.mVertices != null) {
+ if (mSelection.mVertices.length == 1) {
+ mGraphModelManager.getModel().setStartVertexId(mSelection.mVertices[0].getID());
+ }
+ }
+ }
+
+ public Selection getSelection() {
+ return mSelection;
+ }
+
+ public void setElasticBand(ElasticBand elasticBand) {
+ mElasticBand = elasticBand;
+ mGraphModelManager.notifyObservers(mElasticBandSetEvent);
+ }
+
+ public void resizeElasticBand(GraphPoint movingCorner) {
+ mElasticBand.mMovingCorner = movingCorner;
+ mGraphModelManager.notifyObservers(mElasticBandResizedEvent);
+ }
+
+ public boolean inSelection(Vertex v) {
+ int i = 0;
+ if (mSelection.mVertices == null) {
+ return false;
+ }
+ else {
+ for (i = 0; i < mSelection.mVertices.length; i++) {
+ if (mSelection.mVertices[i] == v) {
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+
+ // Only use this method to remove one vertex.
+ // If you wish to remove more, it would
+ // propably be more efficient to create a
+ // new Selection object.
+ public void removeFromSelection(Vertex v) {
+ Vertex[] vertices = null;
+ int i = 0;
+ int j = 0;
+ if (mSelection.mVertices.length == 1) {
+ mSelection.mVertices = null;
+ mSelection.mTopLeftX = 0;
+ mSelection.mTopLeftY = 0;
+ mSelection.mBottomRightX = 0;
+ mSelection.mBottomRightY = 0;
+ }
+ else {
+ vertices = new Vertex[mSelection.mVertices.length - 1];
+ for (i = 0; i < mSelection.mVertices.length; i++) {
+ if (mSelection.mVertices[i] != v) {
+ vertices[j] = mSelection.mVertices[i];
+ j++;
+ }
+ }
+ mSelection.mVertices = vertices;
+ updateSelectionCorners();
+ }
+ mGraphModelManager.notifyObservers(mSelectionChangedEvent);
+ }
+
+ // Only use this method to add one vertex.
+ // If you wish to add more, it would
+ // propably be more efficient to create a
+ // new Selection object.
+ public void addToSelection(Vertex v) {
+ Vertex[] vertices = new Vertex[mSelection.mVertices.length + 1];
+ GraphPoint centrePoint = null;
+ int i = 0;
+ if (mSelection.mVertices == null) {
+ centrePoint = v.getCentrePoint();
+ mSelection.mVertices = new Vertex[] { v };
+ mSelection.mTopLeftX = centrePoint.x;
+ mSelection.mTopLeftY = centrePoint.y;
+ mSelection.mBottomRightX = centrePoint.x;
+ mSelection.mBottomRightY = centrePoint.y;
+ }
+ else {
+ for (i = 0; i < mSelection.mVertices.length; i++) {
+ vertices[i] = mSelection.mVertices[i];
+ }
+ vertices[mSelection.mVertices.length] = v;
+ mSelection.mVertices = vertices;
+ updateSelectionCorners();
+ }
+ mGraphModelManager.notifyObservers(mSelectionChangedEvent);
+ }
+ public void moveAbsoluteSelection(int newTopLeftX, int newTopLeftY) {
+ int selectionHeight = mSelection.mBottomRightY - mSelection.mTopLeftY;
+ int selectionWidth = mSelection.mBottomRightX - mSelection.mTopLeftX;
+ int bottomRightX = newTopLeftX + selectionWidth;
+ int bottomRightY = newTopLeftY + selectionHeight;
+ GraphPoint oldCentrePoint = null;
+ GraphPoint newCentrePoint = null;
+ int distXFromTopLeft = 0;
+ int distYFromTopLeft = 0;
+ int i = 0;
+ // Make sure the selection does not move
+ // outside the boundaries of the graph
+ if (newTopLeftX < 0) newTopLeftX = 0;
+ if (newTopLeftY < 0) newTopLeftY = 0;
+ int graphWidth = mGraphModelManager.getModel().getWidth();
+ if (bottomRightX > graphWidth) newTopLeftX = graphWidth - selectionWidth;
+ int graphHeight = mGraphModelManager.getModel().getHeight();
+ if (bottomRightY > graphHeight) newTopLeftY = graphHeight - selectionHeight;
+ // For each selected vertex
+ for (i = 0; i < mSelection.mVertices.length; i++) {
+ // Calculate the new centre point of the vertex.
+ // First calculate the distance of the centre point
+ // from the old top left hand corner of the selection,
+ // then move the point to the new top left hand
+ // corner plus the distance.
+ oldCentrePoint = mSelection.mVertices[i].getCentrePoint();
+ distXFromTopLeft = oldCentrePoint.x - mSelection.mTopLeftX;
+ distYFromTopLeft = oldCentrePoint.y - mSelection.mTopLeftY;
+ newCentrePoint = new GraphPoint(newTopLeftX + distXFromTopLeft, newTopLeftY + distYFromTopLeft);
+ mGraphModelManager.getModel().moveAbsoluteVertex(mSelection.mVertices[i], newCentrePoint);
+ }
+ // Update the top left and bottom right corners
+ mSelection.mTopLeftX = newTopLeftX;
+ mSelection.mTopLeftY = newTopLeftY;
+ mSelection.mBottomRightX = newTopLeftX + selectionWidth;
+ mSelection.mBottomRightY = newTopLeftY + selectionHeight;
+ mGraphModelManager.notifyObservers(mSelectionMovedEvent);
+ }
+ public void setSelection(Selection s) {
+ // If the there is a change
+ if (selectionChanged(s)) {
+ mSelection = s;
+ mSelectionChangedEvent.mSelection = s;
+ mGraphModelManager.notifyObservers(mSelectionChangedEvent);
+ }
+ }
+
+ private boolean selectionChanged(Selection newValue) {
+ int i = 0;
+ if (mSelection.mEdge != newValue.mEdge) {
+ return true;
+ }
+ if (mSelection.mVertices == null) {
+ if (newValue.mVertices == null) {
+ return false;
+ }
+ else {
+ return true;
+ }
+ }
+ else {
+ if (newValue.mVertices == null) {
+ return true;
+ }
+ else {
+ if (mSelection.mVertices.length != newValue.mVertices.length) {
+ return true;
+ }
+ for (i = 0; i < mSelection.mVertices.length; i++) {
+ if (mSelection.mVertices[i] != newValue.mVertices[i]) {
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+ }
@Override
public void paintComponent(Graphics g)
{
@@ -69,11 +362,9 @@ public class GraphPanel extends JPanel implements Observer
DirectedEdge[] edges = null;
Vertex[] vertices = null;
Vertex startVertex = null;
- Selection selection = null;
- ElasticBand elasticBand = null;
Vertex newEdgeOriginVertex = null;
GraphPoint newEdgeOriginPoint = null;
- Point newEdgeEndPoint = null;
+ GraphPoint newEdgeEndPoint = null;
GraphPoint vertexCentre = null;
int i = 0;
super.paintComponent(g);
@@ -100,63 +391,59 @@ public class GraphPanel extends JPanel implements Observer
{
drawVertexHighlight(g2d, startVertex, 1);
}
- // Get the present selection
- selection = mGraphModelManager.getModel().getSelection();
g2d.setPaint(mSelectionPaint);
// Draw the outline of the selected
// vertices if there are any
- if (selection.mVertices != null)
+ if (mSelection.mVertices != null)
{
g2d.setStroke(mDashed);
- for (i = 0; i < selection.mVertices.length; i++)
+ for (i = 0; i < mSelection.mVertices.length; i++)
{
- if (selection.mVertices[i] != mGraphModelManager.getModel().getContainingVertex())
- drawVertexHighlight(g2d, selection.mVertices[i], 5);
+ if (mSelection.mVertices[i] != mGraphModelManager.getModel().getContainingVertex())
+ drawVertexHighlight(g2d, mSelection.mVertices[i], 5);
}
// Draw the resize pads if there is one and only one vertex selected
- if (selection.mVertices.length == 1 &&
- selection.mVertices[0] != mGraphModelManager.getModel().getContainingVertex())
+ if (mSelection.mVertices.length == 1 &&
+ mSelection.mVertices[0] != mGraphModelManager.getModel().getContainingVertex())
{
- vertexCentre = selection.mVertices[0].getCentrePoint();
+ vertexCentre = mSelection.mVertices[0].getCentrePoint();
g2d.drawImage(
mResizePadImg,
- vertexCentre.x + selection.mVertices[0].getWidth() / 2,
- vertexCentre.y + selection.mVertices[0].getHeight() / 2,
+ vertexCentre.x + mSelection.mVertices[0].getWidth() / 2,
+ vertexCentre.y + mSelection.mVertices[0].getHeight() / 2,
this);
}
}
// Draw the outline of the selected
// edge if there is one
- if (selection.mEdge != null)
+ if (mSelection.mEdge != null)
{
- drawEdgeHighlight(g2d, selection.mEdge);
+ drawEdgeHighlight(g2d, mSelection.mEdge);
}
- // Get the elastic band
- elasticBand = mGraphModelManager.getModel().getElasticBand();
// Draw the elastic band if there
// is one
- if (elasticBand != null)
+ if (mElasticBand != null)
{
g2d.drawLine(
- elasticBand.mFixedCorner.x,
- elasticBand.mFixedCorner.y,
- elasticBand.mMovingCorner.x,
- elasticBand.mFixedCorner.y);
+ mElasticBand.mFixedCorner.x,
+ mElasticBand.mFixedCorner.y,
+ mElasticBand.mMovingCorner.x,
+ mElasticBand.mFixedCorner.y);
g2d.drawLine(
- elasticBand.mMovingCorner.x,
- elasticBand.mFixedCorner.y,
- elasticBand.mMovingCorner.x,
- elasticBand.mMovingCorner.y);
+ mElasticBand.mMovingCorner.x,
+ mElasticBand.mFixedCorner.y,
+ mElasticBand.mMovingCorner.x,
+ mElasticBand.mMovingCorner.y);
g2d.drawLine(
- elasticBand.mMovingCorner.x,
- elasticBand.mMovingCorner.y,
- elasticBand.mFixedCorner.x,
- elasticBand.mMovingCorner.y);
+ mElasticBand.mMovingCorner.x,
+ mElasticBand.mMovingCorner.y,
+ mElasticBand.mFixedCorner.x,
+ mElasticBand.mMovingCorner.y);
g2d.drawLine(
- elasticBand.mFixedCorner.x,
- elasticBand.mMovingCorner.y,
- elasticBand.mFixedCorner.x,
- elasticBand.mFixedCorner.y);
+ mElasticBand.mFixedCorner.x,
+ mElasticBand.mMovingCorner.y,
+ mElasticBand.mFixedCorner.x,
+ mElasticBand.mFixedCorner.y);
}
// Draw the new edge under construction if there is one
newEdgeEndPoint = mGraphModelManager.getModel().getNewEdgeEndPoint();
diff --git a/src/main/java/com/c2kernel/gui/graph/view/VertexPropertyPanel.java b/src/main/java/com/c2kernel/gui/graph/view/VertexPropertyPanel.java
index 4f250a8..121d0c1 100644
--- a/src/main/java/com/c2kernel/gui/graph/view/VertexPropertyPanel.java
+++ b/src/main/java/com/c2kernel/gui/graph/view/VertexPropertyPanel.java
@@ -22,13 +22,13 @@ import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import com.c2kernel.graph.event.EntireModelChangedEvent;
-import com.c2kernel.graph.event.SelectionChangedEvent;
import com.c2kernel.graph.model.DirectedEdge;
import com.c2kernel.graph.model.GraphModelManager;
import com.c2kernel.graph.model.GraphableEdge;
import com.c2kernel.graph.model.GraphableVertex;
import com.c2kernel.graph.model.Vertex;
import com.c2kernel.gui.MainFrame;
+import com.c2kernel.gui.graph.event.SelectionChangedEvent;
import com.c2kernel.gui.tabs.EntityTabPane;
import com.c2kernel.utils.Language;