ElementPanel.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package org.leumasjaffe.recipe.view;
  2. import javax.swing.JPanel;
  3. import javax.swing.JScrollPane;
  4. import org.leumasjaffe.observer.ForwardingObservableListener;
  5. import org.leumasjaffe.observer.ObservableController;
  6. import org.leumasjaffe.observer.ObservableListener;
  7. import org.leumasjaffe.observer.ObserverDispatch;
  8. import org.leumasjaffe.recipe.model.Phase;
  9. import org.leumasjaffe.recipe.controller.AddPhaseAction;
  10. import org.leumasjaffe.recipe.model.Element;
  11. import lombok.AccessLevel;
  12. import lombok.Getter;
  13. import lombok.experimental.FieldDefaults;
  14. import org.jdesktop.swingx.VerticalLayout;
  15. import javax.swing.JSeparator;
  16. import javax.swing.JTextField;
  17. import javax.swing.ScrollPaneConstants;
  18. import javax.swing.event.DocumentListener;
  19. import java.awt.GridBagLayout;
  20. import java.awt.GridBagConstraints;
  21. import java.awt.Insets;
  22. import java.awt.event.FocusListener;
  23. import java.awt.Component;
  24. import java.awt.Dimension;
  25. import javax.swing.Box;
  26. import javax.swing.JButton;
  27. @SuppressWarnings("serial")
  28. @FieldDefaults(level=AccessLevel.PRIVATE)
  29. public class ElementPanel extends JScrollPane implements AutoGrowPanel.ChildComponent {
  30. ForwardingObservableListener<Element> listener = new ForwardingObservableListener<>();
  31. ObservableListener<JTextField, Element> nameController;
  32. ObservableListener<CollatedDurationPanel, Element> durationListener;
  33. @Getter(AccessLevel.PACKAGE) JTextField txtName;
  34. AddPhaseAction addPhase;
  35. JPanel panelViewPort;
  36. public ElementPanel() {
  37. setPreferredSize(new Dimension(600, 450));
  38. setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
  39. setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
  40. JPanel panelColumnHeader = new JPanel();
  41. setColumnHeaderView(panelColumnHeader);
  42. GridBagLayout gbl_panelColumnHeader = new GridBagLayout();
  43. gbl_panelColumnHeader.columnWidths = new int[]{0, 0, 0, 0, 0};
  44. gbl_panelColumnHeader.rowHeights = new int[]{0, 0};
  45. gbl_panelColumnHeader.columnWeights = new double[]{0.0, 0.0, 1.0, 0.0, Double.MIN_VALUE};
  46. gbl_panelColumnHeader.rowWeights = new double[]{0.0, Double.MIN_VALUE};
  47. panelColumnHeader.setLayout(gbl_panelColumnHeader);
  48. txtName = new JTextField();
  49. txtName.setColumns(10);
  50. GridBagConstraints gbc_txtName = new GridBagConstraints();
  51. gbc_txtName.insets = new Insets(0, 0, 0, 5);
  52. gbc_txtName.gridx = 0;
  53. gbc_txtName.gridy = 0;
  54. panelColumnHeader.add(txtName, gbc_txtName);
  55. JButton btnAdd = new JButton("+");
  56. btnAdd.setToolTipText("Add new phase");
  57. btnAdd.setPreferredSize(new Dimension(17, 17));
  58. btnAdd.setMargin(new Insets(0, 0, 0, 0));
  59. GridBagConstraints gbc_btnAdd = new GridBagConstraints();
  60. gbc_btnAdd.insets = new Insets(0, 0, 0, 5);
  61. gbc_btnAdd.gridx = 1;
  62. gbc_btnAdd.gridy = 0;
  63. panelColumnHeader.add(btnAdd, gbc_btnAdd);
  64. Component horizontalGlue = Box.createHorizontalGlue();
  65. GridBagConstraints gbc_horizontalGlue = new GridBagConstraints();
  66. gbc_horizontalGlue.insets = new Insets(0, 0, 0, 5);
  67. gbc_horizontalGlue.gridx = 2;
  68. gbc_horizontalGlue.gridy = 0;
  69. panelColumnHeader.add(horizontalGlue, gbc_horizontalGlue);
  70. CollatedDurationPanel panelDuration = new CollatedDurationPanel();
  71. GridBagConstraints gbc_panelDuration = new GridBagConstraints();
  72. gbc_panelDuration.gridx = 3;
  73. gbc_panelDuration.gridy = 0;
  74. panelColumnHeader.add(panelDuration, gbc_panelDuration);
  75. panelViewPort = new JPanel();
  76. setViewportView(panelViewPort);
  77. panelViewPort.setLayout(new VerticalLayout(5));
  78. addPhase = new AddPhaseAction(panelViewPort);
  79. btnAdd.addActionListener(addPhase);
  80. nameController = ObservableController.from(txtName,
  81. Element::getName, Element::setName);
  82. durationListener = new ObservableListener<>(panelDuration,
  83. (c, v) -> c.setModel(v.getCollatedDuration()));
  84. }
  85. public ElementPanel(final Element element) {
  86. this();
  87. setModel(element);
  88. }
  89. public void setModel(final Element element) {
  90. addPhase.setModel(element);
  91. panelViewPort.removeAll();
  92. for (final Phase phase : element.getPhases()) {
  93. panelViewPort.add(new PhasePanel(phase));
  94. panelViewPort.add(new JSeparator());
  95. }
  96. listener.setObserved(element, element.getPhases());
  97. nameController.setObserved(element);
  98. durationListener.setObserved(element);
  99. }
  100. @Override
  101. public void removeNotify() {
  102. super.removeNotify();
  103. ObserverDispatch.unsubscribeAll(listener);
  104. ObserverDispatch.unsubscribeAll(nameController);
  105. ObserverDispatch.unsubscribeAll(durationListener);
  106. }
  107. @Override
  108. public void addGrowListener(DocumentListener dl) {
  109. this.txtName.getDocument().addDocumentListener(dl);
  110. }
  111. @Override
  112. public void removeGrowListener(DocumentListener dl) {
  113. this.txtName.getDocument().removeDocumentListener(dl);
  114. }
  115. @Override
  116. public void addShrinkListener(FocusListener fl) {
  117. this.txtName.addFocusListener(fl);
  118. }
  119. @Override
  120. public void removeShrinkListener(FocusListener fl) {
  121. this.txtName.removeFocusListener(fl);
  122. }
  123. }