CanvasCollectionPanel.java 3.9 KB

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