diff: remove code duplication idea/134.1375
authorAleksey Pivovarov <Aleksey.Pivovarov@jetbrains.com>
Sat, 1 Mar 2014 07:56:28 +0000 (11:56 +0400)
committerAleksey Pivovarov <Aleksey.Pivovarov@jetbrains.com>
Sat, 1 Mar 2014 07:56:28 +0000 (11:56 +0400)
platform/platform-impl/src/com/intellij/openapi/diff/actions/DiffPanelComboBoxAction.java [new file with mode: 0644]
platform/platform-impl/src/com/intellij/openapi/diff/actions/HighlightModeAction.java
platform/platform-impl/src/com/intellij/openapi/diff/actions/IgnoreWhiteSpacesAction.java
platform/platform-resources-en/src/messages/DiffBundle.properties

diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/actions/DiffPanelComboBoxAction.java b/platform/platform-impl/src/com/intellij/openapi/diff/actions/DiffPanelComboBoxAction.java
new file mode 100644 (file)
index 0000000..b3ef959
--- /dev/null
@@ -0,0 +1,94 @@
+package com.intellij.openapi.diff.actions;
+
+import com.intellij.openapi.actionSystem.*;
+import com.intellij.openapi.actionSystem.ex.ComboBoxAction;
+import com.intellij.openapi.diff.DiffBundle;
+import com.intellij.openapi.diff.ex.DiffPanelEx;
+import com.intellij.openapi.diff.impl.DiffPanelImpl;
+import com.intellij.openapi.project.DumbAware;
+import com.intellij.openapi.project.DumbAwareAction;
+import com.intellij.util.containers.HashMap;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.Map;
+
+public abstract class DiffPanelComboBoxAction<T> extends ComboBoxAction implements DumbAware {
+  @NotNull private final Map<T, AnAction> myActions = new HashMap<T, AnAction>();
+  @NotNull private final T[] myActionOrder;
+
+  protected DiffPanelComboBoxAction(@NotNull T[] actionOrder) {
+    myActionOrder = actionOrder;
+  }
+
+  @NotNull
+  protected abstract String getActionName();
+
+  @NotNull
+  protected abstract T getCurrentOption(@NotNull DiffPanelEx diffPanel);
+
+  @Nullable
+  private static DiffPanelEx getDiffPanel(@NotNull DataContext context) {
+    return DiffPanelImpl.fromDataContext(context);
+  }
+
+  protected void addAction(T key, @NotNull AnAction action) {
+    myActions.put(key, action);
+  }
+
+  @Override
+  public JComponent createCustomComponent(final Presentation presentation) {
+    JPanel panel = new JPanel(new BorderLayout());
+    final JLabel label = new JLabel(getActionName());
+    label.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4));
+    panel.add(label, BorderLayout.WEST);
+    panel.add(super.createCustomComponent(presentation), BorderLayout.CENTER);
+    return panel;
+  }
+
+  @NotNull
+  @Override
+  protected DefaultActionGroup createPopupActionGroup(JComponent button) {
+    DefaultActionGroup actionGroup = new DefaultActionGroup();
+    for (T option : myActionOrder) {
+      actionGroup.add(myActions.get(option));
+    }
+    return actionGroup;
+  }
+
+  @Override
+  public void update(AnActionEvent e) {
+    super.update(e);
+    Presentation presentation = e.getPresentation();
+    DiffPanelEx diffPanel = getDiffPanel(e.getDataContext());
+    if (diffPanel != null && diffPanel.getComponent().isDisplayable()) {
+      AnAction action = myActions.get(getCurrentOption(diffPanel));
+      Presentation templatePresentation = action.getTemplatePresentation();
+      presentation.setIcon(templatePresentation.getIcon());
+      presentation.setText(templatePresentation.getText());
+      presentation.setEnabled(true);
+    }
+    else {
+      presentation.setIcon(null);
+      presentation.setText(DiffBundle.message("diff.panel.combo.box.action.not.available.action.name"));
+      presentation.setEnabled(false);
+    }
+  }
+
+  protected static abstract class DiffPanelAction extends DumbAwareAction {
+    public DiffPanelAction(@NotNull String text) {
+      super(text);
+    }
+
+    public void actionPerformed(AnActionEvent e) {
+      final DiffPanelEx diffPanel = getDiffPanel(e.getDataContext());
+      if (diffPanel != null) {
+        perform(diffPanel);
+      }
+    }
+
+    protected abstract void perform(@NotNull DiffPanelEx diffPanel);
+  }
+}
index 8ae6fa277738ccc0be7246949c3f2d6994c66759..65f5eb346120b9dcb8d11ff6beb4c6ba5146f77b 100644 (file)
  */
 package com.intellij.openapi.diff.actions;
 
