From 41a88a4b642b6144b203a1037edc32461e55e847 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Sat, 1 Mar 2014 11:56:28 +0400 Subject: [PATCH] diff: remove code duplication --- .../diff/actions/DiffPanelComboBoxAction.java | 94 +++++++++++++++++++ .../diff/actions/HighlightModeAction.java | 85 +++++------------ .../diff/actions/IgnoreWhiteSpacesAction.java | 72 ++++---------- .../src/messages/DiffBundle.properties | 3 +- 4 files changed, 134 insertions(+), 120 deletions(-) create mode 100644 platform/platform-impl/src/com/intellij/openapi/diff/actions/DiffPanelComboBoxAction.java 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 index 000000000000..b3ef9595782f --- /dev/null +++ b/platform/platform-impl/src/com/intellij/openapi/diff/actions/DiffPanelComboBoxAction.java @@ -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 extends ComboBoxAction implements DumbAware { + @NotNull private final Map myActions = new HashMap(); + @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); + } +} diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/actions/HighlightModeAction.java b/platform/platform-impl/src/com/intellij/openapi/diff/actions/HighlightModeAction.java index 8ae6fa277738..65f5eb346120 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/actions/HighlightModeAction.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/actions/HighlightModeAction.java @@ -15,89 +15,48 @@ */ 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 myActions = new HashMap(); - private static final HighlightMode[] ourActionOrder = - new HighlightMode[]{HighlightMode.BY_WORD, HighlightMode.BY_LINE, HighlightMode.NO_HIGHLIGHTING}; +public class HighlightModeAction extends DiffPanelComboBoxAction { + 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); } } } diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/actions/IgnoreWhiteSpacesAction.java b/platform/platform-impl/src/com/intellij/openapi/diff/actions/IgnoreWhiteSpacesAction.java index 930db0e4f337..a46d8b1516c7 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/actions/IgnoreWhiteSpacesAction.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/actions/IgnoreWhiteSpacesAction.java @@ -15,74 +15,38 @@ */ 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 myActions = new HashMap(); +public class IgnoreWhiteSpacesAction extends DiffPanelComboBoxAction { 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); } } } diff --git a/platform/platform-resources-en/src/messages/DiffBundle.properties b/platform/platform-resources-en/src/messages/DiffBundle.properties index 66a7bab05489..043f6f2231fd 100644 --- a/platform/platform-resources-en/src/messages/DiffBundle.properties +++ b/platform/platform-resources-en/src/messages/DiffBundle.properties @@ -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= +diff.panel.combo.box.action.not.available.action.name= 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= diff.acton.highlight.mode.action.name=Highlighting Mode: -- 2.32.0