1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.log4j.chainsaw;
19
20 import org.apache.log4j.chainsaw.helper.SwingHelper;
21 import org.apache.log4j.chainsaw.icons.ChainsawIcons;
22
23 import javax.swing.*;
24 import javax.swing.tree.*;
25 import java.awt.*;
26 import java.awt.event.ActionListener;
27 import java.util.Enumeration;
28 import java.util.List;
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 public abstract class AbstractPreferencePanel extends JPanel {
49
50 private final JLabel titleLabel = new JLabel("Selected Pref Panel");
51 private final JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
52 private final JPanel selectedPrefPanel = new JPanel(new BorderLayout(0, 3));
53 private final JButton okButton = new JButton(" OK ");
54 private final JButton cancelButton = new JButton(" Cancel ");
55 private ActionListener okCancelListener;
56 private Component currentlyDisplayedPanel = null;
57 private final JTree prefTree = new JTree();
58
59
60
61
62 protected void initComponents() {
63
64 setLayout(new BorderLayout(5, 5));
65 setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
66
67 prefTree.setModel(createTreeModel());
68
69 prefTree.setRootVisible(false);
70
71 DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
72 renderer.setLeafIcon(ChainsawIcons.ICON_PREFERENCES);
73 prefTree.setCellRenderer(renderer);
74
75 final JScrollPane treeScroll = new JScrollPane(prefTree);
76
77 treeScroll.setPreferredSize(new Dimension(200, 240));
78
79 titleLabel.setFont(titleLabel.getFont().deriveFont(16.0f));
80 titleLabel.setBorder(BorderFactory.createEtchedBorder());
81 titleLabel.setBackground(Color.white);
82 titleLabel.setOpaque(true);
83
84 selectedPrefPanel.add(titleLabel, BorderLayout.NORTH);
85
86 mainPanel.add(treeScroll, BorderLayout.WEST);
87 mainPanel.add(selectedPrefPanel, BorderLayout.CENTER);
88
89 add(mainPanel, BorderLayout.CENTER);
90
91 Box buttonBox = Box.createHorizontalBox();
92 List<JButton> buttons = SwingHelper.orderOKCancelButtons(okButton, cancelButton);
93 buttonBox.add(Box.createHorizontalGlue());
94 buttonBox.add(buttons.get(0));
95 buttonBox.add(Box.createHorizontalStrut(10));
96 buttonBox.add(buttons.get(1));
97
98 add(buttonBox, BorderLayout.SOUTH);
99
100 DefaultTreeSelectionModel treeSelectionModel =
101 new DefaultTreeSelectionModel();
102 treeSelectionModel.setSelectionMode(
103 TreeSelectionModel.SINGLE_TREE_SELECTION);
104 prefTree.setSelectionModel(treeSelectionModel);
105 prefTree.addTreeSelectionListener(
106 e -> {
107 TreePath path = e.getNewLeadSelectionPath();
108 DefaultMutableTreeNode node =
109 (DefaultMutableTreeNode) path.getLastPathComponent();
110 setDisplayedPrefPanel((JComponent) node.getUserObject());
111 });
112
113
114 DefaultMutableTreeNode root =
115 (DefaultMutableTreeNode) prefTree.getModel().getRoot();
116 DefaultMutableTreeNode firstNode =
117 (DefaultMutableTreeNode) root.getFirstChild();
118 prefTree.setSelectionPath(new TreePath(firstNode.getPath()));
119 }
120
121
122
123
124 protected abstract TreeModel createTreeModel();
125
126
127
128
129
130
131
132 protected void setDisplayedPrefPanel(JComponent panel) {
133 if (currentlyDisplayedPanel != null) {
134 selectedPrefPanel.remove(currentlyDisplayedPanel);
135 }
136
137 selectedPrefPanel.add(panel, BorderLayout.CENTER);
138 currentlyDisplayedPanel = panel;
139 String title = panel.toString();
140 titleLabel.setText(title);
141 selectedPrefPanel.revalidate();
142 selectedPrefPanel.repaint();
143 }
144
145 public void notifyOfLookAndFeelChange() {
146 SwingUtilities.updateComponentTreeUI(this);
147
148 Enumeration enumeration = ((DefaultMutableTreeNode) prefTree.getModel().getRoot()).breadthFirstEnumeration();
149 while (enumeration.hasMoreElements()) {
150 DefaultMutableTreeNode node = (DefaultMutableTreeNode) enumeration.nextElement();
151 if (node.getUserObject() instanceof Component) {
152 Component c = (Component) node.getUserObject();
153 SwingUtilities.updateComponentTreeUI(c);
154 }
155 }
156 }
157
158 public void setOkCancelActionListener(ActionListener l) {
159 this.okCancelListener = l;
160 }
161
162 public void hidePanel() {
163 if (okCancelListener != null) {
164 okCancelListener.actionPerformed(null);
165 }
166 }
167
168
169
170
171 protected final JButton getCancelButton() {
172 return cancelButton;
173 }
174
175
176
177
178 protected final JButton getOkButton() {
179 return okButton;
180 }
181 }