com.intellij.codeInsight.NullableNotNullDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.intellij.codeInsight.NullableNotNullDialog.java

Source

/*
 * 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.codeInsight;

import com.intellij.icons.AllIcons;
import com.intellij.ide.util.ClassFilter;
import com.intellij.ide.util.TreeClassChooser;
import com.intellij.ide.util.TreeClassChooserFactory;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Splitter;
import com.intellij.psi.PsiClass;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.ui.*;
import com.intellij.ui.components.JBList;
import com.intellij.util.ui.EmptyIcon;
import org.jetbrains.annotations.NotNull;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

/**
 * User: anna
 * Date: 1/25/11
 */
public class NullableNotNullDialog extends DialogWrapper {
    private final Project myProject;
    private AnnotationsPanel myNullablePanel;
    private AnnotationsPanel myNotNullPanel;

    public NullableNotNullDialog(@NotNull Project project) {
        super(project, true);
        myProject = project;
        init();
        setTitle("Nullable/NotNull configuration");
    }

    @Override
    protected JComponent createCenterPanel() {
        final NullableNotNullManager manager = NullableNotNullManager.getInstance(myProject);
        final Splitter splitter = new Splitter(true);
        myNullablePanel = new AnnotationsPanel("Nullable", manager.getDefaultNullable(), manager.getNullables(),
                NullableNotNullManager.DEFAULT_NULLABLES);
        splitter.setFirstComponent(myNullablePanel.getComponent());
        myNotNullPanel = new AnnotationsPanel("NotNull", manager.getDefaultNotNull(), manager.getNotNulls(),
                NullableNotNullManager.DEFAULT_NOT_NULLS);
        splitter.setSecondComponent(myNotNullPanel.getComponent());
        splitter.setHonorComponentsMinimumSize(true);
        splitter.setPreferredSize(new Dimension(300, 400));
        return splitter;
    }

    @Override
    protected void doOKAction() {
        final NullableNotNullManager manager = NullableNotNullManager.getInstance(myProject);

        manager.setNotNulls(myNotNullPanel.getAnnotations());
        manager.setDefaultNotNull(myNotNullPanel.getDefaultAnnotation());

        manager.setNullables(myNullablePanel.getAnnotations());
        manager.setDefaultNullable(myNullablePanel.getDefaultAnnotation());

        super.doOKAction();
    }

    private class AnnotationsPanel {
        private String myDefaultAnnotation;
        private final Set<String> myDefaultAnnotations;
        private final JBList myList;
        private final JPanel myComponent;

        private AnnotationsPanel(final String name, final String defaultAnnotation,
                final Collection<String> annotations, final String[] defaultAnnotations) {
            myDefaultAnnotation = defaultAnnotation;
            myDefaultAnnotations = new HashSet(Arrays.asList(defaultAnnotations));
            myList = new JBList(annotations);
            myList.setCellRenderer(new ColoredListCellRenderer() {
                @Override
                protected void customizeCellRenderer(JList list, Object value, int index, boolean selected,
                        boolean hasFocus) {
                    append((String) value, SimpleTextAttributes.REGULAR_ATTRIBUTES);
                    if (value.equals(myDefaultAnnotation)) {
                        setIcon(AllIcons.Diff.CurrentLine);
                    } else {
                        setIcon(EmptyIcon.ICON_16);
                    }
                    //if (myDefaultAnnotations.contains(value)) {
                    //  append(" (built in)", SimpleTextAttributes.GRAY_ATTRIBUTES);
                    //}
                }
            });

            final AnActionButton selectButton = new AnActionButton("Select annotation used for code generation",
                    AllIcons.Actions.Checked) {
                @Override
                public void actionPerformed(AnActionEvent e) {
                    final String selectedValue = (String) myList.getSelectedValue();
                    if (selectedValue == null)
                        return;
                    myDefaultAnnotation = selectedValue;
                    final DefaultListModel model = (DefaultListModel) myList.getModel();

                    // to show the new default value in the ui
                    model.setElementAt(myList.getSelectedValue(), myList.getSelectedIndex());
                }

                @Override
                public void updateButton(AnActionEvent e) {
                    final String selectedValue = (String) myList.getSelectedValue();
                    final boolean enabled = selectedValue != null && !selectedValue.equals(myDefaultAnnotation);
                    if (!enabled) {
                        e.getPresentation().setEnabled(enabled);
                    }
                }
            };

            final ToolbarDecorator toolbarDecorator = ToolbarDecorator.createDecorator(myList)
                    .disableUpDownActions().setAddAction(new AnActionButtonRunnable() {
                        @Override
                        public void run(AnActionButton anActionButton) {
                            chooseAnnotation(name, myList);
                        }
                    }).setRemoveAction(new AnActionButtonRunnable() {
                        @Override
                        public void run(AnActionButton anActionButton) {
                            final String selectedValue = (String) myList.getSelectedValue();
                            if (selectedValue == null)
                                return;
                            if (myDefaultAnnotation.equals(selectedValue))
                                myDefaultAnnotation = (String) myList.getModel().getElementAt(0);

                            ((DefaultListModel) myList.getModel()).removeElement(selectedValue);
                        }
                    }).addExtraAction(selectButton);
            final JPanel panel = toolbarDecorator.createPanel();
            myComponent = new JPanel(new BorderLayout());
            myComponent.setBorder(
                    IdeBorderFactory.createTitledBorder(name + " annotations", false, new Insets(10, 0, 0, 0)));
            myComponent.add(panel);
            final AnActionButton removeButton = ToolbarDecorator.findRemoveButton(myComponent);
            myList.addListSelectionListener(new ListSelectionListener() {
                @Override
                public void valueChanged(ListSelectionEvent e) {
                    if (e.getValueIsAdjusting())
                        return;
                    final String selectedValue = (String) myList.getSelectedValue();
                    if (myDefaultAnnotations.contains(selectedValue)) {
                        SwingUtilities.invokeLater(new Runnable() {
                            @Override
                            public void run() {
                                removeButton.setEnabled(false);
                            }
                        });
                    }
                }
            });
            myList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            myList.setSelectedValue(myDefaultAnnotation, true);
        }

        private void chooseAnnotation(String title, JBList list) {
            final TreeClassChooser chooser = TreeClassChooserFactory.getInstance(myProject)
                    .createNoInnerClassesScopeChooser("Choose " + title + " annotation",
                            GlobalSearchScope.allScope(myProject), new ClassFilter() {
                                @Override
                                public boolean isAccepted(PsiClass aClass) {
                                    return aClass.isAnnotationType();
                                }
                            }, null);
            chooser.showDialog();
            final PsiClass selected = chooser.getSelected();
            if (selected == null) {
                return;
            }
            final String qualifiedName = selected.getQualifiedName();
            final DefaultListModel model = (DefaultListModel) list.getModel();
            final int index = model.indexOf(qualifiedName);
            if (index < 0) {
                model.addElement(qualifiedName);
            } else {
                myList.setSelectedIndex(index);
            }
        }

        public JComponent getComponent() {
            return myComponent;
        }

        public String getDefaultAnnotation() {
            return myDefaultAnnotation;
        }

        public String[] getAnnotations() {
            final ListModel model = myList.getModel();
            final int size = model.getSize();
            final String[] result = new String[size];
            for (int i = 0; i < size; i++) {
                result[i] = (String) model.getElementAt(i);
            }
            return result;
        }
    }
}