浏览代码

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

Teh-Hai Julian Zheng 8 年之前
父节点
当前提交
bb1e0da46b
共有 5 个文件被更改,包括 279 次插入32 次删除
  1. 4 0
      src/ui/controller/Control.java
  2. 9 0
      src/ui/controller/ObjectController.java
  3. 9 0
      src/ui/model/Model.java
  4. 133 32
      src/ui/view/GUI.java
  5. 124 0
      src/ui/view/searchPopUp.java

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

@@ -171,6 +171,10 @@ public class Control {
 	public void deleteElementCanvas(HolonObject obj, HolonElement ele) {
 		objectController.deleteElement(obj, ele);
 	}
+	
+	public void setClipboardObjects(ArrayList<CpsObject> list) {
+		MODEL.setClipboradObjects(list);
+	}
 
 	/* Global Operations */
 	public int getScale() {

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

@@ -164,4 +164,13 @@ public class ObjectController {
 	public void setSelectedObjectID(int id) {
 		MODEL.setSelectedObjectID(id);
 	}
+	
+	/**
+	 * sets clipBoardObjects
+	 * 
+	 * @param ArrayList of CpsObjects
+	 */
+	public void setClipboardObjects(ArrayList<CpsObject> list) {
+		MODEL.setClipboradObjects(list);
+	}
 }

+ 9 - 0
src/ui/model/Model.java

@@ -26,6 +26,7 @@ public class Model {
 	private HolonElement selectedHolonElement;
 	private CpsEdge selectedEdge;
 	private ArrayList<CpsObject> selectedObjects = new ArrayList<CpsObject>();
+	private ArrayList<CpsObject> clipboardObjects = new ArrayList<CpsObject>();
 
 	private int selectedID = 0;
 	private int autoSaveNr = -1;
@@ -74,6 +75,7 @@ public class Model {
 		setObjectListeners(new LinkedList<ObjectListener>());
 		setCgIdx(new HashMap<String,Integer>());
 		setCvsObjIdx(new HashMap<Integer,Integer>());
+		setClipboradObjects(new ArrayList<CpsObject>());
 	}
 
 	/**
@@ -330,4 +332,11 @@ public class Model {
 		return autoSaveNr;
 	}
 
+	public void setClipboradObjects(ArrayList<CpsObject> c){
+		this.clipboardObjects = c;
+	}
+	
+	public ArrayList<CpsObject> getClipboradObjects(){
+		return clipboardObjects;
+	}
 }

+ 133 - 32
src/ui/view/GUI.java

@@ -22,6 +22,7 @@ import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 
 import javax.swing.AbstractAction;
 import javax.swing.ActionMap;
@@ -70,6 +71,7 @@ import classes.HolonElement;
 import classes.HolonObject;
 import classes.HolonSwitch;
 import classes.HolonTransformer;
+import sun.nio.ch.SelChImpl;
 import ui.controller.Control;
 import ui.model.Model;;
 
@@ -103,6 +105,7 @@ public class GUI<E> implements CategoryListener {
 	private final JLabel elementGraph = new JLabel("None ");
 	private final ArrayList<HolonElement> selectedElements = new ArrayList<HolonElement>();
 	private String holonEleNamesDisplayed = "None ";
+	HashMap<Integer, ArrayList<HolonElement>> eleToDelete = new HashMap<Integer, ArrayList<HolonElement>>();
 
 	private final JTree tree = new JTree();
 	private final JEditorPane dtrpnHereWillBe = new JEditorPane();
@@ -307,6 +310,75 @@ public class GUI<E> implements CategoryListener {
 			}
 		});
 
+		String delDown = "delete";
+		inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0, false), delDown);
+		actionMap.put(delDown, new AbstractAction() {
+			@Override
+			public void actionPerformed(ActionEvent e) {
+				for (CpsObject cps : model.getSelectedCpsObjects()) {
+					controller.delCanvasObject(cps);
+				}
+				model.getSelectedCpsObjects().clear();
+				// controller.setSelectedObjectID(0);
+				for (int i = tableModelHolonElementMulti.getRowCount() - 1; i > -1; i--) {
+					tableModelHolonElementMulti.removeRow(i);
+				}
+				for (int i = tableModelHolonElementSingle.getRowCount() - 1; i > -1; i--) {
+					tableModelHolonElementSingle.removeRow(i);
+				}
+				for (int i = tableModelProperties.getRowCount() - 1; i > -1; i--) {
+					tableModelProperties.removeRow(i);
+				}
+				canvas.repaint();
+				unitGraph.empty();
+			}
+		});
+
+		String cntrlCDown = "controlC";
+		inputMap.put(KeyStroke.getKeyStroke("control C"), cntrlCDown);
+		actionMap.put(cntrlCDown, new AbstractAction() {
+
+			@Override
+			public void actionPerformed(ActionEvent e) {
+				System.out.println("copy");
+				controller.setClipboardObjects((ArrayList<CpsObject>) model.getSelectedCpsObjects().clone());
+			}
+		});
+
+		String cntrlVDown = "controlV";
+		inputMap.put(KeyStroke.getKeyStroke("control V"), cntrlVDown);
+		actionMap.put(cntrlVDown, new AbstractAction() {
+
+			@Override
+			public void actionPerformed(ActionEvent e) {
+				System.out.println("paste");
+				model.getSelectedCpsObjects().clear();
+				CpsObject tCps = null;
+				for (CpsObject cps : model.getClipboradObjects()) {
+					if (cps instanceof HolonObject) {
+						tCps = new HolonObject(cps);
+						((HolonObject) tCps).setElements(((HolonObject) cps).getElements());
+					} else if (cps instanceof HolonSwitch) {
+						tCps = new HolonSwitch(cps);
+					}
+					tCps.setPosition(cps.getPosition());
+					controller.addObjectCanvas(tCps);
+					controller.addSelectedObject(tCps);
+				}
+				canvas.repaint();
+			}
+		});
+
+		String cntrlXDown = "controlX";
+		inputMap.put(KeyStroke.getKeyStroke("control X"), cntrlXDown);
+		actionMap.put(cntrlXDown, new AbstractAction() {
+
+			@Override
+			public void actionPerformed(ActionEvent e) {
+				System.out.println("cut");
+			}
+		});
+
 		frmCyberPhysical.setJMenuBar(menuBar);
 
 		frmCyberPhysical.setIconImage(new ImageIcon(this.getClass().getResource("/Images/Dummy_House.png")).getImage()
@@ -462,18 +534,20 @@ public class GUI<E> implements CategoryListener {
 		 */
 		btnAddHolEL.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent arg0) {
-				CpsObject tempCpsObject = getActualCps();
-				if (tempCpsObject != null && tempCpsObject.getClass() == HolonObject.class
-						&& tempCpsObject.getID() != 0) {
-					addElementPopUp = new AddElementPopUp();
-					addElementPopUp.setActualCps(getActualCps());
-					addElementPopUp.setVisible(true);
-					HolonElement ele = addElementPopUp.getElement();
-					controller.addElementCanvasObject(tempCpsObject.getID(), ele.getEleName(), ele.getAmount(),
-							ele.getEnergy());
-					refreshTableHolonElement();
-					refreshTableProperties();
-					controller.calculateStateForTimeStep(model.getCurIteration());
+				if (model.getSelectedCpsObjects().size() == 1) {
+					CpsObject tempCpsObject = getActualCps();
+					if (tempCpsObject != null && tempCpsObject.getClass() == HolonObject.class
+							&& tempCpsObject.getID() != 0) {
+						addElementPopUp = new AddElementPopUp();
+						addElementPopUp.setActualCps(getActualCps());
+						addElementPopUp.setVisible(true);
+						HolonElement ele = addElementPopUp.getElement();
+						controller.addElementCanvasObject(tempCpsObject.getID(), ele.getEleName(), ele.getAmount(),
+								ele.getEnergy());
+						refreshTableHolonElement();
+						refreshTableProperties();
+						controller.calculateStateForTimeStep(model.getCurIteration());
+					}
 				}
 			}
 		});
@@ -482,15 +556,25 @@ public class GUI<E> implements CategoryListener {
 		 */
 		btnDelHolEL.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent arg0) {
-				if (getActualCps().getClass() == HolonObject.class) {
-					HolonObject obj = (HolonObject) getActualCps();
-					tempElement = getActualHolonElement(obj, yValueElements);
-					if (tempElement != null && obj.getClass() == HolonObject.class && obj.getID() != 0) {
-						controller.deleteElementCanvas(obj.getID(), tempElement.getEleName());
-						refreshTableHolonElement();
-						refreshTableProperties();
-						controller.calculateStateForTimeStep(model.getCurIteration());
+				if (model.getSelectedCpsObjects().size() == 1) {
+					if (getActualCps().getClass() == HolonObject.class) {
+						HolonObject obj = (HolonObject) getActualCps();
+						for (HolonElement e : selectedElements) {
+							controller.deleteElementCanvas(obj.getID(), e.getEleName());
+							refreshTableHolonElement();
+							refreshTableProperties();
+							controller.calculateStateForTimeStep(model.getCurIteration());
+							// Names displayed in graph are not updated
+						}
 					}
+				} else if (model.getSelectedCpsObjects().size() > 1) {
+					for (Integer i : eleToDelete.keySet()) {
+						for (HolonElement e : eleToDelete.get(i)) {
+							controller.deleteElementCanvas(i, e.getEleName());
+						}
+					}
+					refreshTableHolonElement();
+					refreshTableProperties();
 				}
 			}
 		});
@@ -503,9 +587,9 @@ public class GUI<E> implements CategoryListener {
 				yValueElements = e.getY();
 				HolonElement ele = null;
 				if (model.getSelectedCpsObjects().size() == 1) {
-					ele = getActualHolonElement(obj, yValueElements);
+					ele = getActualHolonElement(obj, yValueElements, 0);
 				} else {
-					ele = getActualHolonElement(null, yValueElements);
+					ele = getActualHolonElement(null, yValueElements, 0);
 				}
 				if (e.isControlDown() && ele != null) {
 					if (!selectedElements.contains(ele)) {
@@ -517,9 +601,11 @@ public class GUI<E> implements CategoryListener {
 						}
 						unitGraph.repaintWithNewElement(selectedElements);
 					}
+					getActualHolonElement(null, yValueElements, 2);
 				} else if (ele != null) {
 					selectedElements.clear();
 					selectedElements.add(ele);
+					getActualHolonElement(null, yValueElements, 1);
 					holonEleNamesDisplayed = ele.getEleName() + " ";
 					unitGraph.repaintWithNewElement(selectedElements);
 				} else {
@@ -569,13 +655,13 @@ public class GUI<E> implements CategoryListener {
 						int selectedValueBX = (int) Math.floor(xBTHIS / (tableHolonElement.getWidth() / 5));
 						if (getHolonObj(yMouse) != null) {
 							if (selectedValueBX == 4) {
-								HolonElement eleBTemp = getActualHolonElement(null, yBMouse);
+								HolonElement eleBTemp = getActualHolonElement(null, yBMouse, 0);
 								String newBStuff = tableModelHolonElementMulti
 										.getValueAt(selectedValueBY, selectedValueBX).toString();
 								Boolean bTemp = Boolean.parseBoolean(newBStuff);
 								eleBTemp.setActive(bTemp);
 							} else {
-								HolonElement eleTemp = getActualHolonElement(null, yMouse);
+								HolonElement eleTemp = getActualHolonElement(null, yMouse, 0);
 								String newStuff = tableModelHolonElementMulti.getValueAt(selectedValueY, selectedValueX)
 										.toString();
 								// Small bug, when it comes to edit the name of
@@ -597,13 +683,13 @@ public class GUI<E> implements CategoryListener {
 						int selectedValueBX = (int) Math.floor(xBTHIS / (tableHolonElement.getWidth() / 4));
 						if (getActualCps() != null && getActualCps().getClass() == HolonObject.class) {
 							if (selectedValueBX == 3) {
-								HolonElement eleBTemp = getActualHolonElement((HolonObject) getActualCps(), yBMouse);
+								HolonElement eleBTemp = getActualHolonElement((HolonObject) getActualCps(), yBMouse, 0);
 								String newBStuff = tableModelHolonElementSingle
 										.getValueAt(selectedValueBY, selectedValueBX).toString();
 								Boolean bTemp = Boolean.parseBoolean(newBStuff);
 								eleBTemp.setActive(bTemp);
 							} else {
-								HolonElement eleTemp = getActualHolonElement((HolonObject) getActualCps(), yMouse);
+								HolonElement eleTemp = getActualHolonElement((HolonObject) getActualCps(), yMouse, 0);
 								String newStuff = tableModelHolonElementSingle
 										.getValueAt(selectedValueY, selectedValueX).toString();
 								// Small bug, when it comes to edit the name of
@@ -618,11 +704,6 @@ public class GUI<E> implements CategoryListener {
 									eleTemp.setAmount(iTemp);
 								}
 							}
-							// for (HolonElement e : ((HolonObject)
-							// getActualCps()).getElements()) {
-							// System.out.println(e.getEleName() + ", " +
-							// e.getEnergy() + ", " + e.getAmount());
-							// }
 							refreshTableProperties();
 							tableModelHolonElementSingle.fireTableDataChanged();
 							controller.calculateStateForTimeStep(model.getCurIteration());
@@ -1363,9 +1444,12 @@ public class GUI<E> implements CategoryListener {
 	 *            selected HolonObject
 	 * @param yValue
 	 *            Y-Coord in the HolonElementsTable
+	 * @param toMultiHash
+	 *            0 means no MultiSelection, 1 means MultiSelection without
+	 *            Control, 2 means MultiSelection with Control
 	 * @return the selected HolonElement
 	 */
-	public HolonElement getActualHolonElement(HolonObject obj, int yValue) {
+	public HolonElement getActualHolonElement(HolonObject obj, int yValue, int toMultiHash) {
 		final int yTemp = (int) Math.floor(yValue / 16);
 		int rowsTotal = tableModelHolonElementSingle.getRowCount();
 		if (obj == null) {
@@ -1379,13 +1463,30 @@ public class GUI<E> implements CategoryListener {
 				int idTemp = Integer.parseInt(temp.split(", ")[1]);
 				obtTemp = (HolonObject) controller.searchByID(idTemp);
 				eleTempName = tableModelHolonElementMulti.getValueAt(yTemp, 1).toString();
+				ArrayList<HolonElement> eleTemp = new ArrayList<HolonElement>();
+				if (eleToDelete.containsKey(idTemp) && toMultiHash == 2) {
+					eleTemp = eleToDelete.get(idTemp);
+					if (!eleTemp.contains(obtTemp.searchElement(eleTempName))) {
+						eleTemp.add(obtTemp.searchElement(eleTempName));
+						eleToDelete.replace(idTemp, eleTemp);
+					}
+				} else if (toMultiHash == 2) {
+					eleTemp.add(obtTemp.searchElement(eleTempName));
+					eleToDelete.put(idTemp, eleTemp);
+				} else if (toMultiHash == 1) {
+					eleToDelete = new HashMap<Integer, ArrayList<HolonElement>>();
+					eleTemp.add(obtTemp.searchElement(eleTempName));
+					eleToDelete.put(idTemp, eleTemp);
+				}
 			} else {
+				eleToDelete = new HashMap<Integer, ArrayList<HolonElement>>();
 				obtTemp = obj;
 				eleTempName = tableModelHolonElementSingle.getValueAt(yTemp, 0).toString();
 			}
 			model.setSelectedHolonElement(obtTemp.searchElement(eleTempName));
 			return obtTemp.searchElement(eleTempName);
 		} else {
+			eleToDelete = new HashMap<Integer, ArrayList<HolonElement>>();
 			model.setSelectedHolonElement(null);
 			return null;
 		}

+ 124 - 0
src/ui/view/searchPopUp.java

@@ -0,0 +1,124 @@
+package ui.view;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.border.EmptyBorder;
+import javax.swing.JLabel;
+
+import java.awt.Font;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JTextField;
+import javax.swing.JRadioButton;
+import javax.swing.JButton;
+
+import ui.controller.MultiPurposeController;
+
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+
+public class searchPopUp extends JDialog {
+	private final JPanel contentPanel = new JPanel();
+	private JTextField replaceTextField;
+	private JTextField findTextField;
+	private MultiPurposeController multiController;
+	
+	searchPopUp(MultiPurposeController multiCont){
+		super((java.awt.Frame) null, true);
+		setModalityType(java.awt.Dialog.ModalityType.APPLICATION_MODAL);
+		this.setTitle("Search for Objects");
+		setBounds(100, 100, 238, 360);
+		getContentPane().setLayout(new BorderLayout());
+		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
+		getContentPane().add(contentPanel, BorderLayout.CENTER);
+		contentPanel.setLayout(null);
+		
+		multiController = multiCont;
+		
+		JLabel lblFind = new JLabel("Find:");
+		lblFind.setFont(new Font("Tahoma", Font.PLAIN, 13));
+		lblFind.setBounds(10, 11, 46, 19);
+		contentPanel.add(lblFind);
+		
+		JLabel lblReplace = new JLabel("Replace:");
+		lblReplace.setFont(new Font("Tahoma", Font.PLAIN, 13));
+		lblReplace.setBounds(10, 41, 56, 14);
+		contentPanel.add(lblReplace);
+		
+		replaceTextField = new JTextField();
+		replaceTextField.setBounds(76, 39, 101, 20);
+		contentPanel.add(replaceTextField);
+		replaceTextField.setColumns(10);
+		
+		findTextField = new JTextField();
+		findTextField.setBounds(76, 11, 101, 20);
+		contentPanel.add(findTextField);
+		findTextField.setColumns(10);
+		
+		JLabel lblNewLabel = new JLabel("Direction");
+		lblNewLabel.setFont(new Font("Tahoma", Font.BOLD, 13));
+		lblNewLabel.setBounds(10, 90, 82, 14);
+		contentPanel.add(lblNewLabel);
+		
+		JRadioButton rdbtnForward = new JRadioButton("Forward");
+		rdbtnForward.setFont(new Font("Tahoma", Font.PLAIN, 13));
+		rdbtnForward.setBounds(10, 111, 109, 23);
+		contentPanel.add(rdbtnForward);
+		
+		JRadioButton rdbtnBackward = new JRadioButton("Backward");
+		rdbtnBackward.setFont(new Font("Tahoma", Font.PLAIN, 13));
+		rdbtnBackward.setBounds(10, 137, 109, 23);
+		contentPanel.add(rdbtnBackward);
+		
+		JLabel lblScope = new JLabel("Scope");
+		lblScope.setFont(new Font("Tahoma", Font.BOLD, 13));
+		lblScope.setBounds(122, 90, 46, 14);
+		contentPanel.add(lblScope);
+		
+		JRadioButton rdbtnAll = new JRadioButton("All");
+		rdbtnAll.setFont(new Font("Tahoma", Font.PLAIN, 13));
+		rdbtnAll.setBounds(121, 112, 109, 23);
+		contentPanel.add(rdbtnAll);
+		
+		JRadioButton rdbtnSingle = new JRadioButton("Single");
+		rdbtnSingle.setFont(new Font("Tahoma", Font.PLAIN, 13));
+		rdbtnSingle.setBounds(121, 138, 109, 23);
+		contentPanel.add(rdbtnSingle);
+		
+		JButton btnFind = new JButton("Find");
+		btnFind.setFont(new Font("Tahoma", Font.PLAIN, 13));
+		btnFind.setBounds(10, 186, 89, 23);
+		contentPanel.add(btnFind);
+		
+		JButton btnReplace = new JButton("Replace");
+		btnReplace.setFont(new Font("Tahoma", Font.PLAIN, 13));
+		btnReplace.setBounds(110, 187, 89, 23);
+		contentPanel.add(btnReplace);
+		
+		JButton btnReplaceAll = new JButton("Replace All");
+		btnReplaceAll.setFont(new Font("Tahoma", Font.PLAIN, 11));
+		btnReplaceAll.setBounds(110, 218, 89, 23);
+		contentPanel.add(btnReplaceAll);
+		
+		JButton btnClose = new JButton("Close");
+		btnClose.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent arg0) {
+				dispose();
+			}
+		});
+		btnClose.setFont(new Font("Tahoma", Font.PLAIN, 13));
+		btnClose.setBounds(110, 287, 89, 23);
+		contentPanel.add(btnClose);
+		
+		ButtonGroup directionbtns = new ButtonGroup();
+		ButtonGroup scopebtns = new ButtonGroup();
+		
+		directionbtns.add(rdbtnBackward);
+		directionbtns.add(rdbtnForward);
+		scopebtns.add(rdbtnSingle);
+		scopebtns.add(rdbtnAll);
+
+	}
+}