From ac5b3b51bcf6cd8227a907e3d269eedd52883000 Mon Sep 17 00:00:00 2001 From: "Denis.Zhdanov" Date: Wed, 7 Mar 2012 19:40:25 +0400 Subject: [PATCH] IDEA-76142: Gradle support - cannot update IDEA projects once one of build.gradle files changes Added 'filters' toolbar --- .../resources/i18n/GradleBundle.properties | 1 + plugins/gradle/src/META-INF/plugin.xml | 16 ++++++- .../GradleAbstractSyncTreeFilterAction.java | 40 ++++++++++++++++ .../GradleConfirmedSyncTreeFilterAction.java | 14 ++++++ .../GradleConflictSyncTreeFilterAction.java | 14 ++++++ .../GradleLocalSyncTreeFilterAction.java | 14 ++++++ .../IntellijLocalSyncTreeFilterAction.java | 16 +++++++ ...GradleColorAndFontDescriptorsProvider.java | 48 ++++++++++--------- .../gradle/config/GradleToolWindowPanel.java | 34 +++++++++++-- .../GradleProjectStructureChangesPanel.java | 19 +++++--- .../GradleProjectStructureFiltersPanel.java | 27 +++++++++++ .../plugins/gradle/util/GradleConstants.java | 1 + 12 files changed, 210 insertions(+), 34 deletions(-) create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleAbstractSyncTreeFilterAction.java create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleConfirmedSyncTreeFilterAction.java create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleConflictSyncTreeFilterAction.java create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleLocalSyncTreeFilterAction.java create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/action/IntellijLocalSyncTreeFilterAction.java create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureFiltersPanel.java diff --git a/plugins/gradle/resources/i18n/GradleBundle.properties b/plugins/gradle/resources/i18n/GradleBundle.properties index ac778fa9870e..2fb6c89c3dcf 100644 --- a/plugins/gradle/resources/i18n/GradleBundle.properties +++ b/plugins/gradle/resources/i18n/GradleBundle.properties @@ -29,6 +29,7 @@ gradle.import.structure.settings.label.root.excluded=Excluded roots: gradle.import.structure.settings.label.library.path.binary=Binary paths gradle.import.structure.settings.label.library.path.source=Source paths gradle.import.structure.settings.label.library.path.doc=Doc paths +gradle.import.structure.settings.label.filters=Filters: gradle.import.title.error.resolve.generic=Resolve error gradle.import.text.error.resolve.generic.without.reason=Can''t resolve target gradle project at ''{0}'' diff --git a/plugins/gradle/src/META-INF/plugin.xml b/plugins/gradle/src/META-INF/plugin.xml index 72ac5c04f4c6..e3632268e9b6 100644 --- a/plugins/gradle/src/META-INF/plugin.xml +++ b/plugins/gradle/src/META-INF/plugin.xml @@ -100,16 +100,28 @@ - - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleAbstractSyncTreeFilterAction.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleAbstractSyncTreeFilterAction.java new file mode 100644 index 000000000000..d819627d55c0 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleAbstractSyncTreeFilterAction.java @@ -0,0 +1,40 @@ +package org.jetbrains.plugins.gradle.action; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.ToggleAction; +import com.intellij.openapi.editor.colors.EditorColorsManager; +import com.intellij.openapi.options.colors.AttributesDescriptor; +import com.intellij.util.ui.ColorIcon; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import java.awt.*; + +/** + * @author Denis Zhdanov + * @since 3/7/12 3:48 PM + */ +public abstract class GradleAbstractSyncTreeFilterAction extends ToggleAction { + + @NotNull private final AttributesDescriptor myDescriptor; + + protected GradleAbstractSyncTreeFilterAction(@NotNull AttributesDescriptor descriptor) { + myDescriptor = descriptor; + getTemplatePresentation().setText(descriptor.getDisplayName()); + final Color color = EditorColorsManager.getInstance().getGlobalScheme().getAttributes(descriptor.getKey()).getForegroundColor(); + getTemplatePresentation().setIcon(new ColorIcon(new JLabel("").getFont().getSize(), color)); + } + + @Override + public boolean isSelected(AnActionEvent e) { + // TODO den implement + return false; + } + + @Override + public void setSelected(AnActionEvent e, boolean state) { + // TODO den implement + System.out.println("GradleAbstractSyncTreeFilterAction.setSelected(): " + state); + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleConfirmedSyncTreeFilterAction.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleConfirmedSyncTreeFilterAction.java new file mode 100644 index 000000000000..de21d9c421f8 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleConfirmedSyncTreeFilterAction.java @@ -0,0 +1,14 @@ +package org.jetbrains.plugins.gradle.action; + +import org.jetbrains.plugins.gradle.config.GradleColorAndFontDescriptorsProvider; + +/** + * @author Denis Zhdanov + * @since 3/7/12 6:07 PM + */ +public class GradleConfirmedSyncTreeFilterAction extends GradleAbstractSyncTreeFilterAction { + + public GradleConfirmedSyncTreeFilterAction() { + super(GradleColorAndFontDescriptorsProvider.CONFIRMED); + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleConflictSyncTreeFilterAction.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleConflictSyncTreeFilterAction.java new file mode 100644 index 000000000000..3ef8e0957b20 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleConflictSyncTreeFilterAction.java @@ -0,0 +1,14 @@ +package org.jetbrains.plugins.gradle.action; + +import org.jetbrains.plugins.gradle.config.GradleColorAndFontDescriptorsProvider; + +/** + * @author Denis Zhdanov + * @since 3/7/12 6:08 PM + */ +public class GradleConflictSyncTreeFilterAction extends GradleAbstractSyncTreeFilterAction { + + public GradleConflictSyncTreeFilterAction() { + super(GradleColorAndFontDescriptorsProvider.CONFLICT); + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleLocalSyncTreeFilterAction.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleLocalSyncTreeFilterAction.java new file mode 100644 index 000000000000..f0a59e30c5f4 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleLocalSyncTreeFilterAction.java @@ -0,0 +1,14 @@ +package org.jetbrains.plugins.gradle.action; + +import org.jetbrains.plugins.gradle.config.GradleColorAndFontDescriptorsProvider; + +/** + * @author Denis Zhdanov + * @since 3/7/12 3:54 PM + */ +public class GradleLocalSyncTreeFilterAction extends GradleAbstractSyncTreeFilterAction { + + public GradleLocalSyncTreeFilterAction() { + super(GradleColorAndFontDescriptorsProvider.GRADLE_LOCAL); + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/action/IntellijLocalSyncTreeFilterAction.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/IntellijLocalSyncTreeFilterAction.java new file mode 100644 index 000000000000..46bc43a9d51b --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/IntellijLocalSyncTreeFilterAction.java @@ -0,0 +1,16 @@ +package org.jetbrains.plugins.gradle.action; + +import com.intellij.openapi.options.colors.AttributesDescriptor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.gradle.config.GradleColorAndFontDescriptorsProvider; + +/** + * @author Denis Zhdanov + * @since 3/7/12 3:59 PM + */ +public class IntellijLocalSyncTreeFilterAction extends GradleAbstractSyncTreeFilterAction { + + public IntellijLocalSyncTreeFilterAction() { + super(GradleColorAndFontDescriptorsProvider.INTELLIJ_LOCAL); + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleColorAndFontDescriptorsProvider.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleColorAndFontDescriptorsProvider.java index 458659bac40b..d44ec89eb7f5 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleColorAndFontDescriptorsProvider.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleColorAndFontDescriptorsProvider.java @@ -17,28 +17,32 @@ import org.jetbrains.plugins.gradle.util.GradleBundle; */ public class GradleColorAndFontDescriptorsProvider implements ColorAndFontDescriptorsProvider { - private static final AttributesDescriptor[] DESCRIPTORS = { - new AttributesDescriptor( - GradleBundle.message("gradle.sync.change.type.conflict"), - GradleTextAttributes.CHANGE_CONFLICT - ), - new AttributesDescriptor( - GradleBundle.message("gradle.sync.change.type.confirmed"), - GradleTextAttributes.CONFIRMED_CONFLICT - ), - new AttributesDescriptor( - GradleBundle.message("gradle.sync.change.type.gradle"), - GradleTextAttributes.GRADLE_LOCAL_CHANGE - ), - new AttributesDescriptor( - GradleBundle.message("gradle.sync.change.type.intellij", ApplicationNamesInfo.getInstance().getProductName()), - GradleTextAttributes.INTELLIJ_LOCAL_CHANGE - ), - new AttributesDescriptor( - GradleBundle.message("gradle.sync.change.type.unchanged"), - GradleTextAttributes.NO_CHANGE - ) - }; + public static final AttributesDescriptor CONFLICT = new AttributesDescriptor( + GradleBundle.message("gradle.sync.change.type.conflict"), + GradleTextAttributes.CHANGE_CONFLICT + ); + + public static final AttributesDescriptor CONFIRMED = new AttributesDescriptor( + GradleBundle.message("gradle.sync.change.type.confirmed"), + GradleTextAttributes.CONFIRMED_CONFLICT + ); + + public static final AttributesDescriptor GRADLE_LOCAL = new AttributesDescriptor( + GradleBundle.message("gradle.sync.change.type.gradle"), + GradleTextAttributes.GRADLE_LOCAL_CHANGE + ); + + public static final AttributesDescriptor INTELLIJ_LOCAL = new AttributesDescriptor( + GradleBundle.message("gradle.sync.change.type.intellij", ApplicationNamesInfo.getInstance().getProductName()), + GradleTextAttributes.INTELLIJ_LOCAL_CHANGE + ); + + public static final AttributesDescriptor NO_CHANGE = new AttributesDescriptor( + GradleBundle.message("gradle.sync.change.type.unchanged", ApplicationNamesInfo.getInstance().getProductName()), + GradleTextAttributes.NO_CHANGE + ); + + private static final AttributesDescriptor[] DESCRIPTORS = { CONFLICT, CONFIRMED, GRADLE_LOCAL, INTELLIJ_LOCAL, NO_CHANGE }; @NotNull @Override diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleToolWindowPanel.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleToolWindowPanel.java index 146fa370e035..316376fb5647 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleToolWindowPanel.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleToolWindowPanel.java @@ -5,7 +5,9 @@ import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.ActionToolbar; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.SimpleToolWindowPanel; +import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.ScrollPaneFactory; +import com.intellij.ui.SideBorder; import com.intellij.util.messages.MessageBusConnection; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -14,6 +16,8 @@ import org.jetbrains.plugins.gradle.util.GradleBundle; import javax.swing.*; import java.awt.*; +import java.util.Collections; +import java.util.List; /** * Base class for high-level Gradle GUI controls used at the Gradle tool window. The basic idea is to encapsulate the same features in @@ -42,14 +46,12 @@ public abstract class GradleToolWindowPanel extends SimpleToolWindowPanel { private final JPanel myContent = new JPanel(myLayout); private final Project myProject; + private final String myPlace; protected GradleToolWindowPanel(@NotNull Project project, @NotNull String place) { super(true); myProject = project; - final ActionManager actionManager = ActionManager.getInstance(); - final ActionGroup actionGroup = (ActionGroup)actionManager.getAction(TOOL_WINDOW_TOOLBAR_ID); - ActionToolbar actionToolbar = actionManager.createActionToolbar(place, actionGroup, true); - setToolbar(actionToolbar.getComponent()); + myPlace = place; setContent(myContent); MessageBusConnection connection = project.getMessageBus().connect(project); @@ -62,6 +64,22 @@ public abstract class GradleToolWindowPanel extends SimpleToolWindowPanel { } public void initContent() { + final ActionManager actionManager = ActionManager.getInstance(); + final ActionGroup actionGroup = (ActionGroup)actionManager.getAction(TOOL_WINDOW_TOOLBAR_ID); + ActionToolbar actionToolbar = actionManager.createActionToolbar(myPlace, actionGroup, true); + JPanel toolbarControl = new JPanel(new GridBagLayout()); + GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.weightx = 1; + constraints.fill = GridBagConstraints.HORIZONTAL; + constraints.anchor = GridBagConstraints.WEST; + toolbarControl.add(actionToolbar.getComponent(), constraints); + for (JComponent component : getToolbarControls()) { + component.setBorder(IdeBorderFactory.createBorder(SideBorder.TOP)); + toolbarControl.add(component, constraints); + } + setToolbar(toolbarControl); + final JComponent payloadControl = buildContent(); myContent.add(ScrollPaneFactory.createScrollPane(payloadControl), CONTENT_CARD_NAME); RichTextControlBuilder builder = new RichTextControlBuilder(); @@ -74,6 +92,14 @@ public abstract class GradleToolWindowPanel extends SimpleToolWindowPanel { update(); } + /** + * @return list of UI controls to be displayed vertically at the toolbar + */ + @NotNull + protected List getToolbarControls() { + return Collections.emptyList(); + } + /** * Asks current control to update its state. */ diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java index 994c9fb6f50d..3d72ad01668b 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java @@ -30,7 +30,6 @@ import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import java.awt.*; -import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.util.ArrayList; @@ -46,9 +45,10 @@ import java.util.List; public class GradleProjectStructureChangesPanel extends GradleToolWindowPanel { private static final int TOOLTIP_DELAY_MILLIS = 500; - - private final Alarm myToolbarAppearanceAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD); - private final Alarm myToolbarTrackingAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD); + + private final Alarm myToolbarAppearanceAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD); + private final Alarm myToolbarTrackingAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD); + private final List myToolbarControls = new ArrayList(); private Tree myTree; private GradleProjectStructureTreeModel myTreeModel; @@ -75,6 +75,7 @@ public class GradleProjectStructureChangesPanel extends GradleToolWindowPanel { }); } }); + myToolbarControls.add(new GradleProjectStructureFiltersPanel()); initContent(); } @@ -93,6 +94,8 @@ public class GradleProjectStructureChangesPanel extends GradleToolWindowPanel { applyInitialAppearance(myTree, (DefaultMutableTreeNode)myTreeModel.getRoot()); GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridwidth = GridBagConstraints.REMAINDER; + constraints.anchor = GridBagConstraints.WEST; constraints.fill = GridBagConstraints.BOTH; constraints.weightx = constraints.weighty = 1; result.add(myTree, constraints); @@ -103,10 +106,14 @@ public class GradleProjectStructureChangesPanel extends GradleToolWindowPanel { return result; } + @NotNull + @Override + protected List getToolbarControls() { + return myToolbarControls; + } + @Override protected void updateContent() { - // TODO den implement - int i = 1; } private void setupToolbar() { diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureFiltersPanel.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureFiltersPanel.java new file mode 100644 index 000000000000..9cdf3ba83ca9 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureFiltersPanel.java @@ -0,0 +1,27 @@ +package org.jetbrains.plugins.gradle.sync; + +import com.intellij.openapi.actionSystem.ActionGroup; +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.ActionToolbar; +import org.jetbrains.plugins.gradle.util.GradleBundle; +import org.jetbrains.plugins.gradle.util.GradleConstants; + +import javax.swing.*; + +/** + * @author Denis Zhdanov + * @since 3/6/12 3:44 PM + */ +public class GradleProjectStructureFiltersPanel extends JPanel { + + + public GradleProjectStructureFiltersPanel() { + setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); + add(Box.createHorizontalStrut(7)); + add(new JLabel(GradleBundle.message("gradle.import.structure.settings.label.filters"))); + final ActionManager actionManager = ActionManager.getInstance(); + final ActionGroup group = (ActionGroup)actionManager.getAction("Gradle.SyncTreeFilter"); + final ActionToolbar toolbar = actionManager.createActionToolbar(GradleConstants.SYNC_TREE_FILTER_PLACE, group, true); + add(toolbar.getComponent()); + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleConstants.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleConstants.java index 5b24a6aed7ee..348a4c857903 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleConstants.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleConstants.java @@ -18,6 +18,7 @@ public class GradleConstants { @NonNls public static final String TOOL_WINDOW_TOOLBAR_PLACE = "GRADLE_SYNC_CHANGES_TOOLBAR"; @NonNls public static final String SYNC_TREE_CONTEXT_MENU_PLACE = "GRADLE_SYNC_TREE_CONTEXT_MENU_PLACE"; @NonNls public static final String SYNC_TREE_FLOATING_TOOLBAR_PLACE = "GRADLE_SYNC_TREE_FLOATING_TOOLBAR_PLACE"; + @NonNls public static final String SYNC_TREE_FILTER_PLACE = "GRADLE_SYNC_TREE_FILTER_PLACE"; @NonNls public static final String ACTION_GROUP_SYNC_TREE = "Gradle.SyncTreeGroup";