ソースを参照

Adds Highlighting to Objects that would be replaced

Andreas T. Meyer-Berg 6 年 前
コミット
68804ea2cc
4 ファイル変更243 行追加87 行削除
  1. 100 4
      src/ui/view/AbstractCanvas.java
  2. 87 1
      src/ui/view/GUI.java
  3. 30 43
      src/ui/view/MyCanvas.java
  4. 26 39
      src/ui/view/UpperNodeCanvas.java

+ 100 - 4
src/ui/view/AbstractCanvas.java

@@ -6,9 +6,9 @@ import ui.controller.UpdateController;
 import ui.model.Model;
 
 import javax.swing.*;
+
 import java.awt.*;
 import java.awt.event.MouseEvent;
-import java.awt.geom.Line2D;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.TimerTask;
@@ -23,6 +23,11 @@ import java.util.TimerTask;
  * @author: I. Dix
  */
 public abstract class AbstractCanvas extends JPanel {
+	/**
+	 * Version
+	 */
+	private static final long serialVersionUID = 1L;
+	
 	final JMenuItem itemDelete = new JMenuItem(Languages.getLanguage()[98]);
 	final JMenuItem itemCut = new JMenuItem(Languages.getLanguage()[95]);
 	final JMenuItem itemCopy = new JMenuItem(Languages.getLanguage()[96]);
@@ -42,6 +47,13 @@ public abstract class AbstractCanvas extends JPanel {
 	// Selection
 	AbstractCpsObject tempCps = null;
 	UpdateController updCon;
+	
+	//Replacement
+	/**
+	 * the CpsObject that might be replaced by drag&drop
+	 */
+	protected AbstractCpsObject mayBeReplaced = null;
+	
 	// PopUpMenu
 	JPopupMenu popmenu = new JPopupMenu();
 	// Tooltip
@@ -170,9 +182,6 @@ public abstract class AbstractCanvas extends JPanel {
 		 */
 		if (model.getShowSupplyBars() && (cps instanceof HolonObject || cps instanceof HolonBattery))
 		{
-			
-			
-		
 			// set Color & Percentage	
 			float percentage = 0;
 			Color paintColor = Color.WHITE;
@@ -506,4 +515,91 @@ public abstract class AbstractCanvas extends JPanel {
 		updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
 		updCon.refreshTableProperties(model.getPropertyTable());
 	}
+	
+	
+	/**
+	 * Checks if {@code draggedCps} or a new cpsObject at Position (x,y) could replace exactly one object
+	 * in {@code objects}.
+	 * Saves the object that would be replaced in {@link AbstractCanvas}.{@code MayBeReplaced}
+	 * @param objects list of objects that could be replaced
+	 * @param draggedCps Object that might replace
+	 * @param x Position of the objects that might replace
+	 * @param y Position of the objects that might replace
+	 * @return true if exactly one Object could be replaced 
+	 */
+	protected boolean checkForReplacement(ArrayList<AbstractCpsObject> objects, AbstractCpsObject draggedCps, int x, int y){
+		
+		/** distance treshold for replacement */
+		int treshhold = controller.getScale()/4*2;
+						
+		/** number of Objects that might be replaced (should be 1) */
+		int replaceCounter = 0;
+		
+		/** last object that could be replaced */
+		AbstractCpsObject toBeReplaced = null;
+		
+		/** Position of object that might be replaced */
+		Position p;
+		
+		/** for each cps on Canvas */
+		if(draggedCps == null || !(draggedCps instanceof CpsNode) && !(draggedCps instanceof CpsNode)){
+			for (AbstractCpsObject cps : objects){
+				/** same object -> ignore */
+				if(cps == draggedCps)continue;
+						
+				/** set Position of object that might be replaced */
+				p = cps.getPosition();
+				
+				/** if near enough */
+				if(Math.abs(x-p.x)<treshhold && Math.abs(y-p.y)<treshhold){
+					replaceCounter++;
+					toBeReplaced = cps;
+					
+					/**
+					 * if too many Objects could be replaced:
+					 * stop searching, because it would not be clear which one should
+					 * be replaced
+					 */
+					if(replaceCounter>1)break;
+				}
+			}
+		}
+		/**
+		 * return true if exactly one obect would be replaced
+		 */
+		if( replaceCounter == 1 && toBeReplaced != null){
+			mayBeReplaced = toBeReplaced;
+			return true;
+		}else{
+			mayBeReplaced = null;
+			return false;
+		}
+	}
+	
+	/**
+	 * Checks if an inserted new Object could replace exactly one object on the canvas.
+	 * Saves the object that would be replaced in {@link AbstractCanvas}.{@code MayBeReplaced}
+	 * @param x Position of the objects that might replace
+	 * @param y Position of the objects that might replace
+	 * @return true if exactly one Object could be replaced 
+	 */
+	public abstract boolean checkForReplacement(int x, int y);
+	
+		
+	/**
+	 * highlights the object that mayBeReplaced
+	 * @param g2
+	 */
+	protected void highlightMayBeReplaced(Graphics2D g2) {
+		if(mayBeReplaced != null){
+			g2.setColor(Color.RED);
+			g2.fillRect(
+					(int) (mayBeReplaced.getPosition().x
+							- controller.getScaleDiv2() - (scalediv20 + 5)),
+					(int) (mayBeReplaced.getPosition().y
+							- controller.getScaleDiv2() - (scalediv20 + 5)),
+					(int) (controller.getScale() + ((scalediv20 + 5) * 2)),
+					(int) (controller.getScale() + ((scalediv20 + 5) * 2)));
+		}
+	}
 }

+ 87 - 1
src/ui/view/GUI.java

@@ -1619,10 +1619,86 @@ public class GUI implements CategoryListener {
 
 			}
 		};
-
+		
 		tree.setCellRenderer(customRenderer);
 
+		tree.addMouseMotionListener(new MouseMotionAdapter() {
+
+			public void mouseDragged(MouseEvent e){
+				checkForDragAndDrop(e);
+			}
+			
+			/**
+			 * checks if an object of the current Panel
+			 * could be replaced by the dragged object
+			 * @param e
+			 */
+			private void checkForDragAndDrop(MouseEvent e){
+				try {
+					/**
+					 * if no object gets dragged -> finished
+					 */
+					if(!dragging)return;
+					
+					/**
+					 * select the current Panel
+					 */
+					chooseTabTemp();				
+					JScrollPane scrollPane = getScrollPaneFromTabbedPane();
+					if(scrollPane == null)return;
+					Component canvasOrUpperNodeCanvas = scrollPane
+							.getViewport().getComponent(0);
+					
+					/**
+					 * check for replacements on the canvas
+					 */
+					if (canvasOrUpperNodeCanvas instanceof UpperNodeCanvas) {
+						UpperNodeCanvas unc = (UpperNodeCanvas) canvasOrUpperNodeCanvas;
+						if(unc.getMousePosition()==null)return;
+						int x = (int) unc.getMousePosition().getX()+16;
+						int y = (int) unc.getMousePosition().getY()+16;
+						
+						/**
+						 * if in upperNode
+						 */
+						if (x <= unc.upperNode.getLeftBorder()) return;
+						
+						/**
+						 * check for replacement
+						 */
+						unc.checkForReplacement(x, y);
+						
+						/**
+						 * repaint 
+						 */
+						unc.invalidate();
+						unc.repaint();
+					} else {
+						if(canvas.getMousePosition()==null)return;
+						int x = (int) canvas.getMousePosition().getX()+16;
+						int y = (int) canvas.getMousePosition().getY()+16;
+						
+						/**
+						 * check for replacement
+						 */
+						canvas.checkForReplacement(x, y);
+						
+						/**
+						 * repaint
+						 */
+						canvas.invalidate();
+						canvas.repaint();
+					}
+					contentPane.updateUI();
+					
+				} catch (Exception eex) {
+					eex.printStackTrace();
+				}
+			}});
+
+		
 		tree.addMouseListener(new MouseAdapter() {
+			
 			public void mouseReleased(MouseEvent e) {
 				try {
 					if (dragging) {
@@ -1657,6 +1733,10 @@ public class GUI implements CategoryListener {
 								h.setPosition(x, y);
 
 								controller.addObjUpperNode(h, unc.upperNode);
+								/**
+								 * object would be replaced
+								 */
+								unc.mayBeReplaced = null; 
 								unc.invalidate();
 								unc.repaint();
 								unc.setXY((int) canvas.getMousePosition()
@@ -1684,6 +1764,10 @@ public class GUI implements CategoryListener {
 							h.setPosition(x, y);
 
 							controller.addObjectCanvas(h);
+							/**
+							 * no object should get replaced
+							 */
+							canvas.mayBeReplaced = null;
 							canvas.invalidate();
 							canvas.setXY(
 									(int) canvas.getMousePosition().getX(),
@@ -1699,12 +1783,14 @@ public class GUI implements CategoryListener {
 				frmCyberPhysical.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 			}
 		});
+		
 
 		popmenuEdit.add(editItem);
 		editItem.setEnabled(false);
 		editItem.addActionListener(actionEvent -> {
 		});
 		tree.addMouseListener(new MouseAdapter() {
+		
 			public void mousePressed(MouseEvent e) {
 				try {
 					actualObjectClicked = tree

+ 30 - 43
src/ui/view/MyCanvas.java

@@ -470,6 +470,12 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 			}
 		}
 
+
+		/**
+		 * highlight the Object that would be replaced
+		 */
+		highlightMayBeReplaced(g2);
+		
 		// Objects
 		for (AbstractCpsObject cps : model.getObjectsOnCanvas()) {
 			// Border Highlighting
@@ -493,9 +499,8 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 					controller.getScale(), controller.getScale(), null);
 
 			paintSupplyBar(g, cps);
-			
 		}
-
+		
 		// Dragged marker Highlighting
 		if (doMark) {
 			g2.setColor(Color.BLACK);
@@ -506,8 +511,6 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 		showTooltip(g);
 	}
 
-	
-
 	@Override
 	public void mouseClicked(MouseEvent e) {
 		if (e.getButton() == MouseEvent.BUTTON1) {
@@ -598,45 +601,16 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 
 		if (dragged) {
 			try {
-				/** x of the dragged Object */
-				int x = tempCps.getPosition().x;
-				
-				/** y of the dragged Object */
-				int y = tempCps.getPosition().y;
-				
-				/** distance treshold for replacement */
-				int treshhold = controller.getScale()/4;
-				
-				//System.out.println("Dragged "+tempCps.toString()+" to x: "+tempCps.getPosition().x+" y: "+tempCps.getPosition().y);
-				
-				/** number of Objects that might be replaced (should be 1) */
-				int replaceCounter = 0;
 				
-				/** last object that could be replaced */
-				AbstractCpsObject toBeReplaced = null;
-				
-				/** for each cps on Canvas */
-				if(!(tempCps instanceof CpsNode)){
-					for (AbstractCpsObject cps : model.getObjectsOnCanvas()){
-						/** same object -> ignore */
-						if(cps == tempCps)continue;
-						if(tempCps instanceof CpsNode)continue;
-						/** x of object that might get replaced */
-						int c_x = cps.getPosition().x;
-						
-						/** y of object that might get replaced */
-						int c_y = cps.getPosition().y;
-						
-						/** if near enough */
-						if(Math.abs(x-c_x)<treshhold && Math.abs(y-c_y)<treshhold){
-							replaceCounter++;
-							toBeReplaced = cps;
-						}
-					}
-				}
-				/** if replacement of exactly one object possible */
-				if(replaceCounter == 1 && toBeReplaced != null){
-					controller.replaceCanvasObject(toBeReplaced, tempCps);
+				/**
+				 * check if tempCps could replace an Object on the canvas
+				 */
+				if(checkForReplacement(model.getObjectsOnCanvas(), tempCps, tempCps.getPosition().x, tempCps.getPosition().y)){
+					/**
+					 * replace on canvas
+					 */
+					controller.replaceCanvasObject(mayBeReplaced, tempCps);
+					mayBeReplaced=null;
 				}
 				
 				controller.autoSave();
@@ -677,6 +651,7 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 		// If Edge is drawn
 		x = e.getX();
 		y = e.getY();
+		checkForReplacement(0, 0);
 		if (!model.getSelectedCpsObjects().contains(tempCps) && !doMark) {
 			model.getSelectedCpsObjects().clear();
 			if (tempCps != null) {
@@ -736,6 +711,12 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 						cps.setPosition(x, y);
 					}
 				}
+				
+				/**
+				 * check if something might be replaced
+				 */
+				checkForReplacement(model.getObjectsOnCanvas(), tempCps, x, y);
+				
 				repaint();
 			} catch (Exception eex) {
 			}
@@ -770,7 +751,7 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 	}
 
 	@Override
-	public void mouseMoved(MouseEvent e) {
+	public void mouseMoved(MouseEvent e) {	
 		x = e.getX();
 		y = e.getY();
 
@@ -971,4 +952,10 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 		this.y = y;
 	}
 
+	@Override
+	public boolean checkForReplacement(int x, int y) {
+		
+		return checkForReplacement(model.getObjectsOnCanvas(), null, x, y);
+	}
+
 }

+ 26 - 39
src/ui/view/UpperNodeCanvas.java

@@ -544,6 +544,10 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
             }
         }
 
+
+        //Draw ReplaceHighlight
+        highlightMayBeReplaced(g2);
+        
         // Objects in upper node
         for (AbstractCpsObject cps : upperNode.getNodes()) {
             // Border Highlighting
@@ -563,7 +567,7 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
                     controller.getScale(), controller.getScale(), null);
             paintSupplyBar(g2,cps);
         }
-
+        
         // Dragged marker Highlighting
         g2.setStroke(new BasicStroke(1));
         if (doMark) {
@@ -720,45 +724,18 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
 
         if (dragged) {
             try { 
-            	/** x of the dragged Object */
-				int x = tempCps.getPosition().x;
-				
-				/** y of the dragged Object */
-				int y = tempCps.getPosition().y;
-				
-				/** distance treshold for replacement */
-				int treshhold = controller.getScale()/4;
-				
-				/** number of Objects that might be replaced (should be 1) */
-				int replaceCounter = 0;
-				
-				/** last object that could be replaced */
-				AbstractCpsObject toBeReplaced = null;
-				
-				/** for each cps on Canvas */
-				if(!(tempCps instanceof CpsNode)){
-					for (AbstractCpsObject cps : upperNode.getNodes()){
-						
-						/** same object -> ignore */
-						if(cps == tempCps)continue;
-						
-						/** x of object that might get replaced */
-						int c_x = cps.getPosition().x;
-						
-						/** y of object that might get replaced */
-						int c_y = cps.getPosition().y;
-						
-						/** if near enough */
-						if(Math.abs(x-c_x)<treshhold && Math.abs(y-c_y)<treshhold){
-							replaceCounter++;
-							toBeReplaced = cps;
-						}
-					}
-				}
-				/** if replacement of exactly one object possible */
-				if(replaceCounter == 1 && toBeReplaced != null){
-					controller.replaceObjUpperNode(toBeReplaced, tempCps, upperNode);
+
+				/**
+				 * check if tempCps could replace an Object on the UpperNodeanvas
+				 */
+				if(checkForReplacement(upperNode.getNodes(), tempCps, tempCps.getPosition().x, tempCps.getPosition().y)){
+					/**
+					 * replace on canvas
+					 */
+					controller.replaceObjUpperNode(mayBeReplaced, tempCps, upperNode);
+					mayBeReplaced=null;
 				}
+				
                 controller.autoSave();
             } catch (IOException ex) {
                 ex.printStackTrace();
@@ -800,6 +777,11 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
         }
         if (dragging) {
             try {
+            	/**
+            	 * check if something would be replaced
+            	 */
+            	checkForReplacement(upperNode.getNodes(), tempCps, x, y);
+            	
                 // tempCps in the upperNode? else its a connected Object from
                 // outside
                 if (upperNode.getNodes().contains(tempCps)) {
@@ -1256,5 +1238,10 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
         this.x = x;
         this.y = y;
     }
+    
+    @Override
+	public boolean checkForReplacement(int x, int y) {
+		return checkForReplacement(upperNode.getNodes(), null, x, y);
+	}
 
 }