ElementPanel.java 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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.model.Element;
  10. import lombok.AccessLevel;
  11. import lombok.Getter;
  12. import lombok.experimental.FieldDefaults;
  13. import org.jdesktop.swingx.VerticalLayout;
  14. import javax.swing.JSeparator;
  15. import javax.swing.JTextField;
  16. import javax.swing.ScrollPaneConstants;
  17. import java.awt.GridBagLayout;
  18. import java.awt.GridBagConstraints;
  19. import java.awt.Insets;
  20. import java.awt.Component;
  21. import java.awt.Dimension;
  22. import javax.swing.Box;
  23. @SuppressWarnings("serial")
  24. @FieldDefaults(level=AccessLevel.PRIVATE)
  25. public class ElementPanel extends JScrollPane {
  26. ForwardingObservableListener<Element> listener = new ForwardingObservableListener<>();
  27. ObservableListener<JTextField, Element> nameController;
  28. ObservableListener<CollatedDurationPanel, Element> durationListener;
  29. @Getter(AccessLevel.PACKAGE) JTextField txtName;
  30. JPanel panelViewPort;
  31. public ElementPanel() {
  32. setPreferredSize(new Dimension(500, 450));
  33. setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
  34. setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
  35. JPanel panelColumnHeader = new JPanel();
  36. setColumnHeaderView(panelColumnHeader);
  37. GridBagLayout gbl_panelColumnHeader = new GridBagLayout();
  38. gbl_panelColumnHeader.columnWidths = new int[]{0, 0, 0, 0};
  39. gbl_panelColumnHeader.rowHeights = new int[]{0, 0};
  40. gbl_panelColumnHeader.columnWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE};
  41. gbl_panelColumnHeader.rowWeights = new double[]{0.0, Double.MIN_VALUE};
  42. panelColumnHeader.setLayout(gbl_panelColumnHeader);
  43. txtName = new JTextField();
  44. GridBagConstraints gbc_txtName = new GridBagConstraints();
  45. gbc_txtName.insets = new Insets(0, 0, 0, 5);
  46. gbc_txtName.gridx = 0;
  47. gbc_txtName.gridy = 0;
  48. panelColumnHeader.add(txtName, gbc_txtName);
  49. Component horizontalGlue = Box.createHorizontalGlue();
  50. GridBagConstraints gbc_horizontalGlue = new GridBagConstraints();
  51. gbc_horizontalGlue.insets = new Insets(0, 0, 0, 5);
  52. gbc_horizontalGlue.gridx = 1;
  53. gbc_horizontalGlue.gridy = 0;
  54. panelColumnHeader.add(horizontalGlue, gbc_horizontalGlue);
  55. CollatedDurationPanel panelDuration = new CollatedDurationPanel();
  56. GridBagConstraints gbc_panelDuration = new GridBagConstraints();
  57. gbc_panelDuration.gridx = 2;
  58. gbc_panelDuration.gridy = 0;
  59. panelColumnHeader.add(panelDuration, gbc_panelDuration);
  60. panelViewPort = new JPanel();
  61. setViewportView(panelViewPort);
  62. panelViewPort.setLayout(new VerticalLayout(5));
  63. nameController = ObservableController.from(txtName,
  64. Element::getName, Element::setName);
  65. durationListener = new ObservableListener<>(panelDuration,
  66. (c, v) -> c.setModel(v.getCollatedDuration()));
  67. }
  68. public ElementPanel(final Element element) {
  69. this();
  70. setModel(element);
  71. }
  72. public void setModel(final Element element) {
  73. panelViewPort.removeAll();
  74. for (final Phase phase : element.getPhases()) {
  75. panelViewPort.add(new PhasePanel(phase));
  76. panelViewPort.add(new JSeparator());
  77. }
  78. listener.setObserved(element, element.getPhases());
  79. nameController.setObserved(element);
  80. durationListener.setObserved(element);
  81. }
  82. @Override
  83. public void removeNotify() {
  84. super.removeNotify();
  85. ObserverDispatch.unsubscribeAll(listener);
  86. ObserverDispatch.unsubscribeAll(nameController);
  87. ObserverDispatch.unsubscribeAll(durationListener);
  88. }
  89. }