1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.log4j.chainsaw.layout;
19
20 import java.awt.Dimension;
21 import java.awt.Frame;
22 import java.awt.event.ActionEvent;
23 import java.awt.event.ActionListener;
24 import java.util.Date;
25 import java.util.Hashtable;
26
27 import javax.swing.AbstractAction;
28 import javax.swing.Action;
29 import javax.swing.BorderFactory;
30 import javax.swing.Box;
31 import javax.swing.BoxLayout;
32 import javax.swing.JButton;
33 import javax.swing.JDialog;
34 import javax.swing.JEditorPane;
35 import javax.swing.JPanel;
36 import javax.swing.JScrollPane;
37 import javax.swing.JToolBar;
38 import javax.swing.ScrollPaneConstants;
39 import javax.swing.WindowConstants;
40 import javax.swing.event.CaretEvent;
41 import javax.swing.event.CaretListener;
42 import javax.swing.event.DocumentEvent;
43 import javax.swing.event.DocumentListener;
44
45 import org.apache.log4j.Logger;
46 import org.apache.log4j.chainsaw.ChainsawConstants;
47 import org.apache.log4j.chainsaw.JTextComponentFormatter;
48 import org.apache.log4j.chainsaw.icons.ChainsawIcons;
49 import org.apache.log4j.spi.LocationInfo;
50 import org.apache.log4j.spi.LoggingEvent;
51 import org.apache.log4j.spi.ThrowableInformation;
52
53
54
55
56
57
58
59
60
61 public final class LayoutEditorPane extends JPanel {
62 private final Action copyAction;
63 private final Action cutAction;
64 private final JToolBar editorToolbar = new JToolBar();
65 private final JToolBar okCancelToolbar = new JToolBar();
66 private final JButton okButton = new JButton(" OK ");
67 private final JButton cancelButton = new JButton(" Cancel ");
68
69
70 private final JEditorPane patternEditor = new JEditorPane("text/plain", "");
71 private final JEditorPane previewer =
72 new JEditorPane(ChainsawConstants.DETAIL_CONTENT_TYPE, "");
73 private final JScrollPane patternEditorScroll =
74 new JScrollPane(
75 ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
76 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
77 private final JScrollPane previewEditorScroll =
78 new JScrollPane(
79 ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
80 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
81 private LoggingEvent event;
82 private EventDetailLayout layout = new EventDetailLayout();
83
84
85
86
87 public LayoutEditorPane() {
88 super();
89 setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
90 createEvent();
91 copyAction = createCopyAction();
92 cutAction = createCutAction();
93 initComponents();
94 setupListeners();
95 }
96
97
98
99
100 private Action createCutAction() {
101 final Action action =
102 new AbstractAction("Cut", ChainsawIcons.ICON_CUT) {
103 public void actionPerformed(ActionEvent e) {
104
105 }
106 };
107
108 action.setEnabled(false);
109
110 return action;
111 }
112
113
114
115
116 private Action createCopyAction() {
117 final Action action =
118 new AbstractAction("Copy", ChainsawIcons.ICON_COPY) {
119 public void actionPerformed(ActionEvent e) {
120
121 }
122 };
123
124 action.setEnabled(false);
125
126 return action;
127 }
128
129
130
131
132 private void setupListeners() {
133 patternEditor.getDocument().addDocumentListener(
134 new DocumentListener() {
135 public void changedUpdate(DocumentEvent e) {
136 updatePreview();
137 }
138
139 public void insertUpdate(DocumentEvent e) {
140 updatePreview();
141 }
142
143 public void removeUpdate(DocumentEvent e) {
144 updatePreview();
145 }
146 });
147
148 patternEditor.addCaretListener(
149 new CaretListener() {
150 public void caretUpdate(CaretEvent e) {
151 updateTextActions(e.getMark() != e.getDot());
152 }
153 });
154 }
155
156 private void updatePreview() {
157 String pattern = patternEditor.getText();
158 layout.setConversionPattern(pattern);
159
160 previewer.setText(layout.format(event));
161 }
162
163
164
165
166 private void updateTextActions(boolean enabled) {
167 cutAction.setEnabled(enabled);
168 copyAction.setEnabled(enabled);
169 }
170
171
172
173
174 private void createEvent() {
175 Hashtable hashTable = new Hashtable();
176 hashTable.put("key1", "val1");
177 hashTable.put("key2", "val2");
178 hashTable.put("key3", "val3");
179
180 LocationInfo li =
181 new LocationInfo(
182 "myfile.java", "com.mycompany.util.MyClass", "myMethod", "321");
183
184 ThrowableInformation tsr = new ThrowableInformation(new Exception());
185
186 event = new LoggingEvent("org.apache.log4j.Logger",
187 Logger.getLogger("com.mycompany.mylogger"),
188 new Date().getTime(),
189 org.apache.log4j.Level.DEBUG,
190 "The quick brown fox jumped over the lazy dog",
191 "Thread-1",
192 tsr,
193 "NDC string",
194 li,
195 hashTable);
196
197 }
198
199
200
201
202 private void initComponents() {
203 editorToolbar.setFloatable(false);
204 okCancelToolbar.setFloatable(false);
205 okButton.setToolTipText("Accepts the current Pattern layout and will apply it to the Log Panel");
206 cancelButton.setToolTipText("Closes this dialog and discards your changes");
207
208 JTextComponentFormatter.applySystemFontAndSize(previewer);
209
210 previewer.setEditable(false);
211 patternEditor.setPreferredSize(new Dimension(240, 240));
212 patternEditor.setMaximumSize(new Dimension(320, 240));
213 previewer.setPreferredSize(new Dimension(360, 240));
214 patternEditorScroll.setViewportView(patternEditor);
215 previewEditorScroll.setViewportView(previewer);
216
217 patternEditor.setToolTipText("Edit the Pattern here");
218 previewer.setToolTipText(
219 "The result of the layout of the pattern is shown here");
220
221 patternEditorScroll.setBorder(
222 BorderFactory.createTitledBorder(
223 BorderFactory.createEtchedBorder(), "Pattern Editor"));
224 previewEditorScroll.setBorder(
225 BorderFactory.createTitledBorder(
226 BorderFactory.createEtchedBorder(), "Pattern Preview"));
227
228
229
230
231 editorToolbar.add(Box.createHorizontalGlue());
232
233 okCancelToolbar.add(Box.createHorizontalGlue());
234 okCancelToolbar.add(okButton);
235 okCancelToolbar.addSeparator();
236 okCancelToolbar.add(cancelButton);
237
238
239
240 add(editorToolbar);
241 add(patternEditorScroll);
242 add(previewEditorScroll);
243 add(okCancelToolbar);
244 }
245
246 public void setConversionPattern(String pattern) {
247 patternEditor.setText(pattern);
248 }
249
250 public String getConversionPattern() {
251 return patternEditor.getText();
252 }
253
254 public void addOkActionListener(ActionListener l) {
255 okButton.addActionListener(l);
256 }
257
258 public void addCancelActionListener(ActionListener l) {
259 cancelButton.addActionListener(l);
260 }
261
262 public static void main(String[] args) {
263 JDialog dialog = new JDialog((Frame) null, "Pattern Editor");
264 dialog.getContentPane().add(new LayoutEditorPane());
265 dialog.setResizable(true);
266 dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
267
268
269 dialog.setSize(new Dimension(640, 480));
270 dialog.setVisible(true);
271 }
272 }