http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/96ebd9ad/src/main/java/org/apache/log4j/chainsaw/LogPanel.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/log4j/chainsaw/LogPanel.java b/src/main/java/org/apache/log4j/chainsaw/LogPanel.java index dcf16a0..8bbd2d4 100644 --- a/src/main/java/org/apache/log4j/chainsaw/LogPanel.java +++ b/src/main/java/org/apache/log4j/chainsaw/LogPanel.java @@ -17,113 +17,8 @@ package org.apache.log4j.chainsaw; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.EventQueue; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Point; -import java.awt.Toolkit; -import java.awt.Window; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.FocusEvent; -import java.awt.event.FocusListener; -import java.awt.event.InputEvent; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionAdapter; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.io.EOFException; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.StringReader; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.text.DateFormat; -import java.text.NumberFormat; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.Enumeration; -import java.util.EventObject; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.Vector; - -import javax.swing.AbstractAction; -import javax.swing.AbstractListModel; -import javax.swing.Action; -import javax.swing.BorderFactory; -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.ButtonGroup; -import javax.swing.ComboBoxEditor; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JColorChooser; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JDialog; -import javax.swing.JEditorPane; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JMenuItem; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JRadioButtonMenuItem; -import javax.swing.JScrollPane; -import javax.swing.JSeparator; -import javax.swing.JSplitPane; -import javax.swing.JTable; -import javax.swing.JTextField; -import javax.swing.JToolBar; -import javax.swing.KeyStroke; -import javax.swing.ListSelectionModel; -import javax.swing.MutableComboBoxModel; -import javax.swing.SwingConstants; -import javax.swing.SwingUtilities; -import javax.swing.UIManager; -import javax.swing.WindowConstants; -import javax.swing.event.CellEditorListener; -import javax.swing.event.ChangeEvent; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import javax.swing.event.PopupMenuEvent; -import javax.swing.event.PopupMenuListener; -import javax.swing.event.TableColumnModelEvent; -import javax.swing.event.TableColumnModelListener; -import javax.swing.event.TableModelEvent; -import javax.swing.table.TableCellEditor; -import javax.swing.table.TableColumn; -import javax.swing.table.TableColumnModel; -import javax.swing.text.Document; - +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.io.xml.DomDriver; import org.apache.log4j.Level; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; @@ -150,8 +45,25 @@ import org.apache.log4j.rule.Rule; import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.spi.LoggingEventFieldResolver; -import com.thoughtworks.xstream.XStream; -import com.thoughtworks.xstream.io.xml.DomDriver; +import javax.swing.*; +import javax.swing.event.*; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableColumn; +import javax.swing.table.TableColumnModel; +import javax.swing.text.Document; +import java.awt.*; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; +import java.awt.event.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.*; +import java.net.URLEncoder; +import java.text.DateFormat; +import java.text.NumberFormat; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.List; /** @@ -193,597 +105,595 @@ import com.thoughtworks.xstream.io.xml.DomDriver; * CHAINSAW_CAPACITY system property) or ArrayList (no max size) * <li>use the mouse context menu to 'best-fit' columns, define display * expression filters based on mouse location and access other capabilities - *</ul> - * - *@see org.apache.log4j.chainsaw.color.ColorPanel - *@see org.apache.log4j.rule.ExpressionRule - *@see org.apache.log4j.spi.LoggingEventFieldResolver - * - *@author Scott Deboy (sdeboy at apache.org) - *@author Paul Smith (psmith at apache.org) - *@author Stephen Pain - *@author Isuru Suriarachchi + * </ul> * + * @author Scott Deboy (sdeboy at apache.org) + * @author Paul Smith (psmith at apache.org) + * @author Stephen Pain + * @author Isuru Suriarachchi + * @see org.apache.log4j.chainsaw.color.ColorPanel + * @see org.apache.log4j.rule.ExpressionRule + * @see org.apache.log4j.spi.LoggingEventFieldResolver */ public class LogPanel extends DockablePanel implements EventBatchListener, Profileable { - private static final DateFormat TIMESTAMP_DATE_FORMAT = new SimpleDateFormat(Constants.TIMESTAMP_RULE_FORMAT); - private static final double DEFAULT_DETAIL_SPLIT_LOCATION = 0.71d; - private static final double DEFAULT_LOG_TREE_SPLIT_LOCATION = 0.2d; - private final String identifier; - private final ChainsawStatusBar statusBar; - private final JFrame logPanelPreferencesFrame = new JFrame(); - private ColorPanel colorPanel; - private final JFrame colorFrame = new JFrame(); - private final JFrame undockedFrame; - private final DockablePanel externalPanel; - private final Action dockingAction; - private final JToolBar undockedToolbar; - private final JSortTable table; - private final TableColorizingRenderer renderer; - private final EventContainer tableModel; - private final JEditorPane detail; - private final JSplitPane lowerPanel; - private final DetailPaneUpdater detailPaneUpdater; - private final JPanel detailPanel = new JPanel(new BorderLayout()); - private final JSplitPane nameTreeAndMainPanelSplit; - private final LoggerNameTreePanel logTreePanel; - private final LogPanelPreferenceModel preferenceModel = new LogPanelPreferenceModel(); - private ApplicationPreferenceModel applicationPreferenceModel; - private final LogPanelPreferencePanel logPanelPreferencesPanel; - private final FilterModel filterModel = new FilterModel(); - private final RuleColorizer colorizer = new RuleColorizer(); - private final RuleMediator tableRuleMediator = new RuleMediator(false); - private final RuleMediator searchRuleMediator = new RuleMediator(true); - private final EventDetailLayout detailLayout = new EventDetailLayout(); - private double lastLogTreePanelSplitLocation = DEFAULT_LOG_TREE_SPLIT_LOCATION; - private Point currentPoint; - private JTable currentTable; - private boolean paused = false; - private Rule findRule; - private String currentFindRuleText; - private Rule findMarkerRule; - private final int dividerSize; - static final String TABLE_COLUMN_ORDER = "table.columns.order"; - static final String TABLE_COLUMN_WIDTHS = "table.columns.widths"; - static final String COLORS_EXTENSION = ".colors"; - private static final int LOG_PANEL_SERIALIZATION_VERSION_NUMBER = 2; //increment when format changes - private int previousLastIndex = -1; - private final Logger logger = LogManager.getLogger(LogPanel.class); - private AutoFilterComboBox filterCombo; - private AutoFilterComboBox findCombo; - private JScrollPane eventsPane; - private int currentSearchMatchCount; - private Rule clearTableExpressionRule; - private int lowerPanelDividerLocation; - private EventContainer searchModel; - private final JSortTable searchTable; - private TableColorizingRenderer searchRenderer; - private ToggleToolTips mainToggleToolTips; - private ToggleToolTips searchToggleToolTips; - private JScrollPane detailPane; - private JScrollPane searchPane; - //only one tableCellEditor, shared by both tables - private TableCellEditor markerCellEditor; - private JToolBar detailToolbar; - private boolean searchResultsDisplayed; - private ColorizedEventAndSearchMatchThumbnail colorizedEventAndSearchMatchThumbnail; - private EventTimeDeltaMatchThumbnail eventTimeDeltaMatchThumbnail; - private boolean isDetailPanelVisible; - - /** - * Creates a new LogPanel object. If a LogPanel with this identifier has - * been loaded previously, reload settings saved on last exit. - * - * @param statusBar shared status bar, provided by main application - * @param identifier used to load and save settings - */ - public LogPanel(final ChainsawStatusBar statusBar, final String identifier, int cyclicBufferSize, - Map<String, RuleColorizer> allColorizers, final ApplicationPreferenceModel applicationPreferenceModel) { - this.identifier = identifier; - this.statusBar = statusBar; - this.applicationPreferenceModel = applicationPreferenceModel; - this.logPanelPreferencesPanel = new LogPanelPreferencePanel(preferenceModel, applicationPreferenceModel); - logger.debug("creating logpanel for " + identifier); - - setLayout(new BorderLayout()); - - String prototypeValue = "1231231231231231231231"; - - filterCombo = new AutoFilterComboBox(); - findCombo = new AutoFilterComboBox(); - - filterCombo.setPrototypeDisplayValue(prototypeValue); - buildCombo(filterCombo, true, findCombo.model); - - findCombo.setPrototypeDisplayValue(prototypeValue); - buildCombo(findCombo, false, filterCombo.model); - - final Map<Object, String> columnNameKeywordMap = new HashMap<>(); - columnNameKeywordMap.put(ChainsawConstants.CLASS_COL_NAME, LoggingEventFieldResolver.CLASS_FIELD); - columnNameKeywordMap.put(ChainsawConstants.FILE_COL_NAME, LoggingEventFieldResolver.FILE_FIELD); - columnNameKeywordMap.put(ChainsawConstants.LEVEL_COL_NAME, LoggingEventFieldResolver.LEVEL_FIELD); - columnNameKeywordMap.put(ChainsawConstants.LINE_COL_NAME, LoggingEventFieldResolver.LINE_FIELD); - columnNameKeywordMap.put(ChainsawConstants.LOGGER_COL_NAME, LoggingEventFieldResolver.LOGGER_FIELD); - columnNameKeywordMap.put(ChainsawConstants.NDC_COL_NAME, LoggingEventFieldResolver.NDC_FIELD); - columnNameKeywordMap.put(ChainsawConstants.MESSAGE_COL_NAME, LoggingEventFieldResolver.MSG_FIELD); - columnNameKeywordMap.put(ChainsawConstants.THREAD_COL_NAME, LoggingEventFieldResolver.THREAD_FIELD); - columnNameKeywordMap.put(ChainsawConstants.THROWABLE_COL_NAME, LoggingEventFieldResolver.EXCEPTION_FIELD); - columnNameKeywordMap.put(ChainsawConstants.TIMESTAMP_COL_NAME, LoggingEventFieldResolver.TIMESTAMP_FIELD); - columnNameKeywordMap.put(ChainsawConstants.ID_COL_NAME.toUpperCase(), LoggingEventFieldResolver.PROP_FIELD + Constants.LOG4J_ID_KEY); - columnNameKeywordMap.put(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE.toUpperCase(), LoggingEventFieldResolver.PROP_FIELD + ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE); - columnNameKeywordMap.put(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE.toUpperCase(), LoggingEventFieldResolver.PROP_FIELD + ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE); - - logPanelPreferencesFrame.setTitle("'" + identifier + "' Log Panel Preferences"); - logPanelPreferencesFrame.setIconImage( - ((ImageIcon) ChainsawIcons.ICON_PREFERENCES).getImage()); - logPanelPreferencesFrame.getContentPane().add(new JScrollPane(logPanelPreferencesPanel)); - - logPanelPreferencesFrame.setSize(740, 520); - - logPanelPreferencesPanel.setOkCancelActionListener( + private static final DateFormat TIMESTAMP_DATE_FORMAT = new SimpleDateFormat(Constants.TIMESTAMP_RULE_FORMAT); + private static final double DEFAULT_DETAIL_SPLIT_LOCATION = 0.71d; + private static final double DEFAULT_LOG_TREE_SPLIT_LOCATION = 0.2d; + private final String identifier; + private final ChainsawStatusBar statusBar; + private final JFrame logPanelPreferencesFrame = new JFrame(); + private ColorPanel colorPanel; + private final JFrame colorFrame = new JFrame(); + private final JFrame undockedFrame; + private final DockablePanel externalPanel; + private final Action dockingAction; + private final JToolBar undockedToolbar; + private final JSortTable table; + private final TableColorizingRenderer renderer; + private final EventContainer tableModel; + private final JEditorPane detail; + private final JSplitPane lowerPanel; + private final DetailPaneUpdater detailPaneUpdater; + private final JPanel detailPanel = new JPanel(new BorderLayout()); + private final JSplitPane nameTreeAndMainPanelSplit; + private final LoggerNameTreePanel logTreePanel; + private final LogPanelPreferenceModel preferenceModel = new LogPanelPreferenceModel(); + private ApplicationPreferenceModel applicationPreferenceModel; + private final LogPanelPreferencePanel logPanelPreferencesPanel; + private final FilterModel filterModel = new FilterModel(); + private final RuleColorizer colorizer = new RuleColorizer(); + private final RuleMediator tableRuleMediator = new RuleMediator(false); + private final RuleMediator searchRuleMediator = new RuleMediator(true); + private final EventDetailLayout detailLayout = new EventDetailLayout(); + private double lastLogTreePanelSplitLocation = DEFAULT_LOG_TREE_SPLIT_LOCATION; + private Point currentPoint; + private JTable currentTable; + private boolean paused = false; + private Rule findRule; + private String currentFindRuleText; + private Rule findMarkerRule; + private final int dividerSize; + static final String TABLE_COLUMN_ORDER = "table.columns.order"; + static final String TABLE_COLUMN_WIDTHS = "table.columns.widths"; + static final String COLORS_EXTENSION = ".colors"; + private static final int LOG_PANEL_SERIALIZATION_VERSION_NUMBER = 2; //increment when format changes + private int previousLastIndex = -1; + private final Logger logger = LogManager.getLogger(LogPanel.class); + private AutoFilterComboBox filterCombo; + private AutoFilterComboBox findCombo; + private JScrollPane eventsPane; + private int currentSearchMatchCount; + private Rule clearTableExpressionRule; + private int lowerPanelDividerLocation; + private EventContainer searchModel; + private final JSortTable searchTable; + private TableColorizingRenderer searchRenderer; + private ToggleToolTips mainToggleToolTips; + private ToggleToolTips searchToggleToolTips; + private JScrollPane detailPane; + private JScrollPane searchPane; + //only one tableCellEditor, shared by both tables + private TableCellEditor markerCellEditor; + private JToolBar detailToolbar; + private boolean searchResultsDisplayed; + private ColorizedEventAndSearchMatchThumbnail colorizedEventAndSearchMatchThumbnail; + private EventTimeDeltaMatchThumbnail eventTimeDeltaMatchThumbnail; + private boolean isDetailPanelVisible; + + /** + * Creates a new LogPanel object. If a LogPanel with this identifier has + * been loaded previously, reload settings saved on last exit. + * + * @param statusBar shared status bar, provided by main application + * @param identifier used to load and save settings + */ + public LogPanel(final ChainsawStatusBar statusBar, final String identifier, int cyclicBufferSize, + Map<String, RuleColorizer> allColorizers, final ApplicationPreferenceModel applicationPreferenceModel) { + this.identifier = identifier; + this.statusBar = statusBar; + this.applicationPreferenceModel = applicationPreferenceModel; + this.logPanelPreferencesPanel = new LogPanelPreferencePanel(preferenceModel, applicationPreferenceModel); + logger.debug("creating logpanel for " + identifier); + + setLayout(new BorderLayout()); + + String prototypeValue = "1231231231231231231231"; + + filterCombo = new AutoFilterComboBox(); + findCombo = new AutoFilterComboBox(); + + filterCombo.setPrototypeDisplayValue(prototypeValue); + buildCombo(filterCombo, true, findCombo.model); + + findCombo.setPrototypeDisplayValue(prototypeValue); + buildCombo(findCombo, false, filterCombo.model); + + final Map<Object, String> columnNameKeywordMap = new HashMap<>(); + columnNameKeywordMap.put(ChainsawConstants.CLASS_COL_NAME, LoggingEventFieldResolver.CLASS_FIELD); + columnNameKeywordMap.put(ChainsawConstants.FILE_COL_NAME, LoggingEventFieldResolver.FILE_FIELD); + columnNameKeywordMap.put(ChainsawConstants.LEVEL_COL_NAME, LoggingEventFieldResolver.LEVEL_FIELD); + columnNameKeywordMap.put(ChainsawConstants.LINE_COL_NAME, LoggingEventFieldResolver.LINE_FIELD); + columnNameKeywordMap.put(ChainsawConstants.LOGGER_COL_NAME, LoggingEventFieldResolver.LOGGER_FIELD); + columnNameKeywordMap.put(ChainsawConstants.NDC_COL_NAME, LoggingEventFieldResolver.NDC_FIELD); + columnNameKeywordMap.put(ChainsawConstants.MESSAGE_COL_NAME, LoggingEventFieldResolver.MSG_FIELD); + columnNameKeywordMap.put(ChainsawConstants.THREAD_COL_NAME, LoggingEventFieldResolver.THREAD_FIELD); + columnNameKeywordMap.put(ChainsawConstants.THROWABLE_COL_NAME, LoggingEventFieldResolver.EXCEPTION_FIELD); + columnNameKeywordMap.put(ChainsawConstants.TIMESTAMP_COL_NAME, LoggingEventFieldResolver.TIMESTAMP_FIELD); + columnNameKeywordMap.put(ChainsawConstants.ID_COL_NAME.toUpperCase(), LoggingEventFieldResolver.PROP_FIELD + Constants.LOG4J_ID_KEY); + columnNameKeywordMap.put(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE.toUpperCase(), LoggingEventFieldResolver.PROP_FIELD + ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE); + columnNameKeywordMap.put(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE.toUpperCase(), LoggingEventFieldResolver.PROP_FIELD + ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE); + + logPanelPreferencesFrame.setTitle("'" + identifier + "' Log Panel Preferences"); + logPanelPreferencesFrame.setIconImage( + ((ImageIcon) ChainsawIcons.ICON_PREFERENCES).getImage()); + logPanelPreferencesFrame.getContentPane().add(new JScrollPane(logPanelPreferencesPanel)); + + logPanelPreferencesFrame.setSize(740, 520); + + logPanelPreferencesPanel.setOkCancelActionListener( e -> logPanelPreferencesFrame.setVisible(false)); KeyStroke escape = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false); - Action closeLogPanelPreferencesFrameAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - logPanelPreferencesFrame.setVisible(false); - } - }; - logPanelPreferencesFrame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(escape, "ESCAPE"); logPanelPreferencesFrame.getRootPane(). - getActionMap().put("ESCAPE", closeLogPanelPreferencesFrameAction); + Action closeLogPanelPreferencesFrameAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + logPanelPreferencesFrame.setVisible(false); + } + }; + logPanelPreferencesFrame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(escape, "ESCAPE"); + logPanelPreferencesFrame.getRootPane(). + getActionMap().put("ESCAPE", closeLogPanelPreferencesFrameAction); - setDetailPaneConversionPattern( - DefaultLayoutFactory.getDefaultPatternLayout()); - detailLayout.setConversionPattern( - DefaultLayoutFactory.getDefaultPatternLayout()); + setDetailPaneConversionPattern( + DefaultLayoutFactory.getDefaultPatternLayout()); + detailLayout.setConversionPattern( + DefaultLayoutFactory.getDefaultPatternLayout()); - undockedFrame = new JFrame(identifier); - undockedFrame.setDefaultCloseOperation( - WindowConstants.DO_NOTHING_ON_CLOSE); + undockedFrame = new JFrame(identifier); + undockedFrame.setDefaultCloseOperation( + WindowConstants.DO_NOTHING_ON_CLOSE); - if (ChainsawIcons.UNDOCKED_ICON != null) { - undockedFrame.setIconImage( - new ImageIcon(ChainsawIcons.UNDOCKED_ICON).getImage()); - } + if (ChainsawIcons.UNDOCKED_ICON != null) { + undockedFrame.setIconImage( + new ImageIcon(ChainsawIcons.UNDOCKED_ICON).getImage()); + } - externalPanel = new DockablePanel(); - externalPanel.setLayout(new BorderLayout()); + externalPanel = new DockablePanel(); + externalPanel.setLayout(new BorderLayout()); - undockedFrame.addWindowListener( - new WindowAdapter() { - public void windowClosing(WindowEvent e) { - dock(); - } - }); + undockedFrame.addWindowListener( + new WindowAdapter() { + public void windowClosing(WindowEvent e) { + dock(); + } + }); - undockedToolbar = createDockwindowToolbar(); - externalPanel.add(undockedToolbar, BorderLayout.NORTH); - undockedFrame.getContentPane().add(externalPanel); - undockedFrame.setSize(new Dimension(1024, 768)); - undockedFrame.pack(); + undockedToolbar = createDockwindowToolbar(); + externalPanel.add(undockedToolbar, BorderLayout.NORTH); + undockedFrame.getContentPane().add(externalPanel); + undockedFrame.setSize(new Dimension(1024, 768)); + undockedFrame.pack(); - preferenceModel.addPropertyChangeListener( - "scrollToBottom", + preferenceModel.addPropertyChangeListener( + "scrollToBottom", evt -> { - boolean value = (Boolean) evt.getNewValue(); - if (value) { - scrollToBottom(); - } + boolean value = (Boolean) evt.getNewValue(); + if (value) { + scrollToBottom(); + } }); - /* - * Menus on which the preferencemodels rely - */ + /* + * Menus on which the preferencemodels rely + */ - /** - * Setup a popup menu triggered for Timestamp column to allow time stamp - * format changes - */ - final JPopupMenu dateFormatChangePopup = new JPopupMenu(); - final JRadioButtonMenuItem isoButton = - new JRadioButtonMenuItem( - new AbstractAction("Use ISO8601Format") { - public void actionPerformed(ActionEvent e) { - preferenceModel.setDateFormatPattern("ISO8601"); - } - }); - final JRadioButtonMenuItem simpleTimeButton = - new JRadioButtonMenuItem( - new AbstractAction("Use simple time") { - public void actionPerformed(ActionEvent e) { - preferenceModel.setDateFormatPattern("HH:mm:ss"); - } - }); + /** + * Setup a popup menu triggered for Timestamp column to allow time stamp + * format changes + */ + final JPopupMenu dateFormatChangePopup = new JPopupMenu(); + final JRadioButtonMenuItem isoButton = + new JRadioButtonMenuItem( + new AbstractAction("Use ISO8601Format") { + public void actionPerformed(ActionEvent e) { + preferenceModel.setDateFormatPattern("ISO8601"); + } + }); + final JRadioButtonMenuItem simpleTimeButton = + new JRadioButtonMenuItem( + new AbstractAction("Use simple time") { + public void actionPerformed(ActionEvent e) { + preferenceModel.setDateFormatPattern("HH:mm:ss"); + } + }); - ButtonGroup dfBG = new ButtonGroup(); - dfBG.add(isoButton); - dfBG.add(simpleTimeButton); - simpleTimeButton.setSelected(true); - dateFormatChangePopup.add(isoButton); - dateFormatChangePopup.add(simpleTimeButton); + ButtonGroup dfBG = new ButtonGroup(); + dfBG.add(isoButton); + dfBG.add(simpleTimeButton); + simpleTimeButton.setSelected(true); + dateFormatChangePopup.add(isoButton); + dateFormatChangePopup.add(simpleTimeButton); - final JCheckBoxMenuItem menuItemLoggerTree = - new JCheckBoxMenuItem("Show Logger Tree"); - menuItemLoggerTree.addActionListener( + final JCheckBoxMenuItem menuItemLoggerTree = + new JCheckBoxMenuItem("Show Logger Tree"); + menuItemLoggerTree.addActionListener( e -> preferenceModel.setLogTreePanelVisible( - menuItemLoggerTree.isSelected())); - menuItemLoggerTree.setIcon(new ImageIcon(ChainsawIcons.WINDOW_ICON)); + menuItemLoggerTree.isSelected())); + menuItemLoggerTree.setIcon(new ImageIcon(ChainsawIcons.WINDOW_ICON)); - final JCheckBoxMenuItem menuItemToggleDetails = - new JCheckBoxMenuItem("Show Detail Pane"); - menuItemToggleDetails.addActionListener( + final JCheckBoxMenuItem menuItemToggleDetails = + new JCheckBoxMenuItem("Show Detail Pane"); + menuItemToggleDetails.addActionListener( e -> preferenceModel.setDetailPaneVisible( - menuItemToggleDetails.isSelected())); + menuItemToggleDetails.isSelected())); - menuItemToggleDetails.setIcon(new ImageIcon(ChainsawIcons.INFO)); + menuItemToggleDetails.setIcon(new ImageIcon(ChainsawIcons.INFO)); - /* - * add preferencemodel listeners - */ - preferenceModel.addPropertyChangeListener("levelIcons", - new PropertyChangeListener() { - public void propertyChange(PropertyChangeEvent evt) { - boolean useIcons = (Boolean) evt.getNewValue(); - renderer.setLevelUseIcons(useIcons); - table.tableChanged(new TableModelEvent(tableModel)); - searchRenderer.setLevelUseIcons(useIcons); - searchTable.tableChanged(new TableModelEvent(searchModel)); - } - }); + /* + * add preferencemodel listeners + */ + preferenceModel.addPropertyChangeListener("levelIcons", + new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + boolean useIcons = (Boolean) evt.getNewValue(); + renderer.setLevelUseIcons(useIcons); + table.tableChanged(new TableModelEvent(tableModel)); + searchRenderer.setLevelUseIcons(useIcons); + searchTable.tableChanged(new TableModelEvent(searchModel)); + } + }); - /* - * add preferencemodel listeners - */ - preferenceModel.addPropertyChangeListener("wrapMessage", - new PropertyChangeListener() { - public void propertyChange(PropertyChangeEvent evt) { - boolean wrap = (Boolean) evt.getNewValue(); - renderer.setWrapMessage(wrap); - table.tableChanged(new TableModelEvent(tableModel)); - searchRenderer.setWrapMessage(wrap); - searchTable.tableChanged(new TableModelEvent(searchModel)); - } - }); + /* + * add preferencemodel listeners + */ + preferenceModel.addPropertyChangeListener("wrapMessage", + new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + boolean wrap = (Boolean) evt.getNewValue(); + renderer.setWrapMessage(wrap); + table.tableChanged(new TableModelEvent(tableModel)); + searchRenderer.setWrapMessage(wrap); + searchTable.tableChanged(new TableModelEvent(searchModel)); + } + }); - preferenceModel.addPropertyChangeListener("searchResultsVisible", + preferenceModel.addPropertyChangeListener("searchResultsVisible", evt -> { - boolean displaySearchResultsInDetailsIfAvailable = (Boolean) evt.getNewValue(); - if (displaySearchResultsInDetailsIfAvailable) { - showSearchResults(); - } else { - hideSearchResults(); - } + boolean displaySearchResultsInDetailsIfAvailable = (Boolean) evt.getNewValue(); + if (displaySearchResultsInDetailsIfAvailable) { + showSearchResults(); + } else { + hideSearchResults(); + } }); - preferenceModel.addPropertyChangeListener("highlightSearchMatchText", - new PropertyChangeListener() { - public void propertyChange(PropertyChangeEvent evt) { - boolean highlightText = (Boolean) evt.getNewValue(); - renderer.setHighlightSearchMatchText(highlightText); - table.tableChanged(new TableModelEvent(tableModel)); - searchRenderer.setHighlightSearchMatchText(highlightText); - searchTable.tableChanged(new TableModelEvent(searchModel)); - } - }); + preferenceModel.addPropertyChangeListener("highlightSearchMatchText", + new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + boolean highlightText = (Boolean) evt.getNewValue(); + renderer.setHighlightSearchMatchText(highlightText); + table.tableChanged(new TableModelEvent(tableModel)); + searchRenderer.setHighlightSearchMatchText(highlightText); + searchTable.tableChanged(new TableModelEvent(searchModel)); + } + }); - preferenceModel.addPropertyChangeListener( - "detailPaneVisible", + preferenceModel.addPropertyChangeListener( + "detailPaneVisible", evt -> { - boolean detailPaneVisible = (Boolean) evt.getNewValue(); + boolean detailPaneVisible = (Boolean) evt.getNewValue(); - if (detailPaneVisible) { - showDetailPane(); - } else { - //don't hide the detail pane if search results are being displayed - if (!searchResultsDisplayed) { - hideDetailPane(); + if (detailPaneVisible) { + showDetailPane(); + } else { + //don't hide the detail pane if search results are being displayed + if (!searchResultsDisplayed) { + hideDetailPane(); + } } - } }); - preferenceModel.addPropertyChangeListener( - "logTreePanelVisible", + preferenceModel.addPropertyChangeListener( + "logTreePanelVisible", evt -> { - boolean newValue = (Boolean) evt.getNewValue(); + boolean newValue = (Boolean) evt.getNewValue(); - if (newValue) { - showLogTreePanel(); - } else { - hideLogTreePanel(); - } + if (newValue) { + showLogTreePanel(); + } else { + hideLogTreePanel(); + } }); - - preferenceModel.addPropertyChangeListener("toolTips", - new PropertyChangeListener() { - public void propertyChange(PropertyChangeEvent evt) { - boolean toolTips = (Boolean) evt.getNewValue(); - renderer.setToolTipsVisible(toolTips); - searchRenderer.setToolTipsVisible(toolTips); - } - }); - - preferenceModel.addPropertyChangeListener("visibleColumns", - new PropertyChangeListener() { - public void propertyChange(PropertyChangeEvent evt) { - //remove all columns and re-add visible - TableColumnModel columnModel = table.getColumnModel(); - while (columnModel.getColumnCount() > 0) { - columnModel.removeColumn(columnModel.getColumn(0)); - } - for (Object o1 : preferenceModel.getVisibleColumnOrder()) { - TableColumn c = (TableColumn) o1; - if (c.getHeaderValue().toString().equalsIgnoreCase(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE)) { - c.setCellEditor(markerCellEditor); - } - columnModel.addColumn(c); - } - TableColumnModel searchColumnModel = searchTable.getColumnModel(); - while (searchColumnModel.getColumnCount() > 0) { - searchColumnModel.removeColumn(searchColumnModel.getColumn(0)); - } - for (Object o : preferenceModel.getVisibleColumnOrder()) { - TableColumn c = (TableColumn) o; - searchColumnModel.addColumn(c); - } - } - }); - - PropertyChangeListener datePrefsChangeListener = - new PropertyChangeListener() { - public void propertyChange(PropertyChangeEvent evt) { - LogPanelPreferenceModel model = (LogPanelPreferenceModel) evt.getSource(); - - isoButton.setSelected(model.isUseISO8601Format()); - simpleTimeButton.setSelected(!model.isUseISO8601Format() && !model.isCustomDateFormat()); - - if (model.getTimeZone() != null) { - renderer.setTimeZone(model.getTimeZone()); - searchRenderer.setTimeZone(model.getTimeZone()); - } - - if (model.isUseISO8601Format()) { - renderer.setDateFormatter(new SimpleDateFormat(Constants.ISO8601_PATTERN)); - searchRenderer.setDateFormatter(new SimpleDateFormat(Constants.ISO8601_PATTERN)); - } else { - try { - renderer.setDateFormatter(new SimpleDateFormat(model.getDateFormatPattern())); - } catch (IllegalArgumentException iae) { - model.setDefaultDatePatternFormat(); - renderer.setDateFormatter(new SimpleDateFormat(Constants.ISO8601_PATTERN)); - } - try { - searchRenderer.setDateFormatter(new SimpleDateFormat(model.getDateFormatPattern())); - } catch (IllegalArgumentException iae) { - model.setDefaultDatePatternFormat(); - searchRenderer.setDateFormatter(new SimpleDateFormat(Constants.ISO8601_PATTERN)); - } - } - table.tableChanged(new TableModelEvent(tableModel)); - searchTable.tableChanged(new TableModelEvent(searchModel)); - } - }; + preferenceModel.addPropertyChangeListener("toolTips", + new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + boolean toolTips = (Boolean) evt.getNewValue(); + renderer.setToolTipsVisible(toolTips); + searchRenderer.setToolTipsVisible(toolTips); + } + }); + + preferenceModel.addPropertyChangeListener("visibleColumns", + new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + //remove all columns and re-add visible + TableColumnModel columnModel = table.getColumnModel(); + while (columnModel.getColumnCount() > 0) { + columnModel.removeColumn(columnModel.getColumn(0)); + } + for (Object o1 : preferenceModel.getVisibleColumnOrder()) { + TableColumn c = (TableColumn) o1; + if (c.getHeaderValue().toString().equalsIgnoreCase(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE)) { + c.setCellEditor(markerCellEditor); + } + columnModel.addColumn(c); + } + TableColumnModel searchColumnModel = searchTable.getColumnModel(); + while (searchColumnModel.getColumnCount() > 0) { + searchColumnModel.removeColumn(searchColumnModel.getColumn(0)); + } + for (Object o : preferenceModel.getVisibleColumnOrder()) { + TableColumn c = (TableColumn) o; + searchColumnModel.addColumn(c); + } + } + }); - preferenceModel.addPropertyChangeListener("dateFormatPattern", datePrefsChangeListener); - preferenceModel.addPropertyChangeListener("dateFormatTimeZone", datePrefsChangeListener); + PropertyChangeListener datePrefsChangeListener = + new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + LogPanelPreferenceModel model = (LogPanelPreferenceModel) evt.getSource(); - preferenceModel.addPropertyChangeListener("clearTableExpression", evt -> { - LogPanelPreferenceModel model = (LogPanelPreferenceModel)evt.getSource(); - String expression = model.getClearTableExpression(); - try { - clearTableExpressionRule = ExpressionRule.getRule(expression); - logger.info("clearTableExpressionRule set to: " + expression); - } catch (Exception e) { - logger.info("clearTableExpressionRule invalid - ignoring: " + expression); - clearTableExpressionRule = null; - } - }); + isoButton.setSelected(model.isUseISO8601Format()); + simpleTimeButton.setSelected(!model.isUseISO8601Format() && !model.isCustomDateFormat()); + + if (model.getTimeZone() != null) { + renderer.setTimeZone(model.getTimeZone()); + searchRenderer.setTimeZone(model.getTimeZone()); + } + + if (model.isUseISO8601Format()) { + renderer.setDateFormatter(new SimpleDateFormat(Constants.ISO8601_PATTERN)); + searchRenderer.setDateFormatter(new SimpleDateFormat(Constants.ISO8601_PATTERN)); + } else { + try { + renderer.setDateFormatter(new SimpleDateFormat(model.getDateFormatPattern())); + } catch (IllegalArgumentException iae) { + model.setDefaultDatePatternFormat(); + renderer.setDateFormatter(new SimpleDateFormat(Constants.ISO8601_PATTERN)); + } + try { + searchRenderer.setDateFormatter(new SimpleDateFormat(model.getDateFormatPattern())); + } catch (IllegalArgumentException iae) { + model.setDefaultDatePatternFormat(); + searchRenderer.setDateFormatter(new SimpleDateFormat(Constants.ISO8601_PATTERN)); + } + } - preferenceModel.addPropertyChangeListener("loggerPrecision", - new PropertyChangeListener() { - public void propertyChange(PropertyChangeEvent evt) { - LogPanelPreferenceModel model = (LogPanelPreferenceModel) evt.getSource(); + table.tableChanged(new TableModelEvent(tableModel)); + searchTable.tableChanged(new TableModelEvent(searchModel)); + } + }; - renderer.setLoggerPrecision(model.getLoggerPrecision()); - table.tableChanged(new TableModelEvent(tableModel)); + preferenceModel.addPropertyChangeListener("dateFormatPattern", datePrefsChangeListener); + preferenceModel.addPropertyChangeListener("dateFormatTimeZone", datePrefsChangeListener); - searchRenderer.setLoggerPrecision(model.getLoggerPrecision()); - searchTable.tableChanged(new TableModelEvent(searchModel)); - } - }); + preferenceModel.addPropertyChangeListener("clearTableExpression", evt -> { + LogPanelPreferenceModel model = (LogPanelPreferenceModel) evt.getSource(); + String expression = model.getClearTableExpression(); + try { + clearTableExpressionRule = ExpressionRule.getRule(expression); + logger.info("clearTableExpressionRule set to: " + expression); + } catch (Exception e) { + logger.info("clearTableExpressionRule invalid - ignoring: " + expression); + clearTableExpressionRule = null; + } + }); + + preferenceModel.addPropertyChangeListener("loggerPrecision", + new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + LogPanelPreferenceModel model = (LogPanelPreferenceModel) evt.getSource(); + + renderer.setLoggerPrecision(model.getLoggerPrecision()); + table.tableChanged(new TableModelEvent(tableModel)); + + searchRenderer.setLoggerPrecision(model.getLoggerPrecision()); + searchTable.tableChanged(new TableModelEvent(searchModel)); + } + }); - preferenceModel.addPropertyChangeListener("toolTips", + preferenceModel.addPropertyChangeListener("toolTips", evt -> { - boolean value = (Boolean) evt.getNewValue(); - searchToggleToolTips.setSelected(value); - mainToggleToolTips.setSelected(value); + boolean value = (Boolean) evt.getNewValue(); + searchToggleToolTips.setSelected(value); + mainToggleToolTips.setSelected(value); }); - preferenceModel.addPropertyChangeListener( - "logTreePanelVisible", + preferenceModel.addPropertyChangeListener( + "logTreePanelVisible", evt -> { - boolean value = (Boolean) evt.getNewValue(); - menuItemLoggerTree.setSelected(value); + boolean value = (Boolean) evt.getNewValue(); + menuItemLoggerTree.setSelected(value); }); - preferenceModel.addPropertyChangeListener( - "detailPaneVisible", + preferenceModel.addPropertyChangeListener( + "detailPaneVisible", evt -> { - boolean value = (Boolean) evt.getNewValue(); - menuItemToggleDetails.setSelected(value); + boolean value = (Boolean) evt.getNewValue(); + menuItemToggleDetails.setSelected(value); }); - applicationPreferenceModel.addPropertyChangeListener("searchColor", new PropertyChangeListener() { - public void propertyChange(PropertyChangeEvent evt) - { - if (table != null) { - table.repaint(); - } - if (searchTable != null) { - searchTable.repaint(); + applicationPreferenceModel.addPropertyChangeListener("searchColor", new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + if (table != null) { + table.repaint(); + } + if (searchTable != null) { + searchTable.repaint(); + } } - } - }); + }); - applicationPreferenceModel.addPropertyChangeListener("alternatingColor", new PropertyChangeListener() { - public void propertyChange(PropertyChangeEvent evt) - { - if (table != null) { - table.repaint(); + applicationPreferenceModel.addPropertyChangeListener("alternatingColor", new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + if (table != null) { + table.repaint(); + } + if (searchTable != null) { + searchTable.repaint(); + } } - if (searchTable != null) { - searchTable.repaint(); - } - } - }); + }); - /* - *End of preferenceModel listeners - */ - tableModel = new ChainsawCyclicBufferTableModel(cyclicBufferSize, colorizer, "main"); - table = new JSortTable(tableModel); + /* + *End of preferenceModel listeners + */ + tableModel = new ChainsawCyclicBufferTableModel(cyclicBufferSize, colorizer, "main"); + table = new JSortTable(tableModel); - markerCellEditor = new MarkerCellEditor(); - table.setName("main"); - table.setColumnSelectionAllowed(false); - table.setRowSelectionAllowed(true); + markerCellEditor = new MarkerCellEditor(); + table.setName("main"); + table.setColumnSelectionAllowed(false); + table.setRowSelectionAllowed(true); - searchModel = new ChainsawCyclicBufferTableModel(cyclicBufferSize, colorizer, "search"); - searchTable = new JSortTable(searchModel); + searchModel = new ChainsawCyclicBufferTableModel(cyclicBufferSize, colorizer, "search"); + searchTable = new JSortTable(searchModel); - searchTable.setName("search"); - searchTable.setColumnSelectionAllowed(false); - searchTable.setRowSelectionAllowed(true); + searchTable.setName("search"); + searchTable.setColumnSelectionAllowed(false); + searchTable.setRowSelectionAllowed(true); - //we've mapped f2, shift f2 and ctrl-f2 to marker-related actions, unmap them from the table - table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("F2"), "none"); - table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, InputEvent.SHIFT_MASK), "none"); - table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "none"); - table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() | InputEvent.SHIFT_MASK), "none"); + //we've mapped f2, shift f2 and ctrl-f2 to marker-related actions, unmap them from the table + table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("F2"), "none"); + table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, InputEvent.SHIFT_MASK), "none"); + table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "none"); + table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() | InputEvent.SHIFT_MASK), "none"); - //we're also mapping ctrl-a to scroll-to-top, unmap from the table - table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_A, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "none"); - - searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("F2"), "none"); - searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, InputEvent.SHIFT_MASK), "none"); - searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "none"); - searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() | InputEvent.SHIFT_MASK), "none"); + //we're also mapping ctrl-a to scroll-to-top, unmap from the table + table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_A, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "none"); - //we're also mapping ctrl-a to scroll-to-top, unmap from the table - searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_A, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "none"); + searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("F2"), "none"); + searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, InputEvent.SHIFT_MASK), "none"); + searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "none"); + searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() | InputEvent.SHIFT_MASK), "none"); - //add a listener to update the 'refine focus' - tableModel.addNewKeyListener(e -> columnNameKeywordMap.put(e.getKey(), "PROP." + e.getKey())); + //we're also mapping ctrl-a to scroll-to-top, unmap from the table + searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_A, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "none"); - /* - * Set the Display rule to use the mediator, the model will add itself as - * a property change listener and update itself when the rule changes. - */ - tableModel.setRuleMediator(tableRuleMediator); - searchModel.setRuleMediator(searchRuleMediator); + //add a listener to update the 'refine focus' + tableModel.addNewKeyListener(e -> columnNameKeywordMap.put(e.getKey(), "PROP." + e.getKey())); + + /* + * Set the Display rule to use the mediator, the model will add itself as + * a property change listener and update itself when the rule changes. + */ + tableModel.setRuleMediator(tableRuleMediator); + searchModel.setRuleMediator(searchRuleMediator); - tableModel.addEventCountListener( + tableModel.addEventCountListener( (currentCount, totalCount) -> { - if (LogPanel.this.isVisible()) { - statusBar.setSelectedLine( - table.getSelectedRow() + 1, currentCount, totalCount, getIdentifier()); - } + if (LogPanel.this.isVisible()) { + statusBar.setSelectedLine( + table.getSelectedRow() + 1, currentCount, totalCount, getIdentifier()); + } }); - tableModel.addEventCountListener( - new EventCountListener() { - final NumberFormat formatter = NumberFormat.getPercentInstance(); - boolean warning75 = false; - boolean warning100 = false; - - public void eventCountChanged(int currentCount, int totalCount) { - if (preferenceModel.isCyclic()) { - double percent = - ((double) totalCount) / tableModel.getMaxSize(); - String msg; - boolean wasWarning = warning75 || warning100; - if ((percent > 0.75) && (percent < 1.0) && !warning75) { - msg = - "Warning :: " + formatter.format(percent) + " of the '" - + getIdentifier() + "' buffer has been used"; - warning75 = true; - } else if ((percent >= 1.0) && !warning100) { - msg = - "Warning :: " + formatter.format(percent) + " of the '" - + getIdentifier() - + "' buffer has been used. Older events are being discarded."; - warning100 = true; - } else { - //clear msg - msg = ""; - warning75 = false; - warning100 = false; - } + tableModel.addEventCountListener( + new EventCountListener() { + final NumberFormat formatter = NumberFormat.getPercentInstance(); + boolean warning75 = false; + boolean warning100 = false; + + public void eventCountChanged(int currentCount, int totalCount) { + if (preferenceModel.isCyclic()) { + double percent = + ((double) totalCount) / tableModel.getMaxSize(); + String msg; + boolean wasWarning = warning75 || warning100; + if ((percent > 0.75) && (percent < 1.0) && !warning75) { + msg = + "Warning :: " + formatter.format(percent) + " of the '" + + getIdentifier() + "' buffer has been used"; + warning75 = true; + } else if ((percent >= 1.0) && !warning100) { + msg = + "Warning :: " + formatter.format(percent) + " of the '" + + getIdentifier() + + "' buffer has been used. Older events are being discarded."; + warning100 = true; + } else { + //clear msg + msg = ""; + warning75 = false; + warning100 = false; + } + + if (msg != null && wasWarning) { + MessageCenter.getInstance().getLogger().info(msg); + } + } + } + }); - if (msg != null && wasWarning) { - MessageCenter.getInstance().getLogger().info(msg); + /* + * Logger tree panel + * + */ + LogPanelLoggerTreeModel logTreeModel = new LogPanelLoggerTreeModel(); + logTreePanel = new LoggerNameTreePanel(logTreeModel, preferenceModel, this, colorizer, filterModel); + logTreePanel.getLoggerVisibilityRule().addPropertyChangeListener(evt -> { + if (evt.getPropertyName().equals("searchExpression")) { + findCombo.setSelectedItem(evt.getNewValue().toString()); + findNext(); } - } - } - }); + }); - /* - * Logger tree panel - * - */ - LogPanelLoggerTreeModel logTreeModel = new LogPanelLoggerTreeModel(); - logTreePanel = new LoggerNameTreePanel(logTreeModel, preferenceModel, this, colorizer, filterModel); - logTreePanel.getLoggerVisibilityRule().addPropertyChangeListener(evt -> { - if (evt.getPropertyName().equals("searchExpression")) { - findCombo.setSelectedItem(evt.getNewValue().toString()); - findNext(); - } - }); - - tableModel.addLoggerNameListener(logTreeModel); - tableModel.addLoggerNameListener(logTreePanel); + tableModel.addLoggerNameListener(logTreeModel); + tableModel.addLoggerNameListener(logTreePanel); - /** - * Set the LoggerRule to be the LoggerTreePanel, as this visual component - * is a rule itself, and the RuleMediator will automatically listen when - * it's rule state changes. - */ - tableRuleMediator.setLoggerRule(logTreePanel.getLoggerVisibilityRule()); - searchRuleMediator.setLoggerRule(logTreePanel.getLoggerVisibilityRule()); + /** + * Set the LoggerRule to be the LoggerTreePanel, as this visual component + * is a rule itself, and the RuleMediator will automatically listen when + * it's rule state changes. + */ + tableRuleMediator.setLoggerRule(logTreePanel.getLoggerVisibilityRule()); + searchRuleMediator.setLoggerRule(logTreePanel.getLoggerVisibilityRule()); - colorizer.setLoggerRule(logTreePanel.getLoggerColorRule()); + colorizer.setLoggerRule(logTreePanel.getLoggerColorRule()); - /* - * Color rule frame and panel - */ - colorFrame.setTitle("'" + identifier + "' color settings"); - colorFrame.setIconImage( - ((ImageIcon) ChainsawIcons.ICON_PREFERENCES).getImage()); + /* + * Color rule frame and panel + */ + colorFrame.setTitle("'" + identifier + "' color settings"); + colorFrame.setIconImage( + ((ImageIcon) ChainsawIcons.ICON_PREFERENCES).getImage()); - allColorizers.put(identifier, colorizer); - colorPanel = new ColorPanel(colorizer, filterModel, allColorizers, applicationPreferenceModel); + allColorizers.put(identifier, colorizer); + colorPanel = new ColorPanel(colorizer, filterModel, allColorizers, applicationPreferenceModel); - colorFrame.getContentPane().add(colorPanel); + colorFrame.getContentPane().add(colorPanel); Action closeColorPanelAction = new AbstractAction() { public void actionPerformed(ActionEvent e) { - colorPanel.hidePanel(); + colorPanel.hidePanel(); } }; - colorFrame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(escape, "ESCAPE"); colorFrame.getRootPane(). - getActionMap().put("ESCAPE", closeColorPanelAction); + colorFrame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(escape, "ESCAPE"); + colorFrame.getRootPane(). + getActionMap().put("ESCAPE", closeColorPanelAction); - colorPanel.setCloseActionListener( + colorPanel.setCloseActionListener( e -> colorFrame.setVisible(false)); - colorizer.addPropertyChangeListener( - "colorrule", - new PropertyChangeListener() { - public void propertyChange(PropertyChangeEvent evt) { - for (Object o : tableModel.getAllEvents()) { - LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper) o; - loggingEventWrapper.updateColorRuleColors(colorizer.getBackgroundColor(loggingEventWrapper.getLoggingEvent()), colorizer.getForegroundColor(loggingEventWrapper.getLoggingEvent())); - } + colorizer.addPropertyChangeListener( + "colorrule", + new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + for (Object o : tableModel.getAllEvents()) { + LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper) o; + loggingEventWrapper.updateColorRuleColors(colorizer.getBackgroundColor(loggingEventWrapper.getLoggingEvent()), colorizer.getForegroundColor(loggingEventWrapper.getLoggingEvent())); + } // no need to update searchmodel events since tablemodel and searchmodel share all events, and color rules aren't different between the two // if that changes, un-do the color syncing in loggingeventwrapper & re-enable this code // @@ -791,2369 +701,2365 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi // LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper)iter.next(); // loggingEventWrapper.updateColorRuleColors(colorizer.getBackgroundColor(loggingEventWrapper.getLoggingEvent()), colorizer.getForegroundColor(loggingEventWrapper.getLoggingEvent())); // } - colorizedEventAndSearchMatchThumbnail.configureColors(); - lowerPanel.revalidate(); - lowerPanel.repaint(); - - searchTable.revalidate(); - searchTable.repaint(); - } - }); + colorizedEventAndSearchMatchThumbnail.configureColors(); + lowerPanel.revalidate(); + lowerPanel.repaint(); - /* - * Table definition. Actual construction is above (next to tablemodel) - */ - table.setRowHeight(ChainsawConstants.DEFAULT_ROW_HEIGHT); - table.setRowMargin(0); - table.getColumnModel().setColumnMargin(0); - table.setShowGrid(false); - table.getColumnModel().addColumnModelListener(new ChainsawTableColumnModelListener(table)); - table.setAutoCreateColumnsFromModel(false); - table.addMouseMotionListener(new TableColumnDetailMouseListener(table, tableModel)); - table.addMouseListener(new TableMarkerListener(table, tableModel, searchModel)); - table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); - - searchTable.setRowHeight(ChainsawConstants.DEFAULT_ROW_HEIGHT); - searchTable.setRowMargin(0); - searchTable.getColumnModel().setColumnMargin(0); - searchTable.setShowGrid(false); - searchTable.getColumnModel().addColumnModelListener(new ChainsawTableColumnModelListener(searchTable)); - searchTable.setAutoCreateColumnsFromModel(false); - searchTable.addMouseMotionListener(new TableColumnDetailMouseListener(searchTable, searchModel)); - searchTable.addMouseListener(new TableMarkerListener(searchTable, searchModel, tableModel)); - searchTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); - - - //set valueisadjusting if holding down a key - don't process setdetail events - table.addKeyListener( - new KeyListener() { - public void keyTyped(KeyEvent e) { - } - - public void keyPressed(KeyEvent e) { - synchronized (detail) { - table.getSelectionModel().setValueIsAdjusting(true); - detail.notify(); - } - } - - public void keyReleased(KeyEvent e) { - synchronized (detail) { - table.getSelectionModel().setValueIsAdjusting(false); - detail.notify(); - } - } - }); - - table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - searchTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - - table.getSelectionModel().addListSelectionListener(evt -> { - if (((evt.getFirstIndex() == evt.getLastIndex()) - && (evt.getFirstIndex() > 0) && previousLastIndex != -1) || (evt.getValueIsAdjusting())) { - return; - } - boolean lastIndexOnLastRow = (evt.getLastIndex() == (table.getRowCount() - 1)); - boolean lastIndexSame = (previousLastIndex == evt.getLastIndex()); + searchTable.revalidate(); + searchTable.repaint(); + } + }); /* - * when scroll-to-bottom is active, here is what events look like: - * rowcount-1: 227, last: 227, previous last: 191..first: 191 - * - * when the user has unselected the bottom row, here is what the events look like: - * rowcount-1: 227, last: 227, previous last: 227..first: 222 - * - * note: previouslast is set after it is evaluated in the bypass scroll check - */ - //System.out.println("rowcount: " + (table.getRowCount() - 1) + ", last: " + evt.getLastIndex() +", previous last: " + previousLastIndex + "..first: " + evt.getFirstIndex() + ", isadjusting: " + evt.getValueIsAdjusting()); + * Table definition. Actual construction is above (next to tablemodel) + */ + table.setRowHeight(ChainsawConstants.DEFAULT_ROW_HEIGHT); + table.setRowMargin(0); + table.getColumnModel().setColumnMargin(0); + table.setShowGrid(false); + table.getColumnModel().addColumnModelListener(new ChainsawTableColumnModelListener(table)); + table.setAutoCreateColumnsFromModel(false); + table.addMouseMotionListener(new TableColumnDetailMouseListener(table, tableModel)); + table.addMouseListener(new TableMarkerListener(table, tableModel, searchModel)); + table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + + searchTable.setRowHeight(ChainsawConstants.DEFAULT_ROW_HEIGHT); + searchTable.setRowMargin(0); + searchTable.getColumnModel().setColumnMargin(0); + searchTable.setShowGrid(false); + searchTable.getColumnModel().addColumnModelListener(new ChainsawTableColumnModelListener(searchTable)); + searchTable.setAutoCreateColumnsFromModel(false); + searchTable.addMouseMotionListener(new TableColumnDetailMouseListener(searchTable, searchModel)); + searchTable.addMouseListener(new TableMarkerListener(searchTable, searchModel, tableModel)); + searchTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + + + //set valueisadjusting if holding down a key - don't process setdetail events + table.addKeyListener( + new KeyListener() { + public void keyTyped(KeyEvent e) { + } - boolean disableScrollToBottom = (lastIndexOnLastRow && lastIndexSame && previousLastIndex != evt.getFirstIndex()); - if (disableScrollToBottom && isScrollToBottom() && table.getRowCount() > 0) { - preferenceModel.setScrollToBottom(false); - } - previousLastIndex = evt.getLastIndex(); - } - ); - - table.getSelectionModel().addListSelectionListener( - new ListSelectionListener() { - public void valueChanged(ListSelectionEvent evt) { - if (((evt.getFirstIndex() == evt.getLastIndex()) - && (evt.getFirstIndex() > 0) && previousLastIndex != -1) || (evt.getValueIsAdjusting())) { - return; - } + public void keyPressed(KeyEvent e) { + synchronized (detail) { + table.getSelectionModel().setValueIsAdjusting(true); + detail.notify(); + } + } - final ListSelectionModel lsm = (ListSelectionModel) evt.getSource(); + public void keyReleased(KeyEvent e) { + synchronized (detail) { + table.getSelectionModel().setValueIsAdjusting(false); + detail.notify(); + } + } + }); - if (lsm.isSelectionEmpty()) { - if (isVisible()) { - statusBar.setNothingSelected(); - } + table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + searchTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - if (detail.getDocument().getDefaultRootElement() != null) { - detailPaneUpdater.setSelectedRow(-1); + table.getSelectionModel().addListSelectionListener(evt -> { + if (((evt.getFirstIndex() == evt.getLastIndex()) + && (evt.getFirstIndex() > 0) && previousLastIndex != -1) || (evt.getValueIsAdjusting())) { + return; + } + boolean lastIndexOnLastRow = (evt.getLastIndex() == (table.getRowCount() - 1)); + boolean lastIndexSame = (previousLastIndex == evt.getLastIndex()); + + /* + * when scroll-to-bottom is active, here is what events look like: + * rowcount-1: 227, last: 227, previous last: 191..first: 191 + * + * when the user has unselected the bottom row, here is what the events look like: + * rowcount-1: 227, last: 227, previous last: 227..first: 222 + * + * note: previouslast is set after it is evaluated in the bypass scroll check + */ + //System.out.println("rowcount: " + (table.getRowCount() - 1) + ", last: " + evt.getLastIndex() +", previous last: " + previousLastIndex + "..first: " + evt.getFirstIndex() + ", isadjusting: " + evt.getValueIsAdjusting()); + + boolean disableScrollToBottom = (lastIndexOnLastRow && lastIndexSame && previousLastIndex != evt.getFirstIndex()); + if (disableScrollToBottom && isScrollToBottom() && table.getRowCount() > 0) { + preferenceModel.setScrollToBottom(false); + } + previousLastIndex = evt.getLastIndex(); } - } else { - if (table.getSelectedRow() > -1) { - int selectedRow = table.getSelectedRow(); + ); + + table.getSelectionModel().addListSelectionListener( + new ListSelectionListener() { + public void valueChanged(ListSelectionEvent evt) { + if (((evt.getFirstIndex() == evt.getLastIndex()) + && (evt.getFirstIndex() > 0) && previousLastIndex != -1) || (evt.getValueIsAdjusting())) { + return; + } - if (isVisible()) { - updateStatusBar(); - } + final ListSelectionModel lsm = (ListSelectionModel) evt.getSource(); - try { - if (tableModel.getRowCount() >= selectedRow) { - detailPaneUpdater.setSelectedRow(table.getSelectedRow()); - } else { - detailPaneUpdater.setSelectedRow(-1); + if (lsm.isSelectionEmpty()) { + if (isVisible()) { + statusBar.setNothingSelected(); + } + + if (detail.getDocument().getDefaultRootElement() != null) { + detailPaneUpdater.setSelectedRow(-1); + } + } else { + if (table.getSelectedRow() > -1) { + int selectedRow = table.getSelectedRow(); + + if (isVisible()) { + updateStatusBar(); + } + + try { + if (tableModel.getRowCount() >= selectedRow) { + detailPaneUpdater.setSelectedRow(table.getSelectedRow()); + } else { + detailPaneUpdater.setSelectedRow(-1); + } + } catch (Exception e) { + e.printStackTrace(); + detailPaneUpdater.setSelectedRow(-1); + } + } + } } - } catch (Exception e) { - e.printStackTrace(); - detailPaneUpdater.setSelectedRow(-1); - } - } - } - } - }); + }); - renderer = new TableColorizingRenderer(colorizer, applicationPreferenceModel, tableModel, preferenceModel, true); - renderer.setToolTipsVisible(preferenceModel.isToolTips()); + renderer = new TableColorizingRenderer(colorizer, applicationPreferenceModel, tableModel, preferenceModel, true); + renderer.setToolTipsVisible(preferenceModel.isToolTips()); - table.setDefaultRenderer(Object.class, renderer); + table.setDefaultRenderer(Object.class, renderer); - searchRenderer = new TableColorizingRenderer(colorizer, applicationPreferenceModel, searchModel, preferenceModel, false); - searchRenderer.setToolTipsVisible(preferenceModel.isToolTips()); + searchRenderer = new TableColorizingRenderer(colorizer, applicationPreferenceModel, searchModel, preferenceModel, false); + searchRenderer.setToolTipsVisible(preferenceModel.isToolTips()); - searchTable.setDefaultRenderer(Object.class, searchRenderer); + searchTable.setDefaultRenderer(Object.class, searchRenderer); - /* - * Throwable popup - */ - table.addMouseListener(new ThrowableDisplayMouseAdapter(table, tableModel)); - searchTable.addMouseListener(new ThrowableDisplayMouseAdapter(searchTable, searchModel)); - - //select a row in the main table when a row in the search table is selected - searchTable.addMouseListener(new MouseAdapter() { - public void mouseClicked(MouseEvent e) { - LoggingEventWrapper loggingEventWrapper = searchModel.getRow(searchTable.getSelectedRow()); - if (loggingEventWrapper != null) { - int id = new Integer(loggingEventWrapper.getLoggingEvent().getProperty("log4jid")); - //preserve the table's viewble column - setSelectedEvent(id); - } - } - }); + /* + * Throwable popup + */ + table.addMouseListener(new ThrowableDisplayMouseAdapter(table, tableModel)); + searchTable.addMouseListener(new ThrowableDisplayMouseAdapter(searchTable, searchModel)); - /* - * We listen for new Key's coming in so we can get them automatically - * added as columns - */ - tableModel.addNewKeyListener( + //select a row in the main table when a row in the search table is selected + searchTable.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + LoggingEventWrapper loggingEventWrapper = searchModel.getRow(searchTable.getSelectedRow()); + if (loggingEventWrapper != null) { + int id = new Integer(loggingEventWrapper.getLoggingEvent().getProperty("log4jid")); + //preserve the table's viewble column + setSelectedEvent(id); + } + } + }); + + /* + * We listen for new Key's coming in so we can get them automatically + * added as columns + */ + tableModel.addNewKeyListener( e -> SwingHelper.invokeOnEDT(() -> { // don't add the column if we already know about it, this could be if we've seen it before and saved the column preferences //this may throw an illegalargexception - ignore it because we need to add only if not already added - //if the column is already added, don't add again + //if the column is already added, don't add again - try { - if (table.getColumn(e.getKey()) != null) { - return; - } + try { + if (table.getColumn(e.getKey()) != null) { + return; + } //no need to check search table - we use the same columns - } catch (IllegalArgumentException iae) { - } - TableColumn col = new TableColumn(e.getNewModelIndex()); - col.setHeaderValue(e.getKey()); + } catch (IllegalArgumentException iae) { + } + TableColumn col = new TableColumn(e.getNewModelIndex()); + col.setHeaderValue(e.getKey()); - if (preferenceModel.addColumn(col)) { - if (preferenceModel.isColumnVisible(col) || !applicationPreferenceModel.isDefaultColumnsSet() || applicationPreferenceModel.isDefaultColumnsSet() && + if (preferenceModel.addColumn(col)) { + if (preferenceModel.isColumnVisible(col) || !applicationPreferenceModel.isDefaultColumnsSet() || applicationPreferenceModel.isDefaultColumnsSet() && applicationPreferenceModel.getDefaultColumnNames().contains(col.getHeaderValue())) { - table.addColumn(col); - searchTable.addColumn(col); - preferenceModel.setColumnVisible(e.getKey().toString(), true); + table.addColumn(col); + searchTable.addColumn(col); + preferenceModel.setColumnVisible(e.getKey().toString(), true); + } } - } })); - //if the table is refiltered, try to reselect the last selected row - //refilter with a newValue of TRUE means refiltering is about to begin - //refilter with a newValue of FALSE means refiltering is complete - //assuming notification is called on the EDT so we can in the current EDT call update the scroll & selection - tableModel.addPropertyChangeListener("refilter", new PropertyChangeListener() { - private LoggingEventWrapper currentEvent; - public void propertyChange(PropertyChangeEvent evt) { - //if new value is true, filtering is about to begin - //if new value is false, filtering is complete - if (evt.getNewValue().equals(Boolean.TRUE)) { - int currentRow = table.getSelectedRow(); - if (currentRow > -1) { - currentEvent = tableModel.getRow(currentRow); - } - } else { - if (currentEvent != null) { - table.scrollToRow(tableModel.getRowIndex(currentEvent)); + //if the table is refiltered, try to reselect the last selected row + //refilter with a newValue of TRUE means refiltering is about to begin + //refilter with a newValue of FALSE means refiltering is complete + //assuming notification is called on the EDT so we can in the current EDT call update the scroll & selection + tableModel.addPropertyChangeListener("refilter", new PropertyChangeListener() { + private LoggingEventWrapper currentEvent; + + public void propertyChange(PropertyChangeEvent evt) { + //if new value is true, filtering is about to begin + //if new value is false, filtering is complete + if (evt.getNewValue().equals(Boolean.TRUE)) { + int currentRow = table.getSelectedRow(); + if (currentRow > -1) { + currentEvent = tableModel.getRow(currentRow); + } + } else { + if (currentEvent != null) { + table.scrollToRow(tableModel.getRowIndex(currentEvent)); + } } } - } - }); + }); - table.getTableHeader().addMouseListener( - new MouseAdapter() { - public void mouseClicked(MouseEvent e) { - checkEvent(e); - } + table.getTableHeader().addMouseListener( + new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + checkEvent(e); + } - public void mousePressed(MouseEvent e) { - checkEvent(e); - } + public void mousePressed(MouseEvent e) { + checkEvent(e); + } - public void mouseReleased(MouseEvent e) { - checkEvent(e); - } + public void mouseReleased(MouseEvent e) { + checkEvent(e); + } - private void checkEvent(MouseEvent e) { - if (e.isPopupTrigger()) { - TableColumnModel colModel = table.getColumnModel(); - int index = colModel.getColumnIndexAtX(e.getX()); - int modelIndex = colModel.getColumn(index).getModelIndex(); + private void checkEvent(MouseEvent e) { + if (e.isPopupTrigger()) { + TableColumnModel colModel = table.getColumnModel(); + int index = colModel.getColumnIndexAtX(e.getX()); + int modelIndex = colModel.getColumn(index).getModelIndex(); - if ((modelIndex + 1) == ChainsawColumns.INDEX_TIMESTAMP_COL_NAME) { - dateFormatChangePopup.show(e.getComponent(), e.getX(), e.getY()); - } - } - } - }); + if ((modelIndex + 1) == ChainsawColumns.INDEX_TIMESTAMP_COL_NAME) { + dateFormatChangePopup.show(e.getComponent(), e.getX(), e.getY()); + } + } + } + }); - /* - * Upper panel definition - */ - JPanel upperPanel = new JPanel(); - upperPanel.setLayout(new BoxLayout(upperPanel, BoxLayout.X_AXIS)); - upperPanel.setBorder(BorderFactory.createEmptyBorder(2, 5, 2, 0)); + /* + * Upper panel definition + */ + JPanel upperPanel = new JPanel(); + upperPanel.setLayout(new BoxLayout(upperPanel, BoxLayout.X_AXIS)); + upperPanel.setBorder(BorderFactory.createEmptyBorder(2, 5, 2, 0)); - final JLabel filterLabel = new JLabel("Refine focus on: "); - filterLabel.setFont(filterLabel.getFont().deriveFont(Font.BOLD)); + final JLabel filterLabel = new JLabel("Refine focus on: "); + filterLabel.setFont(filterLabel.getFont().deriveFont(Font.BOLD)); - upperPanel.add(filterLabel); - upperPanel.add(Box.createHorizontalStrut(3)); - upperPanel.add(filterCombo); - upperPanel.add(Box.createHorizontalStrut(3)); + upperPanel.add(filterLabel); + upperPanel.add(Box.createHorizontalStrut(3)); + upperPanel.add(filterCombo); + upperPanel.add(Box.createHorizontalStrut(3)); - final JTextField filterText =(JTextField) filterCombo.getEditor().getEditorComponent(); - final JTextField findText =(JTextField) findCombo.getEditor().getEditorComponent(); + final JTextField filterText = (JTextField) filterCombo.getEditor().getEditorComponent(); + final JTextField findText = (JTextField) findCombo.getEditor().getEditorComponent(); - //Adding a button to clear filter expressions which are currently remembered by Chainsaw... - final JButton removeFilterButton = new JButton(" Remove "); + //Adding a button to clear filter expressions which are currently remembered by Chainsaw... + final JButton removeFilterButton = new JButton(" Remove "); - removeFilterButton.setToolTipText("Click here to remove the selected expression from the list"); - removeFilterButton.addActionListener( + removeFilterButton.setToolTipText("Click here to remove the selected expression from the list"); + removeFilterButton.addActionListener( new AbstractAction() { - public void actionPerformed(ActionEvent e){ - Object selectedItem = filterCombo.getSelectedItem(); - if (e.getSource() == removeFilterButton && selectedItem != null && !selectedItem.toString().trim().equals("")){ - //don't just remove the entry from the store, clear the field - int index = filterCombo.getSelectedIndex(); - filterText.setText(null); - filterCombo.setSelectedIndex(-1); - filterCombo.removeItemAt(index); - if (!(findCombo.getSelectedItem() != null && findCombo.getSelectedItem().equals(selectedItem))) { - //now remove the entry from the other model - ((AutoFilterComboBox.AutoFilterComboBoxModel)findCombo.getModel()).removeElement(selectedItem); - } + public void actionPerformed(ActionEvent e) { + Object selectedItem = filterCombo.getSelectedItem(); + if (e.getSource() == removeFilterButton && selectedItem != null && !selectedItem.toString().trim().equals("")) { + //don't just remove the entry from the store, clear the field + int index = filterCombo.getSelectedIndex(); + filterText.setText(null); + filterCombo.setSelectedIndex(-1); + filterCombo.removeItemAt(index); + if (!(findCombo.getSelectedItem() != null && findCombo.getSelectedItem().equals(selectedItem))) { + //now remove the entry from the other model + ((AutoFilterComboBox.AutoFilterComboBoxModel) findCombo.getModel()).removeElement(selectedItem); + } } } } - ); - upperPanel.add(removeFilterButton); - //add some space between refine focus and search sections of the panel - upperPanel.add(Box.createHorizontalStrut(25)); - - final JLabel findLabel = new JLabel("Find: "); - findLabel.setFont(filterLabel.getFont().deriveFont(Font.BOLD)); - - upperPanel.add(findLabel); - upperPanel.add(Box.createHorizontalStrut(3)); - - upperPanel.add(findCombo); - upperPanel.add(Box.createHorizontalStrut(3)); - - Action findNextAction = getFindNextAction(); - Action findPreviousAction = getFindPreviousAction(); - //add up & down search - 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)); - - JButton findPreviousButton = new SmallButton(findPreviousAction); - findPreviousButton.setText(""); - findPreviousButton.getActionMap().put( - findPreviousAction.getValue(Action.NAME), findPreviousAction); - findPreviousButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( - (KeyStroke) findPreviousAction.getValue(Action.ACCELERATOR_KEY), - findPreviousAction.getValue(Action.NAME)); - - upperPanel.add(findNextButton); - - upperPanel.add(findPreviousButton); - upperPanel.add(Box.createHorizontalStrut(3)); - - //Adding a button to clear filter expressions which are currently remembered by Chainsaw... - final JButton removeFindButton = new JButton(" Remove "); - removeFindButton.setToolTipText("Click here to remove the selected expression from the list"); - removeFindButton.addActionListener( + ); + upperPanel.add(removeFilterButton); + //add some space between refine focus and search sections of the panel + upperPanel.add(Box.createHorizontalStrut(25)); + + final JLabel findLabel = new JLabel("Find: "); + findLabel.setFont(filterLabel.getFont().deriveFont(Font.BOLD)); + + upperPanel.add(findLabel); + upperPanel.add(Box.createHorizontalStrut(3)); + + upperPanel.add(findCombo); + upperPanel.add(Box.createHorizontalStrut(3)); + + Action findNextAction = getFindNextAction(); + Action findPreviousAction = getFindPreviousAction(); + //add up & down search + 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)); + + JButton findPreviousButton = new SmallButton(findPreviousAction); + findPreviousButton.setText(""); + findPreviousButton.getActionMap().put( + findPreviousAction.getValue(Action.NAME), findPreviousAction); + findPreviousButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( + (KeyStroke) findPreviousAction.getValue(Action.ACCELERATOR_KEY), + findPreviousAction.getValue(Action.NAME)); + + upperPanel.add(findNextButton); + + upperPanel.add(findPreviousButton); + upperPanel.add(Box.createHorizontalStrut(3)); + + //Adding a button to clear filter expressions which are currently remembered by Chainsaw... + final JButton removeFindButton = new JButton(" Remove "); + removeFindButton.setToolTipText("Click here to remove the selected expression from the list"); + removeFindButton.addActionListener( new AbstractAction() { - public void actionPerformed(ActionEvent e){ - Object selectedItem = findCombo.getSelectedItem(); - if (e.getSource() == removeFindButton && selectedItem != null && !selectedItem.toString().trim().equals("")){ - //don't just remove the entry from the store, clear the field - int index = findCombo.getSelectedIndex(); - findText.setText(null); -
<TRUNCATED>