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";