From 756ba0b0986a0153dedae7bb9aab797b8cfb044c Mon Sep 17 00:00:00 2001 From: "Denis.Zhdanov" Date: Mon, 23 Jan 2012 15:13:54 +0400 Subject: [PATCH] IDEA-76142: Gradle support - cannot update IDEA projects once one of build.gradle files changes Providing permanent highlighting for the 'colors and font' preview node that corresponds to the selected setting --- .../resources/i18n/GradleBundle.properties | 11 +- ...GradleColorAndFontDescriptorsProvider.java | 8 +- .../GradleColorAndFontPreviewPanel.java | 141 +++++++++--------- 3 files changed, 79 insertions(+), 81 deletions(-) diff --git a/plugins/gradle/resources/i18n/GradleBundle.properties b/plugins/gradle/resources/i18n/GradleBundle.properties index d0a8f4b5371f..dbc42635886a 100644 --- a/plugins/gradle/resources/i18n/GradleBundle.properties +++ b/plugins/gradle/resources/i18n/GradleBundle.properties @@ -67,9 +67,8 @@ gradle.toolwindow.text.no.linked.project=\nThere is no linked Gradle project\nYo gradle.action.link.project.text=Link gradle project gradle.action.link.project.description=Allows to link any gradle project to the current IDE project -gradle.settings.color.text.sample.project.name=my-project -gradle.settings.color.text.sample.conflict.module.name=module-with-conflicting-setup -gradle.settings.color.text.sample.library.sync.name=library-with-same-setup -gradle.settings.color.text.sample.library.gradle.name=library-added-at-Gradle -gradle.settings.color.text.sample.library.intellij.name=library-added-at-{0} -gradle.settings.color.text.sample.library.confirmed.name=library-with-different-but-confirmed-setup +gradle.settings.color.text.sample.conflict.node.name=node-with-conflicting-setup +gradle.settings.color.text.sample.node.sync.name=node-with-same-setup +gradle.settings.color.text.sample.node.gradle.name=node-added-at-Gradle +gradle.settings.color.text.sample.node.intellij.name=node-added-at-{0} +gradle.settings.color.text.sample.node.confirmed.name=node-with-different-but-confirmed-setup 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 c3316cfcf574..1abe35a93e91 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleColorAndFontDescriptorsProvider.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleColorAndFontDescriptorsProvider.java @@ -30,6 +30,10 @@ public class GradleColorAndFontDescriptorsProvider implements ColorAndFontDescri GradleBundle.message("gradle.sync.change.type.conflict"), GradleTextAttributes.GRADLE_CHANGE_CONFLICT ), + new AttributesDescriptor( + GradleBundle.message("gradle.sync.change.type.confirmed"), + GradleTextAttributes.GRADLE_CONFIRMED_CONFLICT + ), new AttributesDescriptor( GradleBundle.message("gradle.sync.change.type.gradle"), GradleTextAttributes.GRADLE_LOCAL_CHANGE @@ -38,10 +42,6 @@ public class GradleColorAndFontDescriptorsProvider implements ColorAndFontDescri GradleBundle.message("gradle.sync.change.type.intellij", ApplicationNamesInfo.getInstance().getProductName()), GradleTextAttributes.GRADLE_INTELLIJ_LOCAL_CHANGE ), - new AttributesDescriptor( - GradleBundle.message("gradle.sync.change.type.confirmed"), - GradleTextAttributes.GRADLE_CONFIRMED_CONFLICT - ), new AttributesDescriptor( GradleBundle.message("gradle.sync.change.type.unchanged"), GradleTextAttributes.GRADLE_NO_CHANGE diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleColorAndFontPreviewPanel.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleColorAndFontPreviewPanel.java index d755bf0c07e2..146072d86a5a 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleColorAndFontPreviewPanel.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleColorAndFontPreviewPanel.java @@ -13,7 +13,6 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Ref; import com.intellij.ui.treeStructure.Tree; import com.intellij.util.containers.hash.HashMap; -import org.jdesktop.swingx.JXPanel; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.ui.GradleIcons; @@ -25,8 +24,6 @@ import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.*; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.List; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; @@ -37,24 +34,19 @@ import java.util.concurrent.CopyOnWriteArrayList; */ public class GradleColorAndFontPreviewPanel implements PreviewPanel { - private static final int SELECTED_NODE_REFRESH_INTERVAL_MILLIS = 100; - private static final float BLINK_ALPHA_INCREMENT = 0.1f; - private final Map myNodes = new HashMap(); - - private final List myListeners = new CopyOnWriteArrayList(); - private final JPanel myContent = new JPanel(new GridBagLayout()); - private final JXPanel myNodeRenderPanel = new JXPanel(new BorderLayout()); - private final Ref myAllowTreeExpansion = new Ref(true); + + private final List myListeners = new CopyOnWriteArrayList(); + private final JPanel myContent = new JPanel(new GridBagLayout()); + private final JPanel myNodeRenderPanel = new JPanel(new GridBagLayout()); + private final Ref myAllowTreeExpansion = new Ref(true); + private final ArrowPanel mySelectedElementSignPanel = new ArrowPanel(); private final Tree myTree; private final DefaultTreeModel myTreeModel; - private Timer myTimer; private ColorAndFontOptions myOptions; private TreeNode mySelectedNode; - private float mySelectedNodeAlpha; - private boolean mySelectedNodePainted; public GradleColorAndFontPreviewPanel(@NotNull ColorAndFontOptions options) { myOptions = options; @@ -65,35 +57,33 @@ public class GradleColorAndFontPreviewPanel implements PreviewPanel { private Pair init() { myContent.removeAll(); - String projectName = GradleBundle.message("gradle.settings.color.text.sample.project.name"); - DefaultMutableTreeNode root = createNode(projectName, GradleIcons.PROJECT_ICON, null); + String projectName = GradleBundle.message("gradle.settings.color.text.sample.conflict.node.name"); + DefaultMutableTreeNode root = createNode(projectName, GradleIcons.PROJECT_ICON, GradleTextAttributes.GRADLE_CHANGE_CONFLICT); - String moduleName = GradleBundle.message("gradle.settings.color.text.sample.conflict.module.name"); - DefaultMutableTreeNode module = createNode(moduleName, GradleIcons.MODULE_ICON, GradleTextAttributes.GRADLE_CHANGE_CONFLICT); + String moduleName = GradleBundle.message("gradle.settings.color.text.sample.node.confirmed.name"); + DefaultMutableTreeNode module = createNode(moduleName, GradleIcons.MODULE_ICON, GradleTextAttributes.GRADLE_CONFIRMED_CONFLICT); - String gradleLibraryName = GradleBundle.message("gradle.settings.color.text.sample.library.gradle.name"); - DefaultMutableTreeNode gradleLibrary = createNode(gradleLibraryName, GradleIcons.LIB_ICON, GradleTextAttributes.GRADLE_LOCAL_CHANGE); + String gradleLibraryName = GradleBundle.message("gradle.settings.color.text.sample.node.gradle.name"); + DefaultMutableTreeNode gradleLibrary = createNode( + gradleLibraryName, GradleIcons.LIB_ICON, GradleTextAttributes.GRADLE_LOCAL_CHANGE + ); - String intellijLibraryName = GradleBundle.message("gradle.settings.color.text.sample.library.intellij.name", + String intellijLibraryName = GradleBundle.message("gradle.settings.color.text.sample.node.intellij.name", ApplicationNamesInfo.getInstance().getProductName()); DefaultMutableTreeNode intellijLibrary = createNode( intellijLibraryName, GradleIcons.LIB_ICON, GradleTextAttributes.GRADLE_INTELLIJ_LOCAL_CHANGE ); - String confirmedLibraryName = GradleBundle.message("gradle.settings.color.text.sample.library.confirmed.name"); - DefaultMutableTreeNode confirmedLibrary = createNode( - confirmedLibraryName, GradleIcons.LIB_ICON, GradleTextAttributes.GRADLE_CONFIRMED_CONFLICT - ); - - String syncLibraryName = GradleBundle.message("gradle.settings.color.text.sample.library.sync.name"); + String syncLibraryName = GradleBundle.message("gradle.settings.color.text.sample.node.sync.name"); DefaultMutableTreeNode syncLibrary = createNode(syncLibraryName, GradleIcons.LIB_ICON, GradleTextAttributes.GRADLE_NO_CHANGE); module.add(gradleLibrary); module.add(intellijLibrary); - module.add(confirmedLibrary); module.add(syncLibrary); root.add(module); + mySelectedNode = root; + DefaultTreeModel treeModel = new DefaultTreeModel(root); Tree tree = buildTree(treeModel, module); @@ -140,6 +130,7 @@ public class GradleColorAndFontPreviewPanel implements PreviewPanel { final Object component = path.getLastPathComponent(); for (Map.Entry entry : myNodes.entrySet()) { if (entry.getValue().equals(component)) { + pointTo(entry.getValue()); for (ColorAndFontSettingsListener listener : myListeners) { listener.selectionInPreviewChanged(entry.getKey().getExternalName()); clearSelection(); @@ -171,7 +162,6 @@ public class GradleColorAndFontPreviewPanel implements PreviewPanel { } }; myNodeRenderPanel.setBackground(tree.getBackground()); - myNodeRenderPanel.setPaintBorderInsets(false); tree.setCellRenderer(new TreeCellRenderer() { @Override public Component getTreeCellRendererComponent(JTree tree, @@ -183,15 +173,14 @@ public class GradleColorAndFontPreviewPanel implements PreviewPanel { boolean hasFocus) { final Component component = delegate.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); - myNodeRenderPanel.removeAll(); - myNodeRenderPanel.add(component); - if (value == mySelectedNode) { - myNodeRenderPanel.setAlpha(roundAlpha(mySelectedNodeAlpha)); - mySelectedNodePainted = true; - } - else { - myNodeRenderPanel.setAlpha(roundAlpha(1.1f - mySelectedNodeAlpha)); + if (myNodeRenderPanel.getComponentCount() <= 0) { + GridBagConstraints constraints = new GridBagConstraints(); + myNodeRenderPanel.add(component, constraints); + constraints.weightx = 1; + myNodeRenderPanel.add(mySelectedElementSignPanel, constraints); } + + mySelectedElementSignPanel.setPaint(value == mySelectedNode); return myNodeRenderPanel; } }); @@ -206,36 +195,22 @@ public class GradleColorAndFontPreviewPanel implements PreviewPanel { final String type = ((EditorSchemeAttributeDescriptor)selected).getType(); for (Map.Entry entry : myNodes.entrySet()) { if (entry.getKey().getExternalName().equals(type)) { - blink(entry.getValue()); + pointTo(entry.getValue()); return; } } } - private void blink(@NotNull TreeNode node) { - if (myTimer != null) { - myTimer.stop(); - } + /** + * Instructs the panel to show given node as selected. + * + * @param node node to show as 'selected' + */ + private void pointTo(@NotNull TreeNode node) { + TreeNode oldSelectedNode = mySelectedNode; mySelectedNode = node; - mySelectedNodeAlpha = 0.5f; - myTimer = new Timer(SELECTED_NODE_REFRESH_INTERVAL_MILLIS, new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (mySelectedNodeAlpha > 1) { - mySelectedNodeAlpha = 1; - myTimer.stop(); - repaintTree(); - return; - } - if (!mySelectedNodePainted) { - return; - } - mySelectedNodePainted = false; - mySelectedNodeAlpha += BLINK_ALPHA_INCREMENT; - repaintTree(); - } - }); - myTimer.start(); + myTreeModel.nodeChanged(oldSelectedNode); + myTreeModel.nodeChanged(mySelectedNode); } @Override @@ -257,7 +232,6 @@ public class GradleColorAndFontPreviewPanel implements PreviewPanel { } private void repaintTree() { - // TODO den implement myTreeModel.reload(); myAllowTreeExpansion.set(true); try { @@ -285,16 +259,41 @@ public class GradleColorAndFontPreviewPanel implements PreviewPanel { } return result; } - - private static float roundAlpha(float alpha) { - if (alpha < 0) { - return 0; + + /** + * Encapsulates logic of drawing 'selected element' sign. + */ + private static class ArrowPanel extends JPanel { + + private boolean myPaint; + + ArrowPanel() { + super(new BorderLayout()); + // Reserve enough horizontal space. + add(new JLabel("intellij")); } - else if (alpha > 1) { - return 1; + + public void setPaint(boolean paint) { + myPaint = paint; + } + + @Override + public void paint(Graphics g) { + if (!myPaint) { + return; + } + Graphics2D g2 = (Graphics2D)g; + g.setColor(Color.RED); + RenderingHints renderHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + renderHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + g2.setRenderingHints(renderHints); + + FontMetrics fontMetrics = getFontMetrics(getFont()); + int unit = fontMetrics.charWidth('a'); + int q = unit / 4; + int[] x = {0, unit * 3, unit * 2, unit * 4, unit * 4, unit * 2, unit * 3, 0}; + int[] y = {unit, 0, unit - q, unit - q, unit + q, unit + q, unit * 2, unit}; + g2.fillPolygon(x, y, x.length); } - else { - return alpha; - } } }