package org.netbeans.gradle.project.properties.ui;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.net.URL;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Objects;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import org.jtrim.utils.ExceptionHelper;
import org.netbeans.gradle.project.NbStrings;
import org.netbeans.gradle.project.api.config.ActiveSettingsQuery;
import org.netbeans.gradle.project.api.config.PropertyReference;
import org.netbeans.gradle.project.api.config.ui.CustomizerCategoryId;
import org.netbeans.gradle.project.api.config.ui.ProfileBasedSettingsCategory;
import org.netbeans.gradle.project.api.config.ui.ProfileBasedSettingsPage;
import org.netbeans.gradle.project.api.config.ui.ProfileBasedSettingsPageFactory;
import org.netbeans.gradle.project.api.config.ui.ProfileEditor;
import org.netbeans.gradle.project.api.config.ui.ProfileEditorFactory;
import org.netbeans.gradle.project.api.config.ui.ProfileInfo;
import org.netbeans.gradle.project.api.config.ui.StoredSettings;
import org.netbeans.gradle.project.java.JavaExtensionDef;
import org.netbeans.gradle.project.java.properties.JavaProjectProperties;
import org.netbeans.gradle.project.properties.ExtensionActiveSettingsQuery;
import org.netbeans.gradle.project.properties.NbGradleCommonProperties;
import org.netbeans.gradle.project.properties.global.GlobalSettingsPage;
import org.netbeans.gradle.project.properties.global.JavaSourcesDisplayMode;
import org.netbeans.gradle.project.util.NbFileUtils;
import org.netbeans.gradle.project.util.NbGuiUtils;
import org.netbeans.gradle.project.util.StringUtils;
import org.netbeans.gradle.project.view.DisplayableTaskVariable;
@SuppressWarnings("serial")
public class AppearancePanel extends javax.swing.JPanel implements ProfileEditorFactory {
private static final URL HELP_URL = NbFileUtils.getSafeURL("https://github.com/kelemen/netbeans-gradle-project/wiki/Appearance");
private static final CustomizerCategoryId CATEGORY_ID = new CustomizerCategoryId(
AppearancePanel.class.getName() + ".settings",
NbStrings.getAppearanceCategoryName());
private boolean allowInherit;
private String defaultPatternValue;
public AppearancePanel(boolean allowInherit) {
this.allowInherit = allowInherit;
this.defaultPatternValue = "";
initComponents();
setupInitialInheritChecks(allowInherit, jSourcesDisplayModeInheritCheck, jProjectNodeNameInheritCheck);
fillJavaSourcesDisplayModeCombo();
fillPatternCombo();
setupEnableDisable();
}
private static void setupInheritCheck(JCheckBox inheritCheck, JComponent... components) {
NbGuiUtils.enableBasedOnCheck(inheritCheck, false, components);
}
private void setupEnableDisable() {
setupInheritCheck(jSourcesDisplayModeInheritCheck, jSourcesDisplayMode);
setupInheritCheck(jProjectNodeNameInheritCheck, jDisplayNameCombo, jCustomDisplayNameEdit);
jDisplayNameCombo.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
updateCustomEditVisibility();
}
});
updateCustomEditVisibility();
}
public static ProfileBasedSettingsCategory createSettingsCategory(final boolean allowInherit) {
return new ProfileBasedSettingsCategory(CATEGORY_ID, new ProfileBasedSettingsPageFactory() {
@Override
public ProfileBasedSettingsPage createSettingsPage() {
return AppearancePanel.createSettingsPage(allowInherit);
}
});
}
public static GlobalSettingsPage createSettingsPage(boolean allowInherit) {
GlobalSettingsPage.Builder result = new GlobalSettingsPage.Builder(new AppearancePanel(allowInherit));
result.setHelpUrl(HELP_URL);
return result.create();
}
private static void setupInitialInheritChecks(boolean allowInherit, JCheckBox... checkboxes) {
if (!allowInherit) {
for (JCheckBox checkbox: checkboxes) {
checkbox.setSelected(false);
}
}
for (JCheckBox checkbox: checkboxes) {
checkbox.setVisible(allowInherit);
}
}
private void updateCustomEditVisibility() {
NamePatternItem selected = (NamePatternItem)jDisplayNameCombo.getSelectedItem();
if (selected == null) {
jCustomDisplayNameEdit.setVisible(false);
return;
}
boolean newVisible = selected.pattern == null;
if (newVisible != jCustomDisplayNameEdit.isVisible()) {
jCustomDisplayNameEdit.setVisible(newVisible);
validate();
repaint();
}
}
@Override
public ProfileEditor startEditingProfile(ProfileInfo profileInfo, ActiveSettingsQuery profileQuery) {
return new PropertyRefs(profileQuery);
}
private void fillJavaSourcesDisplayModeCombo() {
jSourcesDisplayMode.removeAllItems();
JavaSourcesDisplayMode[] displayModes = JavaSourcesDisplayMode.values();
SourcesDisplayModeItem[] items = new SourcesDisplayModeItem[displayModes.length];
for (int i = 0; i < items.length; i++) {
items[i] = new SourcesDisplayModeItem(displayModes[i]);
}
Arrays.sort(items, new Comparator<SourcesDisplayModeItem>() {
@Override
public int compare(SourcesDisplayModeItem o1, SourcesDisplayModeItem o2) {
JavaSourcesDisplayMode mode1 = o1.displayMode;
JavaSourcesDisplayMode mode2 = o2.displayMode;
if (mode1 == mode2) {
return 0;
}
if (mode1 == JavaSourcesDisplayMode.DEFAULT_MODE) {
return -1;
}
if (mode2 == JavaSourcesDisplayMode.DEFAULT_MODE) {
return 1;
}
return StringUtils.STR_CMP.compare(o1.toString(), o2.toString());
}
});
for (SourcesDisplayModeItem item: items) {
jSourcesDisplayMode.addItem(item);
}
}
private void selectSourcesDisplayMode(
JavaSourcesDisplayMode newMode,
PropertyReference<JavaSourcesDisplayMode> modeRef) {
JavaSourcesDisplayMode shownMode = newMode != null ? newMode : modeRef.getActiveValue();
if (shownMode != null) {
jSourcesDisplayMode.setSelectedItem(new SourcesDisplayModeItem(shownMode));
}
if (allowInherit) {
jSourcesDisplayModeInheritCheck.setSelected(newMode == null);
}
}
private JavaSourcesDisplayMode getJavaSourcesDisplayMode() {
if (allowInherit && jSourcesDisplayModeInheritCheck.isSelected()) {
return null;
}
SourcesDisplayModeItem selected = (SourcesDisplayModeItem)jSourcesDisplayMode.getSelectedItem();
if (selected == null) {
return JavaSourcesDisplayMode.DEFAULT_MODE;
}
return selected.displayMode;
}
private void updatePattern(
String value,
PropertyReference<? extends String> valueWitFallbacks) {
String displayedValue = value != null
? value
: (valueWitFallbacks != null ? valueWitFallbacks.getActiveValue() : null);
ExceptionHelper.checkNotNullArgument(displayedValue, "displayedValue");
defaultPatternValue = displayedValue;
selectPattern(defaultPatternValue);
if (allowInherit) {
jProjectNodeNameInheritCheck.setSelected(value == null);
}
}
private String getNamePattern() {
if (allowInherit && jProjectNodeNameInheritCheck.isSelected()) {
return null;
}
NamePatternItem selected = (NamePatternItem)jDisplayNameCombo.getSelectedItem();
if (selected == null) {
return defaultPatternValue;
}
String pattern = selected.pattern;
pattern = pattern != null ? pattern : jCustomDisplayNameEdit.getText().trim();
if (pattern.isEmpty()) {
return defaultPatternValue;
}
return pattern;
}
private void fillPatternCombo() {
jDisplayNameCombo.removeAllItems();
jDisplayNameCombo.addItem(new NamePatternItem(DisplayableTaskVariable.PROJECT_NAME.getScriptReplaceConstant()));
jDisplayNameCombo.addItem(new NamePatternItem(DisplayableTaskVariable.PROJECT_PATH.getScriptReplaceConstant()));
jDisplayNameCombo.addItem(new NamePatternItem(DisplayableTaskVariable.PROJECT_NAME.getScriptReplaceConstant()
+ "-"
+ DisplayableTaskVariable.PROJECT_VERSION.getScriptReplaceConstant()));
jDisplayNameCombo.addItem(new NamePatternItem(DisplayableTaskVariable.PROJECT_GROUP.getScriptReplaceConstant()
+ "."
+ DisplayableTaskVariable.PROJECT_NAME.getScriptReplaceConstant()));
jDisplayNameCombo.addItem(new NamePatternItem(DisplayableTaskVariable.PROJECT_GROUP.getScriptReplaceConstant()
+ "."
+ DisplayableTaskVariable.PROJECT_NAME.getScriptReplaceConstant()
+ "-"
+ DisplayableTaskVariable.PROJECT_VERSION.getScriptReplaceConstant()));
jDisplayNameCombo.addItem(new NamePatternItem(DisplayableTaskVariable.PARENT_NAME.getScriptReplaceConstant()
+ "."
+ DisplayableTaskVariable.PROJECT_NAME.getScriptReplaceConstant()));
jDisplayNameCombo.addItem(new NamePatternItem(NbStrings.getCustomNamePatternLabel(), null));
}
private void selectPattern(String namePattern) {
jCustomDisplayNameEdit.setText(namePattern);
int itemCount = jDisplayNameCombo.getItemCount();
for (int i = 0; i < itemCount; i++) {
NamePatternItem patternItem = jDisplayNameCombo.getItemAt(i);
if (Objects.equals(namePattern, patternItem.pattern)) {
jDisplayNameCombo.setSelectedIndex(i);
return;
}
}
for (int i = itemCount - 1; i >= 0; i--) {
NamePatternItem patternItem = jDisplayNameCombo.getItemAt(i);
if (patternItem.pattern == null) {
jDisplayNameCombo.setSelectedIndex(i);
return;
}
}
}
private static final class NamePatternItem {
private final String displayName;
public final String pattern;
public NamePatternItem(String pattern) {
this(pattern, pattern);
}
public NamePatternItem(String displayName, String pattern) {
this.displayName = displayName;
this.pattern = pattern;
}
@Override
public String toString() {
return displayName;
}
}
private static class SourcesDisplayModeItem {
private final String displayName;
private final JavaSourcesDisplayMode displayMode;
public SourcesDisplayModeItem(JavaSourcesDisplayMode displayMode) {
this.displayName = NbStrings.getJavaSourcesDisplayMode(displayMode);
this.displayMode = displayMode;
}
@Override
public int hashCode() {
int hash = 7;
hash = 29 * hash + Objects.hashCode(this.displayMode);
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
final SourcesDisplayModeItem other = (SourcesDisplayModeItem)obj;
return this.displayMode == other.displayMode;
}
@Override
public String toString() {
return displayName;
}
}
private final class PropertyRefs implements ProfileEditor {
private final PropertyReference<String> displayNamePatternRef;
private final PropertyReference<JavaSourcesDisplayMode> javaSourcesDisplayModeRef;
public PropertyRefs(ActiveSettingsQuery settingsQuery) {
displayNamePatternRef = NbGradleCommonProperties.displayNamePattern(settingsQuery);
ActiveSettingsQuery javaExtQuery
= new ExtensionActiveSettingsQuery(settingsQuery, JavaExtensionDef.EXTENSION_NAME);
javaSourcesDisplayModeRef = JavaProjectProperties.javaSourcesDisplayMode(javaExtQuery);
}
@Override
public StoredSettings readFromSettings() {
return new StoredSettingsImpl(this);
}
@Override
public StoredSettings readFromGui() {
return new StoredSettingsImpl(this, AppearancePanel.this);
}
}
private class StoredSettingsImpl implements StoredSettings {
private final PropertyRefs properties;
private final String displayNamePattern;
private final JavaSourcesDisplayMode javaSourcesDisplayMode;
public StoredSettingsImpl(PropertyRefs properties) {
this.properties = properties;
this.displayNamePattern = properties.displayNamePatternRef.tryGetValueWithoutFallback();
this.javaSourcesDisplayMode = properties.javaSourcesDisplayModeRef.tryGetValueWithoutFallback();
}
public StoredSettingsImpl(PropertyRefs properties, AppearancePanel panel) {
this.properties = properties;
this.displayNamePattern = panel.getNamePattern();
this.javaSourcesDisplayMode = panel.getJavaSourcesDisplayMode();
}
@Override
public void displaySettings() {
updatePattern(displayNamePattern, properties.displayNamePatternRef);
selectSourcesDisplayMode(javaSourcesDisplayMode, properties.javaSourcesDisplayModeRef);
}
@Override
public void saveSettings() {
properties.displayNamePatternRef.setValue(displayNamePattern);
properties.javaSourcesDisplayModeRef.setValue(javaSourcesDisplayMode);
}
}
/**
* 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", "Convert2Diamond"})
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jProjectNodeNameHolder = new javax.swing.JPanel();
jSourcesDisplayCaption = new javax.swing.JLabel();
jSourcesDisplayMode = new javax.swing.JComboBox<>();
jCustomDisplayNameEdit = new javax.swing.JTextField();
jProjectNodeNameInheritCheck = new javax.swing.JCheckBox();
jDisplayNameCombo = new javax.swing.JComboBox<>();
jDisplayNameCaption = new javax.swing.JLabel();
jSourcesDisplayModeInheritCheck = new javax.swing.JCheckBox();
jProjectNodeNameHolder.setLayout(new java.awt.GridLayout(1, 1));
org.openide.awt.Mnemonics.setLocalizedText(jSourcesDisplayCaption, org.openide.util.NbBundle.getMessage(AppearancePanel.class, "AppearancePanel.jSourcesDisplayCaption.text")); // NOI18N
jCustomDisplayNameEdit.setText(org.openide.util.NbBundle.getMessage(AppearancePanel.class, "AppearancePanel.jCustomDisplayNameEdit.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jProjectNodeNameInheritCheck, org.openide.util.NbBundle.getMessage(AppearancePanel.class, "AppearancePanel.jProjectNodeNameInheritCheck.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jDisplayNameCaption, org.openide.util.NbBundle.getMessage(AppearancePanel.class, "AppearancePanel.jDisplayNameCaption.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jSourcesDisplayModeInheritCheck, org.openide.util.NbBundle.getMessage(AppearancePanel.class, "AppearancePanel.jSourcesDisplayModeInheritCheck.text")); // NOI18N
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jProjectNodeNameHolder, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jDisplayNameCaption)
.addComponent(jSourcesDisplayCaption))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jDisplayNameCombo, 0, 184, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jProjectNodeNameInheritCheck))
.addComponent(jCustomDisplayNameEdit)
.addGroup(layout.createSequentialGroup()
.addComponent(jSourcesDisplayMode, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jSourcesDisplayModeInheritCheck)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jProjectNodeNameHolder, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jDisplayNameCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jDisplayNameCaption)
.addComponent(jProjectNodeNameInheritCheck))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jCustomDisplayNameEdit, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jSourcesDisplayMode, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jSourcesDisplayCaption)
.addComponent(jSourcesDisplayModeInheritCheck))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JTextField jCustomDisplayNameEdit;
private javax.swing.JLabel jDisplayNameCaption;
private javax.swing.JComboBox<NamePatternItem> jDisplayNameCombo;
private javax.swing.JPanel jProjectNodeNameHolder;
private javax.swing.JCheckBox jProjectNodeNameInheritCheck;
private javax.swing.JLabel jSourcesDisplayCaption;
private javax.swing.JComboBox<SourcesDisplayModeItem> jSourcesDisplayMode;
private javax.swing.JCheckBox jSourcesDisplayModeInheritCheck;
// End of variables declaration//GEN-END:variables
}