blob: ac3691544c7ce64144bacb3dc9e5155079c5f7a1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.profiler;
import org.netbeans.lib.profiler.global.CommonConstants;
import org.openide.util.NbBundle;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import javax.swing.*;
import org.netbeans.lib.profiler.ProfilerLogger;
import org.netbeans.lib.profiler.client.ClientUtils;
import org.netbeans.lib.profiler.filters.GenericFilter;
import org.netbeans.lib.profiler.results.ResultsSnapshot;
import org.netbeans.lib.profiler.results.cpu.CPUResultsSnapshot;
import org.netbeans.lib.profiler.results.jdbc.JdbcResultsSnapshot;
import org.netbeans.lib.profiler.results.memory.MemoryResultsSnapshot;
import org.netbeans.lib.profiler.ui.components.HTMLTextArea;
import org.netbeans.lib.profiler.ui.cpu.SnapshotCPUView;
import org.netbeans.lib.profiler.ui.jdbc.SnapshotJDBCView;
import org.netbeans.lib.profiler.ui.memory.SnapshotMemoryView;
import org.netbeans.lib.profiler.ui.swing.ExportUtils;
import org.netbeans.lib.profiler.ui.swing.SearchUtils;
import org.netbeans.lib.profiler.utils.Wildcards;
import org.netbeans.modules.profiler.actions.CompareSnapshotsAction;
import org.netbeans.modules.profiler.api.ActionsSupport;
import org.netbeans.modules.profiler.api.GoToSource;
import org.netbeans.modules.profiler.api.icons.Icons;
import org.netbeans.modules.profiler.api.ProfilerDialogs;
import org.netbeans.modules.profiler.api.ProfilerIDESettings;
import org.netbeans.modules.profiler.api.icons.ProfilerIcons;
import org.netbeans.modules.profiler.v2.ProfilerFeature;
import org.netbeans.modules.profiler.v2.ProfilerSession;
import org.netbeans.spi.actions.AbstractSavable;
import org.openide.DialogDescriptor;
import org.openide.DialogDisplayer;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.util.Exceptions;
import org.openide.util.HelpCtx;
import org.openide.util.Lookup;
import org.openide.util.RequestProcessor;
import org.openide.util.Utilities;
import org.openide.util.lookup.AbstractLookup;
import org.openide.util.lookup.InstanceContent;
import org.openide.util.lookup.Lookups;
import org.openide.util.lookup.ServiceProvider;
/**
* An IDE TopComponent to display a snapshot of profiling results.
*
* @author Tomas Hurka
* @author Ian Formanek
*/
@NbBundle.Messages({
"SnapshotResultsWindow_LoadingProgress=Loading profiler snapshot...",
"SnapshotResultsWindow_SaveSnapshotDialogMsg=The results snapshot is not saved. Do you want to save it?",
"SnapshotResultsWindow_CpuSnapshotAccessDescr=Profiler snapshot with CPU results",
"SnapshotResultsWindow_FragmentSnapshotAccessDescr=Profiler snapshot with code fragment results",
"SnapshotResultsWindow_MemorySnapshotAccessDescr=Profiler snapshot with memory results",
"SnapshotResultsWindow_ProfileClass=Profile Class",
"SnapshotResultsWindow_ProfileMethod=Profile Method",
"SnapshotResultsWindow_SqlQueryCaption=SQL Query Viewer",
"SnapshotResultsWindow_SqlQueryLabel=SQL Query:"
})
public final class SnapshotResultsWindow extends ProfilerTopComponent {
//~ Inner Interfaces ---------------------------------------------------------------------------------------------------------
/*
* The following code is an externalization of various listeners registered
* in the global lookup and needing access to an enclosing instance of
* SnapshotResultsWindow.
*/
@ServiceProvider(service=SnapshotsListener.class)
public static class SnapshotListener implements SnapshotsListener {
java.util.List<SnapshotResultsWindow> registeredWindows;
void registerSnapshotResultsWindow(SnapshotResultsWindow w) {
assert SwingUtilities.isEventDispatchThread();
if (registeredWindows == null) {
registeredWindows = new ArrayList();
}
registeredWindows.add(w);
}
void unregisterSnapshotResultsWindow(SnapshotResultsWindow w) {
assert SwingUtilities.isEventDispatchThread();
if (registeredWindows != null) {
registeredWindows.remove(w);
}
}
@Override
public void snapshotLoaded(LoadedSnapshot snapshot) {
// ignore
}
@Override
public void snapshotRemoved(LoadedSnapshot snapshot) {
// ignore
}
@Override
public void snapshotSaved(LoadedSnapshot snapshot) {
assert SwingUtilities.isEventDispatchThread();
if (registeredWindows != null) {
for (SnapshotResultsWindow w : registeredWindows) {
if (w.snapshot == snapshot) {
w.updateSaveState();
}
}
}
}
@Override
public void snapshotTaken(LoadedSnapshot snapshot) {
// ignore
}
}
public static interface FindPerformer {
//~ Methods --------------------------------------------------------------------------------------------------------------
public void performFind();
public void performFindNext();
public void performFindPrevious();
}
//~ Inner Classes ------------------------------------------------------------------------------------------------------------
private class SavePerformer extends AbstractSavable {
//~ Methods --------------------------------------------------------------------------------------------------------------
private void add() {
register();
ic.add(this);
}
private void remove() {
unregister();
ic.remove(this);
}
@Override
protected String findDisplayName() {
return tabName;
}
@Override
protected void handleSave() {
LoadedSnapshot toSave = snapshot;
if (toSave == null) return; // #218565 snapshot already closed
ResultsManager.getDefault().saveSnapshot(toSave);
ic.remove(this);
}
@Override
public boolean equals(Object obj) {
return this == obj;
}
@Override
public int hashCode() {
return System.identityHashCode(this);
}
}
//~ Static fields/initializers -----------------------------------------------------------------------------------------------
private static final byte PERSISTENCE_VERSION_MAJOR = 8;
private static final byte PERSISTENCE_VERSION_MINOR = 1;
private static final String HELP_CTX_KEY_CPU = "CpuSnapshot.HelpCtx"; // NOI18N
private static final String HELP_CTX_KEY_MEM = "MemorySnapshot.HelpCtx"; // NOI18N
private static final Image WINDOW_ICON_CPU = Icons.getImage(ProfilerIcons.CPU);
private static final Image WINDOW_ICON_FRAGMENT = Icons.getImage(ProfilerIcons.FRAGMENT);
private static final Image WINDOW_ICON_MEMORY = Icons.getImage(ProfilerIcons.MEMORY);
private static final Image WINDOW_ICON_JDBC = Icons.getImage(ProfilerIcons.WINDOW_SQL);
private static final HashMap /*<ResultsSnapshot, SnapshotResultsWindow>*/ windowsList = new HashMap();
//~ Instance fields ----------------------------------------------------------------------------------------------------------
private LoadedSnapshot snapshot;
private InstanceContent ic = new InstanceContent();
private SavePerformer savePerformer = new SavePerformer();
private JPanel displayedPanel;
private String tabName = ""; // NOI18N // default
private SnapshotListener listener;
private boolean forcedClose = false;
private HelpCtx helpCtx = HelpCtx.DEFAULT_HELP;
//~ Constructors -------------------------------------------------------------------------------------------------------------
/**
* Default constructor, used when restoring persisted snapshots.
*/
public SnapshotResultsWindow() {
associateLookup(new AbstractLookup(ic));
ic.add(getActionMap());
setLayout(new BorderLayout());
}
/**
* Creates a new SnapshotResultsWindow for provided snapshot. The content of this window will vary depending on
* the type of snapshot provided.
*
* @param ls The results snapshot to display
*/
public SnapshotResultsWindow(LoadedSnapshot ls, int sortingColumn, boolean sortingOrder) {
this();
initImpl(ls);
}
private void initImpl(LoadedSnapshot ls) {
this.snapshot = ls;
updateSaveState();
setFocusable(true);
setRequestFocusEnabled(true);
refreshTabName();
switch (snapshot.getType()) {
case LoadedSnapshot.SNAPSHOT_TYPE_CPU:
setIcon(WINDOW_ICON_CPU);
helpCtx = new HelpCtx(HELP_CTX_KEY_CPU);
getAccessibleContext().setAccessibleDescription(Bundle.SnapshotResultsWindow_CpuSnapshotAccessDescr());
setupCPUResultsView();
break;
// case LoadedSnapshot.SNAPSHOT_TYPE_CODEFRAGMENT:
// getAccessibleContext().setAccessibleDescription(Bundle.SnapshotResultsWindow_FragmentSnapshotAccessDescr());
// displayCodeRegionResults(ls);
//
// break;
case LoadedSnapshot.SNAPSHOT_TYPE_MEMORY_ALLOCATIONS:
case LoadedSnapshot.SNAPSHOT_TYPE_MEMORY_LIVENESS:
case LoadedSnapshot.SNAPSHOT_TYPE_MEMORY_SAMPLED:
setIcon(WINDOW_ICON_MEMORY);
helpCtx = new HelpCtx(HELP_CTX_KEY_MEM);
getAccessibleContext().setAccessibleDescription(Bundle.SnapshotResultsWindow_MemorySnapshotAccessDescr());
setupMemoryResultsView();
break;
case LoadedSnapshot.SNAPSHOT_TYPE_CPU_JDBC:
setIcon(WINDOW_ICON_JDBC);
helpCtx = new HelpCtx(HELP_CTX_KEY_CPU);
getAccessibleContext().setAccessibleDescription(Bundle.SnapshotResultsWindow_CpuSnapshotAccessDescr());
setupJDBCResultsView();
break;
}
if (displayedPanel != null) {
add(displayedPanel, BorderLayout.CENTER);
invalidate();
doLayout();
repaint();
}
listener = Lookup.getDefault().lookup(SnapshotListener.class);
listener.registerSnapshotResultsWindow(this);
}
//~ Methods ------------------------------------------------------------------------------------------------------------------
public static synchronized void closeAllWindows() {
Collection windows = windowsList.values();
if (!windows.isEmpty()) {
SnapshotResultsWindow[] toClose = (SnapshotResultsWindow[])windows.toArray(new SnapshotResultsWindow[0]);
for (int i = 0; i < toClose.length; i++) {
SnapshotResultsWindow snapshotResultsWindow = toClose[i];
snapshotResultsWindow.forcedClose();
}
}
}
public static synchronized void closeWindow(LoadedSnapshot snapshot) {
SnapshotResultsWindow win = (SnapshotResultsWindow) windowsList.get(snapshot);
if (win != null) {
win.forcedClose();
}
}
public static synchronized SnapshotResultsWindow get(LoadedSnapshot ls) {
// target component decides which column will be used for sorting
return SnapshotResultsWindow.get(ls, CommonConstants.SORTING_COLUMN_DEFAULT, false);
}
public static synchronized SnapshotResultsWindow get(LoadedSnapshot ls, int sortingColumn, boolean sortingOrder) {
SnapshotResultsWindow win = (SnapshotResultsWindow) windowsList.get(ls);
if (win == null) {
win = new SnapshotResultsWindow(ls, sortingColumn, sortingOrder);
windowsList.put(ls, win);
}
return win;
}
public static synchronized boolean hasSnapshotWindow(LoadedSnapshot ls) {
return windowsList.get(ls) != null;
}
public void writeExternal(ObjectOutput out) throws IOException {
super.writeExternal(out);
out.writeByte(PERSISTENCE_VERSION_MAJOR);
out.writeByte(PERSISTENCE_VERSION_MINOR);
out.writeUTF(Utilities.toURI(snapshot.getFile()).toString());
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
try {
add(new JLabel(Bundle.SnapshotResultsWindow_LoadingProgress(), JLabel.CENTER), BorderLayout.CENTER);
invalidate();
doLayout();
repaint();
super.readExternal(in);
in.readByte(); // PERSISTENCE_VERSION_MAJOR
in.readByte(); // PERSISTENCE_VERSION_MINOR
URI uri = new URI(in.readUTF());
final File file = Utilities.toFile(uri);
new RequestProcessor("NPS loader for " + getName()).post(new Runnable() { // NOI18N
public void run() {
try {
FileObject fileo = FileUtil.toFileObject(file);
final LoadedSnapshot ls = ResultsManager.getDefault().loadSnapshot(fileo);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
removeAll();
initImpl(ls);
}
});
} catch (Throwable t) { handleReadThrowable(t); }
}
});
} catch (Throwable t) { handleReadThrowable(t); }
}
private void handleReadThrowable(Throwable t) {
ProfilerLogger.info("Restoring profiler snapshot failed: " + t.getMessage()); // NOI18N
SwingUtilities.invokeLater(new Runnable() {
public void run() { close(); }
});
}
public int getPersistenceType() {
return ProfilerIDESettings.getInstance().getReopenSnapshots() ?
PERSISTENCE_ONLY_OPENED : PERSISTENCE_NEVER;
}
public HelpCtx getHelpCtx() {
return helpCtx;
}
public boolean canClose() {
if (snapshot == null) return true; // Close window when persistence fails
// #221709, add saved snapshot to Open Recent File list
// Not supported for new snapshots to be saved on close
File file = snapshot.getFile();
if (file != null) putClientProperty(RECENT_FILE_KEY, file);
if (forcedClose) {
savePerformer.remove();
return true;
}
if (snapshot.isSaved()) {
return true; // already saved
}
Boolean ret = ProfilerDialogs.displayCancellableConfirmationDNSA(Bundle.SnapshotResultsWindow_SaveSnapshotDialogMsg(),
null, null, "org.netbeans.modules.profiler.SnapshotResultsWindow.canClose", false); // NOI18N
if (Boolean.TRUE.equals(ret)) {
try {
savePerformer.save();
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
return true;
} else if (Boolean.FALSE.equals(ret)) {
// clean up to avoid being held in memory
savePerformer.remove();
return true;
} else {
return false;
}
}
protected Component defaultFocusOwner() {
return displayedPanel == null ? this : displayedPanel;
}
public void refreshTabName() {
tabName = ResultsManager.getDefault().getSnapshotDisplayName(snapshot);
File snapshotFile = snapshot.getFile();
if (snapshotFile != null) setToolTipText(snapshotFile.getAbsolutePath());
updateTitle();
}
public void updateTitle() {
if (snapshot.isSaved()) {
setName(tabName);
} else {
// XXX consider using DataEditorSupport.annotateName
setName(tabName + " *"); // NOI18N
}
// Called when snapshot is saved, update also tooltip
if (snapshot.getFile() != null)
setToolTipText(snapshot.getFile().getAbsolutePath());
}
protected void componentClosed() {
if (snapshot == null) return; // Window closed after persistence failure
synchronized (SnapshotResultsWindow.class) {
windowsList.remove(snapshot);
}
ResultsManager.getDefault().closeSnapshot(snapshot);
snapshot = null;
listener.unregisterSnapshotResultsWindow(this);
}
protected String preferredID() {
return this.getClass().getName();
}
// -------------------------------------------------------------------------
// --- Internal "API" ------------------------------------------------------
boolean setRefSnapshot(LoadedSnapshot ls) {
ResultsSnapshot s = ls == null ? null : ls.getSnapshot();
if (displayedPanel instanceof SnapshotCPUView && s instanceof CPUResultsSnapshot) {
((SnapshotCPUView)displayedPanel).setRefSnapshot((CPUResultsSnapshot)s);
return true;
} else if (displayedPanel instanceof SnapshotMemoryView && s instanceof MemoryResultsSnapshot) {
((SnapshotMemoryView)displayedPanel).setRefSnapshot((MemoryResultsSnapshot)s);
return true;
} else if (displayedPanel instanceof SnapshotJDBCView && s instanceof JdbcResultsSnapshot) {
((SnapshotJDBCView)displayedPanel).setRefSnapshot((JdbcResultsSnapshot)s);
return true;
}
return false;
}
// -- Private methods --------------------------------------------------------------------------------------------------
private void setupCPUResultsView() {
ResultsSnapshot _snapshot = snapshot.getSnapshot();
if (_snapshot instanceof CPUResultsSnapshot) {
CPUResultsSnapshot s = (CPUResultsSnapshot)_snapshot;
boolean sampling = snapshot.getSettings().getCPUProfilingType() == CommonConstants.CPU_SAMPLED;
SaveSnapshotAction aSave = new SaveSnapshotAction(snapshot);
CompareSnapshotsAction aCompare = new CompareSnapshotsAction(snapshot);
SnapshotInfoAction aInfo = new SnapshotInfoAction(snapshot);
ExportUtils.Exportable exporter = ResultsManager.getDefault().createSnapshotExporter(snapshot);
final SnapshotCPUView _cpuSnapshot = new SnapshotCPUView(s, sampling, aSave, aCompare, aInfo, exporter) {
protected boolean showSourceSupported() {
return GoToSource.isAvailable();
}
protected boolean profileMethodSupported() {
return ProfilerFeature.Registry.hasProviders();
}
protected boolean profileClassSupported() {
return ProfilerFeature.Registry.hasProviders();
}
protected void showSource(ClientUtils.SourceCodeSelection value) {
Lookup.Provider project = snapshot.getProject();
String className = value.getClassName();
String methodName = value.getMethodName();
String methodSig = value.getMethodSignature();
GoToSource.openSource(project, className, methodName, methodSig);
}
protected void selectForProfiling(final ClientUtils.SourceCodeSelection value) {
RequestProcessor.getDefault().post(new Runnable() {
public void run() {
Lookup.Provider project = snapshot.getProject();
String name = Wildcards.ALLWILDCARD.equals(value.getMethodName()) ?
Bundle.SnapshotResultsWindow_ProfileClass() :
Bundle.SnapshotResultsWindow_ProfileMethod();
ProfilerSession.findAndConfigure(Lookups.fixed(value), project, name);
}
});
}
};
aCompare.setPerformer(new CompareSnapshotsAction.Performer() {
public void compare(LoadedSnapshot snapshot) {
_cpuSnapshot.setRefSnapshot((CPUResultsSnapshot)snapshot.getSnapshot());
}
});
registerActions(_cpuSnapshot);
displayedPanel = _cpuSnapshot;
}
}
// private void displayCodeRegionResults(LoadedSnapshot ls) {
// FragmentSnapshotPanel codeRegionPanel = new FragmentSnapshotPanel(ls);
// displayedPanel = codeRegionPanel;
// add(codeRegionPanel, BorderLayout.CENTER);
// setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
// setIcon(WINDOWS_ICON_FRAGMENT);
// }
private void setupMemoryResultsView() {
ResultsSnapshot _snapshot = snapshot.getSnapshot();
if (_snapshot instanceof MemoryResultsSnapshot) {
GenericFilter filter = snapshot.getSettings().getInstrumentationFilter();
if (filter != null && filter.isEmpty()) filter = null;
MemoryResultsSnapshot s = (MemoryResultsSnapshot)_snapshot;
SaveSnapshotAction aSave = new SaveSnapshotAction(snapshot);
CompareSnapshotsAction aCompare = new CompareSnapshotsAction(snapshot);
SnapshotInfoAction aInfo = new SnapshotInfoAction(snapshot);
ExportUtils.Exportable exporter = ResultsManager.getDefault().createSnapshotExporter(snapshot);
final SnapshotMemoryView _memorySnapshot = new SnapshotMemoryView(s, filter, aSave, aCompare, aInfo, exporter) {
protected boolean showSourceSupported() {
return GoToSource.isAvailable();
}
protected boolean profileMethodSupported() {
return ProfilerFeature.Registry.hasProviders();
}
protected boolean profileClassSupported() {
return ProfilerFeature.Registry.hasProviders();
}
protected void showSource(ClientUtils.SourceCodeSelection value) {
Lookup.Provider project = snapshot.getProject();
String className = value.getClassName();
String methodName = value.getMethodName();
String methodSig = value.getMethodSignature();
GoToSource.openSource(project, className, methodName, methodSig);
}
protected void selectForProfiling(final ClientUtils.SourceCodeSelection value) {
RequestProcessor.getDefault().post(new Runnable() {
public void run() {
Lookup.Provider project = snapshot.getProject();
ProfilerSession.findAndConfigure(Lookups.fixed(value), project, Bundle.SnapshotResultsWindow_ProfileClass());
}
});
}
};
aCompare.setPerformer(new CompareSnapshotsAction.Performer() {
public void compare(LoadedSnapshot snapshot) {
_memorySnapshot.setRefSnapshot((MemoryResultsSnapshot)snapshot.getSnapshot());
}
});
registerActions(_memorySnapshot);
displayedPanel = _memorySnapshot;
}
}
private void setupJDBCResultsView() {
ResultsSnapshot _snapshot = snapshot.getSnapshot();
if (_snapshot instanceof JdbcResultsSnapshot) {
JdbcResultsSnapshot s = (JdbcResultsSnapshot)_snapshot;
SaveSnapshotAction aSave = new SaveSnapshotAction(snapshot);
CompareSnapshotsAction aCompare = new CompareSnapshotsAction(snapshot);
SnapshotInfoAction aInfo = new SnapshotInfoAction(snapshot);
ExportUtils.Exportable exporter = ResultsManager.getDefault().createSnapshotExporter(snapshot);
final SnapshotJDBCView _jdbcSnapshot = new SnapshotJDBCView(s, aSave, aCompare, aInfo, exporter) {
protected boolean showSourceSupported() {
return GoToSource.isAvailable();
}
protected void showSource(ClientUtils.SourceCodeSelection value) {
Lookup.Provider project = snapshot.getProject();
String className = value.getClassName();
String methodName = value.getMethodName();
String methodSig = value.getMethodSignature();
GoToSource.openSource(project, className, methodName, methodSig);
}
protected void showSQLQuery(String query, String htmlQuery) {
HTMLTextArea area = new HTMLTextArea(htmlQuery);
JScrollPane areaScroll = new JScrollPane(area);
areaScroll.setPreferredSize(new Dimension(500, 250));
JLabel label = new JLabel(Bundle.SnapshotResultsWindow_SqlQueryLabel(), JLabel.LEADING);
label.setBorder(BorderFactory.createEmptyBorder(0, 0, 3, 0));
label.setLabelFor(area);
JPanel panel = new JPanel(new BorderLayout());
panel.add(label, BorderLayout.NORTH);
panel.add(areaScroll, BorderLayout.CENTER);
panel.setBorder(BorderFactory.createEmptyBorder(12, 10, 0, 10));
HelpCtx help = new HelpCtx("SqlQueryViewer.HelpCtx"); // NOI18N
DialogDisplayer.getDefault().notify(new DialogDescriptor(panel,
Bundle.SnapshotResultsWindow_SqlQueryCaption(), false,
new Object[] { DialogDescriptor.CLOSED_OPTION },
DialogDescriptor.CLOSED_OPTION, DialogDescriptor.BOTTOM_ALIGN, help, null));
}
protected void selectForProfiling(final ClientUtils.SourceCodeSelection value) {
RequestProcessor.getDefault().post(new Runnable() {
public void run() {
Lookup.Provider project = snapshot.getProject();
String name = Wildcards.ALLWILDCARD.equals(value.getMethodName()) ?
Bundle.SnapshotResultsWindow_ProfileClass() :
Bundle.SnapshotResultsWindow_ProfileMethod();
ProfilerSession.findAndConfigure(Lookups.fixed(value), project, name);
}
});
}
};
aCompare.setPerformer(new CompareSnapshotsAction.Performer() {
public void compare(LoadedSnapshot snapshot) {
_jdbcSnapshot.setRefSnapshot((JdbcResultsSnapshot)snapshot.getSnapshot());
}
});
registerActions(_jdbcSnapshot);
displayedPanel = _jdbcSnapshot;
}
}
private void forcedClose() {
forcedClose = true;
close();
}
private void registerActions(final JComponent view) {
InputMap inputMap = getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap actionMap = getActionMap();
final String filterKey = org.netbeans.lib.profiler.ui.swing.FilterUtils.FILTER_ACTION_KEY;
Action filterAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
Action action = view.getActionMap().get(filterKey);
if (action != null && action.isEnabled()) action.actionPerformed(e);
}
};
ActionsSupport.registerAction(filterKey, filterAction, actionMap, inputMap);
final String findKey = SearchUtils.FIND_ACTION_KEY;
Action findAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
Action action = view.getActionMap().get(findKey);
if (action != null && action.isEnabled()) action.actionPerformed(e);
}
};
ActionsSupport.registerAction(findKey, findAction, actionMap, inputMap);
}
private void updateSaveState() {
if (snapshot != null) { // snapshot == null means the window has been closed (#202992)
if (snapshot.isSaved()) {
savePerformer.remove();
} else {
savePerformer.add();
}
// if (displayedPanel != null) {
// displayedPanel.updateSavedState();
// }
} else {
// just to be sure
savePerformer.remove();
}
}
}