ソースを参照

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

# Conflicts:
#	src/ui/view/GUI.java
#	src/ui/view/MyCanvas.java
Teh-Hai Julian Zheng 7 年 前
コミット
794553abf5
35 ファイル変更146 行追加108 行削除
  1. 1 0
      .gitignore
  2. 0 1
      .gradle/2.14/taskArtifacts/cache.properties
  3. BIN
      .gradle/2.14/taskArtifacts/cache.properties.lock
  4. BIN
      .gradle/2.14/taskArtifacts/fileHashes.bin
  5. BIN
      .gradle/2.14/taskArtifacts/fileSnapshots.bin
  6. BIN
      .gradle/2.14/taskArtifacts/fileSnapshotsToTreeSnapshotsIndex.bin
  7. BIN
      .gradle/2.14/taskArtifacts/taskArtifacts.bin
  8. BIN
      .gradle/2.14/taskArtifacts/treeSnapshotUsage.bin
  9. BIN
      .gradle/2.14/taskArtifacts/treeSnapshots.bin
  10. 0 1
      .gradle/2.2.1/taskArtifacts/cache.properties
  11. BIN
      .gradle/2.2.1/taskArtifacts/cache.properties.lock
  12. BIN
      .gradle/2.2.1/taskArtifacts/fileHashes.bin
  13. BIN
      .gradle/2.2.1/taskArtifacts/fileSnapshots.bin
  14. BIN
      .gradle/2.2.1/taskArtifacts/outputFileStates.bin
  15. BIN
      .gradle/2.2.1/taskArtifacts/taskArtifacts.bin
  16. BIN
      .gradle/3.2.1/taskArtifacts/fileHashes.bin
  17. BIN
      .gradle/3.2.1/taskArtifacts/fileSnapshots.bin
  18. BIN
      .gradle/3.2.1/taskArtifacts/taskArtifacts.bin
  19. BIN
      .gradle/3.2.1/taskArtifacts/taskArtifacts.lock
  20. BIN
      res/Button_Images/Thumbs.db
  21. BIN
      res/Button_Images/backward.png
  22. BIN
      res/Button_Images/forward.png
  23. BIN
      res/Button_Images/pause.png
  24. BIN
      res/Button_Images/play.png
  25. BIN
      res/Button_Images/reset.png
  26. BIN
      src/classes/AbstractCpsObject.class
  27. BIN
      src/classes/Category.class
  28. BIN
      src/classes/CpsNode.class
  29. BIN
      src/classes/HolonBody.class
  30. BIN
      src/classes/SubNet.class
  31. 14 7
      src/ui/view/ButtonTabComponent.java
  32. 56 27
      src/ui/view/GUI.java
  33. 9 11
      src/ui/view/MyCanvas.java
  34. 65 60
      src/ui/view/TimePanel.java
  35. 1 1
      src/ui/view/UpperNodeCanvas.java

+ 1 - 0
.gitignore

@@ -1,2 +1,3 @@
 bin/
 build/
+.gradle/

+ 0 - 1
.gradle/2.14/taskArtifacts/cache.properties

@@ -1 +0,0 @@
-#Tue Jul 05 09:50:14 CEST 2016

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


BIN
.gradle/2.14/taskArtifacts/fileHashes.bin


BIN
.gradle/2.14/taskArtifacts/fileSnapshots.bin


BIN
.gradle/2.14/taskArtifacts/fileSnapshotsToTreeSnapshotsIndex.bin


BIN
.gradle/2.14/taskArtifacts/taskArtifacts.bin


BIN
.gradle/2.14/taskArtifacts/treeSnapshotUsage.bin


BIN
.gradle/2.14/taskArtifacts/treeSnapshots.bin


+ 0 - 1
.gradle/2.2.1/taskArtifacts/cache.properties

@@ -1 +0,0 @@
-#Mon Jul 04 15:57:29 CEST 2016

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/outputFileStates.bin


