new project wizard: AddSupportForFrameworksPanel reused

This commit is contained in:
Dmitry Avdeev
2013-09-18 15:14:31 +04:00
parent bcd063970c
commit 95df68149f
9 changed files with 104 additions and 96 deletions
@@ -32,7 +32,7 @@ public class NewProjectWizard extends AbstractWizard<Step> {
public NewProjectWizard(String title, @Nullable Project project) {
super(title, project);
myContext = new WizardContext(project);
addStep(new ProjectTypeStep(project));
addStep(new ProjectTypeStep(project, getDisposable()));
init();
}
@@ -14,7 +14,10 @@
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
<clientProperties>
<BorderFactoryClass class="java.lang.String" value="com.intellij.ui.IdeBorderFactory$PlainSmallWithoutIndent"/>
</clientProperties>
<border type="none" title="Project &amp;Type"/>
<children>
<scrollpane id="19f6a" class="com.intellij.ui.components.JBScrollPane">
<constraints>
@@ -36,33 +39,16 @@
</scrollpane>
</children>
</grid>
<grid id="ad16" layout-manager="BorderLayout" hgap="0" vgap="0">
<grid id="ad16" binding="myOptionsPanel" layout-manager="BorderLayout" hgap="0" vgap="0">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="3" hsize-policy="7" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<grid id="e9ba1" binding="myHeader" layout-manager="FlowLayout" hgap="5" vgap="5" flow-align="1">
<constraints border-constraint="North"/>
<properties/>
<border type="none"/>
<children/>
</grid>
<scrollpane id="1df8b" class="com.intellij.ui.components.JBScrollPane">
<constraints border-constraint="Center"/>
<properties/>
<border type="none"/>
<children>
<grid id="ba7e5" binding="myFrameworksPanel" layout-manager="FlowLayout" hgap="5" vgap="5" flow-align="0">
<constraints/>
<properties/>
<border type="none"/>
<children/>
</grid>
</children>
</scrollpane>
</children>
<clientProperties>
<BorderFactoryClass class="java.lang.String" value="com.intellij.ui.IdeBorderFactory$PlainSmallWithoutIndent"/>
</clientProperties>
<border type="none" title="O&amp;ptions"/>
<children/>
</grid>
</children>
</grid>
@@ -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<FrameworkPanel> myFrameworks = new ArrayList<FrameworkPanel>();
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.<FrameworkSupportInModuleProvider>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<FrameworkSupportInModuleProvider> providers = new ArrayList<FrameworkSupportInModuleProvider>();
if (projectCategory != null) {
List<FrameworkSupportInModuleProvider> 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;
@@ -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());
@@ -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<FrameworkSupportInModuleProvider> myProviders;
private List<FrameworkSupportNodeBase> myRoots;
private final LibrariesContainer myLibrariesContainer;
private final List<FrameworkSupportInModuleProvider> 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<FrameworkGroup<?>, JPanel> myInitializedGroupPanels = new HashMap<FrameworkGroup<?>, JPanel>();
private FrameworkSupportNodeBase myLastSelectedNode;
public AddSupportForFrameworksPanel(final List<FrameworkSupportInModuleProvider> providers, final FrameworkSupportModelBase model) {
public AddSupportForFrameworksPanel(final List<FrameworkSupportInModuleProvider> 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<FrameworkSupportInModuleProvider> providers) {
myProviders = providers;
createNodes();
myFrameworksTree.setRoots(myRoots);
}
protected void onFrameworkStateChanged() {}
private void onSelectionChanged() {
@@ -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.<FrameworkSupportNodeBase>emptyList());
}
public FrameworksTree(List<FrameworkSupportNodeBase> 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<FrameworkSupportNodeBase> roots) {
setModel(new DefaultTreeModel(new FrameworksRootNode(roots)));
TreeUtil.expandAll(this);
}
@@ -43,7 +43,7 @@ public class SupportForFrameworksStep extends ModuleWizardStep {
myBuilder = builder;
List<FrameworkSupportInModuleProvider> 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);
@@ -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
}
@@ -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);