CanvasCollectionPanel.java 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package holeg.ui.view.canvas;
  2. import holeg.model.GroupNode;
  3. import holeg.preferences.ImagePreference;
  4. import holeg.ui.controller.Control;
  5. import holeg.ui.view.image.Import;
  6. import javax.swing.*;
  7. import javax.swing.event.ChangeEvent;
  8. import java.awt.*;
  9. import java.util.HashMap;
  10. import java.util.Map;
  11. import java.util.Optional;
  12. public class CanvasCollectionPanel extends JTabbedPane {
  13. private final Control control;
  14. private final Map<Component, Canvas> componentCanvasMap = new HashMap<>();
  15. private final Map<GroupNode, Component> groupNodeComponentMap = new HashMap<>();
  16. private Canvas main;
  17. private Canvas actual;
  18. public CanvasCollectionPanel(Control control) {
  19. this.control = control;
  20. control.OnShowGroupNode.addListener(this::showGroupNode);
  21. control.OnRemoveGroupNode.addListener(this::removeGroupNode);
  22. control.OnModelChanged.addListener(this::reset);
  23. createMainCanvas();
  24. this.addChangeListener(this::tabChangeEvent);
  25. }
  26. private void reset() {
  27. removeAll();
  28. componentCanvasMap.clear();
  29. groupNodeComponentMap.clear();
  30. createMainCanvas();
  31. }
  32. private void tabChangeEvent(ChangeEvent changeEvent) {
  33. Optional.ofNullable(componentCanvasMap.get(this.getSelectedComponent())).ifPresentOrElse(canvas -> {
  34. actual = canvas;
  35. }, () -> actual = main);
  36. control.clearSelection();
  37. }
  38. private void createMainCanvas() {
  39. GroupNode mainGroupNode = control.getModel().getCanvas();
  40. Canvas canvas = new Canvas(control, mainGroupNode);
  41. actual = main = canvas;
  42. final JScrollPane scrollPane = new JScrollPane(canvas);
  43. groupNodeComponentMap.put(mainGroupNode, scrollPane);
  44. componentCanvasMap.put(scrollPane, canvas);
  45. this.addTab("Main", scrollPane);
  46. }
  47. private void showGroupNode(GroupNode groupNode) {
  48. Optional.ofNullable(groupNodeComponentMap.get(groupNode))
  49. .ifPresentOrElse(this::setSelectedComponent,
  50. () -> createNewCanvas(groupNode));
  51. }
  52. private void createNewCanvas(GroupNode groupNode) {
  53. Canvas canvas = new Canvas(control, groupNode);
  54. final JScrollPane scrollPane = new JScrollPane(canvas);
  55. groupNodeComponentMap.put(groupNode, scrollPane);
  56. componentCanvasMap.put(scrollPane, canvas);
  57. addTab(groupNode.getName(), scrollPane);
  58. setSelectedComponent(scrollPane);
  59. setTabComponentAt(this.indexOfComponent(scrollPane), new GroupNodeHeader(groupNode));
  60. }
  61. private void removeGroupNode(GroupNode groupNode){
  62. Optional.ofNullable(groupNodeComponentMap.get(groupNode))
  63. .ifPresent(scrollPane -> {
  64. remove(scrollPane);
  65. groupNodeComponentMap.remove(groupNode);
  66. });
  67. }
  68. public Canvas getActualCanvas() {
  69. return actual;
  70. }
  71. private class GroupNodeHeader extends JPanel {
  72. public GroupNodeHeader(GroupNode groupNode) {
  73. JLabel label = new JLabel(groupNode.getName());
  74. add(label);
  75. label.setBorder(null);
  76. label.setPreferredSize(new Dimension(label.getPreferredSize().width,8));
  77. this.setBorder(null);
  78. this.setOpaque(false);
  79. JButton button = new JButton(new ImageIcon(Import.loadImage(ImagePreference.Button.GroupNode.Close, 8,8)));
  80. button.setPreferredSize(new Dimension(8, 8));
  81. button.setBorder(null);
  82. add(button);
  83. button.addActionListener(clicked -> removeGroupNode(groupNode));
  84. }
  85. }
  86. }