BIN
.gradle/2.2.1/taskArtifacts/taskArtifacts.bin


BIN
.gradle/3.2.1/taskArtifacts/fileHashes.bin


BIN
.gradle/3.2.1/taskArtifacts/fileSnapshots.bin


BIN
.gradle/3.2.1/taskArtifacts/taskArtifacts.bin


BIN
.gradle/3.2.1/taskArtifacts/taskArtifacts.lock


BIN
res/Button_Images/Thumbs.db


BIN
res/Button_Images/backward.png


BIN
res/Button_Images/forward.png


BIN
res/Button_Images/pause.png


BIN
res/Button_Images/play.png


BIN
res/Button_Images/reset.png


BIN
src/classes/AbstractCpsObject.class


BIN
src/classes/Category.class


BIN
src/classes/CpsNode.class


BIN
src/classes/HolonBody.class


BIN
src/classes/SubNet.class


+ 14 - 7
src/ui/view/ButtonTabComponent.java

@@ -97,13 +97,7 @@ public class ButtonTabComponent extends JPanel {
 		}
 
 		public void actionPerformed(ActionEvent e) {
-			int i = pane.indexOfTabComponent(ButtonTabComponent.this);
-			if (i != -1) {
-				pane.remove(i);
-				if (pane2.getTabCount() < 0) {
-					pane2.remove(i);
-				}
-			}
+			removeTabs();
 		}
 
 		// we don't want to update UI for this button
@@ -147,4 +141,17 @@ public class ButtonTabComponent extends JPanel {
 			}
 		}
 	};
+	
+	/**
+	 * removes both Tabs 
+	 */
+	public void removeTabs() {
+		int i = pane.indexOfTabComponent(ButtonTabComponent.this);
+		if (i != -1) {
+			pane.remove(i);
+			if (pane2.getTabCount() > 0) {
+				pane2.remove(i);
+			}
+		}
+	}
 }

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

