com.intellij.application.options.editor.JavaAutoImportConfigurable.java Source code

Java tutorial

Introduction

Here is the source code for com.intellij.application.options.editor.JavaAutoImportConfigurable.java

Source

/*
 * Copyright 2000-2009 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.application.options.editor;

import java.awt.BorderLayout;
import java.util.Arrays;
import java.util.regex.Pattern;

import javax.swing.DefaultListModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JToggleButton;

import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
import com.intellij.codeInsight.CodeInsightSettings;
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzerSettings;
import com.intellij.openapi.application.ApplicationBundle;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.roots.ex.ProjectRootManagerEx;
import com.intellij.openapi.ui.InputValidator;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.EmptyRunnable;
import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.ui.AnActionButton;
import com.intellij.ui.AnActionButtonRunnable;
import com.intellij.ui.ListScrollingUtil;
import com.intellij.ui.ToolbarDecorator;
import com.intellij.ui.components.JBList;

/*
 * User: anna
 * Date: 14-Feb-2008
 */
public class JavaAutoImportConfigurable implements Configurable {
    private static final String INSERT_IMPORTS_ALWAYS = ApplicationBundle.message("combobox.insert.imports.all");
    private static final String INSERT_IMPORTS_ASK = ApplicationBundle.message("combobox.insert.imports.ask");
    private static final String INSERT_IMPORTS_NONE = ApplicationBundle.message("combobox.insert.imports.none");

    private JComboBox mySmartPasteCombo;
    private JCheckBox myCbShowImportPopup;
    private JPanel myWholePanel;
    private JCheckBox myCbAddUnambiguousImports;
    private JCheckBox myCbOptimizeImports;
    private JPanel myExcludeFromImportAndCompletionPanel;
    private JBList myExcludePackagesList;
    private DefaultListModel myExcludePackagesModel;
    @NonNls
    private static final Pattern ourPackagePattern = Pattern.compile("(\\w+\\.)*\\w+");

    public JavaAutoImportConfigurable() {
        mySmartPasteCombo.addItem(INSERT_IMPORTS_ALWAYS);
        mySmartPasteCombo.addItem(INSERT_IMPORTS_ASK);
        mySmartPasteCombo.addItem(INSERT_IMPORTS_NONE);

        myExcludePackagesList = new JBList();
        myExcludeFromImportAndCompletionPanel.add(
                ToolbarDecorator.createDecorator(myExcludePackagesList).setAddAction(new AnActionButtonRunnable() {
                    @Override
                    public void run(AnActionButton button) {
                        InputValidator validator = new InputValidator() {

                            @Override
                            public boolean checkInput(String inputString) {
                                return ourPackagePattern.matcher(inputString).matches();
                            }

                            @Override
                            public boolean canClose(String inputString) {
                                return checkInput(inputString);
                            }
                        };
                        String packageName = Messages.showInputDialog(myWholePanel,
                                ApplicationBundle.message("exclude.from.completion.prompt"),
                                ApplicationBundle.message("exclude.from.completion.title"),
                                Messages.getWarningIcon(), "", validator);
                        addExcludePackage(packageName);
                    }
                }).disableUpDownActions().createPanel(), BorderLayout.CENTER);

        myExcludePackagesList.getEmptyText()
                .setText(ApplicationBundle.message("exclude.from.imports.no.exclusions"));
    }

    public void addExcludePackage(String packageName) {
        if (packageName == null) {
            return;
        }
        int index = -Arrays.binarySearch(myExcludePackagesModel.toArray(), packageName) - 1;
        if (index < 0) {
            return;
        }

        myExcludePackagesModel.add(index, packageName);
        myExcludePackagesList.setSelectedValue(packageName, true);
        ListScrollingUtil.ensureIndexIsVisible(myExcludePackagesList, index, 0);
        IdeFocusManager.getGlobalInstance().requestFocus(myExcludePackagesList, false);
    }

