Explorar o código

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

Conflicts:
src/ui/view/AddElementPopUp.java

Andreas T. Meyer-Berg %!s(int64=7) %!d(string=hai) anos
pai
achega
a72d7aac60

+ 19 - 14
src/classes/HolonElement.java

@@ -2,6 +2,8 @@ package classes;
 
 import com.google.gson.annotations.Expose;
 
+import ui.model.Model;
+
 import java.awt.*;
 import java.util.LinkedList;
 
@@ -45,6 +47,10 @@ public class HolonElement {
     /* ID */
     @Expose
     private int id;
+    
+    private static final int DEFAULT_GRAPH_LENGTH=100;
+    //private int graphLength=DEFAULT_GRAPH_LENGTH; Unimplementable due to former developer's dark magic.
+    
     /*
      * Energy at each point of the graph with 100 predefined points. At the
      * beginning, it starts with all values at energyPerElement.
@@ -59,25 +65,23 @@ public class HolonElement {
      * @param eleName String
      * @param amount  int
      * @param energy  float
+     * @param model Model
      */
+    public HolonElement(String eleName, int amount, float energy, Model model) {
+    	this(eleName, amount, energy, IdCounterElem.nextId(),model);
+    }
+    
     public HolonElement(String eleName, int amount, float energy) {
-        setEleName(eleName);
-        setAmount(amount);
-        setEnergyPerElement(energy);
-        setActive(true);
-        setSign(energy);
-        setAvailableEnergyPerElementAt(energy);
-        setGraphPoints(new LinkedList<>());
-        setId(IdCounterElem.nextId());
-        setFlexibleEnergyAvailable(0);
-        setFlexible(false);
+    	this(eleName, amount, energy, IdCounterElem.nextId(),null);//TODO: This is just for the old tests...
     }
 
     /**
      * same as standard constructor, but with already given id (so the counter is not increased twice)
      */
-    public HolonElement(String eleName, int amount, float energy, int id) {
-        setEleName(eleName);
+    public HolonElement(String eleName, int amount, float energy, int id, Model model){
+    	//if(model!=null)graphLength=model.getGraphIterations();
+    	//if(graphLength==0)graphLength=DEFAULT_GRAPH_LENGTH;//This would work if the used HolonElements were actually made using a proper constructor.
+    	setEleName(eleName);
         setAmount(amount);
         setEnergyPerElement(energy);
         setActive(true);
@@ -95,6 +99,7 @@ public class HolonElement {
      * @param element element to copy
      */
     public HolonElement(HolonElement element) {
+    	//graphLength=element.graphLength;//Should I add a getter?
         setEleName(element.getEleName());
         setAmount(element.getAmount());
         setEnergyPerElement(element.getEnergyPerElement());
@@ -151,7 +156,7 @@ public class HolonElement {
      * Get the energyPerElement currently available
      */
     public float getAvailableEnergyAt(int timestep) {
-        return this.availableEnergyPerElementAt[timestep];
+        return this.availableEnergyPerElementAt[timestep%DEFAULT_GRAPH_LENGTH];//TODO:use an attribute here
     }
 
     /**
@@ -259,7 +264,7 @@ public class HolonElement {
         if (flexible) {
             return ((float) amount) * energyPerElement;
         } else {
-            return ((float) amount) * availableEnergyPerElementAt[x];
+            return ((float) amount) * availableEnergyPerElementAt[x%DEFAULT_GRAPH_LENGTH];//TODO: use an attribute
         }
     }
 

+ 2 - 0
src/classes/HolonObject.java

@@ -26,6 +26,8 @@ public class HolonObject extends AbstractCpsObject {
     public final static int PRODUCER = 3;
     public final static int PARTIALLY_SUPPLIED = 4;
     public final static int OVER_SUPPLIED = 5;
+    
+    private static final int DEFAULT_GRAPH_LENGTH = 100;//TODO
     /*
      * Color of the actual state (red = no supplied, yellow = partially supplied
      * and green = supplied)

+ 2 - 2
src/ui/controller/ObjectController.java

@@ -71,7 +71,7 @@ public class ObjectController {
      * @param elementId the Element ID
      */
     public void addNewElementIntoCanvasObject(int objectId, String element, int amount, float energy, int elementId) {
-        HolonElement ele = new HolonElement(element, amount, energy, elementId);
+        HolonElement ele = new HolonElement(element, amount, energy, elementId, model);
         if (mpC.searchByID(objectId) == null) {
             addElementIntoCanvasObject((HolonObject) model.getSelectedCpsObjects().get(0), ele);
         } else {
@@ -103,7 +103,7 @@ public class ObjectController {
     public void addNewElementIntoCategoryObject(String category, String object, String element, int amount,
                                                 float energy) {
 
-        HolonElement ele = new HolonElement(element, amount, energy);
+        HolonElement ele = new HolonElement(element, amount, energy, model);//TODO: I added model
         addElementIntoCategoryObject(category, object, ele);
     }
 

+ 16 - 2
src/ui/model/Model.java

@@ -26,7 +26,8 @@ import java.util.List;
  */
 public class Model {
 
-    private static final int ITERATIONS = 100;
+	
+    private static final int GRAPH_ITERATIONS = 100;
     // Global Variables
     private static int sCALE = 50; // Picture Scale
     private static int sCALEdIV2 = sCALE / 2;
@@ -69,6 +70,8 @@ public class Model {
     private boolean useFlexibleDevices = true;
     /** whether the supplyBars should be shown or not */
     private boolean showSupplyBars = true;
+    //TODO:
+    private int iterations=100;
     
     /** the Fairness model in use */
     private short fairnessModel = 0;
@@ -376,7 +379,7 @@ public class Model {
      * @return ITERATIONS
      */
     public int getIterations() {
-        return ITERATIONS;
+        return iterations;
     }
 
     private void notifyGraphListeners() {
@@ -923,6 +926,13 @@ public class Model {
 		this.showSupplyBars = showSupplyBars;
 	}
 	
+	/**
+	 * @param iterations the number of steps for this simulation
+	 */
+	public void setIterations(int iterations){
+		this.iterations=iterations;
+	}
+	
 	/**
 	 * @return the fairnessModel
 	 */
@@ -936,6 +946,10 @@ public class Model {
 	public void setFairnessModel(short fairnessModel) {
 		this.fairnessModel = fairnessModel;
 	}
+	
+	public int getGraphIterations(){
+		return GRAPH_ITERATIONS;
+	}
 
 	/**
      * Initialize the Gson with wanted parameters

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

@@ -3,6 +3,7 @@ package ui.view;
 import classes.AbstractCpsObject;
 import classes.HolonElement;
 import classes.HolonObject;
+import ui.model.Model;
 
 import javax.swing.*;
 import javax.swing.border.EmptyBorder;
@@ -25,7 +26,7 @@ public class AddElementPopUp extends JDialog {
 	private static final long serialVersionUID = 1L;
 	/* Data */
 	/** Holon Object the Element should be added to */
-	private AbstractCpsObject tempCps;
+	private AbstractCpsObject tempCps;
 	/** Holon Element that should be edited (if in edit Modus */
 	private HolonElement hl;
 	
@@ -46,12 +47,14 @@ public class AddElementPopUp extends JDialog {
 	JCheckBox checkboxFlexible;
 	/** Panel for the Graph */
 	JPanel panelGraph;
+	/** Model which is used */
+	private Model model;
 
 	/**
 	 * Create the AddElementPopup Dialog
 	 * @param parentFrame
 	 */
-	AddElementPopUp(JFrame parentFrame) {
+	AddElementPopUp(JFrame parentFrame, Model model) {
 		super((java.awt.Frame) null, true);
 		this.setIconImage(Util.loadImage(this, "/Images/Dummy_House.png", 30, 30));
 		setModalityType(java.awt.Dialog.ModalityType.APPLICATION_MODAL);
@@ -129,7 +132,7 @@ public class AddElementPopUp extends JDialog {
 		contentPanel.add(amount);
 		amount.setColumns(10);
 		amount.setText("1");
-				
+
 		/* Add Graph Panel */
 		panelGraph = new JPanel();
 		panelGraph.setBounds(12, 157, 358, 263);
@@ -150,7 +153,6 @@ public class AddElementPopUp extends JDialog {
 		cancelButton.setActionCommand("Cancel");
 		buttonPane.add(cancelButton);
 		cancelButton.addActionListener(e -> dispose());
-
 	}
 
 	/**
@@ -188,7 +190,7 @@ public class AddElementPopUp extends JDialog {
 	}
 	
 	/**
-	 * Creates 
+	 * Trys to create/edit the Element
 	 */
 	private void okAction() {
 		boolean repeated = false;
@@ -203,7 +205,7 @@ public class AddElementPopUp extends JDialog {
 				float energy = Float.parseFloat(providedEnergy.getText());
 				int elementAmount = Integer.parseInt(amount.getText());
 				if(hl == null){
-					hl = new HolonElement(elementName.getText(), elementAmount, energy);
+					hl = new HolonElement(elementName.getText(), elementAmount, energy, model);
 				} else {
 					hl.setEleName(elementName.getText());
 					hl.setAmount(elementAmount);
@@ -217,9 +219,6 @@ public class AddElementPopUp extends JDialog {
 				JOptionPane.showMessageDialog(new JFrame(), Languages.getLanguage()[68]);
 			}
 		} else {
-			// JOptionPane.showMessageDialog(new JFrame(),
-			// "Please enter a Name");
-
 			if (elementName.getText().length() == 0) {
 				JLabel errorString = new JLabel(Languages.getLanguage()[69]);
 				errorString.setBounds(240, 8, 100, 20);
@@ -231,6 +230,5 @@ public class AddElementPopUp extends JDialog {
 			}
 			elementName.setBackground(new Color(255, 50, 50));
 		}
-
 	}
-}
+}

+ 7 - 3
src/ui/view/AddObjectPopUp.java

@@ -5,6 +5,7 @@ import classes.HolonElement;
 import classes.HolonObject;
 import classes.Pair;
 import ui.controller.Control;
+import ui.model.Model;
 
 import javax.swing.*;
 import javax.swing.border.EmptyBorder;
@@ -41,6 +42,7 @@ public class AddObjectPopUp extends JDialog {
 	private AbstractCpsObject toEdit;
 	private boolean editState;
 	private boolean imageChanged = false;
+	private Model model;
 
 //	/**
 //	 * Launch the application.
@@ -68,9 +70,10 @@ public class AddObjectPopUp extends JDialog {
 	 * @param cat
 	 *            the categorie
 	 */
-    AddObjectPopUp(boolean edit, AbstractCpsObject obj, String cat, JFrame parentFrame) {
+    AddObjectPopUp(boolean edit, AbstractCpsObject obj, String cat, JFrame parentFrame, Model model) {
         toEdit = obj;
 		editState = edit;
+		this.model=model;
 		this.setIconImage(Util.loadImage(this, "/Images/Dummy_House.png",30,30));
 		setBounds(100, 100, 450, 342);
         setLocationRelativeTo(parentFrame);
@@ -162,7 +165,7 @@ public class AddObjectPopUp extends JDialog {
 		{
 			JButton btnAddDefaultElement = new JButton(Languages.getLanguage()[61]);
 			btnAddDefaultElement.addActionListener(actionEvent -> {
-                addElement = new AddElementPopUp(parentFrame);
+                addElement = new AddElementPopUp(parentFrame, model);
                 addElement.setActualCps(toEdit);
 				addElement.setVisible(true);
 				HolonElement hl = addElement.getElement();
@@ -322,7 +325,8 @@ public class AddObjectPopUp extends JDialog {
 			selectedFile = fileChooser.getSelectedFile();
 			filePath = selectedFile.getAbsolutePath();
 			sourcePath.setText(filePath);
-			ImageIcon icon = new ImageIcon(
+			ImageIcon icon = new ImageIcon(//TODO: ugly
+					
 					new ImageIcon(filePath).getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH));
 			lblImagePreview.setIcon(icon);
 			imageChanged = true;

+ 7 - 4
src/ui/view/CreateTemplatePopUp.java

@@ -79,8 +79,10 @@ public class CreateTemplatePopUp extends JDialog {
 	/**
 	 * parent Frame
 	 */
+	
+	private Model model;
+	
 	JFrame parent;
-
 	/**
 	 * Create the dialog.
 	 * 
@@ -105,6 +107,7 @@ public class CreateTemplatePopUp extends JDialog {
 		template = new HolonObject(obj);
 		this.parent = parentFrame;
 		this.controller = controller;
+		this.model=model;//Thankfully that was in the ctor already.
 		/*
 		 * create Frame and GUI
 		 */
@@ -312,7 +315,7 @@ public class CreateTemplatePopUp extends JDialog {
 	 * Add an Holon Element to the template
 	 */
 	private void addElement() {
-		AddElementPopUp popUp = new AddElementPopUp(parent);
+		AddElementPopUp popUp = new AddElementPopUp(parent, model);
 		popUp.setActualCps(template);
 		popUp.setVisible(true);
 		HolonElement he = popUp.getElement();
@@ -343,7 +346,7 @@ public class CreateTemplatePopUp extends JDialog {
 		if (index == -1)
 			return;
 		
-		AddElementPopUp popUp = new AddElementPopUp(parent);
+		AddElementPopUp popUp = new AddElementPopUp(parent, model);
 		popUp.setActualCps(template);
 		popUp.setElement(template.getElements().get(index));
 		popUp.setVisible(true);
@@ -358,4 +361,4 @@ public class CreateTemplatePopUp extends JDialog {
 		}
 	}
 
-}
+}

+ 9 - 4
src/ui/view/GUI.java

@@ -1081,7 +1081,7 @@ public class GUI implements CategoryListener {
 				if (tempCpsObject != null
 						&& tempCpsObject.getClass() == HolonObject.class
 						&& tempCpsObject.getId() != 0) {
-					addElementPopUp = new AddElementPopUp(frmCyberPhysical);
+					addElementPopUp = new AddElementPopUp(frmCyberPhysical, model);//TODO: I didn't even check
 					addElementPopUp.setActualCps(updCon.getActualCps());
 					addElementPopUp.setVisible(true);
 					HolonElement ele = addElementPopUp.getElement();
@@ -1727,7 +1727,7 @@ public class GUI implements CategoryListener {
 		editItem.addActionListener(actionEvent -> {
 			// Remove the selected Object object
 			addObjectPopUP = new AddObjectPopUp(true, tempCps,
-					catOfObjToBeEdited, frmCyberPhysical);
+					catOfObjToBeEdited, frmCyberPhysical, model);
 			addObjectPopUP.setCategory(catOfObjToBeEdited);
 			addObjectPopUP.setController(controller);
 			addObjectPopUP.setVisible(true);
@@ -1768,7 +1768,7 @@ public class GUI implements CategoryListener {
 					if (selectedNode != null && selectedNode.getLevel() == 1) {
 						AbstractCpsObject tmp = new HolonObject("");
 						addObjectPopUP = new AddObjectPopUp(false, tmp, null,
-								frmCyberPhysical);
+								frmCyberPhysical, model);
 						addObjectPopUP.setVisible(true);
 						addObjectPopUP.setController(controller);
 						addObjectPopUP.setCategory(selectedNode.toString());
@@ -2090,7 +2090,12 @@ public class GUI implements CategoryListener {
 
 		timePanel = new TimePanel(model, controller);
 		timePanel.setBorder(null);
-		((JSlider) (timePanel.getComponent(1)))
+		((JSlider)
+				(
+						((Container)timePanel.getComponent(1))//timePanel
+						.getComponent(1)//timeSlider
+				)
+		)//TODO: This hardcoded shit
 				.addChangeListener(changeEvent -> {
 					int i = model.getCurIteration();
 					controller.calculateStateForTimeStep(i);

+ 42 - 9
src/ui/view/TimePanel.java

@@ -19,18 +19,23 @@ import java.util.Hashtable;
  * 
  * @author Gruppe14
  */
-public class TimePanel extends JPanel {
+public class TimePanel extends JPanel implements ActionListener{
 
 	private static final long serialVersionUID = 1L;
+	private static final int MAX_ITERATIONS=100000;
 	final JButton playBtn = new JButton();
 	final JButton timeResetBtn = new JButton();
 	final JButton timeForwardBtn = new JButton();
-	;
+	
 	final JButton timeBackwardBtn = new JButton();
+	JTextField iterationsField;
+	final JLabel iterationsLabel=new JLabel("  Iterations  ");
 	private final JPanel btnAndSpeedPanel = new JPanel();
 	private final JPanel speedPanel = new JPanel();
 	private final JPanel timeBtnPanel = new JPanel();
-	JSlider timeSlider = new JSlider() {
+	private final JPanel iterationsPanel=new JPanel();
+	private final JPanel timePanel=new JPanel();
+	JSlider timeSlider = new JSlider() {//TODO:
 		/**
 		 *
 		 */
@@ -83,7 +88,7 @@ public class TimePanel extends JPanel {
 		this.controller = cont;
 
 		// One Iteration
-		timer = new Timer(0, new ActionListener() {
+		timer = new Timer(0, new ActionListener() {//TODO: Merge all these damned listeners.
 			@Override
 			public void actionPerformed(ActionEvent ae) {
 				timeSlider.setValue(timeSlider.getValue() + 1);
@@ -103,8 +108,8 @@ public class TimePanel extends JPanel {
 		// Slider
 		timeSlider.setPaintTicks(true);
 		timeSlider.setPaintLabels(true);
-		timeSlider.setMinorTickSpacing(1);
-		timeSlider.setMajorTickSpacing(5);
+		timeSlider.setMajorTickSpacing((int)Math.ceil(((double)model.getIterations())/20));
+		timeSlider.setMinorTickSpacing((int)Math.ceil(((double)model.getIterations())/100));
 		timeSlider.setToolTipText(Languages.getLanguage()[93]);
 		timeSlider.setMaximum(model.getIterations() - 1);
 		timeSlider.setValue(0);
@@ -245,10 +250,19 @@ public class TimePanel extends JPanel {
 		btnAndSpeedPanel.setBorder(null);
 		btnAndSpeedPanel.add(timeBtnPanel, BorderLayout.NORTH);
 		btnAndSpeedPanel.add(speedPanel, BorderLayout.CENTER);
-
+		iterationsPanel.setLayout(new GridLayout(3,1));
+		iterationsPanel.add(iterationsLabel, BorderLayout.NORTH);
+		iterationsField=new JTextField(6);//Considering hundreds of thousands in an extreme case
+		iterationsField.setText(""+model.getIterations());
+		iterationsField.addActionListener(this);//TODO
+		iterationsPanel.add(iterationsField);
+		iterationsPanel.add(new JLabel(), BorderLayout.SOUTH);
+		timePanel.setLayout(new BorderLayout());
+		timePanel.add(iterationsPanel, BorderLayout.WEST);
+		timePanel.add(timeSlider, BorderLayout.CENTER);
 		this.add(btnAndSpeedPanel, BorderLayout.WEST);
-		this.add(timeSlider);
-
+		add(timePanel);
+		
 		//Disable Keys
 		timeSlider.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "UP_ARROW");
 		timeSlider.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, false), "DOWN_ARROW");
@@ -292,4 +306,23 @@ public class TimePanel extends JPanel {
 	public JSlider getTimeSlider() {
 		return timeSlider;
 	}
+
+	@Override
+	public void actionPerformed(ActionEvent arg0) {//I dislike anon classes.
+		try{
+			int iterations=Integer.parseInt(iterationsField.getText());
+			boolean resetField=true;
+			if(iterations<1)iterations=1;
+			else if(iterations>MAX_ITERATIONS)iterations=MAX_ITERATIONS;
+			else resetField=false;
+			if(resetField)iterationsField.setText(""+iterations);
+			model.setIterations(Integer.parseInt(iterationsField.getText()));
+			timeSlider.setMaximum(model.getIterations());
+			timeSlider.setLabelTable(null);//Otherwise the ticks won't update
+			timeSlider.setMajorTickSpacing((int)Math.ceil(((double)model.getIterations())/20));
+			timeSlider.setMinorTickSpacing((int)Math.ceil(((double)model.getIterations())/100));
+		}catch(NumberFormatException e){
+			
+		}
+	}
 }

+ 3 - 2
src/ui/view/UnitGraph.java

@@ -128,11 +128,12 @@ public class UnitGraph extends JPanel implements MouseListener, MouseMotionListe
                 }
 
                 // Iteration Value
-                textWidth = g.getFontMetrics().stringWidth("" + arrayOfFloats[model.getCurIteration()]) + 2;
+                //TODO: added function getGraphIterations see if it works
+                textWidth = g.getFontMetrics().stringWidth("" + arrayOfFloats[model.getCurIteration()%model.getGraphIterations()]) + 2;
                 if (textWidth
                         + (model.getCurIteration()) * (this.getWidth() - (border * 2)) / (model.getIterations() - 1) + 2
                         + border <= this.getWidth()) {
-                    g2.drawString("" + arrayOfFloats[model.getCurIteration()],
+                    g2.drawString("" + arrayOfFloats[model.getCurIteration()%model.getGraphIterations()],
                             (model.getCurIteration()) * (this.getWidth() - (border * 2)) / (model.getIterations() - 1)
                                     + 2 + border,
                             this.getHeight() - 10);