EditorConfig documentation test
[idea/community.git] / java / idea-ui / src / com / intellij / projectImport / ImportChooserStep.java
1 // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2
3 package com.intellij.projectImport;
4
5 import com.intellij.ide.util.PropertiesComponent;
6 import com.intellij.ide.util.newProjectWizard.StepSequence;
7 import com.intellij.ide.util.projectWizard.ImportFromSourcesProvider;
8 import com.intellij.ide.util.projectWizard.WizardContext;
9 import com.intellij.openapi.project.ProjectBundle;
10 import com.intellij.openapi.util.Comparing;
11 import com.intellij.openapi.util.IconLoader;
12 import com.intellij.openapi.wm.IdeFocusManager;
13 import com.intellij.ui.DoubleClickListener;
14 import com.intellij.ui.components.JBList;
15 import com.intellij.ui.components.JBRadioButton;
16 import org.jetbrains.annotations.NonNls;
17 import org.jetbrains.annotations.Nullable;
18
19 import javax.swing.*;
20 import javax.swing.event.ListSelectionEvent;
21 import javax.swing.event.ListSelectionListener;
22 import java.awt.*;
23 import java.awt.event.ActionEvent;
24 import java.awt.event.ActionListener;
25 import java.awt.event.MouseEvent;
26 import java.util.ArrayList;
27 import java.util.Collections;
28 import java.util.List;
29
30 public class ImportChooserStep extends ProjectImportWizardStep {
31   private static final String PREFERRED = "create.project.preferred.importer";
32
33   private final List<? extends ProjectImportProvider> myProviders;
34   private final StepSequence mySequence;
35   @Nullable
36   private ProjectImportProvider myFromSourcesProvider;
37   private JBList myList;
38   private JPanel myPanel;
39
40   private JBRadioButton myCreateFromSources;
41   private JBRadioButton myImportFrom;
42
43   public ImportChooserStep(final List<? extends ProjectImportProvider> providers, final StepSequence sequence, final WizardContext context) {
44     super(context);
45     myProviders = providers;
46     mySequence = sequence;
47
48     myImportFrom.setText(ProjectBundle.message("project.new.wizard.import.title", context.getPresentationName()));
49     myCreateFromSources.setText(ProjectBundle.message("project.new.wizard.from.existent.sources.title", context.getPresentationName()));
50     final DefaultListModel model = new DefaultListModel();
51     for (ProjectImportProvider provider : sorted(providers)) {
52       if (provider instanceof ImportFromSourcesProvider) {
53         myFromSourcesProvider = provider;
54       }
55       else {
56         model.addElement(provider);
57       }
58     }
59     if (myFromSourcesProvider == null) {
60       myCreateFromSources.setVisible(false);
61     }
62     myList.setModel(model);
63     myList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
64     myList.setCellRenderer(new DefaultListCellRenderer() {
65       @Override
66       public Component getListCellRendererComponent(final JList list,
67                                                     final Object value,
68                                                     final int index, final boolean isSelected, final boolean cellHasFocus) {
69         final Component rendererComponent = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
70         setText(((ProjectImportProvider)value).getName());
71         Icon icon = ((ProjectImportProvider)value).getIcon();
72         setIcon(icon);
73         setDisabledIcon(IconLoader.getDisabledIcon(icon));
74         return rendererComponent;
75       }
76     });
77
78     ActionListener actionListener = new ActionListener() {
79       @Override
80       public void actionPerformed(ActionEvent e) {
81         if (myImportFrom.isSelected()) {
82           IdeFocusManager.getInstance(context.getProject()).requestFocus(myList, false);
83         }
84         updateSteps();
85       }
86     };
87     myImportFrom.addActionListener(actionListener);
88     myCreateFromSources.addActionListener(actionListener);
89
90     myList.addListSelectionListener(new ListSelectionListener() {
91       @Override
92       public void valueChanged(final ListSelectionEvent e) {
93         updateSteps();
94       }
95     });
96
97     new DoubleClickListener() {
98       @Override
99       protected boolean onDoubleClick(MouseEvent e) {
100         context.requestNextStep();
101         return true;
102       }
103     }.installOn(myList);
104   }
105
106   @Override
107   public void updateStep() {
108     if (myList.getSelectedValue() != null) return;
109
110     final String id = PropertiesComponent.getInstance().getValue(PREFERRED);
111     if (id == null || myFromSourcesProvider != null && id.equals(myFromSourcesProvider.getId())) {
112       myCreateFromSources.setSelected(true);
113     }
114     else {
115       myImportFrom.setSelected(true);
116       for (ProjectImportProvider provider : myProviders) {
117         if (Comparing.strEqual(provider.getId(), id)) {
118           myList.setSelectedValue(provider, true);
119           break;
120         }
121       }
122     }
123     if (myList.getSelectedValue() == null) {
124       myList.setSelectedIndex(0);
125     }
126   }
127
128   private void updateSteps() {
129     myList.setEnabled(myImportFrom.isSelected());
130     final ProjectImportProvider provider = getSelectedProvider();
131     if (provider != null) {
132       mySequence.setType(provider.getId());
133       PropertiesComponent.getInstance().setValue(PREFERRED, provider.getId());
134       getWizardContext().requestWizardButtonsUpdate();
135     }
136   }
137
138   private static List<ProjectImportProvider> sorted(List<? extends ProjectImportProvider> providers) {
139     List<ProjectImportProvider> result = new ArrayList<>(providers);
140     Collections.sort(result, (l, r) -> l.getName().compareToIgnoreCase(r.getName()));
141     return result;
142   }
143
144   @Override
145   public JComponent getComponent() {
146     return myPanel;
147   }
148
149   @Override
150   public JComponent getPreferredFocusedComponent() {
151     return myCreateFromSources.isSelected() ? myCreateFromSources : myList;
152   }
153
154   @Override
155   public void updateDataModel() {
156     final ProjectImportProvider provider = getSelectedProvider();
157     if (provider != null) {
158       mySequence.setType(provider.getId());
159       final ProjectImportBuilder builder = provider.getBuilder();
160       getWizardContext().setProjectBuilder(builder);
161       builder.setUpdate(getWizardContext().getProject() != null);
162     }
163   }
164
165   private ProjectImportProvider getSelectedProvider() {
166     final ProjectImportProvider provider;
167     if (myCreateFromSources.isSelected()) {
168       provider = myFromSourcesProvider;
169     }
170     else {
171       provider = (ProjectImportProvider)myList.getSelectedValue();
172     }
173     return provider;
174   }
175
176   @Override
177   public String getName() {
178     return "Choose External Model";
179   }
180
181   @Override
182   @NonNls
183   public String getHelpId() {
184     return "reference.dialogs.new.project.import";
185   }
186 }