/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common
* Development and Distribution License("CDDL") (collectively, the
* "License"). You may not use this file except in compliance with the
* License. You can obtain a copy of the License at
* http://www.netbeans.org/cddl-gplv2.html
* or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
* specific language governing permissions and limitations under the
* License. When distributing the software, include this License Header
* Notice in each file and include the License file at
* nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the GPL Version 2 section of the License file that
* accompanied this code. If applicable, add the following below the
* License Header, with the fields enclosed by brackets [] replaced by
* your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* Contributor(s):
*
* The Original Software is NetBeans. The Initial Developer of the Original
* Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
* Microsystems, Inc. All Rights Reserved.
*
* If you wish your version of this file to be governed by only the CDDL
* or only the GPL Version 2, indicate your decision by adding
* "[Contributor] elects to include this software in this distribution
* under the [CDDL or GPL Version 2] license." If you do not indicate a
* single choice of license, a recipient has the option to distribute
* your version of this file under either the CDDL, the GPL Version 2 or
* to extend the choice of license to its licensees as provided above.
* However, if you add GPL Version 2 code and therefore, elected the GPL
* Version 2 license, then the option applies only if the new code is
* made subject to such option by the copyright holder.
*/
package org.netbeans.modules.scala.project.ui.customizer;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.io.File;
import java.text.Collator;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.ListCellRenderer;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.plaf.UIResource;
import org.netbeans.api.project.Project;
import org.netbeans.modules.java.api.common.SourceRoots;
import org.netbeans.modules.scala.project.J2SEProject;
import org.netbeans.modules.scala.project.api.J2SERunConfigProvider;
import org.openide.DialogDescriptor;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.awt.MouseUtils;
import org.openide.filesystems.FileUtil;
import org.openide.util.HelpCtx;
import org.openide.util.Lookup;
import org.openide.util.NbBundle;
import org.openide.util.Utilities;
public class CustomizerRun extends JPanel implements HelpCtx.Provider {
private J2SEProject project;
private JTextField[] data;
private JLabel[] dataLabels;
private String[] keys;
private Map<String/*|null*/,Map<String,String/*|null*/>/*|null*/> configs;
J2SEProjectProperties uiProperties;
private J2SERunConfigProvider compProvider;
public CustomizerRun( J2SEProjectProperties uiProperties ) {
this.uiProperties = uiProperties;
initComponents();
this.project = uiProperties.getProject();
compProvider = Lookup.getDefault().lookup(J2SERunConfigProvider.class);
initExtPanel(project);
configs = uiProperties.RUN_CONFIGS;
data = new JTextField[] {
jTextFieldMainClass,
jTextFieldArgs,
jTextVMOptions,
jTextWorkingDirectory,
};
dataLabels = new JLabel[] {
jLabelMainClass,
jLabelArgs,
jLabelVMOptions,
jLabelWorkingDirectory,
};
keys = new String[] {
J2SEProjectProperties.MAIN_CLASS,
J2SEProjectProperties.APPLICATION_ARGS,
J2SEProjectProperties.RUN_JVM_ARGS,
J2SEProjectProperties.RUN_WORK_DIR,
};
assert data.length == keys.length;
configChanged(uiProperties.activeConfig);
configCombo.setRenderer(new ConfigListCellRenderer());
for (int i = 0; i < data.length; i++) {
final JTextField field = data[i];
final String prop = keys[i];
final JLabel label = dataLabels[i];
field.getDocument().addDocumentListener(new DocumentListener() {
Font basefont = label.getFont();
Font boldfont = basefont.deriveFont(Font.BOLD);
{
updateFont();
}
public void insertUpdate(DocumentEvent e) {
changed();
}
public void removeUpdate(DocumentEvent e) {
changed();
}
public void changedUpdate(DocumentEvent e) {}
void changed() {
String config = (String) configCombo.getSelectedItem();
if (config.length() == 0) {
config = null;
}
String v = field.getText();
if (v != null && config != null && v.equals(configs.get(null).get(prop))) {
// default value, do not store as such
v = null;
}
configs.get(config).put(prop, v);
updateFont();
}
void updateFont() {
String v = field.getText();
String config = (String) configCombo.getSelectedItem();
if (config.length() == 0) {
config = null;
}
String def = configs.get(null).get(prop);
label.setFont(config != null && !Utilities.compareObjects(v != null ? v : "", def != null ? def : "") ? boldfont : basefont);
}
});
}
jButtonMainClass.addActionListener( new MainClassListener( project.getSourceRoots(), jTextFieldMainClass ) );
/** @Todo disable it until we have correct SourceUtils.getMainClasses */
jButtonMainClass.setEnabled(false);
}
public HelpCtx getHelpCtx() {
return new HelpCtx( CustomizerRun.class );
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
configSep = new javax.swing.JSeparator();
configPanel = new javax.swing.JPanel();
configLabel = new javax.swing.JLabel();
configCombo = new javax.swing.JComboBox();
configNew = new javax.swing.JButton();
configDel = new javax.swing.JButton();
mainPanel = new javax.swing.JPanel();
jLabelMainClass = new javax.swing.JLabel();
jTextFieldMainClass = new javax.swing.JTextField();
jButtonMainClass = new javax.swing.JButton();
jLabelArgs = new javax.swing.JLabel();
jTextFieldArgs = new javax.swing.JTextField();
jLabelWorkingDirectory = new javax.swing.JLabel();
jTextWorkingDirectory = new javax.swing.JTextField();
jButtonWorkingDirectoryBrowse = new javax.swing.JButton();
jLabelVMOptions = new javax.swing.JLabel();
jTextVMOptions = new javax.swing.JTextField();
jLabelVMOptionsExample = new javax.swing.JLabel();
extPanel = new javax.swing.JPanel();
setLayout(new java.awt.GridBagLayout());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 0, 6, 0);
add(configSep, gridBagConstraints);
configPanel.setLayout(new java.awt.GridBagLayout());
configLabel.setLabelFor(configCombo);
org.openide.awt.Mnemonics.setLocalizedText(configLabel, org.openide.util.NbBundle.getMessage(CustomizerRun.class, "CustomizerRun.configLabel")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 0, 2, 0);
configPanel.add(configLabel, gridBagConstraints);
configLabel.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(CustomizerRun.class, "AD_CustomizerRun_Cfg")); // NOI18N
configCombo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "<default>" }));
configCombo.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
configComboActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(2, 6, 2, 0);
configPanel.add(configCombo, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(configNew, org.openide.util.NbBundle.getMessage(CustomizerRun.class, "CustomizerRun.configNew")); // NOI18N
configNew.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
configNewActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 6, 2, 0);
configPanel.add(configNew, gridBagConstraints);
configNew.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(CustomizerRun.class, "AD_CustomizerRun_NewCfg")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(configDel, org.openide.util.NbBundle.getMessage(CustomizerRun.class, "CustomizerRun.configDelete")); // NOI18N
configDel.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
configDelActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 6, 2, 0);
configPanel.add(configDel, gridBagConstraints);
configDel.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(CustomizerRun.class, "AD_CustomizerRun_DeleteCfg")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 0, 6, 0);
add(configPanel, gridBagConstraints);
mainPanel.setLayout(new java.awt.GridBagLayout());
jLabelMainClass.setLabelFor(jTextFieldMainClass);
org.openide.awt.Mnemonics.setLocalizedText(jLabelMainClass, org.openide.util.NbBundle.getMessage(CustomizerRun.class, "LBL_CustomizeRun_Run_MainClass_JLabel")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 0);
mainPanel.add(jLabelMainClass, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 12, 5, 0);
mainPanel.add(jTextFieldMainClass, gridBagConstraints);
jTextFieldMainClass.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getBundle(CustomizerRun.class).getString("AD_jTextFieldMainClass")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jButtonMainClass, org.openide.util.NbBundle.getMessage(CustomizerRun.class, "LBL_CustomizeRun_Run_MainClass_JButton")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 6, 5, 0);
mainPanel.add(jButtonMainClass, gridBagConstraints);
jButtonMainClass.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getBundle(CustomizerRun.class).getString("AD_jButtonMainClass")); // NOI18N
jLabelArgs.setLabelFor(jTextFieldArgs);
org.openide.awt.Mnemonics.setLocalizedText(jLabelArgs, org.openide.util.NbBundle.getMessage(CustomizerRun.class, "LBL_CustomizeRun_Run_Args_JLabel")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 12, 0);
mainPanel.add(jLabelArgs, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 12, 12, 0);
mainPanel.add(jTextFieldArgs, gridBagConstraints);
jTextFieldArgs.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getBundle(CustomizerRun.class).getString("AD_jTextFieldArgs")); // NOI18N
jLabelWorkingDirectory.setLabelFor(jTextWorkingDirectory);
org.openide.awt.Mnemonics.setLocalizedText(jLabelWorkingDirectory, org.openide.util.NbBundle.getMessage(CustomizerRun.class, "LBL_CustomizeRun_Run_Working_Directory")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 0);
mainPanel.add(jLabelWorkingDirectory, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 12, 5, 0);
mainPanel.add(jTextWorkingDirectory, gridBagConstraints);
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("org/netbeans/modules/scala/project/ui/customizer/Bundle"); // NOI18N
jTextWorkingDirectory.getAccessibleContext().setAccessibleDescription(bundle.getString("AD_CustomizeRun_Run_Working_Directory ")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jButtonWorkingDirectoryBrowse, org.openide.util.NbBundle.getMessage(CustomizerRun.class, "LBL_CustomizeRun_Run_Working_Directory_Browse")); // NOI18N
jButtonWorkingDirectoryBrowse.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButtonWorkingDirectoryBrowseActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 6, 5, 0);
mainPanel.add(jButtonWorkingDirectoryBrowse, gridBagConstraints);
jButtonWorkingDirectoryBrowse.getAccessibleContext().setAccessibleDescription(bundle.getString("AD_CustomizeRun_Run_Working_Directory_Browse")); // NOI18N
jLabelVMOptions.setLabelFor(jTextVMOptions);
org.openide.awt.Mnemonics.setLocalizedText(jLabelVMOptions, org.openide.util.NbBundle.getMessage(CustomizerRun.class, "LBL_CustomizeRun_Run_VM_Options")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 0);
mainPanel.add(jLabelVMOptions, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 12, 0, 0);
mainPanel.add(jTextVMOptions, gridBagConstraints);
jTextVMOptions.getAccessibleContext().setAccessibleDescription(bundle.getString("AD_CustomizeRun_Run_VM_Options")); // NOI18N
jLabelVMOptionsExample.setLabelFor(jTextFieldMainClass);
org.openide.awt.Mnemonics.setLocalizedText(jLabelVMOptionsExample, org.openide.util.NbBundle.getMessage(CustomizerRun.class, "LBL_CustomizeRun_Run_VM_Options_Example")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 4;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 12, 12, 0);
mainPanel.add(jLabelVMOptionsExample, gridBagConstraints);
jLabelVMOptionsExample.getAccessibleContext().setAccessibleDescription(bundle.getString("LBL_CustomizeRun_Run_VM_Options_Example")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(6, 0, 6, 0);
add(mainPanel, gridBagConstraints);
extPanel.setLayout(new java.awt.GridBagLayout());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
add(extPanel, gridBagConstraints);
}// </editor-fold>//GEN-END:initComponents
private void initExtPanel(Project p) {
if (compProvider != null) {
J2SERunConfigProvider.ConfigChangeListener ccl = new J2SERunConfigProvider.ConfigChangeListener() {
public void propertiesChanged(Map<String, String> updates) {
// update active configuration
Map<String,String> m = configs.get(uiProperties.activeConfig);
m.putAll(updates);
}
};
JComponent comp = compProvider.createComponent(p, ccl);
if (comp != null) {
java.awt.GridBagConstraints constraints = new java.awt.GridBagConstraints();
constraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
constraints.gridx = 0;
constraints.gridy = 0;
constraints.weightx = 1.0;
constraints.weighty = 1.0;
extPanel.add(comp, constraints);
}
}
}
private void configDelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_configDelActionPerformed
String config = (String) configCombo.getSelectedItem();
assert config != null;
configs.put(config, null);
configChanged(null);
uiProperties.activeConfig = null;
}//GEN-LAST:event_configDelActionPerformed
private void configNewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_configNewActionPerformed
NotifyDescriptor.InputLine d = new NotifyDescriptor.InputLine(
NbBundle.getMessage(CustomizerRun.class, "CustomizerRun.input.prompt"),
NbBundle.getMessage(CustomizerRun.class, "CustomizerRun.input.title"));
if (DialogDisplayer.getDefault().notify(d) != NotifyDescriptor.OK_OPTION) {
return;
}
String name = d.getInputText();
String config = name.replaceAll("[^a-zA-Z0-9_.-]", "_"); // NOI18N
if (configs.get(config) != null) {
DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message(
NbBundle.getMessage(CustomizerRun.class, "CustomizerRun.input.duplicate", config),
NotifyDescriptor.WARNING_MESSAGE));
return;
}
Map<String,String> m = new HashMap<String,String>();
if (!name.equals(config)) {
m.put("$label", name); // NOI18N
}
configs.put(config, m);
configChanged(config);
uiProperties.activeConfig = config;
}//GEN-LAST:event_configNewActionPerformed
private void configComboActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_configComboActionPerformed
String config = (String) configCombo.getSelectedItem();
if (config.length() == 0) {
config = null;
}
configChanged(config);
uiProperties.activeConfig = config;
}//GEN-LAST:event_configComboActionPerformed
private void jButtonWorkingDirectoryBrowseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonWorkingDirectoryBrowseActionPerformed
JFileChooser chooser = new JFileChooser();
FileUtil.preventFileChooserSymlinkTraversal(chooser, null);
chooser.setFileSelectionMode (JFileChooser.DIRECTORIES_ONLY);
chooser.setMultiSelectionEnabled(false);
String workDir = jTextWorkingDirectory.getText();
if (workDir.equals("")) {
workDir = FileUtil.toFile(project.getProjectDirectory()).getAbsolutePath();
}
chooser.setSelectedFile(new File(workDir));
chooser.setDialogTitle(NbBundle.getMessage(CustomizerRun.class, "LBL_CustomizeRun_Run_Working_Directory_Browse_Title"));
if (JFileChooser.APPROVE_OPTION == chooser.showOpenDialog(this)) { //NOI18N
File file = FileUtil.normalizeFile(chooser.getSelectedFile());
jTextWorkingDirectory.setText(file.getAbsolutePath());
}
}//GEN-LAST:event_jButtonWorkingDirectoryBrowseActionPerformed
private void configChanged(String activeConfig) {
DefaultComboBoxModel model = new DefaultComboBoxModel();
model.addElement("");
SortedSet<String> alphaConfigs = new TreeSet<String>(new Comparator<String>() {
Collator coll = Collator.getInstance();
public int compare(String s1, String s2) {
return coll.compare(label(s1), label(s2));
}
private String label(String c) {
Map<String,String> m = configs.get(c);
String label = m.get("$label"); // NOI18N
return label != null ? label : c;
}
});
for (Map.Entry<String,Map<String,String>> entry : configs.entrySet()) {
String config = entry.getKey();
if (config != null && entry.getValue() != null) {
alphaConfigs.add(config);
}
}
for (String c : alphaConfigs) {
model.addElement(c);
}
configCombo.setModel(model);
configCombo.setSelectedItem(activeConfig != null ? activeConfig : "");
Map<String,String> m = configs.get(activeConfig);
Map<String,String> def = configs.get(null);
if (m != null) {
if (compProvider != null) {
compProvider.configUpdated(m);
}
for (int i = 0; i < data.length; i++) {
String v = m.get(keys[i]);
if (v == null) {
// display default value
v = def.get(keys[i]);
}
data[i].setText(v);
}
} // else ??
configDel.setEnabled(activeConfig != null);
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JComboBox configCombo;
private javax.swing.JButton configDel;
private javax.swing.JLabel configLabel;
private javax.swing.JButton configNew;
private javax.swing.JPanel configPanel;
private javax.swing.JSeparator configSep;
private javax.swing.JPanel extPanel;
private javax.swing.JButton jButtonMainClass;
private javax.swing.JButton jButtonWorkingDirectoryBrowse;
private javax.swing.JLabel jLabelArgs;
private javax.swing.JLabel jLabelMainClass;
private javax.swing.JLabel jLabelVMOptions;
private javax.swing.JLabel jLabelVMOptionsExample;
private javax.swing.JLabel jLabelWorkingDirectory;
private javax.swing.JTextField jTextFieldArgs;
private javax.swing.JTextField jTextFieldMainClass;
private javax.swing.JTextField jTextVMOptions;
private javax.swing.JTextField jTextWorkingDirectory;
private javax.swing.JPanel mainPanel;
// End of variables declaration//GEN-END:variables
// Innercasses -------------------------------------------------------------
private class MainClassListener implements ActionListener /*, DocumentListener */ {
private final JButton okButton;
private SourceRoots sourceRoots;
private JTextField mainClassTextField;
MainClassListener( SourceRoots sourceRoots, JTextField mainClassTextField ) {
this.sourceRoots = sourceRoots;
this.mainClassTextField = mainClassTextField;
this.okButton = new JButton (NbBundle.getMessage (CustomizerRun.class, "LBL_ChooseMainClass_OK"));
this.okButton.getAccessibleContext().setAccessibleDescription (NbBundle.getMessage (CustomizerRun.class, "AD_ChooseMainClass_OK"));
}
// Implementation of ActionListener ------------------------------------
/** Handles button events
*/
public void actionPerformed( ActionEvent e ) {
// only chooseMainClassButton can be performed
final MainClassChooser panel = new MainClassChooser (sourceRoots.getRoots());
Object[] options = new Object[] {
okButton,
DialogDescriptor.CANCEL_OPTION
};
panel.addChangeListener (new ChangeListener () {
public void stateChanged(ChangeEvent e) {
if (e.getSource () instanceof MouseEvent && MouseUtils.isDoubleClick (((MouseEvent)e.getSource ()))) {
// click button and finish the dialog with selected class
okButton.doClick ();
} else {
okButton.setEnabled (panel.getSelectedMainClass () != null);
}
}
});
okButton.setEnabled (false);
DialogDescriptor desc = new DialogDescriptor (
panel,
NbBundle.getMessage (CustomizerRun.class, "LBL_ChooseMainClass_Title" ),
true,
options,
options[0],
DialogDescriptor.BOTTOM_ALIGN,
null,
null);
//desc.setMessageType (DialogDescriptor.INFORMATION_MESSAGE);
Dialog dlg = DialogDisplayer.getDefault ().createDialog (desc);
dlg.setVisible (true);
if (desc.getValue() == options[0]) {
mainClassTextField.setText (panel.getSelectedMainClass ());
}
dlg.dispose();
}
}
private final class ConfigListCellRenderer extends JLabel implements ListCellRenderer, UIResource {
public ConfigListCellRenderer () {
setOpaque(true);
}
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
// #93658: GTK needs name to render cell renderer "natively"
setName("ComboBox.listRenderer"); // NOI18N
String config = (String) value;
String label;
if (config == null) {
// uninitialized?
label = null;
} else if (config.length() > 0) {
Map<String,String> m = configs.get(config);
label = m != null ? m.get("$label") : /* temporary? */ null;
if (label == null) {
label = config;
}
} else {
label = NbBundle.getBundle("org.netbeans.modules.scala.project.Bundle").getString("J2SEConfigurationProvider.default.label");
}
setText(label);
if ( isSelected ) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
}
else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
return this;
}
// #93658: GTK needs name to render cell renderer "natively"
public String getName() {
String name = super.getName();
return name == null ? "ComboBox.renderer" : name; // NOI18N
}
}
}