-import com.intellij.openapi.actionSystem.AnAction;
-import com.intellij.openapi.actionSystem.AnActionEvent;
-import com.intellij.openapi.actionSystem.DefaultActionGroup;
-import com.intellij.openapi.actionSystem.Presentation;
-import com.intellij.openapi.actionSystem.ex.ComboBoxAction;
 import com.intellij.openapi.diff.DiffBundle;
 import com.intellij.openapi.diff.ex.DiffPanelEx;
-import com.intellij.openapi.diff.impl.DiffPanelImpl;
 import com.intellij.openapi.diff.impl.processing.HighlightMode;
-import com.intellij.openapi.project.DumbAware;
-import com.intellij.openapi.project.DumbAwareAction;
-import com.intellij.util.containers.HashMap;
 import org.jetbrains.annotations.NotNull;
 
-import javax.swing.*;
-import java.awt.*;
-import java.util.Map;
-
-public class HighlightModeAction extends ComboBoxAction implements DumbAware {
-  private final Map<HighlightMode, AnAction> myActions = new HashMap<HighlightMode, AnAction>();
-  private static final HighlightMode[] ourActionOrder =
-    new HighlightMode[]{HighlightMode.BY_WORD, HighlightMode.BY_LINE, HighlightMode.NO_HIGHLIGHTING};
+public class HighlightModeAction extends DiffPanelComboBoxAction<HighlightMode> {
+  private static final HighlightMode[] ourActionOrder = new HighlightMode[]{
+    HighlightMode.BY_WORD,
+    HighlightMode.BY_LINE,
+    HighlightMode.NO_HIGHLIGHTING
+  };
 
   public HighlightModeAction() {
-    myActions.put(HighlightMode.BY_WORD,
-                  new SetHighlightModeAction(DiffBundle.message("diff.acton.highlight.mode.action.by.word"), HighlightMode.BY_WORD));
-    myActions.put(HighlightMode.BY_LINE,
-                  new SetHighlightModeAction(DiffBundle.message("diff.acton.highlight.mode.action.by.line"), HighlightMode.BY_LINE));
-    myActions.put(HighlightMode.NO_HIGHLIGHTING,
-                  new SetHighlightModeAction(DiffBundle.message("diff.acton.highlight.mode.action.no.highlighting"),
-                                             HighlightMode.NO_HIGHLIGHTING));
+    super(ourActionOrder);
+    addAction(HighlightMode.BY_WORD, new HighlightingModeAction(DiffBundle.message("diff.acton.highlight.mode.action.by.word"), HighlightMode.BY_WORD));
+    addAction(HighlightMode.BY_LINE, new HighlightingModeAction(DiffBundle.message("diff.acton.highlight.mode.action.by.line"), HighlightMode.BY_LINE));
+    addAction(HighlightMode.NO_HIGHLIGHTING, new HighlightingModeAction(DiffBundle.message("diff.acton.highlight.mode.action.no.highlighting"), HighlightMode.NO_HIGHLIGHTING));
   }
 
+  @NotNull
   @Override
-  public JComponent createCustomComponent(final Presentation presentation) {
-    JPanel panel = new JPanel(new BorderLayout());
-    final JLabel label = new JLabel(DiffBundle.message("diff.acton.highlight.mode.action.name"));
-    label.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4));
-    panel.add(label, BorderLayout.WEST);
-    panel.add(super.createCustomComponent(presentation), BorderLayout.CENTER);
-    return panel;
+  protected String getActionName() {
+    return DiffBundle.message("diff.acton.highlight.mode.action.name");
   }
 
   @NotNull
-  protected DefaultActionGroup createPopupActionGroup(JComponent button) {
-    DefaultActionGroup actionGroup = new DefaultActionGroup();
-    for (HighlightMode comparisonPolicy : ourActionOrder) {
-      actionGroup.add(myActions.get(comparisonPolicy));
-    }
-    return actionGroup;
-  }
-
-  public void update(AnActionEvent e) {
-    super.update(e);
-    Presentation presentation = e.getPresentation();
-    DiffPanelEx diffPanel = DiffPanelImpl.fromDataContext(e.getDataContext());
-    if (diffPanel != null && diffPanel.getComponent().isDisplayable()) {
-      AnAction action = myActions.get(diffPanel.getHighlightMode());
-      Presentation templatePresentation = action.getTemplatePresentation();
-      presentation.setIcon(templatePresentation.getIcon());
-      presentation.setText(templatePresentation.getText());
-      presentation.setEnabled(true);
-    }
-    else {
-      presentation.setIcon(null);
-      presentation.setText(DiffBundle.message("diff.acton.highlight.mode.not.available.action.name"));
-      presentation.setEnabled(false);
-    }
+  @Override
+  protected HighlightMode getCurrentOption(@NotNull DiffPanelEx diffPanel) {
+    return diffPanel.getHighlightMode();
   }
 
-  private static class SetHighlightModeAction extends DumbAwareAction {
+  private static class HighlightingModeAction extends DiffPanelAction {
     private final HighlightMode myHighlightMode;
 
-    public SetHighlightModeAction(String text, HighlightMode mode) {
+    public HighlightingModeAction(String text, HighlightMode highlightMode) {
       super(text);
-      myHighlightMode = mode;
+      myHighlightMode = highlightMode;
     }
 
-    public void actionPerformed(AnActionEvent e) {
-      final DiffPanelImpl diffPanel = DiffPanelImpl.fromDataContext(e.getDataContext());
-      if (diffPanel != null) {
-        diffPanel.setHighlightMode(myHighlightMode);
-      }
+    @Override
+    protected void perform(@NotNull DiffPanelEx diffPanel) {
+      diffPanel.setHighlightMode(myHighlightMode);
     }
   }
 }
index 930db0e4f3371b14a67c432b77360af3bfe4d64b..a46d8b1516c73c9c882a2817d5b743d84dc850b9 100644 (file)
  */
 package com.intellij.openapi.diff.actions;
 
-import com.intellij.openapi.actionSystem.AnAction;
-import com.intellij.openapi.actionSystem.AnActionEvent;
-import com.intellij.openapi.actionSystem.DefaultActionGroup;
-import com.intellij.openapi.actionSystem.Presentation;
-import com.intellij.openapi.actionSystem.ex.ComboBoxAction;
 import com.intellij.openapi.diff.DiffBundle;
 import com.intellij.openapi.diff.ex.DiffPanelEx;
 import com.intellij.openapi.diff.impl.ComparisonPolicy;
-import com.intellij.openapi.diff.impl.DiffPanelImpl;
-import com.intellij.openapi.project.DumbAware;
-import com.intellij.openapi.project.DumbAwareAction;
-import com.intellij.util.containers.HashMap;
 import org.jetbrains.annotations.NotNull;
 
-import javax.swing.*;
-import java.awt.*;
-import java.util.Map;
-
-public class IgnoreWhiteSpacesAction extends ComboBoxAction implements DumbAware {
-  private final Map<ComparisonPolicy, AnAction> myActions = new HashMap<ComparisonPolicy, AnAction>();
+public class IgnoreWhiteSpacesAction extends DiffPanelComboBoxAction<ComparisonPolicy> {
   private static final ComparisonPolicy[] ourActionOrder = new ComparisonPolicy[]{
     ComparisonPolicy.DEFAULT,
     ComparisonPolicy.TRIM_SPACE,
-    ComparisonPolicy.IGNORE_SPACE};
+    ComparisonPolicy.IGNORE_SPACE
+  };
 
   public IgnoreWhiteSpacesAction() {
-    myActions.put(ComparisonPolicy.DEFAULT, new IgnoringPolicyAction(DiffBundle.message("diff.acton.ignore.whitespace.policy.do.not.ignore"), ComparisonPolicy.DEFAULT));
-    myActions.put(ComparisonPolicy.TRIM_SPACE, new IgnoringPolicyAction(DiffBundle.message("diff.acton.ignore.whitespace.policy.leading.and.trailing"), ComparisonPolicy.TRIM_SPACE));
-    myActions.put(ComparisonPolicy.IGNORE_SPACE, new IgnoringPolicyAction(DiffBundle.message("diff.acton.ignore.whitespace.policy.all"), ComparisonPolicy.IGNORE_SPACE));
+    super(ourActionOrder);
+    addAction(ComparisonPolicy.DEFAULT, new IgnoringPolicyAction(DiffBundle.message("diff.acton.ignore.whitespace.policy.do.not.ignore"), ComparisonPolicy.DEFAULT));
+    addAction(ComparisonPolicy.TRIM_SPACE, new IgnoringPolicyAction(DiffBundle.message("diff.acton.ignore.whitespace.policy.leading.and.trailing"), ComparisonPolicy.TRIM_SPACE));
+    addAction(ComparisonPolicy.IGNORE_SPACE, new IgnoringPolicyAction(DiffBundle.message("diff.acton.ignore.whitespace.policy.all"), ComparisonPolicy.IGNORE_SPACE));
   }
 
+  @NotNull
   @Override
-  public JComponent createCustomComponent(final Presentation presentation) {
-    JPanel panel = new JPanel(new BorderLayout());
-    final JLabel label = new JLabel(DiffBundle.message("ignore.whitespace.acton.name"));
-    label.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4));
-    panel.add(label, BorderLayout.WEST);
-    panel.add(super.createCustomComponent(presentation), BorderLayout.CENTER);
-    return panel;
+  protected String getActionName() {
+    return DiffBundle.message("ignore.whitespace.acton.name");
   }
 
   @NotNull
-  protected DefaultActionGroup createPopupActionGroup(JComponent button) {
-    DefaultActionGroup actionGroup = new DefaultActionGroup();
-    for (ComparisonPolicy comparisonPolicy : ourActionOrder) {
-      actionGroup.add(myActions.get(comparisonPolicy));
-    }
-    return actionGroup;
-  }
-
-  public void update(AnActionEvent e) {
-    super.update(e);
-    Presentation presentation = e.getPresentation();
-    DiffPanelEx diffPanel = DiffPanelImpl.fromDataContext(e.getDataContext());
-    if (diffPanel != null && diffPanel.getComponent().isDisplayable()) {
-      AnAction action = myActions.get(diffPanel.getComparisonPolicy());
-      Presentation templatePresentation = action.getTemplatePresentation();
-      presentation.setIcon(templatePresentation.getIcon());
-      presentation.setText(templatePresentation.getText());
-      presentation.setEnabled(true);
-    } else {
-      presentation.setIcon(null);
-      presentation.setText(DiffBundle.message("ignore.whitespace.action.not.available.action.name"));
-      presentation.setEnabled(false);
-    }
+  @Override
+  protected ComparisonPolicy getCurrentOption(@NotNull DiffPanelEx diffPanel) {
+    return diffPanel.getComparisonPolicy();
   }
 
-  private static class IgnoringPolicyAction extends DumbAwareAction {
+  private static class IgnoringPolicyAction extends DiffPanelAction {
     private final ComparisonPolicy myPolicy;
 
     public IgnoringPolicyAction(String text, ComparisonPolicy policy) {
@@ -90,11 +54,9 @@ public class IgnoreWhiteSpacesAction extends ComboBoxAction implements DumbAware
       myPolicy = policy;
     }
 
-    public void actionPerformed(AnActionEvent e) {
-      final DiffPanelImpl diffPanel = DiffPanelImpl.fromDataContext(e.getDataContext());
-      if (diffPanel != null) {
-        diffPanel.setComparisonPolicy(myPolicy);
-      }
+    @Override
+    protected void perform(@NotNull DiffPanelEx diffPanel) {
+      diffPanel.setComparisonPolicy(myPolicy);
     }
   }
 }
index 66a7bab05489475e359de2d82e1f1be497daf849..043f6f2231fd2f9f34a1aa4b5e21a82c7d512b8f 100644 (file)
@@ -32,7 +32,7 @@ diff.acton.ignore.whitespace.policy.do.not.ignore=Do not ignore
 diff.acton.ignore.whitespace.policy.leading.and.trailing=Leading and trailing
 diff.acton.ignore.whitespace.policy.all=All
 ignore.whitespace.acton.name=Ignore whitespace:
-ignore.whitespace.action.not.available.action.name=<Not available>
+diff.panel.combo.box.action.not.available.action.name=<Not available>
 diff.dialog.select.change.action.name=Select Change
 diff.dialog.select.change.action.description=Select changed text in this version and corresponding in other
 merge.files.dialog.title=Merge
@@ -88,5 +88,4 @@ diff.can.not.show.unknown=Can not show diff for unknown file type
 diff.acton.highlight.mode.action.by.word=By Word
 diff.acton.highlight.mode.action.by.line=By Line
 diff.acton.highlight.mode.action.no.highlighting=No Highlighting
-diff.acton.highlight.mode.not.available.action.name=<Not available>
 diff.acton.highlight.mode.action.name=Highlighting Mode: