123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- package holeg.ui.view.category;
- import holeg.model.AbstractCanvasObject;
- import holeg.model.HolonObject;
- import holeg.model.HolonSwitch;
- import holeg.preferences.ColorPreference;
- 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.CreateNewDialog;
- import holeg.ui.view.image.Import;
- import holeg.ui.view.main.Gui;
- import javax.swing.*;
- import javax.swing.tree.DefaultMutableTreeNode;
- import javax.swing.tree.DefaultTreeModel;
- import javax.swing.tree.TreeCellRenderer;
- import javax.swing.tree.TreePath;
- import java.awt.*;
- import java.awt.event.MouseAdapter;
- import java.awt.event.MouseEvent;
- import java.awt.event.MouseMotionAdapter;
- import java.util.Collection;
- import java.util.Objects;
- import java.util.Optional;
- import java.util.logging.Logger;
- public class CategoryPanel extends JScrollPane {
- private static final Logger log = Logger.getLogger(CategoryPanel.class.getName());
- private final Control control;
- private final Gui gui;
- private final JPanel buttonPanel = new JPanel();
- // Buttons
- private final JPopupMenu btnAddPopUp = new JPopupMenu("New");
- private final JButton btnAdd = new JButton(new ImageIcon(Import.loadImage(ImagePreference.Category.Add, 16, 16)));
- private final JButton btnDel = new JButton(new ImageIcon(Import.loadImage(ImagePreference.Category.Delete, 16, 16)));
- private final JToolBar toolBar = new JToolBar();
- private final JMenuItem mItemNew = new JMenuItem("New..");
- private final JMenuItem mItemCategory = new JMenuItem("Category");
- private final JMenuItem mItemObject = new JMenuItem("Object");
- private final JMenuItem mItemSwitch = new JMenuItem("Switch");
- private final JTree categoryTree = new JTree();
- private final String eraseCategoryMessage = "Do you really want to delete the Category ";
- private final String incorrectDeleteMessage = "Please select a Category or an Object in the left library in order to delete something.";
- private boolean dragging = false;
- public CategoryPanel(Control control, Gui gui) {
- this.control = control;
- this.gui = gui;
- buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
- init();
- setColumnHeaderView(buttonPanel);
- setViewportView(categoryTree);
- this.setMinimumSize(new Dimension(200, 200));
- updateCategories(GuiSettings.getCategories());
- control.OnCategoryChanged.addListener(() -> this.updateCategoryUI(GuiSettings.getCategories()));
- }
- private void init() {
- toolBar.setAlignmentX(Component.LEFT_ALIGNMENT);
- toolBar.setFloatable(false);
- btnAddPopUp.add(mItemNew);
- mItemNew.addActionListener(actionEvent -> new CreateNewDialog(control, gui));
- btnAddPopUp.addSeparator();
- btnAddPopUp.add(mItemCategory);
- mItemCategory.addActionListener(actionEvent -> new CreateNewDialog(control, CreateNewDialog.Option.Category, gui));
- btnAddPopUp.add(mItemObject);
- mItemObject.addActionListener(actionEvent -> new CreateNewDialog(control, CreateNewDialog.Option.Object, gui));
- btnAddPopUp.add(mItemSwitch);
- mItemSwitch.addActionListener(actionEvent -> new CreateNewDialog(control, CreateNewDialog.Option.Switch, gui));
- btnAdd.addActionListener(actionEvent -> btnAddPopUp.show(btnAdd, -1, +20));
- btnAdd.setToolTipText("<html><b>New</b><br>Add a new Category or Item to the library.</html>");
- toolBar.add(btnAdd);
- // Del Button
- btnDel.addActionListener(actionEvent -> {
- Optional<DefaultMutableTreeNode> nodeInfo = Optional.ofNullable((DefaultMutableTreeNode) categoryTree.getLastSelectedPathComponent());
- nodeInfo.ifPresentOrElse(selectedNode -> {
- String nodeName = selectedNode.getUserObject().toString();
- int depthOfNode = selectedNode.getLevel();
- try {
- switch (depthOfNode) {
- case 1 -> {
- int dialogResult = JOptionPane.showConfirmDialog(gui, eraseCategoryMessage + nodeName + "?",
- "Warning", JOptionPane.YES_NO_OPTION);
- if (dialogResult == JOptionPane.YES_OPTION) {
- GuiSettings.getCategories().stream().filter(cat -> Objects.equals(cat.getName(), nodeName)).findAny()
- .ifPresent(control::deleteCategory);
- }
- }
- case 2 -> {
- DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode.getParent();
- control.findCategoryWithName(parent.getUserObject().toString()).ifPresent(cat -> {
- cat.removeObjectsWithName(nodeName);
- });
- }
- default -> JOptionPane.showMessageDialog(gui, incorrectDeleteMessage);
- }
- } catch (Exception ignored) {
- }
- categoryTree.repaint();
- }, () -> JOptionPane.showMessageDialog(gui, incorrectDeleteMessage));
- });
- btnDel.setToolTipText("<html><b>Delete</b><br>Removes a Category or a Category Item.</html>");
- toolBar.add(btnDel);
- buttonPanel.add(toolBar);
- categoryTree.setCellRenderer(new CategoryTreeRenderer());
- categoryTree.addMouseListener(new MouseAdapter() {
- public void mousePressed(MouseEvent e) {
- AbstractCanvasObject tempCps = null;
- TreePath path = categoryTree
- .getPathForLocation(e.getX(), e.getY());
- if(path == null){
- log.info("Path is null");
- return;
- }
- DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)path.getLastPathComponent();
- String clickedObjectName = selectedNode.toString();
- // if an Object was selected, the porperties are shown in
- // the table
- if (SwingUtilities.isRightMouseButton(e)) {
- for (Category cat : GuiSettings.getCategories()) {
- for (AbstractCanvasObject cps : cat.getObjects()) {
- if (clickedObjectName.equals(cps.getName())
- && !(cps instanceof HolonSwitch)) {
- // editItem.setEnabled(true);
- // popmenuEdit.show(e.getComponent(), e.getX(), e.getY());
- // catOfObjToBeEdited = selectedNode.getParent().toString();
- tempCps = cps;
- }
- }
- }
- } else {
- for (Category cat : GuiSettings.getCategories()) {
- for (AbstractCanvasObject cps : cat.getObjects()) {
- if (clickedObjectName.equals(cps.getName())) {
- Image img = Import.loadImage(cps.getImagePath(), 32, 32);
- tempCps = cps;
- dragging = true;
- Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor(img, new Point(),
- "Image");
- gui.setCursor(cursor);
- }
- }
- }
- }
- if (dragging) {
- Canvas groupNodeCanvas = gui.getCanvas();
- Optional<Point> positionInCanvas = Optional.ofNullable(groupNodeCanvas.getMousePosition());
- AbstractCanvasObject finalTempCps = tempCps;
- positionInCanvas.ifPresent(pos -> {
- AbstractCanvasObject h = null;
- if (finalTempCps instanceof HolonObject hO) {
- h = new HolonObject(hO);
- }
- else if (finalTempCps instanceof HolonSwitch sw) {
- h = new HolonSwitch(sw);
- }
- h.setPosition(pos.x, pos.y);
- control.addObjectOnCanvas(control.getModel().getCanvas(), h);
- control.calculateStateAndVisualForCurrentTimeStep();
- });
- }
- gui.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
- }
- });
- categoryTree.addMouseMotionListener(new MouseMotionAdapter() {
- public void mouseDragged(MouseEvent e) {
- checkForDragAndDrop();
- }
- /**
- * checks if an object of the current Panel could be replaced by the dragged
- * object
- */
- private void checkForDragAndDrop() {
- try {
- /**
- * if no object gets dragged -> finished
- */
- if (!dragging)
- return;
- Canvas groupNodeCanvas = gui.getCanvas();
- /**
- * check for replacements on the canvas
- */
- if (groupNodeCanvas.getMousePosition() == null)
- return;
- int x = (int) groupNodeCanvas.getMousePosition().getX() + 16;
- int y = (int) groupNodeCanvas.getMousePosition().getY() + 16;
- /**
- * check for replacement
- */
- groupNodeCanvas.checkForReplacement(x, y);
- } catch (Exception ignored) {
- }
- }
- });
- }
- /**
- * reloads the Categories from Model.
- *
- * @param categories the current categories
- */
- private void updateCategories(Collection<Category> categories) {
- DefaultTreeModel treemodel = new DefaultTreeModel(new DefaultMutableTreeNode("Categories") {
- {
- DefaultMutableTreeNode node1;
- for (Category c : categories) {
- node1 = new DefaultMutableTreeNode(c.getName());
- for (AbstractCanvasObject obj : c.getObjects()) {
- node1.add(new DefaultMutableTreeNode(obj.getName()));
- }
- add(node1);
- }
- }
- });
- categoryTree.setModel(treemodel);
- }
- /**
- * When changes are made to the Categories.
- *
- * @param categories the Categories
- */
- public void updateCategoryUI(Collection<Category> categories) {
- DefaultTreeModel model = (DefaultTreeModel) categoryTree.getModel();
- updateCategories(categories);
- model.reload();
- }
- private static class CategoryTreeRenderer implements TreeCellRenderer {
- @Override
- public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
- boolean leaf, int row, boolean hasFocus) {
- JLabel label = new JLabel();
- Image imgR;
- if (leaf) {
- for (Category cat : GuiSettings.getCategories()) {
- for (AbstractCanvasObject cps : cat.getObjects()) {
- if (value.toString().equals(cps.getName())) {
- imgR = Import.loadImage(cps.getImagePath(), 50, 50);
- if (imgR != null) {
- label.setIcon(new ImageIcon(imgR));
- }
- label.setText(cps.getName());
- }
- }
- }
- }
- tree.setRowHeight(50);
- if (hasFocus) {
- label.setForeground(ColorPreference.Category.Focus);
- label.setOpaque(true);
- }
- if (label.getText().isEmpty()) {
- label.setText(value.toString());
- if (!value.toString().equals("Categories")) {
- label.setIcon(new ImageIcon(Import.loadImage(ImagePreference.Category.Folder)));
- }
- }
- return label;
- }
- }
- }
|