package org.elixir_lang.mix.importWizard; import com.intellij.ide.util.ElementsChooser; import com.intellij.ide.util.projectWizard.WizardContext; import com.intellij.openapi.options.ConfigurationException; import com.intellij.projectImport.SelectImportedProjectsStep; import org.elixir_lang.icons.ElixirIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.HashSet; import java.util.List; import java.util.Set; /** * Created by zyuyou on 15/7/3. */ final class SelectImportedOtpAppsStep extends SelectImportedProjectsStep<ImportedOtpApp> { private final Set<String> myDuplicateModuleNames = new HashSet<String>(); public SelectImportedOtpAppsStep(@NotNull WizardContext context) { super(context); fileChooser.addElementsMarkListener(new ElementsChooser.ElementsMarkListener<ImportedOtpApp>() { @Override public void elementMarkChanged(ImportedOtpApp element, boolean isMarked) { evalDuplicates(); fileChooser.repaint(); } }); } @Override public void updateStep() { super.updateStep(); evalDuplicates(); } @Override public boolean validate() throws ConfigurationException { return super.validate() && myDuplicateModuleNames.isEmpty(); } @Override protected String getElementText(ImportedOtpApp importedOtpApp) { return importedOtpApp.toString(); } @Nullable @Override protected Icon getElementIcon(ImportedOtpApp importedOtpApp) { return myDuplicateModuleNames.contains(importedOtpApp.getName()) ? ElixirIcons.MIX_MODULE_CONFLICT : null; } /** * for test * */ public void autoResolveConflicts(){ // NOTE: It is assumed that elements are sorted by names, therefore conflicting names a grouped together. String previousAppName = null; for(ImportedOtpApp selectedOtpApp : fileChooser.getMarkedElements()){ if(selectedOtpApp.getName().equals(previousAppName)){ fileChooser.setElementMarked(selectedOtpApp, false); }else{ previousAppName = selectedOtpApp.getName(); } } } private void evalDuplicates(){ List<ImportedOtpApp> selectedOtpApps = fileChooser.getMarkedElements(); Set<String> contains = new HashSet<String>(selectedOtpApps.size()); myDuplicateModuleNames.clear(); for (ImportedOtpApp importedOtpApp:selectedOtpApps){ if(!contains.add(importedOtpApp.getName())){ myDuplicateModuleNames.add(importedOtpApp.getName()); } } } }