All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.netbeans.modules.profiler.v2.ProfilerWindow Maven / Gradle / Ivy

/*
 * 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.v2;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.KeyboardFocusManager;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.HierarchyEvent;
import java.awt.event.HierarchyListener;
import java.awt.event.ItemEvent;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleRole;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.BorderFactory;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.netbeans.lib.profiler.common.AttachSettings;
import org.netbeans.lib.profiler.common.Profiler;
import org.netbeans.lib.profiler.common.ProfilingSettings;
import org.netbeans.lib.profiler.common.event.SimpleProfilingStateAdapter;
import org.netbeans.lib.profiler.ui.UIUtils;
import org.netbeans.lib.profiler.ui.components.ProfilerToolbar;
import org.netbeans.lib.profiler.ui.swing.GrayLabel;
import org.netbeans.lib.profiler.ui.swing.PopupButton;
import org.netbeans.lib.profiler.ui.swing.ProfilerPopup;
import org.netbeans.lib.profiler.ui.swing.SearchUtils;
import org.netbeans.lib.profiler.ui.swing.StayOpenPopupMenu;
import org.netbeans.modules.profiler.ProfilerTopComponent;
import org.netbeans.modules.profiler.actions.HeapDumpAction;
import org.netbeans.modules.profiler.actions.RunGCAction;
import org.netbeans.modules.profiler.actions.TakeThreadDumpAction;
import org.netbeans.modules.profiler.api.ActionsSupport;
import org.netbeans.modules.profiler.api.ProfilerDialogs;
import org.netbeans.modules.profiler.api.ProfilerIDESettings;
import org.netbeans.modules.profiler.api.ProfilerStorage;
import org.netbeans.modules.profiler.api.ProjectUtilities;
import org.netbeans.modules.profiler.api.icons.GeneralIcons;
import org.netbeans.modules.profiler.api.icons.Icons;
import org.netbeans.modules.profiler.api.icons.ProfilerIcons;
import org.netbeans.modules.profiler.attach.AttachWizard;
import org.netbeans.modules.profiler.v2.impl.FeaturesView;
import org.netbeans.modules.profiler.v2.impl.ProfilerStatus;
import org.netbeans.modules.profiler.v2.impl.WelcomePanel;
import org.netbeans.modules.profiler.v2.ui.DropdownButton;
import org.netbeans.modules.profiler.v2.ui.ToggleButtonMenuItem;
import org.openide.filesystems.FileObject;
import org.openide.util.Exceptions;
import org.openide.util.HelpCtx;
import org.openide.util.Lookup;
import org.openide.util.NbBundle;
import org.openide.util.RequestProcessor;
import org.openide.windows.Mode;
import org.openide.windows.WindowManager;

/**
 *
 * @author Jiri Sedlacek
 */
