Selaa lähdekoodia

Merge branch 'BP_master' into Benutzerfreundlich

Conflicts:
	src/ui/view/GUI.java

Merge
tolatesry 6 vuotta sitten
vanhempi
commit
fd33b9b206

+ 1 - 1
src/ui/controller/ClipboardController.java

@@ -60,7 +60,7 @@ public class ClipboardController {
         for (AbstractCpsObject abs : model.getSelectedCpsObjects()) {
             queue.add(abs);
         }
-
+        
         while (!queue.isEmpty()) {
 
             u = queue.pop();

+ 13 - 1
src/ui/controller/Control.java

@@ -344,7 +344,12 @@ public class Control {
      */
     public void replaceCanvasObject(AbstractCpsObject toBeReplaced, AbstractCpsObject by) {
     	canvasController.replaceObjectOnCanvas(toBeReplaced, by);
-    	
+    	try {
+            autoSave();
+        } catch (IOException e) {
+        	System.out.println("Error by Replacing "+toBeReplaced.toString() + " by " + by.toString());
+            e.printStackTrace();
+        }
     }
     
     /**
@@ -849,6 +854,13 @@ public class Control {
 	public void replaceObjUpperNode(AbstractCpsObject toBeReplaced,
 			AbstractCpsObject by, CpsUpperNode upperNode) {
 		nodeController.replaceObjectInUpperNode(toBeReplaced, by, upperNode);
+		try {
+            autoSave();
+        } catch (IOException e) {
+        	System.out.println("Error by Replacing "+toBeReplaced.toString() 
+        			+ " by " + by.toString() + " in UpperNode " + upperNode.toString());
+            e.printStackTrace();
+        }
 	}
 
     public void addEdgeUpperNode(CpsEdge edge, CpsUpperNode upperNode) {

+ 9 - 1
src/ui/controller/NodeController.java

@@ -446,7 +446,15 @@ class NodeController {
 	 * @param replace
 	 */
     void addObjectInUpperNode(AbstractCpsObject object, CpsUpperNode upperNode, boolean replace) {
-        object.setSav("" + upperNode.getId());
+        if(object == null){
+        		new Error("object == null while adding to "+upperNode.toString()).printStackTrace();
+        		return;
+        	}
+        if(upperNode == null){
+    		new Error("object == null while adding "+object.toString()).printStackTrace();
+    		return;
+    	}
+    	object.setSav("" + upperNode.getId());
 		upperNode.getNodesIdx().put(object.getId(), upperNode.getNodes().size());
 		upperNode.getNodes().add(object);
 		

+ 20 - 0
src/ui/model/Model.java

@@ -5,15 +5,18 @@ import TypeAdapter.ColorAdapter;
 import TypeAdapter.PairAdapter;
 import TypeAdapter.PositionAdapter;
 import classes.*;
+
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.google.gson.JsonObject;
+
 import interfaces.CategoryListener;
 import interfaces.GraphListener;
 import interfaces.ObjectListener;
 import ui.view.*;
 
 import javax.swing.*;
+
 import java.awt.*;
 import java.util.*;
 import java.util.List;
@@ -54,6 +57,9 @@ public class Model {
     private float maxCapacity;
     // Table for HolonElements --> all cells are editable
     private JTable tableHolonElement;
+    /** Table for the properties of HolonObjects, Edges etc */
+    private JTable propertyTable;
+    
     private ArrayList<GraphListener> graphListeners = new ArrayList();
     // Iteration Speed
     private int timerSpeed = 1000;
@@ -697,6 +703,20 @@ public class Model {
     public void setTableHolonElement(JTable tableHolonElement) {
         this.tableHolonElement = tableHolonElement;
     }
+    
+	/**
+	 * @return the tableProperties
+	 */
+	public JTable getTableProperties() {
+		return propertyTable;
+	}
+	
+	/**
+	 * @return the tableProperties
+	 */
+	public void setTableProperties(JTable propertyTable) {
+		this.propertyTable = propertyTable;
+	}
 
     /**
      * Returns the sCale (Scale for the Images).

+ 32 - 1
src/ui/view/AbstractCanvas.java

@@ -6,6 +6,7 @@ import ui.controller.UpdateController;
 import ui.model.Model;
 
 import javax.swing.*;
+import javax.swing.table.JTableHeader;
 
 import java.awt.*;
 import java.awt.event.MouseEvent;
@@ -38,7 +39,7 @@ public abstract class AbstractCanvas extends JPanel {
 	final JMenuItem itemTrack = new JMenuItem(Languages.getLanguage()[101]);
 	final JMenuItem itemUntrack = new JMenuItem(Languages.getLanguage()[102]);
 	final JMenuItem itemCreateTemplate = new JMenuItem(Languages.getLanguage()[Languages.right_click_create_template]);
-	final JMenuItem itemAlignAll = new JMenuItem("AlignAll");
+
 	final int ANIMTIME = 500; // animation Time
 	private final int animFPS = 60;
 	final int animDelay = 1000 / animFPS; // animation Delay
@@ -659,4 +660,34 @@ public abstract class AbstractCanvas extends JPanel {
 		/** set new Position */
 		cps.setPosition(p.x-x_off, p.y-y_off);
 	}
+	
+	/**
+	 * Stops Editing in HolonElementTable and PropertyTable
+	 */
+	protected void stopEditing() {
+		/**
+		 * Stop Editing, if mouse exits the Table
+		 */
+		JTable holElem = model.getTableHolonElement();
+		CellEditor cellEditor = holElem.getCellEditor();
+		if (cellEditor != null) {
+		    if (cellEditor.getCellEditorValue() != null) {
+		    	/** TODO: Maybe try to save current Data */
+		        cellEditor.stopCellEditing();
+		    } else {
+		        cellEditor.cancelCellEditing();
+		    }
+		}
+		
+		JTable propertys = model.getTableProperties();
+		cellEditor = propertys.getCellEditor();
+		if (cellEditor != null) {
+		    if (cellEditor.getCellEditorValue() != null) {
+		    	/** TODO: Maybe try to save current Data */
+		        cellEditor.stopCellEditing();
+		    } else {
+		        cellEditor.cancelCellEditing();
+		    }
+		}
+	}
 }

+ 102 - 29
src/ui/view/GUI.java

@@ -18,6 +18,8 @@ import ui.view.NewPopUp.Option;
 
 import javax.swing.*;
 import javax.swing.border.LineBorder;
+import javax.swing.event.AncestorEvent;
+import javax.swing.event.AncestorListener;
 import javax.swing.filechooser.FileNameExtensionFilter;
 import javax.swing.table.DefaultTableModel;
 import javax.swing.table.JTableHeader;
@@ -197,6 +199,7 @@ public class GUI implements CategoryListener {
 	private final JPanel panelHolonEl = new JPanel();
 	private final JComboBox comboBox = new JComboBox();
 	// Buttons
+
 	private final JButton btnAdd = new JButton("New");
 	private final JPopupMenu btnAddPopUp = new JPopupMenu("New");
 	private final JMenuItem mItemNew = new JMenuItem("New..");
@@ -208,6 +211,7 @@ public class GUI implements CategoryListener {
 	private final JButton btnAddHolEL = new JButton("New");
 	private final JButton btnDelHolEL = new JButton("Delete");
 	private final JButton resetGraphBtn = new JButton("Reset");
+
 	private final JToolBar toolBar = new JToolBar();
 	private final JToolBar toolBarHolonEl = new JToolBar();
 	private final JToolBar toolBarGraph = new JToolBar();
@@ -223,9 +227,9 @@ public class GUI implements CategoryListener {
 	private final HolonCanvas holonCanvas;
 	private final UnitGraph unitGraph;
 	/** Textfield to show the period of an element */
-	private final JTextField unitGraphLocalPeriod = new JTextField();
+	private final JTextField unitGraphLocalPeriod = new JTextField(6);
 	private final JCheckBox unitGraphStretchMode=new JCheckBox();
-	private final JLabel unitGraphStretchModeLbl=new JLabel(" Use global");//Some padding
+	private final JLabel unitGraphStretchModeLbl=new JLabel("  Use global:  ");//Some padding
 	private final JSplitPane splitPane3 = new JSplitPane();
 	private final JSlider sizeSlider = new JSlider();
 	private final JLabel lblImageSize = new JLabel(Languages.getLanguage()[94]);
@@ -310,6 +314,7 @@ public class GUI implements CategoryListener {
 		control.initListener(this);
 		controller.setCanvas(canvas);
 		model.setConsole(console);
+		model.setTableProperties(tableProperties);
 		algorithmMenu = new AlgorithmMenu(model, control, this);
 		initialize();
 		updateCategories(model.getCategories());
@@ -413,6 +418,7 @@ public class GUI implements CategoryListener {
 			public void actionPerformed(ActionEvent e) {
 				try {
 					controller.loadAutoSave(controller.getUndoSave());
+					controller.calculateStateForCurrentTimeStep();
 					canvas.repaint();
 					unitGraph.update(model.getObjectsOnCanvas());
 					updateUpperNodes();
@@ -432,6 +438,7 @@ public class GUI implements CategoryListener {
 			public void actionPerformed(ActionEvent e) {
 				try {
 					controller.loadAutoSave(controller.getRedoSave());
+					controller.calculateStateForCurrentTimeStep();
 					canvas.repaint();
 					unitGraph.update(model.getObjectsOnCanvas());
 					updateUpperNodes();
@@ -632,6 +639,7 @@ public class GUI implements CategoryListener {
 						}
 					}
 
+					if(tabTemp == null)return;
 					JScrollPane scrollPane = getScrollPaneFromTabbedPane();
 					Component canvasOrUpperNodeCanvas = scrollPane
 							.getViewport().getComponent(0);
@@ -644,10 +652,12 @@ public class GUI implements CategoryListener {
 										canvasOrUpperNodeCanvas
 												.getMousePosition());
 						unitGraph.update(model.getSelectedCpsObjects());
+						controller.calculateStateForCurrentTimeStep();
 						scrollPane.getViewport().getComponent(0).repaint();
 					} else {
 						controller.paste(null, canvas.getMousePosition());
 						unitGraph.update(model.getSelectedCpsObjects());
+						controller.calculateStateForCurrentTimeStep();
 						canvas.repaint();
 					}
 				} catch (HeadlessException | JsonParseException
@@ -676,13 +686,16 @@ public class GUI implements CategoryListener {
 					if (scrollPane.getViewport().getComponent(0) instanceof UpperNodeCanvas) {
 						controller.cut(((UpperNodeCanvas) scrollPane
 								.getViewport().getComponent(0)).upperNode);
+						controller.calculateStateForCurrentTimeStep();
+						scrollPane.getViewport().getComponent(0).repaint();
 					} else {
 						controller.cut(null);
+						controller.calculateStateForCurrentTimeStep();
+						canvas.repaint();
 					}
 					if (!model.getClipboradObjects().isEmpty()) {
 						canvas.itemPaste.setEnabled(true);
 					}
-					canvas.repaint();
 				}
 			}
 		};
@@ -1098,6 +1111,29 @@ public class GUI implements CategoryListener {
 						//refresh HolonElementTable
 						updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
 					}
+					
+
+					@Override
+					public void mouseExited(MouseEvent e) {
+						/**
+						 * Stop Editing, if mouse exits the Table
+						 */
+						JTable holElem = model.getTableHolonElement();
+						JTableHeader holElemHead = holElem.getTableHeader();
+						if(e.getX()<=0 || e.getX()>=holElemHead.getWidth() 
+								|| e.getY() <= 0){
+							CellEditor cellEditor = holElem.getCellEditor();
+							if (cellEditor != null) {
+							    if (cellEditor.getCellEditorValue() != null) {
+							    	/** TODO: Maybe try to save current Data */
+							        cellEditor.stopCellEditing();
+							    } else {
+							        cellEditor.cancelCellEditing();
+							    }
+							}
+						}
+						
+					}
 				});
 		model.getTableHolonElement().getTableHeader().setReorderingAllowed(false);
 
@@ -1130,35 +1166,45 @@ public class GUI implements CategoryListener {
 		graphLabel.add(medGraph, BorderLayout.CENTER);
 		graphLabel.add(minGraph, BorderLayout.SOUTH);
 
+		GridBagLayout gbl=new GridBagLayout();
+		toolBarGraph.setLayout(gbl);
+		GridBagConstraints c=new GridBagConstraints();
+		c.weightx=0;
+		gbl.setConstraints(lblSelectedElement, c);
+		//TODO here
 		toolBarGraph.add(lblSelectedElement);
-		toolBarGraph.add(elementGraph);
+		c.gridwidth=GridBagConstraints.REMAINDER;
+		gbl.setConstraints(elementGraph, c);
+		toolBarGraph.add(elementGraph/*, BorderLayout.AFTER_LINE_ENDS*/);//TODO
 		
-		Component horizontalStrut = Box.createHorizontalStrut(20);
+		//Component horizontalStrut = Box.createHorizontalStrut(20);
 		/*
 		Component horizontalStrut = Box.createHorizontalStrut(toolBarGraph
 				.getWidth() - resetGraphBtn.getWidth() - unitGraphLocalPeriod.getWidth()
 				-unitGraphLocalPeriodLbl.getWidth());
 
 		*/
-		toolBarGraph.add(horizontalStrut);//What is this for?
+		//toolBarGraph.add(horizontalStrut);//What is this for?
 
 		/** Add local Graph length Textfield an Label */
 		unitGraphLocalPeriod.setPreferredSize(new Dimension(30, 20));//TODO
 		unitGraphLocalPeriod.setText(""+unitGraph.getLocalPeriod());
-		resetGraphBtn.setHorizontalAlignment(SwingConstants.RIGHT);
-		
-		toolBarGraph.add(unitGraphLocalPeriodLbl);
-		unitGraphLocalPeriodLbl.setHorizontalAlignment(SwingConstants.RIGHT);
-		toolBarGraph.add(unitGraphLocalPeriod);
-		
-		resetGraphBtn.setHorizontalAlignment(SwingConstants.RIGHT);
-		toolBarGraph.add(resetGraphBtn);
-		
-		toolBarGraph.add(unitGraphStretchModeLbl);
-		unitGraphStretchModeLbl.setHorizontalAlignment(SwingConstants.RIGHT);
 		
-		toolBarGraph.add(unitGraphStretchMode);
-		unitGraphStretchMode.setHorizontalAlignment(SwingConstants.RIGHT);
+		c.gridwidth=GridBagConstraints.NORTHWEST;
+		gbl.setConstraints(unitGraphLocalPeriodLbl, c);
+		toolBarGraph.add(unitGraphLocalPeriodLbl);//TODO
+		//unitGraphLocalPeriodLbl.setHorizontalAlignment(SwingConstants.RIGHT);
+		gbl.setConstraints(unitGraphLocalPeriod, c);
+		toolBarGraph.add(unitGraphLocalPeriod);//TODO
+		gbl.setConstraints(unitGraphStretchModeLbl, c);
+		toolBarGraph.add(unitGraphStretchModeLbl);//TODO
+		//unitGraphStretchModeLbl.setHorizontalAlignment(SwingConstants.RIGHT);
+		gbl.setConstraints(unitGraphStretchMode, c);
+		toolBarGraph.add(unitGraphStretchMode);//TODO
+		//unitGraphStretchMode.setHorizontalAlignment(SwingConstants.RIGHT);
+		gbl.setConstraints(resetGraphBtn, c);
+		//resetGraphBtn.setHorizontalAlignment(SwingConstants.RIGHT);
+		toolBarGraph.add(resetGraphBtn);//TODO
 		unitGraphStretchMode.addActionListener(e ->
 			{unitGraph.setStretching(unitGraphStretchMode.isSelected());}
 		);
@@ -1316,8 +1362,30 @@ public class GUI implements CategoryListener {
 				xBThis = e.getX();
 
 			}
+			
+			@Override
+			public void mouseExited(MouseEvent e) {
+				/**
+				 * Stop Editing, if mouse exits the Table
+				 */
+				JTable holElem = model.getTableHolonElement();
+				if(e.getX()<=0 || e.getX()>=holElem.getWidth() 
+						/*|| e.getY() <= 0*/|| e.getY()>= holElem.getHeight()){
+					CellEditor cellEditor = holElem.getCellEditor();
+					if (cellEditor != null) {
+					    if (cellEditor.getCellEditorValue() != null) {
+					    	/** TODO: Maybe try to save current Data */
+					        cellEditor.stopCellEditing();
+					    } else {
+					        cellEditor.cancelCellEditing();
+					    }
+					}
+				}
+				
+			}
+			
 		});
-
+		
 		/*
 		 * Triggered every time a change is made
 		 */
@@ -2242,14 +2310,16 @@ public class GUI implements CategoryListener {
 				fileChooser.setFileFilter(holonFilter);
 
 				if (fileChooser.showSaveDialog(frmCyberPhysical) == JFileChooser.APPROVE_OPTION) {
-					String file = fileChooser.getSelectedFile().getPath();
+					File selectedFile = fileChooser.getSelectedFile();
+					String fileName = selectedFile.getName();
+					String fullPath = fileChooser.getSelectedFile().getPath();
 					if (fileChooser.getFileFilter().equals(holonFilter)) {
-						if (!file.contains("."))
-							file += ".holon";
+						if (!fileName.contains("."))
+							fullPath += ".holon";
 					}
-					if (!file.endsWith(".holon")) {
-						String suffix = file.substring(file.lastIndexOf("."),
-								file.length());
+					if (!fullPath.endsWith(".holon")) {
+						String suffix = fullPath.substring(fullPath.lastIndexOf("."),
+								fullPath.length());
 						String[] options = new String[] { "keep .holon",
 								"use " + suffix };
 
@@ -2264,11 +2334,11 @@ public class GUI implements CategoryListener {
 								options[1]);
 
 						if (response == 0)
-							file = file.replace(suffix, ".holon");
+							fullPath = fullPath.replace(suffix, ".holon");
 					}
 
 					try {
-						controller.saveFile(new File(file).getAbsolutePath());
+						controller.saveFile(new File(fullPath).getAbsolutePath());
 					} catch (IOException | ArchiveException e) {
 						e.printStackTrace();
 					}
@@ -2311,6 +2381,7 @@ public class GUI implements CategoryListener {
 			private void menuUndoActionPerformed() {
 				try {
 					controller.loadAutoSave(controller.getUndoSave());
+					controller.calculateStateForCurrentTimeStep();
 					canvas.repaint();
 
 					repaintGraphAfterUndoRedo();
@@ -2330,6 +2401,7 @@ public class GUI implements CategoryListener {
 			private void menuRedoActionPerformed() {
 				try {
 					controller.loadAutoSave(controller.getRedoSave());
+					controller.calculateStateForCurrentTimeStep();
 					canvas.repaint();
 
 					repaintGraphAfterUndoRedo();
@@ -2907,7 +2979,8 @@ public class GUI implements CategoryListener {
 	 */
 	private void chooseTabTemp() {
 		// is the uppernode on tabbedPaneOriginal or tabbedPaneSplit
-		if (tabbedPaneOriginal.getMousePosition() != null) {
+		/* TODO: Fix or Remove SplitView */
+		if (tabbedPaneOriginal.getMousePosition() != null || initSplit) {
 			tabTemp = tabbedPaneOriginal;
 		} else {
 			tabTemp = tabbedPaneSplit;

+ 24 - 15
src/ui/view/MyCanvas.java

@@ -61,7 +61,6 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 		popmenu.add(itemTrack);
 		popmenu.add(itemUntrack);
 		popmenu.add(itemCreateTemplate);
-		popmenu.add(itemAlignAll);
 
 		updCon = new UpdateController(mod, control);
 
@@ -73,11 +72,8 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 		itemUngroup.setEnabled(false);
 		itemTrack.setEnabled(false);
 		itemUntrack.setEnabled(false);
-		itemAlignAll.setEnabled(true);
 
 		itemCut.setText(Languages.getLanguage()[95]);
-
-		itemAlignAll.addActionListener(a -> tryToAlignObjects());
 		
 		itemGroup.addActionListener(actionEvent -> {
 			// calculate uppernode pos (taken from the controller)
@@ -527,6 +523,8 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 			}
 			triggerUpdateController();
 		}
+
+		stopEditing();
 	}
 
 	@Override
@@ -539,6 +537,7 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 
 	@Override
 	public void mousePressed(MouseEvent e) {
+		stopEditing();
 		tempCps = null;
 		edgeHighlight = null;
 		controller.setSelecteEdge(null);
@@ -553,11 +552,15 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 				setConsoleTextAfterSelect(cps);
 
 				dragging = true;
+
 				if (e.isControlDown() && tempCps != null) {
 					if (model.getSelectedCpsObjects().contains(tempCps)) {
 						controller.deleteSelectedObject(tempCps);
+							//TODO: RemoveDepth
 					} else {
 						controller.addSelectedObject(tempCps);
+						if(tempCps instanceof CpsUpperNode)
+							controller.getObjectsInDepth();
 					}
 
 				}
@@ -607,30 +610,36 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 
 		if (dragged) {
 			try {
-				
 				/**
-				 * check if a unique tempCps could replace an Object on the canvas
+				 * Save before further Dragged interactions happen
 				 */
-				if(model.getSelectedCpsObjects().size()==1 
-						&& checkForReplacement(model.getObjectsOnCanvas(), tempCps, tempCps.getPosition().x, tempCps.getPosition().y)){
-					/**
-					 * replace on canvas
-					 */
-					controller.replaceCanvasObject(mayBeReplaced, tempCps);
-					mayBeReplaced=null;
-				}
-				
 				controller.autoSave();
+				
 			} catch (IOException ex) {
 				System.err.println("AutoSave error by dragging");
 				ex.printStackTrace();
 			}
+			
+			/**
+			 * check if a unique tempCps could replace an Object on the canvas
+			 */
+			if(model.getSelectedCpsObjects().size()==1 
+					&& checkForReplacement(model.getObjectsOnCanvas(), tempCps, tempCps.getPosition().x, tempCps.getPosition().y)){
+				/**
+				 * replace on canvas (will save)
+				 */
+				controller.replaceCanvasObject(mayBeReplaced, tempCps);
+				mayBeReplaced=null;
+			}
 		}
 
 		if (!e.isControlDown() && !dragged && tempCps != null
 				&& MouseEvent.BUTTON3 != e.getButton()) {
 			model.getSelectedCpsObjects().clear();
 			controller.addSelectedObject(tempCps);
+			model.setSelectedCpsObject(tempCps);
+			if(tempCps instanceof CpsUpperNode)
+				controller.getObjectsInDepth();
 		}
 
 		dragged = false;

+ 6 - 0
src/ui/view/PropertyTable.java

@@ -31,4 +31,10 @@ public class PropertyTable extends DefaultTableModel {
 		}
 		return clazz;
 	}
+	
+	@Override
+	public boolean isCellEditable(int row, int column) {
+		return getColumnCount() == 8 && column > 1
+				|| getColumnCount() == 7 && column > 0;
+	}
 }

+ 5 - 7
src/ui/view/UnitGraph.java

@@ -383,7 +383,7 @@ public class UnitGraph extends JPanel implements MouseListener, MouseMotionListe
             for (Point p : pointList) {
                 if (x >= p.getX() - recSize.getX() / 2 && y >= p.getY() - recSize.getY() / 2
                         && x <= p.getX() + recSize.getX() / 2 && y <= p.getY() * scaleY + recSize.getY() / 2) {
-                    if (e.getButton() == MouseEvent.BUTTON3) {
+                    if (e.getButton() == MouseEvent.BUTTON3) {//TODO: test
                         tempP = p;
                         deletePoint = true;
                     } else {
@@ -414,7 +414,7 @@ public class UnitGraph extends JPanel implements MouseListener, MouseMotionListe
             }
             // Delete a Point
             if (deletePoint && tempP.getX() != 0
-                    && (tempP.getX() != this.getWidth() / scaleX || tempP != pointList.getLast())) {
+                    && /*(*//*tempP.getX() != this.getWidth() / scaleX || */tempP != pointList.getLast())/*)*/ {
                 pointList.remove(tempP);
             }
 
@@ -875,14 +875,12 @@ public class UnitGraph extends JPanel implements MouseListener, MouseMotionListe
     static int lv=0;
     
     public static int getEffectiveIndex(Model m, IGraphedElement e, int timeStep){
-    	int o;
-    	if(e.isStretching())o= timeStep*100/m.getIterations();
-    	else o= timeStep%e.getLocalPeriod()*100/e.getLocalPeriod();
-    	return o;//TODO
+    	if(e.isStretching())return timeStep*100/(m==null?STANDARD_GRAPH_ACCURACY:m.getIterations());
+    	else return timeStep%e.getLocalPeriod()*100/e.getLocalPeriod();
     }
     
     public static int getEffectiveIndex(IGraphedElement e, int timeStep){
-    	return getEffectiveIndex(SingletonControl.getInstance().getControl().getModel(),e,timeStep);
+    	return getEffectiveIndex(SingletonControl.getInstance().getControl()==null?null:SingletonControl.getInstance().getControl().getModel(),e,timeStep);
     }
     
     public static int getEffectiveIndex(IGraphedElement e){

+ 20 - 16
src/ui/view/UpperNodeCanvas.java

@@ -78,7 +78,6 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
         popmenu.add(itemTrack);
         popmenu.add(itemUntrack);
         popmenu.add(itemCreateTemplate);
-        popmenu.add(itemAlignAll);
         
         itemDelete.setEnabled(false);
         itemCut.setEnabled(false);
@@ -88,11 +87,8 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
         itemUngroup.setEnabled(false);
         itemTrack.setEnabled(false);
         itemUntrack.setEnabled(false);
-        itemAlignAll.setEnabled(true);
         
         updCon = new UpdateController(model, controller);
-
-        itemAlignAll.addActionListener(a -> tryToAlignObjects());
         
         itemGroup.addActionListener(actionEvent -> {
             // calculate uppernode pos (taken from the controller)
@@ -591,6 +587,7 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
     @Override
     public void mouseClicked(MouseEvent e) {
         triggerUpdateController();
+        stopEditing();
     }
 
     @Override
@@ -603,6 +600,7 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
 
     @Override
     public void mousePressed(MouseEvent e) {
+    	stopEditing();
         tempCps = null;
         dataSelected = null;
         edgeHighlight = null;
@@ -632,6 +630,8 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
                             controller.deleteSelectedObject(tempCps);
                         } else {
                             controller.addSelectedObject(tempCps);
+                            if(tempCps instanceof CpsUpperNode)
+    							controller.getObjectsInDepth();
                         }
                     }
 
@@ -729,27 +729,31 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
 
         if (dragged) {
             try { 
-
-				/**
-				 * check if tempCps could replace an Object on the UpperNodeanvas
-				 */
-				if(model.getSelectedCpsObjects().size() == 1 && checkForReplacement(upperNode.getNodes(), tempCps, tempCps.getPosition().x, tempCps.getPosition().y)){
-					/**
-					 * replace on canvas
-					 */
-					controller.replaceObjUpperNode(mayBeReplaced, tempCps, upperNode);
-					mayBeReplaced=null;
-				}
-				
+            	/**
+            	 * Save State before performing NodePlacement, replacement e.g.
+            	 */
                 controller.autoSave();
             } catch (IOException ex) {
                 ex.printStackTrace();
             }
+            
+            /**
+             * check if tempCps could replace an Object on the UpperNodeanvas
+             */
+            if(model.getSelectedCpsObjects().size() == 1 && checkForReplacement(upperNode.getNodes(), tempCps, tempCps.getPosition().x, tempCps.getPosition().y)){
+            	/**
+            	 * replace on canvas
+            	 */
+            	controller.replaceObjUpperNode(mayBeReplaced, tempCps, upperNode);
+            	mayBeReplaced=null;
+            }
         }
 
         if (!e.isControlDown() && !dragged && tempCps != null && MouseEvent.BUTTON3 != e.getButton()) {
             model.getSelectedCpsObjects().clear();
             controller.addSelectedObject(tempCps);
+            if(tempCps instanceof CpsUpperNode)
+				controller.getObjectsInDepth();
         }
 
         dragged = false;