psmith 2003/06/16 20:58:05 Modified: src/java/org/apache/log4j/chainsaw ChainsawToolBarAndMenus.java Log: Modified the show Receivers action to show all the receivers in a Tree component, together with whether they are active or not. Currently only really renderes SocketReceivers correctly while I nut out some UI elements first. WIP. Revision Changes Path 1.34 +1228 -773 jakarta-log4j-sandbox/src/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java Index: ChainsawToolBarAndMenus.java =================================================================== RCS file: /home/cvs/jakarta-log4j-sandbox/src/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java,v retrieving revision 1.33 retrieving revision 1.34 diff -u -r1.33 -r1.34 --- ChainsawToolBarAndMenus.java 16 Jun 2003 07:24:40 -0000 1.33 +++ ChainsawToolBarAndMenus.java 17 Jun 2003 03:58:05 -0000 1.34 @@ -46,7 +46,6 @@ * Apache Software Foundation, please see <http://www.apache.org/>. * */ - /* * Created on May 3, 2003 * @@ -55,25 +54,13 @@ */ package org.apache.log4j.chainsaw; -import org.apache.log4j.LogManager; -import org.apache.log4j.chainsaw.icons.ChainsawIcons; -import org.apache.log4j.chainsaw.prefs.LoadSettingsEvent; -import org.apache.log4j.chainsaw.prefs.SaveSettingsEvent; -import org.apache.log4j.chainsaw.prefs.SettingsListener; -import org.apache.log4j.chainsaw.prefs.SettingsManager; -import org.apache.log4j.helpers.LogLog; -import org.apache.log4j.net.MulticastReceiver; -import org.apache.log4j.net.SocketReceiver; -import org.apache.log4j.net.UDPReceiver; -import org.apache.log4j.plugins.PluginRegistry; -import org.apache.log4j.plugins.Receiver; - import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; +import java.awt.Graphics; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -83,18 +70,17 @@ import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; - import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; - import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; +import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBoxMenuItem; @@ -114,6 +100,7 @@ import javax.swing.JTextField; import javax.swing.JToggleButton; import javax.swing.JToolBar; +import javax.swing.JTree; import javax.swing.KeyStroke; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; @@ -128,6 +115,24 @@ import javax.swing.event.DocumentListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeCellRenderer; +import javax.swing.tree.TreeModel; +import javax.swing.tree.TreeNode; +import org.apache.log4j.LogManager; +import org.apache.log4j.chainsaw.icons.ChainsawIcons; +import org.apache.log4j.chainsaw.prefs.LoadSettingsEvent; +import org.apache.log4j.chainsaw.prefs.SaveSettingsEvent; +import org.apache.log4j.chainsaw.prefs.SettingsListener; +import org.apache.log4j.chainsaw.prefs.SettingsManager; +import org.apache.log4j.helpers.LogLog; +import org.apache.log4j.net.MulticastReceiver; +import org.apache.log4j.net.SocketReceiver; +import org.apache.log4j.net.UDPReceiver; +import org.apache.log4j.plugins.PluginRegistry; +import org.apache.log4j.plugins.Receiver; /** @@ -135,44 +140,53 @@ * @author Paul Smith <[EMAIL PROTECTED]> * */ -class ChainsawToolBarAndMenus implements ChangeListener, SettingsListener { +class ChainsawToolBarAndMenus implements ChangeListener, SettingsListener +{ + //~ Static fields/initializers ============================================== + private static final String SETTING_RESPONSIVENESS = "Responsiveness"; private static final String SETTING_TAB_PLACEMENT = "tab.placement"; - private LogUI logui; - private final JToolBar toolbar; - private final JMenuBar menuBar; - private final JMenu viewMenu = new JMenu("View"); - private final Collection lookAndFeelMenus = new ArrayList(); - private final Action lockToolbarAction; - private final Action toggleToolbarAction; - private final Action pauseAction; + + //~ Instance fields ========================================================= + + final JTextField findTextField; private final Action clearAction; private final Action closeAction; - private final Action toggleDetailPaneAction; private final Action findNextAction; + private final Action lockToolbarAction; + private final Action pauseAction; private final Action showPreferencesAction; - private final Action undockAction; private final Action showReceiversAction; + private final Action toggleDetailPaneAction; + private final Action toggleToolbarAction; + private final Action undockAction; + private final Collection lookAndFeelMenus = new ArrayList(); private final FileMenu fileMenu; - private final SmallToggleButton pauseButton = new SmallToggleButton(); - private final SmallToggleButton detailPaneButton = new SmallToggleButton(); - private final SmallButton clearButton = new SmallButton(); - private final JSlider responsiveSlider; - final JTextField findTextField; - private final JRadioButtonMenuItem tabsTop = new JRadioButtonMenuItem("Top"); private final JCheckBoxMenuItem toggleStatusBarCheck = new JCheckBoxMenuItem(); - private final JRadioButtonMenuItem tabsBottom = - new JRadioButtonMenuItem("Bottom"); + private final JMenu viewMenu = new JMenu("View"); + private final JMenuBar menuBar; private final JRadioButtonMenuItem levelDisplayIcon = new JRadioButtonMenuItem("Icon"); private final JRadioButtonMenuItem levelDisplayText = new JRadioButtonMenuItem("Text"); - private String levelDisplay = ChainsawConstants.LEVEL_DISPLAY_ICONS; + private final JRadioButtonMenuItem tabsBottom = + new JRadioButtonMenuItem("Bottom"); + private final JRadioButtonMenuItem tabsTop = new JRadioButtonMenuItem("Top"); + private final JSlider responsiveSlider; + private final JToolBar toolbar; + private LogUI logui; + private final SmallButton clearButton = new SmallButton(); + private final SmallToggleButton detailPaneButton = new SmallToggleButton(); + private final SmallToggleButton pauseButton = new SmallToggleButton(); private String lastFind = ""; + private String levelDisplay = ChainsawConstants.LEVEL_DISPLAY_ICONS; private final Action[] logPanelSpecificActions; - ChainsawToolBarAndMenus(final LogUI logui) { + //~ Constructors ============================================================ + + ChainsawToolBarAndMenus(final LogUI logui) + { this.logui = logui; toolbar = new JToolBar(JToolBar.HORIZONTAL); menuBar = new JMenuBar(); @@ -194,337 +208,381 @@ createToolbar(); logPanelSpecificActions = - new Action[] { + new Action[] + { pauseAction, findNextAction, clearAction, fileMenu.getFileSaveAction(), toggleDetailPaneAction, showPreferencesAction, undockAction }; } + //~ Methods ================================================================= + /** - * @return + * DOCUMENT ME! + * + * @param event DOCUMENT ME! */ - private Action createShowReceiversAction() { - final JDialog receiversWindow = new JDialog(logui, "Receivers", false); - - // TODO Change this into a TreeModel, looks nicer by Receiver type - final ReceiversTableModel model = new ReceiversTableModel(); - model.refresh(); - - final JTable table = new JTable(); - table.setModel(model); - table.getColumnModel().getColumn(0).setCellRenderer( - new DefaultTableCellRenderer() { - public void setValue(Object value) { - // TODO Other receiver types/refactor - if (value instanceof SocketReceiver) { - SocketReceiver s = (SocketReceiver) value; - super.setValue(s.getName() + "::" + s.getPort()); - } else if (value instanceof UDPReceiver) { - UDPReceiver u = (UDPReceiver) value; - super.setValue(u.getName() + "::" + u.getPort()); - } else if (value instanceof MulticastReceiver) { - MulticastReceiver m = (MulticastReceiver) value; - super.setValue(m.getName() + "::" + m.getPort()); - } else { - super.setValue(value); - } - } - - private final Color background = new Color(255, 255, 254); - private final Color COLOR_ODD = new Color(230, 230, 230); - - public Component getTableCellRendererComponent( - JTable table, Object value, boolean isSelected, boolean hasFocus, - int row, int column) { - Component c = - super.getTableCellRendererComponent( - table, value, isSelected, hasFocus, row, column); - - if ((row % 2) != 0) { - c.setBackground(COLOR_ODD); - } else { - c.setBackground(background); - } - - return c; - } - }); - - table.setCellSelectionEnabled(false); - table.setRowSelectionAllowed(false); - table.setShowGrid(false); - table.setColumnSelectionAllowed(false); - table.setEnabled(false); + public void loadSettings(LoadSettingsEvent event) + { + try + { + levelDisplay = event.getSetting(ChainsawConstants.LEVEL_DISPLAY); - final Container container = receiversWindow.getContentPane(); - container.add(new JScrollPane(table)); - receiversWindow.setSize(320, 240); + if (levelDisplay.equals(ChainsawConstants.LEVEL_DISPLAY_ICONS)) + { + levelDisplayIcon.setSelected(true); + } + else + { + levelDisplayText.setSelected(true); + } - final Action action = - new AbstractAction("Show Receivers...") { - public void actionPerformed(ActionEvent arg0) { - model.refresh(); + final int responsiveness = + event.asInt(ChainsawToolBarAndMenus.SETTING_RESPONSIVENESS); + final int tabPlacement = + event.asInt(ChainsawToolBarAndMenus.SETTING_TAB_PLACEMENT); - if (!receiversWindow.isVisible()) { - receiversWindow.setVisible(true); + SwingUtilities.invokeLater( + new Runnable() + { + public void run() + { + responsiveSlider.setValue(responsiveness); + logui.tabbedPane.setTabPlacement(tabPlacement); + scanState(); } - - receiversWindow.setLocationRelativeTo(logui); - } - }; - - action.putValue(Action.MNEMONIC_KEY,new Integer(KeyEvent.VK_E)); - action.putValue( - Action.SHORT_DESCRIPTION, - "Shows the currently configured Log4j Receivers"); - - return action; + }); + } + catch (NullPointerException e) + { + LogLog.error("error decoding setting", e); + } } - JToolBar getToolbar() { - return toolbar; - } + /** + * DOCUMENT ME! + * + * @param event DOCUMENT ME! + */ + public void saveSettings(SaveSettingsEvent event) + { + event.saveSetting( + ChainsawToolBarAndMenus.SETTING_RESPONSIVENESS, + responsiveSlider.getValue()); - JMenuBar getMenubar() { - return menuBar; + event.saveSetting( + ChainsawToolBarAndMenus.SETTING_TAB_PLACEMENT, + logui.tabbedPane.getTabPlacement()); + + event.saveSetting(ChainsawConstants.LEVEL_DISPLAY, levelDisplay); } - public void stateChanged(ChangeEvent e) { + /** + * DOCUMENT ME! + */ + public void stateChange() + { scanState(); } - public void stateChange() { + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + */ + public void stateChanged(ChangeEvent e) + { scanState(); } - private void scanState() { - switch (logui.tabbedPane.getTabPlacement()) { - case SwingConstants.TOP: - tabsTop.setSelected(true); + JMenuBar getMenubar() + { + return menuBar; + } - break; + JToolBar getToolbar() + { + return toolbar; + } - case SwingConstants.BOTTOM: - tabsBottom.setSelected(true); + JToolBar createDockwindowToolbar( + final JFrame dockablePanel, final LogUI.LogPanel logPanel) + { + final JToolBar toolbar = new JToolBar(); + toolbar.setFloatable(false); - break; - } + final String ident = dockablePanel.getTitle(); + final Action dockPauseAction = + new AbstractAction("Pause") + { + public void actionPerformed(ActionEvent evt) + { + System.out.println("trying to pause '" + ident + "'"); - toggleStatusBarCheck.setSelected(logui.isStatusBarVisible()); + if (!logui.pausedList.contains(ident)) + { + logui.pausedList.add(ident); + } + else + { + logui.pausedList.remove(ident); + } + } + }; - /** - * We get the currently selected LogPanel, and if null, deactivate some - * actions - */ - LogUI.LogPanel logPanel = logui.getCurrentLogPanel(); + dockPauseAction.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_P)); + dockPauseAction.putValue( + Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F12")); + dockPauseAction.putValue( + Action.SHORT_DESCRIPTION, + "Halts the display, while still allowing events to stream in the background"); + dockPauseAction.putValue( + Action.SMALL_ICON, new ImageIcon(ChainsawIcons.PAUSE)); - boolean activateLogPanelActions = true; + final SmallToggleButton dockPauseButton = + new SmallToggleButton(dockPauseAction); + dockPauseButton.setText(""); - if (logPanel == null) { - activateLogPanelActions = false; - logui.getStatusBar().clear(); - findTextField.setEnabled(false); + if (logui.pausedList.contains(ident)) + { + dockPauseButton.getModel().setSelected(true); + } + else + { + dockPauseButton.getModel().setSelected(false); + } - if (logui.tabbedPane.containsWelcomePanel()) { - closeAction.setEnabled(true); - } else { - closeAction.setEnabled(false); - } - } else { - fileMenu.getFileSaveAction().setEnabled(true); - findTextField.setEnabled(true); + dockPauseButton.setText(""); - if (logui.pausedList.contains(logPanel.getIdentifier())) { - pauseButton.getModel().setSelected(true); - logui.getStatusBar().setPaused(true); - } else { - pauseButton.getModel().setSelected(false); - logui.getStatusBar().setPaused(false); - } + toolbar.add(dockPauseButton); - detailPaneButton.getModel().setSelected(logPanel.isDetailPaneVisible()); - } + Action dockShowPrefsAction = + new AbstractAction("") + { + public void actionPerformed(ActionEvent arg0) + { + logPanel.showPreferences(); + } + }; - for (int i = 0; i < logPanelSpecificActions.length; i++) { - logPanelSpecificActions[i].setEnabled(activateLogPanelActions); - } + dockShowPrefsAction.putValue( + Action.SHORT_DESCRIPTION, + showPreferencesAction.getValue(Action.SHORT_DESCRIPTION)); + dockShowPrefsAction.putValue( + Action.SMALL_ICON, showPreferencesAction.getValue(Action.SMALL_ICON)); - String currentLookAndFeel = - UIManager.getLookAndFeel().getClass().getName(); - String currentLookAndFeelName = UIManager.getLookAndFeel().getName(); + toolbar.add(new SmallButton(dockShowPrefsAction)); + toolbar.addSeparator(); - for (Iterator iter = lookAndFeelMenus.iterator(); iter.hasNext();) { - JRadioButtonMenuItem element = (JRadioButtonMenuItem) iter.next(); + final Action undockedClearAction = + new AbstractAction("Clear") + { + public void actionPerformed(ActionEvent arg0) + { + logPanel.clearModel(); + } + }; - if (element.getText().equals(currentLookAndFeelName)) { - element.setSelected(true); - } else { - element.setSelected(false); - } - } - } + undockedClearAction.putValue( + Action.SMALL_ICON, new ImageIcon(ChainsawIcons.DELETE)); + undockedClearAction.putValue( + Action.SHORT_DESCRIPTION, "Removes all the events from the current view"); - private void find(boolean next) { - LogUI.LogPanel logPanel = logui.getCurrentLogPanel(); + final SmallButton dockClearButton = new SmallButton(undockedClearAction); + dockClearButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( + KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, InputEvent.CTRL_MASK), + undockedClearAction.getValue(Action.NAME)); + dockClearButton.getActionMap().put( + undockedClearAction.getValue(Action.NAME), undockedClearAction); - if (logPanel != null) { - localFind(next, logPanel, findTextField); - } - } + dockClearButton.setText(""); + toolbar.add(dockClearButton); + toolbar.addSeparator(); - private void localFind( - boolean next, final LogUI.LogPanel logPanel, - final JTextField theFindTextField) { - if (!theFindTextField.getText().equals("")) { - if ( - (lastFind.length() == 0) - || (lastFind.length() > theFindTextField.getText().length())) { - logPanel.findFromTop(theFindTextField.getText()); - } else { - if (next) { - logPanel.findNext(theFindTextField.getText()); - } else { - logPanel.find(theFindTextField.getText()); + final JTextField findField = createFindField(); + findField.getDocument().addDocumentListener( + new DocumentListener() + { + public void insertUpdate(DocumentEvent e) + { + findInUndocked(false); } - } - - lastFind = theFindTextField.getText(); - } else { - theFindTextField.requestFocus(); - } - } - private void createFindDocListener(final JTextField field) { - field.getDocument().addDocumentListener( - new DocumentListener() { - public void insertUpdate(DocumentEvent e) { - find(false); + public void removeUpdate(DocumentEvent e) + { + findInUndocked(false); } - public void removeUpdate(DocumentEvent e) { - find(false); + public void changedUpdate(DocumentEvent e) + { + findInUndocked(false); } - public void changedUpdate(DocumentEvent e) { - find(false); + private void findInUndocked(boolean next) + { + localFind(next, logPanel, findField); } }); - } - private Action setupFindFieldsAndActions() { - createFindDocListener(findTextField); + final Action undockedFindAction = + new AbstractAction() + { + public void actionPerformed(ActionEvent e) + { + localFind(true, logPanel, findField); + } + }; - final Action action = - new AbstractAction("Find Next") { - public void actionPerformed(ActionEvent e) { - find(true); + undockedFindAction.putValue(Action.NAME, "Find"); + undockedFindAction.putValue( + Action.SHORT_DESCRIPTION, "Finds the next occurrence within this view"); + undockedFindAction.putValue( + Action.SMALL_ICON, new ImageIcon(ChainsawIcons.FIND)); + + SmallButton undockedFindNextButton = new SmallButton(undockedFindAction); + + undockedFindNextButton.setAction(undockedFindAction); + undockedFindNextButton.setText(""); + undockedFindNextButton.getActionMap().put( + undockedFindAction.getValue(Action.NAME), undockedFindAction); + undockedFindNextButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( + KeyStroke.getKeyStroke("F3"), undockedFindAction.getValue(Action.NAME)); + + toolbar.add(undockedFindNextButton); + toolbar.add(findField); + + toolbar.addSeparator(); + + Action redockAction = + new AbstractAction("", ChainsawIcons.ICON_DOCK) + { + public void actionPerformed(ActionEvent arg0) + { + logPanel.dock(); } }; - // action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_F)); - action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F3")); - action.putValue( - Action.SHORT_DESCRIPTION, "Finds the next occurrence of the Find string"); - action.putValue(Action.SMALL_ICON, new ImageIcon(ChainsawIcons.FIND)); + redockAction.putValue( + Action.SHORT_DESCRIPTION, + "Docks this window back with the main Chainsaw window"); - return action; + SmallButton redockButton = new SmallButton(redockAction); + toolbar.add(redockButton); + + return toolbar; } - private Action createUndockAction() { - Action action = - new AbstractAction("Undock", ChainsawIcons.ICON_UNDOCK) { - public void actionPerformed(ActionEvent arg0) { + private Action createClearAction() + { + final Action action = + new AbstractAction("Clear") + { + public void actionPerformed(ActionEvent e) + { LogUI.LogPanel logPanel = logui.getCurrentLogPanel(); - if (logPanel != null) { - logPanel.undock(); + if (logPanel == null) + { + return; } + + logPanel.clearModel(); } }; + action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_P)); action.putValue( - Action.SHORT_DESCRIPTION, - "Undocks the current Log panel into it's own window"); + Action.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, InputEvent.CTRL_MASK)); + action.putValue( + Action.SHORT_DESCRIPTION, "Removes all the events from the current view"); + action.putValue(Action.SMALL_ICON, new ImageIcon(ChainsawIcons.DELETE)); - // TODO think of some mnemonics and HotKeys for this action return action; } - private Action createToggleToolbarAction() { - /** - * -== Begin of Show/Hide toolbar action - */ - final Action toggleToolbarAction = - new AbstractAction("Show Toolbar") { - private boolean hide = false; - - public void actionPerformed(ActionEvent e) { - hide = !hide; - - Runnable runnable = null; - - if (hide) { - runnable = - new Runnable() { - public void run() { - logui.getContentPane().remove(toolbar); - logui.getRootPane().repaint(); - logui.getRootPane().revalidate(); - } - }; - } else { - runnable = - new Runnable() { - public void run() { - logui.getContentPane().add(toolbar, BorderLayout.NORTH); - logui.getRootPane().repaint(); - logui.getRootPane().revalidate(); - } - }; + private Action createCloseHelpAction() + { + final Action action = + new AbstractAction() + { + public void actionPerformed(ActionEvent e) + { + if (logui.tabbedPane.containsWelcomePanel()) + { + logui.removeWelcomePanel(); + closeAction.putValue(Action.NAME, "Show Welcome tab"); + } + else + { + logui.addWelcomePanel(); + closeAction.putValue(Action.NAME, "Close Welcome tab"); } - - SwingUtilities.invokeLater(runnable); } }; - toggleToolbarAction.putValue( - Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_T)); + action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F1")); - return toggleToolbarAction; + // action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.ALT_MASK)); + action.putValue(Action.SHORT_DESCRIPTION, "Removes the Welcome tab"); + action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_C)); + action.putValue(Action.NAME, "Close Welcome tab"); + + return action; } - private Action createShowPreferencesAction() { - Action showPreferences = - new AbstractAction("", ChainsawIcons.ICON_PREFERENCES) { - public void actionPerformed(ActionEvent arg0) { - LogUI.LogPanel logPanel = logui.getCurrentLogPanel(); + private void createFindDocListener(final JTextField field) + { + field.getDocument().addDocumentListener( + new DocumentListener() + { + public void insertUpdate(DocumentEvent e) + { + find(false); + } - if (logPanel != null) { - logPanel.showPreferences(); - } + public void removeUpdate(DocumentEvent e) + { + find(false); } - }; - showPreferences.putValue( - Action.SHORT_DESCRIPTION, "Define display and color filters..."); + public void changedUpdate(DocumentEvent e) + { + find(false); + } + }); + } - // TODO think of good mnemonics and HotKey for this action - return showPreferences; + private JTextField createFindField() + { + JTextField tf = new JTextField(); + Dimension fixedSize = new Dimension(132, 24); + tf.setPreferredSize(fixedSize); + tf.setMaximumSize(fixedSize); + tf.setMinimumSize(fixedSize); + tf.setToolTipText("type in a simple string to find events"); + + return tf; } - private Action createLockableToolbarAction() { + private Action createLockableToolbarAction() + { final Action lockToolbarAction = - new AbstractAction("Lock Toolbar") { + new AbstractAction("Lock Toolbar") + { private boolean lock = true; - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent e) + { lock = !lock; final boolean isLocked = lock; Runnable runnable = null; runnable = - new Runnable() { - public void run() { + new Runnable() + { + public void run() + { toolbar.setFloatable(!isLocked); toolbar.repaint(); } @@ -536,188 +594,254 @@ return lockToolbarAction; } - private Action createPauseAction() { - final Action pauseAction = - new AbstractAction("Pause") { - public void actionPerformed(ActionEvent evt) { - LogUI.LogPanel logPanel = logui.getCurrentLogPanel(); + private void createMenuBar() + { + JMenu activeTabMenu = new JMenu("Current tab"); - if (logPanel == null) { - return; - } + JMenuItem menuItemUseRightMouse = + new JMenuItem( + "Other options available via panel's right mouse button popup menu"); + menuItemUseRightMouse.setEnabled(false); + activeTabMenu.add(menuItemUseRightMouse); - String ident = logPanel.getIdentifier(); - System.out.println("trying to pause '" + ident + "'"); + viewMenu.setMnemonic('V'); - if (!logui.pausedList.contains(ident)) { - logui.pausedList.add(ident); - } else { - logui.pausedList.remove(ident); - } + JCheckBoxMenuItem lockToolbarCheck = + new JCheckBoxMenuItem(lockToolbarAction); + lockToolbarCheck.setSelected(true); - scanState(); - } - }; + JCheckBoxMenuItem showToolbarCheck = + new JCheckBoxMenuItem(toggleToolbarAction); + showToolbarCheck.setSelected(true); - pauseAction.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_P)); - pauseAction.putValue( - Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F12")); - pauseAction.putValue( - Action.SHORT_DESCRIPTION, - "Halts the display, while still allowing events to stream in the background"); - pauseAction.putValue( - Action.SMALL_ICON, new ImageIcon(ChainsawIcons.PAUSE)); + JMenuItem menuItemClose = new JMenuItem(closeAction); + JCheckBoxMenuItem pause = new JCheckBoxMenuItem(pauseAction); + JMenuItem menuPrefs = new JMenuItem(showPreferencesAction); + menuPrefs.setText( + showPreferencesAction.getValue(Action.SHORT_DESCRIPTION).toString()); - return pauseAction; - } + JMenuItem menuUndock = new JMenuItem(undockAction); - private Action createToggleDetailPaneAction() { - Action action = - new AbstractAction("Show Detail Pane") { - boolean enabled = true; + viewMenu.add(menuUndock); + viewMenu.add(pause); - public void actionPerformed(ActionEvent evt) { - LogUI.LogPanel logPanel = logui.getCurrentLogPanel(); + JCheckBoxMenuItem toggleDetailMenuItem = + new JCheckBoxMenuItem(toggleDetailPaneAction); + toggleDetailMenuItem.setSelected(true); - if (logPanel == null) { - return; + final Action toggleStatusBarAction = + new AbstractAction("Show Status bar") + { + public void actionPerformed(ActionEvent arg0) + { + if (toggleStatusBarCheck.isSelected()) + { + logui.addStatusBar(); } - - logPanel.toggleDetailPanel(); - scanState(); - } - }; - - action.putValue("enabled", Boolean.TRUE); - action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_D)); - action.putValue( - Action.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_D, InputEvent.ALT_MASK)); - action.putValue(Action.SHORT_DESCRIPTION, "Hides/Shows the Detail Pane"); - action.putValue(Action.SMALL_ICON, new ImageIcon(ChainsawIcons.INFO)); - - return action; - } - - private Action createCloseHelpAction() { - final Action action = - new AbstractAction() { - public void actionPerformed(ActionEvent e) { - if (logui.tabbedPane.containsWelcomePanel()) { - logui.removeWelcomePanel(); - closeAction.putValue(Action.NAME, "Show Welcome tab"); - } else { - logui.addWelcomePanel(); - closeAction.putValue(Action.NAME, "Close Welcome tab"); + else + { + logui.removeStatusBar(); } } }; - action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F1")); + toggleStatusBarAction.putValue( + Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_B)); + toggleStatusBarCheck.setAction(toggleStatusBarAction); + toggleStatusBarCheck.setSelected(true); + viewMenu.add(toggleDetailMenuItem); + viewMenu.add(menuPrefs); - // action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.ALT_MASK)); - action.putValue(Action.SHORT_DESCRIPTION, "Removes the Welcome tab"); - action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_C)); - action.putValue(Action.NAME, "Close Welcome tab"); + viewMenu.addSeparator(); - return action; - } + viewMenu.add(new JMenuItem(clearAction)); + viewMenu.addSeparator(); + viewMenu.add(showToolbarCheck); + viewMenu.add(toggleStatusBarCheck); + viewMenu.add(menuItemClose); + viewMenu.addSeparator(); - private Action createClearAction() { - final Action action = - new AbstractAction("Clear") { - public void actionPerformed(ActionEvent e) { - LogUI.LogPanel logPanel = logui.getCurrentLogPanel(); + ButtonGroup levelIconGroup = new ButtonGroup(); + JMenu levelIconMenu = new JMenu("Display Level column as"); + levelIconMenu.setMnemonic('l'); - if (logPanel == null) { - return; - } + levelIconGroup.add(levelDisplayIcon); + levelIconGroup.add(levelDisplayText); - logPanel.clearModel(); + levelDisplayIcon.addActionListener( + new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + levelDisplay = ChainsawConstants.LEVEL_DISPLAY_ICONS; + SettingsManager.getInstance().saveSettings(); + SettingsManager.getInstance().loadSettings(); } - }; - - action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_P)); - action.putValue( - Action.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, InputEvent.CTRL_MASK)); - action.putValue( - Action.SHORT_DESCRIPTION, "Removes all the events from the current view"); - action.putValue(Action.SMALL_ICON, new ImageIcon(ChainsawIcons.DELETE)); + }); - return action; - } + levelDisplayText.addActionListener( + new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + levelDisplay = ChainsawConstants.LEVEL_DISPLAY_TEXT; + SettingsManager.getInstance().saveSettings(); + SettingsManager.getInstance().loadSettings(); + } + }); - private void createToolbar() { - Insets buttonMargins = new Insets(1, 1, 1, 1); + ButtonGroup tabPlacementGroup = new ButtonGroup(); + JMenu tabMenu = new JMenu("Tabs"); + tabMenu.setMnemonic('a'); - FileMenu fileMenu = (FileMenu) menuBar.getMenu(0); + tabPlacementGroup.add(tabsTop); + tabPlacementGroup.add(tabsBottom); - JButton fileOpenButton = - new SmallButton(fileMenu.getLog4JFileOpenAction()); - fileOpenButton.setMargin(buttonMargins); + tabsTop.addActionListener( + new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + logui.tabbedPane.setTabPlacement(JTabbedPane.TOP); + } + }); - JButton fileSaveButton = new SmallButton(fileMenu.getFileSaveAction()); - fileSaveButton.setMargin(buttonMargins); + tabsBottom.addActionListener( + new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + logui.tabbedPane.setTabPlacement(JTabbedPane.BOTTOM); + } + }); - fileOpenButton.setText(""); - fileSaveButton.setText(""); + JMenu responsiveNess = + new JMenu(ChainsawToolBarAndMenus.SETTING_RESPONSIVENESS); + responsiveNess.setMnemonic('R'); - toolbar.add(fileOpenButton); - toolbar.add(fileSaveButton); - toolbar.addSeparator(); + responsiveNess.add(createResponsivenessSlider()); - pauseButton.setAction(pauseAction); - pauseButton.setText(""); + final JMenu lookAndFeelMenu = new JMenu("Look & Feel"); + lookAndFeelMenu.setMnemonic('L'); - // pauseButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("F12"),pauseAction.getValue(Action.NAME) ); - pauseButton.getActionMap().put( - pauseAction.getValue(Action.NAME), pauseAction); + UIManager.LookAndFeelInfo[] lookAndFeels = + UIManager.getInstalledLookAndFeels(); - detailPaneButton.setAction(toggleDetailPaneAction); - detailPaneButton.setText(""); - detailPaneButton.getActionMap().put( - toggleDetailPaneAction.getValue(Action.NAME), toggleDetailPaneAction); - detailPaneButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( - KeyStroke.getKeyStroke(KeyEvent.VK_D, InputEvent.ALT_MASK), - toggleDetailPaneAction.getValue(Action.NAME)); + final ButtonGroup lookAndFeelGroup = new ButtonGroup(); - SmallButton prefsButton = new SmallButton(showPreferencesAction); - SmallButton undockButton = new SmallButton(undockAction); - undockButton.setText(""); + for (int i = 0; i < lookAndFeels.length; i++) + { + final UIManager.LookAndFeelInfo lfInfo = lookAndFeels[i]; + final JRadioButtonMenuItem lfItemMenu = + new JRadioButtonMenuItem(lfInfo.getName()); + lfItemMenu.addActionListener( + new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + SwingUtilities.invokeLater( + new Runnable() + { + public void run() + { + logui.setLookAndFeel(lfInfo.getClassName()); + } + }); + } + }); + lookAndFeelGroup.add(lfItemMenu); + lookAndFeelMenu.add(lfItemMenu); + lookAndFeelMenus.add(lfItemMenu); + } - toolbar.add(undockButton); - toolbar.add(pauseButton); - toolbar.add(detailPaneButton); - toolbar.add(prefsButton); - toolbar.addSeparator(); + levelIconMenu.add(levelDisplayIcon); + levelIconMenu.add(levelDisplayText); - toolbar.add(clearButton); - clearButton.setAction(clearAction); - clearButton.setText(""); - toolbar.addSeparator(); + if (levelDisplay.equals(ChainsawConstants.LEVEL_DISPLAY_ICONS)) + { + levelDisplayIcon.setSelected(true); + } + else + { + levelDisplayText.setSelected(true); + } - JButton findNextButton = new SmallButton(findNextAction); - findNextButton.setText(""); - findNextButton.getActionMap().put( - findNextAction.getValue(Action.NAME), findNextAction); - findNextButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( - (KeyStroke) findNextAction.getValue(Action.ACCELERATOR_KEY), - findNextAction.getValue(Action.NAME)); + tabMenu.add(tabsTop); + tabMenu.add(tabsBottom); - toolbar.add(findNextButton); + viewMenu.add(levelIconMenu); + viewMenu.add(tabMenu); + viewMenu.add(responsiveNess); + viewMenu.addSeparator(); + viewMenu.add(showReceiversAction); + viewMenu.add(lookAndFeelMenu); - Box findBox = Box.createHorizontalBox(); - findBox.add(findTextField); - toolbar.add(findBox); + JMenu helpMenu = new JMenu("Help"); + helpMenu.setMnemonic('H'); - toolbar.add(Box.createHorizontalGlue()); + JMenuItem about = new JMenuItem("About Chainsaw v2..."); + about.setMnemonic('A'); + about.addActionListener( + new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + logui.showAboutBox(); + } + }); - toolbar.setMargin(buttonMargins); - toolbar.setFloatable(false); + helpMenu.add(about); + + menuBar.add(fileMenu); + menuBar.add(viewMenu); + menuBar.add(activeTabMenu); + menuBar.add(helpMenu); + } + + private Action createPauseAction() + { + final Action pauseAction = + new AbstractAction("Pause") + { + public void actionPerformed(ActionEvent evt) + { + LogUI.LogPanel logPanel = logui.getCurrentLogPanel(); + + if (logPanel == null) + { + return; + } + + String ident = logPanel.getIdentifier(); + System.out.println("trying to pause '" + ident + "'"); + + if (!logui.pausedList.contains(ident)) + { + logui.pausedList.add(ident); + } + else + { + logui.pausedList.remove(ident); + } + + scanState(); + } + }; + + pauseAction.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_P)); + pauseAction.putValue( + Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F12")); + pauseAction.putValue( + Action.SHORT_DESCRIPTION, + "Halts the display, while still allowing events to stream in the background"); + pauseAction.putValue( + Action.SMALL_ICON, new ImageIcon(ChainsawIcons.PAUSE)); + + return pauseAction; } - private JComponent createResponsivenessSlider() { + private JComponent createResponsivenessSlider() + { JPanel responsiveNessPanel = new JPanel(); BoxLayout layout = new BoxLayout(responsiveNessPanel, BoxLayout.Y_AXIS); @@ -737,16 +861,22 @@ responsiveSlider.setPaintTrack(true); responsiveSlider.setInverted(true); responsiveSlider.getModel().addChangeListener( - new ChangeListener() { - public void stateChanged(ChangeEvent e) { - if (responsiveSlider.getValueIsAdjusting()) { + new ChangeListener() + { + public void stateChanged(ChangeEvent e) + { + if (responsiveSlider.getValueIsAdjusting()) + { /** * We'll wait until it stops. */ - } else { + } + else + { int value = responsiveSlider.getValue(); - if (value == 0) { + if (value == 0) + { value = 100; } @@ -768,399 +898,547 @@ return responsiveNessPanel; } - private void createMenuBar() { - JMenu activeTabMenu = new JMenu("Current tab"); - - JMenuItem menuItemUseRightMouse = - new JMenuItem( - "Other options available via panel's right mouse button popup menu"); - menuItemUseRightMouse.setEnabled(false); - activeTabMenu.add(menuItemUseRightMouse); + private Action createShowPreferencesAction() + { + Action showPreferences = + new AbstractAction("", ChainsawIcons.ICON_PREFERENCES) + { + public void actionPerformed(ActionEvent arg0) + { + LogUI.LogPanel logPanel = logui.getCurrentLogPanel(); - viewMenu.setMnemonic('V'); + if (logPanel != null) + { + logPanel.showPreferences(); + } + } + }; - JCheckBoxMenuItem lockToolbarCheck = - new JCheckBoxMenuItem(lockToolbarAction); - lockToolbarCheck.setSelected(true); + showPreferences.putValue( + Action.SHORT_DESCRIPTION, "Define display and color filters..."); - JCheckBoxMenuItem showToolbarCheck = - new JCheckBoxMenuItem(toggleToolbarAction); - showToolbarCheck.setSelected(true); + // TODO think of good mnemonics and HotKey for this action + return showPreferences; + } - JMenuItem menuItemClose = new JMenuItem(closeAction); - JCheckBoxMenuItem pause = new JCheckBoxMenuItem(pauseAction); - JMenuItem menuPrefs = new JMenuItem(showPreferencesAction); - menuPrefs.setText( - showPreferencesAction.getValue(Action.SHORT_DESCRIPTION).toString()); + /** + * @return + */ + private Action createShowReceiversAction() + { + final JDialog receiversWindow = new JDialog(logui, "Receivers", false); - JMenuItem menuUndock = new JMenuItem(undockAction); + final JTree tree = new JTree(ReceiversTreeModel.create()); + tree.setCellRenderer(new ReceiverTreeCellRenderer()); - viewMenu.add(menuUndock); - viewMenu.add(pause); + final Container container = receiversWindow.getContentPane(); + JComponent component = tree; + container.add(new JScrollPane(component)); + receiversWindow.setSize(320, 240); - JCheckBoxMenuItem toggleDetailMenuItem = - new JCheckBoxMenuItem(toggleDetailPaneAction); - toggleDetailMenuItem.setSelected(true); + final Action action = + new AbstractAction("Show Receivers...") + { + public void actionPerformed(ActionEvent arg0) + { + tree.setModel(ReceiversTreeModel.create()); - final Action toggleStatusBarAction = - new AbstractAction("Show Status bar") { - public void actionPerformed(ActionEvent arg0) { - if (toggleStatusBarCheck.isSelected()) { - logui.addStatusBar(); - } else { - logui.removeStatusBar(); + if (!receiversWindow.isVisible()) + { + receiversWindow.setVisible(true); } + + receiversWindow.setLocationRelativeTo(logui); } }; - toggleStatusBarAction.putValue( - Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_B)); - toggleStatusBarCheck.setAction(toggleStatusBarAction); - toggleStatusBarCheck.setSelected(true); - viewMenu.add(toggleDetailMenuItem); - viewMenu.add(menuPrefs); + action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_E)); + action.putValue( + Action.SHORT_DESCRIPTION, + "Shows the currently configured Log4j Receivers"); - viewMenu.addSeparator(); + return action; + } - viewMenu.add(new JMenuItem(clearAction)); - viewMenu.addSeparator(); - viewMenu.add(showToolbarCheck); - viewMenu.add(toggleStatusBarCheck); - viewMenu.add(menuItemClose); - viewMenu.addSeparator(); + private Action createToggleDetailPaneAction() + { + Action action = + new AbstractAction("Show Detail Pane") + { + boolean enabled = true; - ButtonGroup levelIconGroup = new ButtonGroup(); - JMenu levelIconMenu = new JMenu("Display Level column as"); - levelIconMenu.setMnemonic('l'); + public void actionPerformed(ActionEvent evt) + { + LogUI.LogPanel logPanel = logui.getCurrentLogPanel(); - levelIconGroup.add(levelDisplayIcon); - levelIconGroup.add(levelDisplayText); + if (logPanel == null) + { + return; + } - levelDisplayIcon.addActionListener( - new ActionListener() { - public void actionPerformed(ActionEvent e) { - levelDisplay = ChainsawConstants.LEVEL_DISPLAY_ICONS; - SettingsManager.getInstance().saveSettings(); - SettingsManager.getInstance().loadSettings(); + logPanel.toggleDetailPanel(); + scanState(); } - }); + }; - levelDisplayText.addActionListener( - new ActionListener() { - public void actionPerformed(ActionEvent e) { - levelDisplay = ChainsawConstants.LEVEL_DISPLAY_TEXT; - SettingsManager.getInstance().saveSettings(); - SettingsManager.getInstance().loadSettings(); - } - }); + action.putValue("enabled", Boolean.TRUE); + action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_D)); + action.putValue( + Action.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_D, InputEvent.ALT_MASK)); + action.putValue(Action.SHORT_DESCRIPTION, "Hides/Shows the Detail Pane"); + action.putValue(Action.SMALL_ICON, new ImageIcon(ChainsawIcons.INFO)); - ButtonGroup tabPlacementGroup = new ButtonGroup(); - JMenu tabMenu = new JMenu("Tabs"); - tabMenu.setMnemonic('a'); + return action; + } - tabPlacementGroup.add(tabsTop); - tabPlacementGroup.add(tabsBottom); + private Action createToggleToolbarAction() + { + /** + * -== Begin of Show/Hide toolbar action + */ + final Action toggleToolbarAction = + new AbstractAction("Show Toolbar") + { + private boolean hide = false; - tabsTop.addActionListener( - new ActionListener() { - public void actionPerformed(ActionEvent e) { - logui.tabbedPane.setTabPlacement(JTabbedPane.TOP); - } - }); + public void actionPerformed(ActionEvent e) + { + hide = !hide; - tabsBottom.addActionListener( - new ActionListener() { - public void actionPerformed(ActionEvent e) { - logui.tabbedPane.setTabPlacement(JTabbedPane.BOTTOM); - } - }); + Runnable runnable = null; - JMenu responsiveNess = - new JMenu(ChainsawToolBarAndMenus.SETTING_RESPONSIVENESS); - responsiveNess.setMnemonic('R'); + if (hide) + { + runnable = + new Runnable() + { + public void run() + { + logui.getContentPane().remove(toolbar); + logui.getRootPane().repaint(); + logui.getRootPane().revalidate(); + } + }; + } + else + { + runnable = + new Runnable() + { + public void run() + { + logui.getContentPane().add(toolbar, BorderLayout.NORTH); + logui.getRootPane().repaint(); + logui.getRootPane().revalidate(); + } + }; + } - responsiveNess.add(createResponsivenessSlider()); + SwingUtilities.invokeLater(runnable); + } + }; - final JMenu lookAndFeelMenu = new JMenu("Look & Feel"); - lookAndFeelMenu.setMnemonic('L'); + toggleToolbarAction.putValue( + Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_T)); - UIManager.LookAndFeelInfo[] lookAndFeels = - UIManager.getInstalledLookAndFeels(); + return toggleToolbarAction; + } - final ButtonGroup lookAndFeelGroup = new ButtonGroup(); + private void createToolbar() + { + Insets buttonMargins = new Insets(1, 1, 1, 1); - for (int i = 0; i < lookAndFeels.length; i++) { - final UIManager.LookAndFeelInfo lfInfo = lookAndFeels[i]; - final JRadioButtonMenuItem lfItemMenu = - new JRadioButtonMenuItem(lfInfo.getName()); - lfItemMenu.addActionListener( - new ActionListener() { - public void actionPerformed(ActionEvent e) { - SwingUtilities.invokeLater( - new Runnable() { - public void run() { - logui.setLookAndFeel(lfInfo.getClassName()); - } - }); - } - }); - lookAndFeelGroup.add(lfItemMenu); - lookAndFeelMenu.add(lfItemMenu); - lookAndFeelMenus.add(lfItemMenu); - } + FileMenu fileMenu = (FileMenu) menuBar.getMenu(0); - levelIconMenu.add(levelDisplayIcon); - levelIconMenu.add(levelDisplayText); + JButton fileOpenButton = + new SmallButton(fileMenu.getLog4JFileOpenAction()); + fileOpenButton.setMargin(buttonMargins); - if (levelDisplay.equals(ChainsawConstants.LEVEL_DISPLAY_ICONS)) { - levelDisplayIcon.setSelected(true); - } else { - levelDisplayText.setSelected(true); - } + JButton fileSaveButton = new SmallButton(fileMenu.getFileSaveAction()); + fileSaveButton.setMargin(buttonMargins); - tabMenu.add(tabsTop); - tabMenu.add(tabsBottom); + fileOpenButton.setText(""); + fileSaveButton.setText(""); - viewMenu.add(levelIconMenu); - viewMenu.add(tabMenu); - viewMenu.add(responsiveNess); - viewMenu.addSeparator(); - viewMenu.add(showReceiversAction); - viewMenu.add(lookAndFeelMenu); + toolbar.add(fileOpenButton); + toolbar.add(fileSaveButton); + toolbar.addSeparator(); - JMenu helpMenu = new JMenu("Help"); - helpMenu.setMnemonic('H'); + pauseButton.setAction(pauseAction); + pauseButton.setText(""); - JMenuItem about = new JMenuItem("About Chainsaw v2..."); - about.setMnemonic('A'); - about.addActionListener( - new ActionListener() { - public void actionPerformed(ActionEvent e) { - logui.showAboutBox(); - } - }); + // pauseButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("F12"),pauseAction.getValue(Action.NAME) ); + pauseButton.getActionMap().put( + pauseAction.getValue(Action.NAME), pauseAction); - helpMenu.add(about); + detailPaneButton.setAction(toggleDetailPaneAction); + detailPaneButton.setText(""); + detailPaneButton.getActionMap().put( + toggleDetailPaneAction.getValue(Action.NAME), toggleDetailPaneAction); + detailPaneButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( + KeyStroke.getKeyStroke(KeyEvent.VK_D, InputEvent.ALT_MASK), + toggleDetailPaneAction.getValue(Action.NAME)); - menuBar.add(fileMenu); - menuBar.add(viewMenu); - menuBar.add(activeTabMenu); - menuBar.add(helpMenu); - } + SmallButton prefsButton = new SmallButton(showPreferencesAction); + SmallButton undockButton = new SmallButton(undockAction); + undockButton.setText(""); - JToolBar createDockwindowToolbar( - final JFrame dockablePanel, final LogUI.LogPanel logPanel) { - final JToolBar toolbar = new JToolBar(); - toolbar.setFloatable(false); + toolbar.add(undockButton); + toolbar.add(pauseButton); + toolbar.add(detailPaneButton); + toolbar.add(prefsButton); + toolbar.addSeparator(); - final String ident = dockablePanel.getTitle(); - final Action dockPauseAction = - new AbstractAction("Pause") { - public void actionPerformed(ActionEvent evt) { - System.out.println("trying to pause '" + ident + "'"); + toolbar.add(clearButton); + clearButton.setAction(clearAction); + clearButton.setText(""); + toolbar.addSeparator(); - if (!logui.pausedList.contains(ident)) { - logui.pausedList.add(ident); - } else { - logui.pausedList.remove(ident); - } - } - }; + JButton findNextButton = new SmallButton(findNextAction); + findNextButton.setText(""); + findNextButton.getActionMap().put( + findNextAction.getValue(Action.NAME), findNextAction); + findNextButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( + (KeyStroke) findNextAction.getValue(Action.ACCELERATOR_KEY), + findNextAction.getValue(Action.NAME)); - dockPauseAction.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_P)); - dockPauseAction.putValue( - Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F12")); - dockPauseAction.putValue( - Action.SHORT_DESCRIPTION, - "Halts the display, while still allowing events to stream in the background"); - dockPauseAction.putValue( - Action.SMALL_ICON, new ImageIcon(ChainsawIcons.PAUSE)); + toolbar.add(findNextButton); - final SmallToggleButton dockPauseButton = - new SmallToggleButton(dockPauseAction); - dockPauseButton.setText(""); + Box findBox = Box.createHorizontalBox(); + findBox.add(findTextField); + toolbar.add(findBox); - if (logui.pausedList.contains(ident)) { - dockPauseButton.getModel().setSelected(true); - } else { - dockPauseButton.getModel().setSelected(false); - } + toolbar.add(Box.createHorizontalGlue()); - dockPauseButton.setText(""); + toolbar.setMargin(buttonMargins); + toolbar.setFloatable(false); + } - toolbar.add(dockPauseButton); + private Action createUndockAction() + { + Action action = + new AbstractAction("Undock", ChainsawIcons.ICON_UNDOCK) + { + public void actionPerformed(ActionEvent arg0) + { + LogUI.LogPanel logPanel = logui.getCurrentLogPanel(); - Action dockShowPrefsAction = - new AbstractAction("") { - public void actionPerformed(ActionEvent arg0) { - logPanel.showPreferences(); + if (logPanel != null) + { + logPanel.undock(); + } } }; - dockShowPrefsAction.putValue( + action.putValue( Action.SHORT_DESCRIPTION, - showPreferencesAction.getValue(Action.SHORT_DESCRIPTION)); - dockShowPrefsAction.putValue( - Action.SMALL_ICON, showPreferencesAction.getValue(Action.SMALL_ICON)); + "Undocks the current Log panel into it's own window"); - toolbar.add(new SmallButton(dockShowPrefsAction)); - toolbar.addSeparator(); + // TODO think of some mnemonics and HotKeys for this action + return action; + } - final Action undockedClearAction = - new AbstractAction("Clear") { - public void actionPerformed(ActionEvent arg0) { - logPanel.clearModel(); - } - }; + private void find(boolean next) + { + LogUI.LogPanel logPanel = logui.getCurrentLogPanel(); - undockedClearAction.putValue( - Action.SMALL_ICON, new ImageIcon(ChainsawIcons.DELETE)); - undockedClearAction.putValue( - Action.SHORT_DESCRIPTION, "Removes all the events from the current view"); + if (logPanel != null) + { + localFind(next, logPanel, findTextField); + } + } - final SmallButton dockClearButton = new SmallButton(undockedClearAction); - dockClearButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( - KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, InputEvent.CTRL_MASK), - undockedClearAction.getValue(Action.NAME)); - dockClearButton.getActionMap().put( - undockedClearAction.getValue(Action.NAME), undockedClearAction); + private void localFind( + boolean next, final LogUI.LogPanel logPanel, + final JTextField theFindTextField) + { + if (!theFindTextField.getText().equals("")) + { + if ( + (lastFind.length() == 0) + || (lastFind.length() > theFindTextField.getText().length())) + { + logPanel.findFromTop(theFindTextField.getText()); + } + else + { + if (next) + { + logPanel.findNext(theFindTextField.getText()); + } + else + { + logPanel.find(theFindTextField.getText()); + } + } + + lastFind = theFindTextField.getText(); + } + else + { + theFindTextField.requestFocus(); + } + } - dockClearButton.setText(""); - toolbar.add(dockClearButton); - toolbar.addSeparator(); + private void scanState() + { + switch (logui.tabbedPane.getTabPlacement()) + { + case SwingConstants.TOP : + tabsTop.setSelected(true); - final JTextField findField = createFindField(); - findField.getDocument().addDocumentListener( - new DocumentListener() { - public void insertUpdate(DocumentEvent e) { - findInUndocked(false); - } + break; - public void removeUpdate(DocumentEvent e) { - findInUndocked(false); - } + case SwingConstants.BOTTOM : + tabsBottom.setSelected(true); - public void changedUpdate(DocumentEvent e) { - findInUndocked(false); - } + break; + } - private void findInUndocked(boolean next) { - localFind(next, logPanel, findField); - } - }); + toggleStatusBarCheck.setSelected(logui.isStatusBarVisible()); - final Action undockedFindAction = - new AbstractAction() { - public void actionPerformed(ActionEvent e) { - localFind(true, logPanel, findField); - } - }; + /** + * We get the currently selected LogPanel, and if null, deactivate some + * actions + */ + LogUI.LogPanel logPanel = logui.getCurrentLogPanel(); - undockedFindAction.putValue(Action.NAME, "Find"); - undockedFindAction.putValue( - Action.SHORT_DESCRIPTION, "Finds the next occurrence within this view"); - undockedFindAction.putValue( - Action.SMALL_ICON, new ImageIcon(ChainsawIcons.FIND)); + boolean activateLogPanelActions = true; - SmallButton undockedFindNextButton = new SmallButton(undockedFindAction); + if (logPanel == null) + { + activateLogPanelActions = false; + logui.getStatusBar().clear(); + findTextField.setEnabled(false); - undockedFindNextButton.setAction(undockedFindAction); - undockedFindNextButton.setText(""); - undockedFindNextButton.getActionMap().put( - undockedFindAction.getValue(Action.NAME), undockedFindAction); - undockedFindNextButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( - KeyStroke.getKeyStroke("F3"), undockedFindAction.getValue(Action.NAME)); + if (logui.tabbedPane.containsWelcomePanel()) + { + closeAction.setEnabled(true); + } + else + { + closeAction.setEnabled(false); + } + } + else + { + fileMenu.getFileSaveAction().setEnabled(true); + findTextField.setEnabled(true); - toolbar.add(undockedFindNextButton); - toolbar.add(findField); + if (logui.pausedList.contains(logPanel.getIdentifier())) + { + pauseButton.getModel().setSelected(true); + logui.getStatusBar().setPaused(true); + } + else + { + pauseButton.getModel().setSelected(false); + logui.getStatusBar().setPaused(false); + } - toolbar.addSeparator(); + detailPaneButton.getModel().setSelected(logPanel.isDetailPaneVisible()); + } - Action redockAction = - new AbstractAction("", ChainsawIcons.ICON_DOCK) { - public void actionPerformed(ActionEvent arg0) { - logPanel.dock(); - } - }; + for (int i = 0; i < logPanelSpecificActions.length; i++) + { + logPanelSpecificActions[i].setEnabled(activateLogPanelActions); + } - redockAction.putValue( - Action.SHORT_DESCRIPTION, - "Docks this window back with the main Chainsaw window"); + String currentLookAndFeel = + UIManager.getLookAndFeel().getClass().getName(); + String currentLookAndFeelName = UIManager.getLookAndFeel().getName(); - SmallButton redockButton = new SmallButton(redockAction); - toolbar.add(redockButton); + for (Iterator iter = lookAndFeelMenus.iterator(); iter.hasNext();) + { + JRadioButtonMenuItem element = (JRadioButtonMenuItem) iter.next(); - return toolbar; + if (element.getText().equals(currentLookAndFeelName)) + { + element.setSelected(true); + } + else + { + element.setSelected(false); + } + } } - private JTextField createFindField() { - JTextField tf = new JTextField(); - Dimension fixedSize = new Dimension(132, 24); - tf.setPreferredSize(fixedSize); - tf.setMaximumSize(fixedSize); - tf.setMinimumSize(fixedSize); - tf.setToolTipText("type in a simple string to find events"); + private Action setupFindFieldsAndActions() + { + createFindDocListener(findTextField); - return tf; + final Action action = + new AbstractAction("Find Next") + { + public void actionPerformed(ActionEvent e) + { + find(true); + } + }; + + // action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_F)); + action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F3")); + action.putValue( + Action.SHORT_DESCRIPTION, "Finds the next occurrence of the Find string"); + action.putValue(Action.SMALL_ICON, new ImageIcon(ChainsawIcons.FIND)); + + return action; } - public void loadSettings(LoadSettingsEvent event) { - try { - levelDisplay = event.getSetting(ChainsawConstants.LEVEL_DISPLAY); + //~ Inner Classes =========================================================== - if (levelDisplay.equals(ChainsawConstants.LEVEL_DISPLAY_ICONS)) { - levelDisplayIcon.setSelected(true); - } else { - levelDisplayText.setSelected(true); - } + /** + * DOCUMENT ME! + * + * @author $author$ + * @version $Revision$ + */ + public static class ReceiverTreeCellRenderer extends DefaultTreeCellRenderer + { + //~ Instance fields ======================================================= + + protected Color m_bkNonSelectionColor; + protected Color m_bkSelectionColor; + protected Color m_borderSelectionColor; + protected Color m_textNonSelectionColor; + protected Color m_textSelectionColor; + private Icon activeReceiverIcon = + new ImageIcon(ChainsawIcons.ICON_ACTIVE_RECEIVER); + private Icon inactiveReceiverIcon = + new ImageIcon(ChainsawIcons.ICON_INACTIVE_RECEIVER); + private Icon rootIcon = new ImageIcon(ChainsawIcons.ANIM_NET_CONNECT); + private boolean m_selected; - final int responsiveness = - event.asInt(ChainsawToolBarAndMenus.SETTING_RESPONSIVENESS); - final int tabPlacement = - event.asInt(ChainsawToolBarAndMenus.SETTING_TAB_PLACEMENT); + //~ Constructors ========================================================== - SwingUtilities.invokeLater( - new Runnable() { - public void run() { - responsiveSlider.setValue(responsiveness); - logui.tabbedPane.setTabPlacement(tabPlacement); - scanState(); - } - }); - } catch (NullPointerException e) { - LogLog.error("error decoding setting", e); + public ReceiverTreeCellRenderer() + { + super(); + + // m_textSelectionColor = UIManager.getColor("Tree.selectionForeground"); + // m_textNonSelectionColor = UIManager.getColor("Tree.textForeground"); + // m_bkSelectionColor = UIManager.getColor("Tree.selectionBackground"); + // m_bkNonSelectionColor = UIManager.getColor("Tree.textBackground"); + // m_borderSelectionColor = UIManager.getColor("Tree.selectionBorderColor"); + // setOpaque(false); } - } - public void saveSettings(SaveSettingsEvent event) { - event.saveSetting( - ChainsawToolBarAndMenus.SETTING_RESPONSIVENESS, - responsiveSlider.getValue()); + //~ Methods =============================================================== - event.saveSetting( - ChainsawToolBarAndMenus.SETTING_TAB_PLACEMENT, - logui.tabbedPane.getTabPlacement()); + /** + * DOCUMENT ME! + * + * @param tree DOCUMENT ME! + * @param value DOCUMENT ME! + * @param selected DOCUMENT ME! + * @param expanded DOCUMENT ME! + * @param leaf DOCUMENT ME! + * @param row DOCUMENT ME! + * @param hasFocus DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public Component getTreeCellRendererComponent( + JTree tree, Object value, boolean selected, boolean expanded, + boolean leaf, int row, boolean hasFocus) + { + super.getTreeCellRendererComponent( + tree, value, selected, expanded, leaf, row, hasFocus); + + DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; + Object obj = node.getUserObject(); + setText(obj.toString()); + + if (tree.getModel().getRoot().equals(value)) + { + setIcon(rootIcon); + } + else if (obj instanceof SocketReceiver) + { + SocketReceiver receiver = (SocketReceiver) obj; + setText(receiver.getName() + "::" + receiver.getPort()); + + if (receiver.isActive()) + { + setIcon(activeReceiverIcon); + } + else + { + setIcon(inactiveReceiverIcon); + } + } - event.saveSetting(ChainsawConstants.LEVEL_DISPLAY, levelDisplay); + return this; + } } - public static class ReceiversTableModel extends AbstractTableModel { + /** + * DOCUMENT ME! + * + * @author $author$ + * @version $Revision$ + */ + public static class ReceiversTableModel extends AbstractTableModel + { + //~ Instance fields ======================================================= + private List receivers; - public Object getValueAt(int row, int col) { - return receivers.get(row); - } + //~ Methods =============================================================== - public int getColumnCount() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public int getColumnCount() + { return 1; } - public int getRowCount() { + /** + * DOCUMENT ME! + * + * @param column DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public String getColumnName(int column) + { + return "Receiver Details"; + } + + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public int getRowCount() + { return receivers.size(); } - public void refresh() { - synchronized (this) { + /** + * DOCUMENT ME! + * + * @param row DOCUMENT ME! + * @param col DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public Object getValueAt(int row, int col) + { + return receivers.get(row); + } + + /** + * DOCUMENT ME! + */ + public void refresh() + { + synchronized (this) + { receivers = PluginRegistry.getPlugins( LogManager.getLoggerRepository(), Receiver.class); @@ -1168,9 +1446,64 @@ fireTableDataChanged(); } + } + + /** + * DOCUMENT ME! + * + * @author $author$ + * @version $Revision$ + */ + public static class ReceiversTreeModel extends DefaultTreeModel + { + //~ Constructors ========================================================== + + public ReceiversTreeModel() + { + super(new DefaultMutableTreeNode("Receivers")); + } - public String getColumnName(int column) { - return "Receiver Details"; + //~ Methods =============================================================== + + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public static final TreeModel create() + { + ReceiversTreeModel model = new ReceiversTreeModel(); + + Collection receivers = + PluginRegistry.getPlugins( + LogManager.getLoggerRepository(), Receiver.class); + + for (Iterator iter = receivers.iterator(); iter.hasNext();) + { + Receiver item = (Receiver) iter.next(); + DefaultMutableTreeNode receiverNode = new DefaultMutableTreeNode(item); + + if (item instanceof SocketReceiver) + { + for ( + Iterator iterator = + ((SocketReceiver) item).getConnectedSocketDetails().iterator(); + iterator.hasNext();) + { + Object details = (Object) iterator.next(); + receiverNode.add(new DefaultMutableTreeNode(details)); + } + } + + model.getRootNode().add(receiverNode); + } + + return model; + } + + DefaultMutableTreeNode getRootNode() + { + return (DefaultMutableTreeNode) getRoot(); } } @@ -1186,14 +1519,20 @@ * @author Paul Smith <[EMAIL PROTECTED]> * */ - class SmallButton extends JButton implements MouseListener { - protected Border m_raised = new SoftBevelBorder(BevelBorder.RAISED); - protected Border m_lowered = new SoftBevelBorder(BevelBorder.LOWERED); + class SmallButton extends JButton implements MouseListener + { + //~ Instance fields ======================================================= + protected Border m_inactive = new EmptyBorder(3, 3, 3, 3); protected Border m_border = m_inactive; + protected Border m_lowered = new SoftBevelBorder(BevelBorder.LOWERED); + protected Border m_raised = new SoftBevelBorder(BevelBorder.RAISED); protected Insets m_ins = new Insets(4, 4, 4, 4); - public SmallButton() { + //~ Constructors ========================================================== + + public SmallButton() + { super(); setBorder(m_inactive); setMargin(m_ins); @@ -1201,7 +1540,8 @@ addMouseListener(this); } - public SmallButton(Action act) { + public SmallButton(Action act) + { this(); setAction(act); setRequestFocusEnabled(false); @@ -1210,39 +1550,90 @@ addMouseListener(this); } - public float getAlignmentY() { + //~ Methods =============================================================== + + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public float getAlignmentY() + { return 0.5f; } - public Border getBorder() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public Border getBorder() + { return m_border; } - public Insets getInsets() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public Insets getInsets() + { return m_ins; } - public void mousePressed(MouseEvent e) { - m_border = m_lowered; - setBorder(m_lowered); + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + */ + public void mouseClicked(MouseEvent e) + { } - public void mouseReleased(MouseEvent e) { - m_border = m_inactive; - setBorder(m_inactive); + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + */ + public void mouseEntered(MouseEvent e) + { + if (isEnabled()) + { + m_border = m_raised; + setBorder(m_raised); + } } - public void mouseClicked(MouseEvent e) { + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + */ + public void mouseExited(MouseEvent e) + { + m_border = m_inactive; + setBorder(m_inactive); } - public void mouseEntered(MouseEvent e) { - if (isEnabled()) { - m_border = m_raised; - setBorder(m_raised); - } + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + */ + public void mousePressed(MouseEvent e) + { + m_border = m_lowered; + setBorder(m_lowered); } - public void mouseExited(MouseEvent e) { + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + */ + public void mouseReleased(MouseEvent e) + { m_border = m_inactive; setBorder(m_inactive); } @@ -1260,15 +1651,21 @@ * @author Paul Smith <[EMAIL PROTECTED]> */ class SmallToggleButton extends JToggleButton implements ItemListener, - MouseListener { + MouseListener + { + //~ Instance fields ======================================================= + + protected Border m_highlighted = new SoftBevelBorder(BevelBorder.RAISED); protected Border m_raised = BorderFactory.createEmptyBorder(); protected Border m_inactive = m_raised; - protected Border m_highlighted = new SoftBevelBorder(BevelBorder.RAISED); + protected Border m_border = m_inactive; protected Border m_lowered = new SoftBevelBorder(BevelBorder.LOWERED); protected Insets m_ins = new Insets(4, 4, 4, 4); - protected Border m_border = m_inactive; - public SmallToggleButton() { + //~ Constructors ========================================================== + + public SmallToggleButton() + { super(); setHorizontalAlignment(CENTER); setBorder(isSelected() ? m_lowered : m_raised); @@ -1279,48 +1676,106 @@ setText(""); } - public SmallToggleButton(Action action) { + public SmallToggleButton(Action action) + { this(); setAction(action); } - public float getAlignmentY() { + //~ Methods =============================================================== + + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public float getAlignmentY() + { return 0.5f; } - public Insets getInsets() { - return m_ins; + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public Border getBorder() + { + return m_border; } - public Border getBorder() { - return m_border; + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public Insets getInsets() + { + return m_ins; } - public void itemStateChanged(ItemEvent e) { + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + */ + public void itemStateChanged(ItemEvent e) + { setBorder(isSelected() ? m_lowered : m_raised); } - public void mousePressed(MouseEvent e) { - m_border = m_lowered; - setBorder(m_lowered); + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + */ + public void mouseClicked(MouseEvent e) + { + } + + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + */ + public void mouseEntered(MouseEvent e) + { + if (isEnabled()) + { + m_border = m_highlighted; + setBorder(m_highlighted); + } } - public void mouseReleased(MouseEvent e) { + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + */ + public void mouseExited(MouseEvent e) + { m_border = m_inactive; setBorder(m_inactive); } - public void mouseClicked(MouseEvent e) { + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + */ + public void mousePressed(MouseEvent e) + { + m_border = m_lowered; + setBorder(m_lowered); } - public void mouseEntered(MouseEvent e) { - if (isEnabled()) { - m_border = m_highlighted; - setBorder(m_highlighted); - } - } - - public void mouseExited(MouseEvent e) { + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + */ + public void mouseReleased(MouseEvent e) + { m_border = m_inactive; setBorder(m_inactive); }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]