    @Override
    public void reset() {
        CodeInsightSettings codeInsightSettings = CodeInsightSettings.getInstance();
        DaemonCodeAnalyzerSettings daemonSettings = DaemonCodeAnalyzerSettings.getInstance();

        switch (codeInsightSettings.ADD_IMPORTS_ON_PASTE) {
        case CodeInsightSettings.YES:
            mySmartPasteCombo.setSelectedItem(INSERT_IMPORTS_ALWAYS);
            break;

        case CodeInsightSettings.NO:
            mySmartPasteCombo.setSelectedItem(INSERT_IMPORTS_NONE);
            break;

        case CodeInsightSettings.ASK:
            mySmartPasteCombo.setSelectedItem(INSERT_IMPORTS_ASK);
            break;
        }

        myCbShowImportPopup.setSelected(daemonSettings.isImportHintEnabled());
        myCbOptimizeImports.setSelected(codeInsightSettings.OPTIMIZE_IMPORTS_ON_THE_FLY);
        myCbAddUnambiguousImports.setSelected(codeInsightSettings.ADD_UNAMBIGIOUS_IMPORTS_ON_THE_FLY);

        myExcludePackagesModel = new DefaultListModel();
        for (String aPackage : codeInsightSettings.EXCLUDED_PACKAGES) {
            myExcludePackagesModel.add(myExcludePackagesModel.size(), aPackage);
        }
        myExcludePackagesList.setModel(myExcludePackagesModel);
    }

    @Override
    public void disposeUIResources() {

    }

    @Override
    public void apply() {
        CodeInsightSettings codeInsightSettings = CodeInsightSettings.getInstance();
        DaemonCodeAnalyzerSettings daemonSettings = DaemonCodeAnalyzerSettings.getInstance();

        codeInsightSettings.ADD_IMPORTS_ON_PASTE = getSmartPasteValue();
        codeInsightSettings.EXCLUDED_PACKAGES = getExcludedPackages();
        daemonSettings.setImportHintEnabled(myCbShowImportPopup.isSelected());
        codeInsightSettings.OPTIMIZE_IMPORTS_ON_THE_FLY = myCbOptimizeImports.isSelected();
        codeInsightSettings.ADD_UNAMBIGIOUS_IMPORTS_ON_THE_FLY = myCbAddUnambiguousImports.isSelected();

        ApplicationManager.getApplication().runWriteAction(new Runnable() {
            @Override
            public void run() {
                for (Project project : ProjectManager.getInstance().getOpenProjects()) {
                    ProjectRootManagerEx.getInstanceEx(project).makeRootsChange(EmptyRunnable.getInstance(), false,
                            true);
                }
            }
        });
    }

    private String[] getExcludedPackages() {
        String[] excludedPackages = new String[myExcludePackagesModel.size()];
        for (int i = 0; i < myExcludePackagesModel.size(); i++) {
            excludedPackages[i] = (String) myExcludePackagesModel.elementAt(i);
        }
        Arrays.sort(excludedPackages);
        return excludedPackages;
    }

    @Override
    public JComponent createComponent() {
        return myWholePanel;
    }

    @Override
    public boolean isModified() {
        CodeInsightSettings codeInsightSettings = CodeInsightSettings.getInstance();
        DaemonCodeAnalyzerSettings daemonSettings = DaemonCodeAnalyzerSettings.getInstance();

        boolean isModified = isModified(myCbShowImportPopup, daemonSettings.isImportHintEnabled());
        isModified |= isModified(myCbOptimizeImports, codeInsightSettings.OPTIMIZE_IMPORTS_ON_THE_FLY);
        isModified |= isModified(myCbAddUnambiguousImports, codeInsightSettings.ADD_UNAMBIGIOUS_IMPORTS_ON_THE_FLY);

        isModified |= getSmartPasteValue() != codeInsightSettings.ADD_IMPORTS_ON_PASTE;
        isModified |= !Arrays.deepEquals(getExcludedPackages(), codeInsightSettings.EXCLUDED_PACKAGES);

        return isModified;
    }

    private int getSmartPasteValue() {
        Object selectedItem = mySmartPasteCombo.getSelectedItem();
        if (INSERT_IMPORTS_ALWAYS.equals(selectedItem)) {
            return CodeInsightSettings.YES;
        } else if (INSERT_IMPORTS_NONE.equals(selectedItem)) {
            return CodeInsightSettings.NO;
        } else {
            return CodeInsightSettings.ASK;
        }
    }

    private static boolean isModified(JToggleButton checkBox, boolean value) {
        return checkBox.isSelected() != value;
    }

    @Nls
    @Override
    public String getDisplayName() {
        return null;
    }

    @Nullable
    @Override
    public String getHelpTopic() {
        return null;
    }
}