Browse Source

Merge branch 'Ohne_Drag_and_Drop' of https://git.tk.informatik.tu-darmstadt.de/carlos.garcia/praktikum-holons into Ohne_Drag_and_Drop

# Conflicts:
#	src/ui/controller/CategoryController.java
Teh-Hai Julian Zheng 8 years ago
parent
commit
43a221b8ce

BIN
.gradle/2.2.1/taskArtifacts/cache.properties.lock


BIN
.gradle/2.2.1/taskArtifacts/fileHashes.bin


BIN
.gradle/2.2.1/taskArtifacts/fileSnapshots.bin


BIN
.gradle/2.2.1/taskArtifacts/taskArtifacts.bin


+ 20 - 1
src/classes/HolonElement.java

@@ -1,5 +1,8 @@
 package classes;
 
+import java.awt.Point;
+import java.util.LinkedList;
+
 public class HolonElement {
 
 	/* Name of the gadget */
@@ -24,7 +27,9 @@ public class HolonElement {
 	 * Energy at each point of the graph with 50 predefined points. At the
 	 * beginning, it starts with all values at energy
 	 */
-	float[] energyAt = new float[49];
+	float[] energyAt = new float[50];
+	//Points on the UnitGraph
+	LinkedList<Point> graphPoints = new LinkedList<>();
 
 	public HolonElement(String eleName, float energy, int amount) {
 		setEleName(eleName);
@@ -194,5 +199,19 @@ public class HolonElement {
 	public void setObj(String obj) {
 		this.obj = obj;
 	}
+	
+	/**
+	 * @return the Graph Points
+	 */
+	public LinkedList<Point> getGraphPoints() {
+		return graphPoints;
+	}
+
+	/**
+	 * @param points, the Graph points
+	 */
+	public void setGraphPoints(LinkedList<Point> points) {
+		this.graphPoints = points;
+	}
 
 }

+ 10 - 2
src/ui/controller/CategoryController.java

@@ -145,10 +145,14 @@ public class CategoryController {
 	 * @param obj
 	 *            New Object Name
 	 */
-	public void addNewHolonTransformer(Category cat, String objName, String image) {
+	public void addNewHolonTransformer(Category cat, String objName) {
 		HolonTransformer transformer = new HolonTransformer(objName);
+<<<<<<< HEAD
 		transformer.setImage(image);
 		transformer.setSav(cat.getName());
+=======
+		transformer.setImage("/Images/transformer.png");
+>>>>>>> abbd669b445b1c4cdebcd61b2925a22ed62217e5
 		addObject(cat, transformer);
 	}
 
@@ -160,10 +164,14 @@ public class CategoryController {
 	 * @param obj
 	 *            New Object Name
 	 */
-	public void addNewHolonSwitch(Category cat, String objName, String image) {
+	public void addNewHolonSwitch(Category cat, String objName) {
 		HolonSwitch holonSwitch = new HolonSwitch(objName);
+<<<<<<< HEAD
 		holonSwitch.setImage(image);
 		holonSwitch.setSav(cat.getName());
+=======
+		holonSwitch.setImage("/Images/switch-on.png");
+>>>>>>> abbd669b445b1c4cdebcd61b2925a22ed62217e5
 		addObject(cat, holonSwitch);
 	}
 

+ 21 - 4
src/ui/controller/Control.java

@@ -50,12 +50,12 @@ public class Control {
 	// categoryController.addObject(cat, object);
 	// }
 
-	public void addTransformer(Category cat, String objName, String image) {
-		categoryController.addNewHolonTransformer(cat, objName, image);
+	public void addTransformer(Category cat, String objName) {
+		categoryController.addNewHolonTransformer(cat, objName);
 	}
 
-	public void addSwitch(Category cat, String objName, String image) {
-		categoryController.addNewHolonSwitch(cat, objName, image);
+	public void addSwitch(Category cat, String objName) {
+		categoryController.addNewHolonSwitch(cat, objName);
 	}
 
 	public Category searchCategory(String name) {
@@ -79,6 +79,10 @@ public class Control {
 	public void removeEdgesOnCanvas(CpsEdge edge) {
 		canvasController.removeEdgesOnCanvas(edge);
 	}
+	
+	public void setSelecteEdge(CpsEdge edge){
+		MODEL.setSelectedEdge(edge);
+	}
 
 	public void addObjectCanvas(CpsObject object) {
 		canvasController.addObjectIntoCanvas(object);
@@ -111,6 +115,16 @@ public class Control {
 	public CpsObject searchByID(int ID){
 		return objectController.searchByID(ID);
 	}
+	
+	public CpsObject searchObjInCat(String objName, String catName){
+		Category cat = searchCategory(catName);
+		for(CpsObject hl : cat.getObjects()){
+			if(hl.getCompareName().equals(objName)){
+				return hl;
+			}
+		}
+		return null;
+	}
 
 	/* Global Operations */
 	public int getScale() {
@@ -125,6 +139,9 @@ public class Control {
 		globalController.setScale(s);
 	}
 	
+	public void setCurIteration(int cur_it) {
+		globalController.setCurIteration(cur_it);
+	}
 	
 	/* Operations for Loading and Storing */
 	public void writeFile() throws IOException {

+ 9 - 0
src/ui/controller/GlobalController.java

@@ -36,5 +36,14 @@ public class GlobalController {
 	public void setScale(int s){
 		MODEL.setScale(s);
 	}
+	
+	/**
+	 * sets the current Iteration
+	 * 
+	 * @param cur_it, the current Iteration
+	 */
+	public void setCurIteration(int cur_it) {
+		MODEL.setCurIteration(cur_it);
+	}
 
 }

+ 39 - 1
src/ui/model/Model.java

@@ -19,10 +19,11 @@ public class Model {
 	private static int SCALE = 50; // Picture Scale
 	private static int SCALE_DIV2 = SCALE / 2;
 	private static final int ITERATIONS = 50;
-
+	private int CUR_ITERATION = 0;
 	// ID of the Selected Object
 	private CpsObject selectedCpsObject;
 	private HolonElement selectedHolonElement;
+	private CpsEdge selectedEdge;
 
 	private int selectedID = 0;
 	// eventuell wenn Canvasgröße gewählt werden kann
@@ -238,5 +239,42 @@ public class Model {
 	public int getIterations() {
 		return ITERATIONS;
 	}
+	
+	/**
+	 * sets the current Iteration
+	 * 
+	 * @param cur_it, the current Iteration
+	 */
+	public void setCurIteration(int cur_it) {
+		this.CUR_ITERATION = cur_it;
+	}
+
+	/**
+	 * Returns CUR_ITERATIONS
+	 * 
+	 * @return CUR_ITERATIONS
+	 */
+	public int getCurIteration() {
+		return CUR_ITERATION;
+	}
+
+	/**
+	 * Set the selected Edge
+	 * 
+	 * @param edge
+	 * 
+	 */
+	public void setSelectedEdge(CpsEdge edge) {
+		this.selectedEdge = edge;
+	}
+	
+	/**
+	 * Returns the selected Edge
+	 * 
+	 * @return selectedEdge
+	 */
+	public CpsEdge getSelectedEdge(){
+		return selectedEdge;
+	}
 
 }

+ 5 - 0
src/ui/view/AddElementPopUp.java

@@ -148,6 +148,11 @@ public class AddElementPopUp extends JDialog {
 				JButton cancelButton = new JButton("Cancel");
 				cancelButton.setActionCommand("Cancel");
 				buttonPane.add(cancelButton);
+				cancelButton.addActionListener(new ActionListener() {
+					public void actionPerformed(ActionEvent e) {
+						dispose();
+					}
+				});
 			}
 		}
 	}

+ 55 - 22
src/ui/view/AddObjectPopUp.java

@@ -5,9 +5,20 @@ import java.awt.Color;
 import java.awt.Component;
 import java.awt.FlowLayout;
 import java.awt.Image;
-import java.awt.event.*;
-import java.awt.image.ImageProducer;
-import java.io.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLDecoder;
+import java.security.CodeSource;
 import java.util.ArrayList;
 
 import javax.swing.DefaultListModel;
@@ -15,25 +26,17 @@ import javax.swing.ImageIcon;
 import javax.swing.JButton;
 import javax.swing.JDialog;
 import javax.swing.JFileChooser;
+import javax.swing.JLabel;
+import javax.swing.JList;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
-import javax.swing.ListModel;
-import javax.swing.ListSelectionModel;
-import javax.swing.border.EmptyBorder;
-import javax.swing.filechooser.FileNameExtensionFilter;
-import javax.swing.JLabel;
 import javax.swing.JTextField;
-import javax.swing.JList;
-import javax.swing.JOptionPane;
 import javax.swing.SwingConstants;
+import javax.swing.border.EmptyBorder;
+import javax.swing.filechooser.FileNameExtensionFilter;
 
-import classes.Category;
 import classes.HolonElement;
 import classes.HolonObject;
-
-import javax.swing.JScrollBar;
-import javax.swing.ScrollPaneConstants;
-
 import ui.controller.Control;
 
 public class AddObjectPopUp extends JDialog {
@@ -211,10 +214,12 @@ public class AddObjectPopUp extends JDialog {
 								// HolonObject(objectName.getText());
 								// theObject.setElements(hElements);
 								// theObject.setImage(imagePath);
-								controller.addObject(controller.searchCategory(givenCategory), objectName.getText(), hElements, imagePath);
-//								controller.addObjectCategory(controller.searchCategory(givenCategory), theObject);
-//								
-//								System.out.println(theObject.getImage());
+								controller.addObject(controller.searchCategory(givenCategory), objectName.getText(),
+										hElements, imagePath);
+								// controller.addObjectCategory(controller.searchCategory(givenCategory),
+								// theObject);
+								//
+								// System.out.println(theObject.getImage());
 								System.out.println(givenCategory);
 								dispose();
 							} else
@@ -259,7 +264,6 @@ public class AddObjectPopUp extends JDialog {
 			selectedFile = FileChooser.getSelectedFile();
 			filePath = selectedFile.getAbsolutePath();
 			sourcePath.setText(filePath);
-			// Image image = createImage((ImageProducer) selectedFile);
 			ImageIcon icon = new ImageIcon(
 					new ImageIcon(filePath).getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH));
 			lblImagePreview.setIcon(icon);
@@ -272,10 +276,23 @@ public class AddObjectPopUp extends JDialog {
 	protected void copieFile() {
 		InputStream inStream = null;
 		OutputStream outStream = null;
+		String jarLocation = "";
 		try {
 			File source = new File(filePath);
-			File dest = new File(System.getProperty("user.dir") + "/bin/Images/", selectedFile.getName());
-			imagePath = "/Images/" + selectedFile.getName();
+			// File dest = new File(System.getProperty("user.dir") +
+			// "/bin/Images/", selectedFile.getName());
+			// imagePath = "/Images/" + selectedFile.getName();
+			try {
+				jarLocation = getJarContainingFolder(this.getClass());
+			} catch (Exception e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+			File dest = new File(jarLocation + "/HolonGUI/Images/");
+			dest.mkdirs();
+
+			dest = new File(dest, selectedFile.getName());
+			imagePath = jarLocation + "/HolonGUI/Images/" + selectedFile.getName();
 			inStream = new FileInputStream(source);
 			outStream = new FileOutputStream(dest);
 			byte[] buffer = new byte[1024];
@@ -295,6 +312,22 @@ public class AddObjectPopUp extends JDialog {
 		}
 	}
 
+	public static String getJarContainingFolder(Class aclass) throws Exception {
+		CodeSource codeSource = aclass.getProtectionDomain().getCodeSource();
+
+		File jarFile;
+
+		if (codeSource.getLocation() != null) {
+			jarFile = new File(codeSource.getLocation().toURI());
+		} else {
+			String path = aclass.getResource(aclass.getSimpleName() + ".class").getPath();
+			String jarFilePath = path.substring(path.indexOf(":") + 1, path.indexOf("!"));
+			jarFilePath = URLDecoder.decode(jarFilePath, "UTF-8");
+			jarFile = new File(jarFilePath);
+		}
+		return jarFile.getParentFile().getAbsolutePath();
+	}
+
 	public HolonObject getObject() {
 		return theObject;
 	}

+ 25 - 0
src/ui/view/DefaulTable.java

@@ -0,0 +1,25 @@
+package ui.view;
+
+import javax.swing.table.DefaultTableModel;
+
+public class DefaulTable extends DefaultTableModel {
+	private boolean[][] editable_cells; // 2d array to represent rows and
+										// columns
+
+	DefaulTable(int rows, int cols) { // constructor
+		super(rows, cols);
+		this.editable_cells = new boolean[rows][cols];
+	}
+
+	@Override
+	public boolean isCellEditable(int row, int column) { // custom //
+														// isCellEditable
+															// function
+		return this.editable_cells[row][column];
+	}
+
+	public void setCellEditable(int row, int col, boolean value) {
+		this.editable_cells[row][col] = value; // set cell true/false
+		this.fireTableCellUpdated(row, col);
+	}
+}

+ 169 - 56
src/ui/view/GUI.java

@@ -2,11 +2,13 @@ package ui.view;
 
 import java.io.File;
 import java.util.ArrayList;
+
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JMenuBar;
 import javax.swing.JMenu;
 import javax.swing.JMenuItem;
+import javax.swing.JSlider;
 import javax.swing.JOptionPane;
 import javax.swing.JTree;
 import javax.swing.border.LineBorder;
@@ -18,6 +20,8 @@ import javax.swing.JTable;
 import javax.swing.tree.DefaultTreeModel;
 import javax.swing.tree.TreeCellRenderer;
 
+import com.sun.javafx.geom.Edge;
+
 import ui.controller.Control;
 import ui.model.*;
 
@@ -25,6 +29,7 @@ import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.JEditorPane;
 import javax.swing.JFileChooser;
 import javax.swing.table.DefaultTableModel;
+
 import java.awt.Color;
 import java.awt.Component;
 import java.awt.Cursor;
@@ -57,8 +62,10 @@ import java.awt.event.MouseListener;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.awt.event.ActionEvent;
+
 import javax.swing.JSlider;
 import javax.swing.event.ChangeListener;
+import javax.swing.event.TableModelEvent;
 import javax.swing.event.ChangeEvent;
 
 public class GUI implements CategoryListener {
@@ -109,7 +116,8 @@ public class GUI implements CategoryListener {
 	// HolonObject, such as connections, name, Type, etc.
 
 	private JTable tableProperties = new JTable();
-	private DefaultTableModel tableModelProperties = new DefaultTableModel();
+	private JPanel graphLabel = new JPanel();
+	private DefaulTable tableModelProperties;
 	private final JScrollPane scrollProperties = new JScrollPane();
 
 	// In this section is the graph for the selected HolonElement of the clicked
@@ -152,12 +160,12 @@ public class GUI implements CategoryListener {
 	private int yValueElements = 0;
 
 	private MyCanvas canvas;
-	private UnitGraph testgraph; // for testing, remove later
+	private UnitGraph unitGraph; // for testing, remove later
 	private final JSplitPane splitPane_3 = new JSplitPane();
 	private final JSlider sizeSlider = new JSlider();
 	private final JLabel lblImageSize = new JLabel("Image Size");
 	// Time Stuff
-	private final TimePanel timePanel;
+	private TimePanel timePanel;
 
 	/**
 	 * Create the application.
@@ -166,10 +174,7 @@ public class GUI implements CategoryListener {
 		this.controller = control;
 		this.model = control.getModel();
 		this.canvas = new MyCanvas(model, control);
-		this.testgraph = new UnitGraph(model, control); // for testing, remove
-
-		timePanel = new TimePanel(model, controller);
-		timePanel.setBorder(null);
+		this.unitGraph = new UnitGraph(model, control); // for testing, remove
 
 		// later
 		control.initListener(this);
@@ -227,7 +232,7 @@ public class GUI implements CategoryListener {
 
 		mnHelp.add(aboutUs);
 
-		testgraph.setBackground(Color.WHITE);
+		unitGraph.setBackground(Color.WHITE);
 
 		canvas.setBackground(Color.WHITE);
 		canvas.setPreferredSize(new Dimension(10000, 10000));
@@ -260,12 +265,12 @@ public class GUI implements CategoryListener {
 
 		// Set up of the Properties section
 		Object[] colNames = { "Field", "Information" };
+		tableModelProperties = new DefaulTable(100, colNames.length);
 		tableModelProperties.setColumnIdentifiers(colNames);
 		tableProperties.setModel(tableModelProperties);
 		tableProperties.setFillsViewportHeight(true);
 		tableProperties.setCellSelectionEnabled(true);
 		tableProperties.setColumnSelectionAllowed(true);
-
 		// Set up of the Graph section
 
 		Object[] tempText = { "Here comes the graph for each clicked HolonElement" };
@@ -280,13 +285,11 @@ public class GUI implements CategoryListener {
 		 */
 		scrollProperties.setViewportView(tableProperties);
 		tableHolonElementScrollPane.setViewportView(tableHolonElement);
-		scrollGraph.setViewportView(testgraph);
-		JPanel graphLabel = new JPanel();
-		graphLabel.setLayout(new BoxLayout(graphLabel, BoxLayout.Y_AXIS));
-		minGraph.setBounds(0, 150, 10, 10);
-		graphLabel.add(maxGraph);
-		graphLabel.add(medGraph);
-		graphLabel.add(minGraph);
+		scrollGraph.setViewportView(unitGraph);
+		graphLabel.setLayout(new BorderLayout(0, 10));
+		graphLabel.add(maxGraph, BorderLayout.NORTH);
+		graphLabel.add(medGraph, BorderLayout.CENTER);
+		graphLabel.add(minGraph, BorderLayout.SOUTH);
 		toolBarGraph.add(elementGraph);
 		comboBoxGraph.setModel(new DefaultComboBoxModel(new String[] { "Day", "Month", "Year" }));
 		toolBarGraph.add(comboBoxGraph);
@@ -310,16 +313,17 @@ public class GUI implements CategoryListener {
 						&& tempCpsObject.getID() != 0) {
 					addElementPopUp = new AddElementPopUp();
 					addElementPopUp.setVisible(true);
-					controller.addElementCanvasObject(tempCpsObject.getName(),
-							addElementPopUp.getElement().getEleName(), addElementPopUp.getElement().getAmount(),
-							addElementPopUp.getElement().getEnergy());
+					controller.addElementCanvasObject(tempCpsObject.getID(), addElementPopUp.getElement().getEleName(),
+							addElementPopUp.getElement().getAmount(), addElementPopUp.getElement().getEnergy());
+					refreshTableHolonElement();
+					refreshTableProperties();
 				}
 			}
 		});
 		resetGraphBtn.addActionListener(new ActionListener() {
 
 			public void actionPerformed(ActionEvent arg0) {
-				testgraph.reset();
+				unitGraph.reset();
 			}
 		});
 		toolBarHolonEl.add(btnDelHolEL);
@@ -330,11 +334,12 @@ public class GUI implements CategoryListener {
 					tempElement = getActualHolonElement(obj, yValueElements);
 					if (tempElement != null && obj.getClass() == HolonObject.class && obj.getID() != 0) {
 						controller.deleteElementCanvas(obj.getID(), tempElement.getEleName());
+						refreshTableHolonElement();
+						refreshTableProperties();
 					}
 				}
 			}
 		});
-
 		tableHolonElement.addMouseListener(new MouseAdapter() {
 			public void mousePressed(MouseEvent e) {
 				HolonObject obj = (HolonObject) getActualCps();
@@ -342,12 +347,28 @@ public class GUI implements CategoryListener {
 				HolonElement ele = getActualHolonElement(obj, yValueElements);
 				if (ele != null) {
 					elementGraph.setText(ele.getEleName() + " ");
-					testgraph.repaintWithNewElement(ele);
+					unitGraph.repaintWithNewElement(ele);
 				} else {
 					elementGraph.setText("None ");
 				}
 			}
 		});
+
+		tableProperties.addMouseListener(new MouseAdapter() {
+			public void mousePressed(MouseEvent e) {
+				int selectedX = (int) Math
+						.floor(e.getX() / (tableProperties.getColumnModel().getTotalColumnWidth() / 2));
+				int selectedY = (int) Math.floor(e.getY() / 16);
+				if (tableModelProperties.isCellEditable(selectedY, selectedX) && e.getClickCount() == 2) {
+					if (getActualCps() != null) {
+						
+						tableModelProperties.fireTableCellUpdated(selectedY, selectedX);
+					} else {
+						System.out.println("Edge");
+					}
+				}
+			}
+		});
 		frmCyberPhysical.getContentPane().setLayout(new BorderLayout(0, 0));
 
 		TreeCellRenderer customRenderer = new TreeCellRenderer() {
@@ -360,9 +381,15 @@ public class GUI implements CategoryListener {
 					for (Category cat : model.getCategories()) {
 						for (CpsObject cps : cat.getObjects()) {
 							if (value.toString().compareTo(cps.getCompareName()) == 0) {
-								imgR = new ImageIcon(this.getClass().getResource(cps.getImage())).getImage()
-										.getScaledInstance(controller.getScale(), controller.getScale(),
-												java.awt.Image.SCALE_SMOOTH);
+								File checkPath = new File(cps.getImage());
+								if (checkPath.exists()) {
+									imgR = new ImageIcon(cps.getImage()).getImage().getScaledInstance(
+											controller.getScale(), controller.getScale(), java.awt.Image.SCALE_SMOOTH);
+								} else {
+									imgR = new ImageIcon(this.getClass().getResource(cps.getImage())).getImage()
+											.getScaledInstance(controller.getScale(), controller.getScale(),
+													java.awt.Image.SCALE_SMOOTH);
+								}
 								if (imgR != null) {
 									label.setIcon(new ImageIcon(imgR));
 								}
@@ -431,12 +458,31 @@ public class GUI implements CategoryListener {
 			public void mousePressed(MouseEvent e) {
 				try {
 					actualObjectClicked = tree.getPathForLocation(e.getX(), e.getY()).getLastPathComponent().toString();
+					// if an Object was selected, the porperties are shown in
+					// the table
+					DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
+							.getPathForLocation(e.getX(), e.getY()).getLastPathComponent();
+					if (selectedNode.getLevel() == 2) {
+						CpsObject selected = controller.searchObjInCat(selectedNode.toString(),
+								selectedNode.getParent().toString());
+						deleteRows();
+						if (selected instanceof HolonObject && selected != null) {
+							selected = (HolonObject) selected;
+							fillElementTable(((HolonObject) selected).getElements());
+						}
+					}
 					for (Category cat : model.getCategories()) {
 						for (CpsObject cps : cat.getObjects()) {
 							if (actualObjectClicked.compareTo(cps.getCompareName()) == 0) {
-								img = new ImageIcon(this.getClass().getResource(cps.getImage())).getImage()
-										.getScaledInstance(controller.getScale(), controller.getScale(),
-												java.awt.Image.SCALE_SMOOTH);
+								File checkPath = new File(cps.getImage());
+								if (checkPath.exists()) {
+									img = new ImageIcon(cps.getImage()).getImage().getScaledInstance(
+											controller.getScale(), controller.getScale(), java.awt.Image.SCALE_SMOOTH);
+								} else {
+									img = new ImageIcon(this.getClass().getResource(cps.getImage())).getImage()
+											.getScaledInstance(controller.getScale(), controller.getScale(),
+													java.awt.Image.SCALE_SMOOTH);
+								}
 								tempCps = cps;
 								dragging = true;
 								Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor(img, new Point(0, 0),
@@ -516,18 +562,7 @@ public class GUI implements CategoryListener {
 			@Override
 			public void mousePressed(MouseEvent e) {
 				// Update of the Information about the HolonElements - only for
-				// HolonObjects
-				if (tableModelHolonElement.getRowCount() > 0) {
-					for (int i = tableModelHolonElement.getRowCount() - 1; i > -1; i--) {
-						tableModelHolonElement.removeRow(i);
-					}
-				}
-				if (canvas.dataSelected != null) {
-					for (HolonElement he : canvas.dataSelected) {
-						Object[] temp = { he.getEleName(), he.getEnergy(), he.getAmount() };
-						tableModelHolonElement.addRow(temp);
-					}
-				}
+				refreshTableHolonElement();
 
 				// Update of the Information about the Properties - only for
 				// CpsObjects
@@ -547,6 +582,8 @@ public class GUI implements CategoryListener {
 						Object[] tempEnergy = { "Total Energy", ((HolonObject) canvas.tempCps).getCurrentEnergy() };
 						tableModelProperties.addRow(tempEnergy);
 					}
+					tableModelProperties.setCellEditable(0, 1, true);
+					tableModelProperties.setCellEditable(2, 1, false);
 					ArrayList<CpsEdge> temp_array = canvas.tempCps.getConnectedTo();
 					if (!temp_array.isEmpty()) {
 						boolean first = true;
@@ -577,6 +614,16 @@ public class GUI implements CategoryListener {
 							}
 						}
 					}
+				} else if (model.getSelectedEdge() != null) {
+					Object[] tempName = { "Name", "Edge: " + model.getSelectedEdge().getA().getName() + " to "
+							+ model.getSelectedEdge().getB().getName() };
+					tableModelProperties.addRow(tempName);
+					Object[] tempFlow = { "Current flow", model.getSelectedEdge().getFlow() };
+					tableModelProperties.addRow(tempFlow);
+					Object[] tempCapacity = { "Max. Capacity", model.getSelectedEdge().getCapacity() };
+					tableModelProperties.addRow(tempCapacity);
+					tableModelProperties.setCellEditable(0, 1, false);
+					tableModelProperties.setCellEditable(2, 1, true);
 				}
 			}
 
@@ -595,16 +642,17 @@ public class GUI implements CategoryListener {
 							for (int c = 0; c < tableModelHolonElement.getColumnCount(); c++) {
 								temp.add(tableHolonElement.getValueAt(r, c));
 							}
-							float ch;
-							if (temp.get(1).toString().compareTo("-") == 0) {
-								ch = -1;
-							} else {
-								ch = 1;
-							}
-							float fa = Float.parseFloat(temp.get(2).toString());
-							int i = Integer.parseInt(temp.get(3).toString());
+							// float ch;
+							// if (temp.get(1).toString().compareTo("-") == 0) {
+							// ch = -1;
+							// } else {
+							// ch = 1;
+							// }
+							float fa = Float.parseFloat(temp.get(1).toString());
+							int i = Integer.parseInt(temp.get(2).toString());
 							((HolonObject) tempCps).getElements().get(r).setEleName((String) temp.get(0));
-							((HolonObject) tempCps).getElements().get(r).setSign(ch);
+							// ((HolonObject)
+							// tempCps).getElements().get(r).setSign(ch);
 							((HolonObject) tempCps).getElements().get(r).setEnergy(fa);
 							((HolonObject) tempCps).getElements().get(r).setAmount(i);
 							// System.out.println(tableHolonElement.getRowCount()
@@ -646,10 +694,8 @@ public class GUI implements CategoryListener {
 								JOptionPane.YES_NO_OPTION);
 						if (dialogResult == JOptionPane.YES_OPTION) {
 							controller.deleteCategory(nodeName);
-							break;
-						} else {
-							break;
 						}
+						break;
 					case 2:
 						DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode.getParent();
 						controller.delObjectCategory(nodeName, parent.getUserObject().toString());
@@ -686,6 +732,16 @@ public class GUI implements CategoryListener {
 			}
 		});
 
+		timePanel = new TimePanel(model, controller);
+		timePanel.setBorder(null);
+		((JSlider) (timePanel.getComponent(1))).addChangeListener(new ChangeListener() {
+
+			@Override
+			public void stateChanged(ChangeEvent e) {
+				unitGraph.repaint();
+			}
+		});
+
 		splitPane.setRightComponent(splitPane_1);
 		splitPane.setDividerLocation(200);
 		splitPane_1.setDividerLocation(500);
@@ -734,11 +790,11 @@ public class GUI implements CategoryListener {
 					switch (objType) {
 
 					case "Switch":
-						controller.addSwitch(cat, objname, objType);
+						controller.addSwitch(cat, objname);
 						break;
 
 					case "Transformer":
-						controller.addTransformer(cat, objname, objType);
+						controller.addTransformer(cat, objname);
 						break;
 					}
 				}
@@ -787,15 +843,27 @@ public class GUI implements CategoryListener {
 		return frmCyberPhysical;
 	}
 
+	/**
+	 * Getter for selected CpsObject
+	 * 
+	 * @return selected CpsObject
+	 */
 	public CpsObject getActualCps() {
 		int tempID = model.getSelectedObjectID();
 		CpsObject tempCps = controller.searchByID(tempID);
-		System.out.println(tempCps.getID());
 		return tempCps;
 	}
 
+	/**
+	 * Search for actual selected HolonElement
+	 * 
+	 * @param obj
+	 *            selected HolonObject
+	 * @param yValue
+	 *            Y-Coord in the HolonElementsTable
+	 * @return the selected HolonElement
+	 */
 	public HolonElement getActualHolonElement(HolonObject obj, int yValue) {
-		HolonObject tempCps = obj;
 		final int yTemp = (int) Math.floor(yValue / 16);
 		int rowsTotal = tableModelHolonElement.getRowCount();
 		if (rowsTotal != 0 && rowsTotal > yTemp) {
@@ -806,4 +874,49 @@ public class GUI implements CategoryListener {
 			return null;
 		}
 	}
+
+	/*
+	 * Refresh the Table displaying the HolonElements
+	 */
+	public void refreshTableHolonElement() {
+		// Update of the Information about the HolonElements - only for
+		// HolonObjects
+		deleteRows();
+		if (canvas.dataSelected != null) {
+			fillElementTable(canvas.dataSelected);
+		}
+		/**
+		 * hinzugef�gt damit man auch nach dem objekt platziert wurde elemente
+		 * von Objekten in Kategorien ansehen kann
+		 */
+		canvas.dataSelected = null;
+
+	}
+
+	public void deleteRows() {
+		if (tableModelHolonElement.getRowCount() > 0) {
+			for (int i = tableModelHolonElement.getRowCount() - 1; i > -1; i--) {
+				tableModelHolonElement.removeRow(i);
+			}
+		}
+	}
+
+	public void fillElementTable(ArrayList<HolonElement> elements) {
+		for (HolonElement he : elements) {
+			Object[] temp = { he.getEleName(), he.getEnergy(), he.getAmount() };
+			tableModelHolonElement.addRow(temp);
+		}
+	}
+
+	/**
+	 * Update the information about properties of the selected CpsObject
+	 */
+	public void refreshTableProperties() {
+		CpsObject tempCps = getActualCps();
+		if (tempCps.getClass() == HolonObject.class && tempCps != null) {
+			tableModelProperties.removeRow(2);
+			Object[] tempEnergy = { "Total Energy", ((HolonObject) canvas.tempCps).getCurrentEnergy() };
+			tableModelProperties.insertRow(2, tempEnergy);
+		}
+	}
 }

+ 20 - 11
src/ui/view/MyCanvas.java

@@ -13,6 +13,7 @@ import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
 import java.awt.event.MouseMotionListener;
 import java.awt.geom.Line2D;
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Timer;
 import java.util.TimerTask;
@@ -107,6 +108,7 @@ class MyCanvas extends JPanel implements MouseListener, MouseMotionListener {
 		for (CpsEdge con : model.getEdgesOnCanvas()) {
 			if (con.getA().getID() != model.getSelectedObjectID() && con.getB().getID() != model.getSelectedObjectID()
 					&& con != edgeHighlight) {
+				g2.setStroke(new BasicStroke(con.getFlow()/con.getCapacity()*4));
 				g2.drawLine(con.getA().getPosition().x + controller.getScaleDiv2(),
 						con.getA().getPosition().y + controller.getScaleDiv2(),
 						con.getB().getPosition().x + controller.getScaleDiv2(),
@@ -147,8 +149,13 @@ class MyCanvas extends JPanel implements MouseListener, MouseMotionListener {
 
 		// Objects
 		for (CpsObject cps : model.getObjectsOnCanvas()) {
-			img = new ImageIcon(this.getClass().getResource(cps.getImage())).getImage();
-
+			File checkPath = new File(cps.getImage());
+			if (checkPath.exists()) {
+				img = new ImageIcon(cps.getImage()).getImage();
+				
+			} else {
+				img = new ImageIcon(this.getClass().getResource(cps.getImage())).getImage();
+			}
 			g2.drawImage(img, cps.getPosition().x, cps.getPosition().y, controller.getScale(), controller.getScale(),
 					null);
 
@@ -186,6 +193,7 @@ class MyCanvas extends JPanel implements MouseListener, MouseMotionListener {
 		tempCps = null;
 		dataSelected = null;
 		edgeHighlight = null;
+		controller.setSelecteEdge(null);
 		// Object Selection
 		for (CpsObject cps : model.getObjectsOnCanvas()) {
 			cx = cps.getPosition().x;
@@ -206,6 +214,7 @@ class MyCanvas extends JPanel implements MouseListener, MouseMotionListener {
 		// Edge Selection
 		if (tempCps == null) {
 			edgeHighlight = mousePositionOnEdge(x, y);
+			controller.setSelecteEdge(edgeHighlight);
 		}
 		// Object Selection Highlighting (selectRect)
 		objectSelectionHighlighting();
@@ -324,8 +333,8 @@ class MyCanvas extends JPanel implements MouseListener, MouseMotionListener {
 		boolean onEdge = true;
 		boolean deleteNode = false;
 		CpsEdge e = null;
-		CpsObject tempCPS = null; 
-		
+		CpsObject tempCPS = null;
+
 		for (CpsObject cps : model.getObjectsOnCanvas()) {
 			cx = cps.getPosition().x;
 			cy = cps.getPosition().y;
@@ -347,7 +356,7 @@ class MyCanvas extends JPanel implements MouseListener, MouseMotionListener {
 					if (e.getA().getClass() == CpsNode.class && e.getA().getConnections().isEmpty()) {
 						tempCps = e.getA();
 						deleteNode = true;
-					} 
+					}
 					if (e.getB().getClass() == CpsNode.class && e.getB().getConnections().isEmpty()) {
 						tempCPS = e.getB();
 						deleteNode = true;
@@ -361,7 +370,7 @@ class MyCanvas extends JPanel implements MouseListener, MouseMotionListener {
 				}
 			}
 		}
-		//Auf eine Edge gezoggen?
+		// Auf eine Edge gezoggen?
 		if (onEdge) {
 			CpsEdge p = mousePositionOnEdge(x, y);
 			if (p != null) {
@@ -401,8 +410,8 @@ class MyCanvas extends JPanel implements MouseListener, MouseMotionListener {
 				controller.AddEdgeOnCanvas(e2);
 			}
 		}
-		
-		//ins leere Gedragged
+
+		// ins leere Gedragged
 		if (node) {
 			CpsNode n = new CpsNode("Node");
 			n.setPosition(x - model.getScaleDiv2(), y - model.getScaleDiv2());
@@ -415,9 +424,9 @@ class MyCanvas extends JPanel implements MouseListener, MouseMotionListener {
 			controller.AddEdgeOnCanvas(e);
 			System.out.println("node ID: " + n.getID());
 		}
-		
-		//Wenn ein Node ohne Connections da ist
-		if(deleteNode){
+
+		// Wenn ein Node ohne Connections da ist
+		if (deleteNode) {
 			controller.deleteObjectOnCanvas(tempCps);
 			controller.deleteObjectOnCanvas(tempCPS);
 			tempCPS = null;

+ 23 - 4
src/ui/view/TimePanel.java

@@ -13,6 +13,8 @@ import javax.swing.JPanel;
 import javax.swing.JSlider;
 import javax.swing.Timer;
 import javax.swing.border.LineBorder;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 
 import ui.controller.Control;
 import ui.model.Model;
@@ -46,7 +48,8 @@ public class TimePanel extends JPanel {
 			@Override
 			public void actionPerformed(ActionEvent ae) {
 				timeSlider.setValue(timeSlider.getValue() + 1);
-				if (timeSlider.getValue() == model.getIterations()) {
+				controller.setCurIteration(timeSlider.getValue());
+				if (timeSlider.getValue() == model.getIterations()-1) {
 					running = false;
 					playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/play.png"))
 							.getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
@@ -62,15 +65,25 @@ public class TimePanel extends JPanel {
 		timeSlider.setPaintTicks(true);
 		timeSlider.setPaintLabels(true);
 		timeSlider.setMinorTickSpacing(1);
+		timeSlider.setMajorTickSpacing(5);
 		timeSlider.setToolTipText("Time Slider");
-		timeSlider.setMinimum(1);
-		timeSlider.setMaximum(model.getIterations());
-		timeSlider.setValue(1);
+		timeSlider.setMaximum(model.getIterations()-1);
+		timeSlider.setValue(0);
 		timeSlider.setBackground(Color.WHITE);
+		timeSlider.addChangeListener(new ChangeListener() {
+			@Override
+			public void stateChanged(ChangeEvent e) {
+				controller.setCurIteration(timeSlider.getValue());
+			}
+		});
+
+		// Panel
+		timeBtnPanel.setBorder(null);
 		timeBtnPanel.setBackground(Color.WHITE);
 
 		// Buttons
 		timeBtnPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
+		playBtn.setToolTipText("Play");
 
 		playBtn.setBackground(Color.WHITE);
 		playBtn.setBorderPainted(false);
@@ -92,6 +105,7 @@ public class TimePanel extends JPanel {
 				}
 			}
 		});
+		timeResetBtn.setToolTipText("Reset");
 
 		timeResetBtn.setBorderPainted(false);
 		timeResetBtn.setBackground(Color.WHITE);
@@ -101,8 +115,10 @@ public class TimePanel extends JPanel {
 		timeResetBtn.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent ae) {
 				timeSlider.setValue(timeSlider.getMinimum());
+				controller.setCurIteration(timeSlider.getValue());
 			}
 		});
+		timeForwardBtn.setToolTipText("Forward");
 
 		timeForwardBtn.setBorderPainted(false);
 		timeForwardBtn.setContentAreaFilled(false);
@@ -112,8 +128,10 @@ public class TimePanel extends JPanel {
 		timeForwardBtn.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent ae) {
 				timeSlider.setValue(timeSlider.getValue() + 1);
+				controller.setCurIteration(timeSlider.getValue());
 			}
 		});
+		timeBackwardBtn.setToolTipText("Backward");
 
 		timeBackwardBtn.setBackground(Color.WHITE);
 		timeBackwardBtn.setBorderPainted(false);
@@ -123,6 +141,7 @@ public class TimePanel extends JPanel {
 		timeBackwardBtn.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent ae) {
 				timeSlider.setValue(timeSlider.getValue() - 1);
+				controller.setCurIteration(timeSlider.getValue());
 			}
 		});
 

+ 240 - 103
src/ui/view/UnitGraph.java

@@ -11,76 +11,57 @@ import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
 import java.awt.event.MouseMotionListener;
 import java.awt.geom.CubicCurve2D;
+import java.awt.geom.Line2D;
+import java.util.LinkedList;
 import java.awt.Point;
 
 import javax.swing.JPanel;
 
+import classes.HolonElement;
 import ui.controller.Control;
 import ui.model.Model;
-import java.awt.BorderLayout;
-import javax.swing.JButton;
-import java.awt.event.ActionListener;
-import java.awt.event.ActionEvent;
-import java.awt.FlowLayout;
-import javax.swing.SwingConstants;
 
-import classes.HolonElement;
-import javax.swing.JLabel;
 import java.awt.Cursor;
 
 class UnitGraph extends JPanel implements MouseListener, MouseMotionListener, ComponentListener {
 
 	private static final long serialVersionUID = 1L;
-	private Control controller;
-	private Model model;
+	private int ITERATIONS = 50;
+	private int MAXIMUM = 1;
+
+	private Point recSize = new Point(8, 8); // Point Size
 	private Graphics2D g2;
 	private CubicCurve2D c = new CubicCurve2D.Double();
-	private Point[] pointList;
+	private LinkedList<Point> pointList;
+	private double scaleX;
+	private double scaleY;
+
+	private float[] arrayOfValue = null;
+
+	private double width = -1;
+	private double height = -1;
+
+	private HolonElement tempElement;
+	private Model model;
+	private Control controller;
 
-	private HolonElement temp = null;
 	private boolean pointDrag = false;
-	private int tempP;
+	private boolean init = false;
+	private Point tempP = null;
+	private double x = 0, y = 0;
 	private int x1, x2, y1, y2, ctrlx1, ctrly1, ctrlx2, ctrly2;
-	// private final JButton resetButton = new JButton("Reset Graph");
-	// private final JLabel lblName = new JLabel("Name");
 
 	public UnitGraph(final Model model, Control control) {
 		setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
 		this.controller = control;
 		this.model = model;
-		this.pointList = new Point[model.getIterations()];
-		for (int i = 0; i < pointList.length; i++) {
-			pointList[i] = new Point(0, 0);
-		}
+		this.ITERATIONS = model.getIterations();
+
+		this.pointList = new LinkedList<>();
 
 		this.addMouseListener(this);
 		this.addMouseMotionListener(this);
 		this.addComponentListener(this);
-
-		// lblName.setText("None");
-		// resetButton.setToolTipText("Resets the Graph");
-		// resetButton.setBackground(Color.WHITE);
-		//
-		// resetButton.addActionListener(new ActionListener() {
-		// public void actionPerformed(ActionEvent e) {
-		// reset();
-		// }
-		// });
-		setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
-
-		// add(lblName);
-		//
-		// add(resetButton);
-	}
-
-	/*
-	 * Resets the Graph
-	 */
-	public void reset() {
-		for (int i = 0; i < pointList.length; i++) {
-			pointList[i] = new Point((i) * this.getWidth() / (model.getIterations() - 1), this.getHeight() / 3);
-		}
-		repaint();
 	}
 
 	/**
@@ -92,62 +73,71 @@ class UnitGraph extends JPanel implements MouseListener, MouseMotionListener, Co
 	public void paintComponent(Graphics g) {
 		super.paintComponent(g);
 
+		if (arrayOfValue != null) {
+			for (int i = 0; i < arrayOfValue.length; i++) {
+				System.out.println(""+arrayOfValue[i]);
+				arrayOfValue[i] = getYValueAt((int) (i * width / (ITERATIONS - 1)));
+			}
+		}
+
 		g2 = (Graphics2D) g;
 		RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 		g2.setRenderingHints(rh);
 		g2.setStroke(new BasicStroke(1));
 
+		// Draw the Vertical Lines
 		g2.setColor(new Color(240, 240, 240));
-		for (int i = 0; i < pointList.length; i++) {
-			g2.drawLine((int) pointList[i].getX(), 0, (int) pointList[i].getX(), this.getHeight());
+		for (int i = 0; i < ITERATIONS; i++) {
+			g2.drawLine((i) * this.getWidth() / (ITERATIONS - 1), MAXIMUM, (i) * this.getWidth() / (ITERATIONS - 1),
+					this.getHeight());
 		}
 
-		g2.setColor(Color.BLACK);
-		g2.setStroke(new BasicStroke(2));
-		for (int i = 0; i < pointList.length - 1; i++) {
-			x1 = (int) pointList[i].getX();
-			y1 = (int) pointList[i].getY();
-			x2 = (int) pointList[i + 1].getX();
-			y2 = (int) pointList[i + 1].getY();
-			ctrlx1 = (int) pointList[i].getX() + ((int) pointList[i + 1].getX() - (int) pointList[i].getX()) / 2;
-			ctrlx2 = (int) pointList[i + 1].getX() - ((int) pointList[i + 1].getX() - (int) pointList[i].getX()) / 2;
-			if (y1 < y2) {
-				ctrly1 = (int) pointList[i].getY() + ((int) pointList[i + 1].getY() - (int) pointList[i].getY()) / 10;
-				ctrly2 = (int) pointList[i + 1].getY()
-						- ((int) pointList[i + 1].getY() - (int) pointList[i].getY()) / 10;
-			} else {
-				ctrly1 = (int) pointList[i].getY() - ((int) pointList[i].getY() - (int) pointList[i + 1].getY()) / 10;
-				ctrly2 = (int) pointList[i + 1].getY()
-						+ ((int) pointList[i].getY() - (int) pointList[i + 1].getY()) / 10;
-			}
-
-			c.setCurve(x1, y1, ctrlx1, ctrly1, ctrlx2, ctrly2, x2, y2);
+		for (int i = 0; i < ITERATIONS; i++) {
+			g2.drawLine(0, (i) * this.getHeight() / (ITERATIONS - 1), this.getWidth(),
+					(i) * this.getHeight() / (ITERATIONS - 1));
+		}
 
-			// draw the curve
+		// Draw the Lines
+		g2.setColor(Color.BLACK);
+		for (int i = 0; i < pointList.size() - 1; i++) {
+			c = buildCurve(pointList.get(i), pointList.get(i + 1));
 			g2.draw(c);
 		}
+
+		// Draw the Points
+		g2.setColor(Color.BLUE);
+		for (int i = 0; i < pointList.size() - 0; i++) {
+			g2.fillOval((int) (pointList.get(i).getX() * scaleX - recSize.getX() / 2),
+					(int) (pointList.get(i).getY() * scaleY - recSize.getY() / 2), (int) recSize.getX(),
+					(int) recSize.getY());
+		}
+		g2.drawLine((model.getCurIteration()) * this.getWidth() / (ITERATIONS - 1), MAXIMUM,
+				(model.getCurIteration()) * this.getWidth() / (ITERATIONS - 1), this.getHeight());
+
 	}
 
 	@Override
 	public void mouseDragged(MouseEvent e) {
-		if (temp != null) {
-			if (pointDrag && e.getY() >= this.getHeight() / 3 && tempP != -1) {
-				pointList[tempP].setLocation(pointList[tempP].getX(), e.getY());
-				if (tempP != 0 && pointList[tempP - 1].getY() < pointList[tempP].getY()
-						- (pointList[tempP].getY() - this.getHeight() / 3) / 2) {
-					pointList[tempP - 1].setLocation(pointList[tempP - 1].getX(),
-							pointList[tempP].getY() - (pointList[tempP].getY() - this.getHeight() / 3) / 2);
-				}
-				if (tempP != model.getIterations() - 1 && pointList[tempP + 1].getY() < pointList[tempP].getY()
-						- (pointList[tempP].getY() - this.getHeight() / 3) / 2) {
-					pointList[tempP + 1].setLocation(pointList[tempP + 1].getX(),
-							pointList[tempP].getY() - (pointList[tempP].getY() - this.getHeight() / 3) / 2);
-				}
-			} else if (tempP != -1) {
-				pointList[tempP].setLocation(pointList[tempP].getX(), this.getHeight() / 3);
+		if (pointDrag && tempP != null) {
+			// Out of Bounds verhindern
+			int i = pointList.indexOf(tempP);
+			x = e.getX() / scaleX;
+			y = e.getY() / scaleY;
+			// y
+			if (e.getY() <= MAXIMUM) {
+				y = MAXIMUM / scaleY;
+			} else if (this.getHeight() <= e.getY()) {
+				y = this.getHeight() / scaleY;
+			}
+			// x
+			if (tempP.getX() == 0 || tempP.getX() == this.getWidth() / scaleX || pointList.get(i + 1).getX() <= x
+					|| pointList.get(i - 1).getX() >= x) {
+				x = tempP.getX();
 			}
-			repaint();
+			tempP.setLocation(x, y);
 		}
+
+		repaint();
 	}
 
 	@Override
@@ -172,40 +162,77 @@ class UnitGraph extends JPanel implements MouseListener, MouseMotionListener, Co
 
 	@Override
 	public void mousePressed(MouseEvent e) {
-		for (int i = 0; i < pointList.length; i++) {
-			if (e.getX() - this.getWidth() / model.getIterations() / 2 <= pointList[i].getX()
-					&& e.getX() + this.getWidth() / model.getIterations() / 2 >= pointList[i].getX()
-					&& e.getY() - 10 < pointList[i].getY() && e.getY() + 10 > pointList[i].getY()) {
-				tempP = i;
-				pointDrag = true;
+		boolean added = false;
+		boolean deletePoint = false;
+
+		double x = e.getX() / scaleX;
+		double y = e.getY() / scaleY;
+
+		// Click on Point
+		tempP = null;
+		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) {
+					tempP = p;
+					deletePoint = true;
+				} else {
+					pointDrag = true;
+					tempP = p;
+				}
+			}
+		}
+		if (!pointDrag && e.getButton() != MouseEvent.BUTTON3 && e.getX() != 0
+				&& e.getX() != this.getWidth() / scaleX) {
+			for (int i = 0; i < pointList.size(); i++) {
+				if (x < pointList.get(i).getX() && !added) {
+					if (e.getY() <= MAXIMUM) {
+						pointList.add(i, new Point((int) (x), (int) (MAXIMUM / scaleY)));
+					} else {
+						pointList.add(i, new Point((int) (x), (int) y));
+					}
+					added = true;
+					pointDrag = true;
+					tempP = pointList.get(i);
+				}
 			}
 		}
+		if (deletePoint && tempP.getX() != 0
+				&& (tempP.getX() != this.getWidth() / scaleX || tempP != pointList.getLast())) {
+			pointList.remove(tempP);
+		}
+
+		repaint();
 	}
 
 	@Override
 	public void mouseReleased(MouseEvent e) {
 		if (pointDrag) {
 			pointDrag = false;
-			tempP = -1;
+			tempP = null;
 		}
 	}
 
-	public void repaintWithNewElement(HolonElement ele) {
-		reset();
-		float[] arrayOfValue = ele.getEnergyAt();
-		temp = ele;
-		// TODO
-	}
-
-	// resize listener
 	public void componentResized(ComponentEvent e) {
-		if (pointList[0].getY() != 0) {
-			reset();
-		} else {
-			for (int i = 0; i < pointList.length; i++) {
-				pointList[i] = new Point((i) * this.getWidth() / (model.getIterations() - 1), this.getHeight() / 3);
+		if (init) {
+			MAXIMUM = (int) convertToCanvasY(MAXIMUM);
+			init = false;
+			// for scale
+			if (width == -1 && height == -1) {
+				width = this.getWidth();
+				height = this.getHeight();
+			}
+
+			scaleX = this.getWidth() / width;
+			scaleY = this.getHeight() / height;
+
+			if (pointList.isEmpty()) {
+				pointList.addFirst(new Point(0, MAXIMUM));
+				pointList.addLast(new Point((int) (this.getWidth() / scaleX), MAXIMUM));
 			}
 		}
+		scaleX = this.getWidth() / width;
+		scaleY = this.getHeight() / height;
 		repaint();
 	}
 
@@ -222,4 +249,114 @@ class UnitGraph extends JPanel implements MouseListener, MouseMotionListener, Co
 	public void componentShown(ComponentEvent e) {
 	}
 
+	/*
+	 * Resets the Graph
+	 */
+	public void reset() {
+		pointList.removeAll(pointList);
+		pointList.addFirst(new Point(0, (int) (MAXIMUM / scaleY)));
+		pointList.addLast(new Point((int) (this.getWidth() / scaleX), (int) (MAXIMUM / scaleY)));
+		repaint();
+	}
+
+	/**
+	 * converts the number to fit the canvas
+	 * 
+	 * @param double
+	 *            d, the number to convert
+	 * @return the convertet number
+	 */
+	public double convertToCanvasY(int d) {
+		if ((this.getHeight() - (((((double) this.getHeight() * 3) / 4) / MAXIMUM) * d)) <= 0) {
+			return 1;
+		} else {
+			return (this.getHeight() - (((((double) this.getHeight())) / MAXIMUM) * d));
+		}
+	}
+
+	/**
+	 * Viusalise the HolonElement on the Graph
+	 * 
+	 * @param HolonElement
+	 *            ele, which should be visualized
+	 */
+	public void repaintWithNewElement(HolonElement ele) {
+		arrayOfValue = ele.getEnergyAt();
+		tempElement = ele;
+		pointList = ele.getGraphPoints();
+		init = true;
+		componentResized(null);
+		repaint();
+	}
+
+	/**
+	 * Build a Curve for the Graph
+	 * 
+	 * @param Point,Point
+	 *            ,startpoint p1 and endpoint p2
+	 * 
+	 * @return CubicCurve2D, c, the CubicCurve2D for the Graph
+	 */
+	public CubicCurve2D buildCurve(Point p1, Point p2) {
+		x1 = (int) p1.getX();
+		y1 = (int) p1.getY();
+		x2 = (int) p2.getX();
+		y2 = (int) p2.getY();
+		ctrlx1 = (int) p1.getX() + ((int) p2.getX() - (int) p1.getX()) / 2;
+		ctrlx2 = (int) p2.getX() - ((int) p2.getX() - (int) p1.getX()) / 2;
+		if (y1 < y2) {
+			ctrly1 = (int) p1.getY() + ((int) p2.getY() - (int) p1.getY()) / 10;
+			ctrly2 = (int) p2.getY() - ((int) p2.getY() - (int) p1.getY()) / 10;
+		} else {
+			ctrly1 = (int) p1.getY() - ((int) p1.getY() - (int) p2.getY()) / 10;
+			ctrly2 = (int) p2.getY() + ((int) p1.getY() - (int) p2.getY()) / 10;
+		}
+
+		c.setCurve(x1 * scaleX, y1 * scaleY, ctrlx1 * scaleX, ctrly1 * scaleY, ctrlx2 * scaleX, ctrly2 * scaleY,
+				x2 * scaleX, y2 * scaleY);
+		return c;
+	}
+
+	/**
+	 * 
+	 * @param xVal,
+	 *            the x value for the y value
+	 * @return y, the value at x
+	 */
+	public int getYValueAt(int xVal) {
+		for (int i = 0; i < pointList.size() - 1; i++) {
+			// get the Points
+			if (xVal > pointList.get(i + 1).getX()) {
+				x = pointList.get(i + 1).getX();
+				y = pointList.get(i).getX();
+
+				// Curve erstellen
+				c = buildCurve(pointList.get(i), pointList.get(i + 1));
+				Line2D l1 = new Line2D.Double(pointList.get(i).getX(), pointList.get(i).getY(),
+						pointList.get(i + 1).getX(), pointList.get(i + 1).getY());
+				Line2D l2 = new Line2D.Double(xVal, 0, xVal, height);
+				
+				return (int) getIntersectionPoint(l1, l2).getY();
+			}
+		}
+		return 0;
+	}
+
+	public Point getIntersectionPoint(Line2D l1, Line2D l2) {
+		if (!l1.intersectsLine(l2))
+			return null;
+		double px = l1.getX1(), py = l1.getY1(), rx = l1.getX2() - px, ry = l1.getY2() - py;
+		double qx = l2.getX1(), qy = l2.getY1(), sx = l2.getX2() - qx, sy = l2.getY2() - qy;
+
+		double det = sx * ry - sy * rx;
+		if (det == 0) {
+			return null;
+		} else {
+			double z = (sx * (qy - py) + sy * (px - qx)) / det;
+			if (z == 0 || z == 1)
+				return null; // intersection at end point!
+			return new Point((int) (px + z * rx), (int) (py + z * ry));
+		}
+	} // end intersection line-line
+
 }