001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 * 
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 * 
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.log4j.chainsaw;
018
019import java.awt.GridBagConstraints;
020import java.awt.GridBagLayout;
021import java.awt.event.ActionEvent;
022import java.awt.event.ActionListener;
023import javax.swing.BorderFactory;
024import javax.swing.JButton;
025import javax.swing.JComboBox;
026import javax.swing.JLabel;
027import javax.swing.JPanel;
028import javax.swing.JTextField;
029import javax.swing.event.DocumentEvent;
030import javax.swing.event.DocumentListener;
031import org.apache.log4j.Logger;
032import org.apache.log4j.Priority;
033import org.apache.log4j.Level;
034
035/**
036 * Represents the controls for filtering, pausing, exiting, etc.
037 *
038 * @author <a href="mailto:oliver@puppycrawl.com">Oliver Burn</a>
039 */
040class ControlPanel extends JPanel {
041    /** use the log messages **/
042    private static final Logger LOG = 
043                                  Logger.getLogger(ControlPanel.class);
044
045    /**
046     * Creates a new <code>ControlPanel</code> instance.
047     *
048     * @param aModel the model to control
049     */
050    ControlPanel(final MyTableModel aModel) {
051        setBorder(BorderFactory.createTitledBorder("Controls: "));
052        final GridBagLayout gridbag = new GridBagLayout();
053        final GridBagConstraints c = new GridBagConstraints();
054        setLayout(gridbag);
055
056        // Pad everything
057        c.ipadx = 5;
058        c.ipady = 5;
059
060        // Add the 1st column of labels
061        c.gridx = 0;
062        c.anchor = GridBagConstraints.EAST;
063
064        c.gridy = 0;
065        JLabel label = new JLabel("Filter Level:");
066        gridbag.setConstraints(label, c);
067        add(label);
068
069        c.gridy++;
070        label = new JLabel("Filter Thread:");
071        gridbag.setConstraints(label, c);
072        add(label);
073
074        c.gridy++;
075        label = new JLabel("Filter Logger:");
076        gridbag.setConstraints(label, c);
077        add(label);
078
079        c.gridy++;
080        label = new JLabel("Filter NDC:");
081        gridbag.setConstraints(label, c);
082        add(label);
083
084        c.gridy++;
085        label = new JLabel("Filter Message:");
086        gridbag.setConstraints(label, c);
087        add(label);
088
089        // Add the 2nd column of filters
090        c.weightx = 1;
091        //c.weighty = 1;
092        c.gridx = 1;
093        c.anchor = GridBagConstraints.WEST;
094
095        c.gridy = 0;
096        final Level[] allPriorities = new Level[] {Level.FATAL, 
097               Level.ERROR, 
098               Level.WARN, 
099                           Level.INFO, 
100                           Level.DEBUG, 
101                           Level.TRACE };
102        
103        final JComboBox priorities = new JComboBox(allPriorities);
104        final Level lowest = allPriorities[allPriorities.length - 1];
105        priorities.setSelectedItem(lowest);
106        aModel.setPriorityFilter(lowest);
107        gridbag.setConstraints(priorities, c);
108        add(priorities);
109        priorities.setEditable(false);
110        priorities.addActionListener(new ActionListener() {
111                public void actionPerformed(ActionEvent aEvent) {
112                    aModel.setPriorityFilter(
113                        (Priority) priorities.getSelectedItem());
114                }
115            });
116
117
118        c.fill = GridBagConstraints.HORIZONTAL;
119        c.gridy++;
120        final JTextField threadField = new JTextField("");
121        threadField.getDocument().addDocumentListener(new DocumentListener () {
122                public void insertUpdate(DocumentEvent aEvent) {
123                    aModel.setThreadFilter(threadField.getText());
124                }
125                public void removeUpdate(DocumentEvent aEvente) {
126                    aModel.setThreadFilter(threadField.getText());
127                }
128                public void changedUpdate(DocumentEvent aEvent) {
129                    aModel.setThreadFilter(threadField.getText());
130                }
131            });
132        gridbag.setConstraints(threadField, c);
133        add(threadField);
134
135        c.gridy++;
136        final JTextField catField = new JTextField("");
137        catField.getDocument().addDocumentListener(new DocumentListener () {
138                public void insertUpdate(DocumentEvent aEvent) {
139                    aModel.setCategoryFilter(catField.getText());
140                }
141                public void removeUpdate(DocumentEvent aEvent) {
142                    aModel.setCategoryFilter(catField.getText());
143                }
144                public void changedUpdate(DocumentEvent aEvent) {
145                    aModel.setCategoryFilter(catField.getText());
146                }
147            });
148        gridbag.setConstraints(catField, c);
149        add(catField);
150
151        c.gridy++;
152        final JTextField ndcField = new JTextField("");
153        ndcField.getDocument().addDocumentListener(new DocumentListener () {
154                public void insertUpdate(DocumentEvent aEvent) {
155                    aModel.setNDCFilter(ndcField.getText());
156                }
157                public void removeUpdate(DocumentEvent aEvent) {
158                    aModel.setNDCFilter(ndcField.getText());
159                }
160                public void changedUpdate(DocumentEvent aEvent) {
161                    aModel.setNDCFilter(ndcField.getText());
162                }
163            });
164        gridbag.setConstraints(ndcField, c);
165        add(ndcField);
166
167        c.gridy++;
168        final JTextField msgField = new JTextField("");
169        msgField.getDocument().addDocumentListener(new DocumentListener () {
170                public void insertUpdate(DocumentEvent aEvent) {
171                    aModel.setMessageFilter(msgField.getText());
172                }
173                public void removeUpdate(DocumentEvent aEvent) {
174                    aModel.setMessageFilter(msgField.getText());
175                }
176                public void changedUpdate(DocumentEvent aEvent) {
177                    aModel.setMessageFilter(msgField.getText());
178                }
179            });
180
181
182        gridbag.setConstraints(msgField, c);
183        add(msgField);
184
185        // Add the 3rd column of buttons
186        c.weightx = 0;
187        c.fill = GridBagConstraints.HORIZONTAL;
188        c.anchor = GridBagConstraints.EAST;
189        c.gridx = 2;
190
191        c.gridy = 0;
192        final JButton exitButton = new JButton("Exit");
193        exitButton.setMnemonic('x');
194        exitButton.addActionListener(ExitAction.INSTANCE);
195        gridbag.setConstraints(exitButton, c);
196        add(exitButton);
197
198        c.gridy++;
199        final JButton clearButton = new JButton("Clear");
200        clearButton.setMnemonic('c');
201        clearButton.addActionListener(new ActionListener() {
202                public void actionPerformed(ActionEvent aEvent) {
203                    aModel.clear();
204                }
205            });
206        gridbag.setConstraints(clearButton, c);
207        add(clearButton);
208
209        c.gridy++;
210        final JButton toggleButton = new JButton("Pause");
211        toggleButton.setMnemonic('p');
212        toggleButton.addActionListener(new ActionListener() {
213                public void actionPerformed(ActionEvent aEvent) {
214                    aModel.toggle();
215                    toggleButton.setText(
216                        aModel.isPaused() ? "Resume" : "Pause");
217                }
218            });
219        gridbag.setConstraints(toggleButton, c);
220        add(toggleButton);
221    }
222}