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