CanvasCollectionPanel.java 3.8 KB

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