EditorConfig documentation test
[idea/community.git] / java / java-impl / src / com / intellij / codeInsight / daemon / impl / quickfix / SideEffectWarningDialog.java
1 // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.codeInsight.daemon.impl.quickfix;
3
4 import com.intellij.codeInsight.daemon.QuickFixBundle;
5 import com.intellij.openapi.project.Project;
6 import com.intellij.openapi.ui.DialogWrapper;
7 import com.intellij.openapi.ui.Messages;
8 import com.intellij.openapi.util.SystemInfoRt;
9 import com.intellij.psi.PsiVariable;
10 import com.intellij.ui.components.JBLabel;
11 import com.intellij.util.ui.UIUtil;
12 import org.jetbrains.annotations.NotNull;
13
14 import javax.swing.*;
15 import java.awt.*;
16 import java.awt.event.ActionEvent;
17 import java.text.MessageFormat;
18 import java.util.ArrayList;
19 import java.util.List;
20
21 /**
22  * @author Alexey Kudravtsev
23  */
24 public class SideEffectWarningDialog extends DialogWrapper {
25   private final PsiVariable myVariable;
26   private final String myBeforeText;
27   private final String myAfterText;
28   private final boolean myCanCopeWithSideEffects;
29   private AbstractAction myRemoveAllAction;
30   private AbstractAction myCancelAllAction;
31
32   public SideEffectWarningDialog(Project project, boolean canBeParent, PsiVariable variable, String beforeText, String afterText, boolean canCopeWithSideEffects) {
33     super(project, canBeParent);
34     myVariable = variable;
35     myBeforeText = beforeText;
36     myAfterText = afterText;
37     myCanCopeWithSideEffects = canCopeWithSideEffects;
38     setTitle(QuickFixBundle.message("side.effects.warning.dialog.title"));
39     init();
40
41   }
42
43   @NotNull
44   @Override
45   protected Action[] createActions() {
46     List<AbstractAction> actions = new ArrayList<>();
47     myRemoveAllAction = new AbstractAction() {
48       {
49         UIUtil.setActionNameAndMnemonic(QuickFixBundle.message("side.effect.action.remove"), this);
50         putValue(DEFAULT_ACTION, this);
51       }
52
53       @Override
54       public void actionPerformed(@NotNull ActionEvent e) {
55         close(RemoveUnusedVariableUtil.RemoveMode.DELETE_ALL.ordinal());
56       }
57
58     };
59     actions.add(myRemoveAllAction);
60     if (myCanCopeWithSideEffects) {
61       AbstractAction makeStmtAction = new AbstractAction() {
62         {
63           UIUtil.setActionNameAndMnemonic(QuickFixBundle.message("side.effect.action.transform"), this);
64           if (SystemInfoRt.isMac) {
65             putValue(FOCUSED_ACTION, this);
66           }
67         }
68
69         @Override
70         public void actionPerformed(@NotNull ActionEvent e) {
71           close(RemoveUnusedVariableUtil.RemoveMode.MAKE_STATEMENT.ordinal());
72         }
73       };
74       actions.add(makeStmtAction);
75     }
76     myCancelAllAction = new AbstractAction() {
77       {
78         UIUtil.setActionNameAndMnemonic(QuickFixBundle.message("side.effect.action.cancel"), this);
79       }
80
81       @Override
82       public void actionPerformed(@NotNull ActionEvent e) {
83         doCancelAction();
84       }
85
86     };
87     actions.add(myCancelAllAction);
88     return actions.toArray(new Action[0]);
89   }
90
91   @NotNull
92   @Override
93   protected Action getCancelAction() {
94     return myCancelAllAction;
95   }
96
97   @NotNull
98   @Override
99   protected Action getOKAction() {
100     return myRemoveAllAction;
101   }
102
103   @Override
104   public void doCancelAction() {
105     close(RemoveUnusedVariableUtil.RemoveMode.CANCEL.ordinal());
106   }
107
108   @Override
109   protected JComponent createCenterPanel() {
110     final JPanel panel = new JPanel(new BorderLayout());
111     final String text = sideEffectsDescription();
112     final JLabel label = new JBLabel(text);
113     label.setIcon(Messages.getWarningIcon());
114     panel.add(label, BorderLayout.NORTH);
115     return panel;
116   }
117
118   protected String getFormatString() {
119     return "<html>\n" +
120            "<body>\n" +
121            "There are possible side effects found in {0}<br>\n" +
122            "You can:\n" +
123            "<br>\n" +
124            "-&nbsp;<b>Remove</b> variable usages along with all expressions involved, or<br>\n" +
125            "-&nbsp;<b>Transform</b> expressions assigned to variable into the statements on their own.<br>\n" +
126            "<div style=\"padding-left: 0.6cm;\">\n" +
127            "  That is,<br>\n" +
128            "  <table border=\"0\">\n" +
129            "    <tr>\n" +
130            "      <td><code>{1};</code></td>\n" +
131            "    </tr>\n" +
132            "  </table>\n" +
133            "  becomes: <br>\n" +
134            "  <table border=\"0\">\n" +
135            "    <tr>\n" +
136            "      <td><code>{2};</code></td>\n" +
137            "    </tr>\n" +
138            "  </table>\n" +
139            "</div>\n" +
140            "</body>\n" +
141            "</html>";
142   }
143
144   protected String sideEffectsDescription() {
145     if (myCanCopeWithSideEffects) {
146       return MessageFormat.format(getFormatString(),
147                                   "expressions assigned to the variable '" + myVariable.getName() + "'",
148                                   myVariable.getType().getPresentableText() + " " + myVariable.getName() + " = " + myBeforeText,
149                                   myAfterText);
150     }
151     else {
152       return QuickFixBundle.message("side.effect.message1", myVariable.getName());
153     }
154   }
155 }