Skip to content

Commit ab5d594

Browse files
jisedlacthurka
authored andcommitted
Enabled Threads, Sampler and Profiler using the new UI components. More work needed.
1 parent 2a52d5f commit ab5d594

File tree

13 files changed

+1238
-227
lines changed

13 files changed

+1238
-227
lines changed

visualvm/applicationviews/nbproject/project.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,15 @@
105105
<specification-version>1.43.1</specification-version>
106106
</run-dependency>
107107
</dependency>
108+
<dependency>
109+
<code-name-base>org.netbeans.modules.profiler.api</code-name-base>
110+
<build-prerequisite/>
111+
<compile-dependency/>
112+
<run-dependency>
113+
<release-version>1</release-version>
114+
<specification-version>1.47</specification-version>
115+
</run-dependency>
116+
</dependency>
108117
<dependency>
109118
<code-name-base>org.openide.dialogs</code-name-base>
110119
<build-prerequisite/>

visualvm/applicationviews/src/com/sun/tools/visualvm/application/views/threads/ApplicationThreadsView.java

Lines changed: 114 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,19 @@
4949
import java.beans.PropertyChangeEvent;
5050
import java.beans.PropertyChangeListener;
5151
import javax.swing.AbstractAction;
52+
import javax.swing.Action;
5253
import javax.swing.BorderFactory;
5354
import javax.swing.ImageIcon;
5455
import javax.swing.JButton;
5556
import javax.swing.JComponent;
57+
import javax.swing.JLabel;
5658
import javax.swing.JPanel;
5759
import javax.swing.SwingUtilities;
60+
import org.netbeans.lib.profiler.ui.components.ProfilerToolbar;
61+
import org.netbeans.lib.profiler.ui.swing.ActionPopupButton;
62+
import org.netbeans.lib.profiler.ui.swing.GrayLabel;
5863
import org.netbeans.lib.profiler.ui.threads.ThreadsPanel;
64+
import org.netbeans.modules.profiler.api.ProfilerDialogs;
5965
import org.openide.util.ImageUtilities;
6066
import org.openide.util.NbBundle;
6167
import org.openide.util.RequestProcessor;
@@ -297,7 +303,29 @@ private static synchronized RequestProcessor getWorker() {
297303

298304
// --- Timeline ------------------------------------------------------------
299305

306+
@NbBundle.Messages({
307+
"ThreadsFeatureUI_show=Show:",
308+
"ThreadsFeatureUI_filterAll=All Threads",
309+
"ThreadsFeatureUI_filterLive=Live Threads",
310+
"ThreadsFeatureUI_filterFinished=Finished Threads",
311+
"ThreadsFeatureUI_filterSelected=Selected Threads",
312+
"ThreadsFeatureUI_timeline=Timeline:",
313+
"ThreadsFeatureUI_threadsFilter=Threads filter",
314+
"# HTML formatted:",
315+
"ThreadsFeatureUI_noThreadsMsg=<html><b>No threads are currently selected.</b><br><br>Use the Selected column or invoke Select thread action to select threads.</html>"
316+
})
300317
private static class TimelineViewSupport extends JPanel {
318+
private ProfilerToolbar toolbar;
319+
private ThreadsPanel threadsPanel;
320+
321+
private JLabel shLabel;
322+
private ActionPopupButton shFilter;
323+
324+
private JLabel tlLabel;
325+
private JComponent tlZoomInButton;
326+
private JComponent tlZoomOutButton;
327+
private JComponent tlFitWidthButton;
328+
301329

302330
TimelineViewSupport(VisualVMThreadsDataManager threadsManager) {
303331
initComponents(threadsManager);
@@ -311,13 +339,96 @@ private void initComponents(VisualVMThreadsDataManager threadsManager) {
311339
setLayout(new BorderLayout());
312340
setOpaque(false);
313341

314-
ThreadsPanel threadsPanel = new ThreadsPanel(threadsManager, null);
342+
threadsPanel = new ThreadsPanel(threadsManager, null) {
343+
protected void filterSelected(ThreadsPanel.Filter filter) {
344+
super.filterSelected(filter);
345+
shFilter.selectAction(filter.ordinal());
346+
}
347+
};
315348
threadsPanel.threadsMonitoringEnabled();
349+
350+
// -----------------------------------------------------------------
351+
// --- copy-pasted timeline toolbar from org.netbeans.modules.profiler.v2.features.ThreadsFeatureUI
352+
353+
shLabel = new GrayLabel(Bundle.ThreadsFeatureUI_show());
354+
355+
Action aAll = new AbstractAction() {
356+
{ putValue(NAME, Bundle.ThreadsFeatureUI_filterAll()); }
357+
public void actionPerformed(ActionEvent e) { setFilter(ThreadsPanel.Filter.ALL); }
358+
359+
};
360+
Action aLive = new AbstractAction() {
361+
{ putValue(NAME, Bundle.ThreadsFeatureUI_filterLive()); }
362+
public void actionPerformed(ActionEvent e) { setFilter(ThreadsPanel.Filter.LIVE); }
363+
364+
};
365+
Action aFinished = new AbstractAction() {
366+
{ putValue(NAME, Bundle.ThreadsFeatureUI_filterFinished()); }
367+
public void actionPerformed(ActionEvent e) { setFilter(ThreadsPanel.Filter.FINISHED); }
368+
369+
};
370+
Action aSelected = new AbstractAction() {
371+
{ putValue(NAME, Bundle.ThreadsFeatureUI_filterSelected()); }
372+
public void actionPerformed(ActionEvent e) { setSelectedFilter(); }
373+
374+
};
375+
shFilter = new ActionPopupButton(aAll, aLive, aFinished, aSelected);
376+
shFilter.setToolTipText(Bundle.ThreadsFeatureUI_threadsFilter());
316377

317-
// JComponent toolbar = (JComponent)threadsPanel.getToolbar();
378+
tlLabel = new GrayLabel(Bundle.ThreadsFeatureUI_timeline());
379+
380+
381+
tlZoomInButton = (JComponent)threadsPanel.getZoomIn();
382+
tlZoomInButton.putClientProperty("JButton.buttonType", "segmented"); // NOI18N
383+
tlZoomInButton.putClientProperty("JButton.segmentPosition", "first"); // NOI18N
384+
tlZoomOutButton = (JComponent)threadsPanel.getZoomOut();
385+
tlZoomOutButton.putClientProperty("JButton.buttonType", "segmented"); // NOI18N
386+
tlZoomOutButton.putClientProperty("JButton.segmentPosition", "middle"); // NOI18N
387+
tlFitWidthButton = (JComponent)threadsPanel.getFitWidth();
388+
tlFitWidthButton.putClientProperty("JButton.buttonType", "segmented"); // NOI18N
389+
tlFitWidthButton.putClientProperty("JButton.segmentPosition", "last"); // NOI18N
390+
391+
toolbar = ProfilerToolbar.create(true);
392+
393+
// toolbar.addSpace(2);
394+
// toolbar.addSeparator();
395+
toolbar.addSpace(5);
396+
397+
toolbar.add(shLabel);
398+
toolbar.addSpace(2);
399+
toolbar.add(shFilter);
400+
401+
toolbar.addSpace(2);
402+
toolbar.addSeparator();
403+
toolbar.addSpace(5);
404+
405+
toolbar.add(tlLabel);
406+
toolbar.addSpace(2);
407+
toolbar.add(tlZoomInButton);
408+
toolbar.add(tlZoomOutButton);
409+
toolbar.add(tlFitWidthButton);
410+
411+
add(toolbar.getComponent(), BorderLayout.NORTH);
412+
413+
setFilter(ThreadsPanel.Filter.LIVE);
414+
415+
// -----------------------------------------------------------------
318416

319-
// add(toolbar, BorderLayout.NORTH);
320417
add(threadsPanel, BorderLayout.CENTER);
321418
}
419+
420+
private void setSelectedFilter() {
421+
if (threadsPanel.hasSelectedThreads()) {
422+
setFilter(ThreadsPanel.Filter.SELECTED);
423+
} else {
424+
threadsPanel.showSelectedColumn();
425+
shFilter.selectAction(threadsPanel.getFilter().ordinal());
426+
ProfilerDialogs.displayWarning(Bundle.ThreadsFeatureUI_noThreadsMsg());
427+
}
428+
}
429+
430+
private void setFilter(ThreadsPanel.Filter filter) {
431+
threadsPanel.setFilter(filter);
432+
}
322433
}
323434
}

visualvm/appui/src/com/sun/tools/visualvm/modules/appui/toolbar/ToolbarProvider.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,34 @@
2424
*/
2525
package com.sun.tools.visualvm.modules.appui.toolbar;
2626

27+
import javax.swing.JComponent;
2728
import org.netbeans.lib.profiler.ui.components.ProfilerToolbar;
2829
import org.openide.util.lookup.ServiceProvider;
2930

3031
/**
3132
*
3233
* @author Tomas Hurka
3334
*/
34-
//@ServiceProvider(service=ProfilerToolbar.Provider.class)
35+
@ServiceProvider(service=ProfilerToolbar.Provider.class)
3536
public class ToolbarProvider extends ProfilerToolbar.Provider {
3637

3738
@Override
3839
public ProfilerToolbar create(boolean showSeparator) {
39-
return new VisualVMToolbar(showSeparator);
40+
return new VisualVMImpl(showSeparator);
41+
}
42+
43+
44+
private static class VisualVMImpl extends ProfilerToolbar.Impl {
45+
46+
private VisualVMImpl(boolean showSeparator) {
47+
super(showSeparator);
48+
49+
JComponent comp = component;
50+
if (showSeparator) comp = (JComponent)comp.getComponent(0);
51+
52+
comp.setOpaque(false);
53+
}
54+
4055
}
4156

4257
}

visualvm/profiler/nbproject/project.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,15 @@
7777
<specification-version>1.10.1</specification-version>
7878
</run-dependency>
7979
</dependency>
80+
<dependency>
81+
<code-name-base>org.netbeans.lib.profiler.ui</code-name-base>
82+
<build-prerequisite/>
83+
<compile-dependency/>
84+
<run-dependency>
85+
<release-version>1</release-version>
86+
<specification-version>1.140</specification-version>
87+
</run-dependency>
88+
</dependency>
8089
<dependency>
8190
<code-name-base>org.netbeans.modules.profiler</code-name-base>
8291
<build-prerequisite/>

visualvm/profiler/src/com/sun/tools/visualvm/profiler/ApplicationProfilerView.java

Lines changed: 42 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import com.sun.tools.visualvm.uisupport.HTMLLabel;
3737
import com.sun.tools.visualvm.uisupport.HTMLTextArea;
3838
import java.awt.BorderLayout;
39-
import java.awt.Component;
4039
import java.awt.Dimension;
4140
import java.awt.Font;
4241
import java.awt.GridBagConstraints;
@@ -49,15 +48,12 @@
4948
import java.beans.PropertyChangeListener;
5049
import java.net.URL;
5150
import java.text.MessageFormat;
52-
import javax.swing.AbstractButton;
5351
import javax.swing.BorderFactory;
5452
import javax.swing.ImageIcon;
5553
import javax.swing.JButton;
56-
import javax.swing.JComponent;
5754
import javax.swing.JLabel;
5855
import javax.swing.JPanel;
5956
import javax.swing.JToggleButton;
60-
import javax.swing.JToolBar;
6157
import javax.swing.SwingUtilities;
6258
import javax.swing.Timer;
6359
import org.netbeans.lib.profiler.TargetAppRunner;
@@ -67,6 +63,7 @@
6763
import org.netbeans.lib.profiler.common.event.ProfilingStateListener;
6864
import org.netbeans.modules.profiler.NetBeansProfiler;
6965
import org.netbeans.modules.profiler.api.ProfilerDialogs;
66+
import org.netbeans.modules.profiler.api.ProfilerIDESettings;
7067
import org.netbeans.modules.profiler.utilities.ProfilerUtils;
7168
import org.openide.util.ImageUtilities;
7269
import org.openide.util.NbBundle;
@@ -174,6 +171,9 @@ private static class MasterViewSupport extends JPanel implements ProfilingStateL
174171
private boolean applicationTerminated = false;
175172

176173
private boolean classSharingBreaksProfiling;
174+
175+
176+
private ProfilingResultsSupport.ResultsView results;
177177

178178

179179
public MasterViewSupport(final Application application, ProfilingResultsSupport profilingResultsView,
@@ -230,37 +230,42 @@ public void viewRemoved() {
230230
}
231231

232232
public void actionPerformed(ActionEvent e) {
233+
if (results != null) results.refreshResults();
233234
updateRunningText();
234235
}
235236

236237

237-
private static JComponent getLiveResultsView() {
238-
// TODO
239-
JComponent view = null; //LiveResultsWindow.getDefault();
240-
Component[] components = view.getComponents();
241-
boolean buttonFound = false;
242-
243-
if (components.length > 0 && components[0] instanceof JPanel) {
244-
components = ((JPanel)components[0]).getComponents();
245-
if (components.length > 0 && components[0] instanceof JPanel) {
246-
JPanel toolbarPanel = (JPanel)components[0];
247-
components = toolbarPanel.getComponents();
248-
if (components.length > 0 && components[0] instanceof JToolBar) {
249-
JToolBar toolbar = (JToolBar)components[0];
250-
components = toolbar.getComponents();
251-
}
252-
if (components.length > 5 && components[5] instanceof AbstractButton) {
253-
AbstractButton takeSnapshot = (AbstractButton)components[5];
254-
takeSnapshot.setText(NbBundle.getMessage(
255-
ApplicationProfilerView.class, "LBL_Snapshot")); // NOI18N
256-
buttonFound = true;
257-
}
258-
}
259-
}
260-
assert buttonFound : "Take Snapshot button was not found in the toolbar"; // NOI18N
261-
262-
view.setPreferredSize(new Dimension(1, 1));
263-
return view;
238+
// private static JComponent getLiveResultsView() {
239+
// // TODO
240+
// JComponent view = null; //LiveResultsWindow.getDefault();
241+
// Component[] components = view.getComponents();
242+
// boolean buttonFound = false;
243+
//
244+
// if (components.length > 0 && components[0] instanceof JPanel) {
245+
// components = ((JPanel)components[0]).getComponents();
246+
// if (components.length > 0 && components[0] instanceof JPanel) {
247+
// JPanel toolbarPanel = (JPanel)components[0];
248+
// components = toolbarPanel.getComponents();
249+
// if (components.length > 0 && components[0] instanceof JToolBar) {
250+
// JToolBar toolbar = (JToolBar)components[0];
251+
// components = toolbar.getComponents();
252+
// }
253+
// if (components.length > 5 && components[5] instanceof AbstractButton) {
254+
// AbstractButton takeSnapshot = (AbstractButton)components[5];
255+
// takeSnapshot.setText(NbBundle.getMessage(
256+
// ApplicationProfilerView.class, "LBL_Snapshot")); // NOI18N
257+
// buttonFound = true;
258+
// }
259+
// }
260+
// }
261+
// assert buttonFound : "Take Snapshot button was not found in the toolbar"; // NOI18N
262+
//
263+
// view.setPreferredSize(new Dimension(1, 1));
264+
// return view;
265+
// }
266+
267+
private ProfilingResultsSupport.ResultsView getResultsView(boolean cpu) {
268+
return cpu ? new CPULivePanel() : new MemoryLivePanel();
264269
}
265270

266271
private void handleCPUProfiling() {
@@ -414,11 +419,13 @@ public void run() {
414419
enableControlButtons();
415420
updateControlButtons();
416421
disableSettings();
417-
profilingResultsView.setProfilingResultsDisplay(getLiveResultsView());
422+
results = getResultsView(cpuButton.isSelected());
423+
profilingResultsView.setProfilingResultsDisplay(results);
418424
} else {
419425
statusValueLabel.setText(NbBundle.getMessage(ApplicationProfilerView.class, "MSG_profiling_of") + ProfilerSupport.getInstance().getProfiledApplicationName() + NbBundle.getMessage(ApplicationProfilerView.class, "MSG_in_progress")); // NOI18N
420426
disableControlButtons();
421-
profilingResultsView.setProfilingResultsDisplay(null);
427+
results = null;
428+
profilingResultsView.setProfilingResultsDisplay(results);
422429
}
423430

424431
profilingResultsView.revalidate();
@@ -526,6 +533,8 @@ private void initSettings() {
526533
attachSettings.setDirect(false);
527534
attachSettings.setDynamic16(true);
528535
attachSettings.setPid(application.getPid());
536+
537+
ProfilerIDESettings.getInstance().setOOMDetectionMode(ProfilerIDESettings.OOME_DETECTION_NONE);
529538
}
530539

531540

0 commit comments

Comments
 (0)