Browse Source

Adds CanvasPopUpMenu

TomTroppmann 2 years ago
parent
commit
3cb5ccbb18

+ 1 - 1
src/holeg/preferences/ColorPreference.java

@@ -94,7 +94,7 @@ public class ColorPreference {
     }
 
     public static class Category {
-        public final static Color Focus = new Color(0, 0, 255);
+        public final static Color Focus = new Color(219, 245, 255);
     }
 
     public static class Inspector {

+ 106 - 59
src/holeg/ui/view/category/CategoryPanel.java

@@ -8,6 +8,7 @@ import holeg.preferences.ImagePreference;
 import holeg.ui.controller.Control;
 import holeg.ui.model.GuiSettings;
 import holeg.ui.view.canvas.Canvas;
+import holeg.ui.view.dialog.AddObjectPopUp;
 import holeg.ui.view.dialog.CreateNewDialog;
 import holeg.ui.view.image.Import;
 import holeg.ui.view.main.Gui;
@@ -19,7 +20,6 @@ import javax.swing.tree.TreeCellRenderer;
 import java.awt.*;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-import java.util.Collection;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.logging.Logger;
@@ -40,14 +40,19 @@ public class CategoryPanel extends JScrollPane {
     private final JMenuItem mItemObject = new JMenuItem("Object");
     private final JMenuItem mItemSwitch = new JMenuItem("Switch");
 
+    private final JPopupMenu contextMenu = new JPopupMenu();
+    private final JMenuItem editItem = new JMenuItem("Edit Object");
+    private final JMenuItem removeItem = new JMenuItem("Remove");
+
+
     private final JTree categoryTree = new JTree();
 
     public CategoryPanel(Control control, Gui gui) {
         this.control = control;
         this.gui = gui;
         init();
-        updateCategories(GuiSettings.getCategories());
-        control.OnCategoryChanged.addListener(() -> this.updateCategories(GuiSettings.getCategories()));
+        updateCategories();
+        control.OnCategoryChanged.addListener(this::updateCategories);
     }
 
     private void init() {
@@ -56,7 +61,7 @@ public class CategoryPanel extends JScrollPane {
         toolBar.setFloatable(false);
         initLayout();
         initButtons();
-
+        initContextHandle();
         categoryTree.setCellRenderer(new CategoryTreeRenderer());
         categoryTree.setRowHeight(NODE_SIZE);
         CategoryMouseListener mouseListener = new CategoryMouseListener();
@@ -67,7 +72,25 @@ public class CategoryPanel extends JScrollPane {
         setViewportView(categoryTree);
     }
 
-    private void initLayout(){
+    private void initContextHandle() {
+        contextMenu.add(editItem);
+        contextMenu.add(removeItem);
+        editItem.addActionListener(clicked -> getSelectedNode().ifPresent(node -> {
+            ObjectTreeNode objectNode = (ObjectTreeNode) node;
+            new AddObjectPopUp(control, objectNode.getObject(), objectNode.getCategory(), gui);
+        }));
+        removeItem.addActionListener(clicked -> getSelectedNode().ifPresent(selectedNode -> {
+            if (selectedNode instanceof CategoryTreeNode node) {
+                GuiSettings.getCategories().remove(node.category);
+            } else if (selectedNode instanceof ObjectTreeNode node) {
+                node.getCategory().getObjects().remove(node.getObject());
+            }
+            updateCategories();
+        }));
+        categoryTree.setComponentPopupMenu(contextMenu);
+    }
+
+    private void initLayout() {
         buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
         btnAddPopUp.add(mItemNew);
         btnAddPopUp.addSeparator();
@@ -78,7 +101,8 @@ public class CategoryPanel extends JScrollPane {
         toolBar.add(btnDel);
         buttonPanel.add(toolBar);
     }
-    private void initButtons(){
+
+    private void initButtons() {
         mItemNew.addActionListener(clicked -> new CreateNewDialog(control, gui));
         mItemCategory.addActionListener(clicked -> new CreateNewDialog(control, CreateNewDialog.Option.Category, gui));
         mItemObject.addActionListener(clicked -> new CreateNewDialog(control, CreateNewDialog.Option.Object, gui));
@@ -89,7 +113,7 @@ public class CategoryPanel extends JScrollPane {
         btnDel.setToolTipText("<html><b>Delete</b><br>Removes a Category or a Category Item.</html>");
     }
 
-    private void TryDeleteSelectedCategory(){
+    private void TryDeleteSelectedCategory() {
         Optional<DefaultMutableTreeNode> selectedNode = Optional.ofNullable((DefaultMutableTreeNode) categoryTree.getLastSelectedPathComponent());
         selectedNode.ifPresentOrElse(node -> {
             if (node instanceof CategoryTreeNode catNode) {
@@ -109,16 +133,20 @@ public class CategoryPanel extends JScrollPane {
 
     /**
      * When changes are made to the Categories.
-     *
-     * @param categories the Categories
      */
-    private void updateCategories(Collection<Category> categories) {
+    private void updateCategories() {
         DefaultMutableTreeNode root = new DefaultMutableTreeNode("Categories");
-        categories.stream().map(CategoryTreeNode::new).forEach(root::add);
+        GuiSettings.getCategories().stream().map(CategoryTreeNode::new).forEach(root::add);
         categoryTree.setModel(new DefaultTreeModel(root));
     }
 
+    private Optional<DefaultMutableTreeNode> getSelectedNode() {
+        return Optional.ofNullable((DefaultMutableTreeNode) categoryTree.getLastSelectedPathComponent());
+    }
+
+
     private static class CategoryTreeRenderer implements TreeCellRenderer {
+
         @Override
         public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
                                                       boolean leaf, int row, boolean hasFocus) {
@@ -130,60 +158,14 @@ public class CategoryPanel extends JScrollPane {
                 label.setIcon(new ImageIcon(image));
             }
             if (hasFocus) {
-                label.setForeground(ColorPreference.Category.Focus);
+                //label.setForeground(ColorPreference.Category.Focus);
+                label.setBackground(ColorPreference.Category.Focus);
                 label.setOpaque(true);
             }
             return label;
         }
     }
 
-    private class CategoryMouseListener extends MouseAdapter{
-        AbstractCanvasObject selected = null;
-
-        @Override
-        public void mousePressed(MouseEvent e) {
-            Optional<DefaultMutableTreeNode> selectedNode = Optional.ofNullable(
-                    (DefaultMutableTreeNode) categoryTree.getLastSelectedPathComponent());
-            selectedNode.ifPresent(node -> {
-                int depthOfNode = node.getLevel();
-                if (depthOfNode != 2) {
-                    return;
-                }
-                ObjectTreeNode objectNode = (ObjectTreeNode) node;
-                selected = objectNode.getObject();
-                log.info("Test" + selected);
-                Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor(Import.loadImage(selected.getImagePath(), 32, 32), new Point(),
-                        "Image");
-                gui.setCursor(cursor);
-            });
-        }
-
-        @Override
-        public void mouseReleased(MouseEvent e) {
-            if(selected == null){
-                return;
-            }
-            gui.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
-            Canvas groupNodeCanvas = gui.getCanvas();
-            Optional<Point> positionInCanvas = Optional.ofNullable(groupNodeCanvas.getMousePosition());
-            AbstractCanvasObject finalTempCps = selected;
-            final int halfCursorSize = GuiSettings.getPictureScaleDiv2();
-            positionInCanvas.ifPresent(pos -> {
-                AbstractCanvasObject obj = null;
-                if (finalTempCps instanceof HolonObject hO) {
-                    obj = new HolonObject(hO);
-                    obj.setPosition(pos.x + halfCursorSize, pos.y + halfCursorSize);
-                } else if (finalTempCps instanceof HolonSwitch sw) {
-                    obj = new HolonSwitch(sw);
-                    obj.setPosition(pos.x + halfCursorSize, pos.y + halfCursorSize);
-                }
-                control.addObjectOnCanvas(groupNodeCanvas.getGroupNode(), obj);
-                control.calculateStateAndVisualForCurrentTimeStep();
-            });
-            selected = null;
-        }
-    }
-
     private static class CategoryTreeNode extends DefaultMutableTreeNode {
         private final Category category;
 
@@ -216,4 +198,69 @@ public class CategoryPanel extends JScrollPane {
             return category;
         }
     }
+
+    private class CategoryMouseListener extends MouseAdapter {
+        AbstractCanvasObject selected = null;
+
+        @Override
+        public void mousePressed(MouseEvent e) {
+            if (SwingUtilities.isRightMouseButton(e)) {
+                preparePopUpMenu(e);
+                return;
+            }
+            getSelectedNode().ifPresent(node -> {
+                if (node.getLevel() != 2) {
+                    return;
+                }
+                ObjectTreeNode objectNode = (ObjectTreeNode) node;
+                selected = objectNode.getObject();
+                Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor(Import.loadImage(selected.getImagePath(), 32, 32), new Point(),
+                        "Image");
+                gui.setCursor(cursor);
+
+            });
+        }
+
+        private void preparePopUpMenu(MouseEvent e) {
+            categoryTree.setSelectionPath(categoryTree.getPathForLocation(e.getX(), e.getY()));
+            getSelectedNode().ifPresent(selectedNode -> {
+                if (selectedNode instanceof CategoryTreeNode) {
+                    editItem.setVisible(false);
+                    removeItem.setVisible(true);
+                } else if (selectedNode instanceof ObjectTreeNode) {
+                    editItem.setVisible(true);
+                    removeItem.setVisible(true);
+                }else{
+                    editItem.setVisible(false);
+                    removeItem.setVisible(false);
+                }
+            });
+        }
+
+        @Override
+        public void mouseReleased(MouseEvent e) {
+            if (selected == null) {
+                return;
+            }
+            gui.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
+            Canvas groupNodeCanvas = gui.getCanvas();
+            Optional<Point> positionInCanvas = Optional.ofNullable(groupNodeCanvas.getMousePosition());
+            AbstractCanvasObject selectedObj = selected;
+            selected = null;
+            final int halfCursorSize = GuiSettings.getPictureScaleDiv2();
+            positionInCanvas.ifPresent(pos -> {
+                AbstractCanvasObject obj;
+                if (selectedObj instanceof HolonObject hO) {
+                    obj = new HolonObject(hO);
+                } else if (selectedObj instanceof HolonSwitch sw) {
+                    obj = new HolonSwitch(sw);
+                }else {
+                    return;
+                }
+                obj.setPosition(pos.x + halfCursorSize, pos.y + halfCursorSize);
+                control.addObjectOnCanvas(groupNodeCanvas.getGroupNode(), obj);
+                control.calculateStateAndVisualForCurrentTimeStep();
+            });
+        }
+    }
 }

+ 31 - 110
src/holeg/ui/view/dialog/AddObjectPopUp.java

@@ -1,79 +1,54 @@
 package holeg.ui.view.dialog;
 
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.FlowLayout;
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-
-import javax.swing.DefaultListModel;
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JFileChooser;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JList;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTextField;
-import javax.swing.SwingConstants;
-import javax.swing.border.EmptyBorder;
-import javax.swing.filechooser.FileNameExtensionFilter;
-
 import holeg.model.AbstractCanvasObject;
 import holeg.model.HolonElement;
 import holeg.model.HolonObject;
 import holeg.preferences.ColorPreference;
 import holeg.preferences.ImagePreference;
 import holeg.ui.controller.Control;
+import holeg.ui.view.category.Category;
 import holeg.ui.view.image.Import;
 
+import javax.swing.*;
+import javax.swing.border.EmptyBorder;
+import javax.swing.filechooser.FileNameExtensionFilter;
+import java.awt.*;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.io.*;
+import java.util.ArrayList;
+
 /**
  * Popup for adding a Holon Object to a Category.
  * 
  * @author Gruppe14
  */
 public class AddObjectPopUp extends JDialog {
-
-	private static final long serialVersionUID = 1L;
 	private AddElementPopUp addElement;
-	private JTextField objectName;
-	private JTextField sourcePath;
-	private ArrayList<HolonElement> hElements;
-	private DefaultListModel<String> listModel;
-	private JList<String> list;
+	private final JTextField objectName;
+	private final JTextField sourcePath;
+	private final ArrayList<HolonElement> hElements;
+	private final DefaultListModel<String> listModel;
+	private final JList<String> list;
 	private String imagePath;
 	// private HolonObject theObject;
-	private Control controller;
+	private final Control control;
 	private File selectedFile = null;
 	private String filePath = " ";
-	private String givenCategory;
-	private JLabel lblImagePreview;
-	private AbstractCanvasObject toEdit;
-	private boolean editState;
+	private final JLabel lblImagePreview;
+	private final AbstractCanvasObject toEdit;
 	private boolean imageChanged = false;
 
 	/**
 	 * Create the dialog.
-	 * 
-	 * @param edit true if edit
 	 * @param obj  the object
-	 * @param cat  the categorie
+	 * @param category  the categorie
 	 */
-	public AddObjectPopUp(boolean edit, AbstractCanvasObject obj, String cat, JFrame parentFrame) {
-
+	public AddObjectPopUp(Control control, AbstractCanvasObject obj, Category category, JFrame parentFrame) {
+		this.control = control;
 		toEdit = obj;
-		editState = edit;
 		this.setIconImage(Import.loadImage(ImagePreference.Logo, 30, 30));
 		setBounds(100, 100, 450, 342);
 		setLocationRelativeTo(parentFrame);
@@ -108,7 +83,7 @@ public class AddObjectPopUp extends JDialog {
 					objectName.setBackground(Color.WHITE);
 				}
 			});
-			if (edit) {
+			if (true) {
 				objectName.setText(obj.getName());
 			}
 			objectName.setBounds(98, 18, 172, 20);
@@ -147,11 +122,11 @@ public class AddObjectPopUp extends JDialog {
 					sourcePath.setBackground(Color.WHITE);
 				}
 			});
-			if (edit) {
+			if (true) {
 				lblImagePreview.setIcon(new ImageIcon(Import.loadImage(obj.getImagePath(), 50, 50)));
 			}
 			sourcePath.setBounds(148, 77, 271, 20);
-			if (edit) {
+			if (true) {
 				this.filePath = obj.getImagePath();
 				sourcePath.setText(filePath);
 			}
@@ -193,7 +168,7 @@ public class AddObjectPopUp extends JDialog {
 				scrollPane.setViewportView(list);
 			}
 		}
-		if (edit) {
+		if (true) {
 			((HolonObject) obj).elementsStream().forEach(hE -> {
 				addElement(hE);
 			});
@@ -226,29 +201,10 @@ public class AddObjectPopUp extends JDialog {
 								if (imageChanged)
 									copieFile();
 								imageChanged = false;
-								try {
-									if (editState) {
-										controller.findCategoryWithName(givenCategory).ifPresent(cat -> {
-											cat.findObjectWithName(toEdit.getName()).ifPresent(object -> {
-												cat.getObjects().remove(object);
-											});
-											controller.addObject(cat, objectName.getText(), hElements, imagePath);
-										});
-
-									} else {
-										controller.findCategoryWithName(givenCategory).ifPresent(cat -> {
-											controller.addObject(cat, objectName.getText(), hElements, imagePath);
-										});
-									}
-
-								} catch (Exception e2) {
+								if (category != null) {
+									category.getObjects().remove(toEdit);
+									AddObjectPopUp.this.control.addObject(category, objectName.getText(), hElements, imagePath);
 								}
-
-								// controller.addObjectCategory(controller.searchCategory(givenCategory),
-								// theObject);
-								//
-								// System.out.println(theObject.getImage());
-
 								dispose();
 							} else {
 								sourcePath.setBackground(ColorPreference.Dialog.BackgroundColor);
@@ -269,6 +225,7 @@ public class AddObjectPopUp extends JDialog {
 				buttonPane.add(cancelButton);
 				cancelButton.addActionListener(e -> dispose());
 			}
+			setVisible(true);
 		}
 	}
 
@@ -333,40 +290,4 @@ public class AddObjectPopUp extends JDialog {
 		}
 	}
 
-//	/**
-//	 * Edit the Information.
-//	 *
-//	 * @param obj
-//	 *            the CpsObject
-//	 */
-//	public void editInformation(HolonObject obj) {
-//		objectName.setText(obj.getName());
-//	}
-
-//	/**
-//	 * Return the Object.
-//	 *
-//	 * @return the CpsObject
-//	 */
-//	public HolonObject getObject() {
-//		return theObject;
-//	}
-
-	/**
-	 * Sets the Controller.
-	 * 
-	 * @param controller the controller
-	 */
-	public void setController(Control controller) {
-		this.controller = controller;
-	}
-
-	/**
-	 * Set the Category.
-	 * 
-	 * @param cat the Category
-	 */
-	public void setCategory(String cat) {
-		givenCategory = cat;
-	}
 }

+ 14 - 9
src/holeg/ui/view/dialog/CreateNewDialog.java

@@ -5,6 +5,7 @@ import java.awt.CardLayout;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
 import java.awt.GridLayout;
+import java.util.logging.Logger;
 
 import javax.swing.JButton;
 import javax.swing.JComboBox;
@@ -15,13 +16,16 @@ import javax.swing.JPanel;
 import javax.swing.JTextField;
 
 import holeg.model.HolonObject;
+import holeg.model.Model;
 import holeg.ui.controller.Control;
 
 
 
 public class CreateNewDialog extends JDialog{
 	//DefaultConstructor
-	String[] optionStrings = { "","Category", "Object", "Battery", "Switch"};
+	String[] optionStrings = { "","Category", "Object", "Switch"};
+	private static final Logger log = Logger.getLogger(CreateNewDialog.class.getName());
+
 	public static enum Option {
 		None, Category, Object, Switch;
 		public static Option getEnumAtIndex(int desired){
@@ -151,14 +155,15 @@ public class CreateNewDialog extends JDialog{
 
 	private void makeOldObjectPopUp(String categoryName) {
 		//TODO(Tom2021-12-1): del and make own on
-		
-		HolonObject hO = new HolonObject("");
-		
-		AddObjectPopUp addObjectPopUP = new AddObjectPopUp(false,hO , "hei", null);
-		addObjectPopUP.setVisible(true);
-		addObjectPopUP.setController(actualController);
-		addObjectPopUP.setCategory(categoryName);
-		dispose();
+		log.warning("TODO");
+//
+//		HolonObject hO = new HolonObject("");
+//
+//		AddObjectPopUp addObjectPopUP = new AddObjectPopUp(false,hO , "hei", null);
+//		addObjectPopUP.setVisible(true);
+//		addObjectPopUP.setController(actualController);
+//		addObjectPopUP.setCategory(categoryName);
+//		dispose();
 	}
 
 

+ 3 - 25
src/holeg/ui/view/main/Gui.java

@@ -52,8 +52,7 @@ public class Gui extends JFrame{
     // the original tabbed Pane (containing tabs for view, statistics, holon,
     // flexibility)
     private final JTabbedPane tabbedPaneOriginal = new JTabbedPane(JTabbedPane.TOP);
-    private final JPopupMenu popmenuEdit = new JPopupMenu();
-    private final JMenuItem editItem = new JMenuItem("Edit Object");
+
 
     /******************************************
      ************* Right Container*************
@@ -85,7 +84,7 @@ public class Gui extends JFrame{
     // Time Stuff
     private TimePanel timePanel;
 
-    private final JMenuItem removeItem = new JMenuItem("Remove");
+
 
     /**
      * Create the application.
@@ -294,28 +293,7 @@ public class Gui extends JFrame{
 
 
 
-        popmenuEdit.add(editItem);
-        popmenuEdit.add(removeItem);
-        editItem.setEnabled(false);
-        String catOfObjToBeEdited = "TEST";
-        editItem.addActionListener(actionEvent -> {
-            // Remove the selected Object object
-            // AddObjectPopUp(boolean edit, AbstractCpsObject obj, String cat, JFrame
-            // parentFrame)
-            log.warning("EDITITEM");
-            AddObjectPopUp addObjectPopUP = new AddObjectPopUp(true, null, catOfObjToBeEdited, this);
-            addObjectPopUP.setCategory(catOfObjToBeEdited);
-            addObjectPopUP.setController(control);
-            addObjectPopUP.setVisible(true);
-        });
-        removeItem.addActionListener(actionEvent -> {
-            // Remove the selected Object object
-            log.warning("REMOVEITEM");
-            log.info("catOfObjToBeEdited:" + catOfObjToBeEdited + ", tempCps:" + null);
-            control.findCategoryWithName(catOfObjToBeEdited).ifPresent(cat -> {
-                cat.removeObjectsWithName("");
-            });
-        });
+