/*
* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.tools.visualvm.sampler.cpu;
import com.sun.tools.visualvm.sampler.AbstractSamplerSupport;
import com.sun.tools.visualvm.uisupport.TransparentToolBar;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.HierarchyEvent;
import java.awt.event.HierarchyListener;
import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JToggleButton;
import javax.swing.SwingConstants;
import org.openide.util.ImageUtilities;
import org.openide.util.NbBundle;
/**
*
* @author Jiri Sedlacek
*/
final class CPUView extends JPanel {
private final AbstractSamplerSupport.Refresher refresher;
private boolean forceRefresh = false;
private final CPUSamplerSupport.SnapshotDumper snapshotDumper;
private final CPUSamplerSupport.ThreadDumper threadDumper;
private SampledLivePanel resultsPanel;
CPUView(AbstractSamplerSupport.Refresher refresher, CPUSamplerSupport.SnapshotDumper
snapshotDumper, CPUSamplerSupport.ThreadDumper threadDumper) {
this.refresher = refresher;
this.snapshotDumper = snapshotDumper;
this.threadDumper = threadDumper;
initComponents();
addHierarchyListener(new HierarchyListener() {
public void hierarchyChanged(HierarchyEvent e) {
if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0) {
if (isShowing()) CPUView.this.refresher.refresh();
}
}
});
}
void initSession() {
if (resultsPanel != null) {
remove(resultsPanel);
resultsPanel = null;
}
snapshotButton.setEnabled(false);
add(noDataLabel, BorderLayout.CENTER);
noDataLabel.invalidate();
validate();
repaint();
}
void setResultsPanel(SampledLivePanel resultsPanel) {
this.resultsPanel = resultsPanel;
}
void refresh() {
if (noDataLabel.getParent() == this) {
remove(noDataLabel);
resultsPanel.setPreferredSize(new Dimension(1, 1));
JScrollPane resultsScroll = (JScrollPane)resultsPanel.getComponent(0);
resultsScroll.setBorder(BorderFactory.createEmptyBorder());
resultsScroll.setViewportBorder(BorderFactory.createEmptyBorder());
add(resultsPanel, BorderLayout.CENTER);
resultsPanel.invalidate();
validate();
repaint();
}
if (!isShowing() || (pauseButton.isSelected() && !forceRefresh)) return;
forceRefresh = false;
resultsPanel.updateLiveResults();
snapshotButton.setEnabled(snapshotDumper != null);
}
void terminate() {
// refreshRateLabel.setEnabled(false);
// refreshCombo.setEnabled(false);
// refreshUnitsLabel.setEnabled(false);
pauseButton.setEnabled(false);
refreshButton.setEnabled(false);
threaddumpButton.setEnabled(false);
}
private void initComponents() {
setLayout(new BorderLayout());
setOpaque(false);
final TransparentToolBar toolBar = new TransparentToolBar();
// refreshRateLabel = new JLabel("Refresh: ");
// refreshRateLabel.setToolTipText("Live results refresh rate [ms]");
// toolBar.add(refreshRateLabel);
//
// Integer[] refreshRates = new Integer[] { 100, 200, 500, 1000, 2000, 5000, 10000 };
// refreshCombo = new JComboBox(refreshRates) {
// public Dimension getMinimumSize() { return getPreferredSize(); }
// public Dimension getMaximumSize() { return getPreferredSize(); }
// };
// refreshCombo.setToolTipText("Live results refresh rate [ms]");
// refreshCombo.setEditable(false);
// refreshCombo.addActionListener(new ActionListener() {
// public void actionPerformed(ActionEvent e) {
// refresher.setRefreshRate((Integer)refreshCombo.getSelectedItem());
// }
// });
// refreshCombo.setSelectedItem(refresher.getRefreshRate());
// refreshCombo.setRenderer(new ComboRenderer(refreshCombo));
// toolBar.add(refreshCombo);
//
// refreshUnitsLabel = new JLabel(" ms. ");
// refreshUnitsLabel.setToolTipText("Live results refresh rate [ms]");
// toolBar.add(refreshUnitsLabel);
pauseButton = new JToggleButton() {
protected void fireActionPerformed(ActionEvent event) {
boolean selected = pauseButton.isSelected();
refreshButton.setEnabled(selected);
if (!selected) refresher.refresh();
}
};
pauseButton.setIcon(new ImageIcon(ImageUtilities.loadImage(
"com/sun/tools/visualvm/sampler/resources/pause.png", true))); // NOI18N
pauseButton.setToolTipText(NbBundle.getMessage(CPUView.class, "TOOLTIP_Pause_results")); // NOI18N
pauseButton.setOpaque(false);
toolBar.addItem(pauseButton);
refreshButton = new JButton() {
protected void fireActionPerformed(ActionEvent event) {
forceRefresh = true;
refresher.refresh();
}
};
refreshButton.setIcon(new ImageIcon(ImageUtilities.loadImage(
"com/sun/tools/visualvm/sampler/resources/update.png", true))); // NOI18N
refreshButton.setToolTipText(NbBundle.getMessage(CPUView.class, "TOOLTIP_Update_results")); // NOI18N
refreshButton.setEnabled(pauseButton.isSelected());
refreshButton.setOpaque(false);
toolBar.addItem(refreshButton);
toolBar.addSeparator();
snapshotButton = new JButton(NbBundle.getMessage(CPUView.class, "LBL_Snapshot"), // NOI18N)
new ImageIcon(ImageUtilities.loadImage(
"com/sun/tools/visualvm/sampler/resources/snapshot.png", true))) { // NOI18N)
protected void fireActionPerformed(ActionEvent event) {
snapshotDumper.takeSnapshot((event.getModifiers() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()) == 0);
}
};
snapshotButton.setToolTipText(NbBundle.getMessage(CPUView.class, "TOOLTIP_Snapshot")); // NOI18N
snapshotButton.setOpaque(false);
snapshotButton.setEnabled(false);
toolBar.addItem(snapshotButton);
toolBar.addFiller();
threaddumpButton = new JButton(NbBundle.getMessage(CPUView.class, "LBL_Thread_dump")) { // NOI18N
protected void fireActionPerformed(ActionEvent event) {
threadDumper.takeThreadDump((event.getModifiers() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()) == 0);
}
};
threaddumpButton.setToolTipText(NbBundle.getMessage(CPUView.class, "TOOLTIP_Thread_dump")); // NOI18N
threaddumpButton.setOpaque(false);
threaddumpButton.setEnabled(threadDumper != null);
toolBar.addItem(threaddumpButton);
int maxHeight = pauseButton.getPreferredSize().height;
maxHeight = Math.max(maxHeight, refreshButton.getPreferredSize().height);
maxHeight = Math.max(maxHeight, snapshotButton.getPreferredSize().height);
maxHeight = Math.max(maxHeight, threaddumpButton.getPreferredSize().height);
int width = pauseButton.getPreferredSize().width;
Dimension size = new Dimension(maxHeight, maxHeight);
pauseButton.setMinimumSize(size);
pauseButton.setPreferredSize(size);
pauseButton.setMaximumSize(size);
width = refreshButton.getPreferredSize().width;
size = new Dimension(maxHeight, maxHeight);
refreshButton.setMinimumSize(size);
refreshButton.setPreferredSize(size);
refreshButton.setMaximumSize(size);
width = snapshotButton.getPreferredSize().width;
size = new Dimension(width + 5, maxHeight);
snapshotButton.setMinimumSize(size);
snapshotButton.setPreferredSize(size);
snapshotButton.setMaximumSize(size);
width = threaddumpButton.getPreferredSize().width;
size = new Dimension(width + 5, maxHeight);
threaddumpButton.setMinimumSize(size);
threaddumpButton.setPreferredSize(size);
threaddumpButton.setMaximumSize(size);
add(TransparentToolBar.withSeparator(toolBar), BorderLayout.NORTH);
noDataLabel = new JLabel(NbBundle.getMessage(CPUView.class, "LBL_No_data"), // NOI18N
SwingConstants.CENTER);
}
// private JLabel refreshRateLabel;
// private JLabel refreshUnitsLabel;
// private JComboBox refreshCombo;
private AbstractButton snapshotButton;
private AbstractButton pauseButton;
private AbstractButton refreshButton;
private AbstractButton threaddumpButton;
private JLabel noDataLabel;
// private static class ComboRenderer implements ListCellRenderer {
//
// private ListCellRenderer renderer;
//
// ComboRenderer(JComboBox combo) {
// renderer = combo.getRenderer();
// if (renderer instanceof JLabel)
// ((JLabel)renderer).setHorizontalAlignment(JLabel.TRAILING);
// }
//
// public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
// return renderer.getListCellRendererComponent(list, NumberFormat.getInstance().format(value), index, isSelected, cellHasFocus);
// }
//
// }
}