com.intellij.codeInspection.dataFlow.ConditionCheckDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.intellij.codeInspection.dataFlow.ConditionCheckDialog.java

Source

/*
 * Copyright 2000-2013 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.codeInspection.dataFlow;

import com.intellij.codeInsight.*;
import com.intellij.codeInspection.*;
import com.intellij.openapi.project.*;
import com.intellij.openapi.ui.*;
import com.intellij.ui.*;
import com.intellij.ui.components.*;
import org.jetbrains.annotations.*;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;

/**
 * Dialog that appears when user clicks the "Configure IsNull/IsNotNull/True/False Check/Assertion Methods"
 * on the Errors dialog for the Constant Conditions Inspection.  It is divided into 6 parts
 * <ol>
 * <li>Is Null Check MethodsPanel</li>
 * <li>Is Not Null Check MethodsPanel</li>
 * <li>Assert Is Null MethodsPanel</li>
 * <li>Assert Is Not Null MethodsPanel</li>
 * <li>Assert True MethodsPanel</li>
 * <li>Assert False MethodsPanel</li>
 * </ol>
 *
 * @author <a href="mailto:johnnyclark@gmail.com">Johnny Clark</a>
 *         Creation Date: 8/3/12
 */
public class ConditionCheckDialog extends DialogWrapper {
    private final Project myProject;
    private final @NotNull Splitter mainSplitter;
    private final @NotNull MethodsPanel myIsNullCheckMethodPanel;
    private final @NotNull MethodsPanel myIsNotNullCheckMethodPanel;
    private final @NotNull MethodsPanel myAssertIsNullMethodPanel;
    private final @NotNull MethodsPanel myAssertIsNotNullMethodPanel;
    private final @NotNull MethodsPanel myAssertTrueMethodPanel;
    private final @NotNull MethodsPanel myAssertFalseMethodPanel;

    public ConditionCheckDialog(Project project, String mainDialogTitle) {
        super(project, true);
        myProject = project;

        final ConditionCheckManager manager = ConditionCheckManager.getInstance(myProject);
        mainSplitter = new Splitter(true, 0.3f);
        final Splitter topThirdSplitter = new Splitter(false);
        final Splitter bottomTwoThirdsSplitter = new Splitter(true);
        final Splitter isNullIsNotNullCheckMethodSplitter = new Splitter(false);
        final Splitter assertTrueFalseMethodSplitter = new Splitter(false);

        List<ConditionChecker> isNullCheckMethods = new ArrayList<ConditionChecker>(
                manager.getIsNullCheckMethods());
        List<ConditionChecker> isNotNullCheckMethods = new ArrayList<ConditionChecker>(
                manager.getIsNotNullCheckMethods());
        List<ConditionChecker> assertIsNullMethods = new ArrayList<ConditionChecker>(
                manager.getAssertIsNullMethods());
        List<ConditionChecker> assertIsNotNullMethods = new ArrayList<ConditionChecker>(
                manager.getAssertIsNotNullMethods());
        List<ConditionChecker> assertTrueMethods = new ArrayList<ConditionChecker>(manager.getAssertTrueMethods());
        List<ConditionChecker> assertFalseMethods = new ArrayList<ConditionChecker>(
                manager.getAssertFalseMethods());

        myAssertIsNullMethodPanel = new MethodsPanel(assertIsNullMethods,
                ConditionChecker.Type.ASSERT_IS_NULL_METHOD, myProject);
        myAssertIsNotNullMethodPanel = new MethodsPanel(assertIsNotNullMethods,
                ConditionChecker.Type.ASSERT_IS_NOT_NULL_METHOD, myProject);
        myIsNullCheckMethodPanel = new MethodsPanel(isNullCheckMethods, ConditionChecker.Type.IS_NULL_METHOD,
                myProject);
        myIsNotNullCheckMethodPanel = new MethodsPanel(isNotNullCheckMethods,
                ConditionChecker.Type.IS_NOT_NULL_METHOD, myProject);
        myAssertTrueMethodPanel = new MethodsPanel(assertTrueMethods, ConditionChecker.Type.ASSERT_TRUE_METHOD,
                myProject);
        myAssertFalseMethodPanel = new MethodsPanel(assertFalseMethods, ConditionChecker.Type.ASSERT_FALSE_METHOD,
                myProject);

        isNullIsNotNullCheckMethodSplitter.setFirstComponent(myIsNullCheckMethodPanel.getComponent());
        isNullIsNotNullCheckMethodSplitter.setSecondComponent(myIsNotNullCheckMethodPanel.getComponent());
        assertTrueFalseMethodSplitter.setFirstComponent(myAssertTrueMethodPanel.getComponent());
        assertTrueFalseMethodSplitter.setSecondComponent(myAssertFalseMethodPanel.getComponent());

        topThirdSplitter.setFirstComponent(myAssertIsNullMethodPanel.getComponent());
        topThirdSplitter.setSecondComponent(myAssertIsNotNullMethodPanel.getComponent());
        bottomTwoThirdsSplitter.setFirstComponent(isNullIsNotNullCheckMethodSplitter);
        bottomTwoThirdsSplitter.setSecondComponent(assertTrueFalseMethodSplitter);

        mainSplitter.setFirstComponent(topThirdSplitter);
        mainSplitter.setSecondComponent(bottomTwoThirdsSplitter);

        topThirdSplitter.setPreferredSize(new Dimension(600, 150));
        bottomTwoThirdsSplitter.setPreferredSize(new Dimension(600, 300));

        myAssertIsNullMethodPanel.setOtherMethodsPanels(myAssertIsNotNullMethodPanel, myIsNullCheckMethodPanel,
                myIsNotNullCheckMethodPanel, myAssertTrueMethodPanel, myAssertFalseMethodPanel);
        myAssertIsNotNullMethodPanel.setOtherMethodsPanels(myAssertIsNullMethodPanel, myIsNullCheckMethodPanel,
                myIsNotNullCheckMethodPanel, myAssertTrueMethodPanel, myAssertFalseMethodPanel);
        myIsNullCheckMethodPanel.setOtherMethodsPanels(myAssertIsNullMethodPanel, myAssertIsNotNullMethodPanel,
                myIsNotNullCheckMethodPanel, myAssertTrueMethodPanel, myAssertFalseMethodPanel);
        myIsNotNullCheckMethodPanel.setOtherMethodsPanels(myAssertIsNullMethodPanel, myAssertIsNotNullMethodPanel,
                myIsNullCheckMethodPanel, myAssertTrueMethodPanel, myAssertFalseMethodPanel);
        myAssertTrueMethodPanel.setOtherMethodsPanels(myAssertIsNullMethodPanel, myAssertIsNotNullMethodPanel,
                myIsNotNullCheckMethodPanel, myIsNullCheckMethodPanel, myAssertFalseMethodPanel);
        myAssertFalseMethodPanel.setOtherMethodsPanels(myAssertIsNullMethodPanel, myAssertIsNotNullMethodPanel,
                myIsNotNullCheckMethodPanel, myIsNullCheckMethodPanel, myAssertTrueMethodPanel);

        init();
        setTitle(mainDialogTitle);
    }

