|
@@ -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();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|