From abe0170cedb5d756066aacf48f28e915eb986935 Mon Sep 17 00:00:00 2001 From: Nikolay Chashnikov Date: Fri, 18 Sep 2009 10:32:46 +0400 Subject: [PATCH] 'add framework support' ui imporved & FrameworkSupportProvider moved to open api --- .../facet/impl/ui/VersionConfigurable.java | 69 --- .../ui/VersionedFrameworkSupportProvider.java | 55 --- .../LibraryCompositionOptionsPanel.form | 36 +- .../LibraryCompositionOptionsPanel.java | 14 +- .../RemoteRepositoryMirrorPanel.form | 2 +- .../AddFrameworkSupportDialog.java | 2 +- .../FrameworkSupportUtil.java | 2 +- .../AddSupportForFrameworksPanel.form | 73 +--- .../AddSupportForFrameworksPanel.java | 397 ++++++++---------- .../FrameworkSupportConfigurable.java | 37 -- .../FrameworkSupportNode.java | 143 +++++++ .../util/newProjectWizard/FrameworksTree.java | 78 ++++ .../SupportForFrameworksStep.java | 3 +- .../impl/FrameworkSupportModelImpl.java | 51 ++- .../FacetBasedFrameworkSupportProvider.java | 16 +- .../ui/libraries/LibraryDownloadInfo.java | 0 .../facet/ui/libraries/LibraryInfo.java | 0 .../facet/ui/libraries/MavenLibraryUtil.java | 0 .../ui/libraries/RemoteRepositoryInfo.java | 0 .../FrameworkSupportConfigurable.java | 44 ++ .../FrameworkSupportConfigurableBase.form | 33 ++ .../FrameworkSupportConfigurableBase.java | 89 ++++ .../FrameworkSupportConfigurableListener.java | 12 + .../FrameworkSupportModel.java | 2 +- .../FrameworkSupportModelListener.java | 2 +- .../FrameworkSupportProvider.java | 23 +- .../FrameworkSupportProviderBase.java | 41 ++ .../frameworkSupport/FrameworkVersion.java | 53 +++ .../ide/util/projectWizard/ModuleBuilder.java | 3 +- .../intellij/openapi/ui/LabeledComponent.java | 9 + .../src/com/intellij/ui/CheckboxTreeBase.java | 8 +- .../src/com/intellij/ui/CheckboxTree.java | 4 + resources/src/META-INF/IdeaPlugin.xml | 2 +- 33 files changed, 763 insertions(+), 540 deletions(-) delete mode 100644 java/idea-ui/src/com/intellij/facet/impl/ui/VersionConfigurable.java delete mode 100644 java/idea-ui/src/com/intellij/facet/impl/ui/VersionedFrameworkSupportProvider.java delete mode 100644 java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportConfigurable.java create mode 100644 java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportNode.java create mode 100644 java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworksTree.java rename java/idea-ui/src/com/intellij/facet/impl/ui/FacetTypeFrameworkSupportProvider.java => platform/lang-api/src/com/intellij/facet/ui/FacetBasedFrameworkSupportProvider.java (80%) rename {java/openapi => platform/lang-api}/src/com/intellij/facet/ui/libraries/LibraryDownloadInfo.java (100%) rename {java/openapi => platform/lang-api}/src/com/intellij/facet/ui/libraries/LibraryInfo.java (100%) rename {java/openapi => platform/lang-api}/src/com/intellij/facet/ui/libraries/MavenLibraryUtil.java (100%) rename {java/openapi => platform/lang-api}/src/com/intellij/facet/ui/libraries/RemoteRepositoryInfo.java (100%) create mode 100644 platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportConfigurable.java create mode 100644 platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportConfigurableBase.form create mode 100644 platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportConfigurableBase.java create mode 100644 platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportConfigurableListener.java rename {java/idea-ui/src/com/intellij/ide/util/newProjectWizard => platform/lang-api/src/com/intellij/ide/util/frameworkSupport}/FrameworkSupportModel.java (94%) rename {java/idea-ui/src/com/intellij/ide/util/newProjectWizard => platform/lang-api/src/com/intellij/ide/util/frameworkSupport}/FrameworkSupportModelListener.java (86%) rename {java/idea-ui/src/com/intellij/ide/util/newProjectWizard => platform/lang-api/src/com/intellij/ide/util/frameworkSupport}/FrameworkSupportProvider.java (69%) create mode 100644 platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportProviderBase.java create mode 100644 platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkVersion.java diff --git a/java/idea-ui/src/com/intellij/facet/impl/ui/VersionConfigurable.java b/java/idea-ui/src/com/intellij/facet/impl/ui/VersionConfigurable.java deleted file mode 100644 index deda6c16750c..000000000000 --- a/java/idea-ui/src/com/intellij/facet/impl/ui/VersionConfigurable.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.intellij.facet.impl.ui; - -import com.intellij.facet.ui.libraries.LibraryInfo; -import com.intellij.ide.util.newProjectWizard.FrameworkSupportConfigurable; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.roots.ModifiableRootModel; -import com.intellij.openapi.roots.libraries.Library; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import javax.swing.*; -import java.awt.*; - -/** - * @author Dmitry Avdeev -*/ -public class VersionConfigurable extends FrameworkSupportConfigurable { - private JComboBox myComboBox; - private final VersionedFrameworkSupportProvider myFrameworkSupportProvider; - - public VersionConfigurable(final VersionedFrameworkSupportProvider frameworkSupportProvider, String[] versions, String defaultVersion) { - myFrameworkSupportProvider = frameworkSupportProvider; - if (versions.length > 0) { - if (defaultVersion == null) { - defaultVersion = versions[versions.length - 1]; - } - myComboBox = new JComboBox(); - String maxValue = ""; - for (String version : versions) { - myComboBox.addItem(version); - FontMetrics fontMetrics = myComboBox.getFontMetrics(myComboBox.getFont()); - if (fontMetrics.stringWidth(version) > fontMetrics.stringWidth(maxValue)) { - maxValue = version; - } - } - myComboBox.setPrototypeDisplayValue(maxValue + "_"); - myComboBox.setSelectedItem(defaultVersion); - } - } - - public JComponent getComponent() { - return myComboBox; - } - - @NotNull - public LibraryInfo[] getLibraries() { - return myFrameworkSupportProvider.getLibraries(getSelectedVersion()); - } - - @NonNls - @NotNull - public String getLibraryName() { - return myFrameworkSupportProvider.getLibraryName(getSelectedVersion()); - } - - public void addSupport(final Module module, final ModifiableRootModel rootModel, final @Nullable Library library) { - myFrameworkSupportProvider.addSupport(module, rootModel, getSelectedVersion(), library); - } - - public String getSelectedVersion() { - String version = null; - if (myComboBox != null) { - version = myComboBox.getSelectedItem().toString(); - } - return version; - } - -} diff --git a/java/idea-ui/src/com/intellij/facet/impl/ui/VersionedFrameworkSupportProvider.java b/java/idea-ui/src/com/intellij/facet/impl/ui/VersionedFrameworkSupportProvider.java deleted file mode 100644 index 33b7c6ea9d46..000000000000 --- a/java/idea-ui/src/com/intellij/facet/impl/ui/VersionedFrameworkSupportProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved. - */ - -package com.intellij.facet.impl.ui; - -import com.intellij.facet.ui.libraries.LibraryInfo; -import com.intellij.ide.util.newProjectWizard.FrameworkSupportConfigurable; -import com.intellij.ide.util.newProjectWizard.FrameworkSupportModel; -import com.intellij.ide.util.newProjectWizard.FrameworkSupportProvider; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.roots.ModifiableRootModel; -import com.intellij.openapi.roots.libraries.Library; -import com.intellij.util.ArrayUtil; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * @author nik - */ -public abstract class VersionedFrameworkSupportProvider extends FrameworkSupportProvider { - - protected VersionedFrameworkSupportProvider(final @NonNls @NotNull String id, final @NotNull String title) { - super(id, title); - } - - protected abstract void addSupport(Module module, ModifiableRootModel rootModel, String version, final @Nullable Library library); - - @NotNull - public String[] getVersions() { - return ArrayUtil.EMPTY_STRING_ARRAY; - } - - @Nullable - public String getDefaultVersion() { - return null; - } - - @NotNull - public VersionConfigurable createConfigurable(final @NotNull FrameworkSupportModel model) { - return new VersionConfigurable(this, getVersions(), getDefaultVersion()); - } - - @NotNull - protected LibraryInfo[] getLibraries(final String selectedVersion) { - return LibraryInfo.EMPTY_ARRAY; - } - - @NotNull @NonNls - protected String getLibraryName(final String selectedVersion) { - return FrameworkSupportConfigurable.DEFAULT_LIBRARY_NAME; - } - -} diff --git a/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryCompositionOptionsPanel.form b/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryCompositionOptionsPanel.form index 82074a200248..80b2cf41add5 100644 --- a/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryCompositionOptionsPanel.form +++ b/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryCompositionOptionsPanel.form @@ -17,24 +17,20 @@ - + - - - + - + - - - + @@ -50,7 +46,7 @@ - + @@ -79,12 +75,6 @@ - - - - - - @@ -93,6 +83,12 @@ + + + + + + @@ -135,11 +131,6 @@ - - - - - @@ -179,6 +170,11 @@ + + + + + diff --git a/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryCompositionOptionsPanel.java b/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryCompositionOptionsPanel.java index e6e18636c4cd..d156462b79c7 100644 --- a/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryCompositionOptionsPanel.java +++ b/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/LibraryCompositionOptionsPanel.java @@ -20,6 +20,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.IdeBorderFactory; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; @@ -38,14 +39,14 @@ public class LibraryCompositionOptionsPanel { private JButton myAddJarsButton; private JCheckBox myDownloadMissingJarsCheckBox; private TextFieldWithBrowseButton myDirectoryField; - private JTextArea myMissingLibrariesArea; private JComboBox myLibraryLevelComboBox; private JTextField myLibraryNameField; private JPanel myMissingLibrariesPanel; - private JTextArea myHiddenTextArea; private JPanel myNewLibraryPanel; private JPanel myLibraryPropertiesPanel; private JPanel myMirrorsPanel; + private JLabel myMissingLibrariesLabel; + private JLabel myHiddenLabel; private final List myAddedJars = new ArrayList(); private final List myUsedLibraries = new ArrayList(); private final LibrariesContainer myLibrariesContainer; @@ -54,8 +55,8 @@ public class LibraryCompositionOptionsPanel { private final LibraryDownloadingMirrorsMap myMirrorsMap; private List myMirrorPanelsList; - public LibraryCompositionOptionsPanel(final LibrariesContainer librariesContainer, final LibraryCompositionSettings libraryCompositionSettings, - final LibraryDownloadingMirrorsMap mirrorsMap) { + public LibraryCompositionOptionsPanel(final @NotNull LibrariesContainer librariesContainer, final @NotNull LibraryCompositionSettings libraryCompositionSettings, + final @NotNull LibraryDownloadingMirrorsMap mirrorsMap) { myLibrariesContainer = librariesContainer; myLibraryCompositionSettings = libraryCompositionSettings; myMirrorsMap = mirrorsMap; @@ -96,11 +97,10 @@ public class LibraryCompositionOptionsPanel { myLibraryLevelComboBox.setSelectedItem(myLibraryLevels.getValue(myLibraryCompositionSettings.getLibraryLevel())); myLibraryNameField.setText(myLibraryCompositionSettings.getLibraryName()); - myMissingLibrariesArea.setBackground(myMainPanel.getBackground()); myDirectoryField.setText(FileUtil.toSystemDependentName(myLibraryCompositionSettings.getDirectoryForDownloadedLibrariesPath())); String jars = RequiredLibrariesInfo.getLibrariesPresentableText(myLibraryCompositionSettings.getLibraryInfos()); - myHiddenTextArea.setText(ProjectBundle.message("label.text.libraries.are.missing", jars)); + myHiddenLabel.setText(UIUtil.toHtml(ProjectBundle.message("label.text.libraries.are.missing", jars))); updateAll(); myMissingLibrariesPanel.getPreferredSize(); @@ -190,7 +190,7 @@ public class LibraryCompositionOptionsPanel { else { missingJarsText = ProjectBundle.message("label.text.all.library.files.found"); } - myMissingLibrariesArea.setText(missingJarsText); + myMissingLibrariesLabel.setText(UIUtil.toHtml(missingJarsText)); ((CardLayout)myMissingLibrariesPanel.getLayout()).show(myMissingLibrariesPanel, "shown"); if (info == null) { myDownloadMissingJarsCheckBox.setSelected(false); diff --git a/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/RemoteRepositoryMirrorPanel.form b/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/RemoteRepositoryMirrorPanel.form index 26d5f870aa2d..925a00ff2c77 100644 --- a/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/RemoteRepositoryMirrorPanel.form +++ b/java/idea-ui/src/com/intellij/facet/impl/ui/libraries/RemoteRepositoryMirrorPanel.form @@ -10,7 +10,7 @@ - + diff --git a/java/idea-ui/src/com/intellij/ide/util/frameworkSupport/AddFrameworkSupportDialog.java b/java/idea-ui/src/com/intellij/ide/util/frameworkSupport/AddFrameworkSupportDialog.java index 895c7581c673..453743c3b6a8 100644 --- a/java/idea-ui/src/com/intellij/ide/util/frameworkSupport/AddFrameworkSupportDialog.java +++ b/java/idea-ui/src/com/intellij/ide/util/frameworkSupport/AddFrameworkSupportDialog.java @@ -6,7 +6,7 @@ package com.intellij.ide.util.frameworkSupport; import com.intellij.CommonBundle; import com.intellij.ide.util.newProjectWizard.AddSupportForFrameworksPanel; -import com.intellij.ide.util.newProjectWizard.FrameworkSupportProvider; +import com.intellij.ide.util.frameworkSupport.FrameworkSupportProvider; import com.intellij.openapi.application.Result; import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.module.Module; diff --git a/java/idea-ui/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportUtil.java b/java/idea-ui/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportUtil.java index c5fefe6d7518..c595890d390f 100644 --- a/java/idea-ui/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportUtil.java +++ b/java/idea-ui/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportUtil.java @@ -4,7 +4,7 @@ package com.intellij.ide.util.frameworkSupport; -import com.intellij.ide.util.newProjectWizard.FrameworkSupportProvider; +import com.intellij.ide.util.frameworkSupport.FrameworkSupportProvider; import com.intellij.ide.util.projectWizard.ModuleBuilder; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.module.Module; diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.form b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.form index fb1d16114f4a..c97892e40ae2 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.form +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.form @@ -1,9 +1,9 @@
- + - + @@ -14,7 +14,7 @@ - + @@ -26,7 +26,12 @@ - + + + + + + @@ -34,66 +39,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.java index b37366fc455d..e459636d7b8d 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.java @@ -4,37 +4,43 @@ package com.intellij.ide.util.newProjectWizard; -import com.intellij.facet.impl.ui.FacetTypeFrameworkSupportProvider; -import com.intellij.facet.impl.ui.libraries.LibrariesCompositionDialog; +import com.intellij.facet.ui.FacetBasedFrameworkSupportProvider; +import com.intellij.facet.impl.ui.libraries.LibraryCompositionOptionsPanel; import com.intellij.facet.impl.ui.libraries.LibraryCompositionSettings; import com.intellij.facet.impl.ui.libraries.LibraryDownloadingMirrorsMap; import com.intellij.facet.ui.libraries.LibraryDownloadInfo; import com.intellij.facet.ui.libraries.LibraryInfo; import com.intellij.facet.ui.libraries.RemoteRepositoryInfo; +import com.intellij.ide.util.frameworkSupport.FrameworkSupportProvider; import com.intellij.ide.util.newProjectWizard.impl.FrameworkSupportModelImpl; import com.intellij.ide.util.projectWizard.ModuleBuilder; +import com.intellij.ide.util.frameworkSupport.FrameworkSupportConfigurable; +import com.intellij.ide.util.frameworkSupport.FrameworkSupportConfigurableListener; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainer; +import com.intellij.openapi.ui.Splitter; +import com.intellij.openapi.ui.VerticalFlowLayout; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.MultiValuesMap; import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.text.StringUtil; +import com.intellij.ui.CheckedTreeNode; +import com.intellij.ui.ScrollPaneFactory; +import com.intellij.ui.TitledSeparator; import com.intellij.util.graph.CachingSemiGraph; import com.intellij.util.graph.DFSTBuilder; import com.intellij.util.graph.GraphGenerator; -import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.*; import java.util.List; @@ -43,20 +49,21 @@ import java.util.List; */ public class AddSupportForFrameworksPanel { private static final Logger LOG = Logger.getInstance("#com.intellij.ide.util.newProjectWizard.AddSupportForFrameworksStep"); - private static final int INDENT = 20; - private static final int SPACE_AFTER_TITLE = 5; - private static final int VERTICAL_SPACE = 5; - private static final int GAP_BETWEEN_GROUPS = 10; + @NonNls private static final String UNCHECKED_CARD = "unchecked"; + @NonNls private static final String EMPTY_CARD = "empty"; private JPanel myMainPanel; - private JPanel myFrameworksTreePanel; - private JButton myChangeButton; - private JPanel myDownloadingOptionsPanel; - private List> myGroups; + private JPanel myFrameworksPanel; + private List> myGroups; private final LibrariesContainer myLibrariesContainer; private final Computable myBaseDirForLibrariesGetter; private final List myProviders; private final LibraryDownloadingMirrorsMap myMirrorsMap; private final FrameworkSupportModelImpl myModel; + private JPanel myOptionsPanel; + private FrameworksTree myFrameworksTree; + private Set myInitializedOptionsPanelIds = new HashSet(); + private FrameworkSupportNode myLastSelectedNode; + private JLabel myTickCheckboxLabel; public AddSupportForFrameworksPanel(final List providers, final @NotNull LibrariesContainer librariesContainer, @Nullable ModuleBuilder builder, Computable baseDirForLibrariesGetter) { @@ -65,31 +72,127 @@ public class AddSupportForFrameworksPanel { myProviders = providers; myModel = new FrameworkSupportModelImpl(myLibrariesContainer.getProject(), builder); createNodes(); - myMirrorsMap = creatMirrorsMap(); + myMirrorsMap = createMirrorsMap(); - final JPanel treePanel = new JPanel(new GridBagLayout()); - addGroupPanels(myGroups, treePanel, 0); - myFrameworksTreePanel.add(treePanel, BorderLayout.WEST); - myChangeButton.addActionListener(new ActionListener() { - public void actionPerformed(final ActionEvent e) { - final List compositionSettingsList = getLibrariesCompositionSettingsList(); - new LibrariesCompositionDialog(myMainPanel, myLibrariesContainer, compositionSettingsList, myMirrorsMap).show(); - updateDownloadingOptionsPanel(); + final Splitter splitter = new Splitter(false, 0.35f, 0.1f, 0.7f); + myFrameworksTree = new FrameworksTree(myGroups) { + @Override + protected void onNodeStateChanged(CheckedTreeNode node) { + if (!(node instanceof FrameworkSupportNode)) return; + + final FrameworkSupportNode frameworkSupportNode = (FrameworkSupportNode)node; + frameworkSupportNode.setConfigurableComponentEnabled(node.isChecked()); + updateOptionsPanel(); + myModel.onFrameworkSelectionChanged(frameworkSupportNode); + } + }; + myFrameworksTree.addTreeSelectionListener(new TreeSelectionListener() { + public void valueChanged(TreeSelectionEvent e) { + onSelectionChanged(); } }); - updateDownloadingOptionsPanel(); + splitter.setFirstComponent(ScrollPaneFactory.createScrollPane(myFrameworksTree)); + myOptionsPanel = new JPanel(new CardLayout()); + myOptionsPanel.add(EMPTY_CARD, new JPanel()); + final JPanel uncheckedLabelPanel = new JPanel(new BorderLayout()); + myTickCheckboxLabel = new JLabel("Tick checkbox"); + uncheckedLabelPanel.add(BorderLayout.NORTH, myTickCheckboxLabel); + myOptionsPanel.add(UNCHECKED_CARD, uncheckedLabelPanel); + splitter.setSecondComponent(myOptionsPanel); + myFrameworksPanel.add(splitter, BorderLayout.CENTER); } - private LibraryDownloadingMirrorsMap creatMirrorsMap() { + private void onSelectionChanged() { + if (!myFrameworksTree.isProcessingMouseEventOnCheckbox()) { + updateOptionsPanel(); + } + + final FrameworkSupportNode selectedNode = getSelectedNode(); + if (!Comparing.equal(selectedNode, myLastSelectedNode)) { + if (myLastSelectedNode != null) { + final LibraryCompositionOptionsPanel optionsPanel = myLastSelectedNode.getLibraryCompositionOptionsPanel(myLibrariesContainer, myMirrorsMap); + if (optionsPanel != null) { + optionsPanel.saveSelectedRepositoriesMirrors(myMirrorsMap); + optionsPanel.apply(); + } + } + + myLastSelectedNode = selectedNode; + if (selectedNode != null) { + final LibraryCompositionOptionsPanel newOptionsPanel = selectedNode.getLibraryCompositionOptionsPanel(myLibrariesContainer, myMirrorsMap); + if (newOptionsPanel != null) { + newOptionsPanel.updateRepositoriesMirrors(myMirrorsMap); + } + } + } + } + + private void updateOptionsPanel() { + final FrameworkSupportNode node = getSelectedNode(); + if (node != null) { + if (node.isChecked()) { + initializeOptionsPanel(node); + showCard(node.getProvider().getId()); + } + else { + myTickCheckboxLabel.setText("Tick checkbox to add support for '" + node.getTitle() + "'"); + showCard(UNCHECKED_CARD); + } + } + else { + showCard(EMPTY_CARD); + } + } + + @Nullable + private FrameworkSupportNode getSelectedNode() { + final FrameworkSupportNode[] nodes = myFrameworksTree.getSelectedNodes(FrameworkSupportNode.class, null); + return nodes.length == 1 ? nodes[0] : null; + } + + private void initializeOptionsPanel(final FrameworkSupportNode node) { + final String id = node.getProvider().getId(); + if (!myInitializedOptionsPanelIds.contains(id)) { + final JPanel optionsPanel = new JPanel(new VerticalFlowLayout()); + optionsPanel.add(new TitledSeparator(node.getTitle() + " Settings")); + final FrameworkSupportConfigurable configurable = node.getConfigurable(); + optionsPanel.add(configurable.getComponent()); + final JPanel librariesOptionsPanelWrapper = new JPanel(new BorderLayout()); + optionsPanel.add(librariesOptionsPanelWrapper); + configurable.addListener(new FrameworkSupportConfigurableListener() { + public void frameworkVersionChanged() { + librariesOptionsPanelWrapper.removeAll(); + addLibrariesOptionsPanel(node, librariesOptionsPanelWrapper); + librariesOptionsPanelWrapper.revalidate(); + } + }); + addLibrariesOptionsPanel(node, librariesOptionsPanelWrapper); + myOptionsPanel.add(id, optionsPanel); + myInitializedOptionsPanelIds.add(id); + } + } + + private void addLibrariesOptionsPanel(FrameworkSupportNode node, JPanel librariesOptionsPanelWrapper) { + final LibraryCompositionOptionsPanel libraryOptionsPanel = node.getLibraryCompositionOptionsPanel(myLibrariesContainer, myMirrorsMap); + if (libraryOptionsPanel != null) { + librariesOptionsPanelWrapper.add(BorderLayout.CENTER, libraryOptionsPanel.getMainPanel()); + } + } + + private void showCard(String cardName) { + ((CardLayout)myOptionsPanel.getLayout()).show(myOptionsPanel, cardName); + } + + private LibraryDownloadingMirrorsMap createMirrorsMap() { List repositoryInfos = getRemoteRepositories(); return new LibraryDownloadingMirrorsMap(repositoryInfos.toArray(new RemoteRepositoryInfo[repositoryInfos.size()])); } private List getRemoteRepositories() { List repositoryInfos = new ArrayList(); - List frameworksSettingsList = getFrameworksSettingsList(false); - for (FrameworkSupportSettings settings : frameworksSettingsList) { - LibraryInfo[] libraries = settings.getConfigurable().getLibraries(); + List frameworkNodes = getFrameworkNodes(false); + for (FrameworkSupportNode node : frameworkNodes) { + LibraryInfo[] libraries = node.getLibraries(); for (LibraryInfo library : libraries) { LibraryDownloadInfo downloadInfo = library.getDownloadingInfo(); if (downloadInfo != null) { @@ -103,18 +206,13 @@ public class AddSupportForFrameworksPanel { return repositoryInfos; } - private void updateDownloadingOptionsPanel() { - @NonNls String card = getLibrariesCompositionSettingsList().isEmpty() ? "empty" : "options"; - ((CardLayout)myDownloadingOptionsPanel.getLayout()).show(myDownloadingOptionsPanel, card); - } - private List getLibrariesCompositionSettingsList() { List list = new ArrayList(); - List selected = getFrameworksSettingsList(true); - for (FrameworkSupportSettings settings : selected) { - LibraryInfo[] libraries = settings.getConfigurable().getLibraries(); - if (libraries.length > 0) { - list.add(settings.getLibraryCompositionSettings()); + List selected = getFrameworkNodes(true); + for (FrameworkSupportNode node : selected) { + final LibraryCompositionSettings settings = node.getLibraryCompositionSettings(); + if (settings != null) { + list.add(settings); } } return list; @@ -128,80 +226,36 @@ public class AddSupportForFrameworksPanel { return true; } - private JPanel addGroupPanels(final List> groups, JPanel treePanel, int level) { - boolean first = true; - for (List group : groups) { - addSettingsComponents(group, treePanel, level, !first); - first = false; - } - return treePanel; - } - - private void addSettingsComponents(final List list, JPanel treePanel, int level, boolean addGapBefore) { - boolean first = true; - for (FrameworkSupportSettings root : list) { - addSettingsComponents(root, treePanel, level, first && addGapBefore); - first = false; - } - } - - private void addSettingsComponents(final FrameworkSupportSettings frameworkSupport, JPanel parentPanel, int level, boolean addGapBefore) { - if (frameworkSupport.getParentNode() != null) { - frameworkSupport.setEnabled(false); - } - JComponent configurableComponent = frameworkSupport.getConfigurable().getComponent(); - int gridwidth = configurableComponent != null ? 1 : GridBagConstraints.REMAINDER; - final int gap = addGapBefore ? GAP_BETWEEN_GROUPS : 0; - parentPanel.add(frameworkSupport.myCheckBox, createConstraints(0, GridBagConstraints.RELATIVE, gridwidth, 1, - new Insets(gap, INDENT * level, VERTICAL_SPACE, SPACE_AFTER_TITLE))); - if (configurableComponent != null) { - parentPanel.add(configurableComponent, createConstraints(1, GridBagConstraints.RELATIVE, GridBagConstraints.REMAINDER, 1, - new Insets(gap, 0, VERTICAL_SPACE, 0))); - } - - if (frameworkSupport.myChildren.isEmpty()) { - return; - } - - addSettingsComponents(frameworkSupport.myChildren, parentPanel, level + 1, false); - } - - private static GridBagConstraints createConstraints(final int gridx, final int gridy, final int gridwidth, final int gridheight, - final Insets insets) { - return new GridBagConstraints(gridx, gridy, gridwidth, gridheight, 1, 1, GridBagConstraints.NORTHWEST, - GridBagConstraints.NONE, insets, 0, 0); - } - private void createNodes() { - Map nodes = new HashMap(); - MultiValuesMap groups = new MultiValuesMap(true); + Map nodes = new HashMap(); + MultiValuesMap groups = new MultiValuesMap(true); for (FrameworkSupportProvider frameworkSupport : myProviders) { createNode(frameworkSupport, nodes, groups); } - myGroups = new ArrayList>(); + myGroups = new ArrayList>(); for (String groupId : groups.keySet()) { - final Collection collection = groups.get(groupId); + final Collection collection = groups.get(groupId); if (collection != null) { - final List group = new ArrayList(); - for (FrameworkSupportSettings settings : collection) { - if (settings.getParentNode() == null) { - group.add(settings); + final List group = new ArrayList(); + for (FrameworkSupportNode node : collection) { + if (node.getParentNode() == null) { + group.add(node); } } - sortByTitle(group); + FrameworkSupportNode.sortByTitle(group); myGroups.add(group); } } } @Nullable - private FrameworkSupportSettings createNode(final FrameworkSupportProvider provider, final Map nodes, - final MultiValuesMap groups) { - FrameworkSupportSettings node = nodes.get(provider.getId()); + private FrameworkSupportNode createNode(final FrameworkSupportProvider provider, final Map nodes, + final MultiValuesMap groups) { + FrameworkSupportNode node = nodes.get(provider.getId()); if (node == null) { String underlyingFrameworkId = provider.getUnderlyingFrameworkId(); - FrameworkSupportSettings parentNode = null; + FrameworkSupportNode parentNode = null; if (underlyingFrameworkId != null) { FrameworkSupportProvider parentProvider = findProvider(underlyingFrameworkId); if (parentProvider == null) { @@ -210,17 +264,13 @@ public class AddSupportForFrameworksPanel { } parentNode = createNode(parentProvider, nodes, groups); } - node = new FrameworkSupportSettings(provider, parentNode, myModel); + node = new FrameworkSupportNode(provider, parentNode, myModel, myBaseDirForLibrariesGetter); nodes.put(provider.getId(), node); groups.put(provider.getGroupId(), node); } return node; } - private String getBaseModuleDirectoryPath() { - return myBaseDirForLibrariesGetter.compute(); - } - @Nullable private FrameworkSupportProvider findProvider(@NotNull String id) { for (FrameworkSupportProvider provider : myProviders) { @@ -232,75 +282,50 @@ public class AddSupportForFrameworksPanel { return null; } - private static void setDescendantsEnabled(FrameworkSupportSettings frameworkSupport, final boolean enable) { - for (FrameworkSupportSettings child : frameworkSupport.myChildren) { - child.setEnabled(enable); - setDescendantsEnabled(child, enable); - } - } - public JComponent getMainPanel() { return myMainPanel; } - private List getFrameworksSettingsList(final boolean selectedOnly) { - ArrayList list = new ArrayList(); + private List getFrameworkNodes(final boolean selectedOnly) { + ArrayList list = new ArrayList(); if (myGroups != null) { - for (List group : myGroups) { + for (List group : myGroups) { addChildFrameworks(group, list, selectedOnly); } } return list; } - private static void sortByTitle(List settingsList) { - if (settingsList.isEmpty()) return; - - Collections.sort(settingsList, new Comparator() { - public int compare(final FrameworkSupportSettings o1, final FrameworkSupportSettings o2) { - return getTitleWithoutMnemonic(o1.getProvider()).compareTo(getTitleWithoutMnemonic(o2.getProvider())); - } - }); - for (FrameworkSupportSettings settings : settingsList) { - sortByTitle(settings.myChildren); - } - } - - private static String getTitleWithoutMnemonic(final FrameworkSupportProvider provider) { - return StringUtil.replace(provider.getTitle(), String.valueOf(UIUtil.MNEMONIC), ""); - } - - private static void addChildFrameworks(final List list, final ArrayList selected, + private static void addChildFrameworks(final List list, final List result, final boolean selectedOnly) { - for (FrameworkSupportSettings settings : list) { - if (!selectedOnly || settings.myCheckBox.isSelected()) { - selected.add(settings); - addChildFrameworks(settings.myChildren, selected, selectedOnly); + for (FrameworkSupportNode node : list) { + if (!selectedOnly || node.isChecked()) { + result.add(node); + addChildFrameworks(node.getChildren(), result, selectedOnly); } } } - public void addSupport(final Module module, final ModifiableRootModel rootModel) { + public void addSupport(final @NotNull Module module, final @NotNull ModifiableRootModel rootModel) { List addedLibraries = new ArrayList(); - List selectedFrameworks = getFrameworksSettingsList(true); + List selectedFrameworks = getFrameworkNodes(true); sortFrameworks(selectedFrameworks); - for (FrameworkSupportSettings settings : selectedFrameworks) { - FrameworkSupportConfigurable configurable = settings.getConfigurable(); - - Library library = settings.getLibraryCompositionSettings().addLibraries(rootModel, addedLibraries); - + for (FrameworkSupportNode node : selectedFrameworks) { + FrameworkSupportConfigurable configurable = node.getConfigurable(); + final LibraryCompositionSettings settings = node.getLibraryCompositionSettings(); + Library library = settings != null ? settings.addLibraries(rootModel, addedLibraries) : null; configurable.addSupport(module, rootModel, library); } - for (FrameworkSupportSettings settings : selectedFrameworks) { - FrameworkSupportProvider provider = settings.myProvider; - if (provider instanceof FacetTypeFrameworkSupportProvider && !addedLibraries.isEmpty()) { - ((FacetTypeFrameworkSupportProvider)provider).processAddedLibraries(module, addedLibraries); + for (FrameworkSupportNode node : selectedFrameworks) { + FrameworkSupportProvider provider = node.getProvider(); + if (provider instanceof FacetBasedFrameworkSupportProvider && !addedLibraries.isEmpty()) { + ((FacetBasedFrameworkSupportProvider)provider).processAddedLibraries(module, addedLibraries); } } } - private void sortFrameworks(final List selectedFrameworks) { + private void sortFrameworks(final List nodes) { DFSTBuilder builder = new DFSTBuilder(GraphGenerator.create(CachingSemiGraph.create(new ProvidersGraph(myProviders)))); if (!builder.isAcyclic()) { Pair pair = builder.getCircularDependency(); @@ -308,93 +333,13 @@ public class AddSupportForFrameworksPanel { } final Comparator comparator = builder.comparator(); - Collections.sort(selectedFrameworks, new Comparator() { - public int compare(final FrameworkSupportSettings o1, final FrameworkSupportSettings o2) { + Collections.sort(nodes, new Comparator() { + public int compare(final FrameworkSupportNode o1, final FrameworkSupportNode o2) { return comparator.compare(o1.getProvider(), o2.getProvider()); } }); } - public class FrameworkSupportSettings { - private final FrameworkSupportProvider myProvider; - private final FrameworkSupportSettings myParentNode; - private final FrameworkSupportConfigurable myConfigurable; - private final JCheckBox myCheckBox; - private final List myChildren = new ArrayList(); - private LibraryCompositionSettings myLibraryCompositionSettings; - - private FrameworkSupportSettings(final FrameworkSupportProvider provider, final FrameworkSupportSettings parentNode, - final FrameworkSupportModelImpl context) { - myProvider = provider; - myParentNode = parentNode; - myCheckBox = new JCheckBox(provider.getTitle()); - context.registerComponent(provider, this); - myConfigurable = provider.createConfigurable(context); - if (parentNode != null) { - parentNode.myChildren.add(this); - } - - myCheckBox.addActionListener(new ActionListener() { - public void actionPerformed(final ActionEvent e) { - setConfigurableComponentEnabled(myCheckBox.isSelected()); - setDescendantsEnabled(FrameworkSupportSettings.this, myCheckBox.isSelected()); - } - }); - - setConfigurableComponentEnabled(false); - } - - public JCheckBox getCheckBox() { - return myCheckBox; - } - - public void setEnabled(final boolean enable) { - myCheckBox.setEnabled(enable); - if (!enable) { - myCheckBox.setSelected(false); - setConfigurableComponentEnabled(false); - } - } - - private void setConfigurableComponentEnabled(final boolean enable) { - JComponent component = getConfigurable().getComponent(); - if (component != null) { - UIUtil.setEnabled(component, enable, true); - } - updateDownloadingOptionsPanel(); - } - - public FrameworkSupportProvider getProvider() { - return myProvider; - } - - public FrameworkSupportSettings getParentNode() { - return myParentNode; - } - - public FrameworkSupportConfigurable getConfigurable() { - return myConfigurable; - } - - public String getModuleDirectoryPath() { - return getBaseModuleDirectoryPath(); - } - - private boolean isObsolete(@NotNull LibraryCompositionSettings settings) { - return !settings.getBaseDirectoryForDownloadedFiles().equals(getBaseModuleDirectoryPath()) - || !Comparing.equal(settings.getLibraryInfos(), myConfigurable.getLibraries()); - } - - public LibraryCompositionSettings getLibraryCompositionSettings() { - if (myLibraryCompositionSettings == null || isObsolete(myLibraryCompositionSettings)) { - final String title = getTitleWithoutMnemonic(myProvider); - myLibraryCompositionSettings = new LibraryCompositionSettings(myConfigurable.getLibraries(), myConfigurable.getLibraryName(), getBaseModuleDirectoryPath(), - title, myProvider.getIcon()); - } - return myLibraryCompositionSettings; - } - } - private class ProvidersGraph implements GraphGenerator.SemiGraph { private final List myFrameworkSupportProviders; diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportConfigurable.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportConfigurable.java deleted file mode 100644 index 75f7f3d076f5..000000000000 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportConfigurable.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved. - */ - -package com.intellij.ide.util.newProjectWizard; - -import com.intellij.facet.ui.libraries.LibraryInfo; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.roots.ModifiableRootModel; -import com.intellij.openapi.roots.libraries.Library; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import javax.swing.*; - -/** - * @author nik - */ -public abstract class FrameworkSupportConfigurable { - @NonNls public static final String DEFAULT_LIBRARY_NAME = "lib"; - - @Nullable - public abstract JComponent getComponent(); - - public abstract void addSupport(Module module, ModifiableRootModel model, final @Nullable Library library); - - @NonNls @NotNull - public String getLibraryName() { - return DEFAULT_LIBRARY_NAME; - } - - @NotNull - public LibraryInfo[] getLibraries() { - return LibraryInfo.EMPTY_ARRAY; - } -} diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportNode.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportNode.java new file mode 100644 index 000000000000..dc73bfb73c29 --- /dev/null +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportNode.java @@ -0,0 +1,143 @@ +package com.intellij.ide.util.newProjectWizard; + +import com.intellij.facet.impl.ui.libraries.LibraryCompositionSettings; +import com.intellij.facet.impl.ui.libraries.LibraryCompositionOptionsPanel; +import com.intellij.facet.impl.ui.libraries.LibraryDownloadingMirrorsMap; +import com.intellij.ide.util.frameworkSupport.FrameworkSupportConfigurable; +import com.intellij.ide.util.frameworkSupport.FrameworkSupportProvider; +import com.intellij.ide.util.frameworkSupport.FrameworkVersion; +import com.intellij.facet.ui.libraries.LibraryInfo; +import com.intellij.ide.util.newProjectWizard.impl.FrameworkSupportModelImpl; +import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainer; +import com.intellij.ui.CheckedTreeNode; +import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** +* @author nik +*/ +public class FrameworkSupportNode extends CheckedTreeNode { + private final FrameworkSupportProvider myProvider; + private final FrameworkSupportNode myParentNode; + private final FrameworkSupportConfigurable myConfigurable; + private final List myChildren = new ArrayList(); + private LibraryCompositionSettings myLibraryCompositionSettings; + private final Computable myBaseDirForLibrariesGetter; + private LibraryCompositionOptionsPanel myLibraryCompositionOptionsPanel; + + FrameworkSupportNode(final FrameworkSupportProvider provider, final FrameworkSupportNode parentNode, final FrameworkSupportModelImpl model, + Computable baseDirForLibrariesGetter) { + super(provider); + myBaseDirForLibrariesGetter = baseDirForLibrariesGetter; + setChecked(false); + myProvider = provider; + myParentNode = parentNode; + model.registerComponent(provider, this); + myConfigurable = provider.createConfigurable(model); + if (parentNode != null) { + parentNode.add(this); + parentNode.myChildren.add(this); + } + + setConfigurableComponentEnabled(false); + } + + public List getChildren() { + return myChildren; + } + + @Nullable + public LibraryCompositionOptionsPanel getLibraryCompositionOptionsPanel(LibrariesContainer librariesContainer, + LibraryDownloadingMirrorsMap mirrorsMap) { + final LibraryCompositionSettings libraryCompositionSettings = getLibraryCompositionSettings(); + if (myLibraryCompositionOptionsPanel == null || !myLibraryCompositionOptionsPanel.getLibraryCompositionSettings().equals(libraryCompositionSettings)) { + if (libraryCompositionSettings != null) { + myLibraryCompositionOptionsPanel = new LibraryCompositionOptionsPanel(librariesContainer, libraryCompositionSettings, mirrorsMap); + } + else { + myLibraryCompositionOptionsPanel = null; + } + } + return myLibraryCompositionOptionsPanel; + } + + public void setConfigurableComponentEnabled(final boolean enable) { + JComponent component = getConfigurable().getComponent(); + if (component != null) { + UIUtil.setEnabled(component, enable, true); + } + } + + public FrameworkSupportProvider getProvider() { + return myProvider; + } + + public FrameworkSupportNode getParentNode() { + return myParentNode; + } + + public FrameworkSupportConfigurable getConfigurable() { + return myConfigurable; + } + + private boolean isObsolete(@NotNull LibraryCompositionSettings settings) { + final LibraryInfo[] libraries = getLibraries(); + return !settings.getBaseDirectoryForDownloadedFiles().equals(myBaseDirForLibrariesGetter.compute()) + || !Comparing.equal(settings.getLibraryInfos(), libraries); + } + + public LibraryInfo[] getLibraries() { + final FrameworkVersion version = myConfigurable.getSelectedVersion(); + return version != null ? version.getLibraries() : LibraryInfo.EMPTY_ARRAY; + } + + @Nullable + public LibraryCompositionSettings getLibraryCompositionSettings() { + if (myLibraryCompositionSettings == null || isObsolete(myLibraryCompositionSettings)) { + final LibraryInfo[] libraries = getLibraries(); + if (libraries.length != 0) { + myLibraryCompositionSettings = new LibraryCompositionSettings(libraries, myConfigurable.getSelectedVersion().getLibraryName(), myBaseDirForLibrariesGetter.compute(), + "Libraries", myProvider.getIcon()); + } + else { + myLibraryCompositionSettings = null; + } + } + return myLibraryCompositionSettings; + } + + public static void sortByTitle(List nodes) { + if (nodes.isEmpty()) return; + + Collections.sort(nodes, new Comparator() { + public int compare(final FrameworkSupportNode o1, final FrameworkSupportNode o2) { + return getTitleWithoutMnemonic(o1.getProvider()).compareTo(getTitleWithoutMnemonic(o2.getProvider())); + } + }); + for (FrameworkSupportNode node : nodes) { + node.sortChildren(); + } + } + + public String getTitle() { + return getTitleWithoutMnemonic(myProvider); + } + + private static String getTitleWithoutMnemonic(final FrameworkSupportProvider provider) { + return StringUtil.replace(provider.getTitle(), String.valueOf(UIUtil.MNEMONIC), ""); + } + + private void sortChildren() { + sortByTitle(myChildren); + } +} diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworksTree.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworksTree.java new file mode 100644 index 000000000000..897ba0823149 --- /dev/null +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworksTree.java @@ -0,0 +1,78 @@ +package com.intellij.ide.util.newProjectWizard; + +import com.intellij.ui.CheckboxTree; +import com.intellij.ui.CheckedTreeNode; +import com.intellij.util.ui.tree.TreeUtil; + +import javax.swing.*; +import javax.swing.tree.TreePath; +import java.awt.*; +import java.awt.event.MouseEvent; +import java.util.List; + +/** + * @author nik + */ +public class FrameworksTree extends CheckboxTree { + private boolean myProcessingMouseEventOnCheckbox; + + public FrameworksTree(List> groups) { + super(new FrameworksTreeRenderer(), new FrameworksRootNode(groups), new CheckPolicy(false, true, true, false)); + setRootVisible(false); + setShowsRootHandles(false); + TreeUtil.expandAll(this); + } + + @Override + protected void processMouseEvent(MouseEvent e) { + final TreePath path = getPathForLocation(e.getX(), e.getY()); + if (path != null) { + final Object node = path.getLastPathComponent(); + if (node instanceof FrameworkSupportNode) { + final Rectangle checkboxBounds = ((CheckboxTreeCellRendererBase)getCellRenderer()).myCheckbox.getBounds(); + final Rectangle pathBounds = getPathBounds(path); + checkboxBounds.setLocation(pathBounds.getLocation()); + if (checkboxBounds.contains(e.getPoint())) { + try { + myProcessingMouseEventOnCheckbox = true; + super.processMouseEvent(e); + } + finally { + myProcessingMouseEventOnCheckbox = false; + } + return; + } + } + } + + super.processMouseEvent(e); + } + + public boolean isProcessingMouseEventOnCheckbox() { + return myProcessingMouseEventOnCheckbox; + } + + private static class FrameworksTreeRenderer extends CheckboxTreeCellRenderer { + private FrameworksTreeRenderer() { + super(true, false); + } + + @Override + public void customizeRenderer(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { + if (value instanceof FrameworkSupportNode) { + getTextRenderer().append(((FrameworkSupportNode)value).getTitle()); + } + } + } + + private static class FrameworksRootNode extends CheckedTreeNode { + public FrameworksRootNode(List> groups) { + super(null); + for (List group : groups) { + for (FrameworkSupportNode node : group) { + add(node); + } + } + } + } +} diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SupportForFrameworksStep.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SupportForFrameworksStep.java index a89df0a0e997..2e579d9b0606 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SupportForFrameworksStep.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SupportForFrameworksStep.java @@ -9,6 +9,7 @@ import com.intellij.ide.util.frameworkSupport.FrameworkSupportUtil; import com.intellij.ide.util.projectWizard.JavaModuleBuilder; import com.intellij.ide.util.projectWizard.ModuleBuilder; import com.intellij.ide.util.projectWizard.ModuleWizardStep; +import com.intellij.ide.util.frameworkSupport.FrameworkSupportProvider; import com.intellij.ide.wizard.CommitStepException; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.ProjectBundle; @@ -38,7 +39,7 @@ public class SupportForFrameworksStep extends ModuleWizardStep { } }); builder.addModuleConfigurationUpdater(new ModuleBuilder.ModuleConfigurationUpdater() { - public void update(final Module module, final ModifiableRootModel rootModel) { + public void update(@NotNull final Module module, @NotNull final ModifiableRootModel rootModel) { mySupportForFrameworksPanel.addSupport(module, rootModel); } }); diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/impl/FrameworkSupportModelImpl.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/impl/FrameworkSupportModelImpl.java index a18faa89f12a..4a450d088746 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/impl/FrameworkSupportModelImpl.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/impl/FrameworkSupportModelImpl.java @@ -1,7 +1,10 @@ package com.intellij.ide.util.newProjectWizard.impl; +import com.intellij.ide.util.frameworkSupport.*; import com.intellij.ide.util.newProjectWizard.*; import com.intellij.ide.util.projectWizard.ModuleBuilder; +import com.intellij.ide.util.frameworkSupport.FrameworkSupportConfigurable; +import com.intellij.ide.util.frameworkSupport.FrameworkSupportModel; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.util.EventDispatcher; @@ -9,9 +12,6 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.swing.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.HashMap; import java.util.Map; @@ -22,26 +22,15 @@ public class FrameworkSupportModelImpl extends UserDataHolderBase implements Fra private final Project myProject; private final ModuleBuilder myModuleBuilder; private final EventDispatcher myDispatcher = EventDispatcher.create(FrameworkSupportModelListener.class); - private final Map mySettingsMap = new HashMap(); + private final Map mySettingsMap = new HashMap(); public FrameworkSupportModelImpl(final @Nullable Project project, @Nullable ModuleBuilder builder) { myProject = project; myModuleBuilder = builder; } - public void registerComponent(@NotNull final FrameworkSupportProvider provider, @NotNull final AddSupportForFrameworksPanel.FrameworkSupportSettings settings) { - mySettingsMap.put(provider.getId(), settings); - final JCheckBox checkBox = settings.getCheckBox(); - checkBox.addActionListener(new ActionListener() { - public void actionPerformed(final ActionEvent e) { - if (checkBox.isSelected()) { - myDispatcher.getMulticaster().frameworkSelected(provider); - } - else { - myDispatcher.getMulticaster().frameworkUnselected(provider); - } - } - }); + public void registerComponent(@NotNull final FrameworkSupportProvider provider, @NotNull final FrameworkSupportNode node) { + mySettingsMap.put(provider.getId(), node); } public Project getProject() { @@ -53,8 +42,8 @@ public class FrameworkSupportModelImpl extends UserDataHolderBase implements Fra } public boolean isFrameworkSelected(@NotNull @NonNls final String providerId) { - final AddSupportForFrameworksPanel.FrameworkSupportSettings settings = mySettingsMap.get(providerId); - return settings != null && settings.getCheckBox().isSelected(); + final FrameworkSupportNode node = mySettingsMap.get(providerId); + return node != null && node.isChecked(); } public void addFrameworkListener(@NotNull final FrameworkSupportModelListener listener) { @@ -66,20 +55,30 @@ public class FrameworkSupportModelImpl extends UserDataHolderBase implements Fra } public void setFrameworkComponentEnabled(@NotNull @NonNls final String providerId, final boolean enable) { - final AddSupportForFrameworksPanel.FrameworkSupportSettings settings = mySettingsMap.get(providerId); - if (settings == null) { + final FrameworkSupportNode node = mySettingsMap.get(providerId); + if (node == null) { throw new IllegalArgumentException("provider '" + providerId + " not found"); } - if (enable != settings.getCheckBox().isEnabled()) { - settings.setEnabled(enable); + if (enable != node.isChecked()) { + node.setChecked(enable); } } public FrameworkSupportConfigurable getFrameworkConfigurable(@NotNull @NonNls String providerId) { - final AddSupportForFrameworksPanel.FrameworkSupportSettings settings = mySettingsMap.get(providerId); - if (settings == null) { + final FrameworkSupportNode node = mySettingsMap.get(providerId); + if (node == null) { throw new IllegalArgumentException("provider '" + providerId + " not found"); } - return settings.getConfigurable(); + return node.getConfigurable(); + } + + public void onFrameworkSelectionChanged(FrameworkSupportNode node) { + final FrameworkSupportModelListener multicaster = myDispatcher.getMulticaster(); + if (node.isChecked()) { + multicaster.frameworkSelected(node.getProvider()); + } + else { + multicaster.frameworkUnselected(node.getProvider()); + } } } diff --git a/java/idea-ui/src/com/intellij/facet/impl/ui/FacetTypeFrameworkSupportProvider.java b/platform/lang-api/src/com/intellij/facet/ui/FacetBasedFrameworkSupportProvider.java similarity index 80% rename from java/idea-ui/src/com/intellij/facet/impl/ui/FacetTypeFrameworkSupportProvider.java rename to platform/lang-api/src/com/intellij/facet/ui/FacetBasedFrameworkSupportProvider.java index d0b38a27e48c..f0125ac1e854 100644 --- a/java/idea-ui/src/com/intellij/facet/impl/ui/FacetTypeFrameworkSupportProvider.java +++ b/platform/lang-api/src/com/intellij/facet/ui/FacetBasedFrameworkSupportProvider.java @@ -2,9 +2,11 @@ * Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved. */ -package com.intellij.facet.impl.ui; +package com.intellij.facet.ui; import com.intellij.facet.*; +import com.intellij.ide.util.frameworkSupport.FrameworkSupportProviderBase; +import com.intellij.ide.util.frameworkSupport.FrameworkVersion; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleType; @@ -20,12 +22,12 @@ import java.util.List; /** * @author nik */ -public abstract class FacetTypeFrameworkSupportProvider extends VersionedFrameworkSupportProvider { - private static final Logger LOG = Logger.getInstance("#com.intellij.facet.impl.ui.FacetTypeFrameworkSupportProvider"); +public abstract class FacetBasedFrameworkSupportProvider extends FrameworkSupportProviderBase { + private static final Logger LOG = Logger.getInstance("#com.intellij.facet.ui.FacetBasedFrameworkSupportProvider"); @NonNls private static final String FACET_SUPPORT_PREFIX = "facet:"; private final FacetType myFacetType; - protected FacetTypeFrameworkSupportProvider(FacetType facetType) { + protected FacetBasedFrameworkSupportProvider(FacetType facetType) { super(getProviderId(facetType), facetType.getPresentableName()); myFacetType = facetType; } @@ -62,7 +64,7 @@ public abstract class FacetTypeFrameworkSupportProvider extends return myFacetType.getIcon(); } - protected void addSupport(final Module module, final ModifiableRootModel rootModel, final String version, final @Nullable Library library) { + protected void addSupport(@NotNull final Module module, @NotNull final ModifiableRootModel rootModel, final FrameworkVersion version, final @Nullable Library library) { FacetManager facetManager = FacetManager.getInstance(module); ModifiableFacetModel model = facetManager.createModifiableModel(); Facet underlyingFacet = null; @@ -81,13 +83,13 @@ public abstract class FacetTypeFrameworkSupportProvider extends onFacetCreated(facet, rootModel, version); } - protected void onFacetCreated(final F facet, final ModifiableRootModel rootModel, final String version) { + protected void onFacetCreated(final F facet, final ModifiableRootModel rootModel, final FrameworkVersion version) { } protected void onLibraryAdded(final F facet, final @NotNull Library library) { } - protected abstract void setupConfiguration(final F facet, final ModifiableRootModel rootModel, final String version); + protected abstract void setupConfiguration(final F facet, final ModifiableRootModel rootModel, final FrameworkVersion version); public void processAddedLibraries(final Module module, final List addedLibraries) { } diff --git a/java/openapi/src/com/intellij/facet/ui/libraries/LibraryDownloadInfo.java b/platform/lang-api/src/com/intellij/facet/ui/libraries/LibraryDownloadInfo.java similarity index 100% rename from java/openapi/src/com/intellij/facet/ui/libraries/LibraryDownloadInfo.java rename to platform/lang-api/src/com/intellij/facet/ui/libraries/LibraryDownloadInfo.java diff --git a/java/openapi/src/com/intellij/facet/ui/libraries/LibraryInfo.java b/platform/lang-api/src/com/intellij/facet/ui/libraries/LibraryInfo.java similarity index 100% rename from java/openapi/src/com/intellij/facet/ui/libraries/LibraryInfo.java rename to platform/lang-api/src/com/intellij/facet/ui/libraries/LibraryInfo.java diff --git a/java/openapi/src/com/intellij/facet/ui/libraries/MavenLibraryUtil.java b/platform/lang-api/src/com/intellij/facet/ui/libraries/MavenLibraryUtil.java similarity index 100% rename from java/openapi/src/com/intellij/facet/ui/libraries/MavenLibraryUtil.java rename to platform/lang-api/src/com/intellij/facet/ui/libraries/MavenLibraryUtil.java diff --git a/java/openapi/src/com/intellij/facet/ui/libraries/RemoteRepositoryInfo.java b/platform/lang-api/src/com/intellij/facet/ui/libraries/RemoteRepositoryInfo.java similarity index 100% rename from java/openapi/src/com/intellij/facet/ui/libraries/RemoteRepositoryInfo.java rename to platform/lang-api/src/com/intellij/facet/ui/libraries/RemoteRepositoryInfo.java diff --git a/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportConfigurable.java b/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportConfigurable.java new file mode 100644 index 000000000000..ca2b0a35311e --- /dev/null +++ b/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportConfigurable.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved. + */ + +package com.intellij.ide.util.frameworkSupport; + +import com.intellij.openapi.module.Module; +import com.intellij.openapi.roots.ModifiableRootModel; +import com.intellij.openapi.roots.libraries.Library; +import com.intellij.util.EventDispatcher; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +/** + * @author nik + */ +public abstract class FrameworkSupportConfigurable { + private final EventDispatcher myDispatcher = EventDispatcher.create(FrameworkSupportConfigurableListener.class); + + @Nullable + public abstract JComponent getComponent(); + + public abstract void addSupport(@NotNull Module module, @NotNull ModifiableRootModel model, final @Nullable Library library); + + + @Nullable + public FrameworkVersion getSelectedVersion() { + return null; + } + + public void addListener(@NotNull FrameworkSupportConfigurableListener listener) { + myDispatcher.addListener(listener); + } + + public void removeListener(@NotNull FrameworkSupportConfigurableListener listener) { + myDispatcher.removeListener(listener); + } + + protected void fireFrameworkVersionChanged() { + myDispatcher.getMulticaster().frameworkVersionChanged(); + } +} diff --git a/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportConfigurableBase.form b/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportConfigurableBase.form new file mode 100644 index 000000000000..f8d22d8ab1f0 --- /dev/null +++ b/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportConfigurableBase.form @@ -0,0 +1,33 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportConfigurableBase.java b/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportConfigurableBase.java new file mode 100644 index 000000000000..f122a4b43307 --- /dev/null +++ b/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportConfigurableBase.java @@ -0,0 +1,89 @@ +package com.intellij.ide.util.frameworkSupport; + +import com.intellij.facet.ui.libraries.LibraryInfo; +import com.intellij.ide.util.frameworkSupport.FrameworkSupportConfigurable; +import com.intellij.ide.util.frameworkSupport.FrameworkVersion; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.roots.ModifiableRootModel; +import com.intellij.openapi.roots.libraries.Library; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Collections; +import java.util.List; + +/** + * @author Dmitry Avdeev +*/ +public class FrameworkSupportConfigurableBase extends FrameworkSupportConfigurable { + private JComboBox myVersionComboBox; + private final FrameworkSupportProviderBase myFrameworkSupportProvider; + private JPanel myMainPanel; + private JLabel myDescriptionLabel; + + public FrameworkSupportConfigurableBase(FrameworkSupportProviderBase frameworkSupportProvider) { + this(frameworkSupportProvider, Collections.emptyList(), null); + } + + public FrameworkSupportConfigurableBase(final FrameworkSupportProviderBase frameworkSupportProvider, List versions, String versionLabelText) { + myFrameworkSupportProvider = frameworkSupportProvider; + if (versions.size() > 0) { + myDescriptionLabel.setText(versionLabelText); + String maxValue = ""; + FrameworkVersion defaultVersion = versions.get(versions.size() - 1); + for (FrameworkVersion version : versions) { + myVersionComboBox.addItem(version); + FontMetrics fontMetrics = myVersionComboBox.getFontMetrics(myVersionComboBox.getFont()); + if (fontMetrics.stringWidth(version.getVersionName()) > fontMetrics.stringWidth(maxValue)) { + maxValue = version.getVersionName(); + } + if (version.isDefault()) { + defaultVersion = version; + } + } + myVersionComboBox.setPrototypeDisplayValue(maxValue + "_"); + myVersionComboBox.setRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + final Component component = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value instanceof FrameworkVersion) { + setText(((FrameworkVersion)value).getVersionName()); + } + return component; + } + }); + myVersionComboBox.setSelectedItem(defaultVersion); + myVersionComboBox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + fireFrameworkVersionChanged(); + } + }); + } + else { + myDescriptionLabel.setVisible(false); + myVersionComboBox.setVisible(false); + } + } + + public JComponent getComponent() { + return myMainPanel; + } + + @NotNull + public LibraryInfo[] getLibraries() { + return getSelectedVersion().getLibraries(); + } + + public void addSupport(@NotNull final Module module, @NotNull final ModifiableRootModel rootModel, final @Nullable Library library) { + myFrameworkSupportProvider.addSupport(module, rootModel, getSelectedVersion(), library); + } + + public FrameworkVersion getSelectedVersion() { + return (FrameworkVersion)myVersionComboBox.getSelectedItem(); + } + +} diff --git a/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportConfigurableListener.java b/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportConfigurableListener.java new file mode 100644 index 000000000000..fab1d957b3aa --- /dev/null +++ b/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportConfigurableListener.java @@ -0,0 +1,12 @@ +package com.intellij.ide.util.frameworkSupport; + +import java.util.EventListener; + +/** + * @author nik + */ +public interface FrameworkSupportConfigurableListener extends EventListener { + + void frameworkVersionChanged(); + +} diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportModel.java b/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportModel.java similarity index 94% rename from java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportModel.java rename to platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportModel.java index 8a2b44ea8c97..79411a553c81 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportModel.java +++ b/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportModel.java @@ -1,4 +1,4 @@ -package com.intellij.ide.util.newProjectWizard; +package com.intellij.ide.util.frameworkSupport; import com.intellij.ide.util.projectWizard.ModuleBuilder; import com.intellij.openapi.project.Project; diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportModelListener.java b/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportModelListener.java similarity index 86% rename from java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportModelListener.java rename to platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportModelListener.java index f4da1be8bcbe..e94270aa9c4a 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportModelListener.java +++ b/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportModelListener.java @@ -1,4 +1,4 @@ -package com.intellij.ide.util.newProjectWizard; +package com.intellij.ide.util.frameworkSupport; import org.jetbrains.annotations.NotNull; diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportProvider.java b/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportProvider.java similarity index 69% rename from java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportProvider.java rename to platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportProvider.java index 70431c587be6..34e4047575ee 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworkSupportProvider.java +++ b/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportProvider.java @@ -2,15 +2,13 @@ * Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved. */ -package com.intellij.ide.util.newProjectWizard; +package com.intellij.ide.util.frameworkSupport; +import com.intellij.ide.util.projectWizard.ModuleBuilder; import com.intellij.openapi.extensions.ExtensionPointName; -import com.intellij.openapi.module.JavaModuleType; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleType; -import com.intellij.openapi.project.Project; import com.intellij.util.ArrayUtil; -import com.intellij.ide.util.projectWizard.ModuleBuilder; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -31,18 +29,7 @@ public abstract class FrameworkSupportProvider { } @NotNull - public FrameworkSupportConfigurable createConfigurable(@NotNull FrameworkSupportModel model) { - return createConfigurable(model.getProject()); - } - - /** - * @deprecated override {@link FrameworkSupportProvider#createConfigurable(FrameworkSupportModel)} instead - */ - @Deprecated - @NotNull - public FrameworkSupportConfigurable createConfigurable(@Nullable final Project project) { - return null; - } + public abstract FrameworkSupportConfigurable createConfigurable(@NotNull FrameworkSupportModel model); @NonNls @Nullable @@ -69,9 +56,7 @@ public abstract class FrameworkSupportProvider { return null; } - public boolean isEnabledForModuleType(@NotNull ModuleType moduleType) { - return moduleType instanceof JavaModuleType; - } + public abstract boolean isEnabledForModuleType(@NotNull ModuleType moduleType); public boolean isEnabledForModuleBuilder(@NotNull ModuleBuilder builder) { return isEnabledForModuleType(builder.getModuleType()); diff --git a/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportProviderBase.java b/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportProviderBase.java new file mode 100644 index 000000000000..f596ac0bf30e --- /dev/null +++ b/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkSupportProviderBase.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved. + */ + +package com.intellij.ide.util.frameworkSupport; + +import com.intellij.openapi.module.Module; +import com.intellij.openapi.roots.ModifiableRootModel; +import com.intellij.openapi.roots.libraries.Library; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; + +/** + * @author nik + */ +public abstract class FrameworkSupportProviderBase extends FrameworkSupportProvider { + + protected FrameworkSupportProviderBase(final @NonNls @NotNull String id, final @NotNull String title) { + super(id, title); + } + + protected abstract void addSupport(@NotNull Module module, @NotNull ModifiableRootModel rootModel, FrameworkVersion version, final @Nullable Library library); + + @NotNull + public List getVersions() { + return Collections.emptyList(); + } + + public String getVersionLabelText() { + return "Version:"; + } + + @NotNull + public FrameworkSupportConfigurableBase createConfigurable(final @NotNull FrameworkSupportModel model) { + return new FrameworkSupportConfigurableBase(this, getVersions(), getVersionLabelText()); + } +} diff --git a/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkVersion.java b/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkVersion.java new file mode 100644 index 000000000000..5ac5a39efaa1 --- /dev/null +++ b/platform/lang-api/src/com/intellij/ide/util/frameworkSupport/FrameworkVersion.java @@ -0,0 +1,53 @@ +package com.intellij.ide.util.frameworkSupport; + +import com.intellij.facet.ui.libraries.LibraryInfo; +import org.jetbrains.annotations.NotNull; + +/** + * @author nik + */ +public class FrameworkVersion { + public static final FrameworkVersion[] EMPTY_ARRAY = new FrameworkVersion[0]; + private final String myVersionName; + private final String myLibraryName; + private final LibraryInfo[] myLibraries; + private final boolean myDefault; + + public FrameworkVersion(String versionName) { + this(versionName, false); + } + + public FrameworkVersion(@NotNull String versionName, boolean isDefault) { + myVersionName = versionName; + myDefault = isDefault; + myLibraryName = null; + myLibraries = LibraryInfo.EMPTY_ARRAY; + } + + public FrameworkVersion(String versionName, String libraryName, LibraryInfo[] libraries) { + this(versionName, libraryName, libraries, false); + } + + public FrameworkVersion(@NotNull String versionName, @NotNull String libraryName, @NotNull LibraryInfo[] libraries, boolean aDefault) { + myVersionName = versionName; + myLibraryName = libraryName; + myLibraries = libraries; + myDefault = aDefault; + } + + public String getVersionName() { + return myVersionName; + } + + public String getLibraryName() { + return myLibraryName; + } + + public LibraryInfo[] getLibraries() { + return myLibraries; + } + + public boolean isDefault() { + return myDefault; + } +} diff --git a/platform/lang-api/src/com/intellij/ide/util/projectWizard/ModuleBuilder.java b/platform/lang-api/src/com/intellij/ide/util/projectWizard/ModuleBuilder.java index 43e54b13c74b..2403044ec144 100644 --- a/platform/lang-api/src/com/intellij/ide/util/projectWizard/ModuleBuilder.java +++ b/platform/lang-api/src/com/intellij/ide/util/projectWizard/ModuleBuilder.java @@ -54,7 +54,6 @@ public abstract class ModuleBuilder extends ProjectBuilder{ private static final Logger LOG = Logger.getInstance("#com.intellij.ide.util.projectWizard.ModuleBuilder"); private String myName; @NonNls private String myModuleFilePath; - @Nullable private final List myUpdaters = new ArrayList(); private final EventDispatcher myDispatcher = EventDispatcher.create(ModuleBuilderListener.class); @@ -243,7 +242,7 @@ public abstract class ModuleBuilder extends ProjectBuilder{ public static abstract class ModuleConfigurationUpdater { - public abstract void update(Module module, ModifiableRootModel rootModel); + public abstract void update(@NotNull Module module, @NotNull ModifiableRootModel rootModel); } } diff --git a/platform/platform-api/src/com/intellij/openapi/ui/LabeledComponent.java b/platform/platform-api/src/com/intellij/openapi/ui/LabeledComponent.java index a6104479888d..7b788e55619c 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/LabeledComponent.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/LabeledComponent.java @@ -19,6 +19,7 @@ import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.IdeBorderFactory; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; @@ -35,6 +36,14 @@ public class LabeledComponent extends JPanel { updateUI(); } + @NotNull + public static LabeledComponent create(@NotNull Comp component, @NotNull String text) { + final LabeledComponent labeledComponent = new LabeledComponent(); + labeledComponent.setComponent(component); + labeledComponent.setText(text); + return labeledComponent; + } + private void updateLabelBorder() { int left = 0; int bottom = 0; diff --git a/platform/platform-api/src/com/intellij/ui/CheckboxTreeBase.java b/platform/platform-api/src/com/intellij/ui/CheckboxTreeBase.java index 633ebf219080..7488fe797b16 100644 --- a/platform/platform-api/src/com/intellij/ui/CheckboxTreeBase.java +++ b/platform/platform-api/src/com/intellij/ui/CheckboxTreeBase.java @@ -284,9 +284,15 @@ public class CheckboxTreeBase extends Tree { public static abstract class CheckboxTreeCellRendererBase extends JPanel implements TreeCellRenderer { private final ColoredTreeCellRenderer myTextRenderer; public final JCheckBox myCheckbox; + private final boolean myUsePartialStatusForParentNodes; public CheckboxTreeCellRendererBase(boolean opaque) { + this(opaque, true); + } + + public CheckboxTreeCellRendererBase(boolean opaque, final boolean usePartialStatusForParentNodes) { super(new BorderLayout()); + myUsePartialStatusForParentNodes = usePartialStatusForParentNodes; myCheckbox = new JCheckBox(); myTextRenderer = new ColoredTreeCellRenderer() { public void customizeCellRenderer(JTree tree, @@ -337,7 +343,7 @@ public class CheckboxTreeBase extends Tree { private NodeState getNodeStatus(final CheckedTreeNode node) { final boolean checked = node.isChecked(); - if (node.getChildCount() == 0) return checked ? NodeState.FULL : NodeState.CLEAR; + if (node.getChildCount() == 0 || !myUsePartialStatusForParentNodes) return checked ? NodeState.FULL : NodeState.CLEAR; NodeState result = null; diff --git a/platform/platform-impl/src/com/intellij/ui/CheckboxTree.java b/platform/platform-impl/src/com/intellij/ui/CheckboxTree.java index 7458bce2ac24..9e56a66b6c5e 100644 --- a/platform/platform-impl/src/com/intellij/ui/CheckboxTree.java +++ b/platform/platform-impl/src/com/intellij/ui/CheckboxTree.java @@ -16,6 +16,10 @@ public class CheckboxTree extends CheckboxTreeBase { protected CheckboxTreeCellRenderer(final boolean opaque) { super(opaque); } + + protected CheckboxTreeCellRenderer(boolean opaque, boolean usePartialStatusForParentNodes) { + super(opaque, usePartialStatusForParentNodes); + } } public CheckboxTree(final CheckboxTreeCellRenderer cellRenderer, CheckedTreeNode root) { diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 21509a878446..7611af6db818 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -123,7 +123,7 @@ - +