    @Override
    protected JComponent createCenterPanel() {
        return mainSplitter;
    }

    @Override
    protected void doOKAction() {
        final ConditionCheckManager manager = ConditionCheckManager.getInstance(myProject);
        manager.setIsNotNullCheckMethods(myIsNotNullCheckMethodPanel.getConditionChecker());
        manager.setIsNullCheckMethods(myIsNullCheckMethodPanel.getConditionChecker());
        manager.setAssertIsNotNullMethods(myAssertIsNotNullMethodPanel.getConditionChecker());
        manager.setAssertIsNullMethods(myAssertIsNullMethodPanel.getConditionChecker());
        manager.setAssertTrueMethods(myAssertTrueMethodPanel.getConditionChecker());
        manager.setAssertFalseMethods(myAssertFalseMethodPanel.getConditionChecker());

        super.doOKAction();
    }

    /**
     * Is Null, Is Not Null, Assert True and Assert False Method Panel at the top of the main Dialog.
     */
    class MethodsPanel {
        private final @NotNull JBList myList;
        private final @NotNull JPanel myPanel;
        private final @NotNull Project myProject;
        private Set<MethodsPanel> otherPanels;

        public MethodsPanel(final List<ConditionChecker> checkers, final ConditionChecker.Type type,
                final @NotNull Project myProject) {
            this.myProject = myProject;
            myList = new JBList(new CollectionListModel<ConditionChecker>(checkers));
            myPanel = new JPanel(new BorderLayout());
            myPanel.setBorder(IdeBorderFactory.createTitledBorder(initTitle(type), false, new Insets(10, 0, 0, 0)));
            myPanel.setPreferredSize(new Dimension(400, 150));

            myList.setCellRenderer(new ColoredListCellRenderer() {
                @Override
                protected void customizeCellRenderer(JList list, Object value, int index, boolean selected,
                        boolean hasFocus) {
                    String s = value.toString();
                    if (s.contains("*")) {
                        int indexOfAsterix1 = s.indexOf("*");
                        int indexOfAsterix2 = s.lastIndexOf("*");
                        if (indexOfAsterix1 >= 0 && indexOfAsterix1 < s.length() && indexOfAsterix2 >= 0
                                && indexOfAsterix2 < s.length() && indexOfAsterix1 < indexOfAsterix2) {
                            append(s.substring(0, indexOfAsterix1), SimpleTextAttributes.REGULAR_ATTRIBUTES);
                            append(s.substring(indexOfAsterix1 + 1, indexOfAsterix2),
                                    SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES);
                            append(s.substring(indexOfAsterix2 + 1), SimpleTextAttributes.REGULAR_ATTRIBUTES);
                        } else {
                            append(s, SimpleTextAttributes.REGULAR_ATTRIBUTES);
                        }
                    }
                }
            });

            final ToolbarDecorator toolbarDecorator = ToolbarDecorator.createDecorator(myList)
                    .disableUpDownActions().setAddAction(new AnActionButtonRunnable() {
                        @Override
                        public void run(AnActionButton anActionButton) {
                            chooseMethod(null, type, myList.getModel().getSize());
                        }
                    }).setRemoveAction(new AnActionButtonRunnable() {
                        @Override
                        public void run(AnActionButton anActionButton) {
                            CollectionListModel model = getCollectionListModel();
                            if (myList.getSelectedIndex() >= 0 && myList.getSelectedIndex() < model.getSize()) {
                                model.remove(myList.getSelectedIndex());
                            }
                        }
                    });

            myList.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    if (e.getClickCount() == 2) {
                        int index = myList.locationToIndex(e.getPoint());
                        CollectionListModel<ConditionChecker> model = getCollectionListModel();
                        if (index >= 0 && model.getSize() > index) {
                            chooseMethod(model.getElementAt(index), type, index);
                        }
                    }
                }
            });
            final JPanel panel = toolbarDecorator.createPanel();
            myPanel.add(panel);
            myList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        }

        private String initTitle(@NotNull ConditionChecker.Type type) {
            if (type.equals(ConditionChecker.Type.IS_NULL_METHOD)) {
                return InspectionsBundle.message("configure.checker.option.isNull.method.panel.title");
            } else if (type.equals(ConditionChecker.Type.IS_NOT_NULL_METHOD)) {
                return InspectionsBundle.message("configure.checker.option.isNotNull.method.panel.title");
            } else if (type.equals(ConditionChecker.Type.ASSERT_IS_NULL_METHOD)) {
                return InspectionsBundle.message("configure.checker.option.assert.isNull.method.panel.title");
            } else if (type.equals(ConditionChecker.Type.ASSERT_IS_NOT_NULL_METHOD)) {
                return InspectionsBundle.message("configure.checker.option.assert.isNotNull.method.panel.title");
            } else if (type.equals(ConditionChecker.Type.ASSERT_TRUE_METHOD)) {
                return InspectionsBundle.message("configure.checker.option.assert.true.method.panel.title");
            } else if (type.equals(ConditionChecker.Type.ASSERT_FALSE_METHOD)) {
                return InspectionsBundle.message("configure.checker.option.assert.false.method.panel.title");
            } else {
                throw new IllegalArgumentException("MethodCheckerDetailsDialog does not support type " + type);
            }
        }

        private void chooseMethod(@Nullable ConditionChecker checker, ConditionChecker.Type type, int index) {
            MethodCheckerDetailsDialog pickMethodPanel = new MethodCheckerDetailsDialog(checker, type, myProject,
                    myPanel, getConditionCheckers(), getOtherCheckers());
            pickMethodPanel.show();
            ConditionChecker chk = pickMethodPanel.getConditionChecker();
            if (chk != null) {
                CollectionListModel<ConditionChecker> model = getCollectionListModel();
                if (model.getSize() <= index) {
                    model.add(chk);
                } else {
                    model.setElementAt(chk, index);
                }
            }
        }

        private CollectionListModel<ConditionChecker> getCollectionListModel() {
            //noinspection unchecked
            return (CollectionListModel<ConditionChecker>) myList.getModel();
        }

        @NotNull
        public JPanel getComponent() {
            return myPanel;
        }

        public List<ConditionChecker> getConditionChecker() {
            CollectionListModel<ConditionChecker> model = getCollectionListModel();
            return new ArrayList<ConditionChecker>(model.getItems());
        }

        public Set<ConditionChecker> getConditionCheckers() {
            Set<ConditionChecker> set = new HashSet<ConditionChecker>();
            set.addAll(getConditionChecker());
            return set;
        }

        public void setOtherMethodsPanels(MethodsPanel p1, MethodsPanel p2, MethodsPanel p3, MethodsPanel p4,
                MethodsPanel p5) {
            otherPanels = new HashSet<MethodsPanel>();
            otherPanels.add(p1);
            otherPanels.add(p2);
            otherPanels.add(p3);
            otherPanels.add(p4);
            otherPanels.add(p5);
        }

        public Set<ConditionChecker> getOtherCheckers() {
            Set<ConditionChecker> otherCheckers = new HashSet<ConditionChecker>();
            for (MethodsPanel otherPanel : otherPanels) {
                otherCheckers.addAll(otherPanel.getConditionCheckers());
            }
            return otherCheckers;
        }
    }
}