Browse Source

Add Inspector Sorting

TomTroppmann 2 years ago
parent
commit
401157e2e9

BIN
res/Images/page_decrease.png


BIN
res/Images/page_increase.png


+ 2 - 2
src/Connection/ConnectPhysical.java

@@ -412,8 +412,8 @@ public class ConnectPhysical implements AddOn{
 						return;
 					}
 					//House exist
-					List<HolonElement> elementsOfRoom1 = house.hObject.getElements().stream().filter(ele -> ele.getEleName().contains(room1Keyword)).collect(Collectors.toList());
-					List<HolonElement> elementsOfRoom2 = house.hObject.getElements().stream().filter(ele -> ele.getEleName().contains(room2Keyword)).collect(Collectors.toList());
+					List<HolonElement> elementsOfRoom1 = house.hObject.getElements().stream().filter(ele -> ele.getName().contains(room1Keyword)).collect(Collectors.toList());
+					List<HolonElement> elementsOfRoom2 = house.hObject.getElements().stream().filter(ele -> ele.getName().contains(room2Keyword)).collect(Collectors.toList());
 					
 					if(elementsOfRoom1.isEmpty()){
 						if(onlyOnChange) {

+ 1 - 1
src/Connection/socket/Server.java

@@ -245,7 +245,7 @@ public class Server implements Runnable{
 		
 		
 		public void add(HolonElement ele, int index ) {
-			String name = ele.getEleName();
+			String name = ele.getName();
 			//int amount =ele.getAmount();
 			float energy =  ele.getEnergy();
 			boolean enabled = ele.isActive();

+ 1 - 1
src/addOns/Utility/HolonElementSketch.java

@@ -54,7 +54,7 @@ public class HolonElementSketch {
 		FlexibilitySketch constrain = onConstrain?onFlex:offFlex;
 		
 		
-		toCreateFlex.name = nameOfHolonObject + "_" + ele.getEleName() + (onConstrain?"_OnFlex":"_OffFlex");
+		toCreateFlex.name = nameOfHolonObject + "_" + ele.getName() + (onConstrain?"_OnFlex":"_OffFlex");
 		toCreateFlex.speed = 0;
 		toCreateFlex.setDuration(Random.nextIntegerInRange(constrain.minDuration, constrain.maxDuration+1));
 		toCreateFlex.cost = Random.nextFloatInRange(constrain.minCost, constrain.maxCost);

+ 1 - 1
src/classes/Flexibility.java

@@ -109,7 +109,7 @@ public class Flexibility {
 	}
 	@Override
 	public String toString() {
-		return "Flexibility: " + name + " from [HolonElement: " + element.getEleName() + " ID:" + element.getId()+"]";
+		return "Flexibility: " + name + " from [HolonElement: " + element.getName() + " ID:" + element.getId()+"]";
 	}
 
 	

+ 3 - 3
src/classes/HolonElement.java

@@ -50,7 +50,7 @@ public class HolonElement implements TimelineDependent{
     private Priority priority;
 
 	public enum Priority {
-    	Essential, High, Medium , Low
+    	Low, Medium, High, Essential
     }
 
     
@@ -117,7 +117,7 @@ public class HolonElement implements TimelineDependent{
     	this.priority = element.getPriority();
     	setLocalPeriod(element.getLocalPeriod());
     	setUseLocalPeriod(element.isUsingLocalPeriod());
-        setEleName(element.getEleName());
+        setEleName(element.getName());
         setLocalPeriod(element.getLocalPeriod());
         setEnergyPerElement(element.getEnergy());
         setActive(element.isActive());
@@ -139,7 +139,7 @@ public class HolonElement implements TimelineDependent{
      *
      * @return the name String
      */
-    public String getEleName() {
+    public String getName() {
         return eleName;
     }
 

+ 4 - 4
src/classes/HolonObject.java

@@ -91,9 +91,9 @@ public class HolonObject extends AbstractCanvasObject {
         String objString = "Empty";
         for (HolonElement e : elements) {
             if (objString == "Empty") {
-                objString = e.getEleName();
+                objString = e.getName();
             } else {
-                objString = objString + ", " + e.getEleName();
+                objString = objString + ", " + e.getName();
             }
         }
         return objString;
@@ -111,7 +111,7 @@ public class HolonObject extends AbstractCanvasObject {
     public HolonElement searchElement(String name) {
         HolonElement ele = null;
         for (HolonElement e : getElements()) {
-            if (e.getEleName().equals(name)) {
+            if (e.getName().equals(name)) {
                 ele = e;
                 break;
             }
@@ -263,7 +263,7 @@ public class HolonObject extends AbstractCanvasObject {
             if (i != 0) {
                 sb.append(", ");
             }
-            sb.append(el.getEleName());
+            sb.append(el.getName());
         }
         sb.append("]]");
 

+ 2 - 2
src/classes/comparator/elementComparator/ElemCompOnEleName.java

@@ -7,8 +7,8 @@ public class ElemCompOnEleName extends ElementComparator {
 	@Override
 	public int compare(HolonElement a, HolonElement b) {
 
-		String eleNameA = a.getEleName();
-		String eleNameB = b.getEleName();
+		String eleNameA = a.getName();
+		String eleNameB = b.getName();
 
 		return eleNameA.compareTo(eleNameB);
 

+ 2 - 2
src/ui/view/dialog/AddElementPopUp.java

@@ -148,7 +148,7 @@ public class AddElementPopUp extends JDialog {
 	 */
 	public void setElement(HolonElement holonElement) {
 		hl = holonElement;
-		elementName.setText(hl.getEleName());
+		elementName.setText(hl.getName());
 		providedEnergy.setText(""+hl.getEnergy());
 		checkBoxActive.setSelected(hl.isActive());
 		
@@ -160,7 +160,7 @@ public class AddElementPopUp extends JDialog {
 	private void okAction() {
 		boolean repeated = false;
 		for (HolonElement e :  tempCps.getElements()) {
-			if (elementName.getText().equals(e.getEleName())&&(hl == null || hl.getId()!=e.getId())) {
+			if (elementName.getText().equals(e.getName())&&(hl == null || hl.getId()!=e.getId())) {
 				repeated = true;
 				break;
 			}

+ 1 - 1
src/ui/view/dialog/AddObjectPopUp.java

@@ -278,7 +278,7 @@ public class AddObjectPopUp extends JDialog {
 	 */
 	private void addElement(HolonElement hl) {
 		hElements.add(hl);
-		listModel.addElement("x: " + hl.getEleName() + " " + hl.getEnergy() + "U");
+		listModel.addElement("x: " + hl.getName() + " " + hl.getEnergy() + "U");
 	}
 
 	/**

+ 3 - 3
src/ui/view/dialog/CreateTemplatePopUp.java

@@ -210,7 +210,7 @@ public class CreateTemplatePopUp extends JDialog {
 		 * Add Elements to List
 		 */
 		for (HolonElement he : template.getElements())
-			listModel.addElement(he.getEleName()
+			listModel.addElement(he.getName()
 					+ ": " + he.getEnergy() + "U");
 
 		/**
@@ -321,7 +321,7 @@ public class CreateTemplatePopUp extends JDialog {
 		popUp.setVisible(true);
 		HolonElement he = popUp.getElement();
 		if (he != null) {
-			listModel.addElement(he.getEleName()
+			listModel.addElement(he.getName()
 					+ ": " + he.getEnergy() + "U");
 			template.addElement(he);
 			he.setSaving(new Pair<>(category, textField_name.getText()));
@@ -354,7 +354,7 @@ public class CreateTemplatePopUp extends JDialog {
 		HolonElement he = popUp.getElement();
 		if (he != null) {
 			listModel.remove(index);
-			listModel.addElement(he.getEleName()
+			listModel.addElement(he.getName()
 					+ ": " + he.getEnergy() + "U");
 			template.removeElement(index);
 			template.addElement(he);

+ 242 - 84
src/ui/view/inspector/InspectorTable.java

@@ -4,9 +4,13 @@ import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Container;
 import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
 import java.math.RoundingMode;
 import java.text.NumberFormat;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
@@ -14,6 +18,9 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
+import java.util.ArrayList;
+
+import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
 import javax.swing.Box;
 import javax.swing.BoxLayout;
@@ -25,6 +32,8 @@ import javax.swing.JFormattedTextField;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JTextField;
+import javax.swing.KeyStroke;
+import javax.swing.SwingConstants;
 import javax.swing.text.NumberFormatter;
 
 import classes.AbstractCanvasObject;
@@ -48,44 +57,106 @@ public class InspectorTable extends JPanel {
 			return new ElementRow();
 		}
 	};
-	
-	private final int maxDisplayedRowsNumber = 1000;
-	
+
+	private final int maxDisplayedRowsNumber = 100;
+	private int actualPage = 0;
+	private int maxPageNumberForThisSelection = 0;
 	private Control control;
 	private final int columnHeight = 20;
-	//UI
+	// UI
 	private final TrippleCheckBox selectAllCheckBox = new TrippleCheckBox();
 	private final JButton addButton = new JButton();
 	private final JButton duplicateButton = new JButton();
 	private final JButton deleteButton = new JButton();
 	private final JPanel buttonPanel = new JPanel();
+
+	private final JButton pageIncreaseButton = new JButton();
+	private final JButton pageDecreaseButton = new JButton();
+	private final JLabel pageInformationLabel = new JLabel();
+	private final JPanel pageSelectionPanel = new JPanel();
+	private ArrayList<SortButton<ElementRow>> headerButtonList = new ArrayList<>();
 	private final static NumberFormatter doubleFormatter = generateNumberFormatter();
+
+	//sorting
+	private Comparator<ElementRow> actual_comp = (ElementRow a, ElementRow b) -> Float.compare(a.element.getEnergy(), b.element.getEnergy());
 	
-	//Colors
+	// Colors
 	private final static Color selectedColor = new Color(126, 186, 255);
 	private final static Color borderColor = new Color(171, 173, 179);
-	//Events
+	// Events
 	public Action<Set<HolonElement>> OnElementSelectionChanged = new Action<>();
-	private Thread populateRowsThread; 
+	private Thread populateRowsThread;
 	private boolean abortThread = false;
+
 	public InspectorTable(Control control) {
-		control.OnSelectionChanged.addListener(() -> update_ui());
+		control.OnSelectionChanged.addListener(() -> updateInspectorUi());
 		this.control = control;
 		init();
-		generateHeader();
+		addHeader();
 	}
 
-
-
-
 	private void init() {
 		MigLayout layout = new MigLayout("insets 0,gap 0,wrap 7", // Layout Constraints
 				"[][fill, grow][fill][fill, grow][fill, grow][][fill]", // Column constraints
 				"[25!][20:20:20]"); // Row constraints
 		this.setLayout(layout);
 		initSelectAllCheckBox();
-		initButtonPanel();
+		initButtons();
+		initKeyControls();
+		initHeaderButtons();
+	}
+
+	private void initKeyControls() {
+		this.getInputMap(WHEN_IN_FOCUSED_WINDOW)
+				.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, InputEvent.ALT_DOWN_MASK), "PageRight");
+		this.getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, InputEvent.ALT_DOWN_MASK),
+				"PageLeft");
+
+		this.getActionMap().put("PageRight", new AbstractAction() {
+
+			@Override
+			public void actionPerformed(ActionEvent e) {
+				performPageAction(PageAction.Increase);
+			}
+
+		});
+		this.getActionMap().put("PageLeft", new AbstractAction() {
+			@Override
+			public void actionPerformed(ActionEvent e) {
+				performPageAction(PageAction.Decrease);
+			}
+
+		});
+	}
+
+	private enum PageAction {
+		Increase, Decrease
+	};
+
+	private void performPageAction(PageAction action) {
+		int newPageNumber;
+		switch (action) {
+		case Decrease:
+			newPageNumber = Math.max(actualPage - 1, 0);
+			break;
+		case Increase:
+		default:
+			newPageNumber = Math.min(actualPage + 1, maxPageNumberForThisSelection);
+			break;
+		}
+		if (newPageNumber != actualPage) {
+			actualPage = newPageNumber;
+			updateTableUi();
+			updatePageButtonAppearance();
+		}
+
+	}
+
+	private void updatePageButtonAppearance() {
+		this.pageDecreaseButton.setEnabled(actualPage != 0);
+		this.pageIncreaseButton.setEnabled(actualPage != maxPageNumberForThisSelection);
 	}
+
 	private static NumberFormatter generateNumberFormatter() {
 		NumberFormat doubleFormat = NumberFormat.getNumberInstance(Locale.US);
 		doubleFormat.setMinimumFractionDigits(1);
@@ -98,15 +169,29 @@ public class InspectorTable extends JPanel {
 		return doubleFormatter;
 	}
 
-	private void generateHeader() {
-
+	private void initHeaderButtons() {
+		Comparator<ElementRow> objectComp = (ElementRow a, ElementRow b) -> a.element.parentObject.getName().compareTo(b.element.parentObject.getName());
+		Comparator<ElementRow> idComp = (ElementRow a, ElementRow b) -> Integer.compare(a.element.parentObject.getId(), b.element.parentObject.getId());
+		Comparator<ElementRow> deviceComp = (ElementRow a, ElementRow b) -> a.element.getName().compareTo(b.element.getName());
+		Comparator<ElementRow> energyComp = (ElementRow a, ElementRow b) -> Float.compare(a.element.getEnergy(), b.element.getEnergy());
+		Comparator<ElementRow> priorityComp = (ElementRow a, ElementRow b) -> a.element.getPriority().compareTo(b.element.getPriority());
+		Comparator<ElementRow> activeComp = (ElementRow a, ElementRow b) -> Boolean.compare(a.element.isActive(), b.element.isActive());
+;
+		
+		headerButtonList.add(new SortButton<ElementRow>("Object", objectComp));
+		headerButtonList.add(new SortButton<ElementRow>("Id", idComp));
+		headerButtonList.add(new SortButton<ElementRow>("Device", deviceComp));
+		headerButtonList.add(new SortButton<ElementRow>("Energy", energyComp));
+		headerButtonList.add(new SortButton<ElementRow>("Priority", priorityComp));
+		headerButtonList.add(new SortButton<ElementRow>("Activ", activeComp));
+	}
+	
+	
+	private void addHeader() {
 		this.add(selectAllCheckBox);
-		this.add(generateHeaderColumnTitle("Object"));
-		this.add(generateHeaderColumnTitle("Id "));
-		this.add(generateHeaderColumnTitle("Device"));
-		this.add(generateHeaderColumnTitle("Energy"));
-		this.add(generateHeaderColumnTitle("Priority"));
-		this.add(generateHeaderColumnTitle("Activ"));
+		for(SortButton<ElementRow> button : headerButtonList) {
+			this.add(button);
+		}
 	}
 
 	private void initSelectAllCheckBox() {
@@ -123,7 +208,8 @@ public class InspectorTable extends JPanel {
 			}
 				break;
 			case unselected:
-				if(rowPool.getBorrowedCount() == 0) {					
+				// TODO maybe select only current page
+				if (rowPool.getBorrowedCount() != 0) {
 					rowPool.getBorrowedStream().forEach(row -> row.setSelected(true));
 					duplicateButton.setEnabled(true);
 					deleteButton.setEnabled(true);
@@ -134,16 +220,8 @@ public class InspectorTable extends JPanel {
 			updateElementSelection();
 		});
 	}
-	private JLabel generateHeaderColumnTitle(String string) {
-		JLabel columnTitleLabel = new JLabel(string);
-		columnTitleLabel.setToolTipText(string);
-		columnTitleLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
-		return columnTitleLabel;
-	}
-
-
-
-	private void initButtonPanel() {
+	
+	private void initButtons() {
 		buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS));
 		buttonPanel.add(Box.createRigidArea(new Dimension(2, 0)));
 
@@ -156,7 +234,7 @@ public class InspectorTable extends JPanel {
 			last.ifPresent(obj -> {
 				obj.addElement(new HolonElement(obj, "Element", 0.0f));
 				control.calculateStateAndVisualForCurrentTimeStep();
-				update_ui();
+				updateInspectorUi();
 			});
 		});
 		buttonPanel.add(addButton);
@@ -165,12 +243,12 @@ public class InspectorTable extends JPanel {
 		duplicateButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
 		duplicateButton.addActionListener(clicked -> {
 			rowPool.getBorrowedStream().forEach(row -> {
-				if(row.isSelected()) {
+				if (row.isSelected()) {
 					row.element.parentObject.addElement(new HolonElement(row.element));
 				}
 			});
 			control.calculateStateAndVisualForCurrentTimeStep();
-			update_ui();
+			updateInspectorUi();
 		});
 		buttonPanel.add(duplicateButton);
 
@@ -178,55 +256,77 @@ public class InspectorTable extends JPanel {
 		deleteButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
 		deleteButton.addActionListener(clicked -> {
 			rowPool.getBorrowedStream().forEach(row -> {
-				if(row.isSelected()) {
+				if (row.isSelected()) {
 					row.element.parentObject.removeElement(row.element);
 				}
 			});
 			control.calculateStateAndVisualForCurrentTimeStep();
-			update_ui();
+			updateInspectorUi();
 		});
 		buttonPanel.add(deleteButton);
+
+		pageIncreaseButton.setIcon(new ImageIcon(ImageImport.loadImage("Images/page_increase.png", 16, 16)));
+		;
+		pageIncreaseButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
+		pageIncreaseButton.addActionListener(clicked -> this.performPageAction(PageAction.Increase));
+
+		pageDecreaseButton.setIcon(new ImageIcon(ImageImport.loadImage("Images/page_decrease.png", 16, 16)));
+		pageDecreaseButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
+		pageDecreaseButton.addActionListener(clicked -> this.performPageAction(PageAction.Decrease));
+
+		pageInformationLabel.setForeground(Color.gray);
+
+		pageSelectionPanel.setLayout(new BoxLayout(pageSelectionPanel, BoxLayout.LINE_AXIS));
+		pageSelectionPanel.add(Box.createRigidArea(new Dimension(2, 0)));
+		pageSelectionPanel.add(this.pageInformationLabel);
+		pageSelectionPanel.add(Box.createHorizontalGlue());
+		pageSelectionPanel.add(this.pageDecreaseButton);
+		pageSelectionPanel.add(this.pageIncreaseButton);
 	}
 
-	private void update_ui() {
-		
-		if(populateRowsThread != null) {
+	private void assignElementsToRowPool(Set<AbstractCanvasObject> selection) {
+		List<HolonElement> elementList = extractElements(selection).toList();
+		rowPool.clear();
+		for (HolonElement element : elementList) {
+			ElementRow row = rowPool.get();
+			row.setElement(element);
+		}
+		actualPage = 0;
+		this.maxPageNumberForThisSelection = elementList.size() / this.maxDisplayedRowsNumber;
+		updatePageButtonAppearance();
+	}
+
+	private void updateTableUi() {
+
+		// Maybe abort current thread and join them
+		if (populateRowsThread != null) {
 			try {
 				abortThread = true;
 				populateRowsThread.join();
+				populateRowsThread.join();
 				abortThread = false;
 			} catch (InterruptedException e) {
 				e.printStackTrace();
 			}
 		}
-		//clone for concurrency
-		Set<AbstractCanvasObject> selection = new HashSet<>(control.getModel().getSelectedObjects());
 		populateRowsThread = new Thread(() -> {
-			 // time passes      
-			List<HolonElement> elementList = extractElements(selection).toList();
-			int numberOfRows = elementList.size();
+			int numberOfRows = rowPool.getBorrowedCount();
 			this.removeAll();
-			rowPool.clear();
-			generateHeader();
-			for(HolonElement element : elementList)
-			{
-				ElementRow row = rowPool.get();
-				row.setElement(element);
+			addHeader();
+			rowPool.getBorrowedStream().sorted(actual_comp).skip(actualPage * maxDisplayedRowsNumber).limit(maxDisplayedRowsNumber)
+					.takeWhile(row -> !abortThread).forEach(row -> {
+						row.addContainerToInspector();
+					});
+			if (numberOfRows > maxDisplayedRowsNumber) {
+				int lastDisplayedElementNumber = Math.min(numberOfRows, (actualPage + 1) * maxDisplayedRowsNumber);
+				pageInformationLabel.setText(String.format("%d - %d from %d", 1 + actualPage * maxDisplayedRowsNumber,
+						lastDisplayedElementNumber, numberOfRows));
+				this.add(pageSelectionPanel, "span, grow");
 			}
-			rowPool.getBorrowedStream().limit(maxDisplayedRowsNumber).takeWhile(row -> !abortThread).forEach(row -> {
-				row.addContainerToInspector();
-			});
-			if(numberOfRows > maxDisplayedRowsNumber) {
-				int remaining = elementList.size() - maxDisplayedRowsNumber;
-				JLabel remainingLabel = new JLabel(remaining + " more...");
-				remainingLabel.setForeground(Color.gray);
-				this.add(remainingLabel, "span");
-			}
-			
-			
+
 			this.add(buttonPanel, "span");
-			boolean isAtLeastOneHolonObjectSelected = 
-					control.getModel().getSelectedObjects().stream().anyMatch(object -> object instanceof HolonObject);
+			boolean isAtLeastOneHolonObjectSelected = control.getModel().getSelectedObjects().stream()
+					.anyMatch(object -> object instanceof HolonObject);
 			this.addButton.setEnabled(isAtLeastOneHolonObjectSelected);
 			duplicateButton.setEnabled(false);
 			deleteButton.setEnabled(false);
@@ -236,12 +336,19 @@ public class InspectorTable extends JPanel {
 			this.OnElementSelectionChanged.broadcast(new HashSet<HolonElement>());
 		});
 		populateRowsThread.start();
-		
+
 	}
 
+	private void updateInspectorUi() {
+		// clone for concurrency
+		Set<AbstractCanvasObject> selection = new HashSet<>(control.getModel().getSelectedObjects());
+		assignElementsToRowPool(selection);
+		updateTableUi();
+	}
 
 	private void updateElementSelection() {
-		Set<HolonElement> eleSet = rowPool.getBorrowedStream().filter(ele -> ele.isSelected()).map(row -> row.element).collect(Collectors.toSet());
+		Set<HolonElement> eleSet = rowPool.getBorrowedStream().filter(ele -> ele.isSelected()).map(row -> row.element)
+				.collect(Collectors.toSet());
 		this.OnElementSelectionChanged.broadcast(eleSet);
 	}
 
@@ -259,22 +366,20 @@ public class InspectorTable extends JPanel {
 	}
 
 	// Extract elements from a list of AbstractCanvasObjects
-	static Stream<HolonElement>  extractElements(Collection<AbstractCanvasObject> toInspect) {
-		Stream<HolonElement> recursiveLayer = toInspect.stream().filter(object ->object instanceof GroupNode).flatMap(obj -> extractElements(((GroupNode)obj).getNodes()));
+	static Stream<HolonElement> extractElements(Collection<AbstractCanvasObject> toInspect) {
+		Stream<HolonElement> recursiveLayer = toInspect.stream().filter(object -> object instanceof GroupNode)
+				.flatMap(obj -> extractElements(((GroupNode) obj).getNodes()));
 		Stream<HolonElement> thisLayer = toInspect.stream().filter(obj -> obj instanceof HolonObject).flatMap(obj -> {
 			HolonObject ho = (HolonObject) obj;
 			return ho.getElements().stream();
 		});
 		return Stream.concat(thisLayer, recursiveLayer);
 	}
-	
-	
-	
-	
+
 	private class ElementRow {
 		private HolonElement element = null;
 		private Container[] cellsInRow = new Container[7];
-		//TextBoxes
+		// TextBoxes
 		private JTextField elementNameTextField;
 		private JCheckBox selectionBox;
 		private JTextField idObjectTextField;
@@ -282,9 +387,7 @@ public class InspectorTable extends JPanel {
 		private JComboBox<Priority> comboBox;
 		private JCheckBox activeCheckBox;
 		private JTextField objectNameTextField;
-		
-		
-		
+
 		public ElementRow() {
 			this.createEditFields();
 		}
@@ -312,15 +415,12 @@ public class InspectorTable extends JPanel {
 			selectionBox.setSelected(false);
 			objectNameTextField.setText(this.element.parentObject.getName());
 			idObjectTextField.setText(Integer.toString(this.element.parentObject.getId()));
-			elementNameTextField.setText(this.element.getEleName());
+			elementNameTextField.setText(this.element.getName());
 			energyTextField.setValue(this.element.getEnergy());
 			comboBox.setSelectedItem(this.element.getPriority());
 			activeCheckBox.setSelected(this.element.isActive());
 		}
-		
-		
-		
-		
+
 		private void createEditFields() {
 			// Selected
 			JPanel selectedColumnPanel = new JPanel(new BorderLayout());
@@ -345,7 +445,7 @@ public class InspectorTable extends JPanel {
 			objectNameTextField.getDocument().addDocumentListener((SimpleDocumentListener) e -> {
 				this.element.parentObject.setName(objectNameTextField.getText());
 			});
-			objectNameTextField.addActionListener(ae -> update_ui());
+			objectNameTextField.addActionListener(ae -> updateInspectorUi());
 			cellsInRow[1] = objectNameTextField;
 			idObjectTextField = new JTextField();
 			idObjectTextField.setMinimumSize(idObjectTextField.getPreferredSize());
@@ -364,7 +464,7 @@ public class InspectorTable extends JPanel {
 
 			energyTextField = new JFormattedTextField(doubleFormatter);
 			energyTextField.setInputVerifier(getInputVerifier());
-			
+
 			energyTextField.setBackground(Color.white);
 			energyTextField.addPropertyChangeListener(actionEvent -> {
 				try {
@@ -393,7 +493,7 @@ public class InspectorTable extends JPanel {
 			checkBoxWrapperPanel.setBorder(BorderFactory.createLineBorder(borderColor));
 			checkBoxWrapperPanel.setBackground(Color.white);
 			checkBoxWrapperPanel.setMinimumSize(new Dimension(columnHeight, columnHeight));
-			checkBoxWrapperPanel.setMaximumSize(new Dimension(columnHeight, columnHeight));
+			checkBoxWrapperPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, columnHeight));
 			// Active
 			activeCheckBox = new JCheckBox();
 			activeCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 0));
@@ -407,4 +507,62 @@ public class InspectorTable extends JPanel {
 		}
 
 	}
+
+	private enum SortState {
+		None, Descending, Ascending
+	};
+
+	private class SortButton<T> extends JButton {
+		private SortState state = SortState.None;
+		private Comparator<T> comp;
+
+		public SortButton(String text, Comparator<T> comp) {
+			super(text);
+			this.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
+			this.setContentAreaFilled(false);
+			this.setBorderPainted(false);
+			this.setFocusPainted(false);
+			this.setHorizontalAlignment(SwingConstants.LEFT);
+			this.comp = comp;
+			this.addActionListener(onClick -> changeStateOnClick());
+		}
+
+		@SuppressWarnings("unchecked")
+		private void changeStateOnClick() {
+			setState((this.state == SortState.Ascending) ? SortState.Descending : SortState.Ascending);
+			headerButtonList.stream().filter(button -> (button !=this)).forEach(button -> button.setState(SortState.None));
+			actual_comp = (Comparator<ElementRow>) getComp();
+			updateInspectorUi();
+		}
+
+		public void setState(SortState state) {
+			this.state = state;
+			String text = this.getText();
+			// remove order symbols from text
+			text = text.replaceAll("\u25bc|\u25b2", "");
+			// update text
+			switch (state) {
+			case Descending:
+				this.setText(text + "\u25bc");
+				break;
+			case Ascending:
+				this.setText(text + "\u25b2");
+				break;
+			case None:
+			default:
+				this.setText(text);
+				break;
+			}
+		}
+		public Comparator<T> getComp(){
+			switch(state){
+			case Descending:
+				return comp.reversed();	
+			case Ascending:
+			case None:
+			default:
+				return comp;				
+			}
+		}
+	}
 }

+ 3 - 0
src/ui/view/inspector/UnitGraph.java

@@ -85,6 +85,8 @@ public class UnitGraph extends JPanel implements MouseListener, MouseMotionListe
 	private int widthWithBorder, heightWithBorder;
 
 	private EditPointType editPointType;
+	
+	
 
 	/**
 	 * Constructor.
@@ -185,6 +187,7 @@ public class UnitGraph extends JPanel implements MouseListener, MouseMotionListe
 		g2D.setColor(dotColor);
 		g2D.setStroke(new BasicStroke(1));
 		drawCurrentIterartionLine(g2D);
+		g2D.setStroke(new BasicStroke(1, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND, 1.0f, new float[]{6}, 3));
 		this.globalCurve.ifPresent(curve -> {
 			g2D.setColor(globalCurveColor);
 			drawDoubleGraph(g2D, curve.points);

+ 2 - 2
src/ui/view/window/FlexWindow.java

@@ -273,7 +273,7 @@ public class FlexWindow extends JFrame {
 
 	private String createToolTipp(FlexWrapper actual) {
 		String tooltipString = "<html>" +
-	"<b>" + actual.getFlex().name + "( </b>" + actual.getFlex().getElement().getEleName() + "<b> )</b><br>"
+	"<b>" + actual.getFlex().name + "( </b>" + actual.getFlex().getElement().getName() + "<b> )</b><br>"
 	+ ((actual.remainingDuration() != 0)?"<i>Remaining Duration:"+ actual.remainingDuration()+"</i><br>":"") 
 	+ ((actual.remainingTimeTillActivation() != 0)?"<i>Remaining TimeTillActivation:"+ actual.remainingTimeTillActivation()+"</i><br>":"")
 	+ "Duration: " + actual.getFlex().getDuration()  + "<br>"
@@ -728,7 +728,7 @@ public class FlexWindow extends JFrame {
 		}
 		@Override
 		public String toString() {
-			return ele.getEleName() + " Priority:" + ele.getPriority();
+			return ele.getName() + " Priority:" + ele.getPriority();
 		}
 	}
 	

+ 3 - 3
tests/tests/PraktikumHolonsTestClasses.java

@@ -138,9 +138,9 @@ public class PraktikumHolonsTestClasses {
 		HolonElement ele2 = new HolonElement(null, "Fridge", -50f, IdCounter.nextId(CounterType.Element));
         assertTrue("Array not empty",  ele1.getEnergyAtTimeStep(0) == -40);
         assertTrue("Array not empty", ele1.getEnergyAtTimeStep(2) == -40);
-        assertTrue("Name not correct", ele1.getEleName().equals("TV"));
-        ele1.setEleName(ele2.getEleName());
-		assertTrue("Name not correct", ele1.getEleName().equals("Fridge"));
+        assertTrue("Name not correct", ele1.getName().equals("TV"));
+        ele1.setEleName(ele2.getName());
+		assertTrue("Name not correct", ele1.getName().equals("Fridge"));
 	}
 	/**
 	 * Test for Position.