Java tutorial
/* * 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; } } }