blob: 0717d0ca6c0430715ec88243e56c8528a1fd81b1 [file] [log] [blame]
/*
* Copyright 2000-2011 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.ide.util.importProject;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.util.newProjectWizard.StepSequence;
import com.intellij.ide.util.projectWizard.AbstractStepWithProgress;
import com.intellij.ide.util.projectWizard.WizardContext;
import com.intellij.ide.util.projectWizard.importSources.ProjectStructureDetector;
import com.intellij.ide.util.projectWizard.importSources.impl.ProjectFromSourcesBuilderImpl;
import com.intellij.openapi.application.ApplicationNamesInfo;
import com.intellij.openapi.ui.MultiLineLabelUI;
import com.intellij.openapi.ui.ex.MultiLineLabel;
import com.intellij.ui.IdeBorderFactory;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.*;
import java.util.List;
/**
* @author nik
*/
public class RootsDetectionStep extends AbstractStepWithProgress<List<DetectedRootData>> {
private static final String ROOTS_FOUND_CARD = "roots_found";
private static final String ROOTS_NOT_FOUND_CARD = "roots_not_found";
private final ProjectFromSourcesBuilderImpl myBuilder;
private final WizardContext myContext;
private final StepSequence mySequence;
private final Icon myIcon;
private final String myHelpId;
private DetectedRootsChooser myDetectedRootsChooser;
private String myCurrentBaseProjectPath = null;
private JPanel myResultPanel;
public RootsDetectionStep(ProjectFromSourcesBuilderImpl builder,
WizardContext context,
StepSequence sequence,
Icon icon,
@NonNls String helpId) {
super(IdeBundle.message("prompt.stop.searching.for.sources", ApplicationNamesInfo.getInstance().getProductName()));
myBuilder = builder;
myContext = context;
mySequence = sequence;
myIcon = icon;
myHelpId = helpId;
}
protected JComponent createResultsPanel() {
final JPanel panel = new JPanel(new GridBagLayout());
myDetectedRootsChooser = new DetectedRootsChooser();
myDetectedRootsChooser.addSelectionListener(new DetectedRootsChooser.RootSelectionListener() {
@Override
public void selectionChanged() {
updateSelectedTypes();
}
});
final String text = IdeBundle.message("label.project.roots.have.been.found");
final JLabel label = new JLabel(text);
label.setUI(new MultiLineLabelUI());
panel.add(label, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 2, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST,
GridBagConstraints.HORIZONTAL, new Insets(8, 10, 0, 10), 0, 0));
panel.add(myDetectedRootsChooser.getComponent(),
new GridBagConstraints(0, GridBagConstraints.RELATIVE, 2, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
new Insets(8, 10, 8, 10), 0, 0));
final JButton markAllButton = new JButton(IdeBundle.message("button.mark.all"));
panel.add(markAllButton,
new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,
new Insets(0, 10, 8, 2), 0, 0));
final JButton unmarkAllButton = new JButton(IdeBundle.message("button.unmark.all"));
panel.add(unmarkAllButton,
new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,
new Insets(0, 0, 8, 10), 0, 0));
markAllButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
myDetectedRootsChooser.setAllElementsMarked(true);
}
});
unmarkAllButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
myDetectedRootsChooser.setAllElementsMarked(false);
}
});
myResultPanel = new JPanel(new CardLayout());
myResultPanel.add(ROOTS_FOUND_CARD, panel);
JPanel notFoundPanel = new JPanel(new BorderLayout());
notFoundPanel.setBorder(IdeBorderFactory.createEmptyBorder(5));
notFoundPanel.add(BorderLayout.NORTH, new MultiLineLabel(IdeBundle.message("label.project.roots.not.found")));
myResultPanel.add(ROOTS_NOT_FOUND_CARD, notFoundPanel);
return myResultPanel;
}
public JComponent getPreferredFocusedComponent() {
return myDetectedRootsChooser.getComponent();
}
public void updateDataModel() {
final List<DetectedRootData> selectedElements = myDetectedRootsChooser.getMarkedElements();
myBuilder.setupProjectStructure(RootDetectionProcessor.createRootsMap(selectedElements));
updateSelectedTypes();
}
private void updateSelectedTypes() {
Set<String> selectedTypes = new LinkedHashSet<String>();
selectedTypes.add("Existing Sources");
for (DetectedRootData rootData : myDetectedRootsChooser.getMarkedElements()) {
for (ProjectStructureDetector detector : rootData.getSelectedDetectors()) {
selectedTypes.add(detector.getDetectorId());
}
}
mySequence.setTypes(selectedTypes);
myContext.requestWizardButtonsUpdate();
}
protected boolean shouldRunProgress() {
final String baseProjectPath = getBaseProjectPath();
return myCurrentBaseProjectPath == null ? baseProjectPath != null : !myCurrentBaseProjectPath.equals(baseProjectPath);
}
protected void onFinished(final List<DetectedRootData> foundRoots, final boolean canceled) {
final CardLayout layout = (CardLayout)myResultPanel.getLayout();
if (foundRoots.size() > 0 && !canceled) {
myCurrentBaseProjectPath = getBaseProjectPath();
myDetectedRootsChooser.setElements(foundRoots);
updateSelectedTypes();
layout.show(myResultPanel, ROOTS_FOUND_CARD);
}
else {
myCurrentBaseProjectPath = null;
layout.show(myResultPanel, ROOTS_NOT_FOUND_CARD);
}
myResultPanel.revalidate();
}
protected List<DetectedRootData> calculate() {
final String baseProjectPath = getBaseProjectPath();
if (baseProjectPath == null) {
return Collections.emptyList();
}
return RootDetectionProcessor.detectRoots(new File(baseProjectPath));
}
@Nullable
private String getBaseProjectPath() {
return myBuilder.getBaseProjectPath();
}
protected String getProgressText() {
final String root = getBaseProjectPath();
return IdeBundle.message("progress.searching.for.sources", root != null ? root.replace('/', File.separatorChar) : "");
}
public Icon getIcon() {
return myIcon;
}
public String getHelpId() {
return myHelpId;
}
}