/*
* 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.profiling.presets;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import org.openide.util.NbBundle;
/**
*
* @author Jiri Sedlacek
*/
public final class PresetSelector extends JPanel {
private final Runnable presetSynchronizer;
private JLabel presetsLabel;
private JComboBox presetsCombo;
private JButton presetsButton;
private PresetSelector refSelector;
private final ProfilerPreset defaultPreset;
private ProfilerPreset customPreset;
private final String selector;
private boolean savingCustom;
private boolean customSelected;
private boolean internalChange = false;
PresetSelector(final PresetSelector refSelector, ProfilerPreset defaultPreset,
ProfilerPreset customPreset, final ProfilerPreset toSelect,
Runnable presetSynchronizer, String selector) {
this.refSelector = refSelector;
if (refSelector != null) this.customPreset = refSelector.customPreset;
this.selector = selector;
this.presetSynchronizer = presetSynchronizer;
this.defaultPreset = defaultPreset;
this.customPreset = customPreset;
initComponents(refSelector);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
if (refSelector != null)
refSelector.refSelector = PresetSelector.this;
updatePresets(toSelect);
}
});
}
public ProfilerPreset getSelectedPreset() {
return (ProfilerPreset)presetsCombo.getSelectedItem();
}
public void synchronizeWith(final PresetSelector selector) {
// Need to invokeLater, to be called after updatePresets() in constructor
SwingUtilities.invokeLater(new Runnable() {
public void run() {
if (selector.customPreset != null) {
customPreset = new ProfilerPreset(selector.customPreset);
if (refSelector != null) refSelector.customPreset = customPreset;
}
updatePresets(selector.getSelectedPreset());
}
});
}
public ProfilerPreset customize(boolean presetValid) {
if (customPreset == null) {
customPreset = new ProfilerPreset(NbBundle.getMessage(
PresetSelector.class, "LBL_Custom"), null); // NOI18N
if (refSelector != null) refSelector.customPreset = customPreset;
}
customPreset.setValid(presetValid);
internalChange = true;
if (presetsCombo.getItemCount() < 2 ||
presetsCombo.getItemAt(1) != customPreset)
presetsCombo.insertItemAt(customPreset, 1);
presetsCombo.setSelectedIndex(1);
internalChange = false;
return customPreset;
}
void presetsChanged(ProfilerPreset selectedPreset) {
updatePresets(savingCustom ? selectedPreset : null);
savingCustom = false;
}
private void selectedPresetChanged() {
Object selected = presetsCombo.getSelectedItem();
if (selected == null) return;
boolean custom = selected == customPreset;
if (customSelected != custom) {
customSelected = custom;
presetsButton.setText(custom ? NbBundle.getMessage(PresetSelector.class,
"BTN_Save") : NbBundle.getMessage(PresetSelector.class, // NOI18N
"BTN_Edit")); // NOI18N
}
updatePresetsButton(true);
if (internalChange) return;
notifySynchronizer();
}
private void actionRequested() {
if (customSelected) {
ProfilerPreset preset = new ProfilerPreset(customPreset);
preset.setSelector(selector);
savingCustom = true;
ProfilerPresets.getInstance().savePreset(preset);
} else {
ProfilerPresets.getInstance().editPresets(getSelectedPreset());
}
}
private void notifySynchronizer() {
SwingUtilities.invokeLater(new Runnable() {
public void run() { presetSynchronizer.run(); }
});
}
private void updatePresets(ProfilerPreset toSelect) {
if (toSelect == null) toSelect =
(ProfilerPreset)presetsCombo.getSelectedItem();
internalChange = true;
presetsCombo.removeAllItems();
presetsCombo.addItem(defaultPreset);
if (savingCustom) customPreset = null;
if (customPreset != null) presetsCombo.addItem(customPreset);
ProfilerPresets.PresetsModel presets =
ProfilerPresets.getInstance().getPresets();
for (int i = 0; i < presets.size(); i++)
presetsCombo.addItem(presets.get(i));
if (toSelect != null) presetsCombo.setSelectedItem(toSelect);
else presetsCombo.setSelectedIndex(0);
internalChange = false;
notifySynchronizer();
}
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
presetsLabel.setEnabled(enabled);
presetsCombo.setEnabled(enabled);
updatePresetsButton(enabled);
}
private void updatePresetsButton(boolean enabled) {
ProfilerPreset preset = getSelectedPreset();
presetsButton.setEnabled(enabled && preset != null && preset.isValid());
if (refSelector != null)
refSelector.presetsButton.setEnabled(presetsButton.isEnabled());
}
private void initComponents(PresetSelector refSelector) {
setOpaque(false);
setLayout(new BorderLayout(5, 0));
// presetsLabel
presetsLabel = new JLabel(NbBundle.getMessage(PresetSelector.class,
"LBL_Preset")); // NOI18N
presetsLabel.setToolTipText(NbBundle.getMessage(PresetSelector.class,
"TOOLTIP_Defined_presets")); // NOI18N
add(presetsLabel, BorderLayout.WEST);
// presetsCombo
presetsCombo = refSelector == null ? new JComboBox() :
new JComboBox(refSelector.presetsCombo.getModel());
presetsCombo.setToolTipText(NbBundle.getMessage(PresetSelector.class,
"TOOLTIP_Defined_presets")); // NOI18N
presetsCombo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { selectedPresetChanged(); }
});
add(presetsCombo, BorderLayout.CENTER);
// presetsButton
presetsButton = new JButton(NbBundle.getMessage(PresetSelector.class, "BTN_Save")) { // NOI18N
protected void fireActionPerformed(ActionEvent e) { actionRequested(); }
};
presetsButton.setToolTipText(NbBundle.getMessage(PresetSelector.class,
"TOOLTIP_Manage_presets")); // NOI18N
add(presetsButton, BorderLayout.EAST);
// UI tweaks
Dimension dim1 = presetsButton.getPreferredSize();
presetsButton.setText(NbBundle.getMessage(PresetSelector.class, "BTN_Edit")); // NOI18N
Dimension dim2 = presetsButton.getPreferredSize();
dim1.width = Math.max(dim1.width, dim2.width);
dim1.height = Math.max(dim1.height, dim2.height);
presetsButton.setPreferredSize(dim1);
}
}