|
@@ -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)));
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|