From 54865eb72cd199680d21d1619a4c3889720f9932 Mon Sep 17 00:00:00 2001 From: "Denis.Zhdanov" Date: Thu, 15 Mar 2012 19:18:16 +0400 Subject: [PATCH] IDEA-76142: Gradle support - cannot update IDEA projects once one of build.gradle files changes Added support for the project changes (name, language level) --- plugins/gradle/src/META-INF/plugin.xml | 1 + .../GradleConflictControlFactory.java | 8 +- .../GradleProjectConflictControlFactory.java | 77 +++++++++++++++++++ .../gradle/ui/MatrixControlBuilder.java | 34 ++++++-- 4 files changed, 110 insertions(+), 10 deletions(-) create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/sync/conflict/GradleProjectConflictControlFactory.java diff --git a/plugins/gradle/src/META-INF/plugin.xml b/plugins/gradle/src/META-INF/plugin.xml index b6a5ec5aa1e0..177380050a79 100644 --- a/plugins/gradle/src/META-INF/plugin.xml +++ b/plugins/gradle/src/META-INF/plugin.xml @@ -61,6 +61,7 @@ + diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/conflict/GradleConflictControlFactory.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/conflict/GradleConflictControlFactory.java index 746d19479961..9399f0eeca0c 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/conflict/GradleConflictControlFactory.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/conflict/GradleConflictControlFactory.java @@ -30,12 +30,15 @@ import java.util.Collection; * @since 3/2/12 3:03 PM */ public class GradleConflictControlFactory { - + + @NotNull private final GradleProjectConflictControlFactory myProjectFactory; @NotNull private final GradleLibraryDependencyConflictControlFactory myLibraryDependencyFactory; @NotNull private final GradleCommonDependencyConflictControlFactory myCommonDependencyFactory; - public GradleConflictControlFactory(@NotNull GradleLibraryDependencyConflictControlFactory libraryFactory, + public GradleConflictControlFactory(@NotNull GradleProjectConflictControlFactory factory, + @NotNull GradleLibraryDependencyConflictControlFactory libraryFactory, @NotNull GradleCommonDependencyConflictControlFactory commonDependencyFactory) { + myProjectFactory = factory; myLibraryDependencyFactory = libraryFactory; myCommonDependencyFactory = commonDependencyFactory; } @@ -54,6 +57,7 @@ public class GradleConflictControlFactory { GradleUtil.dispatch(entity, new IntellijEntityVisitor() { @Override public void visit(@NotNull Project project) { + result.set(myProjectFactory.getControl(changes)); } @Override diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/conflict/GradleProjectConflictControlFactory.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/conflict/GradleProjectConflictControlFactory.java new file mode 100644 index 000000000000..822b27fcec3f --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/conflict/GradleProjectConflictControlFactory.java @@ -0,0 +1,77 @@ +package org.jetbrains.plugins.gradle.sync.conflict; + +import com.intellij.openapi.util.Ref; +import com.intellij.pom.java.LanguageLevel; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.gradle.diff.GradleProjectStructureChange; +import org.jetbrains.plugins.gradle.diff.GradleProjectStructureChangeVisitor; +import org.jetbrains.plugins.gradle.diff.GradleProjectStructureChangeVisitorAdapter; +import org.jetbrains.plugins.gradle.diff.project.GradleLanguageLevelChange; +import org.jetbrains.plugins.gradle.diff.project.GradleProjectRenameChange; +import org.jetbrains.plugins.gradle.ui.MatrixControlBuilder; +import org.jetbrains.plugins.gradle.util.GradleBundle; +import org.jetbrains.plugins.gradle.util.GradleUtil; + +import javax.swing.*; +import java.util.Collection; + +/** + * Thread-safe. + * + * @author Denis Zhdanov + * @since 3/15/12 4:26 PM + */ +public class GradleProjectConflictControlFactory { + + @SuppressWarnings("MethodMayBeStatic") + @Nullable + public JComponent getControl(Collection changes) { + final Ref renameChangeRef = new Ref(); + final Ref languageLevelChangeRef = new Ref(); + + GradleProjectStructureChangeVisitor visitor = new GradleProjectStructureChangeVisitorAdapter() { + @Override + public void visit(@NotNull GradleProjectRenameChange change) { + renameChangeRef.set(change); + } + + @Override + public void visit(@NotNull GradleLanguageLevelChange change) { + languageLevelChangeRef.set(change); + } + }; + + for (GradleProjectStructureChange change : changes) { + if (renameChangeRef.get() != null && languageLevelChangeRef.get() != null) { + break; + } + change.invite(visitor); + } + + final GradleProjectRenameChange renameChange = renameChangeRef.get(); + final GradleLanguageLevelChange languageLevelChange = languageLevelChangeRef.get(); + if (renameChange == null && languageLevelChange == null) { + return null; + } + + MatrixControlBuilder builder = GradleUtil.getConflictChangeBuilder(); + if (renameChange != null) { + builder.addRow(GradleBundle.message("gradle.import.structure.settings.label.name"), + renameChange.getGradleValue(), renameChange.getIntellijValue()); + } + + if (languageLevelChange != null) { + builder.addRow(GradleBundle.message("gradle.import.structure.settings.label.language.level"), + getTextToShow(languageLevelChange.getGradleValue()), getTextToShow(languageLevelChange.getIntellijValue())); + } + + return builder.build(); + } + + @NotNull + private static String getTextToShow(@NotNull LanguageLevel level) { + final String s = level.toString(); + return s.substring(s.indexOf('1')).replace('_', '.'); + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/MatrixControlBuilder.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/MatrixControlBuilder.java index abc73cc47962..b8581a6efa54 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/MatrixControlBuilder.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/ui/MatrixControlBuilder.java @@ -7,6 +7,7 @@ import org.jetbrains.annotations.NotNull; import javax.swing.*; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableColumnModel; import java.awt.*; import java.util.Arrays; @@ -34,27 +35,36 @@ import java.util.Arrays; public class MatrixControlBuilder { private final DefaultTableModel myModel = new DefaultTableModel(); - private final JComponent result; + + private final JBTable myTable; + private final JComponent myResult; + private final int[] myColumnWidths; + private final FontMetrics myFontMetrics; public MatrixControlBuilder(@NotNull String ... columns) { myModel.addColumn(""); // Row name for (String column : columns) { myModel.addColumn(column); } - final JBTable table = new JBTable(myModel) { + myTable = new JBTable(myModel) { @Override public Dimension getPreferredScrollableViewportSize() { return getPreferredSize(); } }; - table.setStriped(true); + myTable.setStriped(true); DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); renderer.setHorizontalAlignment(SwingConstants.CENTER); - for (int i = 1/* don't align row name */, max = table.getColumnCount(); i < max; i++) { - table.getColumnModel().getColumn(i).setCellRenderer(renderer); + for (int i = 1/* don't align row name */, max = myTable.getColumnCount(); i < max; i++) { + myTable.getColumnModel().getColumn(i).setCellRenderer(renderer); + } + myResult = ScrollPaneFactory.createScrollPane(myTable); + + myColumnWidths = new int[columns.length + 1/*'name' column*/]; + myFontMetrics = myTable.getFontMetrics(myTable.getFont()); + for (int i = 0; i < columns.length; i++) { + myColumnWidths[i + 1] = myFontMetrics.stringWidth(columns[i]); } - //table.setDefaultRenderer(String.class, renderer); - result = ScrollPaneFactory.createScrollPane(table); } /** @@ -82,10 +92,18 @@ public class MatrixControlBuilder { rowData[0] = name; System.arraycopy(values, 0, rowData, 1, values.length); myModel.addRow(rowData); + + for (int i = 0; i < rowData.length; i++) { + myColumnWidths[i] = Math.max(myFontMetrics.stringWidth(rowData[i].toString()), myColumnWidths[i]); + } } @NotNull public JComponent build() { - return result; + final TableColumnModel columnModel = myTable.getColumnModel(); + for (int i = 0; i < myColumnWidths.length; i++) { + columnModel.getColumn(i).setMinWidth(myColumnWidths[i] + 4); + } + return myResult; } }