@NbBundle.Messages({
    "ProfilerWindow_captionProject={0}",
    "ProfilerWindow_captionFile={0} | {1}",
    "ProfilerWindow_captionExternal=Profile External Process",
    "ProfilerWindow_configure=Configure Session",
    "ProfilerWindow_profile=Profile",
    "ProfilerWindow_attach=Attach",
    "ProfilerWindow_profileTooltip=Start profiling session",
    "ProfilerWindow_profileRunningTooltip=Start profiling session (already running)",
    "ProfilerWindow_configureTooltip=Configure profiling session",
    "ProfilerWindow_terminateCaption=Terminate Profiling Session",
    "ProfilerWindow_terminateMsg=Terminate profiling session?",
    "ProfilerWindow_loadingSession=Creating session...",
    "ProfilerWindow_settings=Settings",
    "ProfilerWindow_application=Process:",
    "ProfilerWindow_threadDump=Thread Dump",
    "ProfilerWindow_heapDump=Heap Dump",
    "ProfilerWindow_gc=GC",
    "ProfilerWindow_setupAttachProject=Setup Attach to Project...",
    "ProfilerWindow_setupAttachProcess=Setup Attach to Process...",
    "ProfilerWindow_multipleFeatures=Enable Multiple Modes",
    "ProfilerWindow_usePPoints=Use Defined Profiling Points",
    "ProfilerWindow_targetSection=Target:",
    "ProfilerWindow_profileSection=Profile:",
    "ProfilerWindow_settingsSection=Settings:",
    "ProfilerWindow_pluginsSection=Plugins:",
    "#NOI18N",
    "ProfilerWindow_mode=editor",
    "ProfilerWindow_noFeature=No profiling feature selected.

Please select at least one profiling feature for the session.", "ProfilerWindow_accessName=Profiler Window for {0}" }) class ProfilerWindow extends ProfilerTopComponent { // --- Constructor --------------------------------------------------------- private final ProfilerSession session; ProfilerWindow(ProfilerSession session) { this.session = session; updateWindowName(); updateWindowIcon(); createUI(); } // --- API ----------------------------------------------------------------- void updateSession() { updateWindowName(); if (start != null) start.setText(session.isAttach() ? Bundle.ProfilerWindow_attach() : Bundle.ProfilerWindow_profile()); } void selectFeature(ProfilerFeature feature) { if (featuresView != null) featuresView.selectFeature(feature); } // --- Implementation ------------------------------------------------------ private ProfilerFeatures features; private ProfilerPlugins plugins; private ProfilerToolbar toolbar; private ProfilerToolbar featureToolbar; private ProfilerToolbar applicationToolbar; // private ProfilerToolbar statusBar; private JPanel container; private FeaturesView featuresView; private PopupButton configure; private DropdownButton start; private JButton stop; private SettingsPresenter settingsButton; private AttachSettings attachSettings; private ProfilerStatus status; // private String preselectItem; private void createUI() { setLayout(new BorderLayout(0, 0)); setFocusable(false); toolbar = ProfilerToolbar.create(true); add(toolbar.getComponent(), BorderLayout.NORTH); final JLabel loading = new JLabel(Bundle.ProfilerWindow_loadingSession()); loading.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5)); toolbar.add(loading); RequestProcessor.getDefault().post(new Runnable() { public void run() { loadSessionSettings(); SwingUtilities.invokeLater(new Runnable() { public void run() { toolbar.remove(loading); popupulateUI(); } }); } }); } private void loadSessionSettings() { features = session.getFeatures(); plugins = session.getPlugins(); Properties p = new Properties(); try { ProfilerStorage.loadProjectProperties(p, session.getProject(), "attach"); // NOI18N } catch (IOException ex) { Exceptions.printStackTrace(ex); } if (!p.isEmpty()) { attachSettings = new AttachSettings(); attachSettings.load(p); } } private void popupulateUI() { configure = new PopupButton(Bundle.ProfilerWindow_configure()) { protected void displayPopup() { displayPopupImpl(); } }; configure.setToolTipText(Bundle.ProfilerWindow_configureTooltip()); if (UIUtils.isAquaLookAndFeel()) configure.putClientProperty("JComponent.sizeVariant", "regular"); // NOI18N toolbar.add(configure); String command = session.isAttach() ? Bundle.ProfilerWindow_attach() : Bundle.ProfilerWindow_profile(); start = new DropdownButton(command, Icons.getIcon(GeneralIcons.START), true) { public void displayPopup() { displayPopupImpl(); } protected void performAction() { performStartImpl(); } }; start.setToolTipText(Bundle.ProfilerWindow_profileTooltip()); start.setPushedToolTipText(Bundle.ProfilerWindow_profileRunningTooltip()); start.setPopupToolTipText(Bundle.ProfilerWindow_configureTooltip()); toolbar.add(start); stop = new JButton(ProfilerSessions.StopAction.getInstance()); stop.setHideActionText(true); toolbar.add(stop); // statusBar = new ProfilerStatus(session).getToolbar(); // statusBar.getComponent().setVisible(false); // TODO: read last state // toolbar.add(statusBar); toolbar.addFiller(); settingsButton = new SettingsPresenter(); toolbar.add(settingsButton); container = new JPanel(new BorderLayout(0, 0)); add(container, BorderLayout.CENTER); JPanel welcomePanel = new WelcomePanel(configure.getText(), start.getText(), features.getAvailable()) { public void highlightItem(final String text) { SwingUtilities.invokeLater(new Runnable() { public void run() { configure.doClick(85); } }); } }; boolean showHint = ProfilerIDESettings.getInstance().getShowNoDataHint(); featuresView = new FeaturesView(welcomePanel, showHint ? command : null); container.add(featuresView, BorderLayout.CENTER); features.addListener(new ProfilerFeatures.Listener() { void featuresChanged(ProfilerFeature changed) { updateFeatures(changed); } void settingsChanged(boolean valid) { updateSettings(valid); } }); updateFeatures(null); updateSettings(features.settingsValid()); featuresView.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { updateFeatureToolbar(); } }); updateFeatureToolbar(); session.addListener(new SimpleProfilingStateAdapter() { public void update() { updateWindowIcon(); updateButtons(); } }); updateButtons(); registerActions(); status = ProfilerStatus.forSession(session); addHierarchyListener(new HierarchyListener() { public void hierarchyChanged(HierarchyEvent e) { if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0) { if (isShowing()) status.startSessionLogging(); else status.stopSessionLogging(); } } }); if (isShowing()) status.startSessionLogging(); } private void registerActions() { 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) { ProfilerFeature feature = featuresView.getSelectedFeature(); JPanel resultsUI = feature == null ? null : feature.getResultsUI(); if (resultsUI == null) return; Action action = resultsUI.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) { ProfilerFeature feature = featuresView.getSelectedFeature(); JPanel resultsUI = feature == null ? null : feature.getResultsUI(); if (resultsUI == null) return; Action action = resultsUI.getActionMap().get(findKey); if (action != null && action.isEnabled()) action.actionPerformed(e); } }; ActionsSupport.registerAction(findKey, findAction, actionMap, inputMap); } private void updateWindowName() { Lookup.Provider project = session.getProject(); if (project == null) { setDisplayName(Bundle.ProfilerWindow_captionExternal()); } else { String projectN = ProjectUtilities.getDisplayName(project); FileObject file = session.getFile(); setDisplayName(file == null ? Bundle.ProfilerWindow_captionProject(projectN) : Bundle.ProfilerWindow_captionFile(projectN, file.getNameExt())); } } private void updateWindowIcon() { UIUtils.runInEventDispatchThread(new Runnable() { public void run() { if (session.inProgress()) setIcon(Icons.getImage(ProfilerIcons.PROFILE_RUNNING)); else setIcon(Icons.getImage(ProfilerIcons.PROFILE_INACTIVE)); } }); } private void updateButtons() { int state = session.getState(); start.setPushed(state != Profiler.PROFILING_INACTIVE); start.setPopupEnabled(state != Profiler.PROFILING_IN_TRANSITION); } private void updateFeatures(ProfilerFeature changed) { // TODO: optimize! // TODO: restore focused component if possible ProfilerFeature restore = featuresView.getSelectedFeature(); featuresView.removeFeatures(); Set selected = features.getActivated(); for (ProfilerFeature feature : selected) featuresView.addFeature(feature); if (changed != null && selected.contains(changed)) featuresView.selectFeature(changed); else featuresView.selectFeature(restore); featuresView.repaint(); } private void updateSettings(boolean valid) { start.setEnabled(valid); boolean _configure = features.getActivated().isEmpty(); start.setVisible(!_configure); stop.setVisible(!_configure); configure.setVisible(_configure); new Timer(0, null) { { setRepeats(false); setInitialDelay(50); } protected void fireActionPerformed(ActionEvent e) { updateFocus(); } }.start(); if (session.inProgress()) session.doModify(features.getSettings()); } private void updateFocus() { SwingUtilities.invokeLater(new Runnable() { public void run() { Component focused = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); // Do not change focus for these special cases: if (focused != null) { if (profilePopupVisible) return; // focus in the Profile popup if (ProfilerPopup.isInPopup(focused)) return; // focus in a profiler popup if (ProfilerWindow.this.isAncestorOf(focused)) return; // focus inside the ProfilerWindow } final Component foc = configure.isVisible() ? configure : start; SwingUtilities.invokeLater(new Runnable() { public void run() { foc.requestFocusInWindow(); } }); } }); } private void updateFeatureToolbar() { if (featureToolbar != null) toolbar.remove(featureToolbar); if (applicationToolbar != null) toolbar.remove(applicationToolbar); ProfilerFeature selected = featuresView.getSelectedFeature(); featureToolbar = selected == null ? null : selected.getToolbar(); if (featureToolbar != null) toolbar.add(featureToolbar, toolbar.getComponentCount() - 2); // add before filler & settingsButton settingsButton.setFeature(selected); if (selected != null) toolbar.add(getApplicationToolbar(), toolbar.getComponentCount() - 2); // add before filler & settingsButton else applicationToolbar = null; doLayout(); repaint(); } private ProfilerToolbar getApplicationToolbar() { if (applicationToolbar == null) { applicationToolbar = ProfilerToolbar.create(true); applicationToolbar.addSpace(2); applicationToolbar.addSeparator(); applicationToolbar.addSpace(5); JLabel apLabel = new GrayLabel(Bundle.ProfilerWindow_application()); applicationToolbar.add(apLabel); applicationToolbar.addSpace(2); JButton apThreadDumpButton = new JButton(TakeThreadDumpAction.getInstance()); apThreadDumpButton.setHideActionText(true); // apThreadDumpButton.setText(Bundle.ProfilerWindow_threadDump()); applicationToolbar.add(apThreadDumpButton); applicationToolbar.addSpace(3); JButton apHeapDumpButton = new JButton(HeapDumpAction.getInstance()); apHeapDumpButton.setHideActionText(true); // apHeapDumpButton.setText(Bundle.ProfilerWindow_heapDump()); applicationToolbar.add(apHeapDumpButton); applicationToolbar.addSpace(3); JButton apGCButton = new JButton(RunGCAction.getInstance()); apGCButton.setHideActionText(true); // apGCButton.setText(Bundle.ProfilerWindow_gc()); applicationToolbar.add(apGCButton); } return applicationToolbar; } private boolean configureAttachSettings(boolean partially) { AttachSettings settings = AttachWizard.getDefault().configure(attachSettings, partially); if (settings == null) return false; // cancelled by the user attachSettings = settings; final AttachSettings as = new AttachSettings(); attachSettings.copyInto(as); final Lookup.Provider lp = session.getProject(); RequestProcessor.getDefault().post(new Runnable() { public void run() { Properties p = new Properties(); as.store(p); try { ProfilerStorage.saveProjectProperties(p, lp, "attach"); // NOI18N } catch (IOException ex) { Exceptions.printStackTrace(ex); } } }); return true; } private void performStartImpl() { featuresView.resetNoDataHint(); start.setPushed(true); final ProfilingSettings _profilingSettings = features.getSettings(); if (_profilingSettings == null) { // #250237 ? ProfilerDialogs.displayError(Bundle.ProfilerWindow_noFeature()); start.setPushed(false); return; } if (session.isAttach()) { RequestProcessor.getDefault().post(new Runnable() { public void run() { if (AttachWizard.getDefault().configured(attachSettings)) { performDoStartImpl(_profilingSettings, attachSettings); } else { SwingUtilities.invokeLater(new Runnable() { public void run() { if (!configureAttachSettings(false)) start.setPushed(false); else performDoStartImpl(_profilingSettings, attachSettings); } }); } } }); } else { performDoStartImpl(_profilingSettings, null); } } private void performDoStartImpl(final ProfilingSettings ps, final AttachSettings as) { UIUtils.runInEventDispatchThread(new Runnable() { public void run() { if (!session.doStart(ps, as)) start.setPushed(false); } }); } // --- Profile/Attach popup ------------------------------------------------ private boolean profilePopupVisible; private void displayPopupImpl() { final Set _features = features.getAvailable(); final Set _selected = features.getActivated(); final List _items = new ArrayList(); // --- Features listener --- final ProfilerFeatures.Listener listener = new ProfilerFeatures.Listener() { void featuresChanged(ProfilerFeature changed) { int index = 0; for (ProfilerFeature feature : _features) { ToggleButtonMenuItem item = _items.get(index++); if (item == null) item = _items.get(index++); item.setPressed(_selected.contains(feature)); } } void settingsChanged(boolean valid) {} }; // --- Popup menu --- final StayOpenPopupMenu popup = new StayOpenPopupMenu() { public void setVisible(boolean visible) { if (visible) features.addListener(listener); else features.removeListener(listener); super.setVisible(visible); profilePopupVisible = visible; if (!visible) updateFocus(); } }; popup.setLayout(new GridBagLayout()); if (!UIUtils.isAquaLookAndFeel()) { popup.setForceBackground(true); Color background = UIUtils.getProfilerResultsBackground(); popup.setBackground(new Color(background.getRGB())); // JPopupMenu doesn't seem to follow ColorUIResource } // --- Feature items --- int lastPosition = -1; for (final ProfilerFeature feature : _features) { int currentPosition = feature.getPosition(); if (lastPosition == -1) lastPosition = currentPosition; if (currentPosition - lastPosition > 1) _items.add(null); lastPosition = currentPosition; _items.add(new ToggleButtonMenuItem(feature.getName(), feature.getIcon()) { { setPressed(_selected.contains(feature)); } protected void fireActionPerformed(ActionEvent e) { features.toggleActivated(feature); if (features.isSingleFeatured() && isPressed()) /*if (session.inProgress())*/ popup.setVisible(false); } }); } // --- Other controls --- final boolean _project = session.getProject() != null; // final boolean _file = session.getFile() != null; final boolean _attach = session.isAttach(); // JMenuItem attachProject = null; if (_attach) { String nameA = _project ? Bundle.ProfilerWindow_setupAttachProject() : Bundle.ProfilerWindow_setupAttachProcess(); attachProject = new JMenuItem(nameA) { { setEnabled(!session.inProgress()); } protected void fireActionPerformed(ActionEvent event) { configureAttachSettings(true); } }; } JCheckBoxMenuItem singleFeature = new StayOpenPopupMenu.CheckBoxItem(Bundle.ProfilerWindow_multipleFeatures()) { { setSelected(!features.isSingleFeatured()); } protected void fireItemStateChanged(ItemEvent event) { features.setSingleFeatured(!isSelected()); } }; JCheckBoxMenuItem usePPoints = new StayOpenPopupMenu.CheckBoxItem(Bundle.ProfilerWindow_usePPoints()) { { setSelected(features.getUseProfilingPoints()); setEnabled(!session.inProgress()); } protected void fireItemStateChanged(ItemEvent event) { features.setUseProfilingPoints(isSelected()); } }; // --- Popup crowding --- int left = 12; int labl = 5; int y = 0; GridBagConstraints c; if (_attach) { JLabel projectL = new JLabel(Bundle.ProfilerWindow_targetSection(), JLabel.LEADING); projectL.setFont(popup.getFont().deriveFont(Font.BOLD)); c = new GridBagConstraints(); c.gridy = y++; c.insets = new Insets(5, labl, 5, 5); c.fill = GridBagConstraints.HORIZONTAL; popup.add(projectL, c); c = new GridBagConstraints(); c.gridy = y++; c.gridx = 0; c.insets = new Insets(0, left, 0, 5); c.gridwidth = 1; c.fill = GridBagConstraints.HORIZONTAL; popup.add(attachProject, c); } JLabel profileL = new JLabel(Bundle.ProfilerWindow_profileSection(), JLabel.LEADING); profileL.setFont(popup.getFont().deriveFont(Font.BOLD)); c = new GridBagConstraints(); c.gridy = y++; c.insets = new Insets(_attach ? 8 : 5, labl, 5, 5); c.fill = GridBagConstraints.HORIZONTAL; popup.add(profileL, c); for (ToggleButtonMenuItem item : _items) { if (item == null) { JPanel p = new JPanel(null); p.setOpaque(false); c = new GridBagConstraints(); c.gridy = y++; c.insets = new Insets(5, 0, 5, 0); c.fill = GridBagConstraints.HORIZONTAL; popup.add(p, c); } else { c = new GridBagConstraints(); c.gridy = y++; c.insets = new Insets(0, left, 0, 5); c.fill = GridBagConstraints.HORIZONTAL; popup.add(item, c); } } JLabel settingsL = new JLabel(Bundle.ProfilerWindow_settingsSection(), JLabel.LEADING); settingsL.setFont(popup.getFont().deriveFont(Font.BOLD)); c = new GridBagConstraints(); c.gridy = y++; c.insets = new Insets(8, labl, 5, 5); c.fill = GridBagConstraints.HORIZONTAL; popup.add(settingsL, c); c = new GridBagConstraints(); c.gridy = y++; c.insets = new Insets(0, left, 0, 5); c.fill = GridBagConstraints.HORIZONTAL; popup.add(singleFeature, c); if (_project) { c = new GridBagConstraints(); c.gridy = y++; c.insets = new Insets(0, left, 0, 5); c.fill = GridBagConstraints.HORIZONTAL; popup.add(usePPoints, c); } if (plugins.hasPlugins()) { JLabel pluginsL = new JLabel(Bundle.ProfilerWindow_pluginsSection(), JLabel.LEADING); pluginsL.setFont(popup.getFont().deriveFont(Font.BOLD)); c = new GridBagConstraints(); c.gridy = y++; c.insets = new Insets(8, labl, 5, 5); c.fill = GridBagConstraints.HORIZONTAL; popup.add(pluginsL, c); for (JMenuItem menu : plugins.menuItems()) { c = new GridBagConstraints(); c.gridy = y++; c.insets = new Insets(0, left, 0, 5); c.fill = GridBagConstraints.HORIZONTAL; popup.add(menu, c); } } JPanel footer = new JPanel(null); footer.setOpaque(false); c = new GridBagConstraints(); c.gridy = y++; c.weightx = 1; c.weighty = 1; c.insets = new Insets(3, 0, 0, 0); c.anchor = GridBagConstraints.NORTHWEST; c.fill = GridBagConstraints.BOTH; popup.add(footer, c); // MenuElement preselect = null; // if (preselectItem != null) { // for (Component comp : popup.getComponents()) { // if (comp instanceof JMenuItem) { // JMenuItem mi = (JMenuItem)comp; // if (mi.getText().contains(preselectItem)) { // preselect = mi; // break; // } // } // } // preselectItem = null; // } // // if (preselect instanceof JRadioButtonMenuItem) // ((JRadioButtonMenuItem)preselect).setSelected(true); JComponent button = start.isVisible() ? start : configure; popup.show(button, 0, button.getHeight()); // if (preselect != null) MenuSelectionManager.defaultManager().setSelectedPath( // new MenuElement[] { popup, preselect }); } // --- ProfilerTopComponent ------------------------------------------------ protected Component defaultFocusOwner() { if (configure != null && configure.isVisible()) return configure; else if (start != null) return start; else return null; } // --- TopComponent -------------------------------------------------------- private final String ID = "ProfilerWindow"; // NOI18N boolean closing = false; public boolean canClose() { if (closing) return true; if (!super.canClose()) return false; closing = true; closing = session.close(); return closing; } public void open() { WindowManager windowManager = WindowManager.getDefault(); if (windowManager.findMode(this) == null) { // needs docking Mode mode = windowManager.findMode(Bundle.ProfilerWindow_mode()); if (mode != null) mode.dockInto(this); } super.open(); } protected void componentOpened() { super.componentOpened(); SnapshotsWindow.instance().sessionOpened(session); } protected void componentShowing() { super.componentShowing(); SnapshotsWindow.instance().sessionActivated(session); } protected void componentHidden() { super.componentHidden(); SnapshotsWindow.instance().sessionDeactivated(session); } protected void componentClosed() { super.componentOpened(); SnapshotsWindow.instance().sessionClosed(session); } protected void componentActivated() { super.componentActivated(); if (status != null) status.startSessionLogging(); } public int getPersistenceType() { return PERSISTENCE_NEVER; } protected String preferredID() { return ID; } public HelpCtx getHelpCtx() { ProfilerFeature selected = featuresView == null ? null : featuresView.getSelectedFeature(); JPanel selectedUI = selected == null ? null : selected.getResultsUI(); if (selectedUI == null && selected != null) selectedUI = selected.getSettingsUI(); String helpCtx = selectedUI == null ? null : (String)selectedUI.getClientProperty("HelpCtx.Key"); // NOI18N if (helpCtx == null) helpCtx = "ProfileWindow.HelpCtx"; // NOI18N return new HelpCtx(helpCtx); } // --- Accessibility ------------------------------------------------------- private AccessibleContext accessibleContext; public AccessibleContext getAccessibleContext() { if (accessibleContext == null) { accessibleContext = new JComponent.AccessibleJComponent() { public AccessibleRole getAccessibleRole() { return AccessibleRole.PANEL; } public String getAccessibleName() { return Bundle.ProfilerWindow_accessName(getDisplayName()); } public String getAccessibleDescription() { ProfilerFeature selected = featuresView == null ? null : featuresView.getSelectedFeature(); return selected == null ? WelcomePanel.CAPTION : (selected.getName() + " " + selected.getDescription()); // NOI18N } }; } return accessibleContext; } // --- Private classes ----------------------------------------------------- private static final class SettingsPresenter extends JToggleButton implements ComponentListener { private JPanel settings; SettingsPresenter() { super(Icons.getIcon(GeneralIcons.SETTINGS)); setToolTipText(Bundle.ProfilerWindow_settings()); updateVisibility(false); } void setFeature(ProfilerFeature feature) { if (settings != null) settings.removeComponentListener(this); settings = feature == null ? null : feature.getSettingsUI(); updateVisibility(false); if (settings != null) settings.addComponentListener(this); } protected void fireActionPerformed(ActionEvent e) { if (settings != null) { settings.setVisible(isSelected()); settings.getParent().setVisible(isSelected()); } } void cleanup() { settings.removeComponentListener(this); } private void updateVisibility(boolean parent) { setVisible(settings != null); setSelected(settings != null && settings.isVisible()); if (parent) settings.getParent().setVisible(settings.isVisible()); } public void componentShown(ComponentEvent e) { updateVisibility(true); } public void componentHidden(ComponentEvent e) { updateVisibility(true); } public void componentResized(ComponentEvent e) {} public void componentMoved(ComponentEvent e) {} } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy