diff: move HighlightingMode logic to TextCompareProcessor
[idea/community.git] / platform / platform-impl / src / com / intellij / openapi / diff / actions / HighlightModeAction.java
1 /*
2  * Copyright 2000-2014 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.diff.actions;
17
18 import com.intellij.openapi.actionSystem.AnAction;
19 import com.intellij.openapi.actionSystem.AnActionEvent;
20 import com.intellij.openapi.actionSystem.DefaultActionGroup;
21 import com.intellij.openapi.actionSystem.Presentation;
22 import com.intellij.openapi.actionSystem.ex.ComboBoxAction;
23 import com.intellij.openapi.diff.DiffBundle;
24 import com.intellij.openapi.diff.ex.DiffPanelEx;
25 import com.intellij.openapi.diff.impl.DiffPanelImpl;
26 import com.intellij.openapi.diff.impl.processing.HighlightMode;
27 import com.intellij.openapi.project.DumbAware;
28 import com.intellij.openapi.project.DumbAwareAction;
29 import com.intellij.util.containers.HashMap;
30 import org.jetbrains.annotations.NotNull;
31
32 import javax.swing.*;
33 import java.awt.*;
34 import java.util.Map;
35
36 public class HighlightModeAction extends ComboBoxAction implements DumbAware {
37   private final Map<HighlightMode, AnAction> myActions = new HashMap<HighlightMode, AnAction>();
38   private static final HighlightMode[] ourActionOrder =
39     new HighlightMode[]{HighlightMode.BY_WORD, HighlightMode.BY_LINE, HighlightMode.NO_HIGHLIGHTING};
40
41   public HighlightModeAction() {
42     myActions.put(HighlightMode.BY_WORD,
43                   new SetHighlightModeAction(DiffBundle.message("diff.acton.highlight.mode.action.by.word"), HighlightMode.BY_WORD));
44     myActions.put(HighlightMode.BY_LINE,
45                   new SetHighlightModeAction(DiffBundle.message("diff.acton.highlight.mode.action.by.line"), HighlightMode.BY_LINE));
46     myActions.put(HighlightMode.NO_HIGHLIGHTING,
47                   new SetHighlightModeAction(DiffBundle.message("diff.acton.highlight.mode.action.no.highlighting"),
48                                              HighlightMode.NO_HIGHLIGHTING));
49   }
50
51   @Override
52   public JComponent createCustomComponent(final Presentation presentation) {
53     JPanel panel = new JPanel(new BorderLayout());
54     final JLabel label = new JLabel(DiffBundle.message("diff.acton.highlight.mode.action.name"));
55     label.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4));
56     panel.add(label, BorderLayout.WEST);
57     panel.add(super.createCustomComponent(presentation), BorderLayout.CENTER);
58     return panel;
59   }
60
61   @NotNull
62   protected DefaultActionGroup createPopupActionGroup(JComponent button) {
63     DefaultActionGroup actionGroup = new DefaultActionGroup();
64     for (HighlightMode comparisonPolicy : ourActionOrder) {
65       actionGroup.add(myActions.get(comparisonPolicy));
66     }
67     return actionGroup;
68   }
69
70   public void update(AnActionEvent e) {
71     super.update(e);
72     Presentation presentation = e.getPresentation();
73     DiffPanelEx diffPanel = DiffPanelImpl.fromDataContext(e.getDataContext());
74     if (diffPanel != null && diffPanel.getComponent().isDisplayable()) {
75       AnAction action = myActions.get(diffPanel.getHighlightMode());
76       Presentation templatePresentation = action.getTemplatePresentation();
77       presentation.setIcon(templatePresentation.getIcon());
78       presentation.setText(templatePresentation.getText());
79       presentation.setEnabled(true);
80     }
81     else {
82       presentation.setIcon(null);
83       presentation.setText(DiffBundle.message("diff.acton.highlight.mode.not.available.action.name"));
84       presentation.setEnabled(false);
85     }
86   }
87
88   private static class SetHighlightModeAction extends DumbAwareAction {
89     private final HighlightMode myHighlightMode;
90
91     public SetHighlightModeAction(String text, HighlightMode mode) {
92       super(text);
93       myHighlightMode = mode;
94     }
95
96     public void actionPerformed(AnActionEvent e) {
97       final DiffPanelImpl diffPanel = DiffPanelImpl.fromDataContext(e.getDataContext());
98       if (diffPanel != null) {
99         diffPanel.setHighlightMode(myHighlightMode);
100       }
101     }
102   }
103 }