From 43c3044636ce941a0e4e374cd2b714ff30c301e4 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 17 Jul 2006 13:01:32 +0400 Subject: [PATCH] jdk step usability --- .../projectWizard/ProjectWizardStepFactory.java | 13 ++-- resources_eng/src/messages/IdeBundle.properties | 3 +- .../ide/util/projectWizard/JdkChooserPanel.java | 75 +++++++++++++--------- .../ide/util/projectWizard/ProjectJdkStep.java | 24 ++++++- .../ProjectWizardStepFactoryImpl.java | 19 ++++-- .../roots/ui/configuration/JdkComboBox.java | 6 +- .../projectRoot/ProjectJdksModel.java | 8 +-- .../projectRoot/ProjectRootConfigurable.java | 27 ++------ .../openapi/projectRoots/ui/ProjectJdksEditor.java | 14 +--- 9 files changed, 106 insertions(+), 83 deletions(-) diff --git a/openapi/src/com/intellij/ide/util/projectWizard/ProjectWizardStepFactory.java b/openapi/src/com/intellij/ide/util/projectWizard/ProjectWizardStepFactory.java index 4d1b4032a8..7764f568c0 100644 --- a/openapi/src/com/intellij/ide/util/projectWizard/ProjectWizardStepFactory.java +++ b/openapi/src/com/intellij/ide/util/projectWizard/ProjectWizardStepFactory.java @@ -16,15 +16,15 @@ package com.intellij.ide.util.projectWizard; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.module.ModuleType; +import com.intellij.openapi.projectRoots.SdkType; import com.intellij.openapi.roots.ui.configuration.ModulesProvider; import com.intellij.openapi.util.Computable; -import com.intellij.openapi.module.ModuleType; - -import javax.swing.*; - import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import javax.swing.*; + /** * A factory for creating some commonly used project wizards steps */ @@ -40,8 +40,13 @@ public abstract class ProjectWizardStepFactory { public abstract ModuleWizardStep createSourcePathsStep(ModuleWizardStep nameAndLocationStep, JavaModuleBuilder builder, Icon icon, @NonNls String helpId); + /** + * @deprecated + */ public abstract ModuleWizardStep createProjectJdkStep(WizardContext context, JavaModuleBuilder builder, Computable isVisibile, Icon icon, @NonNls String helpId); + public abstract ModuleWizardStep createProjectJdkStep(WizardContext context, SdkType type, JavaModuleBuilder builder, Computable isVisibile, Icon icon, @NonNls String helpId); + public abstract AddSupportStep createLoadJarsStep(AddSupportContext context, String title, Icon icon); public abstract void registerAddSupportProvider(final ModuleType moduleType, AddSupportStepsProvider provider); diff --git a/resources_eng/src/messages/IdeBundle.properties b/resources_eng/src/messages/IdeBundle.properties index 4b41b61c21..ff2db1ff0f 100644 --- a/resources_eng/src/messages/IdeBundle.properties +++ b/resources_eng/src/messages/IdeBundle.properties @@ -1037,4 +1037,5 @@ add.shared.scope.action.text=Add shared scope add.scope.popup.title=Add scope add.scope.name.label=Name add.scope.dialog.title=Add new scope -scope.banner.text=Scope ''{0}'' settings \ No newline at end of file +scope.banner.text=Scope ''{0}'' settings +prompt.please.select.module.jdk=Please select {0} to be set for this module \ No newline at end of file diff --git a/source/com/intellij/ide/util/projectWizard/JdkChooserPanel.java b/source/com/intellij/ide/util/projectWizard/JdkChooserPanel.java index 29dcad6234..e91561aaea 100644 --- a/source/com/intellij/ide/util/projectWizard/JdkChooserPanel.java +++ b/source/com/intellij/ide/util/projectWizard/JdkChooserPanel.java @@ -4,10 +4,12 @@ import com.intellij.ide.IdeBundle; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectBundle; +import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.projectRoots.ProjectJdk; import com.intellij.openapi.projectRoots.ProjectJdkTable; import com.intellij.openapi.projectRoots.ui.ProjectJdksEditor; import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectRootConfigurable; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.wm.ex.WindowManagerEx; import gnu.trove.TIntArrayList; @@ -20,21 +22,18 @@ import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Arrays; +import java.util.Collection; import java.util.Comparator; public class JdkChooserPanel extends JPanel { private JList myList = null; private DefaultListModel myListModel = null; private ProjectJdk myCurrentJdk; - private boolean myUseDefaultProject; + private Project myProject; //null during project creation - public JdkChooserPanel() { - this(false); - } - - public JdkChooserPanel(boolean useDefaultProject) { + public JdkChooserPanel(Project project) { super(new BorderLayout()); - myUseDefaultProject = useDefaultProject; + myProject = project; myListModel = new DefaultListModel(); myList = new JList(myListModel); myList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); @@ -50,7 +49,7 @@ public class JdkChooserPanel extends JPanel { }); myList.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { - if (e.getClickCount() == 2) { + if (e.getClickCount() == 2 && myProject == null) { editJdkTable(); } } @@ -69,30 +68,36 @@ public class JdkChooserPanel extends JPanel { } public void editJdkTable() { - ProjectJdksEditor editor = new ProjectJdksEditor((ProjectJdk)myList.getSelectedValue(), myUseDefaultProject, myList); + ProjectJdksEditor editor = new ProjectJdksEditor((ProjectJdk)myList.getSelectedValue(), + myProject != null ? myProject : ProjectManager.getInstance().getDefaultProject(), + myList); editor.show(); if (editor.isOK()) { ProjectJdk selectedJdk = editor.getSelectedJdk(); - Object[] selectedValues = selectedJdk != null ? new Object[]{selectedJdk} : myList.getSelectedValues(); - fillList(); - // restore selection - TIntArrayList list = new TIntArrayList(); - for (Object selectedValue : selectedValues) { - int idx = myListModel.indexOf(selectedValue); - if (idx >= 0) { - list.add(idx); - } - } - final int[] indicesToSelect = list.toNativeArray(); - if (indicesToSelect.length > 0) { - myList.setSelectedIndices(indicesToSelect); - } - else if (myList.getModel().getSize() > 0) { - myList.setSelectedIndex(0); - } + updateList(selectedJdk); + } + } - myCurrentJdk = (ProjectJdk)myList.getSelectedValue(); + public void updateList(final ProjectJdk selectedJdk) { + Object[] selectedValues = selectedJdk != null ? new Object[]{selectedJdk} : myList.getSelectedValues(); + fillList(); + // restore selection + TIntArrayList list = new TIntArrayList(); + for (Object selectedValue : selectedValues) { + int idx = myListModel.indexOf(selectedValue); + if (idx >= 0) { + list.add(idx); + } + } + final int[] indicesToSelect = list.toNativeArray(); + if (indicesToSelect.length > 0) { + myList.setSelectedIndices(indicesToSelect); + } + else if (myList.getModel().getSize() > 0) { + myList.setSelectedIndex(0); } + + myCurrentJdk = (ProjectJdk)myList.getSelectedValue(); } public JList getPreferredFocusedComponent() { @@ -101,7 +106,15 @@ public class JdkChooserPanel extends JPanel { private void fillList() { myListModel.clear(); - final ProjectJdk[] jdks = ProjectJdkTable.getInstance().getAllJdks(); + final ProjectJdk[] jdks; + if (myProject == null) { + jdks = ProjectJdkTable.getInstance().getAllJdks(); + } + else { + final Collection collection = + ProjectRootConfigurable.getInstance(myProject).getProjectJdksModel().getProjectJdks().values(); + jdks = collection.toArray(new ProjectJdk[collection.size()]); + } Arrays.sort(jdks, new Comparator() { public int compare(final ProjectJdk o1, final ProjectJdk o2) { return o1.getName().compareToIgnoreCase(o2.getName()); @@ -123,8 +136,8 @@ public class JdkChooserPanel extends JPanel { } } - private static ProjectJdk showDialog(String title, final Component parent, ProjectJdk jdkToSelect) { - final JdkChooserPanel jdkChooserPanel = new JdkChooserPanel(); + private static ProjectJdk showDialog(final Project project, String title, final Component parent, ProjectJdk jdkToSelect) { + final JdkChooserPanel jdkChooserPanel = new JdkChooserPanel(project); final MyDialog dialog = jdkChooserPanel.new MyDialog(parent); if (title != null) { dialog.setTitle(title); @@ -138,7 +151,7 @@ public class JdkChooserPanel extends JPanel { public static ProjectJdk chooseAndSetJDK(final Project project) { final ProjectJdk projectJdk = ProjectRootManager.getInstance(project).getProjectJdk(); - final ProjectJdk jdk = showDialog(ProjectBundle.message("module.libraries.target.jdk.select.title"), WindowManagerEx.getInstanceEx().getFrame(project), projectJdk); + final ProjectJdk jdk = showDialog(project, ProjectBundle.message("module.libraries.target.jdk.select.title"), WindowManagerEx.getInstanceEx().getFrame(project), projectJdk); if (jdk == null) { return null; } diff --git a/source/com/intellij/ide/util/projectWizard/ProjectJdkStep.java b/source/com/intellij/ide/util/projectWizard/ProjectJdkStep.java index 6b77f5f32f..199dfce1d4 100644 --- a/source/com/intellij/ide/util/projectWizard/ProjectJdkStep.java +++ b/source/com/intellij/ide/util/projectWizard/ProjectJdkStep.java @@ -4,10 +4,13 @@ import com.intellij.ide.IdeBundle; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ex.ProjectManagerEx; import com.intellij.openapi.projectRoots.ProjectJdk; +import com.intellij.openapi.projectRoots.SdkType; import com.intellij.openapi.roots.ex.ProjectRootManagerEx; +import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectRootConfigurable; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.ui.MultiLineLabelUI; import com.intellij.openapi.util.IconLoader; +import com.intellij.util.Consumer; import com.intellij.util.ui.UIUtil; import javax.swing.*; @@ -27,13 +30,17 @@ public class ProjectJdkStep extends ModuleWizardStep { private boolean myInitialized = false; public ProjectJdkStep(WizardContext context) { + this(context, null); + } + + public ProjectJdkStep(final WizardContext context, final SdkType type) { myContext = context; - myJdkChooser = new JdkChooserPanel(true); + myJdkChooser = new JdkChooserPanel(context.getProject()); myPanel = new JPanel(new GridBagLayout()); myPanel.setBorder(BorderFactory.createEtchedBorder()); - final JLabel label = new JLabel(IdeBundle.message("prompt.please.select.project.jdk")); + final JLabel label = new JLabel(type == null ? IdeBundle.message("prompt.please.select.project.jdk") : IdeBundle.message("prompt.please.select.module.jdk", type.getPresentableName())); label.setUI(new MultiLineLabelUI()); myPanel.add(label, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 2, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(8, 10, 8, 10), 0, 0)); @@ -47,7 +54,18 @@ public class ProjectJdkStep extends ModuleWizardStep { configureButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - myJdkChooser.editJdkTable(); + if (type == null) { //new project + myJdkChooser.editJdkTable(); + } else { + final Project project = context.getProject(); + final ProjectRootConfigurable rootConfigurable = ProjectRootConfigurable.getInstance(project); + rootConfigurable.getProjectJdksModel().doAdd(type, myPanel, new Consumer() { + public void consume(final ProjectJdk jdk) { + rootConfigurable.addJdkNode(jdk); + myJdkChooser.updateList(jdk); + } + }); + } } }); } diff --git a/source/com/intellij/ide/util/projectWizard/ProjectWizardStepFactoryImpl.java b/source/com/intellij/ide/util/projectWizard/ProjectWizardStepFactoryImpl.java index a5b94d6853..614c892ca6 100644 --- a/source/com/intellij/ide/util/projectWizard/ProjectWizardStepFactoryImpl.java +++ b/source/com/intellij/ide/util/projectWizard/ProjectWizardStepFactoryImpl.java @@ -5,15 +5,15 @@ package com.intellij.ide.util.projectWizard; import com.intellij.openapi.components.ApplicationComponent; +import com.intellij.openapi.module.ModuleType; +import com.intellij.openapi.projectRoots.SdkType; import com.intellij.openapi.roots.ui.configuration.ModulesProvider; import com.intellij.openapi.util.Computable; -import com.intellij.openapi.module.ModuleType; import com.intellij.util.containers.MultiMap; - -import javax.swing.*; - +import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import javax.swing.*; import java.util.ArrayList; import java.util.Arrays; @@ -45,7 +45,16 @@ public class ProjectWizardStepFactoryImpl extends ProjectWizardStepFactory imple final Computable isVisible, final Icon icon, final String helpId) { - return new ProjectJdkStep(context){ + return createProjectJdkStep(context, null, builder, isVisible, icon, helpId); + } + + public ModuleWizardStep createProjectJdkStep(WizardContext context, + SdkType type, + final JavaModuleBuilder builder, + final Computable isVisible, + final Icon icon, + @NonNls final String helpId) { + return new ProjectJdkStep(context, type){ public void updateDataModel() { super.updateDataModel(); builder.setModuleJdk(getJdk()); diff --git a/source/com/intellij/openapi/roots/ui/configuration/JdkComboBox.java b/source/com/intellij/openapi/roots/ui/configuration/JdkComboBox.java index 84aac53f8f..0afae9a0a7 100644 --- a/source/com/intellij/openapi/roots/ui/configuration/JdkComboBox.java +++ b/source/com/intellij/openapi/roots/ui/configuration/JdkComboBox.java @@ -18,6 +18,7 @@ import com.intellij.openapi.ui.FixedSizeButton; import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.util.Condition; import com.intellij.ui.SimpleTextAttributes; +import com.intellij.util.Consumer; import javax.swing.*; import java.awt.event.ActionEvent; @@ -72,8 +73,8 @@ class JdkComboBox extends JComboBox{ public void actionPerformed(ActionEvent e) { final ProjectRootConfigurable configurable = ProjectRootConfigurable.getInstance(project); DefaultActionGroup group = new DefaultActionGroup(); - jdksModel.createAddActions(group, JdkComboBox.this, new Condition() { - public boolean value(final ProjectJdk jdk) { + jdksModel.createAddActions(group, JdkComboBox.this, new Consumer() { + public void consume(final ProjectJdk jdk) { configurable.addJdkNode(jdk); reloadModel(firstItem, project); setSelectedJdk(jdk); //restore selection @@ -82,7 +83,6 @@ class JdkComboBox extends JComboBox{ setSelectedJdk(firstItem.getJdk()); } } - return false; } }); JBPopupFactory.getInstance() diff --git a/source/com/intellij/openapi/roots/ui/configuration/projectRoot/ProjectJdksModel.java b/source/com/intellij/openapi/roots/ui/configuration/projectRoot/ProjectJdksModel.java index 001a74a8d1..889456b56c 100644 --- a/source/com/intellij/openapi/roots/ui/configuration/projectRoot/ProjectJdksModel.java +++ b/source/com/intellij/openapi/roots/ui/configuration/projectRoot/ProjectJdksModel.java @@ -18,8 +18,8 @@ import com.intellij.openapi.projectRoots.ui.NotifiableSdkModel; import com.intellij.openapi.projectRoots.ui.SdkEditor; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.Condition; import com.intellij.util.ArrayUtil; +import com.intellij.util.Consumer; import com.intellij.util.EventDispatcher; import org.jetbrains.annotations.Nullable; @@ -202,7 +202,7 @@ public class ProjectJdksModel implements NotifiableSdkModel { } } - public void createAddActions(DefaultActionGroup group, final JComponent parent, final Condition updateTree) { + public void createAddActions(DefaultActionGroup group, final JComponent parent, final Consumer updateTree) { final SdkType[] types = ApplicationManager.getApplication().getComponents(SdkType.class); for (final SdkType type : types) { final AnAction addAction = new AnAction(ProjectBundle.message("sdk.list.add.action", type.getPresentableName()), @@ -216,7 +216,7 @@ public class ProjectJdksModel implements NotifiableSdkModel { } } - private void doAdd(final SdkType type, JComponent parent, final Condition updateTree) { + public void doAdd(final SdkType type, JComponent parent, final Consumer updateTree) { final String home = SdkEditor.selectSdkHome(parent, type); if (home == null) { return; @@ -235,7 +235,7 @@ public class ProjectJdksModel implements NotifiableSdkModel { newJdk.setHomePath(home); type.setupSdkPaths(newJdk); myProjectJdks.put(newJdk, newJdk); - updateTree.value(newJdk); + updateTree.consume(newJdk); mySdkEventsDispatcher.getMulticaster().sdkAdded(newJdk); myModified = true; } diff --git a/source/com/intellij/openapi/roots/ui/configuration/projectRoot/ProjectRootConfigurable.java b/source/com/intellij/openapi/roots/ui/configuration/projectRoot/ProjectRootConfigurable.java index 3081b402bc..618013f63d 100644 --- a/source/com/intellij/openapi/roots/ui/configuration/projectRoot/ProjectRootConfigurable.java +++ b/source/com/intellij/openapi/roots/ui/configuration/projectRoot/ProjectRootConfigurable.java @@ -808,10 +808,9 @@ public class ProjectRootConfigurable extends MasterDetailsComponent implements P public DefaultActionGroup createAddJdksGroup(){ DefaultActionGroup group = new DefaultActionGroup(); - myJdksTreeModel.createAddActions(group, myTree, new Condition() { - public boolean value(final ProjectJdk jdk) { - addNode(new MyNode(new JdkConfigurable((ProjectJdkImpl)jdk, myJdksTreeModel), true), myJdksNode); - return false; + myJdksTreeModel.createAddActions(group, myTree, new Consumer() { + public void consume(final ProjectJdk projectJdk) { + addJdkNode(projectJdk); } }); return group; @@ -819,12 +818,10 @@ public class ProjectRootConfigurable extends MasterDetailsComponent implements P private PopupStep createJdksStep(DataContext dataContext) { DefaultActionGroup group = new DefaultActionGroup(); - myJdksTreeModel.createAddActions(group, myTree, new Condition() { - public boolean value(final ProjectJdk jdk) { - createNode(new JdkConfigurable((ProjectJdkImpl)jdk, myJdksTreeModel), myJdksNode); - return false; + myJdksTreeModel.createAddActions(group, myTree, new Consumer() { + public void consume(final ProjectJdk projectJdk) { + addJdkNode(projectJdk); } - }); final JBPopupFactory popupFactory = JBPopupFactory.getInstance(); return popupFactory.createActionsStep(group, dataContext, false, false, ProjectBundle.message("add.new.jdk.title"), myTree, true); @@ -929,17 +926,7 @@ public class ProjectRootConfigurable extends MasterDetailsComponent implements P final Module module = myModulesConfigurator.addModule(myTree); if (module != null) { final MyNode node = new MyNode(new ModuleConfigurable(myModulesConfigurator, module), true); - myProjectNode.add(node); - TreeUtil.sort(myProjectNode, new Comparator() { - public int compare(final Object o1, final Object o2) { - final MyNode node1 = (MyNode)o1; - final MyNode node2 = (MyNode)o2; - if (node1.getConfigurable()instanceof ModuleConfigurable) return -1; - if (node2.getConfigurable()instanceof ModuleConfigurable) return 1; - return node1.getDisplayName().compareToIgnoreCase(node2.getDisplayName()); - } - }); - ((DefaultTreeModel)myTree.getModel()).reload(myProjectNode); + addNode(node, myProjectNode); selectNodeInTree(node); } } diff --git a/ui/impl/com/intellij/openapi/projectRoots/ui/ProjectJdksEditor.java b/ui/impl/com/intellij/openapi/projectRoots/ui/ProjectJdksEditor.java index 0d8bd896b4..acf6714234 100644 --- a/ui/impl/com/intellij/openapi/projectRoots/ui/ProjectJdksEditor.java +++ b/ui/impl/com/intellij/openapi/projectRoots/ui/ProjectJdksEditor.java @@ -5,7 +5,6 @@ import com.intellij.openapi.actionSystem.DataConstants; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectBundle; -import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.projectRoots.ProjectJdk; import com.intellij.openapi.roots.ui.configuration.projectRoot.JdksConfigurable; import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectRootConfigurable; @@ -23,17 +22,8 @@ public class ProjectJdksEditor extends DialogWrapper{ private ProjectJdk myProjectJdk; - public ProjectJdksEditor(ProjectJdk jdk, boolean useDefaultProject, Component parent) { + public ProjectJdksEditor(ProjectJdk jdk, Project project, Component parent) { super(parent, true); - Project project; - if (useDefaultProject){ - project = ProjectManager.getInstance().getDefaultProject(); - } else { - project = (Project)DataManager.getInstance().getDataContext(parent).getData(DataConstants.PROJECT); - if (project == null){ - project = ProjectManager.getInstance().getDefaultProject(); - } - } myConfigurable = ProjectRootConfigurable.getInstance(project); myConfigurable.selectNodeInTree(jdk != null ? jdk.getName() : JdksConfigurable.JDKS); setTitle(ProjectBundle.message("sdk.configure.title")); @@ -41,7 +31,7 @@ public class ProjectJdksEditor extends DialogWrapper{ } public ProjectJdksEditor(ProjectJdk jdk, Component parent){ - this(jdk, false, parent); + this(jdk, (Project)DataManager.getInstance().getDataContext().getData(DataConstants.PROJECT), parent); } protected JComponent createCenterPanel(){ -- 2.11.4.GIT