blob: 8da6f6ab3fb37dd1a40595c2033061e44ff18b43 [file] [log] [blame]
/*
* 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.maven.customizer;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import javax.swing.plaf.UIResource;
import org.netbeans.api.java.platform.JavaPlatform;
import org.netbeans.api.java.platform.JavaPlatformManager;
import org.netbeans.api.java.platform.PlatformsCustomizer;
import org.netbeans.api.java.platform.Specification;
import org.netbeans.api.java.source.BuildArtifactMapper;
import org.netbeans.api.project.Project;
import org.netbeans.modules.java.api.common.util.CommonProjectUtils;
import org.netbeans.modules.maven.api.Constants;
import org.netbeans.modules.maven.api.PluginPropertyUtils;
import org.netbeans.modules.maven.api.customizer.ModelHandle2;
import org.netbeans.modules.maven.api.customizer.support.CheckBoxUpdater;
import org.netbeans.modules.maven.api.customizer.support.ComboBoxUpdater;
import org.netbeans.modules.maven.classpath.BootClassPathImpl;
import org.netbeans.modules.maven.model.ModelOperation;
import org.netbeans.modules.maven.model.pom.Build;
import org.netbeans.modules.maven.model.pom.Configuration;
import org.netbeans.modules.maven.model.pom.POMModel;
import org.netbeans.modules.maven.model.pom.Plugin;
import org.netbeans.modules.maven.model.pom.Properties;
import org.netbeans.modules.maven.options.DontShowAgainSettings;
import org.netbeans.modules.maven.options.MavenVersionSettings;
import org.netbeans.spi.project.AuxiliaryProperties;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.awt.HtmlBrowser;
import org.openide.util.Exceptions;
import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;
import org.openide.util.Pair;
import org.openide.util.Union2;
import org.openide.util.WeakListeners;
/**
*
* @author mkleint
*/
public class CompilePanel extends javax.swing.JPanel implements HelpCtx.Provider {
private static final Logger LOG = Logger.getLogger(CompilePanel.class.getName());
private static final String PARAM_DEBUG = "debug";//NOI18N
private static final String PARAM_DEPRECATION = "showDeprecation";
private final ModelHandle2 handle;
private final Project project;
private static boolean warningShown = false;
private Color origComPlatformFore;
/** Creates new form CompilePanel */
public CompilePanel(ModelHandle2 handle, Project prj, MavenProjectPropertiesUiSupport uiSupport) {
initComponents();
this.handle = handle;
project = prj;
comJavaPlatform.setModel(uiSupport.getPlatformComboBoxModel());
comJavaPlatform.setRenderer(new PlatformsRenderer());
origComPlatformFore = comJavaPlatform.getForeground();
btnLearnMore.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
btnLearnMore.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
HtmlBrowser.URLDisplayer.getDefault().showURL(new URL("http://wiki.netbeans.org/FaqCompileOnSave#Using_Compile_on_Save_in_Maven_Projects"));
} catch (MalformedURLException ex) {
Exceptions.printStackTrace(ex);
}
}
});
initValues();
}
private void initValues() {
boolean cosSupported = BuildArtifactMapper.isCompileOnSaveSupported();
if (!cosSupported) {
cbCompileOnSave.setEnabled(false);
}
new CheckBoxUpdater(cbCompileOnSave) {
private String modifiedValue;
private ModelOperation<POMModel> operation = new ModelOperation<POMModel>() {
@Override
public void performOperation(POMModel model) {
Properties modprops = model.getProject().getProperties();
if (modprops == null) {
modprops = model.getFactory().createProperties();
model.getProject().setProperties(modprops);
}
modprops.setProperty(Constants.HINT_COMPILE_ON_SAVE, modifiedValue); //NOI18N
}
};
@Override
public boolean getDefaultValue() {
return cosSupported;
}
@Override
public Boolean getValue() {
if (!cosSupported) {
return false;
}
String val = modifiedValue;
if (val == null) {
val = handle.getRawAuxiliaryProperty(Constants.HINT_COMPILE_ON_SAVE, true);
}
if (val == null) {
java.util.Properties props = handle.getProject().getProperties();
if (props != null) {
val = props.getProperty(Constants.HINT_COMPILE_ON_SAVE);
}
}
return val != null ? (!"none".equals(val)) : null;
}
@Override
public void setValue(Boolean v) {
handle.removePOMModification(operation);
modifiedValue = null;
String value = v != null ? (v ? "all" : "none") : "all";
if ("all".equals(value)) {
if (!warningShown && DontShowAgainSettings.getDefault().showWarningAboutApplicationCoS()) {
WarnPanel panel = new WarnPanel(NbBundle.getMessage(CompilePanel.class, "HINT_ApplicationCoS"));
NotifyDescriptor dd = new NotifyDescriptor.Message(panel, NotifyDescriptor.PLAIN_MESSAGE);
DialogDisplayer.getDefault().notify(dd);
if (panel.disabledWarning()) {
DontShowAgainSettings.getDefault().dontshowWarningAboutApplicationCoSAnymore();
}
warningShown = true;
}
}
boolean hasConfig = handle.getRawAuxiliaryProperty(Constants.HINT_COMPILE_ON_SAVE, true) != null;
org.netbeans.modules.maven.model.pom.Project p = handle.getPOMModel().getProject();
if (p.getProperties() != null && p.getProperties().getProperty(Constants.HINT_COMPILE_ON_SAVE) != null) {
modifiedValue = value;
handle.addPOMModification(operation);
if (hasConfig) {
// in this case clean up the auxiliary config
handle.setRawAuxiliaryProperty(Constants.HINT_COMPILE_ON_SAVE, null, true);
}
} else {
handle.setRawAuxiliaryProperty(Constants.HINT_COMPILE_ON_SAVE, value, true);
}
}
};
new CheckBoxUpdater(cbDebug) {
@Override
public Boolean getValue() {
String val = getCompilerParam(handle,PARAM_DEBUG);
if (val != null) {
return Boolean.valueOf(val);
}
return null;
}
@Override
public void setValue(Boolean value) {
String text;
if (value == null) {
//TODO we should attempt to remove the configuration
// from pom if this parameter is the only one defined.
text = "" + getDefaultValue();
} else {
text = value.toString();
}
modifyCompilerParamOperation(handle, PARAM_DEBUG, text);
}
@Override
public boolean getDefaultValue() {
return true;
}
};
new CheckBoxUpdater(cbDeprecate) {
@Override
public Boolean getValue() {
String val = getCompilerParam(handle,PARAM_DEPRECATION);
if (val != null) {
return Boolean.valueOf(val);
}
return null;
}
@Override
public void setValue(Boolean value) {
String text;
if (value == null) {
//TODO we should attempt to remove the configuration
// from pom if this parameter is the only one defined.
text = "" + getDefaultValue();
} else {
text = value.toString();
}
modifyCompilerParamOperation(handle, PARAM_DEPRECATION, text);
}
@Override
public boolean getDefaultValue() {
return false;
}
};
// java platform updater
ComboBoxUpdater<Union2<JavaPlatform,String>> compleComboBoxUpdater = new ComboBoxUpdater<Union2<JavaPlatform,String>>(comJavaPlatform, lblJavaPlatform) {
private String modifiedValue;
private String DEFAULT_PLATFORM_VALUE = "@@DEFAULT@@";
private ModelOperation<POMModel> operation = new ModelOperation<POMModel>() {
@Override
public void performOperation(POMModel model) {
Properties modprops = model.getProject().getProperties();
if (modprops == null) {
modprops = model.getFactory().createProperties();
model.getProject().setProperties(modprops);
}
modprops.setProperty(Constants.HINT_JDK_PLATFORM, modifiedValue); //NOI18N
}
};
@Override
public Union2<JavaPlatform,String> getValue() {
String val = modifiedValue;
if (val == null) {
Properties props = handle.getPOMModel().getProject().getProperties();
if (props != null) {
val = props.getProperty(Constants.HINT_JDK_PLATFORM);
}
}
if (val == null) {
val = handle.getRawAuxiliaryProperty(Constants.HINT_JDK_PLATFORM, true);
}
if (val != null) {
if (val.equals(DEFAULT_PLATFORM_VALUE)) {
return Union2.createFirst(JavaPlatformManager.getDefault().getDefaultPlatform());
}
return Optional.ofNullable(BootClassPathImpl.getActivePlatform(val))
.filter(JavaPlatform::isValid)
.map((jp) -> Union2.<JavaPlatform,String>createFirst(jp))
.orElse(Union2.createSecond(val));
} else {
final Pair<String,JavaPlatform> nameJpP = getSelPlatform();
return Optional.ofNullable(nameJpP.second())
.filter(JavaPlatform::isValid)
.map((jp) -> Union2.<JavaPlatform,String>createFirst(jp))
.orElseGet(() -> Union2.<JavaPlatform,String>createSecond(nameJpP.first()));
}
}
@Override
public Union2<JavaPlatform,String> getDefaultValue() {
return Union2.createFirst(JavaPlatformManager.getDefault().getDefaultPlatform());
}
@Override
public void setValue(Union2<JavaPlatform,String> value) {
handle.removePOMModification(operation);
modifiedValue = null;
final Union2<JavaPlatform,String> platf = value == null ?
Union2.createFirst(JavaPlatformManager.getDefault().getDefaultPlatform()) :
value;
final String platformId;
if (platf.hasFirst()) {
final JavaPlatform jp = platf.first();
platformId = JavaPlatformManager.getDefault().getDefaultPlatform().equals(jp) ?
null :
jp.getProperties().get("platform.ant.name"); //NOI18N
} else {
platformId = platf.second();
}
boolean hasConfig = handle.getRawAuxiliaryProperty(Constants.HINT_JDK_PLATFORM, true) != null;
//TODO also try to take the value in pom vs inherited pom value into account.
modifiedValue = platformId == null ? DEFAULT_PLATFORM_VALUE : platformId;
if (handle.getProject().getProperties().containsKey(Constants.HINT_JDK_PLATFORM)) {
handle.addPOMModification(operation);
if (hasConfig) {
// in this case clean up the auxiliary config
handle.setRawAuxiliaryProperty(Constants.HINT_JDK_PLATFORM, null, true);
}
} else {
handle.setRawAuxiliaryProperty(Constants.HINT_JDK_PLATFORM, platformId, true);
}
}
};
// the selected item is not set until the compile panel is shown
// so, invoke these methods for setting it
compleComboBoxUpdater.ancestorAdded(null);
compleComboBoxUpdater.ancestorRemoved(null);
}
private Pair<String,JavaPlatform> getSelPlatform () {
String platformId = project.getLookup().lookup(AuxiliaryProperties.class).
get(Constants.HINT_JDK_PLATFORM, true);
return Pair.of(platformId,BootClassPathImpl.getActivePlatform(platformId));
}
/** 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.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
lblJavaPlatform = new javax.swing.JLabel();
comJavaPlatform = new javax.swing.JComboBox();
btnMngPlatform = new javax.swing.JButton();
lblHint1 = new javax.swing.JLabel();
lblHint2 = new javax.swing.JLabel();
cbDebug = new javax.swing.JCheckBox();
cbDeprecate = new javax.swing.JCheckBox();
cbCompileOnSave = new javax.swing.JCheckBox();
btnLearnMore = new javax.swing.JButton();
setPreferredSize(new java.awt.Dimension(576, 303));
lblJavaPlatform.setLabelFor(comJavaPlatform);
org.openide.awt.Mnemonics.setLocalizedText(lblJavaPlatform, org.openide.util.NbBundle.getMessage(CompilePanel.class, "CompilePanel.lblJavaPlatform.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(btnMngPlatform, org.openide.util.NbBundle.getMessage(CompilePanel.class, "CompilePanel.btnMngPlatform.text")); // NOI18N
btnMngPlatform.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnMngPlatformActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(lblHint1, org.openide.util.NbBundle.getMessage(CompilePanel.class, "CompilePanel.lblHint1.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(lblHint2, org.openide.util.NbBundle.getMessage(CompilePanel.class, "CompilePanel.lblHint2.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(cbDebug, org.openide.util.NbBundle.getMessage(CompilePanel.class, "CompilePanel.cbDebug.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(cbDeprecate, org.openide.util.NbBundle.getMessage(CompilePanel.class, "CompilePanel.cbDeprecate.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(cbCompileOnSave, org.openide.util.NbBundle.getMessage(CompilePanel.class, "CompilePanel.cbCompileOnSave.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(btnLearnMore, org.openide.util.NbBundle.getMessage(CompilePanel.class, "CompilePanel.btnLearnMore.text")); // NOI18N
btnLearnMore.setBorderPainted(false);
btnLearnMore.setContentAreaFilled(false);
btnLearnMore.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(cbDebug)
.addComponent(cbDeprecate)
.addComponent(lblHint1)
.addComponent(lblHint2))
.addGap(0, 24, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(cbCompileOnSave, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
.addComponent(lblJavaPlatform)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(comJavaPlatform, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnMngPlatform)))
.addContainerGap())
.addGroup(layout.createSequentialGroup()
.addGap(30, 30, 30)
.addComponent(btnLearnMore, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lblJavaPlatform)
.addComponent(comJavaPlatform, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(btnMngPlatform))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(cbCompileOnSave)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lblHint1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lblHint2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnLearnMore, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(cbDebug)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(cbDeprecate)
.addContainerGap(108, Short.MAX_VALUE))
);
btnMngPlatform.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(CompilePanel.class, "CompilePanel.btnMngPlatform.AccessibleContext.accessibleDescription")); // NOI18N
}// </editor-fold>//GEN-END:initComponents
private void btnMngPlatformActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnMngPlatformActionPerformed
// TODO add your handling code here:
PlatformsCustomizer.showCustomizer(getSelPlatform().second());
}//GEN-LAST:event_btnMngPlatformActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnLearnMore;
private javax.swing.JButton btnMngPlatform;
private javax.swing.JCheckBox cbCompileOnSave;
private javax.swing.JCheckBox cbDebug;
private javax.swing.JCheckBox cbDeprecate;
private javax.swing.JComboBox comJavaPlatform;
private javax.swing.JLabel lblHint1;
private javax.swing.JLabel lblHint2;
private javax.swing.JLabel lblJavaPlatform;
// End of variables declaration//GEN-END:variables
private static final String CONFIGURATION_EL = "configuration";//NOI18N
private final Map<String, CompilerParamOperation> operations = new HashMap<String, CompilerParamOperation>();
/**
* update the debug param of project to given value.
*
* @param handle handle which models are to be updated
* @param sourceLevel the sourcelevel to set
*/
private void modifyCompilerParamOperation(ModelHandle2 handle, String param, String value) {
String debug = PluginPropertyUtils.getPluginProperty(handle.getProject(),
Constants.GROUP_APACHE_PLUGINS, Constants.PLUGIN_COMPILER, param,
"compile"); //NOI18N
if (debug != null && debug.contains(value)) {
ModelOperation<POMModel> removed = operations.remove(param);
if (removed != null) {
handle.removePOMModification(removed);
}
return;
}
ModelOperation<POMModel> removed = operations.remove(param);
if (removed != null) {
handle.removePOMModification(removed);
}
CompilerParamOperation added = new CompilerParamOperation(param, value);
operations.put(param, added);
handle.addPOMModification(added);
}
private class CompilerParamOperation implements ModelOperation<POMModel> {
private final String value;
private final String param;
public CompilerParamOperation(String param, String value) {
this.param = param;
this.value = value;
}
public String getValue() {
return value;
}
@Override
public void performOperation(POMModel model) {
Plugin old = null;
Plugin plugin;
Build bld = model.getProject().getBuild();
if (bld != null) {
old = bld.findPluginById(Constants.GROUP_APACHE_PLUGINS, Constants.PLUGIN_COMPILER);
} else {
bld = model.getFactory().createBuild();
model.getProject().setBuild(bld);
}
if (old != null) {
plugin = old;
} else {
plugin = model.getFactory().createPlugin();
plugin.setGroupId(Constants.GROUP_APACHE_PLUGINS);
plugin.setArtifactId(Constants.PLUGIN_COMPILER);
plugin.setVersion(MavenVersionSettings.getDefault().getVersion(MavenVersionSettings.VERSION_COMPILER));
bld.addPlugin(plugin);
}
Configuration config = plugin.getConfiguration();
if (config == null) {
config = model.getFactory().createConfiguration();
plugin.setConfiguration(config);
}
config.setSimpleParameter(param, value);
}
}
String getCompilerParam(ModelHandle2 handle, String param) {
CompilerParamOperation oper = operations.get(param);
if (oper != null) {
return oper.getValue();
}
String value = PluginPropertyUtils.getPluginProperty(handle.getProject(),
Constants.GROUP_APACHE_PLUGINS, Constants.PLUGIN_COMPILER, param,
"compile"); //NOI18N
if (value != null) {
return value;
}
return null;
}
static class PlatformsModel extends AbstractListModel implements ComboBoxModel, PropertyChangeListener {
private static final long serialVersionUID = 1L;
private List<Union2<JavaPlatform,String>> data;
private Union2<JavaPlatform,String> sel;
private final Project project;
private final ModelHandle2 handle;
public PlatformsModel(Project project, ModelHandle2 handle) {
this.project = project;
this.handle = handle;
JavaPlatformManager jpm = JavaPlatformManager.getDefault();
getPlatforms(jpm);
jpm.addPropertyChangeListener(WeakListeners.propertyChange(this, jpm));
sel = Union2.createFirst(jpm.getDefaultPlatform());
}
@Override
public int getSize() {
return data.size();
}
@Override
public Object getElementAt(int index) {
return data.get(index);
}
@Override
public void setSelectedItem(Object anItem) {
sel = (Union2<JavaPlatform,String>)anItem;
fireContentsChanged(this, 0, data.size());
}
@Override
public Union2<JavaPlatform,String> getSelectedItem() {
return sel;
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
JavaPlatformManager jpm = JavaPlatformManager.getDefault();
getPlatforms(jpm);
fireContentsChanged(this, 0, data.size());
}
private void getPlatforms(JavaPlatformManager jpm) {
final List<Union2<JavaPlatform,String>> tmp = new ArrayList<>();
Arrays.stream(jpm.getPlatforms(null, new Specification (CommonProjectUtils.J2SE_PLATFORM_TYPE, null)))
.filter(JavaPlatform::isValid)
.peek((jp) -> LOG.log(Level.FINE, "Adding JavaPlaform: {0}", jp.getDisplayName())) //NOI18N
.map((jp) -> Union2.<JavaPlatform,String>createFirst(jp))
.forEach(tmp::add);
String val = null;
final Properties props = handle.getPOMModel().getProject().getProperties();
if (props != null) {
val = props.getProperty(Constants.HINT_JDK_PLATFORM);
}
if (val == null) {
val = handle.getRawAuxiliaryProperty(Constants.HINT_JDK_PLATFORM, true);
}
String broken = null;
if (val != null) {
JavaPlatform jp;
if ((jp = BootClassPathImpl.getActivePlatform(val)) == null || !jp.isValid()) {
broken = val;
}
} else {
final Pair<String,JavaPlatform> nameJpP = getSelPlatform();
if (nameJpP.second() == null || !nameJpP.second().isValid()) {
broken = nameJpP.first();
}
}
if (broken != null) {
tmp.add(Union2.createSecond(broken));
}
data = tmp;
}
private Pair<String, JavaPlatform> getSelPlatform() {
String platformId = project.getLookup().lookup(AuxiliaryProperties.class).
get(Constants.HINT_JDK_PLATFORM, true);
return Pair.of(platformId, BootClassPathImpl.getActivePlatform(platformId));
}
}
private class PlatformsRenderer extends JLabel implements ListCellRenderer, UIResource {
public PlatformsRenderer() {
setOpaque(true);
}
@NbBundle.Messages({
"# {0} - platform name",
"TXT_BrokenPlatformFmt=Missing platform: {0}"
})
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected,
boolean cellHasFocus) {
// #89393: GTK needs name to render cell renderer "natively"
setName("ComboBox.listRenderer"); // NOI18N
final String strValue;
if (value instanceof Union2) {
final Union2<JavaPlatform,String> u2 = (Union2<JavaPlatform,String>) value;
if (u2.hasFirst()) {
strValue = u2.first().getDisplayName();
} else {
strValue = "<html><font color=\"#A40000\">" //NOI18N
+ Bundle.TXT_BrokenPlatformFmt(u2.second());
}
} else {
strValue = Optional.ofNullable(value)
.map(Object::toString)
.orElse(""); //NOI18N
}
setText(strValue);
if ( isSelected ) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
return this;
}
// #89393: GTK needs name to render cell renderer "natively"
@Override
public String getName() {
String name = super.getName();
return name == null ? "ComboBox.renderer" : name; // NOI18N
}
} // end of PlatformsRenderer
@Override
public HelpCtx getHelpCtx() {
return CustomizerProviderImpl.HELP_CTX;
}
}