@@ -100,6 +100,7 @@ public class GUI<E> implements CategoryListener {
 
 	private final SimulationMenu simMenu;
 
+	private JTabbedPane tabTemp; // tabbedPane or tabbedPane2
 	private final JMenuBar menuBar = new JMenuBar();
 	private final JMenu mnNewMenu = new JMenu("File");
 	private final JMenu mnNewMenuEdit = new JMenu("Edit");
@@ -378,18 +379,23 @@ public class GUI<E> implements CategoryListener {
 			@Override
 			public void actionPerformed(ActionEvent e) {
 
+				if (tabbedPane.getMousePosition() != null) {
+					tabTemp = tabbedPane;
+				} else {
+					tabTemp = tabbedPane2;
+				}
 				model.getSelectedCpsObjects().clear();
 				// Uppernode Canvas?
-				if (((JScrollPane) tabbedPane.getSelectedComponent()).getViewport()
+				if (((JScrollPane) tabTemp.getSelectedComponent()).getViewport()
 						.getComponent(0) instanceof UpperNodeCanvas) {
-					UpperNodeCanvas uNC = (UpperNodeCanvas) ((JScrollPane) tabbedPane.getSelectedComponent())
-							.getViewport().getComponent(0);
+					UpperNodeCanvas uNC = (UpperNodeCanvas) ((JScrollPane) tabTemp.getSelectedComponent()).getViewport()
+							.getComponent(0);
 					for (AbstractCpsObject cps : uNC.upperNode.getNodes()) {
 						controller.addSelectedObject(cps);
 					}
 					uNC.repaint();
 					// or Canvas?
-				} else if (((JScrollPane) tabbedPane.getSelectedComponent()).getViewport()
+				} else if (((JScrollPane) tabTemp.getSelectedComponent()).getViewport()
 						.getComponent(0) instanceof MyCanvas) {
 					for (AbstractCpsObject cps : model.getObjectsOnCanvas()) {
 						controller.addSelectedObject(cps);
@@ -479,11 +485,16 @@ public class GUI<E> implements CategoryListener {
 
 			@Override
 			public void actionPerformed(ActionEvent e) {
+				if (tabbedPane.getMousePosition() != null) {
+					tabTemp = tabbedPane;
+				} else {
+					tabTemp = tabbedPane2;
+				}
 				if (!model.getSelectedCpsObjects().isEmpty()) {
-					if (((JScrollPane) tabbedPane.getSelectedComponent()).getViewport()
+					if (((JScrollPane) tabTemp.getSelectedComponent()).getViewport()
 							.getComponent(0) instanceof UpperNodeCanvas)
-						controller.copy(((UpperNodeCanvas) ((JScrollPane) tabbedPane.getSelectedComponent())
-								.getViewport().getComponent(0)).upperNode);
+						controller.copy(((UpperNodeCanvas) ((JScrollPane) tabTemp.getSelectedComponent()).getViewport()
+								.getComponent(0)).upperNode);
 					else
 						controller.copy(null);
 					if (!model.getClipboradObjects().isEmpty()) {
@@ -502,17 +513,26 @@ public class GUI<E> implements CategoryListener {
 			@Override
 			public void actionPerformed(ActionEvent e) {
 				try {
-					if (((JScrollPane) tabbedPane.getSelectedComponent()).getViewport()
-							.getComponent(0) instanceof UpperNodeCanvas)
+					tabTemp = null;
+					if (tabbedPane.getMousePosition() != null) {
+						tabTemp = tabbedPane;
+					} else {
+						if (!initSplit) {
+							tabTemp = tabbedPane2;
+						}
+					}
+					if (tabTemp != null && ((JScrollPane) tabTemp.getSelectedComponent()).getViewport()
+							.getComponent(0) instanceof UpperNodeCanvas) {
 
 						controller.paste(
-								((UpperNodeCanvas) ((JScrollPane) tabbedPane.getSelectedComponent()).getViewport()
+								((UpperNodeCanvas) ((JScrollPane) tabTemp.getSelectedComponent()).getViewport()
 										.getComponent(0)).upperNode,
-								((UpperNodeCanvas) ((JScrollPane) tabbedPane.getSelectedComponent()).getViewport()
+								((UpperNodeCanvas) ((JScrollPane) tabTemp.getSelectedComponent()).getViewport()
 										.getComponent(0)).getMousePosition());
-					else
+					} else {
 						controller.paste(null, canvas.getMousePosition());
-					unitGraph.update(model.getSelectedCpsObjects());
+						unitGraph.update(model.getSelectedCpsObjects());
+					}
 				} catch (HeadlessException | JsonParseException | UnsupportedFlavorException | IOException e1) {
 					// TODO Auto-generated catch block
 					JLabel message = new JLabel("The Clipboard information cannot be pasted into Application.");
@@ -530,11 +550,16 @@ public class GUI<E> implements CategoryListener {
 
 			@Override
 			public void actionPerformed(ActionEvent e) {
+				if (tabbedPane.getMousePosition() != null) {
+					tabTemp = tabbedPane;
+				} else {
+					tabTemp = tabbedPane2;
+				}
 				if (!model.getSelectedCpsObjects().isEmpty()) {
-					if (((JScrollPane) tabbedPane.getSelectedComponent()).getViewport()
+					if (((JScrollPane) tabTemp.getSelectedComponent()).getViewport()
 							.getComponent(0) instanceof UpperNodeCanvas)
-						controller.cut(((UpperNodeCanvas) ((JScrollPane) tabbedPane.getSelectedComponent())
-								.getViewport().getComponent(0)).upperNode);
+						controller.cut(((UpperNodeCanvas) ((JScrollPane) tabTemp.getSelectedComponent()).getViewport()
+								.getComponent(0)).upperNode);
 					else
 						controller.cut(null);
 					if (!model.getClipboradObjects().isEmpty()) {
@@ -650,11 +675,6 @@ public class GUI<E> implements CategoryListener {
 				JOptionPane.showMessageDialog(null, myPanel);
 				controller.setCanvasX(Integer.parseInt(field1.getText()));
 				controller.setCanvasY(Integer.parseInt(field2.getText()));
-				for (int i = 4; i < tabbedPane.getTabCount(); i++) {
-					tabbedPane.getComponentAt(i)
-							.setPreferredSize(new Dimension(model.getCanvasX(), model.getCanvasY()));
-					tabbedPane.getComponentAt(i).repaint();
-				}
 				canvas.setPreferredSize(new Dimension(model.getCanvasX(), model.getCanvasY()));
 				canvas.repaint();
 			}
@@ -679,6 +699,8 @@ public class GUI<E> implements CategoryListener {
 						.getComponent(0) instanceof UpperNodeCanvas) {
 					((UpperNodeCanvas) ((JScrollPane) tabbedPane2.getSelectedComponent()).getViewport().getComponent(0))
 							.repaint();
+				} else {
+					canvas.repaint();
 				}
 			}
 		});
@@ -1176,6 +1198,10 @@ public class GUI<E> implements CategoryListener {
 								if (unc.upperNode.getId() == updCon.getActualCps().getId()) {
 									tabbedPane.setTitleAt(index, unc.upperNode.getName());
 									tabbedPane.updateUI();
+									if (!initSplit) {
+										tabbedPane2.setTitleAt(index, unc.upperNode.getName());
+										tabbedPane2.updateUI();
+									}
 								}
 							}
 						} else if (updCon.getActualCps() instanceof HolonObject) {
@@ -1272,9 +1298,14 @@ public class GUI<E> implements CategoryListener {
 			public void mouseReleased(MouseEvent e) {
 				try {
 					if (dragging) {
-						if (((JScrollPane) tabbedPane.getSelectedComponent()).getViewport()
+						if (tabbedPane.getMousePosition() != null) {
+							tabTemp = tabbedPane;
+						} else {
+							tabTemp = tabbedPane2;
+						}
+						if (((JScrollPane) tabTemp.getSelectedComponent()).getViewport()
 								.getComponent(0) instanceof UpperNodeCanvas) {
-							UpperNodeCanvas unc = ((UpperNodeCanvas) ((JScrollPane) tabbedPane.getSelectedComponent())
+							UpperNodeCanvas unc = ((UpperNodeCanvas) ((JScrollPane) tabTemp.getSelectedComponent())
 									.getViewport().getComponent(0));
 
 							int x = (int) unc.getMousePosition().getX();
@@ -1804,7 +1835,6 @@ public class GUI<E> implements CategoryListener {
 				controller.calculateStateForTimeStep(i);
 				unitGraph.repaint();
 				statSplitPane.repaintGraphs();
-				controller.addTextToConsole("test");
 				contentPane.updateUI();
 			}
 		});
@@ -2102,14 +2132,14 @@ public class GUI<E> implements CategoryListener {
 	 */
 	private void openNewUpperNodeTab() {
 		// is the uppernode on tabbedPane or tabbedPane2
-		JTabbedPane tabTemp;
 		if (tabbedPane.getMousePosition() != null) {
 			tabTemp = tabbedPane;
 		} else {
 			tabTemp = tabbedPane2;
 		}
-			if (((JScrollPane) tabTemp.getSelectedComponent()).getViewport().getComponent(0) instanceof MyCanvas) {
+		if (((JScrollPane) tabTemp.getSelectedComponent()).getViewport().getComponent(0) instanceof MyCanvas) {
 			unc = new UpperNodeCanvas(model, controller, unitGraph, (CpsUpperNode) temp, "");
+
 		} else {
 			unc = new UpperNodeCanvas(model, controller, unitGraph, (CpsUpperNode) temp,
 					((UpperNodeCanvas) ((JScrollPane) tabTemp.getSelectedComponent()).getViewport()
@@ -2143,7 +2173,6 @@ public class GUI<E> implements CategoryListener {
 					unitGraph.empty();
 					holonEleNamesDisplayed = Languages.getLanguage()[25];
 					elementGraph.setText(holonEleNamesDisplayed);
-					JTabbedPane tabTemp;
 					if (tabbedPane.getMousePosition() != null) {
 						tabTemp = tabbedPane;
 					} else {

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

@@ -118,7 +118,7 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 	 *            the Model
 	 * @param control
 	 *            the Controller
-	 * @param unitGraph 
+	 * @param unitGraph
 	 */
 	public MyCanvas(Model mod, Control control, UnitGraph unitGraph) {
 		toolTip = false;
@@ -347,7 +347,8 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 							if (tabbedPane.getComponentAt(i) != null
 									&& ((UpperNodeCanvas) ((JScrollPane) tabbedPane.getComponentAt(i)).getViewport()
 											.getComponent(0)).upperNode.getId() == cps.getId()) {
-								tabbedPane.remove(i);
+
+								((ButtonTabComponent) tabbedPane.getTabComponentAt(i)).removeTabs();
 								break;
 							}
 						}
@@ -384,6 +385,7 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 				try {
 					controller.paste(null, mousePosition);
 					unitGraph.update(model.getSelectedCpsObjects());
+
 				} catch (JsonParseException | UnsupportedFlavorException | IOException e1) {
 					// TODO Auto-generated catch block
 					JLabel message = new JLabel("The Clipboard information cannot be pastet into Application.");
@@ -641,15 +643,11 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 			g2.setStroke(new BasicStroke(1));
 			int textWidth = g.getFontMetrics().stringWidth(toolTipText) + 2; // Text
 																				// width
-			int fixXPos = toolTipPos.x - (textWidth >> 1) + model.getScaleDiv2(); // Position
-																					// fixed
-																					// x
-																					// Position
-																					// to
-																					// the
-																					// screen
-			int fixYPos = toolTipPos.y; //// Position fixed y Position to the
-										//// screen
+
+			// fixed x and y Position to the screen
+			int fixXPos = toolTipPos.x - (textWidth >> 1) + model.getScaleDiv2();
+			int fixYPos = toolTipPos.y;
+
 			if (fixXPos < 0) {
 				fixXPos = 0;
 			} else if (fixXPos + textWidth + 1 > this.getWidth()) {

+ 65 - 60
src/ui/view/TimePanel.java

@@ -1,7 +1,6 @@
 package ui.view;
 
 import java.awt.BorderLayout;
-import java.awt.Color;
 import java.awt.FlowLayout;
 import java.awt.Image;
 import java.awt.Point;
@@ -16,15 +15,10 @@ import javax.swing.JButton;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JSlider;
-import javax.swing.JTextField;
 import javax.swing.Timer;
-import javax.swing.border.LineBorder;
-import javax.swing.event.CaretEvent;
-import javax.swing.event.CaretListener;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 import javax.swing.plaf.basic.BasicSliderUI;
-import javax.swing.plaf.synth.SynthSliderUI;
 
 import ui.controller.Control;
 import ui.model.Model;
@@ -41,31 +35,38 @@ public class TimePanel extends JPanel {
 	private Model model;
 	private Control controller;
 
-	JLabel simSpeedLabel = new JLabel(Languages.getLanguage()[84]);
-	private JTextField simSpeedText = new JTextField("1000");
-	JSlider timeSlider = new JSlider(){
-	    {
-	    	// Make the slider jump to mouse position on left click
-	        MouseListener[] listeners = getMouseListeners();
-	        for (MouseListener l : listeners)
-	            removeMouseListener(l); // remove UI-installed TrackListener
-	        final BasicSliderUI ui = (BasicSliderUI) getUI();
-	        BasicSliderUI.TrackListener tl = ui.new TrackListener() {
-	            // this is where we jump to absolute value of click
-	            @Override public void mouseClicked(MouseEvent e) {
-	                Point p = e.getPoint();
-	                int value = ui.valueForXPosition(p.x);
-
-	                setValue(value);
-	            }
-	            // disable check that will invoke scrollDueToClickInTrack
-	            @Override public boolean shouldScroll(int dir) {
-	                return false;
-	            }
-	        };
-	        addMouseListener(tl);
-	    }
+	JSlider timeSlider = new JSlider() {
+		{
+			// Make the slider jump to mouse position on left click
+			MouseListener[] listeners = getMouseListeners();
+			for (MouseListener l : listeners)
+				removeMouseListener(l); // remove UI-installed TrackListener
+			final BasicSliderUI ui = (BasicSliderUI) getUI();
+			BasicSliderUI.TrackListener tl = ui.new TrackListener() {
+				// this is where we jump to absolute value of click
+				@Override
+				public void mouseClicked(MouseEvent e) {
+					Point p = e.getPoint();
+					int value = ui.valueForXPosition(p.x);
+
+					setValue(value);
+				}
+
+				// disable check that will invoke scrollDueToClickInTrack
+				@Override
+				public boolean shouldScroll(int dir) {
+					return false;
+				}
+			};
+			addMouseListener(tl);
+		}
 	};;
+
+	private JLabel simSpeedLabel = new JLabel("Speed:");
+	private JSlider speedSlider = new JSlider();
+
+	private final JPanel btnAndSpeedPanel = new JPanel();
+	private final JPanel speedPanel = new JPanel();
 	private final JPanel timeBtnPanel = new JPanel();
 	final JButton playBtn = new JButton();
 	final JButton timeResetBtn = new JButton();
@@ -116,7 +117,6 @@ public class TimePanel extends JPanel {
 		timeSlider.setToolTipText(Languages.getLanguage()[93]);
 		timeSlider.setMaximum(model.getIterations() - 1);
 		timeSlider.setValue(0);
-		timeSlider.setBackground(Color.WHITE);
 		timeSlider.addChangeListener(new ChangeListener() {
 			@Override
 			public void stateChanged(ChangeEvent e) {
@@ -130,7 +130,7 @@ public class TimePanel extends JPanel {
 				controller.resetSimulation();
 			}
 		});
-		
+
 		timeSlider.addMouseMotionListener(new MouseAdapter() {
 			@Override
 			public void mouseDragged(MouseEvent e) {
@@ -140,15 +140,14 @@ public class TimePanel extends JPanel {
 
 		// Panel
 		timeBtnPanel.setBorder(null);
-		timeBtnPanel.setBackground(Color.WHITE);
-		timeBtnPanel.setLayout(new FlowLayout());
+		timeBtnPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
 
 		// Buttons
 		playBtn.setToolTipText(Languages.getLanguage()[89]);
 
-		playBtn.setBackground(Color.WHITE);
+		playBtn.setContentAreaFilled(false);
 		playBtn.setBorderPainted(false);
-		playBtn.setBorder(new LineBorder(Color.WHITE, 4));
+		playBtn.setBorder(null);
 		playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/play.png")).getImage()
 				.getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
 		playBtn.addActionListener(new ActionListener() {
@@ -169,9 +168,8 @@ public class TimePanel extends JPanel {
 		});
 		timeResetBtn.setToolTipText(Languages.getLanguage()[90]);
 
-		timeResetBtn.setBorderPainted(false);
-		timeResetBtn.setBackground(Color.WHITE);
-		timeResetBtn.setBorder(new LineBorder(Color.WHITE, 4));
+		timeResetBtn.setContentAreaFilled(false);
+		timeResetBtn.setBorder(null);
 		timeResetBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/reset.png"))
 				.getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
 		timeResetBtn.addActionListener(new ActionListener() {
@@ -184,9 +182,8 @@ public class TimePanel extends JPanel {
 		});
 		timeForwardBtn.setToolTipText(Languages.getLanguage()[91]);
 
-		timeForwardBtn.setBorderPainted(false);
 		timeForwardBtn.setContentAreaFilled(false);
-		timeForwardBtn.setBorder(new LineBorder(Color.WHITE, 4));
+		timeForwardBtn.setBorder(null);
 		timeForwardBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/forward.png"))
 				.getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
 		timeForwardBtn.addActionListener(new ActionListener() {
@@ -197,9 +194,7 @@ public class TimePanel extends JPanel {
 		});
 		timeBackwardBtn.setToolTipText(Languages.getLanguage()[92]);
 
-		timeBackwardBtn.setBackground(Color.WHITE);
-		timeBackwardBtn.setBorderPainted(false);
-		timeBackwardBtn.setBorder(new LineBorder(Color.WHITE, 4));
+		timeBackwardBtn.setBorder(null);
 		timeBackwardBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/backward.png"))
 				.getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
 		timeBackwardBtn.addActionListener(new ActionListener() {
@@ -209,21 +204,7 @@ public class TimePanel extends JPanel {
 			}
 		});
 
-		// timerSpeed
-		simSpeedText.addCaretListener(new CaretListener() {
-			@Override
-			public void caretUpdate(CaretEvent e) {
-				try {
-					controller.setTimerSpeed(Integer.parseInt(simSpeedText.getText()));
-				} catch (Exception ex) {
-					// TODO: handle exception
-				}
-
-			}
-		});
-
-		timeBtnPanel.add(simSpeedLabel);
-		timeBtnPanel.add(simSpeedText);
+		// timeBtnPanel.add(simSpeedText);
 		timeBtnPanel.add(playBtn);
 		timeBtnPanel.add(timeResetBtn);
 		/*
@@ -232,7 +213,31 @@ public class TimePanel extends JPanel {
 		// timeBtnPanel.add(timeBackwardBtn);
 		timeBtnPanel.add(timeForwardBtn);
 
-		this.add(timeBtnPanel, BorderLayout.WEST);
+		// Speed Panel
+		speedPanel.add(simSpeedLabel);
+		speedPanel.add(speedSlider);
+		speedSlider.setPaintTicks(true);
+		speedSlider.setPaintLabels(true);
+		speedSlider.setToolTipText("Speed: 1000");
+		speedSlider.setMaximum(10000);
+		speedSlider.setMinimum(0);
+		speedSlider.setValue(1000);
+		speedSlider.setMajorTickSpacing(2000);
+		speedSlider.addChangeListener(new ChangeListener() {
+			@Override
+			public void stateChanged(ChangeEvent e) {
+				controller.setTimerSpeed(speedSlider.getValue());
+				speedSlider.setToolTipText("Speed: "+speedSlider.getValue());
+			}
+		});
+
+		// Buttons and Speed Panel
+		btnAndSpeedPanel.setLayout(new BorderLayout(0,0));
+		btnAndSpeedPanel.setBorder(null);
+		btnAndSpeedPanel.add(timeBtnPanel, BorderLayout.NORTH);
+		btnAndSpeedPanel.add(speedPanel, BorderLayout.CENTER);
+
+		this.add(btnAndSpeedPanel, BorderLayout.WEST);
 		this.add(timeSlider);
 	}
 

+ 1 - 1
src/ui/view/UpperNodeCanvas.java

@@ -145,7 +145,7 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 		borderPos = (int) (50 + scalediv20 + scalediv20 + 10);
 		for (AbstractCpsObject cps : upperNode.getNodes()) {
 			if (cps.getPosition().x < model.getScaleDiv2() + borderPos + 5) {
-				cps.setPosition(new Position(borderPos + 5, cps.getPosition().y));
+				cps.setPosition(new Position(borderPos + 5+model.getScaleDiv2(), cps.getPosition().y));
 			}
 		}