瀏覽代碼

Merge remote-tracking branch 'origin/LWR_timeStepLimit' into BP_master

# Conflicts:
#	src/ui/view/AddElementPopUp.java
Another altered class for some reason uses a wrong constructor. Easy
fix. next commit.
Ludwig Tietze 7 年之前
父節點
當前提交
0af3406b0e

+ 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

+ 57 - 1
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;
@@ -27,6 +28,7 @@ public class AddElementPopUp extends JDialog {
 	private JTextField amount;
 	private HolonElement hl;
 	private AbstractCpsObject tempCps;
+	private Model model;
 
 	// /**
 	// * Launch the application.
@@ -48,7 +50,7 @@ public class AddElementPopUp extends JDialog {
 	/**
 	 * Create the dialog.
 	 */
-	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);
@@ -102,6 +104,7 @@ public class AddElementPopUp extends JDialog {
 		contentPanel.add(amount);
 		amount.setColumns(10);
 		amount.setText("1");
+//<<<<<<< HEAD
 
 		JPanel buttonPane = new JPanel();
 		buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
@@ -117,6 +120,59 @@ public class AddElementPopUp extends JDialog {
 		cancelButton.setActionCommand("Cancel");
 		buttonPane.add(cancelButton);
 		cancelButton.addActionListener(e -> dispose());
+/*=======
+		{
+			JPanel buttonPane = new JPanel();
+			buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
+			getContentPane().add(buttonPane, BorderLayout.SOUTH);
+			{
+				JButton okButton = new JButton("OK");
+                okButton.addActionListener(arg0 -> {
+                    boolean repeated = false;
+                    for (HolonElement e : ((HolonObject) tempCps).getElements()) {
+                        if (elementName.getText().equals(e.getEleName())) {
+                            repeated = true;
+                            break;
+                        }
+                    }
+                    if (elementName.getText().length() != 0 && !repeated) {
+                        try {
+                            float energy = Float.parseFloat(providedEnergy.getText());
+                            int elementAmount = Integer.parseInt(amount.getText());
+                            hl = new HolonElement(elementName.getText(), elementAmount, energy, model);
+
+                            dispose();
+                        } catch (NumberFormatException e) {
+                            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);
+                            contentPanel.add(errorString);
+                        } else if (repeated) {
+                            JLabel errorString = new JLabel(Languages.getLanguage()[70]);
+                            errorString.setBounds(250, 8, 100, 20);
+                            contentPanel.add(errorString);
+                        }
+                        elementName.setBackground(new Color(255, 50, 50));
+                    }
+                });
+                okButton.setActionCommand("OK");
+				buttonPane.add(okButton);
+				getRootPane().setDefaultButton(okButton);
+			}
+			{
+				JButton cancelButton = new JButton(Languages.getLanguage()[71]);
+				cancelButton.setActionCommand("Cancel");
+				buttonPane.add(cancelButton);
+                cancelButton.addActionListener(e -> dispose());
+            }
+		}
+>>>>>>> origin/LWR_timeStepLimit*/
 
 	}
 

+ 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;

+ 5 - 2
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();

+ 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

@@ -17,18 +17,23 @@ import java.awt.event.*;
  * 
  * @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:
 		/**
 		 *
 		 */
@@ -81,7 +86,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);
@@ -101,8 +106,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);
@@ -222,10 +227,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");
@@ -269,4 +283,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);