From 95df68149f89a88595dc99716cd023f2eef820bc Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Wed, 18 Sep 2013 15:13:38 +0400 Subject: [PATCH] new project wizard: AddSupportForFrameworksPanel reused --- .../ide/projectWizard/NewProjectWizard.java | 2 +- .../ide/projectWizard/ProjectTypeStep.form | 34 +++------ .../ide/projectWizard/ProjectTypeStep.java | 48 +++++------- .../AddFrameworkSupportDialog.java | 2 +- .../AddSupportForFrameworksPanel.java | 21 ++++-- .../util/newProjectWizard/FrameworksTree.java | 12 +++ .../SupportForFrameworksStep.java | 2 +- .../src/com/intellij/ui/CheckboxTreeBase.java | 74 +++++++++++-------- .../src/com/intellij/ui/CheckboxTree.java | 5 ++ 9 files changed, 104 insertions(+), 96 deletions(-) diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/NewProjectWizard.java b/java/idea-ui/src/com/intellij/ide/projectWizard/NewProjectWizard.java index 939ee9bb1b44..f76462bf2e1d 100644 --- a/java/idea-ui/src/com/intellij/ide/projectWizard/NewProjectWizard.java +++ b/java/idea-ui/src/com/intellij/ide/projectWizard/NewProjectWizard.java @@ -32,7 +32,7 @@ public class NewProjectWizard extends AbstractWizard { public NewProjectWizard(String title, @Nullable Project project) { super(title, project); myContext = new WizardContext(project); - addStep(new ProjectTypeStep(project)); + addStep(new ProjectTypeStep(project, getDisposable())); init(); } diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.form b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.form index a3412e18a068..85e5a7596aaa 100644 --- a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.form +++ b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.form @@ -14,7 +14,10 @@ - + + + + @@ -36,33 +39,16 @@ - + - - - - - - - - - - - - - - - - - - - - - - + + + + + diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java index cf604627e90a..07a1e2cf8d08 100644 --- a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java +++ b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java @@ -20,12 +20,14 @@ import com.intellij.framework.FrameworkTypeEx; import com.intellij.framework.addSupport.FrameworkSupportInModuleProvider; import com.intellij.ide.util.frameworkSupport.FrameworkSupportModelImpl; import com.intellij.ide.util.frameworkSupport.FrameworkSupportUtil; +import com.intellij.ide.util.newProjectWizard.AddSupportForFrameworksPanel; import com.intellij.ide.util.newProjectWizard.impl.FrameworkSupportModelBase; import com.intellij.ide.wizard.StepAdapter; +import com.intellij.openapi.Disposable; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainer; import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainerFactory; -import com.intellij.openapi.ui.VerticalFlowLayout; +import com.intellij.openapi.util.Disposer; import com.intellij.ui.CollectionListModel; import com.intellij.ui.components.JBList; import com.intellij.util.ArrayUtil; @@ -33,8 +35,10 @@ import com.intellij.util.ArrayUtil; import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import java.awt.*; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; /** @@ -45,13 +49,12 @@ public class ProjectTypeStep extends StepAdapter { private JPanel myPanel; private JBList myProjectTypeList; - private JPanel myFrameworksPanel; - private JPanel myHeader; + private JPanel myOptionsPanel; - private final List myFrameworks = new ArrayList(); + private final AddSupportForFrameworksPanel myFrameworksPanel; private final FrameworkSupportModelBase myModel; - public ProjectTypeStep(Project project) { + public ProjectTypeStep(Project project, Disposable disposable) { final LibrariesContainer container = LibrariesContainerFactory.createContainer(project); myModel = new FrameworkSupportModelImpl(project, "", container); @@ -63,27 +66,24 @@ public class ProjectTypeStep extends StepAdapter { updateFrameworks((ProjectCategory)myProjectTypeList.getSelectedValue()); } }); - myProjectTypeList.setSelectedIndex(0); - myFrameworksPanel.setLayout(new VerticalFlowLayout()); - myHeader.setLayout(new VerticalFlowLayout()); + myFrameworksPanel = new AddSupportForFrameworksPanel(Collections.emptyList(), myModel, true); + Disposer.register(disposable, myFrameworksPanel); + + myOptionsPanel.add(myFrameworksPanel.getMainPanel(), BorderLayout.CENTER); + myProjectTypeList.setSelectedIndex(0); } private void updateFrameworks(ProjectCategory projectCategory) { - myFrameworks.clear(); - myFrameworksPanel.removeAll(); - myHeader.removeAll(); + List providers = new ArrayList(); if (projectCategory != null) { - List providers = FrameworkSupportUtil.getAllProviders(); - for (FrameworkSupportInModuleProvider framework : providers) { + for (FrameworkSupportInModuleProvider framework : FrameworkSupportUtil.getAllProviders()) { if (matchFramework(projectCategory, framework)) { - addFramework(framework, projectCategory); + providers.add(framework); } } } - myHeader.setVisible(myHeader.getComponentCount() > 0); - myPanel.revalidate(); - myPanel.repaint(); + myFrameworksPanel.setProviders(providers); } private static boolean matchFramework(ProjectCategory projectCategory, FrameworkSupportInModuleProvider framework) { @@ -114,20 +114,6 @@ public class ProjectTypeStep extends StepAdapter { return framework.isEnabledForModuleBuilder(projectCategory.createModuleBuilder()); } - private void addFramework(final FrameworkSupportInModuleProvider framework, ProjectCategory category) { - - FrameworkPanel frameworkPanel; - if (ArrayUtil.contains(framework.getFrameworkType().getId(), category.getAssociatedFrameworkIds())) { - frameworkPanel = new FrameworkPanel(framework, myModel, true); - myHeader.add(frameworkPanel); - } - else { - frameworkPanel = new FrameworkPanel(framework, myModel, false); - myFrameworksPanel.add(frameworkPanel); - } - myFrameworks.add(frameworkPanel); - } - @Override public JComponent getComponent() { return myPanel; 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 cfea5df1500c..be9fd1f6cdb3 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 @@ -37,7 +37,7 @@ public class AddFrameworkSupportDialog extends DialogWrapper { myModule = module; final LibrariesContainer container = LibrariesContainerFactory.createContainer(module.getProject()); final FrameworkSupportModelBase model = new FrameworkSupportModelImpl(module.getProject(), contentRootPath, container); - myAddSupportPanel = new AddSupportForFrameworksPanel(providers, model) { + myAddSupportPanel = new AddSupportForFrameworksPanel(providers, model, false) { @Override protected void onFrameworkStateChanged() { setOKActionEnabled(isOKActionEnabled()); 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 759e128cbf83..c643a5a901b1 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 @@ -59,9 +59,11 @@ public class AddSupportForFrameworksPanel implements Disposable { @NonNls private static final String EMPTY_CARD = "empty"; private JPanel myMainPanel; private JPanel myFrameworksPanel; + + private List myProviders; private List myRoots; + private final LibrariesContainer myLibrariesContainer; - private final List myProviders; private final FrameworkSupportModelBase myModel; private final JPanel myOptionsPanel; private final FrameworksTree myFrameworksTree; @@ -69,14 +71,13 @@ public class AddSupportForFrameworksPanel implements Disposable { private final Map, JPanel> myInitializedGroupPanels = new HashMap, JPanel>(); private FrameworkSupportNodeBase myLastSelectedNode; - public AddSupportForFrameworksPanel(final List providers, final FrameworkSupportModelBase model) { + public AddSupportForFrameworksPanel(final List providers, + final FrameworkSupportModelBase model, boolean vertical) { myModel = model; myLibrariesContainer = model.getLibrariesContainer(); - myProviders = providers; - createNodes(); - final Splitter splitter = new Splitter(false, 0.30f, 0.1f, 0.7f); - myFrameworksTree = new FrameworksTree(myRoots) { + final Splitter splitter = new Splitter(vertical, 0.30f, 0.1f, 0.7f); + myFrameworksTree = new FrameworksTree() { @Override protected void onNodeStateChanged(CheckedTreeNode node) { if (!(node instanceof FrameworkSupportNode)) return; @@ -91,6 +92,8 @@ public class AddSupportForFrameworksPanel implements Disposable { onFrameworkStateChanged(); } }; + setProviders(providers); + myFrameworksTree.addTreeSelectionListener(new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent e) { onSelectionChanged(); @@ -107,6 +110,12 @@ public class AddSupportForFrameworksPanel implements Disposable { myFrameworksTree.setSelectionRow(0); } + public void setProviders(List providers) { + myProviders = providers; + createNodes(); + myFrameworksTree.setRoots(myRoots); + } + protected void onFrameworkStateChanged() {} private void onSelectionChanged() { 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 index ce5921ef86a4..425e91b58ac7 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworksTree.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworksTree.java @@ -23,9 +23,11 @@ import com.intellij.util.containers.Convertor; import com.intellij.util.ui.tree.TreeUtil; import javax.swing.*; +import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import java.awt.*; import java.awt.event.MouseEvent; +import java.util.Collections; import java.util.List; /** @@ -34,10 +36,20 @@ import java.util.List; public class FrameworksTree extends CheckboxTree { private boolean myProcessingMouseEventOnCheckbox; + public FrameworksTree() { + this(Collections.emptyList()); + } + public FrameworksTree(List roots) { super(new FrameworksTreeRenderer(), new FrameworksRootNode(roots), new CheckPolicy(false, true, true, false)); setRootVisible(false); setShowsRootHandles(false); + putClientProperty("JTree.lineStyle", "None"); + TreeUtil.expandAll(this); + } + + public void setRoots(List roots) { + setModel(new DefaultTreeModel(new FrameworksRootNode(roots))); TreeUtil.expandAll(this); } 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 84292da14587..78f9bb231482 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 @@ -43,7 +43,7 @@ public class SupportForFrameworksStep extends ModuleWizardStep { myBuilder = builder; List providers = FrameworkSupportUtil.getProviders(builder); myFrameworkSupportModel = new FrameworkSupportModelInWizard(librariesContainer, builder); - mySupportForFrameworksPanel = new AddSupportForFrameworksPanel(providers, myFrameworkSupportModel); + mySupportForFrameworksPanel = new AddSupportForFrameworksPanel(providers, myFrameworkSupportModel, false); myConfigurationUpdater = new ModuleBuilder.ModuleConfigurationUpdater() { public void update(@NotNull final Module module, @NotNull final ModifiableRootModel rootModel) { mySupportForFrameworksPanel.addSupport(module, rootModel); diff --git a/platform/platform-api/src/com/intellij/ui/CheckboxTreeBase.java b/platform/platform-api/src/com/intellij/ui/CheckboxTreeBase.java index 3d3caa864072..18f59eda598a 100644 --- a/platform/platform-api/src/com/intellij/ui/CheckboxTreeBase.java +++ b/platform/platform-api/src/com/intellij/ui/CheckboxTreeBase.java @@ -34,19 +34,57 @@ public class CheckboxTreeBase extends Tree { private final CheckPolicy myCheckPolicy; private static final CheckPolicy DEFAULT_POLICY = new CheckPolicy(true, true, false, true); + public CheckboxTreeBase() { + this(new CheckboxTreeCellRendererBase(), null); + } + public CheckboxTreeBase(final CheckboxTreeCellRendererBase cellRenderer, CheckedTreeNode root) { this(cellRenderer, root, DEFAULT_POLICY); } - public CheckboxTreeBase(final CheckboxTreeCellRendererBase cellRenderer, CheckedTreeNode root, CheckPolicy checkPolicy) { + public CheckboxTreeBase(CheckboxTreeCellRendererBase cellRenderer, @Nullable CheckedTreeNode root, CheckPolicy checkPolicy) { myCheckPolicy = checkPolicy; - setCellRenderer(cellRenderer); setRootVisible(false); setShowsRootHandles(true); setLineStyleAngled(); TreeUtil.installActions(this); + installRenderer(cellRenderer); + + addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent e) { + if (isToggleEvent(e)) { + TreePath treePath = getLeadSelectionPath(); + if (treePath == null) return; + final Object o = treePath.getLastPathComponent(); + if (!(o instanceof CheckedTreeNode)) return; + CheckedTreeNode firstNode = (CheckedTreeNode)o; + boolean checked = toggleNode(firstNode); + + TreePath[] selectionPaths = getSelectionPaths(); + for (int i = 0; selectionPaths != null && i < selectionPaths.length; i++) { + final TreePath selectionPath = selectionPaths[i]; + final Object o1 = selectionPath.getLastPathComponent(); + if (!(o1 instanceof CheckedTreeNode)) continue; + CheckedTreeNode node = (CheckedTreeNode)o1; + checkNode(node, checked); + ((DefaultTreeModel)getModel()).nodeChanged(node); + } + + e.consume(); + } + } + }); + + setSelectionRow(0); + if (root != null) { + setModel(new DefaultTreeModel(root)); + } + } + + public void installRenderer(final CheckboxTreeCellRendererBase cellRenderer) { + setCellRenderer(cellRenderer); new ClickListener() { @Override public boolean onClick(MouseEvent e, int clickCount) { @@ -76,34 +114,6 @@ public class CheckboxTreeBase extends Tree { return false; } }.installOn(this); - - addKeyListener(new KeyAdapter() { - public void keyPressed(KeyEvent e) { - if (isToggleEvent(e)) { - TreePath treePath = getLeadSelectionPath(); - if (treePath == null) return; - final Object o = treePath.getLastPathComponent(); - if (!(o instanceof CheckedTreeNode)) return; - CheckedTreeNode firstNode = (CheckedTreeNode)o; - boolean checked = toggleNode(firstNode); - - TreePath[] selectionPaths = getSelectionPaths(); - for (int i = 0; selectionPaths != null && i < selectionPaths.length; i++) { - final TreePath selectionPath = selectionPaths[i]; - final Object o1 = selectionPath.getLastPathComponent(); - if (!(o1 instanceof CheckedTreeNode)) continue; - CheckedTreeNode node = (CheckedTreeNode)o1; - checkNode(node, checked); - ((DefaultTreeModel)getModel()).nodeChanged(node); - } - - e.consume(); - } - } - }); - - setSelectionRow(0); - setModel(new DefaultTreeModel(root)); } protected void onDoubleClick(final CheckedTreeNode node) { @@ -282,7 +292,7 @@ public class CheckboxTreeBase extends Tree { return true; } - public static abstract class CheckboxTreeCellRendererBase extends JPanel implements TreeCellRenderer { + public static class CheckboxTreeCellRendererBase extends JPanel implements TreeCellRenderer { private final ColoredTreeCellRenderer myTextRenderer; public final JCheckBox myCheckbox; private final boolean myUsePartialStatusForParentNodes; @@ -402,7 +412,7 @@ public class CheckboxTreeBase extends Tree { } - public static enum NodeState { + public enum NodeState { FULL, CLEAR, PARTIAL } diff --git a/platform/platform-impl/src/com/intellij/ui/CheckboxTree.java b/platform/platform-impl/src/com/intellij/ui/CheckboxTree.java index 460cae818062..c91be65978c1 100644 --- a/platform/platform-impl/src/com/intellij/ui/CheckboxTree.java +++ b/platform/platform-impl/src/com/intellij/ui/CheckboxTree.java @@ -42,6 +42,11 @@ public class CheckboxTree extends CheckboxTreeBase { installSpeedSearch(); } + + // for designer + public CheckboxTree() { + } + public CheckboxTree(final CheckboxTreeCellRenderer cellRenderer, CheckedTreeNode root, final CheckPolicy checkPolicy) { super(cellRenderer, root, checkPolicy);