/* * Lilith - a log event viewer. * Copyright (C) 2007-2017 Joern Huxhorn * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package de.huxhorn.lilith.swing; import de.huxhorn.lilith.appender.InternalLilithAppender; import de.huxhorn.lilith.conditions.CallLocationCondition; import de.huxhorn.lilith.data.access.AccessEvent; import de.huxhorn.lilith.data.eventsource.EventWrapper; import de.huxhorn.lilith.data.eventsource.LoggerContext; import de.huxhorn.lilith.data.eventsource.SourceIdentifier; import de.huxhorn.lilith.data.logging.ExtendedStackTraceElement; import de.huxhorn.lilith.data.logging.LoggingEvent; import de.huxhorn.lilith.engine.EventSource; import de.huxhorn.lilith.services.clipboard.AccessRequestHeadersFormatter; import de.huxhorn.lilith.services.clipboard.AccessRequestParametersFormatter; import de.huxhorn.lilith.services.clipboard.AccessRequestUriFormatter; import de.huxhorn.lilith.services.clipboard.AccessRequestUrlFormatter; import de.huxhorn.lilith.services.clipboard.AccessResponseHeadersFormatter; import de.huxhorn.lilith.services.clipboard.ClipboardFormatter; import de.huxhorn.lilith.services.clipboard.ClipboardFormatterData; import de.huxhorn.lilith.services.clipboard.EventHtmlFormatter; import de.huxhorn.lilith.services.clipboard.GroovyFormatter; import de.huxhorn.lilith.services.clipboard.LoggingCallLocationFormatter; import de.huxhorn.lilith.services.clipboard.LoggingCallStackFormatter; import de.huxhorn.lilith.services.clipboard.LoggingEventJsonFormatter; import de.huxhorn.lilith.services.clipboard.LoggingEventXmlFormatter; import de.huxhorn.lilith.services.clipboard.LoggingLoggerNameFormatter; import de.huxhorn.lilith.services.clipboard.LoggingMarkerFormatter; import de.huxhorn.lilith.services.clipboard.LoggingMdcFormatter; import de.huxhorn.lilith.services.clipboard.LoggingMessageFormatter; import de.huxhorn.lilith.services.clipboard.LoggingMessagePatternFormatter; import de.huxhorn.lilith.services.clipboard.LoggingNdcFormatter; import de.huxhorn.lilith.services.clipboard.LoggingThreadGroupNameFormatter; import de.huxhorn.lilith.services.clipboard.LoggingThreadNameFormatter; import de.huxhorn.lilith.services.clipboard.LoggingThrowableFormatter; import de.huxhorn.lilith.services.clipboard.LoggingThrowableNameFormatter; import de.huxhorn.lilith.swing.actions.ActionTooltips; import de.huxhorn.lilith.swing.menu.ExcludeMenu; import de.huxhorn.lilith.swing.menu.FocusMenu; import de.huxhorn.lilith.swing.table.EventWrapperViewTable; import de.huxhorn.sulky.buffers.Buffer; import de.huxhorn.sulky.conditions.Condition; import de.huxhorn.sulky.swing.KeyStrokes; import de.huxhorn.sulky.swing.PersistentTableColumnModel; import java.awt.AWTError; import java.awt.Container; import java.awt.EventQueue; import java.awt.Font; import java.awt.HeadlessException; import java.awt.KeyEventDispatcher; import java.awt.KeyboardFocusManager; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.beans.PropertyChangeListener; import java.io.BufferedReader; import java.io.File; import java.io.Serializable; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeSet; import java.util.stream.Collectors; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JCheckBoxMenuItem; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JToggleButton; import javax.swing.JToolBar; import javax.swing.KeyStroke; import javax.swing.SwingConstants; import javax.swing.event.ChangeListener; import javax.swing.table.TableColumn; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This class needs cleanup...... remove duplicated logic, make ToolBar/Menu configurable... */ public class ViewActions { private final Logger logger = LoggerFactory.getLogger(ViewActions.class); /** * Taken over from Action.SELECTED_KEY for 1.5 compatibility. * Does not work with 1.5 :( I was really sure that there was some selected event... */ //private static final String SELECTED_KEY = "SwingSelectedKey"; private static final char ALT_SYMBOL = '\u2325'; private static final char COMMAND_SYMBOL = '\u2318'; static { final Logger logger = LoggerFactory.getLogger(ViewActions.class); JMenuItem item = new JMenuItem(); Font font = item.getFont(); if(logger.isDebugEnabled()) logger.debug("Can display '{}': {}", ALT_SYMBOL, font.canDisplay(ALT_SYMBOL)); if(logger.isDebugEnabled()) logger.debug("Can display '{}': {}", COMMAND_SYMBOL, font.canDisplay(COMMAND_SYMBOL)); KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); manager.addKeyEventDispatcher(new EggListener()); } private JToolBar toolbar; private JMenuBar menubar; private final MainFrame mainFrame; private final ApplicationPreferences applicationPreferences; private ViewContainer viewContainer; private JToggleButton tailButton; private ExportMenuAction exportMenuAction; private AttachAction attachToolBarAction; private AttachAction attachMenuAction; private DisconnectAction disconnectToolBarAction; private DisconnectAction disconnectMenuAction; private PauseAction pauseToolBarAction; private PauseAction pauseMenuAction; private FindPreviousAction findPreviousToolBarAction; private FindPreviousAction findPreviousMenuAction; private FindNextAction findNextToolBarAction; private FindNextAction findNextMenuAction; private FindPreviousActiveAction findPreviousActiveAction; private FindNextActiveAction findNextActiveAction; private ResetFindAction resetFindAction; private TailAction tailMenuAction; private EditSourceNameMenuAction editSourceNameMenuAction; private SaveLayoutAction saveLayoutAction; private ResetLayoutAction resetLayoutAction; private SaveConditionMenuAction saveConditionMenuAction; private ZoomInMenuAction zoomInMenuAction; private ZoomOutMenuAction zoomOutMenuAction; private ResetZoomMenuAction resetZoomMenuAction; private NextViewAction nextViewAction; private PreviousViewAction previousViewAction; private CloseFilterAction closeFilterAction; private CloseOtherFiltersAction closeOtherFiltersAction; private CloseAllFiltersAction closeAllFiltersAction; private RemoveInactiveAction removeInactiveAction; private CloseAllAction closeAllAction; private CloseOtherAction closeOtherAction; private MinimizeAllAction minimizeAllAction; private MinimizeAllOtherAction minimizeAllOtherAction; private JMenuItem removeInactiveItem; private JMenu windowMenu; private FindAction findMenuAction; private JMenu searchMenu; private JMenu viewMenu; private JMenu columnsMenu; private ClearAction clearMenuAction; private FocusMessageAction focusMessageAction; private FocusEventsAction focusEventsAction; private ChangeListener containerChangeListener; private TailAction tailToolBarAction; private ClearAction clearToolBarAction; private FindAction findToolBarAction; private CopySelectionAction copySelectionAction; private CopyToClipboardAction copyEventAction; private ShowUnfilteredEventAction showUnfilteredEventAction; private JPopupMenu popup; private GoToSourceAction goToSourceAction; private FocusMenu focusMenu; private ExcludeMenu excludeMenu; private FocusMenu focusPopupMenu; private ExcludeMenu excludePopupMenu; private JMenu filterPopupMenu; private JMenu copyPopupMenu; private PropertyChangeListener containerPropertyChangeListener; private EventWrapper eventWrapper; private JMenuItem showTaskManagerItem; private JMenuItem closeAllItem; private JMenuItem minimizeAllItem; private JMenuItem closeAllOtherItem; private JMenuItem minimizeAllOtherItem; private JMenu recentFilesMenu; private ClearRecentFilesAction clearRecentFilesAction; private JMenu customCopyMenu; private JMenu customCopyPopupMenu; private Map<String, CopyToClipboardAction> groovyClipboardActions; private Map<String, ClipboardFormatterData> groovyClipboardData; private List<CopyToClipboardAction> copyLoggingActions; private List<CopyToClipboardAction> copyAccessActions; private Map<KeyStroke, CopyToClipboardAction> keyStrokeActionMapping; private boolean initialized = false; public ViewActions(MainFrame mainFrame, ViewContainer viewContainer) { this.mainFrame = Objects.requireNonNull(mainFrame, "mainFrame must not be null!"); this.applicationPreferences = mainFrame.getApplicationPreferences(); // usingScreenMenuBar is used to determine whether HTML tooltips in menu are supported or not // swing supports HTML tooltip, native macOS menu bar isn't. final boolean usingScreenMenuBar = applicationPreferences.isUsingScreenMenuBar(); containerChangeListener = e -> updateActions(); containerPropertyChangeListener = evt -> { if(ViewContainer.SELECTED_EVENT_PROPERTY_NAME.equals(evt.getPropertyName())) { setEventWrapper((EventWrapper) evt.getNewValue()); } }; keyStrokeActionMapping = new HashMap<>(); // ##### Menu Actions ##### // File OpenMenuAction openMenuAction = new OpenMenuAction(); clearRecentFilesAction=new ClearRecentFilesAction(); OpenInactiveLogMenuAction openInactiveLogMenuAction = new OpenInactiveLogMenuAction(); ImportMenuAction importMenuAction = new ImportMenuAction(); exportMenuAction = new ExportMenuAction(); CleanAllInactiveLogsMenuAction cleanAllInactiveLogsMenuAction = new CleanAllInactiveLogsMenuAction(); PreferencesAction preferencesMenuAction = new PreferencesAction(false); ExitMenuAction exitMenuAction = new ExitMenuAction(); // Edit showUnfilteredEventAction = new ShowUnfilteredEventAction(); goToSourceAction = new GoToSourceAction(); copySelectionAction = new CopySelectionAction(); copyEventAction = new CopyToClipboardAction(new EventHtmlFormatter(mainFrame)); copyLoggingActions = new ArrayList<>(); copyLoggingActions.add(new CopyToClipboardAction(new LoggingEventJsonFormatter())); copyLoggingActions.add(new CopyToClipboardAction(new LoggingEventXmlFormatter())); copyLoggingActions.add(new CopyToClipboardAction(new LoggingMessageFormatter())); copyLoggingActions.add(new CopyToClipboardAction(new LoggingMessagePatternFormatter())); copyLoggingActions.add(new CopyToClipboardAction(new LoggingLoggerNameFormatter())); copyLoggingActions.add(new CopyToClipboardAction(new LoggingThrowableFormatter())); copyLoggingActions.add(new CopyToClipboardAction(new LoggingThrowableNameFormatter())); copyLoggingActions.add(new CopyToClipboardAction(new LoggingCallLocationFormatter())); copyLoggingActions.add(new CopyToClipboardAction(new LoggingCallStackFormatter())); copyLoggingActions.add(new CopyToClipboardAction(new LoggingThreadNameFormatter())); copyLoggingActions.add(new CopyToClipboardAction(new LoggingThreadGroupNameFormatter())); copyLoggingActions.add(new CopyToClipboardAction(new LoggingMarkerFormatter())); copyLoggingActions.add(new CopyToClipboardAction(new LoggingMdcFormatter())); copyLoggingActions.add(new CopyToClipboardAction(new LoggingNdcFormatter())); copyAccessActions = new ArrayList<>(); copyAccessActions.add(new CopyToClipboardAction(new AccessRequestUriFormatter())); copyAccessActions.add(new CopyToClipboardAction(new AccessRequestUrlFormatter())); copyAccessActions.add(new CopyToClipboardAction(new AccessRequestHeadersFormatter())); copyAccessActions.add(new CopyToClipboardAction(new AccessRequestParametersFormatter())); copyAccessActions.add(new CopyToClipboardAction(new AccessResponseHeadersFormatter())); prepareClipboardActions(copyLoggingActions, keyStrokeActionMapping); prepareClipboardActions(copyAccessActions, keyStrokeActionMapping); // Search findMenuAction = new FindAction(false); findPreviousMenuAction = new FindPreviousAction(false); findNextMenuAction = new FindNextAction(false); findPreviousActiveAction = new FindPreviousActiveAction(false); findNextActiveAction = new FindNextActiveAction(false); resetFindAction = new ResetFindAction(); // View tailMenuAction = new TailAction(false); pauseMenuAction = new PauseAction(false); clearMenuAction = new ClearAction(false); attachMenuAction = new AttachAction(false); disconnectMenuAction = new DisconnectAction(false); focusMessageAction = new FocusMessageAction(); focusEventsAction = new FocusEventsAction(); editSourceNameMenuAction = new EditSourceNameMenuAction(); saveLayoutAction = new SaveLayoutAction(); resetLayoutAction = new ResetLayoutAction(); saveConditionMenuAction = new SaveConditionMenuAction(!usingScreenMenuBar); zoomInMenuAction = new ZoomInMenuAction(); zoomOutMenuAction = new ZoomOutMenuAction(); resetZoomMenuAction = new ResetZoomMenuAction(); previousViewAction = new PreviousViewAction(); nextViewAction = new NextViewAction(); closeFilterAction = new CloseFilterAction(); closeOtherFiltersAction = new CloseOtherFiltersAction(); closeAllFiltersAction = new CloseAllFiltersAction(); // Window ShowTaskManagerAction showTaskManagerAction = new ShowTaskManagerAction(); closeAllAction = new CloseAllAction(); closeOtherAction = new CloseOtherAction(); minimizeAllAction = new MinimizeAllAction(); minimizeAllOtherAction = new MinimizeAllOtherAction(); removeInactiveAction = new RemoveInactiveAction(); //clearAndRemoveInactiveAction=new ClearAndRemoveInactiveAction(); // Help HelpTopicsAction helpTopicsAction = new HelpTopicsAction(); ShowLoveAction showLoveMenuAction = new ShowLoveAction(false); TipOfTheDayAction tipOfTheDayAction = new TipOfTheDayAction(); DebugAction debugAction = new DebugAction(); AboutAction aboutAction = new AboutAction(); CheckForUpdateAction checkForUpdateAction = new CheckForUpdateAction(); TroubleshootingAction troubleshootingAction = new TroubleshootingAction(); // ##### ToolBar Actions ##### tailToolBarAction = new TailAction(true); pauseToolBarAction = new PauseAction(true); clearToolBarAction = new ClearAction(true); disconnectToolBarAction = new DisconnectAction(true); findToolBarAction = new FindAction(true); findPreviousToolBarAction = new FindPreviousAction(true); findNextToolBarAction = new FindNextAction(true); attachToolBarAction = new AttachAction(true); PreferencesAction preferencesToolBarAction = new PreferencesAction(true); ShowLoveAction showLoveToolbarAction = new ShowLoveAction(true); showTaskManagerItem = new JMenuItem(showTaskManagerAction); closeAllItem = new JMenuItem(closeAllAction); closeAllOtherItem = new JMenuItem(closeOtherAction); minimizeAllItem = new JMenuItem(minimizeAllAction); minimizeAllOtherItem = new JMenuItem(minimizeAllOtherAction); removeInactiveItem = new JMenuItem(removeInactiveAction); toolbar = new JToolBar(SwingConstants.HORIZONTAL); toolbar.setFloatable(false); tailButton = new JToggleButton(tailToolBarAction); toolbar.add(tailButton); toolbar.add(new JButton(pauseToolBarAction)); toolbar.add(new JButton(clearToolBarAction)); toolbar.add(new JButton(disconnectToolBarAction)); toolbar.addSeparator(); toolbar.add(new JButton(findToolBarAction)); toolbar.add(new JButton(findPreviousToolBarAction)); toolbar.add(new JButton(findNextToolBarAction)); toolbar.addSeparator(); toolbar.add(new JButton(attachToolBarAction)); toolbar.addSeparator(); toolbar.add(new JButton(preferencesToolBarAction)); toolbar.addSeparator(); toolbar.add(new JButton(showLoveToolbarAction)); recentFilesMenu=new JMenu(new RecentFilesAction()); menubar = new JMenuBar(); // File JMenu fileMenu = new JMenu(new FileAction()); fileMenu.add(openMenuAction); fileMenu.add(recentFilesMenu); fileMenu.add(openInactiveLogMenuAction); fileMenu.add(cleanAllInactiveLogsMenuAction); fileMenu.add(importMenuAction); fileMenu.add(exportMenuAction); // TODO if(!app.isMac()) { fileMenu.addSeparator(); fileMenu.add(preferencesMenuAction); fileMenu.addSeparator(); fileMenu.add(exitMenuAction); } // Edit JMenu editMenu = new JMenu(new EditAction()); editMenu.add(copySelectionAction); editMenu.addSeparator(); editMenu.add(copyEventAction); editMenu.addSeparator(); copyLoggingActions.forEach(editMenu::add); editMenu.addSeparator(); copyAccessActions.forEach(editMenu::add); editMenu.addSeparator(); CustomCopyAction customCopyAction = new CustomCopyAction(); customCopyMenu = new JMenu(customCopyAction); customCopyPopupMenu = new JMenu(customCopyAction); editMenu.add(customCopyMenu); editMenu.addSeparator(); PasteStackTraceElementAction pasteStackTraceElementAction = new PasteStackTraceElementAction(); editMenu.add(goToSourceAction); editMenu.add(pasteStackTraceElementAction); // Search searchMenu = new JMenu(new SearchAction()); searchMenu.add(findMenuAction); searchMenu.add(resetFindAction); searchMenu.add(findPreviousMenuAction); searchMenu.add(findNextMenuAction); searchMenu.add(findPreviousActiveAction); searchMenu.add(findNextActiveAction); searchMenu.addSeparator(); searchMenu.add(saveConditionMenuAction); searchMenu.addSeparator(); focusMenu = new FocusMenu(applicationPreferences, !usingScreenMenuBar); excludeMenu = new ExcludeMenu(applicationPreferences, !usingScreenMenuBar); searchMenu.add(focusMenu); searchMenu.add(excludeMenu); searchMenu.addSeparator(); searchMenu.add(showUnfilteredEventAction); // View viewMenu = new JMenu(new ViewAction()); viewMenu.add(tailMenuAction); viewMenu.add(pauseMenuAction); viewMenu.add(clearMenuAction); viewMenu.add(attachMenuAction); viewMenu.add(disconnectMenuAction); viewMenu.add(focusEventsAction); viewMenu.add(focusMessageAction); viewMenu.add(editSourceNameMenuAction); viewMenu.addSeparator(); viewMenu.add(zoomInMenuAction); viewMenu.add(zoomOutMenuAction); viewMenu.add(resetZoomMenuAction); viewMenu.addSeparator(); JMenu layoutMenu = new JMenu(new LayoutAction()); columnsMenu = new JMenu(new ColumnsAction()); layoutMenu.add(columnsMenu); layoutMenu.addSeparator(); layoutMenu.add(saveLayoutAction); layoutMenu.add(resetLayoutAction); viewMenu.add(layoutMenu); viewMenu.addSeparator(); viewMenu.add(nextViewAction); viewMenu.add(previousViewAction); viewMenu.addSeparator(); viewMenu.add(closeFilterAction); viewMenu.add(closeOtherFiltersAction); viewMenu.add(closeAllFiltersAction); // Window windowMenu = new JMenu(new WindowAction()); // Help JMenu helpMenu = new JMenu(new HelpAction()); helpMenu.add(helpTopicsAction); helpMenu.add(showLoveMenuAction); helpMenu.add(tipOfTheDayAction); helpMenu.add(checkForUpdateAction); helpMenu.add(troubleshootingAction); helpMenu.addSeparator(); helpMenu.add(debugAction); // TODO if(!app.isMac()) { helpMenu.addSeparator(); helpMenu.add(aboutAction); } menubar.add(fileMenu); menubar.add(editMenu); menubar.add(searchMenu); menubar.add(viewMenu); menubar.add(windowMenu); menubar.add(helpMenu); updateWindowMenu(); updateRecentFiles(); setViewContainer(viewContainer); initialized = true; } public JToolBar getToolbar() { return toolbar; } JMenuBar getMenuBar() { return menubar; } public void setViewContainer(ViewContainer viewContainer) { if(this.viewContainer != viewContainer || !initialized) { if(this.viewContainer != null) { this.viewContainer.removeChangeListener(containerChangeListener); this.viewContainer.removePropertyChangeListener(containerPropertyChangeListener); } this.viewContainer = viewContainer; if(this.viewContainer != null) { this.viewContainer.addChangeListener(containerChangeListener); this.viewContainer.addPropertyChangeListener(containerPropertyChangeListener); setEventWrapper(this.viewContainer.getSelectedEvent()); } else { setEventWrapper(null); } updateActions(); } } public ViewContainer getViewContainer() { return viewContainer; } public void updateWindowMenu() { updateWindowMenu(windowMenu); } private void updateActions() { boolean hasView = false; boolean hasFilter = false; boolean isActive = false; EventSource eventSource = null; EventWrapperViewPanel eventWrapperViewPanel=null; if(viewContainer != null) { hasView = true; eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { eventSource = eventWrapperViewPanel.getEventSource(); hasFilter = eventWrapperViewPanel.getFilterCondition() != null; isActive = eventWrapperViewPanel.getState() == LoggingViewState.ACTIVE; } } copySelectionAction.setView(eventWrapperViewPanel); if(logger.isDebugEnabled()) logger.debug("updateActions() eventSource={}", eventSource); // File exportMenuAction.setView(eventWrapperViewPanel); // Search searchMenu.setEnabled(hasView); findMenuAction.setEnabled(hasView); resetFindAction.setEnabled(hasFilter); findPreviousMenuAction.setEnabled(hasFilter); findPreviousToolBarAction.setEnabled(hasFilter); findNextMenuAction.setEnabled(hasFilter); findNextToolBarAction.setEnabled(hasFilter); Condition condition = mainFrame.getFindActiveCondition(); findPreviousActiveAction.setEnabled(hasView && condition != null); findNextActiveAction.setEnabled(hasView && condition != null); // View viewMenu.setEnabled(hasView); tailMenuAction.setEnabled(hasView); editSourceNameMenuAction.setEnabled(hasView); saveLayoutAction.setEnabled(hasView); resetLayoutAction.setEnabled(hasView); pauseMenuAction.setEnabled(hasView); clearMenuAction.setEnabled(hasView/* && !hasFilteredBuffer*/); attachMenuAction.setEnabled(hasView); disconnectMenuAction.setEnabled(isActive); focusEventsAction.setEnabled(hasView); focusMessageAction.setEnabled(hasView); updateShowHideMenu(); previousViewAction.updateAction(); nextViewAction.updateAction(); disconnectToolBarAction.setEnabled(isActive); tailMenuAction.updateAction(); editSourceNameMenuAction.updateAction(); saveConditionMenuAction.updateAction(); zoomInMenuAction.updateAction(); zoomOutMenuAction.updateAction(); resetZoomMenuAction.updateAction(); pauseMenuAction.updateAction(); attachMenuAction.updateAction(); closeFilterAction.updateAction(); closeOtherFiltersAction.updateAction(); closeAllFiltersAction.updateAction(); tailButton.setSelected(isScrollingToBottom()); pauseToolBarAction.updateAction(); attachToolBarAction.updateAction(); tailToolBarAction.setEnabled(hasView); pauseToolBarAction.setEnabled(hasView); clearToolBarAction.setEnabled(hasView/* && !hasFilteredBuffer*/); findToolBarAction.setEnabled(hasView); attachToolBarAction.setEnabled(hasView); disconnectToolBarAction.setEnabled(isActive); if(eventSource != null) { showUnfilteredEventAction.setEnabled((eventSource.getFilter() != null)); } else { showUnfilteredEventAction.setEnabled(false); } } private void updateShowHideMenu() { columnsMenu.removeAll(); if(viewContainer != null) { EventWrapperViewPanel<?> viewPanel = viewContainer.getSelectedView(); if(viewPanel != null) { EventWrapperViewTable<?> table = viewPanel.getTable(); if(table != null) { PersistentTableColumnModel tableColumnModel = table.getTableColumnModel(); List<PersistentTableColumnModel.TableColumnLayoutInfo> cli = tableColumnModel .getColumnLayoutInfos(); for(PersistentTableColumnModel.TableColumnLayoutInfo current : cli) { boolean visible = current.isVisible(); JCheckBoxMenuItem cbmi = new JCheckBoxMenuItem(new ShowHideAction(tableColumnModel, current.getColumnName(), visible)); cbmi.setSelected(visible); columnsMenu.add(cbmi); } } } } } private boolean isScrollingToBottom() { if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { return eventWrapperViewPanel.isScrollingToBottom(); } } return false; } private void setScrollingToBottom(boolean scrollingToBottom) { if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { eventWrapperViewPanel.setScrollingToBottom(scrollingToBottom); } } } private boolean isPaused() { if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { return eventWrapperViewPanel.isPaused(); } } return false; } private void setPaused(boolean paused) { if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { eventWrapperViewPanel.setPaused(paused); } } } void clear() { if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { eventWrapperViewPanel.clear(); } } } private void focusTable() { if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { eventWrapperViewPanel.focusTable(); } } } private void editCondition() { if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { Condition currentFilter = eventWrapperViewPanel.getTable().getFilterCondition(); Condition condition = eventWrapperViewPanel.getCombinedCondition(currentFilter); if(condition != null) { mainFrame.getPreferencesDialog().editCondition(condition); } } } } private void attachDetach() { ViewContainer container = getViewContainer(); if(container != null) { MainFrame mainFrame = container.getMainFrame(); ViewWindow window = container.resolveViewWindow(); if(window instanceof JFrame) { window.closeWindow(); mainFrame.showInternalFrame(container); } else if(window instanceof JInternalFrame) { window.closeWindow(); mainFrame.showFrame(container); } } focusTable(); } private void disconnect() { if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { eventWrapperViewPanel.closeConnection(eventWrapperViewPanel.getEventSource().getSourceIdentifier()); } } } private void focusMessage() { if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { eventWrapperViewPanel.focusMessagePane(); } } } private void focusEvents() { if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { eventWrapperViewPanel.focusTable(); } } } private void findNext() { if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { eventWrapperViewPanel .findNext(eventWrapperViewPanel.getSelectedRow(), eventWrapperViewPanel.getFilterCondition()); } } } private void findNextActive() { Condition condition = mainFrame.getFindActiveCondition(); if(viewContainer != null && condition != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { eventWrapperViewPanel .findNext(eventWrapperViewPanel.getSelectedRow(), condition); } } } private void findPrevious() { if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { eventWrapperViewPanel .findPrevious(eventWrapperViewPanel.getSelectedRow(), eventWrapperViewPanel.getFilterCondition()); } } } private void findPreviousActive() { Condition condition = mainFrame.getFindActiveCondition(); if(viewContainer != null && condition != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { eventWrapperViewPanel .findPrevious(eventWrapperViewPanel.getSelectedRow(), condition); } } } private void resetFind() { if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { eventWrapperViewPanel.resetFind(); } } } private void closeCurrentFilter() { if(viewContainer != null) { viewContainer.closeCurrentFilter(); } } private void closeOtherFilters() { if(viewContainer != null) { viewContainer.closeOtherFilters(); } } private void closeAllFilters() { if(viewContainer != null) { viewContainer.closeAllFilters(); } } private void previousTab() { if(logger.isDebugEnabled()) logger.debug("PreviousTab"); if(viewContainer != null) { int viewCount = viewContainer.getViewCount(); int viewIndex = viewContainer.getViewIndex(); if(viewIndex > -1) { int newView = viewIndex - 1; if(newView < 0) { newView = viewCount - 1; } if(newView >= 0 && newView < viewCount) { viewContainer.setViewIndex(newView); } } } } private void nextTab() { if(logger.isDebugEnabled()) logger.debug("NextTab"); if(viewContainer != null) { int viewIndex = viewContainer.getViewIndex(); int viewCount = viewContainer.getViewCount(); if(viewIndex > -1) { int newView = viewIndex + 1; if(newView >= viewCount) { newView = 0; } if(newView >= 0) { viewContainer.setViewIndex(newView); } } } } private void showUnfilteredEvent() { if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { eventWrapperViewPanel.showUnfilteredEvent(); } } } private void initPopup() { if(logger.isDebugEnabled()) logger.debug("initPopup()"); popup = new JPopupMenu(); JMenuItem showUnfilteredMenuItem = new JMenuItem(showUnfilteredEventAction); Font f = showUnfilteredMenuItem.getFont(); Font boldFont = f.deriveFont(Font.BOLD); showUnfilteredMenuItem.setFont(boldFont); popup.add(showUnfilteredMenuItem); filterPopupMenu = new JMenu("Filter"); popup.add(filterPopupMenu); filterPopupMenu.add(closeFilterAction); filterPopupMenu.add(closeOtherFiltersAction); filterPopupMenu.add(closeAllFiltersAction); popup.addSeparator(); popup.add(saveConditionMenuAction); popup.addSeparator(); focusPopupMenu = new FocusMenu(applicationPreferences, true); excludePopupMenu = new ExcludeMenu(applicationPreferences, true); popup.add(focusPopupMenu); popup.add(excludePopupMenu); popup.addSeparator(); updateCustomCopyMenu(this.eventWrapper); copyPopupMenu = new JMenu("Copy"); popup.add(copyPopupMenu); copyPopupMenu.add(copySelectionAction); copyPopupMenu.addSeparator(); copyPopupMenu.add(copyEventAction); copyPopupMenu.addSeparator(); copyLoggingActions.forEach(copyPopupMenu::add); copyPopupMenu.addSeparator(); copyAccessActions.forEach(copyPopupMenu::add); copyPopupMenu.addSeparator(); copyPopupMenu.add(customCopyPopupMenu); popup.add(goToSourceAction); } private void setEventWrapper(EventWrapper wrapper) { if(logger.isDebugEnabled()) logger.debug("setEventWrapper: {}", wrapper); this.eventWrapper = wrapper; goToSourceAction.setEventWrapper(eventWrapper); copyEventAction.setEventWrapper(eventWrapper); for(CopyToClipboardAction current : copyLoggingActions) { current.setEventWrapper(eventWrapper); } for(CopyToClipboardAction current : copyAccessActions) { current.setEventWrapper(eventWrapper); } updateCustomCopyMenu(eventWrapper); focusMenu.setViewContainer(viewContainer); focusMenu.setEventWrapper(eventWrapper); excludeMenu.setViewContainer(viewContainer); excludeMenu.setEventWrapper(eventWrapper); } private void updateCustomCopyMenu(EventWrapper wrapper) { String[] scripts = applicationPreferences.getClipboardFormatterScriptFiles(); boolean changed = false; if(groovyClipboardActions == null) { groovyClipboardActions = new HashMap<>(); changed = true; } if(groovyClipboardData == null) { groovyClipboardData = new HashMap<>(); changed = true; } if(scripts == null || scripts.length == 0) { if(groovyClipboardActions.size() > 0) { groovyClipboardActions.clear(); groovyClipboardData.clear(); changed = true; } } else { List<String> scriptsList = Arrays.asList(scripts); // add missing formatters for(String current : scriptsList) { if(!groovyClipboardActions.containsKey(current)) { GroovyFormatter newFormatter = new GroovyFormatter(); newFormatter.setGroovyFileName(applicationPreferences.resolveClipboardFormatterScriptFile(current).getAbsolutePath()); CopyToClipboardAction newAction = new CopyToClipboardAction(newFormatter); groovyClipboardActions.put(current, newAction); changed = true; } } // find deleted formatters List<String> deletedList = groovyClipboardActions.entrySet().stream() .filter(current -> !scriptsList.contains(current.getKey())) .map(Map.Entry::getKey) .collect(Collectors.toList()); // remove deleted formatters for(String current : deletedList) { groovyClipboardActions.remove(current); changed = true; } } for(Map.Entry<String, CopyToClipboardAction> current : groovyClipboardActions.entrySet()) { String key = current.getKey(); CopyToClipboardAction value = current.getValue(); ClipboardFormatter formatter = value.getClipboardFormatter(); if(formatter == null) { continue; } ClipboardFormatterData data = new ClipboardFormatterData(formatter); if(!data.equals(groovyClipboardData.get(key))) { changed = true; groovyClipboardData.put(key, data); value.setClipboardFormatter(formatter); // this reinitializes the action } } if(changed) { customCopyMenu.removeAll(); customCopyPopupMenu.removeAll(); boolean enabled = false; if(groovyClipboardActions.size() > 0) { enabled = true; SortedSet<CopyToClipboardAction> sorted = new TreeSet<>(CopyToClipboardByNameComparator.INSTANCE); // sort the actions by name sorted.addAll(groovyClipboardActions.entrySet().stream() .map(Map.Entry::getValue) .collect(Collectors.toList())); Map<KeyStroke, CopyToClipboardAction> freshMapping = new HashMap<>(keyStrokeActionMapping); prepareClipboardActions(sorted, freshMapping); // add the sorted actions to the menus. for(CopyToClipboardAction current : sorted) { customCopyMenu.add(current); customCopyPopupMenu.add(current); } } customCopyMenu.setEnabled(enabled); customCopyPopupMenu.setEnabled(enabled); } for(Map.Entry<String, CopyToClipboardAction> current : groovyClipboardActions.entrySet()) { CopyToClipboardAction value = current.getValue(); value.setEventWrapper(wrapper); } } private void prepareClipboardActions(Collection<CopyToClipboardAction> actions, Map<KeyStroke, CopyToClipboardAction> mapping) { if(actions == null) { throw new IllegalArgumentException("actions must not be null!"); } if(mapping == null) { throw new IllegalArgumentException("mapping must not be null!"); } for(CopyToClipboardAction current : actions) { Object obj = current.getValue(Action.ACCELERATOR_KEY); if(!(obj instanceof KeyStroke)) { continue; } ClipboardFormatter formatter = current.getClipboardFormatter(); if(formatter == null) { // oO? continue; } boolean reset = false; String name = formatter.getName(); KeyStroke currentKeyStroke = (KeyStroke) obj; if(!formatter.isNative()) { String existingActionName = LilithKeyStrokes.getActionName(currentKeyStroke); if (existingActionName != null) { if (logger.isWarnEnabled()) logger.warn("KeyStroke '{}' of formatter '{}' would collide with native Lilith action '{}'. Ignoring...", currentKeyStroke, name, existingActionName); reset = true; } } CopyToClipboardAction existingAction = mapping.get(currentKeyStroke); if(existingAction != null) { String existingFormatterName = null; ClipboardFormatter existingFormatter = existingAction.getClipboardFormatter(); if(existingFormatter != null) { existingFormatterName = existingFormatter.getName(); } if(logger.isWarnEnabled()) logger.warn("KeyStroke '{}' of formatter '{}' would collide with other formatter '{}'. Ignoring...", currentKeyStroke, name, existingFormatterName); reset = true; } if(reset) { if(logger.isInfoEnabled()) logger.info("Resetting accelerator for formatter '{}'.", name); current.putValue(Action.ACCELERATOR_KEY, null); } else { mapping.put(currentKeyStroke, current); } } } private void updateWindowMenu(JMenu windowMenu) { // must be executed later because the ancestor-change-event is fired // while parent is still != null... // see JComponent.removeNotify source for comment. EventQueue.invokeLater(new UpdateWindowMenuRunnable(windowMenu)); } private void updatePopup() { if(logger.isDebugEnabled()) logger.debug("updatePopup()"); if(popup == null) { initPopup(); } boolean enableCopyMenu = false; if(eventWrapper != null) { EventWrapper<LoggingEvent> loggingEventWrapper = asLoggingEventWrapper(eventWrapper); EventWrapper<AccessEvent> accessEventWrapper = asAccessEventWrapper(eventWrapper); enableCopyMenu = loggingEventWrapper != null || accessEventWrapper != null; } boolean enableFilterMenu = closeFilterAction.isEnabled() || closeOtherFiltersAction.isEnabled() || closeAllFiltersAction.isEnabled(); filterPopupMenu.setEnabled(enableFilterMenu); copyPopupMenu.setEnabled(enableCopyMenu); focusPopupMenu.setViewContainer(viewContainer); focusPopupMenu.setEventWrapper(eventWrapper); excludePopupMenu.setViewContainer(viewContainer); excludePopupMenu.setEventWrapper(eventWrapper); } JPopupMenu getPopupMenu() { updatePopup(); return popup; } public void updateRecentFiles() { List<String> recentFilesStrings = applicationPreferences.getRecentFiles(); if(recentFilesStrings == null || recentFilesStrings.size()==0) { recentFilesMenu.removeAll(); recentFilesMenu.setEnabled(false); } else { boolean fullPath=applicationPreferences.isShowingFullRecentPath(); recentFilesMenu.removeAll(); for(String current:recentFilesStrings) { recentFilesMenu.add(new OpenFileAction(current, fullPath)); } recentFilesMenu.addSeparator(); recentFilesMenu.add(clearRecentFilesAction); recentFilesMenu.setEnabled(true); } } public void setConditionNames(List<String> conditionNames) { focusMenu.setConditionNames(conditionNames); focusPopupMenu.setConditionNames(conditionNames); excludeMenu.setConditionNames(conditionNames); excludePopupMenu.setConditionNames(conditionNames); } private class OpenFileAction extends AbstractAction { private static final long serialVersionUID = 3138705799791457944L; private String absoluteName; OpenFileAction(String absoluteName, boolean fullPath) { super(); this.absoluteName=absoluteName; String name=absoluteName; if(!fullPath) { File f=new File(absoluteName); name=f.getName(); } putValue(Action.NAME, name); putValue(Action.SMALL_ICON, Icons.resolveEmptyMenuIcon()); putValue(Action.SHORT_DESCRIPTION, absoluteName); } public void actionPerformed(ActionEvent e) { mainFrame.open(new File(absoluteName)); } } private class ClearRecentFilesAction extends AbstractLilithAction { private static final long serialVersionUID = 5931366119837395385L; ClearRecentFilesAction() { super(LilithActionId.CLEAR_RECENT_FILES); } public void actionPerformed(ActionEvent e) { applicationPreferences.clearRecentFiles(); } } private class RemoveInactiveAction extends AbstractLilithAction { private static final long serialVersionUID = -4899555487517384044L; RemoveInactiveAction() { super(LilithActionId.REMOVE_INACTIVE); } public void actionPerformed(ActionEvent e) { mainFrame.removeInactiveViews(false); mainFrame.updateWindowMenus(); } } private class ShowTaskManagerAction extends AbstractLilithAction { private static final long serialVersionUID = 8903964233879357068L; ShowTaskManagerAction() { super(LilithActionId.TASK_MANAGER); } public void actionPerformed(ActionEvent e) { mainFrame.showTaskManager(); } } private class CloseAllAction extends AbstractLilithAction { private static final long serialVersionUID = -1422391104698136853L; CloseAllAction() { super(LilithActionId.CLOSE_ALL); } public void actionPerformed(ActionEvent e) { mainFrame.closeAllViews(null); mainFrame.updateWindowMenus(); } } private class CloseOtherAction extends AbstractLilithAction { private static final long serialVersionUID = 7428424871185431400L; CloseOtherAction() { super(LilithActionId.CLOSE_ALL_OTHER); } public void actionPerformed(ActionEvent e) { mainFrame.closeAllViews(viewContainer); mainFrame.updateWindowMenus(); } } private class MinimizeAllAction extends AbstractLilithAction { private static final long serialVersionUID = -5691488945878472747L; MinimizeAllAction() { super(LilithActionId.MINIMIZE_ALL); } public void actionPerformed(ActionEvent e) { mainFrame.minimizeAllViews(null); mainFrame.updateWindowMenus(); } } private class MinimizeAllOtherAction extends AbstractLilithAction { private static final long serialVersionUID = 4359591467723034614L; MinimizeAllOtherAction() { super(LilithActionId.MINIMIZE_OTHER); } public void actionPerformed(ActionEvent e) { mainFrame.minimizeAllViews(viewContainer); mainFrame.updateWindowMenus(); } } private class ClearAction extends AbstractLilithAction { private static final long serialVersionUID = -4713267797278778997L; ClearAction(boolean toolbar) { super(LilithActionId.CLEAR, toolbar); } public void actionPerformed(ActionEvent e) { clear(); } } private class ZoomInMenuAction extends AbstractLilithAction { private static final long serialVersionUID = -7888485901625353999L; ZoomInMenuAction() { super(LilithActionId.ZOOM_IN); } public void actionPerformed(ActionEvent e) { mainFrame.zoomIn(); } void updateAction() { boolean enable = false; if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { enable = true; } } setEnabled(enable); } } private class ZoomOutMenuAction extends AbstractLilithAction { private static final long serialVersionUID = 4775486230433866870L; ZoomOutMenuAction() { super(LilithActionId.ZOOM_OUT); } public void actionPerformed(ActionEvent e) { mainFrame.zoomOut(); } void updateAction() { boolean enable = false; if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { enable = true; } } setEnabled(enable); } } private class ResetZoomMenuAction extends AbstractLilithAction { private static final long serialVersionUID = 2666064072732620530L; ResetZoomMenuAction() { super(LilithActionId.RESET_ZOOM); } public void actionPerformed(ActionEvent e) { mainFrame.resetZoom(); } void updateAction() { boolean enable = false; if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { enable = true; } } setEnabled(enable); } } private class SaveConditionMenuAction extends AbstractLilithAction { private static final long serialVersionUID = -5736668292947348845L; private final boolean htmlTooltip; SaveConditionMenuAction(boolean htmlTooltip) { super(LilithActionId.SAVE_CONDITION); this.htmlTooltip = htmlTooltip; } public void actionPerformed(ActionEvent e) { editCondition(); } void updateAction() { if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { Condition currentFilter = eventWrapperViewPanel.getTable().getFilterCondition(); Condition condition = eventWrapperViewPanel.getCombinedCondition(currentFilter); if(condition != null) { ActionTooltips.initializeConditionTooltip(condition, this, htmlTooltip); setEnabled(true); return; } } } putValue(Action.SHORT_DESCRIPTION, getId().getDescription()); setEnabled(false); } } private class EditSourceNameMenuAction extends AbstractLilithAction { private static final long serialVersionUID = -1769963136846922348L; EditSourceNameMenuAction() { super(LilithActionId.EDIT_SOURCE_NAME); } public void actionPerformed(ActionEvent e) { if(viewContainer == null) { return; } EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel == null) { return; } EventSource eventSource = eventWrapperViewPanel.getEventSource(); if(eventSource.isGlobal()) { return; } String identifier = eventSource.getSourceIdentifier().getIdentifier(); if(InternalLilithAppender.IDENTIFIER_NAME.equals(identifier)) { return; } mainFrame.getPreferencesDialog().editSourceName(identifier); } void updateAction() { boolean enable = false; if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { EventSource eventSource = eventWrapperViewPanel.getEventSource(); if(!eventSource.isGlobal()) { String identifier = eventSource.getSourceIdentifier().getIdentifier(); if (!InternalLilithAppender.IDENTIFIER_NAME.equals(identifier)) { enable = true; } } } } setEnabled(enable); } } private class AttachAction extends AbstractLilithAction { private static final long serialVersionUID = -6686061036755515933L; AttachAction(boolean toolbar) { super(LilithActionId.ATTACH, toolbar); updateAction(); } public void actionPerformed(ActionEvent e) { attachDetach(); updateAction(); } void updateAction() { ViewContainer container = getViewContainer(); if(container != null) { ViewWindow window = container.resolveViewWindow(); if(window instanceof JFrame) { if(isToolbar()) { putValue(Action.SMALL_ICON, Icons.ATTACH_TOOLBAR_ICON); } else { putValue(Action.SMALL_ICON, Icons.ATTACH_MENU_ICON); putValue(Action.NAME, "Attach"); } return; } } // default/init to Detach if(isToolbar()) { putValue(Action.SMALL_ICON, Icons.DETACH_TOOLBAR_ICON); } else { putValue(Action.SMALL_ICON, Icons.DETACH_MENU_ICON); putValue(Action.NAME, "Detach"); } } } private class PauseAction extends AbstractLilithAction { private static final long serialVersionUID = -5242236903640590549L; PauseAction(boolean toolbar) { super(LilithActionId.PAUSE, toolbar); updateAction(); } public void actionPerformed(ActionEvent e) { setPaused(!isPaused()); updateAction(); focusTable(); } void updateAction() { if(isPaused()) { if(isToolbar()) { putValue(Action.SMALL_ICON, Icons.PAUSED_TOOLBAR_ICON); } else { putValue(Action.SMALL_ICON, Icons.PAUSED_MENU_ICON); putValue(Action.NAME, "Resume"); } } else { if(isToolbar()) { putValue(Action.SMALL_ICON, Icons.UNPAUSED_TOOLBAR_ICON); } else { putValue(Action.SMALL_ICON, Icons.UNPAUSED_MENU_ICON); putValue(Action.NAME, "Pause"); } } } } private class FindAction extends AbstractLilithAction { private static final long serialVersionUID = 8686689881059491581L; FindAction(boolean toolbar) { super(LilithActionId.FIND, toolbar); } public void actionPerformed(ActionEvent e) { if(viewContainer != null) { EventWrapperViewPanel eventWrapperViewPanel = viewContainer.getSelectedView(); if(eventWrapperViewPanel != null) { eventWrapperViewPanel.setShowingFilters(true); } } } } private class DisconnectAction extends AbstractLilithAction { private static final long serialVersionUID = -7608467965704213937L; DisconnectAction(boolean toolbar) { super(LilithActionId.DISCONNECT, toolbar); } public void actionPerformed(ActionEvent e) { disconnect(); } } private class FocusMessageAction extends AbstractLilithAction { private static final long serialVersionUID = -7138801117961747361L; FocusMessageAction() { super(LilithActionId.FOCUS_MESSAGE); } public void actionPerformed(ActionEvent e) { focusMessage(); } } private class FocusEventsAction extends AbstractLilithAction { private static final long serialVersionUID = -8861583468969887725L; FocusEventsAction() { super(LilithActionId.FOCUS_EVENTS); } public void actionPerformed(ActionEvent e) { focusEvents(); } } private class FindNextAction extends AbstractLilithAction { private static final long serialVersionUID = -8423353519237402903L; FindNextAction(boolean toolbar) { super(LilithActionId.FIND_NEXT, toolbar); } public void actionPerformed(ActionEvent e) { findNext(); } } private class FindPreviousAction extends AbstractLilithAction { private static final long serialVersionUID = 5500344754940498682L; FindPreviousAction(boolean toolbar) { super(LilithActionId.FIND_PREVIOUS, toolbar); } public void actionPerformed(ActionEvent e) { findPrevious(); } } private class FindNextActiveAction extends AbstractLilithAction { private static final long serialVersionUID = 5173104146045140691L; FindNextActiveAction(boolean toolbar) { super(LilithActionId.FIND_NEXT_ACTIVE, toolbar); } public void actionPerformed(ActionEvent e) { findNextActive(); } } private class FindPreviousActiveAction extends AbstractLilithAction { private static final long serialVersionUID = 2678420403434984064L; FindPreviousActiveAction(boolean toolbar) { super(LilithActionId.FIND_PREVIOUS_ACTIVE, toolbar); } public void actionPerformed(ActionEvent e) { findPreviousActive(); } } private class ResetFindAction extends AbstractLilithAction { private static final long serialVersionUID = 4133654759522587356L; ResetFindAction() { super(LilithActionId.RESET_FIND); } public void actionPerformed(ActionEvent e) { resetFind(); } } private static class FileAction extends AbstractLilithAction { private static final long serialVersionUID = 6713037299656243140L; FileAction() { super(LilithActionId.FILE); putValue(Action.SMALL_ICON, null); } public void actionPerformed(ActionEvent e) { } } private static class EditAction extends AbstractLilithAction { private static final long serialVersionUID = -2716967152517099080L; EditAction() { super(LilithActionId.EDIT); putValue(Action.SMALL_ICON, null); } public void actionPerformed(ActionEvent e) { } } private static class SearchAction extends AbstractLilithAction { private static final long serialVersionUID = 4657376136768632219L; SearchAction() { super(LilithActionId.SEARCH); putValue(Action.SMALL_ICON, null); } public void actionPerformed(ActionEvent e) { } } private static class ViewAction extends AbstractLilithAction { private static final long serialVersionUID = 3606162173106275568L; ViewAction() { super(LilithActionId.VIEW); putValue(Action.SMALL_ICON, null); } public void actionPerformed(ActionEvent e) { } } private static class WindowAction extends AbstractLilithAction { private static final long serialVersionUID = 9045231748351787117L; WindowAction() { super(LilithActionId.WINDOW); putValue(Action.SMALL_ICON, null); } public void actionPerformed(ActionEvent e) { } } private static class HelpAction extends AbstractLilithAction { private static final long serialVersionUID = 2294357096466137621L; HelpAction() { super(LilithActionId.HELP); putValue(Action.SMALL_ICON, null); } public void actionPerformed(ActionEvent e) { } } private static class LayoutAction extends AbstractLilithAction { private static final long serialVersionUID = 2989496510791574495L; LayoutAction() { super(LilithActionId.LAYOUT); } public void actionPerformed(ActionEvent e) { } } private static class ColumnsAction extends AbstractLilithAction { private static final long serialVersionUID = 4884985802967711064L; ColumnsAction() { super(LilithActionId.COLUMNS); } public void actionPerformed(ActionEvent e) { } } private static class RecentFilesAction extends AbstractLilithAction { private static final long serialVersionUID = 3479806600315336050L; RecentFilesAction() { super(LilithActionId.RECENT_FILES); } public void actionPerformed(ActionEvent e) { } } private static class CustomCopyAction extends AbstractLilithAction { private static final long serialVersionUID = -5009668707700082616L; CustomCopyAction() { super(LilithActionId.CUSTOM_COPY); } public void actionPerformed(ActionEvent e) { } } private class TailAction extends AbstractLilithAction { private static final long serialVersionUID = -8499706451642163124L; TailAction(boolean toolbar) { super(LilithActionId.TAIL, toolbar); } public void actionPerformed(ActionEvent e) { boolean tail = !isScrollingToBottom(); setScrollingToBottom(tail); if(logger.isDebugEnabled()) logger.debug("tail={}", tail); focusTable(); } void updateAction() { if(isToolbar()) { return; } if(isScrollingToBottom()) { putValue(Action.SMALL_ICON, Icons.resolveMenuIcon(getId())); } else { putValue(Action.SMALL_ICON, Icons.resolveEmptyMenuIcon()); } } } private class CloseFilterAction extends AbstractLilithAction { private static final long serialVersionUID = -842677137302613585L; CloseFilterAction() { super(LilithActionId.CLOSE_FILTER); } void updateAction() { if(viewContainer != null) { int viewIndex = viewContainer.getViewIndex(); if(viewIndex > 0) { setEnabled(true); } else { setEnabled(false); } } else { setEnabled(false); } } public void actionPerformed(ActionEvent e) { closeCurrentFilter(); } } private class CloseOtherFiltersAction extends AbstractLilithAction { private static final long serialVersionUID = -6399148183817841417L; CloseOtherFiltersAction() { super(LilithActionId.CLOSE_OTHER_FILTERS); } void updateAction() { if(viewContainer != null) { int viewIndex = viewContainer.getViewIndex(); int viewCount = viewContainer.getViewCount(); if(viewIndex > -1 && ((viewIndex == 0 && viewCount > 1) || viewCount > 2)) { setEnabled(true); } else { setEnabled(false); } } else { setEnabled(false); } } public void actionPerformed(ActionEvent e) { closeOtherFilters(); } } private class CloseAllFiltersAction extends AbstractLilithAction { private static final long serialVersionUID = -5157911937552703061L; CloseAllFiltersAction() { super(LilithActionId.CLOSE_ALL_FILTERS); } void updateAction() { int viewCount = 0; if(viewContainer != null) { viewCount = viewContainer.getViewCount(); } if(viewCount > 1) { setEnabled(true); } else { setEnabled(false); } } public void actionPerformed(ActionEvent e) { closeAllFilters(); } } class ViewLoggingAction extends AbstractAction { private static final long serialVersionUID = 6967472316665780683L; private final EventSource<LoggingEvent> eventSource; ViewLoggingAction(String title, String tooltipText, EventSource<LoggingEvent> eventSource) { super(title); this.eventSource = eventSource; LilithActionId actionId = null; if(eventSource.isGlobal()) { actionId = LilithActionId.VIEW_GLOBAL_CLASSIC_LOGS; } else { SourceIdentifier si = eventSource.getSourceIdentifier(); if(InternalLilithAppender.IDENTIFIER_NAME.equals(si.getIdentifier())) { // internal Lilith log actionId = LilithActionId.VIEW_LILITH_LOGS; } } if(actionId != null) { AbstractLilithAction.initMenuActionFromActionId(this, actionId); } else { putValue(Action.SHORT_DESCRIPTION, tooltipText); } } public void actionPerformed(ActionEvent evt) { mainFrame.showLoggingView(eventSource); } } class ViewAccessAction extends AbstractAction { private static final long serialVersionUID = 8054851261518410946L; private final EventSource<AccessEvent> eventSource; ViewAccessAction(String title, String tooltipText, EventSource<AccessEvent> eventSource) { super(title); this.eventSource = eventSource; LilithActionId actionId = null; if(eventSource.isGlobal()) { actionId = LilithActionId.VIEW_GLOBAL_ACCESS_LOGS; } if(actionId != null) { AbstractLilithAction.initMenuActionFromActionId(this, actionId); } else { putValue(Action.SHORT_DESCRIPTION, tooltipText); } } public void actionPerformed(ActionEvent evt) { mainFrame.showAccessView(eventSource); } } static String resolveSourceTitle(ViewContainer container, Map<String, String> sourceNames, boolean showingPrimaryIdentifier, boolean showingSecondaryIdentifier) { EventWrapperViewPanel defaultView = container.getDefaultView(); EventSource eventSource = defaultView.getEventSource(); boolean global=eventSource.isGlobal(); String name=null; if(!global) { name = resolveApplicationName(defaultView.getSourceBuffer()); } SourceIdentifier si = eventSource.getSourceIdentifier(); String title = resolveSourceTitle(si, name, sourceNames, showingPrimaryIdentifier, showingSecondaryIdentifier); Class clazz = container.getWrappedClass(); if (clazz == LoggingEvent.class) { title = title + " (Logging)"; } else if (clazz == AccessEvent.class) { title = title + " (Access)"; } return title; } private static String resolveSourceTitle(SourceIdentifier identifier, String name, Map<String, String> sourceNames, boolean showingPrimaryIdentifier, boolean showingSecondaryIdentifier) { String primary = getPrimarySourceTitle(identifier.getIdentifier(), sourceNames, showingPrimaryIdentifier); String secondary = identifier.getSecondaryIdentifier(); if(secondary == null || !showingSecondaryIdentifier || secondary.equals(primary)) { if(name == null) { return primary; } return primary + " - " + name; } if(name == null) { return primary + " - " + secondary; } return primary + " - " +name + " - " + secondary; } static String resolveApplicationName(Buffer<?> buffer) { Object event=null; if(buffer != null) { event = buffer.get(0); } return resolveName(event); } private static String resolveName(Object eventWrapperObj) { String name; String appId=null; if(eventWrapperObj instanceof EventWrapper) { EventWrapper wrapper= (EventWrapper) eventWrapperObj; Serializable evtObject = wrapper.getEvent(); LoggerContext context = null; if(evtObject instanceof LoggingEvent) { context = ((LoggingEvent) evtObject).getLoggerContext(); } else if(evtObject instanceof AccessEvent) { context = ((AccessEvent) evtObject).getLoggerContext(); } if(context != null) { name=context.getName(); if("default".equals(name) || "".equals(name)) { name = null; } Map<String, String> props = context.getProperties(); if(props!= null) { appId=props.get(LoggerContext.APPLICATION_IDENTIFIER_PROPERTY_NAME); } if(name != null) { if(appId == null || name.equals(appId)) { return name; } return name+"/"+appId; } return appId; } } return null; } static String getPrimarySourceTitle(String primaryIdentifier, Map<String, String> sourceNames, boolean showingPrimaryIdentifier) { if(primaryIdentifier == null) { return null; } String resolvedName = null; if(sourceNames != null) { resolvedName = sourceNames.get(primaryIdentifier); } if(resolvedName != null && !resolvedName.equals(primaryIdentifier)) { if(showingPrimaryIdentifier) { return resolvedName + " [" + primaryIdentifier + "]"; } else { return resolvedName; } } return primaryIdentifier; } class UpdateWindowMenuRunnable implements Runnable { private JMenu windowMenu; UpdateWindowMenuRunnable(JMenu windowMenu) { this.windowMenu = windowMenu; } public void run() { // remove loggingViews that were closed in the meantime... mainFrame.removeInactiveViews(true); Map<String, String> sourceNames = applicationPreferences.getSourceNames(); boolean showingPrimaryIdentifier = applicationPreferences.isShowingPrimaryIdentifier(); boolean showingSecondaryIdentifier = applicationPreferences.isShowingSecondaryIdentifier(); boolean globalLoggingEnabled = applicationPreferences.isGlobalLoggingEnabled(); if(logger.isDebugEnabled()) logger.debug("Updating Window-Menu."); windowMenu.removeAll(); windowMenu.add(showTaskManagerItem); windowMenu.addSeparator(); windowMenu.add(closeAllItem); windowMenu.add(closeAllOtherItem); windowMenu.add(minimizeAllItem); windowMenu.add(minimizeAllOtherItem); windowMenu.add(removeInactiveItem); int activeCounter = 0; int inactiveCounter = 0; int viewCounter = 0; boolean first; SortedMap<EventSource<LoggingEvent>, ViewContainer<LoggingEvent>> sortedLoggingViews = mainFrame.getSortedLoggingViews(); SortedMap<EventSource<AccessEvent>, ViewContainer<AccessEvent>> sortedAccessViews = mainFrame.getSortedAccessViews(); first = true; // Lilith logging for(Map.Entry<EventSource<LoggingEvent>, ViewContainer<LoggingEvent>> entry : sortedLoggingViews.entrySet()) { EventSource<LoggingEvent> key = entry.getKey(); SourceIdentifier si = key.getSourceIdentifier(); if(InternalLilithAppender.IDENTIFIER_NAME.equals(si.getIdentifier())) { ViewContainer<LoggingEvent> value = entry.getValue(); if(value.resolveViewWindow() != null) { viewCounter++; } if(first) { first = false; windowMenu.addSeparator(); } JMenuItem menuItem = createLoggingMenuItem(value, sourceNames, showingPrimaryIdentifier, showingSecondaryIdentifier); windowMenu.add(menuItem); } } // global (Logging) for(Map.Entry<EventSource<LoggingEvent>, ViewContainer<LoggingEvent>> entry : sortedLoggingViews.entrySet()) { EventSource<LoggingEvent> key = entry.getKey(); SourceIdentifier si = key.getSourceIdentifier(); if(!InternalLilithAppender.IDENTIFIER_NAME.equals(si.getIdentifier())) { ViewContainer<LoggingEvent> value = entry.getValue(); if(value.resolveViewWindow() != null) { viewCounter++; } if(key.isGlobal()) { if(first) { first = false; windowMenu.addSeparator(); } JMenuItem menuItem = createLoggingMenuItem(value, sourceNames, showingPrimaryIdentifier, showingSecondaryIdentifier); menuItem.setEnabled(globalLoggingEnabled); windowMenu.add(menuItem); } } } // global (Access) for(Map.Entry<EventSource<AccessEvent>, ViewContainer<AccessEvent>> entry : sortedAccessViews.entrySet()) { EventSource<AccessEvent> key = entry.getKey(); ViewContainer<AccessEvent> value = entry.getValue(); if(value.resolveViewWindow() != null) { viewCounter++; } if(key.isGlobal()) { if(first) { first = false; windowMenu.addSeparator(); } JMenuItem menuItem = createAccessMenuItem(value, sourceNames, showingPrimaryIdentifier, showingSecondaryIdentifier); menuItem.setEnabled(globalLoggingEnabled); windowMenu.add(menuItem); } } first = true; // Logging (active) for(Map.Entry<EventSource<LoggingEvent>, ViewContainer<LoggingEvent>> entry : sortedLoggingViews.entrySet()) { EventSource<LoggingEvent> key = entry.getKey(); SourceIdentifier si = key.getSourceIdentifier(); if(!InternalLilithAppender.IDENTIFIER_NAME.equals(si.getIdentifier())) { ViewContainer<LoggingEvent> value = entry.getValue(); EventWrapperViewPanel<LoggingEvent> panel = value.getDefaultView(); if(!key.isGlobal() && (LoggingViewState.ACTIVE == panel.getState())) { if(first) { first = false; windowMenu.addSeparator(); } JMenuItem menuItem = createLoggingMenuItem(value, sourceNames, showingPrimaryIdentifier, showingSecondaryIdentifier); windowMenu.add(menuItem); activeCounter++; } } } // Logging (inactive) for(Map.Entry<EventSource<LoggingEvent>, ViewContainer<LoggingEvent>> entry : sortedLoggingViews.entrySet()) { EventSource<LoggingEvent> key = entry.getKey(); SourceIdentifier si = key.getSourceIdentifier(); if(!InternalLilithAppender.IDENTIFIER_NAME.equals(si.getIdentifier())) { ViewContainer<LoggingEvent> value = entry.getValue(); EventWrapperViewPanel<LoggingEvent> panel = value.getDefaultView(); if(!key.isGlobal() && (LoggingViewState.ACTIVE != panel.getState())) { if(first) { first = false; windowMenu.addSeparator(); } JMenuItem menuItem = createLoggingMenuItem(value, sourceNames, showingPrimaryIdentifier, showingSecondaryIdentifier); windowMenu.add(menuItem); inactiveCounter++; } } } // Access (active) first = true; for(Map.Entry<EventSource<AccessEvent>, ViewContainer<AccessEvent>> entry : sortedAccessViews.entrySet()) { EventSource<AccessEvent> key = entry.getKey(); ViewContainer<AccessEvent> value = entry.getValue(); EventWrapperViewPanel<AccessEvent> panel = value.getDefaultView(); if(!key.isGlobal() && (LoggingViewState.ACTIVE == panel.getState())) { if(first) { first = false; windowMenu.addSeparator(); } JMenuItem menuItem = createAccessMenuItem(value, sourceNames, showingPrimaryIdentifier, showingSecondaryIdentifier); windowMenu.add(menuItem); activeCounter++; } } // Access (inactive) for(Map.Entry<EventSource<AccessEvent>, ViewContainer<AccessEvent>> entry : sortedAccessViews.entrySet()) { EventSource<AccessEvent> key = entry.getKey(); ViewContainer<AccessEvent> value = entry.getValue(); EventWrapperViewPanel<AccessEvent> panel = value.getDefaultView(); if(!key.isGlobal() && (LoggingViewState.ACTIVE != panel.getState())) { if(first) { first = false; windowMenu.addSeparator(); } JMenuItem menuItem = createAccessMenuItem(value, sourceNames, showingPrimaryIdentifier, showingSecondaryIdentifier); windowMenu.add(menuItem); inactiveCounter++; } } // update status text boolean hasInactive = (inactiveCounter != 0); //clearAndRemoveInactiveAction.setEnabled(hasInactive); removeInactiveAction.setEnabled(hasInactive); boolean hasViews = viewCounter != 0; minimizeAllAction.setEnabled(hasViews); closeAllAction.setEnabled(hasViews); if(viewContainer == null || viewCounter <= 1) { minimizeAllOtherAction.setEnabled(false); closeOtherAction.setEnabled(false); } else { minimizeAllOtherAction.setEnabled(true); closeOtherAction.setEnabled(true); } mainFrame.setActiveConnectionsCounter(activeCounter); if(windowMenu.isPopupMenuVisible()) { // I've not been able to find a more elegant solution to prevent // repaint artifacts if the menu contents change while the menu is still open... windowMenu.setPopupMenuVisible(false); windowMenu.setPopupMenuVisible(true); } } private JMenuItem createLoggingMenuItem(ViewContainer<LoggingEvent> viewContainer, Map<String, String> sourceNames, boolean showingPrimaryIdentifier, boolean showingSecondaryIdentifier) { EventSource<LoggingEvent> eventSource = viewContainer.getEventSource(); String title=resolveSourceTitle(viewContainer, sourceNames, showingPrimaryIdentifier, showingSecondaryIdentifier); String tooltipText=resolveSourceTitle(viewContainer, sourceNames, true, true); JMenuItem result = new JMenuItem(new ViewLoggingAction(title, tooltipText, eventSource)); Container compParent = viewContainer.getParent(); if(logger.isDebugEnabled()) logger.debug("\n\nParent for {}: {}\n", eventSource.getSourceIdentifier(), compParent); boolean disabled = false; if(compParent == null) { disabled = true; } result.setIcon(Icons.resolveFrameIcon(viewContainer.getState(), disabled)); return result; } private JMenuItem createAccessMenuItem(ViewContainer<AccessEvent> viewContainer, Map<String, String> sourceNames, boolean showingPrimaryIdentifier, boolean showingSecondaryIdentifier) { EventSource<AccessEvent> eventSource = viewContainer.getEventSource(); String title=resolveSourceTitle(viewContainer, sourceNames, showingPrimaryIdentifier, showingSecondaryIdentifier); String tooltipText=resolveSourceTitle(viewContainer, sourceNames, true, true); JMenuItem result = new JMenuItem(new ViewAccessAction(title, tooltipText, eventSource)); Container compParent = viewContainer.getParent(); if(logger.isDebugEnabled()) logger.debug("\n\nParent for {}: {}\n", eventSource.getSourceIdentifier(), compParent); boolean disabled = false; if(compParent == null) { disabled = true; } result.setIcon(Icons.resolveFrameIcon(viewContainer.getState(), disabled)); return result; } } class AboutAction extends AbstractLilithAction { private static final long serialVersionUID = -372250750198620913L; AboutAction() { super(LilithActionId.ABOUT); } public void actionPerformed(ActionEvent e) { mainFrame.showAboutDialog(); } } class SaveLayoutAction extends AbstractLilithAction { private static final long serialVersionUID = 5923537670097606664L; SaveLayoutAction() { super(LilithActionId.SAVE_LAYOUT); } public void actionPerformed(ActionEvent e) { if(viewContainer != null) { EventWrapperViewPanel<?> viewPanel = viewContainer.getSelectedView(); if(viewPanel != null) { EventWrapperViewTable<?> table = viewPanel.getTable(); if(table != null) { table.saveLayout(); } } } } } class ResetLayoutAction extends AbstractLilithAction { private static final long serialVersionUID = 7012243855415503341L; ResetLayoutAction() { super(LilithActionId.RESET_LAYOUT); } public void actionPerformed(ActionEvent e) { if(viewContainer != null) { EventWrapperViewPanel<?> viewPanel = viewContainer.getSelectedView(); if(viewPanel != null) { EventWrapperViewTable<?> table = viewPanel.getTable(); if(table != null) { table.resetLayout(); } } } } } class CheckForUpdateAction extends AbstractLilithAction { private static final long serialVersionUID = 529742851501771901L; CheckForUpdateAction() { super(LilithActionId.CHECK_FOR_UPDATE); } public void actionPerformed(ActionEvent e) { mainFrame.checkForUpdate(true); } } class TroubleshootingAction extends AbstractLilithAction { private static final long serialVersionUID = 7272512675892611518L; TroubleshootingAction() { super(LilithActionId.TROUBLESHOOTING); } public void actionPerformed(ActionEvent e) { mainFrame.troubleshooting(); } } class HelpTopicsAction extends AbstractLilithAction { private static final long serialVersionUID = 4151080083718877643L; HelpTopicsAction() { super(LilithActionId.HELP_TOPICS); } public void actionPerformed(ActionEvent e) { mainFrame.showHelp(); } } class TipOfTheDayAction extends AbstractLilithAction { private static final long serialVersionUID = -3353245047244667056L; TipOfTheDayAction() { super(LilithActionId.TIP_OF_THE_DAY); } public void actionPerformed(ActionEvent e) { mainFrame.showTipOfTheDayDialog(); } } class PreferencesAction extends AbstractLilithAction { private static final long serialVersionUID = -3163817872447126174L; PreferencesAction(boolean toolbar) { super(LilithActionId.PREFERENCES, toolbar); } public void actionPerformed(ActionEvent e) { mainFrame.showPreferencesDialog(); } } class ShowLoveAction extends AbstractLilithAction { private static final long serialVersionUID = -3947801116776349469L; ShowLoveAction(boolean toolbar) { super(LilithActionId.LOVE, toolbar); } public void actionPerformed(ActionEvent e) { mainFrame.openHelp("love.xhtml"); } } class DebugAction extends AbstractLilithAction { private static final long serialVersionUID = -8094926165037948097L; DebugAction() { super(LilithActionId.DEBUG); } public void actionPerformed(ActionEvent e) { mainFrame.showDebugDialog(); } } class ExitMenuAction extends AbstractLilithAction { private static final long serialVersionUID = -2089144337780503904L; ExitMenuAction() { super(LilithActionId.EXIT); } public void actionPerformed(ActionEvent e) { mainFrame.exit(); } } class OpenInactiveLogMenuAction extends AbstractLilithAction { private static final long serialVersionUID = 2115685255203253178L; OpenInactiveLogMenuAction() { super(LilithActionId.OPEN_INACTIVE); } public void actionPerformed(ActionEvent e) { mainFrame.openInactiveLogs(); } } class OpenMenuAction extends AbstractLilithAction { private static final long serialVersionUID = 8743907596320539587L; OpenMenuAction() { super(LilithActionId.OPEN); } public void actionPerformed(ActionEvent e) { mainFrame.open(); } } class ImportMenuAction extends AbstractLilithAction { private static final long serialVersionUID = -6465137339088031499L; ImportMenuAction() { super(LilithActionId.IMPORT); } public void actionPerformed(ActionEvent e) { mainFrame.importFile(); } } class ExportMenuAction extends AbstractLilithAction { private static final long serialVersionUID = 2447331397548766700L; private EventWrapperViewPanel view; ExportMenuAction() { super(LilithActionId.EXPORT); } public void actionPerformed(ActionEvent e) { mainFrame.exportFile(view); } public void setView(EventWrapperViewPanel eventWrapperViewPanel) { this.view=eventWrapperViewPanel; setEnabled(view != null); } } class CleanAllInactiveLogsMenuAction extends AbstractLilithAction { private static final long serialVersionUID = 626049491764655228L; CleanAllInactiveLogsMenuAction() { super(LilithActionId.CLEAN_ALL_INACTIVE_LOGS); } public void actionPerformed(ActionEvent e) { if(logger.isInfoEnabled()) logger.info("Clean all inactive logs"); mainFrame.cleanAllInactiveLogs(); } } private boolean hasMultipleViews() { return viewContainer != null && viewContainer.getViewCount() > 1; } private class PreviousViewAction extends AbstractLilithAction { private static final long serialVersionUID = -8929161486658826998L; PreviousViewAction() { super(LilithActionId.PREVIOUS_VIEW); } void updateAction() { setEnabled(hasMultipleViews()); } public void actionPerformed(ActionEvent e) { previousTab(); } } private class NextViewAction extends AbstractLilithAction { private static final long serialVersionUID = -6274063652679458643L; NextViewAction() { super(LilithActionId.NEXT_VIEW); } void updateAction() { setEnabled(hasMultipleViews()); } public void actionPerformed(ActionEvent e) { nextTab(); } } private class CopySelectionAction extends AbstractLilithAction { private static final long serialVersionUID = -349395646886330659L; private EventWrapperViewPanel view; CopySelectionAction() { super(LilithActionId.COPY_SELECTION); setView(null); } public void actionPerformed(ActionEvent e) { if(view != null) { view.copySelection(); } } public void setView(EventWrapperViewPanel view) { this.view = view; setEnabled(view != null); } } private class PasteStackTraceElementAction extends AbstractLilithAction { private static final long serialVersionUID = 2254657459692349413L; private final Logger logger = LoggerFactory.getLogger(PasteStackTraceElementAction.class); private Clipboard clipboard; private PasteStackTraceElementAction() { super(LilithActionId.PASTE_STACK_TRACE_ELEMENT); boolean enable = true; try { Toolkit toolkit = Toolkit.getDefaultToolkit(); clipboard = toolkit.getSystemClipboard(); } catch(AWTError | HeadlessException | SecurityException ex) { enable = false; } setEnabled(enable); } @Override public void actionPerformed(ActionEvent e) { if(clipboard == null) { return; } try { Transferable transferable = clipboard.getContents(null /*unused*/); if(transferable == null) { return; } DataFlavor[] dataFlavors = transferable.getTransferDataFlavors(); if(logger.isDebugEnabled()) logger.debug("DataFlavors on clipboard: {}", (Object)dataFlavors); DataFlavor bestTextFlavor = DataFlavor.selectBestTextFlavor(dataFlavors); if(logger.isDebugEnabled()) logger.debug("bestTextFlavor from clipboard: {}", bestTextFlavor); if(bestTextFlavor == null) { // no text on clipboard return; } try(BufferedReader reader = new BufferedReader(bestTextFlavor.getReaderForText(transferable))) { reader.lines() .map(CallLocationCondition::parseStackTraceElement) .filter(Objects::nonNull) .findFirst() .ifPresent(mainFrame::goToSource); } } catch(Throwable ex) { if(logger.isWarnEnabled()) logger.warn("Exception while obtaining StackTraceElement from clipboard!", ex); } } } private static class CopyToClipboardAction extends AbstractAction { private static final long serialVersionUID = 7832452126107208925L; private final Logger logger = LoggerFactory.getLogger(CopyToClipboardAction.class); private ClipboardFormatter clipboardFormatter; private transient EventWrapper wrapper; private CopyToClipboardAction(ClipboardFormatter clipboardFormatter) { setClipboardFormatter(clipboardFormatter); setEventWrapper(null); } ClipboardFormatter getClipboardFormatter() { return clipboardFormatter; } void setClipboardFormatter(ClipboardFormatter clipboardFormatter) { if(clipboardFormatter == null) { throw new IllegalArgumentException("clipboardFormatter must not be null!"); } this.clipboardFormatter = clipboardFormatter; putValue(Action.NAME, clipboardFormatter.getName()); putValue(Action.SHORT_DESCRIPTION, clipboardFormatter.getDescription()); putValue(Action.MNEMONIC_KEY, clipboardFormatter.getMnemonic()); String acc = clipboardFormatter.getAccelerator(); if(acc != null) { KeyStroke accelerator= KeyStrokes.resolveAcceleratorKeyStroke(acc); if(logger.isDebugEnabled()) logger.debug("accelerator for '{}': {}", acc, accelerator); if(accelerator != null) { putValue(Action.ACCELERATOR_KEY, accelerator); } else { if(logger.isWarnEnabled()) logger.warn("'{}' did not represent a valid KeyStroke!", acc); } } } public void setEventWrapper(EventWrapper wrapper) { if(clipboardFormatter == null) { throw new IllegalStateException("clipboardFormatter must not be null!"); } setEnabled(clipboardFormatter.isCompatible(wrapper)); this.wrapper = wrapper; } public void actionPerformed(ActionEvent e) { if(clipboardFormatter == null) { throw new IllegalStateException("clipboardFormatter must not be null!"); } String text = clipboardFormatter.toString(this.wrapper); if(text != null) { MainFrame.copyText(text); } } } private class ShowUnfilteredEventAction extends AbstractLilithAction { private static final long serialVersionUID = 1802581771634584229L; ShowUnfilteredEventAction() { super(LilithActionId.SHOW_UNFILTERED_EVENT); } public void actionPerformed(ActionEvent e) { showUnfilteredEvent(); } } private class GoToSourceAction extends AbstractLilithAction { private static final long serialVersionUID = -877335742021967857L; private StackTraceElement stackTraceElement; GoToSourceAction() { super(LilithActionId.GO_TO_SOURCE); setEventWrapper(null); } public void setEventWrapper(EventWrapper wrapper) { if(wrapper == null) { setExtendedStackTraceElement(null); return; } Serializable event = wrapper.getEvent(); if(event instanceof LoggingEvent) { LoggingEvent loggingEvent = (LoggingEvent) event; ExtendedStackTraceElement[] callStack = loggingEvent.getCallStack(); if(callStack != null && callStack.length > 0) { setExtendedStackTraceElement(callStack[0]); return; } } setExtendedStackTraceElement(null); } private void setExtendedStackTraceElement(ExtendedStackTraceElement extendedStackTraceElement) { if(extendedStackTraceElement == null) { this.stackTraceElement = null; } else { this.stackTraceElement = extendedStackTraceElement.getStackTraceElement(); } setEnabled(this.stackTraceElement != null); } public void actionPerformed(ActionEvent e) { mainFrame.goToSource(stackTraceElement); } } private static class ShowHideAction extends AbstractAction { private static final long serialVersionUID = 7775753128032553866L; private boolean visible; private String columnName; private PersistentTableColumnModel tableColumnModel; ShowHideAction(PersistentTableColumnModel tableColumnModel, String columnName, boolean visible) { super(columnName); this.columnName = columnName; this.visible = visible; this.tableColumnModel = tableColumnModel; //putValue(ViewActions.SELECTED_KEY, visible); // selection must be set manually } public void actionPerformed(ActionEvent e) { visible = !visible; Iterator<TableColumn> iter = tableColumnModel.getColumns(false); TableColumn found = null; while(iter.hasNext()) { TableColumn current = iter.next(); if(columnName.equals(current.getIdentifier())) { found = current; break; } } if(found != null) { tableColumnModel.setColumnVisible(found, visible); } } } private static class CopyToClipboardByNameComparator implements Comparator<CopyToClipboardAction> { static final CopyToClipboardByNameComparator INSTANCE = new CopyToClipboardByNameComparator(); public int compare(CopyToClipboardAction o1, CopyToClipboardAction o2) { if(o1 == o2) { return 0; } if(o1 == null) { return -1; } if(o2 == null) { return 1; } ClipboardFormatter f1 = o1.getClipboardFormatter(); ClipboardFormatter f2 = o2.getClipboardFormatter(); if(f1 == f2) { return 0; } if(f1 == null) { return -1; } if(f2 == null) { return 1; } String n1 = f1.getName(); String n2 = f2.getName(); //noinspection StringEquality if(n1 == n2) { return 0; } if(n1 == null) { return -1; } if(n2 == null) { return 1; } return n1.compareTo(n2); } } private static class EggListener implements KeyEventDispatcher { private final Logger logger = LoggerFactory.getLogger(EggListener.class); private int step = 0; public boolean dispatchKeyEvent(KeyEvent e) { if (e.getID() == KeyEvent.KEY_RELEASED) { if ((this.step == 2 || this.step == 3) && e.getKeyCode() == KeyEvent.VK_DOWN) { step++; } else if ((this.step == 4 || this.step == 6) && e.getKeyCode() == KeyEvent.VK_LEFT) { step++; } else if ((this.step == 5 || this.step == 7) && e.getKeyCode() == KeyEvent.VK_RIGHT) { step++; } else if (this.step == 8 && e.getKeyCode() == KeyEvent.VK_B) { step++; } else if (this.step == 9 && e.getKeyCode() == KeyEvent.VK_A) { step=0; try { MainFrame.openUrl(new URL("http://z0r.de")); // I could have used http://z0r.de/1148 - so don't complain. if(logger.isInfoEnabled()) logger.info("Yay!"); } catch (MalformedURLException ex) { if(logger.isWarnEnabled()) logger.warn("lolwut?", ex); } } else if ((this.step == 0 || this.step == 1) && e.getKeyCode() == KeyEvent.VK_UP) { step++; } else if (e.getKeyCode() == KeyEvent.VK_UP) { if(step != 2) { step=1; } } else { step = 0; } } return false; } } @SuppressWarnings("unchecked") private static EventWrapper<LoggingEvent> asLoggingEventWrapper(EventWrapper original) { if(original == null) { return null; } Serializable wrapped = original.getEvent(); if(wrapped instanceof LoggingEvent) { return (EventWrapper<LoggingEvent>) original; } return null; } @SuppressWarnings("unchecked") private static EventWrapper<AccessEvent> asAccessEventWrapper(EventWrapper original) { if(original == null) { return null; } Serializable wrapped = original.getEvent(); if(wrapped instanceof AccessEvent) { return (EventWrapper<AccessEvent>) original; } return null; } }