diff --git a/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/EImageEditorMouseClickMode.java b/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/EImageEditorMouseClickMode.java new file mode 100644 index 0000000000000000000000000000000000000000..9a41c525028b0b58cd1f2d24a43bc5e3f9d953c6 --- /dev/null +++ b/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/EImageEditorMouseClickMode.java @@ -0,0 +1,5 @@ +package de.uniwue.mk.img.editor.widget; + +public enum EImageEditorMouseClickMode {FreeDrawingMode,PolygonResizingOrMovingMode,Regular_Mode; + +} diff --git a/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/EImageEditorMouseMoveState.java b/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/EImageEditorMouseMoveState.java new file mode 100644 index 0000000000000000000000000000000000000000..c933a1453a0ba951d186d1110272985833320c92 --- /dev/null +++ b/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/EImageEditorMouseMoveState.java @@ -0,0 +1,5 @@ +package de.uniwue.mk.img.editor.widget; + +public enum EImageEditorMouseMoveState {STATE_UPDATE_MOUSE_SELECTION, STATE_MOVE_FREEDRAWING_POINT, REGULAR; + +} diff --git a/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/EImageEditorState.java b/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/EImageEditorState.java deleted file mode 100644 index 3a811d33416f718941c27a3c492381b95568f5af..0000000000000000000000000000000000000000 --- a/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/EImageEditorState.java +++ /dev/null @@ -1,5 +0,0 @@ -package de.uniwue.mk.img.editor.widget; - -public enum EImageEditorState {STATE_UPDATE_MOUSE_SELECTION, STATE_MOVE_POLYGON_POINT; - -} diff --git a/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/ImageEditorMouseListener.java b/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/ImageEditorMouseListener.java index b58259fea002de4150e69a0b89dcdb2bf4dd6143..dc0c740c79628c866cf597defbc9d842bd7ffda6 100644 --- a/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/ImageEditorMouseListener.java +++ b/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/ImageEditorMouseListener.java @@ -17,8 +17,8 @@ public class ImageEditorMouseListener implements MouseListener { ImageEditorWidget editor = (ImageEditorWidget) e.getSource(); // update the in in polygonMode - if (!editor.isInPolygonDrawingMode) { - editor.isInPolygonDrawingMode = true; + if (!editor.isInFreeDrawingMode) { + editor.isInFreeDrawingMode = true; if (editor.freeDrawingPoints.size() == 0) { editor.freeDrawingPoints.add(editor.revertTransformForPoint(new Point(e.x, e.y))); } @@ -34,43 +34,44 @@ public class ImageEditorMouseListener implements MouseListener { ImageEditorWidget editor = (ImageEditorWidget) e.getSource(); if (e.button == ImageEditorWidget.LEFT_BUTTON) { - editor.mouseDownPressed = true; - // java.awt.Point location = - // MouseInfo.getPointerInfo().getLocation(); + // update the state + editor.mouseDownPressed = true; // save the point in the actual original image editor.pointMouseDown = editor.revertTransformForPoint(new Point(e.x, e.y)); - if (editor.isInPolygonDrawingMode) { + EImageEditorMouseClickMode editorMouseMode = editor.determineMouseClickState(); + if (editorMouseMode == EImageEditorMouseClickMode.FreeDrawingMode) { editor.freeDrawingPoints.add(editor.pointMouseDown); - } - // now check if we closed a polygon - if (editor.freeDrawingPoints.size() > 2 && editor.isInPolygonDrawingMode) { - if (SWT2Dutil.pointOverlaps(editor.freeDrawingPoints.get(0), - editor.freeDrawingPoints.get(editor.freeDrawingPoints.size() - 1), - ImageEditorWidget.POINTS_SELECTION_RADIUS)) { - editor.isInPolygonDrawingMode = false; - editor.freeDrawingPoints.remove(editor.freeDrawingPoints.size() - 1); - editor.freeDrawingPoints.add(editor.freeDrawingPoints.get(0)); - - // open a dialog!! TODO - editor.polygonMap.put("Test", new EditorPolygon( - SWT2Dutil.polygonDrawingPointsToPointArray(editor.freeDrawingPoints), null)); + // now check if we closed a polygon + if (editor.freeDrawingPoints.size() > 2) { + if (SWT2Dutil.pointOverlaps(editor.freeDrawingPoints.get(0), + editor.freeDrawingPoints.get(editor.freeDrawingPoints.size() - 1), + ImageEditorWidget.POINTS_SELECTION_RADIUS)) { + editor.isInFreeDrawingMode = false; + editor.freeDrawingPoints.remove(editor.freeDrawingPoints.size() - 1); + editor.freeDrawingPoints.add(editor.freeDrawingPoints.get(0)); + + // open a dialog!! TODO + editor.polygonMap.put("Test", new EditorPolygon( + SWT2Dutil.polygonDrawingPointsToPointArray(editor.freeDrawingPoints), null)); + } } } - // if we are not in a mousedrawingmode we check if we can + // if we are in the regular mode we just update the selection // update our selection - if (!editor.isInPolygonDrawingMode && !editor.inPolygonMovingOrResizingMode) { + if (editorMouseMode==EImageEditorMouseClickMode.Regular_Mode) { updateSelection(e, editor); } } if (e.button == ImageEditorWidget.RIGHT_BUTTON) { // we leave the polygon drawing mode - editor.isInPolygonDrawingMode = false; - editor.freeDrawingCurrentPoint = null; + editor.isInFreeDrawingMode = false; + + //clear the freedrawing mode selection if (editor.freeDrawingPointCurrentlyHovered != null && !editor.mouseDownPressed) { // delete it all editor.freeDrawingPoints.clear(); @@ -92,7 +93,7 @@ public class ImageEditorMouseListener implements MouseListener { editor.mouseDownPressed = false; // we need to update the selected polygonarrays - //aka end of a polygon seleced shift + // aka end of a polygon seleced shift editor.pointArraysCurrentlyHovered.clear(); for (EditorPolygon pol : editor.getSelectedEditorPolygons()) { editor.pointArraysCurrentlyHovered.add(pol.getPointArray()); @@ -116,6 +117,8 @@ public class ImageEditorMouseListener implements MouseListener { editor.selectedEditorPolygons.add(polygon); editor.pointArraysCurrentlyHovered.add(polygon.getPointArray()); } + + //TODO remove from selection again if it is already contained } } diff --git a/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/ImageEditorMouseMoveListener.java b/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/ImageEditorMouseMoveListener.java index fcbc5767b20f1c1a48ffd9a4975b70dbc0b678de..11624f578899d12a9d06185f26614cffb9cc99dd 100644 --- a/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/ImageEditorMouseMoveListener.java +++ b/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/ImageEditorMouseMoveListener.java @@ -1,5 +1,6 @@ package de.uniwue.mk.img.editor.widget; +import java.util.Collection; import java.util.List; import org.eclipse.swt.events.MouseEvent; @@ -24,41 +25,71 @@ public class ImageEditorMouseMoveListener implements MouseMoveListener { // we reset the cursor no matter what editor.setCursor(ImageEditorWidget.cursorStandard); - Point inOriginialImage = editor.revertTransformForPoint(new Point(e.x, e.y)); - - // need for centerig the zoom around a given point + // update the current mouselocation editor.currentMouseLocation = editor.revertTransformForPoint(new Point(e.x, e.y)); - if (editor.determineEditorState() == EImageEditorState.STATE_UPDATE_MOUSE_SELECTION) { + //update all elements that are currently hovered + updateHoveredElements(editor); + + EImageEditorMouseMoveState editorMouseMoveState = editor.determineEditorMouseMoveState(); + if (editorMouseMoveState == EImageEditorMouseMoveState.STATE_UPDATE_MOUSE_SELECTION) { updateMouseSelectionPolygon(e, editor); } + + if(editorMouseMoveState==EImageEditorMouseMoveState.STATE_MOVE_FREEDRAWING_POINT){ + // we allow its coordinates to change + editor.freeDrawingPointCurrentlyHovered.x = editor.currentMouseLocation.x; + editor.freeDrawingPointCurrentlyHovered.y = editor.currentMouseLocation.y; + } + + + +// // if we want to draw +// if (!editor.mouseDownPressed && editor.isInFreeDrawingMode) { +// // check if we are hovering over the start point +// editor.setCursor(ImageEditorWidget.cursorHand); +// // we add a point +// +// } +// if (!editor.isInFreeDrawingMode && !editor.freeDrawingPoints.isEmpty()) { +// updateCurrentPolygonMouseSelectionPoint(e, editor); +// +// } +// +// if (editor.selectedEditorPolygons.size() != 0 && !editor.isInFreeDrawingMode) { +// // check if we are hovering a polygon +// editor.inPolygonMovingOrResizingMode = false; +// moveOrResize(e, editor); +// } - // if we want to draw - if (!editor.mouseDownPressed && editor.isInPolygonDrawingMode) { - // check if we are hovering over the start point - editor.setCursor(ImageEditorWidget.cursorHand); - // we add a point - editor.freeDrawingCurrentPoint = inOriginialImage; + editor.invokeReload(); + } - } - if (!editor.isInPolygonDrawingMode && !editor.freeDrawingPoints.isEmpty()) { - updateCurrentPolygonMouseSelectionPoint(e, editor); + private void updateHoveredElements(ImageEditorWidget editor) { - } + // hovered elements are either annotations + // TODO - if (editor.determineEditorState() == EImageEditorState.STATE_MOVE_POLYGON_POINT) { - // we allow its coordinates to change - editor.freeDrawingPointCurrentlyHovered.x = inOriginialImage.x; - editor.freeDrawingPointCurrentlyHovered.y = inOriginialImage.y; + // or points of the free drawing mode + editor.hoveredFreeDrawingPoints.clear(); + List<Point> freeDrawingPoints = editor.freeDrawingPoints; + + for (Point p : freeDrawingPoints) { + if (SWT2Dutil.pointOverlaps(editor.currentMouseLocation, p, ImageEditorWidget.POINTS_SELECTION_RADIUS)) { + editor.hoveredFreeDrawingPoints.add(p); + } } - if (editor.selectedEditorPolygons.size() != 0 && !editor.isInPolygonDrawingMode) { - // check if we are hovering a polygon - editor.inPolygonMovingOrResizingMode = false; - moveOrResize(e, editor); + // or polygons of the editor + editor.hoveredEditorPolygons.clear(); + Collection<EditorPolygon> values = editor.polygonMap.values(); + + for (EditorPolygon pol : values) { + if (pol.contains(editor.currentMouseLocation)) { + editor.hoveredEditorPolygons.add(pol); + } } - editor.invokeReload(); } protected void moveOrResize(MouseEvent e, ImageEditorWidget editor) { @@ -77,10 +108,9 @@ public class ImageEditorMouseMoveListener implements MouseMoveListener { boolean inEdgeResizeMode = determineIfInEdgeResizeMode(actualinOrigin.x, actualinOrigin.y, poly); boolean inNodeResizeMode = determineIfInNodeResizeMode(actualinOrigin.x, actualinOrigin.y, poly); boolean inResize = (inEdgeResizeMode || inNodeResizeMode); - editor.isInResize = inResize; - if (inResize && editor.getSelectedEditorPolygons().size()==1) { + if (inResize && editor.getSelectedEditorPolygons().size() == 1) { - resizePolygon(inEdgeResizeMode, inNodeResizeMode,editor,actualinOrigin); + resizePolygon(inEdgeResizeMode, inNodeResizeMode, editor, actualinOrigin); } // we are in the translation mode and shift the // whole @@ -114,7 +144,8 @@ public class ImageEditorMouseMoveListener implements MouseMoveListener { } } - private void resizePolygon(boolean inEdgeResizeMode, boolean inNodeResizeMode,ImageEditorWidget editor, Point actualinOrigin) { + private void resizePolygon(boolean inEdgeResizeMode, boolean inNodeResizeMode, ImageEditorWidget editor, + Point actualinOrigin) { if (inEdgeResizeMode) { // find the according edge (consisting of 2 points and shift // them @@ -122,17 +153,17 @@ public class ImageEditorMouseMoveListener implements MouseMoveListener { else if (inNodeResizeMode && editor.mouseDownPressed) { // translate the node - if(editor.getSelectedEditorPolygons().get(0).getPointArray().length==8){ - //sepcial case for a rectangle + if (editor.getSelectedEditorPolygons().get(0).getPointArray().length == 8) { + // sepcial case for a rectangle editor.setCursor(ImageEditorWidget.cursorResizeNE); - } - else{ - + } else { + editor.setCursor(ImageEditorWidget.cursorHand); selectedResizeNode = actualinOrigin; - //also set the new polygon points - editor.getSelectedEditorPolygons().get(0).setPointArray(SWT2Dutil.pointsToPointArray(selectedPointArrayList)); - + // also set the new polygon points + editor.getSelectedEditorPolygons().get(0) + .setPointArray(SWT2Dutil.pointsToPointArray(selectedPointArrayList)); + } } } @@ -177,14 +208,14 @@ public class ImageEditorMouseMoveListener implements MouseMoveListener { } protected void updateMouseSelectionPolygon(MouseEvent e, ImageEditorWidget editor) { - editor.pointMouseCurrently = editor.revertTransformForPoint(new Point(e.x, e.y)); + editor.currentMouseLocation = editor.revertTransformForPoint(new Point(e.x, e.y)); // update the mouse selection polygon - int xLeft = Math.min(editor.pointMouseCurrently.x, editor.pointMouseDown.x); - int xRight = xLeft + Math.abs(editor.pointMouseCurrently.x - editor.pointMouseDown.x); + int xLeft = Math.min(editor.currentMouseLocation.x, editor.pointMouseDown.x); + int xRight = xLeft + Math.abs(editor.currentMouseLocation.x - editor.pointMouseDown.x); - int yTop = Math.min(editor.pointMouseCurrently.y, editor.pointMouseDown.y); - int yBottom = Math.max(editor.pointMouseCurrently.y, editor.pointMouseDown.y); + int yTop = Math.min(editor.currentMouseLocation.y, editor.pointMouseDown.y); + int yBottom = Math.max(editor.currentMouseLocation.y, editor.pointMouseDown.y); int[] pointArray = new int[] { xLeft, yTop, xRight, yTop, xRight, yBottom, xLeft, yBottom }; diff --git a/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/ImageEditorWidget.java b/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/ImageEditorWidget.java index 2e2859d0a9b98a72f8b0c59ab4f1084b2d3c472a..b391247b857f51e65f9384976760ebf023c17f36 100644 --- a/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/ImageEditorWidget.java +++ b/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/ImageEditorWidget.java @@ -72,22 +72,26 @@ public class ImageEditorWidget extends Canvas { private ImageEditorInput editorInput; private CAS openedCasView; - //the transform that stores all scaling and translation of the current image + // the transform that stores all scaling and translation of the current + // image private AffineTransform transform = new AffineTransform(); // UI Elements // the original image - never changed for the lifespan of its input! private Image originalImage; - protected List<Point> freeDrawingPoints; - protected Point freeDrawingCurrentPoint; protected Point freeDrawingPointCurrentlyHovered; - protected Point currentMouseLocation; + + // the hovered selections + protected List<Point> hoveredFreeDrawingPoints; + protected List<FeatureStructure> hoveredAnnotations; + protected List<EditorPolygon> hoveredEditorPolygons; + // point where mouse was clicked last time (LMB) protected Point pointMouseDown; // current position of the mouse - protected Point pointMouseCurrently; + protected Point currentMouseLocation; // stuff required for the logical behaviour protected List<EditorPolygon> selectedEditorPolygons; @@ -101,19 +105,15 @@ public class ImageEditorWidget extends Canvas { // mouselistener specific - - // those booleans define the logical behaviour in the editor - protected boolean isInPolygonDrawingMode = false; + protected boolean isInFreeDrawingMode = false; protected boolean mouseDownPressed = false; protected boolean inPolygonMovingOrResizingMode; - protected boolean isInResize; private ImageEditorKeyListener keyListener; private MouseListener mouseListener; private MouseMoveListener mouseMoveListener; private MouseWheelListener mouseWheelListener; private ImageEditorWidgetPaintListener paintListener; - // ====================STRUCT================ public ImageEditorWidget(Composite parent, int style) { @@ -222,20 +222,6 @@ public class ImageEditorWidget extends Canvas { } - protected EImageEditorState determineEditorState() { - - if (mouseDownPressed && freeDrawingPointCurrentlyHovered == null && !inPolygonMovingOrResizingMode) { - return EImageEditorState.STATE_UPDATE_MOUSE_SELECTION; - } - - else if (mouseDownPressed && freeDrawingPointCurrentlyHovered != null && !isInPolygonDrawingMode) { - return EImageEditorState.STATE_MOVE_POLYGON_POINT; - } - return null; - } - - - private void removeFormerListener() { if (keyListener != null) { this.removeKeyListener(keyListener); @@ -283,8 +269,6 @@ public class ImageEditorWidget extends Canvas { polygonMap.remove(key); } - - /* Initalize the scrollbar and register listeners. */ protected void initScrollBars() { ScrollBar horizontal = getHorizontalBar(); @@ -328,7 +312,7 @@ public class ImageEditorWidget extends Canvas { transform = af; syncScrollBars(); } - + /** * Synchronize the scrollbar with the image. If the transform is out of * range, it will correct it. This function considers only following factors @@ -416,6 +400,12 @@ public class ImageEditorWidget extends Canvas { selectedEditorPolygons = new ArrayList<>(); pointArraysCurrentlyHovered = new LinkedList<>(); + // init the currently hovered list + hoveredFreeDrawingPoints = new LinkedList<>(); + hoveredAnnotations = new LinkedList<>(); + hoveredEditorPolygons = new LinkedList<>(); + + // refresh the view invokeReload(); } @@ -478,12 +468,11 @@ public class ImageEditorWidget extends Canvas { } } - + public CAS getCas() { return this.editorInput.getCas(); } - // ===============END LISTENER SPECIFIC=========================== // =============UTILITY (if not already in util======================= @@ -504,4 +493,25 @@ public class ImageEditorWidget extends Canvas { return this.transform; } + // handle the logic of the editor here!! + public EImageEditorMouseClickMode determineMouseClickState() { + + if (isInFreeDrawingMode) + return EImageEditorMouseClickMode.FreeDrawingMode; + return EImageEditorMouseClickMode.Regular_Mode; + } + + protected EImageEditorMouseMoveState determineEditorMouseMoveState() { + + if (mouseDownPressed && freeDrawingPointCurrentlyHovered == null + && determineMouseClickState() == EImageEditorMouseClickMode.Regular_Mode) { + return EImageEditorMouseMoveState.STATE_UPDATE_MOUSE_SELECTION; + } + + else if (mouseDownPressed && freeDrawingPointCurrentlyHovered != null && !isInFreeDrawingMode) { + return EImageEditorMouseMoveState.STATE_MOVE_FREEDRAWING_POINT; + } + return null; + } + } diff --git a/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/ImageEditorWidgetPaintListener.java b/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/ImageEditorWidgetPaintListener.java index 0137336005dc53a8e9f6c6a6c9c743e75157eb1a..3e9dd2c6e200962e5fb9f20dd94c62696bcbe732 100644 --- a/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/ImageEditorWidgetPaintListener.java +++ b/de.uniwue.mk.athen/bundles/de.uniwue.mk.img.editor/src/de/uniwue/mk/img/editor/widget/ImageEditorWidgetPaintListener.java @@ -123,15 +123,15 @@ public class ImageEditorWidgetPaintListener implements PaintListener { firstPoint = SWT2Dutil.transformPoint(editor.getTranform(), firstPoint); // apply the transform - if (lastPoint != null && editor.freeDrawingCurrentPoint != null) { + if (lastPoint != null && editor.currentMouseLocation != null) { Point transformedPolygonDrawingCurrent = SWT2Dutil.transformPoint(editor.getTranform(), - editor.freeDrawingCurrentPoint); + editor.currentMouseLocation); gc.setAlpha(ALPHA_VERY_TRANSPARENT); gc.drawLine(lastPoint.x, lastPoint.y, transformedPolygonDrawingCurrent.x, transformedPolygonDrawingCurrent.y); if (SWT2Dutil.pointOverlaps( - SWT2Dutil.transformPoint(editor.getTranform(), editor.freeDrawingCurrentPoint), firstPoint, + SWT2Dutil.transformPoint(editor.getTranform(), editor.currentMouseLocation), firstPoint, ImageEditorWidget.POINTS_SELECTION_RADIUS)) { Color colorTemp = gc.getBackground(); gc.setBackground(editor.polygonClosedColor);