package org.netbeans.gradle.project.properties.ui; import java.net.URL; import java.util.ArrayList; import java.util.List; import javax.swing.DefaultListModel; import javax.swing.JComponent; import javax.swing.ListModel; import org.jtrim.property.BoolProperties; import org.jtrim.property.PropertyFactory; import org.jtrim.property.PropertySource; import org.jtrim.property.ValueConverter; import org.netbeans.gradle.project.NbStrings; import org.netbeans.gradle.project.api.config.ActiveSettingsQuery; 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.JavaDebuggingPanel; import org.netbeans.gradle.project.properties.ExtensionActiveSettingsQuery; import org.netbeans.gradle.project.properties.global.GlobalSettingsPage; import org.netbeans.gradle.project.util.NbFunction; import org.openide.awt.HtmlBrowser; import static org.jtrim.property.swing.AutoDisplayState.*; import static org.netbeans.gradle.project.properties.NbProperties.*; @SuppressWarnings("serial") public class GlobalGradleSettingsPanel extends javax.swing.JPanel implements ProfileEditorFactory { private final PropertySource<CategoryItem> categorySelection; private final PropertySource<URL> selectedHelpUrl; public GlobalGradleSettingsPanel() { initComponents(); DefaultListModel<CategoryItem> categoriesModel = new DefaultListModel<>(); categoriesModel.addElement(new CategoryItem( NbStrings.getSettingsCategoryGradleInstallation(), GradleInstallationPanel.createSettingsPage())); categoriesModel.addElement(new CategoryItem( NbStrings.getSettingsCategoryPlatformPriority(), PlatformPriorityPanel.createSettingsPage(false))); categoriesModel.addElement(new CategoryItem( NbStrings.getSettingsCategoryDaemon(), GradleDaemonPanel.createSettingsPage())); categoriesModel.addElement(new CategoryItem( NbStrings.getSettingsCategoryScriptAndTasks(), ScriptAndTasksPanel.createSettingsPage())); categoriesModel.addElement(new CategoryItem( NbStrings.getSettingsCategoryScript(), BuildScriptParsingPanel.createSettingsPage())); categoriesModel.addElement(new CategoryItem( NbStrings.getSettingsCategoryTasks(), TaskExecutionPanel.createSettingsPage())); categoriesModel.addElement(new CategoryItem( NbStrings.getSettingsCategoryDebugJava(), JavaDebuggingPanel.createSettingsPage(false), JavaExtensionDef.EXTENSION_NAME)); categoriesModel.addElement(new CategoryItem( NbStrings.getSettingsCategoryAppearance(), AppearancePanel.createSettingsPage(false))); categoriesModel.addElement(new CategoryItem( NbStrings.getSettingsCategoryOther(), OtherOptionsPanel.createSettingsPage())); jCategoriesList.setModel(categoriesModel); jCategoriesList.setSelectedIndex(0); categorySelection = listSelection(jCategoriesList); selectedHelpUrl = PropertyFactory.convert(categorySelection, new ValueConverter<CategoryItem, URL>() { @Override public URL convert(CategoryItem input) { return input != null ? input.getHelpUrl() : null; } }); categorySelection.addChangeListener(new Runnable() { @Override public void run() { showSelectedEditor(); } }); showSelectedEditor(); setupEnableDisable(); } public static GlobalSettingsPage createSettingsPanel() { GlobalGradleSettingsPanel panel = new GlobalGradleSettingsPanel(); GlobalSettingsPage.Builder result = new GlobalSettingsPage.Builder(panel); result.setValid(panel.valid()); return result.create(); } private void setupEnableDisable() { addSwingStateListener(isNotNull(selectedHelpUrl), componentDisabler(jReadWikiButton)); } private void showSelectedEditor() { jCurrentCategoryPanel.removeAll(); CategoryItem selected = categorySelection.getValue(); if (selected != null) { jCurrentCategoryPanel.add(selected.getEditorComponent()); } jCurrentCategoryPanel.revalidate(); jCurrentCategoryPanel.repaint(); } private StoredSettings combineSettings( List<ProfileEditor> editors, final NbFunction<? super ProfileEditor, ? extends StoredSettings> settingsGetter) { final List<StoredSettings> allSettings = new ArrayList<>(editors.size()); for (ProfileEditor profileEditor: editors) { StoredSettings settings = settingsGetter.apply(profileEditor); allSettings.add(settings); } return new StoredSettings() { @Override public void displaySettings() { for (StoredSettings settings: allSettings) { settings.displaySettings(); } } @Override public void saveSettings() { for (StoredSettings settings: allSettings) { settings.saveSettings(); } } }; } private StoredSettings readCombinedFromSettings(List<ProfileEditor> editors) { return combineSettings(editors, new NbFunction<ProfileEditor, StoredSettings>() { @Override public StoredSettings apply(ProfileEditor editor) { return editor.readFromSettings(); } }); } private StoredSettings readCombinedFromGui(List<ProfileEditor> editors) { return combineSettings(editors, new NbFunction<ProfileEditor, StoredSettings>() { @Override public StoredSettings apply(ProfileEditor editor) { return editor.readFromGui(); } }); } @Override public ProfileEditor startEditingProfile(ProfileInfo profileInfo, ActiveSettingsQuery profileQuery) { ListModel<CategoryItem> model = jCategoriesList.getModel(); int categoryCount = model.getSize(); final List<ProfileEditor> editors = new ArrayList<>(categoryCount); for (int i = 0; i < categoryCount; i++) { CategoryItem item = model.getElementAt(i); GlobalSettingsPage editorDef = item.getEditorDef(); ProfileEditorFactory editorFactory = editorDef.getEditorFactory(); ProfileEditor editor = editorFactory.startEditingProfile(profileInfo, item.wrapSettings(profileQuery)); editors.add(editor); } return new ProfileEditor() { @Override public StoredSettings readFromSettings() { return readCombinedFromSettings(editors); } @Override public StoredSettings readFromGui() { return readCombinedFromGui(editors); } }; } private PropertySource<Boolean> valid() { ListModel<CategoryItem> model = jCategoriesList.getModel(); int categoryCount = model.getSize(); @SuppressWarnings("unchecked") PropertySource<Boolean>[] subValids = (PropertySource<Boolean>[])new PropertySource<?>[categoryCount]; for (int i = 0; i < categoryCount; i++) { subValids[i] = model.getElementAt(i).valid(); } return BoolProperties.or(subValids); } private static final class CategoryItem { private final String caption; public final GlobalSettingsPage editorDef; private final String extensionName; public CategoryItem(String caption, GlobalSettingsPage editorDef) { this(caption, editorDef, ""); } public CategoryItem(String caption, GlobalSettingsPage editorDef, String extensionName) { this.caption = caption; this.editorDef = editorDef; this.extensionName = extensionName; } public GlobalSettingsPage getEditorDef() { return editorDef; } public ActiveSettingsQuery wrapSettings(ActiveSettingsQuery rootSettings) { if ("".equals(extensionName)) { return rootSettings; } else { return new ExtensionActiveSettingsQuery(rootSettings, extensionName); } } public JComponent getEditorComponent() { return editorDef.getSettingsPanel(); } public URL getHelpUrl() { return editorDef.getHelpUrl(); } public PropertySource<Boolean> valid() { return editorDef.valid(); } @Override public String toString() { return caption; } } /** * 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() { jCategoriesLabel = new javax.swing.JLabel(); jScrollPane1 = new javax.swing.JScrollPane(); jCategoriesList = new javax.swing.JList<>(); jCurrentCategoryPanel = new javax.swing.JPanel(); jReadWikiButton = new javax.swing.JButton(); org.openide.awt.Mnemonics.setLocalizedText(jCategoriesLabel, org.openide.util.NbBundle.getMessage(GlobalGradleSettingsPanel.class, "GlobalGradleSettingsPanel.jCategoriesLabel.text")); // NOI18N jScrollPane1.setViewportView(jCategoriesList); jCurrentCategoryPanel.setLayout(new java.awt.GridLayout(1, 1)); org.openide.awt.Mnemonics.setLocalizedText(jReadWikiButton, org.openide.util.NbBundle.getMessage(GlobalGradleSettingsPanel.class, "GlobalGradleSettingsPanel.jReadWikiButton.text")); // NOI18N jReadWikiButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jReadWikiButtonActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 125, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jCurrentCategoryPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addComponent(jReadWikiButton) .addGap(0, 72, Short.MAX_VALUE)))) .addGroup(layout.createSequentialGroup() .addComponent(jCategoriesLabel) .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jCategoriesLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 266, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addComponent(jReadWikiButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jCurrentCategoryPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addContainerGap()) ); }// </editor-fold>//GEN-END:initComponents private void jReadWikiButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jReadWikiButtonActionPerformed URL helpUrl = selectedHelpUrl.getValue(); if (helpUrl != null) { HtmlBrowser.URLDisplayer.getDefault().showURLExternal(helpUrl); } }//GEN-LAST:event_jReadWikiButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel jCategoriesLabel; private javax.swing.JList<CategoryItem> jCategoriesList; private javax.swing.JPanel jCurrentCategoryPanel; private javax.swing.JButton jReadWikiButton; private javax.swing.JScrollPane jScrollPane1; // End of variables declaration//GEN-END:variables }