IDEA-76142: Gradle support - cannot update IDEA projects once one of build.gradle files changes

Added 'filters' toolbar
This commit is contained in:
Denis.Zhdanov
2012-03-11 10:42:37 +04:00
parent efd7e800e7
commit ac5b3b51bc
12 changed files with 210 additions and 34 deletions
@@ -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}''
+14 -2
View File
@@ -100,16 +100,28 @@
<action id="Gradle.LinkToProject" class="org.jetbrains.plugins.gradle.action.GradleLinkToProjectAction" icon="/general/add.png"/>
<action id="Gradle.RefreshProject" class="org.jetbrains.plugins.gradle.action.GradleRefreshProjectAction" icon="/actions/sync.png"/>
<action id="Gradle.OpenScript" class="org.jetbrains.plugins.gradle.action.GradleOpenScriptAction" icon="/icons/gradleNavigate.png"/>
<action id="Gradle.ImportEntity" class="org.jetbrains.plugins.gradle.action.GradleImportEntityAction" icon="/icons/gradleImport.png"/>
<action id="Gradle.ShowConflict" class="org.jetbrains.plugins.gradle.action.GradleShowConflictDetailsAction" icon="/actions/diff.png"/>
<group id="Gradle.ChangeActionsToolbar">
<reference id="Gradle.RefreshProject"/>
<reference id="Gradle.OpenScript"/>
</group>
<action id="Gradle.ImportEntity" class="org.jetbrains.plugins.gradle.action.GradleImportEntityAction" icon="/icons/gradleImport.png"/>
<action id="Gradle.ShowConflict" class="org.jetbrains.plugins.gradle.action.GradleShowConflictDetailsAction" icon="/actions/diff.png"/>
<group id="Gradle.SyncTreeGroup">
<reference id="Gradle.ImportEntity"/>
<reference id="Gradle.ShowConflict"/>
</group>
<action id="Gradle.SyncTreeFilter.GradleLocal" class="org.jetbrains.plugins.gradle.action.GradleLocalSyncTreeFilterAction"/>
<action id="Gradle.SyncTreeFilter.IntellijLocal" class="org.jetbrains.plugins.gradle.action.IntellijLocalSyncTreeFilterAction"/>
<action id="Gradle.SyncTreeFilter.Conflict" class="org.jetbrains.plugins.gradle.action.GradleConflictSyncTreeFilterAction"/>
<action id="Gradle.SyncTreeFilter.Confirmed" class="org.jetbrains.plugins.gradle.action.GradleConfirmedSyncTreeFilterAction"/>
<group id="Gradle.SyncTreeFilter">
<reference id="Gradle.SyncTreeFilter.GradleLocal"/>
<reference id="Gradle.SyncTreeFilter.IntellijLocal"/>
<reference id="Gradle.SyncTreeFilter.Conflict"/>
<reference id="Gradle.SyncTreeFilter.Confirmed"/>
</group>
</actions>
</idea-plugin>
@@ -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);
}
}
@@ -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);
}
}
@@ -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);
}
}
@@ -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);
}
}
@@ -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);
}
}
@@ -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
@@ -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<JComponent> getToolbarControls() {
return Collections.emptyList();
}
/**
* Asks current control to update its state.
*/
@@ -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<JComponent> myToolbarControls = new ArrayList<JComponent>();
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<JComponent> getToolbarControls() {
return myToolbarControls;
}
@Override
protected void updateContent() {
// TODO den implement
int i = 1;
}
private void setupToolbar() {
@@ -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());
}
}
@@ -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";