From 7e0e583aa568b8f33ed903b77cd4d46942523816 Mon Sep 17 00:00:00 2001
From: Kirill Likhodedov
Date: Tue, 21 Feb 2012 12:22:48 +0400
Subject: [PATCH 01/17] [Git] Don't propose to delete remote branch after
merge.
---
.../branch/GitBranchOperationsProcessor.java | 9 ++--
.../git4idea/branch/GitMergeOperation.java | 43 +++++++++++--------
.../ui/branch/GitBranchPopupActions.java | 10 +++--
.../ui/branch/GitCompareBranchesDialog.java | 4 +-
4 files changed, 38 insertions(+), 28 deletions(-)
diff --git a/plugins/git4idea/src/git4idea/branch/GitBranchOperationsProcessor.java b/plugins/git4idea/src/git4idea/branch/GitBranchOperationsProcessor.java
index f2ae9c996918..28136814e980 100644
--- a/plugins/git4idea/src/git4idea/branch/GitBranchOperationsProcessor.java
+++ b/plugins/git4idea/src/git4idea/branch/GitBranchOperationsProcessor.java
@@ -418,20 +418,21 @@ public final class GitBranchOperationsProcessor {
}
}
- public void merge(@NotNull final String branchName) {
+ public void merge(@NotNull final String branchName, final boolean localBranch) {
new CommonBackgroundTask(myProject, "Merging " + branchName, myCallInAwtAfterExecution) {
@Override public void execute(@NotNull ProgressIndicator indicator) {
- doMerge(branchName, indicator);
+ doMerge(branchName, localBranch, indicator);
}
}.runInBackground();
}
- private void doMerge(@NotNull String branchName, @NotNull ProgressIndicator indicator) {
+ private void doMerge(@NotNull String branchName, boolean localBranch, @NotNull ProgressIndicator indicator) {
Map revisions = new HashMap();
for (GitRepository repository : myRepositories) {
revisions.put(repository, repository.getCurrentRevision());
}
- new GitMergeOperation(myProject, myRepositories, branchName, getCurrentBranchOrRev(), mySelectedRepository, revisions, indicator).execute();
+ new GitMergeOperation(myProject, myRepositories, branchName, localBranch, getCurrentBranchOrRev(),
+ mySelectedRepository, revisions, indicator).execute();
}
/**
diff --git a/plugins/git4idea/src/git4idea/branch/GitMergeOperation.java b/plugins/git4idea/src/git4idea/branch/GitMergeOperation.java
index 4c7fd4e27888..08d066516d80 100644
--- a/plugins/git4idea/src/git4idea/branch/GitMergeOperation.java
+++ b/plugins/git4idea/src/git4idea/branch/GitMergeOperation.java
@@ -54,6 +54,7 @@ class GitMergeOperation extends GitBranchOperation {
@NotNull private final ChangeListManager myChangeListManager;
@NotNull private final String myBranchToMerge;
+ private final boolean myLocalBranch;
@NotNull private final String myCurrentBranch;
@NotNull private final GitRepository myCurrentRepository;
@NotNull private final Map myCurrentRevisionsBeforeMerge;
@@ -62,12 +63,13 @@ class GitMergeOperation extends GitBranchOperation {
@NotNull private final Map myConflictedRepositories = new HashMap();
private GitPreservingProcess myPreservingProcess;
- protected GitMergeOperation(@NotNull Project project, @NotNull Collection repositories,
- @NotNull String branchToMerge, @NotNull String currentBranch, @NotNull GitRepository currentRepository,
- @NotNull Map currentRevisionsBeforeMerge,
- @NotNull ProgressIndicator indicator) {
+ GitMergeOperation(@NotNull Project project, @NotNull Collection repositories,
+ @NotNull String branchToMerge, boolean localBranch, @NotNull String currentBranch,
+ @NotNull GitRepository currentRepository, @NotNull Map currentRevisionsBeforeMerge,
+ @NotNull ProgressIndicator indicator) {
super(project, repositories, currentBranch, indicator);
myBranchToMerge = branchToMerge;
+ myLocalBranch = localBranch;
myCurrentBranch = currentBranch;
myCurrentRepository = currentRepository;
myCurrentRevisionsBeforeMerge = currentRevisionsBeforeMerge;
@@ -157,20 +159,14 @@ class GitMergeOperation extends GitBranchOperation {
@Override
protected void notifySuccess(@NotNull String message) {
- String description = message + "
Delete " + myBranchToMerge + "";
- NotificationManager.getInstance(myProject).notify(GitVcs.NOTIFICATION_GROUP_ID, "", description, NotificationType.INFORMATION,
- new NotificationListener() {
- @Override
- public void hyperlinkUpdate(@NotNull Notification notification,
- @NotNull HyperlinkEvent event) {
- if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED &&
- event.getDescription().equalsIgnoreCase("delete")) {
- new GitBranchOperationsProcessor(myProject, new ArrayList(
- getRepositories()), myCurrentRepository).
- deleteBranch(myBranchToMerge);
- }
- }
- });
+ if (!myLocalBranch) {
+ super.notifySuccess(message);
+ }
+ else {
+ String description = message + "
Delete " + myBranchToMerge + "";
+ NotificationManager.getInstance(myProject).notify(GitVcs.NOTIFICATION_GROUP_ID, "", description, NotificationType.INFORMATION,
+ new DeleteMergedLocalBranchNotificationListener());
+ }
}
private boolean resolveConflicts() {
@@ -369,4 +365,15 @@ class GitMergeOperation extends GitBranchOperation {
getResolveLinkListener());
}
}
+
+ private class DeleteMergedLocalBranchNotificationListener implements NotificationListener {
+ @Override
+ public void hyperlinkUpdate(@NotNull Notification notification,
+ @NotNull HyperlinkEvent event) {
+ if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED && event.getDescription().equalsIgnoreCase("delete")) {
+ new GitBranchOperationsProcessor(myProject, new ArrayList(getRepositories()), myCurrentRepository).
+ deleteBranch(myBranchToMerge);
+ }
+ }
+ }
}
diff --git a/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java b/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java
index 692bd47d525d..9e166994336e 100644
--- a/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java
+++ b/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java
@@ -197,7 +197,7 @@ class GitBranchPopupActions {
new CheckoutAction(myProject, myRepositories, myBranchName, mySelectedRepository),
new CheckoutAsNewBranch(myProject, myRepositories, myBranchName, mySelectedRepository),
new CompareAction(myProject, myRepositories, myBranchName, mySelectedRepository),
- new MergeAction(myProject, myRepositories, myBranchName, mySelectedRepository),
+ new MergeAction(myProject, myRepositories, myBranchName, mySelectedRepository, true),
new DeleteAction(myProject, myRepositories, myBranchName, mySelectedRepository)
};
}
@@ -298,7 +298,7 @@ class GitBranchPopupActions {
return new AnAction[] {
new CheckoutRemoteBranchAction(myProject, myRepositories, myBranchName, mySelectedRepository),
new CompareAction(myProject, myRepositories, myBranchName, mySelectedRepository),
- new MergeAction(myProject, myRepositories, myBranchName, mySelectedRepository),
+ new MergeAction(myProject, myRepositories, myBranchName, mySelectedRepository, false),
new RemoteDeleteAction(myProject, myRepositories, myBranchName, mySelectedRepository)
};
}
@@ -387,19 +387,21 @@ class GitBranchPopupActions {
private final List myRepositories;
private final String myBranchName;
private final GitRepository mySelectedRepository;
+ private final boolean myLocalBranch;
public MergeAction(@NotNull Project project, @NotNull List repositories, @NotNull String branchName,
- @NotNull GitRepository selectedRepository) {
+ @NotNull GitRepository selectedRepository, boolean localBranch) {
super("Merge");
myProject = project;
myRepositories = repositories;
myBranchName = branchName;
mySelectedRepository = selectedRepository;
+ myLocalBranch = localBranch;
}
@Override
public void actionPerformed(AnActionEvent e) {
- new GitBranchOperationsProcessor(myProject, myRepositories, mySelectedRepository).merge(myBranchName);
+ new GitBranchOperationsProcessor(myProject, myRepositories, mySelectedRepository).merge(myBranchName, myLocalBranch);
}
}
diff --git a/plugins/git4idea/src/git4idea/ui/branch/GitCompareBranchesDialog.java b/plugins/git4idea/src/git4idea/ui/branch/GitCompareBranchesDialog.java
index c761cc5c72aa..0fc3f95ddcf8 100644
--- a/plugins/git4idea/src/git4idea/ui/branch/GitCompareBranchesDialog.java
+++ b/plugins/git4idea/src/git4idea/ui/branch/GitCompareBranchesDialog.java
@@ -55,8 +55,8 @@ public class GitCompareBranchesDialog extends DialogWrapper {
private GitCommitListPanel myHeadToBranchListPanel;
private GitCommitListPanel myBranchToHeadListPanel;
- public GitCompareBranchesDialog(@NotNull Project project, @NotNull String branchName, @NotNull String currentBranchName, @NotNull GitCommitCompareInfo compareInfo,
- @NotNull GitRepository initialRepo) {
+ public GitCompareBranchesDialog(@NotNull Project project, @NotNull String branchName, @NotNull String currentBranchName,
+ @NotNull GitCommitCompareInfo compareInfo, @NotNull GitRepository initialRepo) {
super(project, false);
myCurrentBranchName = currentBranchName;
myCompareInfo = compareInfo;
From beea9a922faa4824025e0e3ef04b7a2955b5a143 Mon Sep 17 00:00:00 2001
From: "Maxim.Medvedev"
Date: Tue, 21 Feb 2012 14:55:59 +0400
Subject: [PATCH 02/17] autocompletion after foo.& and foo.@
---
.../editor/actions/GroovyTypedHandler.java | 40 ++++++++++++++++++-
1 file changed, 38 insertions(+), 2 deletions(-)
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/actions/GroovyTypedHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/actions/GroovyTypedHandler.java
index 03a2536216e1..e5351d1c6dc2 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/actions/GroovyTypedHandler.java
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/actions/GroovyTypedHandler.java
@@ -15,6 +15,7 @@
*/
package org.jetbrains.plugins.groovy.lang.editor.actions;
+import com.intellij.codeInsight.AutoPopupController;
import com.intellij.codeInsight.CodeInsightSettings;
import com.intellij.codeInsight.editorActions.JavaTypedHandler;
import com.intellij.codeInsight.editorActions.TypedHandlerDelegate;
@@ -23,8 +24,12 @@ import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.editor.highlighter.HighlighterIterator;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.project.Project;
-import com.intellij.psi.*;
+import com.intellij.openapi.util.Condition;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
import com.intellij.psi.tree.TokenSet;
+import com.intellij.psi.util.PsiTreeUtil;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes;
import org.jetbrains.plugins.groovy.lang.psi.GroovyFile;
@@ -50,10 +55,41 @@ public class GroovyTypedHandler extends TypedHandlerDelegate {
}
}
+ if (c == '@' && file instanceof GroovyFile) {
+ autoPopupMemberLookup(project, editor, new Condition() {
+ public boolean value(final PsiFile file) {
+ int offset = editor.getCaretModel().getOffset();
+
+ PsiElement lastElement = file.findElementAt(offset - 1);
+ if (lastElement == null) return false;
+
+ final PsiElement prevSibling = PsiTreeUtil.prevVisibleLeaf(lastElement);
+ return prevSibling != null && ".".equals(prevSibling.getText());
+ }
+ });
+ }
+
+ if (c == '&' && file instanceof GroovyFile) {
+ autoPopupMemberLookup(project, editor, new Condition() {
+ public boolean value(final PsiFile file) {
+ int offset = editor.getCaretModel().getOffset();
+
+ PsiElement lastElement = file.findElementAt(offset - 1);
+ return lastElement != null && ".&".equals(lastElement.getText());
+ }
+ });
+ }
+
+
return Result.CONTINUE;
}
- public Result charTyped(final char c, final Project project, final Editor editor, final PsiFile file) {
+ private static void autoPopupMemberLookup(Project project, final Editor editor, Condition condition) {
+ AutoPopupController.getInstance(project).autoPopupMemberLookup(editor, condition);
+ }
+
+
+ public Result charTyped(final char c, final Project project, final Editor editor, @NotNull final PsiFile file) {
if (myJavaLTTyped) {
myJavaLTTyped = false;
JavaTypedHandler.handleAfterJavaLT(editor, GroovyTokenTypes.mLT, GroovyTokenTypes.mGT, INVALID_INSIDE_REFERENCE);
From 77494dabbc3ec1ed1765a65fd168b5f6fb17248f Mon Sep 17 00:00:00 2001
From: "Maxim.Medvedev"
Date: Tue, 21 Feb 2012 15:33:47 +0400
Subject: [PATCH 03/17] IDEA-81618 IntelliJ 11 Groovy mixin code complete not
available when more than one mixin
---
.../lang/resolve/MixinMemberContributor.java | 33 ++++++++++++-------
.../lang/resolve/ResolveMethodTest.groovy | 32 +++++++++++++++++-
2 files changed, 52 insertions(+), 13 deletions(-)
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/MixinMemberContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/MixinMemberContributor.java
index 2e1d8fd17c47..45c436b49308 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/MixinMemberContributor.java
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/MixinMemberContributor.java
@@ -50,20 +50,19 @@ public class MixinMemberContributor extends NonCodeMembersContributor {
final PsiModifierList modifierList = aClass.getModifierList();
if (modifierList == null) return;
- final PsiAnnotation annotation = modifierList.findAnnotation(GroovyCommonClassNames.GROOVY_LANG_MIXIN);
- if (annotation == null) return;
-
- final PsiAnnotationMemberValue value = annotation.findAttributeValue("value");
-
List mixins = new ArrayList();
- if (value instanceof GrAnnotationArrayInitializer) {
- final GrAnnotationMemberValue[] initializers = ((GrAnnotationArrayInitializer)value).getInitializers();
- for (GrAnnotationMemberValue initializer : initializers) {
- addMixin(initializer, mixins);
+ for (PsiAnnotation annotation : getAllMixins(modifierList)) {
+ final PsiAnnotationMemberValue value = annotation.findAttributeValue("value");
+
+ if (value instanceof GrAnnotationArrayInitializer) {
+ final GrAnnotationMemberValue[] initializers = ((GrAnnotationArrayInitializer)value).getInitializers();
+ for (GrAnnotationMemberValue initializer : initializers) {
+ addMixin(initializer, mixins);
+ }
+ }
+ else if (value instanceof GrExpression) {
+ addMixin((GrExpression)value, mixins);
}
- }
- else if (value instanceof GrExpression) {
- addMixin((GrExpression)value, mixins);
}
for (PsiClass mixin : mixins) {
@@ -83,6 +82,16 @@ public class MixinMemberContributor extends NonCodeMembersContributor {
}
}
+ private static List getAllMixins(PsiModifierList modifierList) {
+ final ArrayList result = new ArrayList();
+ for (PsiAnnotation annotation : modifierList.getApplicableAnnotations()) {
+ if (GroovyCommonClassNames.GROOVY_LANG_MIXIN.equals(annotation.getQualifiedName())) {
+ result.add(annotation);
+ }
+ }
+ return result;
+ }
+
private static boolean isCategoryMethod(PsiElement element, PsiType qualifierType) {
if (!(element instanceof PsiMethod)) return false;
if (!((PsiMethod)element).hasModifierProperty(PsiModifier.STATIC)) return false;
diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy
index 69b237df29b9..1d4650e9c13a 100644
--- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy
+++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy
@@ -789,9 +789,39 @@ print new B().foo()
def resolved = ref.resolve()
assertInstanceOf(resolved, GrMethod)
- assertTrue(resolved.isPhysical())
+ assertTrue(resolved.physical)
}
+ void testTwoMixinsInModifierList() {
+ def ref = configureByText("""
+class PersonHelper {
+ def useThePerson() {
+ Person person = new Person()
+
+ person.getUsername()
+ person.getName()
+ }
+}
+
+@Mixin(PersonMixin)
+@Mixin(OtherPersonMixin)
+class Person { }
+
+class PersonMixin {
+ String getUsername() { }
+}
+
+class OtherPersonMixin {
+ String getName() { }
+}
+""")
+
+ def resolved = ref.resolve()
+ assertInstanceOf(resolved, GrMethod)
+ assertTrue(resolved.physical)
+ }
+
+
void testDisjunctionType() {
def ref = configureByText ("""
import java.sql.SQLException
From 3ff5b7823309f8b40d0247eb13b43f5cac08ef39 Mon Sep 17 00:00:00 2001
From: Sergey Evdokimov
Date: Tue, 21 Feb 2012 15:54:07 +0400
Subject: [PATCH 04/17] IDEA-46477 (Need ability to feed custom properties into
maven archetype when creating a new project)
---
.../execution/EditMavenPropertyDialog.java | 5 +-
.../maven/execution/MavenPropertiesPanel.java | 86 ++++++++++++++
.../execution/MavenRunnerConfigurable.java | 75 ++----------
.../MavenFrameworkSupportProvider.java | 2 +-
.../maven/wizards/MavenModuleBuilder.java | 31 ++++-
.../wizards/MavenModuleBuilderHelper.java | 20 ++--
.../maven/wizards/MavenModuleWizardStep.java | 32 +++++-
.../maven/wizards/SelectPropertiesStep.form | 36 ++++++
.../maven/wizards/SelectPropertiesStep.java | 108 ++++++++++++++++++
9 files changed, 311 insertions(+), 84 deletions(-)
create mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenPropertiesPanel.java
create mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/SelectPropertiesStep.form
create mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/SelectPropertiesStep.java
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/EditMavenPropertyDialog.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/EditMavenPropertyDialog.java
index 9ef8c87e6679..54e62788f208 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/EditMavenPropertyDialog.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/EditMavenPropertyDialog.java
@@ -15,7 +15,6 @@
*/
package org.jetbrains.idea.maven.execution;
-import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.util.Pair;
import com.intellij.util.ArrayUtil;
@@ -34,8 +33,8 @@ public class EditMavenPropertyDialog extends DialogWrapper {
private JTextField myValueField;
private final Map myAvailableProperties;
- public EditMavenPropertyDialog(Project p, Pair value, Map availableProperties) {
- super(p, false);
+ public EditMavenPropertyDialog(Pair value, Map availableProperties) {
+ super(false);
setTitle("Edit Maven Property");
myAvailableProperties = availableProperties;
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenPropertiesPanel.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenPropertiesPanel.java
new file mode 100644
index 000000000000..f5cf8e20184c
--- /dev/null
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenPropertiesPanel.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2000-2012 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jetbrains.idea.maven.execution;
+
+import com.intellij.openapi.util.Pair;
+import com.intellij.ui.AddEditRemovePanel;
+
+import java.awt.*;
+import java.util.*;
+import java.util.List;
+
+/**
+* @author Sergey Evdokimov
+*/
+public class MavenPropertiesPanel extends AddEditRemovePanel> {
+ private Map myAvailableProperties;
+
+ public MavenPropertiesPanel(Map availableProperties) {
+ super(new MyPropertiesTableModel(), new ArrayList>(), null);
+ setPreferredSize(new Dimension(100, 100));
+ myAvailableProperties = availableProperties;
+ }
+
+ protected Pair addItem() {
+ return doAddOrEdit(new Pair("", ""));
+ }
+
+ protected boolean removeItem(Pair o) {
+ return true;
+ }
+
+ protected Pair editItem(Pair o) {
+ return doAddOrEdit(o);
+ }
+
+ private Pair doAddOrEdit(Pair o) {
+ EditMavenPropertyDialog d = new EditMavenPropertyDialog(o, myAvailableProperties);
+ d.show();
+ if (!d.isOK()) return null;
+ return d.getValue();
+ }
+
+ public Map getDataAsMap() {
+ Map result = new LinkedHashMap();
+ for (Pair p : getData()) {
+ result.put(p.getFirst(), p.getSecond());
+ }
+ return result;
+ }
+
+ public void setDataFromMap(Map map) {
+ List> result = new ArrayList>();
+ for (Map.Entry e : map.entrySet()) {
+ result.add(new Pair(e.getKey(), e.getValue()));
+ }
+ setData(result);
+ }
+
+ private static class MyPropertiesTableModel extends AddEditRemovePanel.TableModel> {
+ public int getColumnCount() {
+ return 2;
+ }
+
+ public String getColumnName(int c) {
+ return c == 0 ? "Name" : "Value";
+ }
+
+ public Object getField(Pair o, int c) {
+ return c == 0 ? o.getFirst() : o.getSecond();
+ }
+ }
+
+}
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerConfigurable.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerConfigurable.java
index 085fc93e248c..9179c008b610 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerConfigurable.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerConfigurable.java
@@ -21,8 +21,6 @@ import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.Pair;
-import com.intellij.ui.AddEditRemovePanel;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.RawCommandLineEditor;
import org.jetbrains.annotations.Nls;
@@ -35,8 +33,9 @@ import org.jetbrains.idea.maven.utils.ComboBoxUtil;
import javax.swing.*;
import java.awt.*;
-import java.util.*;
-import java.util.List;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Properties;
public abstract class MavenRunnerConfigurable implements SearchableConfigurable, Configurable.NoScroll {
private final Project myProject;
@@ -47,7 +46,7 @@ public abstract class MavenRunnerConfigurable implements SearchableConfigurable,
private JComboBox myJdkCombo;
private final DefaultComboBoxModel myJdkComboModel = new DefaultComboBoxModel();
private JCheckBox mySkipTestsCheckBox;
- private MyPropertiesPanel myPropertiesPanel;
+ private MavenPropertiesPanel myPropertiesPanel;
private Map myProperties;
@@ -114,7 +113,9 @@ public abstract class MavenRunnerConfigurable implements SearchableConfigurable,
propertiesPanel.add(mySkipTestsCheckBox = new JCheckBox("Skip tests"), BorderLayout.NORTH);
mySkipTestsCheckBox.setMnemonic('t');
- propertiesPanel.add(myPropertiesPanel = new MyPropertiesPanel(), BorderLayout.CENTER);
+
+ collectProperties();
+ propertiesPanel.add(myPropertiesPanel = new MavenPropertiesPanel(myProperties), BorderLayout.CENTER);
myPropertiesPanel.getEmptyText().setText("No properties defined");
c.gridx = 0;
@@ -124,8 +125,6 @@ public abstract class MavenRunnerConfigurable implements SearchableConfigurable,
c.fill = GridBagConstraints.BOTH;
panel.add(propertiesPanel, c);
- collectProperties();
-
return panel;
}
@@ -135,9 +134,7 @@ public abstract class MavenRunnerConfigurable implements SearchableConfigurable,
for (MavenProject each : s.getProjects()) {
Properties properties = each.getProperties();
- for (Map.Entry p : properties.entrySet()) {
- result.put((String)p.getKey(), (String)p.getValue());
- }
+ result.putAll((Map)properties);
}
myProperties = result;
@@ -215,60 +212,4 @@ public abstract class MavenRunnerConfigurable implements SearchableConfigurable,
data.setMavenProperties(myPropertiesPanel.getDataAsMap());
}
-
- private class MyPropertiesPanel extends AddEditRemovePanel> {
- public MyPropertiesPanel() {
- super(new MyPropertiesTableModel(), new ArrayList>(), null);
- setPreferredSize(new Dimension(100, 100));
- }
-
- protected Pair addItem() {
- return doAddOrEdit(new Pair("", ""));
- }
-
- protected boolean removeItem(Pair o) {
- return true;
- }
-
- protected Pair editItem(Pair o) {
- return doAddOrEdit(o);
- }
-
- private Pair doAddOrEdit(Pair o) {
- EditMavenPropertyDialog d = new EditMavenPropertyDialog(myProject, o, myProperties);
- d.show();
- if (!d.isOK()) return null;
- return d.getValue();
- }
-
- public Map getDataAsMap() {
- Map result = new LinkedHashMap();
- for (Pair p : getData()) {
- result.put(p.getFirst(), p.getSecond());
- }
- return result;
- }
-
- public void setDataFromMap(Map map) {
- List> result = new ArrayList>();
- for (Map.Entry e : map.entrySet()) {
- result.add(new Pair(e.getKey(), e.getValue()));
- }
- setData(result);
- }
- }
-
- private static class MyPropertiesTableModel extends AddEditRemovePanel.TableModel> {
- public int getColumnCount() {
- return 2;
- }
-
- public String getColumnName(int c) {
- return c == 0 ? "Name" : "Value";
- }
-
- public Object getField(Pair o, int c) {
- return c == 0 ? o.getFirst() : o.getSecond();
- }
- }
}
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenFrameworkSupportProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenFrameworkSupportProvider.java
index 78c3533f2dff..3b7d2b570a40 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenFrameworkSupportProvider.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenFrameworkSupportProvider.java
@@ -67,7 +67,7 @@ public class MavenFrameworkSupportProvider extends FrameworkSupportProvider {
}
else {
new MavenModuleBuilderHelper(new MavenId("groupId", module.getName(), "1.0-SNAPSHOT"), null, null, false, false, null,
- "Add Maven Support").configure(model.getProject(), root, true);
+ null, "Add Maven Support").configure(model.getProject(), root, true);
}
}
};
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilder.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilder.java
index 0d7273eac2ae..1fcd564002be 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilder.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilder.java
@@ -33,6 +33,7 @@ import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.idea.maven.model.MavenArchetype;
import org.jetbrains.idea.maven.model.MavenId;
+import org.jetbrains.idea.maven.project.MavenEnvironmentForm;
import org.jetbrains.idea.maven.project.MavenProject;
import org.jetbrains.idea.maven.project.MavenProjectsManager;
import org.jetbrains.idea.maven.utils.MavenUtil;
@@ -41,6 +42,7 @@ import javax.swing.*;
import java.io.File;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
public class MavenModuleBuilder extends ModuleBuilder implements SourcePathsBuilder {
private static final Icon BIG_ICON = IconLoader.getIcon("/modules/javaModule.png");
@@ -54,6 +56,10 @@ public class MavenModuleBuilder extends ModuleBuilder implements SourcePathsBuil
private MavenId myProjectId;
private MavenArchetype myArchetype;
+ private MavenEnvironmentForm myEnvironmentForm;
+
+ private Map myPropertiesToCreateByArtifact;
+
public void setupRootModel(ModifiableRootModel rootModel) throws ConfigurationException {
final Project project = rootModel.getProject();
@@ -64,8 +70,12 @@ public class MavenModuleBuilder extends ModuleBuilder implements SourcePathsBuil
MavenUtil.runWhenInitialized(project, new DumbAwareRunnable() {
public void run() {
+ if (myEnvironmentForm != null) {
+ myEnvironmentForm.setData(MavenProjectsManager.getInstance(project).getGeneralSettings());
+ }
+
new MavenModuleBuilderHelper(myProjectId, myAggregatorProject, myParentProject, myInheritGroupId,
- myInheritVersion, myArchetype, "Create new Maven module").configure(project, root, false);
+ myInheritVersion, myArchetype, myPropertiesToCreateByArtifact, "Create new Maven module").configure(project, root, false);
}
});
}
@@ -96,7 +106,8 @@ public class MavenModuleBuilder extends ModuleBuilder implements SourcePathsBuil
@Override
public ModuleWizardStep[] createWizardSteps(WizardContext wizardContext, ModulesProvider modulesProvider) {
- return new ModuleWizardStep[]{new MavenModuleWizardStep(wizardContext.getProject(), this)};
+ return new ModuleWizardStep[]{new MavenModuleWizardStep(wizardContext.getProject(), this),
+ new SelectPropertiesStep(wizardContext.getProject(), this)};
}
public MavenProject findPotentialParentProject(Project project) {
@@ -170,4 +181,20 @@ public class MavenModuleBuilder extends ModuleBuilder implements SourcePathsBuil
public MavenArchetype getArchetype() {
return myArchetype;
}
+
+ public MavenEnvironmentForm getEnvironmentForm() {
+ return myEnvironmentForm;
+ }
+
+ public void setEnvironmentForm(MavenEnvironmentForm environmentForm) {
+ myEnvironmentForm = environmentForm;
+ }
+
+ public Map getPropertiesToCreateByArtifact() {
+ return myPropertiesToCreateByArtifact;
+ }
+
+ public void setPropertiesToCreateByArtifact(Map propertiesToCreateByArtifact) {
+ myPropertiesToCreateByArtifact = propertiesToCreateByArtifact;
+ }
}
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilderHelper.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilderHelper.java
index 7480bccbd758..c194329c73ac 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilderHelper.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilderHelper.java
@@ -61,6 +61,7 @@ public class MavenModuleBuilderHelper {
private final boolean myInheritVersion;
private final MavenArchetype myArchetype;
+ private final Map myPropertiesToCreateByArtifact;
private final String myCommandName;
@@ -70,6 +71,7 @@ public class MavenModuleBuilderHelper {
boolean inheritGroupId,
boolean inheritVersion,
MavenArchetype archetype,
+ Map propertiesToCreateByArtifact,
String commaneName) {
myProjectId = projectId;
myAggregatorProject = aggregatorProject;
@@ -77,6 +79,8 @@ public class MavenModuleBuilderHelper {
myInheritGroupId = inheritGroupId;
myInheritVersion = inheritVersion;
myArchetype = archetype;
+ myPropertiesToCreateByArtifact = propertiesToCreateByArtifact;
+ assert (archetype == null) == (propertiesToCreateByArtifact == null);
myCommandName = commaneName;
}
@@ -194,14 +198,16 @@ public class MavenModuleBuilderHelper {
Map props = settings.getMavenProperties();
props.put("interactiveMode", "false");
- props.put("archetypeGroupId", myArchetype.groupId);
- props.put("archetypeArtifactId", myArchetype.artifactId);
- props.put("archetypeVersion", myArchetype.version);
- if (myArchetype.repository != null) props.put("archetypeRepository", myArchetype.repository);
+ //props.put("archetypeGroupId", myArchetype.groupId);
+ //props.put("archetypeArtifactId", myArchetype.artifactId);
+ //props.put("archetypeVersion", myArchetype.version);
+ //if (myArchetype.repository != null) props.put("archetypeRepository", myArchetype.repository);
- props.put("groupId", myProjectId.getGroupId());
- props.put("artifactId", myProjectId.getArtifactId());
- props.put("version", myProjectId.getVersion());
+ //props.put("groupId", myProjectId.getGroupId());
+ //props.put("artifactId", myProjectId.getArtifactId());
+ //props.put("version", myProjectId.getVersion());
+
+ props.putAll(myPropertiesToCreateByArtifact);
runner.run(params, settings, new Runnable() {
public void run() {
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleWizardStep.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleWizardStep.java
index e78e2d495aee..c52e04c20cac 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleWizardStep.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleWizardStep.java
@@ -24,7 +24,6 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.*;
import com.intellij.ui.treeStructure.Tree;
import com.intellij.util.containers.Convertor;
-import com.intellij.util.ui.AbstractLayoutManager;
import com.intellij.util.ui.AsyncProcessIcon;
import com.intellij.util.ui.UIUtil;
import com.intellij.util.ui.tree.TreeUtil;
@@ -45,7 +44,6 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
public class MavenModuleWizardStep extends ModuleWizardStep {
private static final Icon WIZARD_ICON = IconLoader.getIcon("/addmodulewizard.png");
@@ -91,6 +89,8 @@ public class MavenModuleWizardStep extends ModuleWizardStep {
private Object myCurrentUpdaterMarker;
private final AsyncProcessIcon myLoadingIcon = new AsyncProcessIcon.Big(getClass() + ".loading");
+ private boolean skipUpdateUI;
+
public MavenModuleWizardStep(@Nullable Project project, MavenModuleBuilder builder) {
myProjectOrNull = project;
myBuilder = builder;
@@ -140,6 +140,12 @@ public class MavenModuleWizardStep extends ModuleWizardStep {
myInheritVersionCheckBox.addActionListener(updatingListener);
myUseArchetypeCheckBox.addActionListener(updatingListener);
+ myUseArchetypeCheckBox.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ archetypeMayBeChanged();
+ }
+ });
myAddArchetypeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
@@ -155,6 +161,7 @@ public class MavenModuleWizardStep extends ModuleWizardStep {
myArchetypesTree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
updateArchetypeDescription();
+ archetypeMayBeChanged();
}
});
@@ -169,6 +176,20 @@ public class MavenModuleWizardStep extends ModuleWizardStep {
myArchetypeDescriptionField.setBackground(UIUtil.getPanelBackground());
}
+ private void archetypeMayBeChanged() {
+ MavenArchetype selectedArchetype = getSelectedArchetype();
+ if (((myBuilder.getArchetype() == null) != (selectedArchetype == null))) {
+ myBuilder.setArchetype(selectedArchetype);
+ skipUpdateUI = true;
+ try {
+ fireStateChanged();
+ }
+ finally {
+ skipUpdateUI = false;
+ }
+ }
+ }
+
@Override
public JComponent getPreferredFocusedComponent() {
return myGroupIdField;
@@ -253,6 +274,8 @@ public class MavenModuleWizardStep extends ModuleWizardStep {
@Override
public void updateStep() {
+ if (skipUpdateUI) return;
+
if (isMavenizedProject()) {
MavenProject parent = myBuilder.findPotentialParentProject(myProjectOrNull);
myAggregator = parent;
@@ -429,7 +452,7 @@ public class MavenModuleWizardStep extends ModuleWizardStep {
myArchetypesTree.setBackground(archetypesEnabled ? UIUtil.getListBackground() : UIUtil.getPanelBackground());
}
- private String formatProjectString(MavenProject project) {
+ private static String formatProjectString(MavenProject project) {
if (project == null) return "";
return project.getMavenId().getDisplayString();
}
@@ -448,12 +471,13 @@ public class MavenModuleWizardStep extends ModuleWizardStep {
myBuilder.setArchetype(getSelectedArchetype());
}
+ @Nullable
private MavenArchetype getSelectedArchetype() {
if (!myUseArchetypeCheckBox.isSelected() || myArchetypesTree.isSelectionEmpty()) return null;
return getArchetypeInfoFromPathComponent(myArchetypesTree.getLastSelectedPathComponent());
}
- private MavenArchetype getArchetypeInfoFromPathComponent(Object sel) {
+ private static MavenArchetype getArchetypeInfoFromPathComponent(Object sel) {
return (MavenArchetype)((DefaultMutableTreeNode)sel).getUserObject();
}
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/SelectPropertiesStep.form b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/SelectPropertiesStep.form
new file mode 100644
index 000000000000..fc42a0ccb4b5
--- /dev/null
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/SelectPropertiesStep.form
@@ -0,0 +1,36 @@
+
+
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/SelectPropertiesStep.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/SelectPropertiesStep.java
new file mode 100644
index 000000000000..7f18f9426189
--- /dev/null
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/SelectPropertiesStep.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2000-2012 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jetbrains.idea.maven.wizards;
+
+import com.intellij.ide.util.projectWizard.ModuleWizardStep;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.project.ProjectManager;
+import com.intellij.util.containers.hash.HashMap;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.idea.maven.execution.MavenPropertiesPanel;
+import org.jetbrains.idea.maven.indices.MavenIndex;
+import org.jetbrains.idea.maven.model.MavenArchetype;
+import org.jetbrains.idea.maven.model.MavenId;
+import org.jetbrains.idea.maven.project.MavenEnvironmentForm;
+import org.jetbrains.idea.maven.project.MavenGeneralSettings;
+import org.jetbrains.idea.maven.project.MavenProjectsManager;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @author Sergey Evdokimov
+ */
+public class SelectPropertiesStep extends ModuleWizardStep {
+
+ private final Project myProjectOrNull;
+ private final MavenModuleBuilder myBuilder;
+
+ private JPanel myMainPanel;
+ private JPanel myEnvironmentPanel;
+ private JPanel myPropertiesPanel;
+
+ private MavenEnvironmentForm myEnvironmentForm;
+ private MavenPropertiesPanel myMavenPropertiesPanel;
+
+ private Map myAvailableProperties = new HashMap();
+
+ public SelectPropertiesStep(@Nullable Project project, MavenModuleBuilder builder) {
+ myProjectOrNull = project;
+ myBuilder = builder;
+
+ initComponents();
+ }
+
+ private void initComponents() {
+ myEnvironmentForm = new MavenEnvironmentForm();
+
+ Project project = myProjectOrNull == null ? ProjectManager.getInstance().getDefaultProject() : myProjectOrNull;
+ myEnvironmentForm.getData(MavenProjectsManager.getInstance(project).getGeneralSettings().clone());
+
+ myEnvironmentPanel.add(myEnvironmentForm.createComponent(), BorderLayout.CENTER);
+
+ myMavenPropertiesPanel = new MavenPropertiesPanel(myAvailableProperties);
+ myPropertiesPanel.add(myMavenPropertiesPanel);
+ }
+
+ @Override
+ public void updateStep() {
+ MavenArchetype archetype = myBuilder.getArchetype();
+
+ Map props = new LinkedHashMap();
+
+ MavenId projectId = myBuilder.getProjectId();
+
+ props.put("groupId", projectId.getGroupId());
+ props.put("artifactId", projectId.getArtifactId());
+ props.put("version", projectId.getVersion());
+
+ props.put("archetypeGroupId", archetype.groupId);
+ props.put("archetypeArtifactId", archetype.artifactId);
+ props.put("archetypeVersion", archetype.version);
+ if (archetype.repository != null) props.put("archetypeRepository", archetype.repository);
+
+ myMavenPropertiesPanel.setDataFromMap(props);
+ }
+
+ @Override
+ public JComponent getComponent() {
+ return myMainPanel;
+ }
+
+ @Override
+ public boolean isStepVisible() {
+ return myBuilder.getArchetype() != null;
+ }
+
+ @Override
+ public void updateDataModel() {
+ myBuilder.setEnvironmentForm(myEnvironmentForm);
+ myBuilder.setPropertiesToCreateByArtifact(myMavenPropertiesPanel.getDataAsMap());
+ }
+}
From 63c9dd7c993f682d8797feabd5ddb2852a3c147d Mon Sep 17 00:00:00 2001
From: Kirill Likhodedov
Date: Tue, 21 Feb 2012 16:01:49 +0400
Subject: [PATCH 05/17] Git: Compare branches: diff mode
1. Extract GitChangeUtils.getDiffOutput method from GitOldChangesCollector.
Introduce GitChangeUtils.getDiff to get changes.
2. GitCompareBranchesDialog: show a tabbed pane with log view in one tab, and diff view in the other.
---
.../src/git4idea/GitContentRevision.java | 2 +-
.../branch/GitBranchOperationsProcessor.java | 17 +-
.../src/git4idea/changes/GitChangeUtils.java | 53 +++++-
.../status/GitOldChangesCollector.java | 20 +--
.../ui/branch/GitCompareBranchesDialog.java | 113 ++-----------
.../branch/GitCompareBranchesDiffPanel.java | 66 ++++++++
.../ui/branch/GitCompareBranchesLogPanel.java | 154 ++++++++++++++++++
.../git4idea/util/GitCommitCompareInfo.java | 17 +-
8 files changed, 317 insertions(+), 125 deletions(-)
create mode 100644 plugins/git4idea/src/git4idea/ui/branch/GitCompareBranchesDiffPanel.java
create mode 100644 plugins/git4idea/src/git4idea/ui/branch/GitCompareBranchesLogPanel.java
diff --git a/plugins/git4idea/src/git4idea/GitContentRevision.java b/plugins/git4idea/src/git4idea/GitContentRevision.java
index 40ba200159cf..9f1c759d0902 100644
--- a/plugins/git4idea/src/git4idea/GitContentRevision.java
+++ b/plugins/git4idea/src/git4idea/GitContentRevision.java
@@ -146,7 +146,7 @@ public class GitContentRevision implements ContentRevision {
*/
public static ContentRevision createRevision(VirtualFile vcsRoot,
String path,
- VcsRevisionNumber revisionNumber,
+ @Nullable VcsRevisionNumber revisionNumber,
Project project,
boolean isDeleted, final boolean canBeDeleted, boolean unescapePath) throws VcsException {
final FilePath file;
diff --git a/plugins/git4idea/src/git4idea/branch/GitBranchOperationsProcessor.java b/plugins/git4idea/src/git4idea/branch/GitBranchOperationsProcessor.java
index 28136814e980..b8e21d7dcd51 100644
--- a/plugins/git4idea/src/git4idea/branch/GitBranchOperationsProcessor.java
+++ b/plugins/git4idea/src/git4idea/branch/GitBranchOperationsProcessor.java
@@ -26,11 +26,13 @@ import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vcs.VcsException;
+import com.intellij.openapi.vcs.changes.Change;
import com.intellij.util.ui.UIUtil;
import git4idea.GitBranch;
import git4idea.GitExecutionException;
import git4idea.GitVcs;
import git4idea.NotificationManager;
+import git4idea.changes.GitChangeUtils;
import git4idea.commands.Git;
import git4idea.commands.GitCommandResult;
import git4idea.commands.GitCompoundResult;
@@ -390,10 +392,23 @@ public final class GitBranchOperationsProcessor {
GitCommitCompareInfo compareInfo = new GitCommitCompareInfo();
for (GitRepository repository : repositories) {
compareInfo.put(repository, loadCommitsToCompare(repository, branchName));
+ compareInfo.put(repository, loadTotalDiff(repository, branchName));
}
return compareInfo;
}
-
+
+ @NotNull
+ private static Collection loadTotalDiff(@NotNull GitRepository repository, @NotNull String branchName) {
+ try {
+ return GitChangeUtils.getDiff(repository.getProject(), repository.getRoot(), null, branchName, null);
+ }
+ catch (VcsException e) {
+ // we treat it as critical and report an error
+ throw new GitExecutionException("Couldn't get [git diff " + branchName + "] on repository [" + repository.getRoot() + "]", e);
+ }
+ }
+
+ @NotNull
private Pair, List> loadCommitsToCompare(@NotNull GitRepository repository, @NotNull final String branchName) {
final List headToBranch;
final List branchToHead;
diff --git a/plugins/git4idea/src/git4idea/changes/GitChangeUtils.java b/plugins/git4idea/src/git4idea/changes/GitChangeUtils.java
index c37f7eca50a6..4e06200c7d00 100644
--- a/plugins/git4idea/src/git4idea/changes/GitChangeUtils.java
+++ b/plugins/git4idea/src/git4idea/changes/GitChangeUtils.java
@@ -18,6 +18,7 @@ package git4idea.changes;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.openapi.vcs.FilePath;
import com.intellij.openapi.vcs.FileStatus;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.openapi.vcs.changes.Change;
@@ -113,7 +114,7 @@ public class GitChangeUtils {
*/
public static void parseChanges(Project project,
VirtualFile vcsRoot,
- GitRevisionNumber thisRevision,
+ @Nullable GitRevisionNumber thisRevision,
GitRevisionNumber parentRevision,
String s,
Collection changes,
@@ -161,7 +162,7 @@ public class GitChangeUtils {
*/
public static void parseChanges(Project project,
VirtualFile vcsRoot,
- GitRevisionNumber thisRevision,
+ @Nullable GitRevisionNumber thisRevision,
GitRevisionNumber parentRevision,
StringScanner s,
Collection changes,
@@ -444,4 +445,52 @@ public class GitChangeUtils {
public static long longForSHAHash(String revisionNumber) {
return Long.parseLong(revisionNumber.substring(0, 15), 16) << 4 + Integer.parseInt(revisionNumber.substring(15, 16), 16);
}
+
+ @NotNull
+ public static Collection getDiff(@NotNull Project project, @NotNull VirtualFile root,
+ @Nullable String firstRevision, @NotNull String nextRevision,
+ @Nullable Collection dirtyPaths) throws VcsException {
+ Collection changes = new ArrayList();
+ String range = firstRevision == null ? nextRevision : firstRevision + ".." + nextRevision;
+ String output = getDiffOutput(project, root, range, dirtyPaths);
+ GitRevisionNumber thisRevision = firstRevision == null ? null : loadRevision(project, root, firstRevision);
+ parseChanges(project, root, thisRevision, loadRevision(project, root, nextRevision), output, changes, Collections.emptySet());
+ return changes;
+ }
+
+ /**
+ * Calls {@code git diff} on the given range.
+ * @param project
+ * @param root
+ * @param diffRange range or just revision (will be compared with current working tree).
+ * @param dirtyPaths limit the command by paths if needed or pass null.
+ * @return output of the 'git diff' command.
+ * @throws VcsException
+ */
+ @NotNull
+ public static String getDiffOutput(@NotNull Project project, @NotNull VirtualFile root,
+ @NotNull String diffRange, @Nullable Collection dirtyPaths) throws VcsException {
+ GitSimpleHandler handler = getDiffHandler(project, root, diffRange, dirtyPaths);
+ if (handler.isLargeCommandLine()) {
+ // if there are too much files, just get all changes for the project
+ handler = getDiffHandler(project, root, diffRange, null);
+ }
+ return handler.run();
+ }
+
+ @NotNull
+ private static GitSimpleHandler getDiffHandler(@NotNull Project project, @NotNull VirtualFile root,
+ @NotNull String diffRange, @Nullable Collection dirtyPaths) {
+ GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.DIFF);
+ handler.addParameters("--name-status", "--diff-filter=ADCMRUXT", "-M", diffRange);
+ handler.setNoSSH(true);
+ handler.setSilent(true);
+ handler.setStdoutSuppressed(true);
+ handler.endOptions();
+ if (dirtyPaths != null) {
+ handler.addRelativePaths(dirtyPaths);
+ }
+ return handler;
+ }
+
}
diff --git a/plugins/git4idea/src/git4idea/status/GitOldChangesCollector.java b/plugins/git4idea/src/git4idea/status/GitOldChangesCollector.java
index b719ffc5b672..52ed9458f353 100644
--- a/plugins/git4idea/src/git4idea/status/GitOldChangesCollector.java
+++ b/plugins/git4idea/src/git4idea/status/GitOldChangesCollector.java
@@ -153,24 +153,8 @@ class GitOldChangesCollector extends GitChangesCollector {
if (dirtyPaths.isEmpty()) {
return;
}
- GitSimpleHandler handler = new GitSimpleHandler(myProject, myVcsRoot, GitCommand.DIFF);
- handler.addParameters("--name-status", "--diff-filter=ADCMRUXT", "-M", "HEAD");
- handler.setNoSSH(true);
- handler.setSilent(true);
- handler.setStdoutSuppressed(true);
- handler.endOptions();
- handler.addRelativePaths(dirtyPaths);
- if (handler.isLargeCommandLine()) {
- // if there are too much files, just get all changes for the project
- handler = new GitSimpleHandler(myProject, myVcsRoot, GitCommand.DIFF);
- handler.addParameters("--name-status", "--diff-filter=ADCMRUXT", "-M", "HEAD");
- handler.setNoSSH(true);
- handler.setSilent(true);
- handler.setStdoutSuppressed(true);
- handler.endOptions();
- }
try {
- String output = handler.run();
+ String output = GitChangeUtils.getDiffOutput(myProject, myVcsRoot, "HEAD", dirtyPaths);
GitChangeUtils.parseChanges(myProject, myVcsRoot, null, GitChangeUtils.loadRevision(myProject, myVcsRoot, "HEAD"), output, myChanges,
myUnmergedNames);
}
@@ -178,7 +162,7 @@ class GitOldChangesCollector extends GitChangesCollector {
if (!GitChangeUtils.isHeadMissing(ex)) {
throw ex;
}
- handler = new GitSimpleHandler(myProject, myVcsRoot, GitCommand.LS_FILES);
+ GitSimpleHandler handler = new GitSimpleHandler(myProject, myVcsRoot, GitCommand.LS_FILES);
handler.addParameters("--cached");
handler.setNoSSH(true);
handler.setSilent(true);
diff --git a/plugins/git4idea/src/git4idea/ui/branch/GitCompareBranchesDialog.java b/plugins/git4idea/src/git4idea/ui/branch/GitCompareBranchesDialog.java
index 0fc3f95ddcf8..355412335b3e 100644
--- a/plugins/git4idea/src/git4idea/ui/branch/GitCompareBranchesDialog.java
+++ b/plugins/git4idea/src/git4idea/ui/branch/GitCompareBranchesDialog.java
@@ -17,28 +17,16 @@ package git4idea.ui.branch;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
-import com.intellij.openapi.ui.Splitter;
-import com.intellij.openapi.vcs.changes.Change;
-import com.intellij.openapi.vcs.changes.ui.ChangesBrowser;
-import com.intellij.ui.components.JBLabel;
-import com.intellij.util.ArrayUtil;
-import com.intellij.util.Consumer;
-import com.intellij.util.ui.UIUtil;
-import git4idea.history.browser.GitCommit;
+import com.intellij.openapi.util.IconLoader;
+import com.intellij.ui.components.JBTabbedPane;
import git4idea.repo.GitRepository;
import git4idea.repo.GitRepositoryManager;
-import git4idea.ui.GitCommitListPanel;
-import git4idea.ui.GitRepositoryComboboxListCellRenderer;
import git4idea.util.GitCommitCompareInfo;
import git4idea.util.GitUIUtil;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
-import java.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.ArrayList;
-import java.util.Collections;
+import java.awt.event.KeyEvent;
/**
* Dialog for comparing two Git branches.
@@ -52,9 +40,6 @@ public class GitCompareBranchesDialog extends DialogWrapper {
private final GitCommitCompareInfo myCompareInfo;
private final GitRepository myInitialRepo;
- private GitCommitListPanel myHeadToBranchListPanel;
- private GitCommitListPanel myBranchToHeadListPanel;
-
public GitCompareBranchesDialog(@NotNull Project project, @NotNull String branchName, @NotNull String currentBranchName,
@NotNull GitCommitCompareInfo compareInfo, @NotNull GitRepository initialRepo) {
super(project, false);
@@ -77,93 +62,17 @@ public class GitCompareBranchesDialog extends DialogWrapper {
@Override
protected JComponent createCenterPanel() {
- final ChangesBrowser changesBrowser = new ChangesBrowser(myProject, null, Collections.emptyList(), null, false, true, null, ChangesBrowser.MyUseCase.COMMITTED_CHANGES, null);
+ JPanel logPanel = new GitCompareBranchesLogPanel(myProject, myBranchName, myCurrentBranchName, myCompareInfo, myInitialRepo);
+ JPanel diffPanel = new GitCompareBranchesDiffPanel(myProject, myBranchName, myCurrentBranchName, myCompareInfo);
- myHeadToBranchListPanel = new GitCommitListPanel(myProject, getHeadToBranchCommits(myInitialRepo));
- myBranchToHeadListPanel = new GitCommitListPanel(myProject, getBranchToHeadCommits(myInitialRepo));
-
- addSelectionListener(myHeadToBranchListPanel, myBranchToHeadListPanel, changesBrowser);
- addSelectionListener(myBranchToHeadListPanel, myHeadToBranchListPanel, changesBrowser);
-
- JPanel htb = layoutCommitListPanel(myCurrentBranchName, true);
- JPanel bth = layoutCommitListPanel(myCurrentBranchName, false);
-
- Splitter lists = new Splitter(true, 0.5f);
- lists.setFirstComponent(htb);
- lists.setSecondComponent(bth);
-
- Splitter rootPanel = new Splitter(false, 0.7f);
- rootPanel.setSecondComponent(changesBrowser);
- rootPanel.setFirstComponent(lists);
- return rootPanel;
+ JBTabbedPane tabbedPane = new JBTabbedPane();
+ tabbedPane.addTab("Log", IconLoader.getIcon("/icons/branch.png"), logPanel);
+ tabbedPane.setMnemonicAt(0, KeyEvent.VK_L);
+ tabbedPane.addTab("Diff", IconLoader.getIcon("/actions/diff.png"), diffPanel);
+ tabbedPane.setMnemonicAt(1, KeyEvent.VK_D);
+ return tabbedPane;
}
- @Override
- protected JComponent createNorthPanel() {
- final JComboBox repoSelector = new JComboBox(ArrayUtil.toObjectArray(myCompareInfo.getRepositories(), GitRepository.class));
- repoSelector.setRenderer(new GitRepositoryComboboxListCellRenderer(repoSelector));
- repoSelector.setSelectedItem(myInitialRepo);
-
- repoSelector.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- GitRepository selectedRepo = (GitRepository)repoSelector.getSelectedItem();
- myHeadToBranchListPanel.setCommits(getHeadToBranchCommits(selectedRepo));
- myBranchToHeadListPanel.setCommits(getBranchToHeadCommits(selectedRepo));
- }
- });
-
- JPanel repoSelectorPanel = new JPanel(new BorderLayout());
- JBLabel label = new JBLabel("Repository: ");
- label.setLabelFor(repoSelectorPanel);
- repoSelectorPanel.add(label);
- repoSelectorPanel.add(repoSelector);
-
- if (myCompareInfo.getRepositories().size() < 2) {
- repoSelectorPanel.setVisible(false);
- }
- return repoSelectorPanel;
- }
-
- private ArrayList getBranchToHeadCommits(GitRepository selectedRepo) {
- return new ArrayList(myCompareInfo.getBranchToHeadCommits(selectedRepo));
- }
-
- private ArrayList getHeadToBranchCommits(GitRepository selectedRepo) {
- return new ArrayList(myCompareInfo.getHeadToBranchCommits(selectedRepo));
- }
-
- private static void addSelectionListener(@NotNull GitCommitListPanel sourcePanel,
- @NotNull final GitCommitListPanel otherPanel,
- @NotNull final ChangesBrowser changesBrowser) {
- sourcePanel.addListSelectionListener(new Consumer() {
- @Override
- public void consume(GitCommit commit) {
- changesBrowser.setChangesToDisplay(commit.getChanges());
- otherPanel.clearSelection();
- }
- });
- }
-
- private JPanel layoutCommitListPanel(@NotNull String currentBranch, boolean forward) {
- String desc = makeDescription(currentBranch, forward);
-
- JPanel bth = new JPanel(new BorderLayout());
- JBLabel descriptionLabel = new JBLabel(desc, UIUtil.ComponentStyle.SMALL);
- descriptionLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0));
- bth.add(descriptionLabel, BorderLayout.NORTH);
- bth.add(forward ? myHeadToBranchListPanel : myBranchToHeadListPanel);
- return bth;
- }
-
- private String makeDescription(@NotNull String currentBranch, boolean forward) {
- String firstBranch = forward ? currentBranch : myBranchName;
- String secondBranch = forward ? myBranchName : currentBranch;
- return String.format("Commits that exist in %s but don't exist in %s (git log %s..%s):",
- secondBranch, firstBranch, firstBranch, secondBranch);
- }
-
-
// it is information dialog - no need to OK or Cancel. Close the dialog by clicking the cross button or pressing Esc.
@Override
protected Action[] createActions() {
diff --git a/plugins/git4idea/src/git4idea/ui/branch/GitCompareBranchesDiffPanel.java b/plugins/git4idea/src/git4idea/ui/branch/GitCompareBranchesDiffPanel.java
new file mode 100644
index 000000000000..83b4b836fcd0
--- /dev/null
+++ b/plugins/git4idea/src/git4idea/ui/branch/GitCompareBranchesDiffPanel.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2000-2012 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package git4idea.ui.branch;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vcs.changes.Change;
+import com.intellij.openapi.vcs.changes.ui.ChangesBrowser;
+import com.intellij.ui.components.JBLabel;
+import com.intellij.util.ui.UIUtil;
+import git4idea.util.GitCommitCompareInfo;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.List;
+
+/**
+ * @author Kirill Likhodedov
+ */
+class GitCompareBranchesDiffPanel extends JPanel {
+
+ private final Project myProject;
+ private final String myBranchName;
+ private final String myCurrentBranchName;
+ private final GitCommitCompareInfo myCompareInfo;
+
+ public GitCompareBranchesDiffPanel(Project project, String branchName, String currentBranchName, GitCommitCompareInfo compareInfo) {
+ super();
+
+ myProject = project;
+ myCurrentBranchName = currentBranchName;
+ myCompareInfo = compareInfo;
+ myBranchName = branchName;
+
+ setLayout(new BorderLayout(UIUtil.DEFAULT_VGAP, UIUtil.DEFAULT_HGAP));
+ add(createNorthPanel(), BorderLayout.NORTH);
+ add(createCenterPanel());
+ }
+
+ private JComponent createNorthPanel() {
+ return new JBLabel(String.format("Difference between current working tree on %s " +
+ "and files in %s:", myCurrentBranchName, myBranchName),
+ UIUtil.ComponentStyle.REGULAR);
+ }
+
+ private JComponent createCenterPanel() {
+ List diff = myCompareInfo.getTotalDiff();
+ final ChangesBrowser changesBrowser = new ChangesBrowser(myProject, null, diff, null, false, true,
+ null, ChangesBrowser.MyUseCase.COMMITTED_CHANGES, null);
+ changesBrowser.setChangesToDisplay(diff);
+ return changesBrowser;
+ }
+
+}
diff --git a/plugins/git4idea/src/git4idea/ui/branch/GitCompareBranchesLogPanel.java b/plugins/git4idea/src/git4idea/ui/branch/GitCompareBranchesLogPanel.java
new file mode 100644
index 000000000000..b511ff39726e
--- /dev/null
+++ b/plugins/git4idea/src/git4idea/ui/branch/GitCompareBranchesLogPanel.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2000-2012 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package git4idea.ui.branch;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.Splitter;
+import com.intellij.openapi.vcs.changes.Change;
+import com.intellij.openapi.vcs.changes.ui.ChangesBrowser;
+import com.intellij.ui.components.JBLabel;
+import com.intellij.util.ArrayUtil;
+import com.intellij.util.Consumer;
+import com.intellij.util.ui.UIUtil;
+import git4idea.history.browser.GitCommit;
+import git4idea.repo.GitRepository;
+import git4idea.ui.GitCommitListPanel;
+import git4idea.ui.GitRepositoryComboboxListCellRenderer;
+import git4idea.util.GitCommitCompareInfo;
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.Collections;
+
+/**
+ * @author Kirill Likhodedov
+ */
+class GitCompareBranchesLogPanel extends JPanel {
+
+ private final Project myProject;
+ private final String myBranchName;
+ private final String myCurrentBranchName;
+ private final GitCommitCompareInfo myCompareInfo;
+ private final GitRepository myInitialRepo;
+
+ private GitCommitListPanel myHeadToBranchListPanel;
+ private GitCommitListPanel myBranchToHeadListPanel;
+
+ GitCompareBranchesLogPanel(@NotNull Project project, @NotNull String branchName, @NotNull String currentBranchName,
+ @NotNull GitCommitCompareInfo compareInfo, @NotNull GitRepository initialRepo) {
+ super(new BorderLayout());
+ myProject = project;
+ myBranchName = branchName;
+ myCurrentBranchName = currentBranchName;
+ myCompareInfo = compareInfo;
+ myInitialRepo = initialRepo;
+
+ add(createNorthPanel(), BorderLayout.NORTH);
+ add(createCenterPanel());
+ }
+
+ private JComponent createCenterPanel() {
+ final ChangesBrowser changesBrowser = new ChangesBrowser(myProject, null, Collections.emptyList(), null, false, true,
+ null, ChangesBrowser.MyUseCase.COMMITTED_CHANGES, null);
+
+ myHeadToBranchListPanel = new GitCommitListPanel(myProject, getHeadToBranchCommits(myInitialRepo));
+ myBranchToHeadListPanel = new GitCommitListPanel(myProject, getBranchToHeadCommits(myInitialRepo));
+
+ addSelectionListener(myHeadToBranchListPanel, myBranchToHeadListPanel, changesBrowser);
+ addSelectionListener(myBranchToHeadListPanel, myHeadToBranchListPanel, changesBrowser);
+
+ JPanel htb = layoutCommitListPanel(myCurrentBranchName, true);
+ JPanel bth = layoutCommitListPanel(myCurrentBranchName, false);
+
+ Splitter lists = new Splitter(true, 0.5f);
+ lists.setFirstComponent(htb);
+ lists.setSecondComponent(bth);
+
+ Splitter rootPanel = new Splitter(false, 0.7f);
+ rootPanel.setSecondComponent(changesBrowser);
+ rootPanel.setFirstComponent(lists);
+ return rootPanel;
+ }
+
+ private JComponent createNorthPanel() {
+ final JComboBox repoSelector = new JComboBox(ArrayUtil.toObjectArray(myCompareInfo.getRepositories(), GitRepository.class));
+ repoSelector.setRenderer(new GitRepositoryComboboxListCellRenderer(repoSelector));
+ repoSelector.setSelectedItem(myInitialRepo);
+
+ repoSelector.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ GitRepository selectedRepo = (GitRepository)repoSelector.getSelectedItem();
+ myHeadToBranchListPanel.setCommits(getHeadToBranchCommits(selectedRepo));
+ myBranchToHeadListPanel.setCommits(getBranchToHeadCommits(selectedRepo));
+ }
+ });
+
+ JPanel repoSelectorPanel = new JPanel(new BorderLayout(UIUtil.DEFAULT_VGAP, UIUtil.DEFAULT_HGAP));
+ JBLabel label = new JBLabel("Repository: ");
+ label.setLabelFor(repoSelectorPanel);
+ repoSelectorPanel.add(label, BorderLayout.WEST);
+ repoSelectorPanel.add(repoSelector);
+
+ if (myCompareInfo.getRepositories().size() < 2) {
+ repoSelectorPanel.setVisible(false);
+ }
+ return repoSelectorPanel;
+ }
+
+ private ArrayList getBranchToHeadCommits(GitRepository selectedRepo) {
+ return new ArrayList(myCompareInfo.getBranchToHeadCommits(selectedRepo));
+ }
+
+ private ArrayList getHeadToBranchCommits(GitRepository selectedRepo) {
+ return new ArrayList(myCompareInfo.getHeadToBranchCommits(selectedRepo));
+ }
+
+
+ private static void addSelectionListener(@NotNull GitCommitListPanel sourcePanel,
+ @NotNull final GitCommitListPanel otherPanel,
+ @NotNull final ChangesBrowser changesBrowser) {
+ sourcePanel.addListSelectionListener(new Consumer() {
+ @Override
+ public void consume(GitCommit commit) {
+ changesBrowser.setChangesToDisplay(commit.getChanges());
+ otherPanel.clearSelection();
+ }
+ });
+ }
+
+ private JPanel layoutCommitListPanel(@NotNull String currentBranch, boolean forward) {
+ String desc = makeDescription(currentBranch, forward);
+
+ JPanel bth = new JPanel(new BorderLayout());
+ JBLabel descriptionLabel = new JBLabel(desc, UIUtil.ComponentStyle.SMALL);
+ descriptionLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0));
+ bth.add(descriptionLabel, BorderLayout.NORTH);
+ bth.add(forward ? myHeadToBranchListPanel : myBranchToHeadListPanel);
+ return bth;
+ }
+
+ private String makeDescription(@NotNull String currentBranch, boolean forward) {
+ String firstBranch = forward ? currentBranch : myBranchName;
+ String secondBranch = forward ? myBranchName : currentBranch;
+ return String.format("Commits that exist in %s but don't exist in %s (git log %s..%s):",
+ secondBranch, firstBranch, firstBranch, secondBranch);
+ }
+}
diff --git a/plugins/git4idea/src/git4idea/util/GitCommitCompareInfo.java b/plugins/git4idea/src/git4idea/util/GitCommitCompareInfo.java
index 0a9bde9a16ed..bb567b349c58 100644
--- a/plugins/git4idea/src/git4idea/util/GitCommitCompareInfo.java
+++ b/plugins/git4idea/src/git4idea/util/GitCommitCompareInfo.java
@@ -17,6 +17,7 @@ package git4idea.util;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Pair;
+import com.intellij.openapi.vcs.changes.Change;
import git4idea.history.browser.GitCommit;
import git4idea.repo.GitRepository;
import org.jetbrains.annotations.NotNull;
@@ -31,11 +32,16 @@ public class GitCommitCompareInfo {
private static final Logger LOG = Logger.getInstance(GitCommitCompareInfo.class);
private final Map, List>> myInfo = new HashMap, List>>();
-
+ private final Map> myTotalDiff = new HashMap>();
+
public void put(@NotNull GitRepository repository, @NotNull Pair, List> commits) {
myInfo.put(repository, commits);
}
+ public void put(@NotNull GitRepository repository, @NotNull Collection totalDiff) {
+ myTotalDiff.put(repository, totalDiff);
+ }
+
@NotNull
public List getHeadToBranchCommits(@NotNull GitRepository repo) {
return getCompareInfo(repo).getFirst();
@@ -64,4 +70,13 @@ public class GitCommitCompareInfo {
public boolean isEmpty() {
return myInfo.isEmpty();
}
+
+ @NotNull
+ public List getTotalDiff() {
+ List changes = new ArrayList();
+ for (Collection changeCollection : myTotalDiff.values()) {
+ changes.addAll(changeCollection);
+ }
+ return changes;
+ }
}
From 5bffdd267cd8b7af84f28facbbc2de4e1b7afd72 Mon Sep 17 00:00:00 2001
From: anna
Date: Tue, 21 Feb 2012 13:49:39 +0100
Subject: [PATCH 06/17] testdata fixed to exclude copyright
---
.../afterNonPrimitiveArrayDimensions.java | 16 ----------------
.../beforeNonPrimitiveArrayDimensions.java | 16 ----------------
.../overrideMethod/afterProtectedMethod.java | 16 ----------------
.../overrideMethod/beforePrivateMethod.java | 16 ----------------
.../overrideMethod/beforeProtectedMethod.java | 16 ----------------
5 files changed, 80 deletions(-)
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/afterNonPrimitiveArrayDimensions.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/afterNonPrimitiveArrayDimensions.java
index 895a33236f5d..658edf310d24 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/afterNonPrimitiveArrayDimensions.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/afterNonPrimitiveArrayDimensions.java
@@ -1,19 +1,3 @@
-/*
- * Copyright 2000-2012 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
// "Change 'new X[42]' to 'new long[]'" "true"
class X {
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/beforeNonPrimitiveArrayDimensions.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/beforeNonPrimitiveArrayDimensions.java
index d1067c2c7a2a..b698ee9f798c 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/beforeNonPrimitiveArrayDimensions.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/beforeNonPrimitiveArrayDimensions.java
@@ -1,19 +1,3 @@
-/*
- * Copyright 2000-2012 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
// "Change 'new X[42]' to 'new long[]'" "true"
class X {
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/overrideMethod/afterProtectedMethod.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/overrideMethod/afterProtectedMethod.java
index c00be390d07a..d5f20a3c5b26 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/overrideMethod/afterProtectedMethod.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/overrideMethod/afterProtectedMethod.java
@@ -1,19 +1,3 @@
-/*
- * Copyright 2000-2012 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
// "Override method 'foo'" "true"
class Test {
protected void foo(){}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/overrideMethod/beforePrivateMethod.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/overrideMethod/beforePrivateMethod.java
index 18629818d098..f06ad320ba49 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/overrideMethod/beforePrivateMethod.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/overrideMethod/beforePrivateMethod.java
@@ -1,19 +1,3 @@
-/*
- * Copyright 2000-2012 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
// "Override method 'foo'" "false"
class Test {
private void foo(){}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/overrideMethod/beforeProtectedMethod.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/overrideMethod/beforeProtectedMethod.java
index fa5bc2c68ff7..239d85010ad7 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/overrideMethod/beforeProtectedMethod.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/overrideMethod/beforeProtectedMethod.java
@@ -1,19 +1,3 @@
-/*
- * Copyright 2000-2012 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
// "Override method 'foo'" "true"
class Test {
protected void foo(){}
From 8dd0125546e61e860d072460d99b6b5dc120fb1f Mon Sep 17 00:00:00 2001
From: Roman Shevchenko
Date: Fri, 17 Feb 2012 11:56:44 +0100
Subject: [PATCH 07/17] Cleanup and document Project interface and
implementations
---
.../com/intellij/openapi/project/Project.java | 89 +++++--
.../src/com/intellij/mock/MockProject.java | 7 +-
.../impl/ConversionServiceImpl.java | 8 +-
.../openapi/command/impl/DummyProject.java | 7 +-
.../impl/stores/FileBasedStorage.java | 18 +-
.../components/impl/stores/IProjectStore.java | 10 +-
.../impl/stores/ProjectStoreImpl.java | 226 +++++++++---------
.../openapi/project/impl/ProjectImpl.java | 69 ++++--
.../wm/impl/PlatformFrameTitleBuilder.java | 3 +-
.../src/messages/IdeBundle.properties | 2 +-
.../com/intellij/mock/MockProjectStore.java | 34 +--
11 files changed, 278 insertions(+), 195 deletions(-)
diff --git a/platform/core-api/src/com/intellij/openapi/project/Project.java b/platform/core-api/src/com/intellij/openapi/project/Project.java
index b05098b9c086..1a562fbf6b47 100644
--- a/platform/core-api/src/com/intellij/openapi/project/Project.java
+++ b/platform/core-api/src/com/intellij/openapi/project/Project.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,38 +22,97 @@ import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-
/**
* Project interface class.
*/
public interface Project extends ComponentManager, AreaInstance {
@NonNls String DIRECTORY_STORE_FOLDER = ".idea";
- @Nullable
- VirtualFile getProjectFile();
-
- @Nullable
- VirtualFile getWorkspaceFile();
-
- @NotNull
- String getProjectFilePath();
-
- @Nullable
- VirtualFile getBaseDir();
-
@NotNull
@NonNls
String getName();
+ /**
+ * Returns a project base directory - a parent directory of a .ipr file or .idea directory.
+ * Returns null for default project.
+ *
+ * Please note that returned file is always de-referenced, so you have to use use {@linkplain #getBasePath()}
+ * if it's desired to keep symlinks in original path.
+ *
+ * @return project base directory, or null for default project
+ * todo: check usages
+ */
+ @Nullable
+ VirtualFile getBaseDir();
+
+ /**
+ * Returns a system-dependent path to a project base directory (see {@linkplain #getBaseDir()}).
+ * Returns null for default project.
+ *
+ * @return a path to a project base directory, or empty string for default project
+ */
+ @Nullable
+ @NonNls
+ String getBasePath();
+
+ /**
+ * Returns project descriptor file:
+ *
+ * path/to/project/project.ipr - for file-based projects
+ * path/to/project/.idea/misc.xml - for directory-based projects
+ *
+ * Returns null for default project.
+ *
+ * Please note that returned file is always de-referenced, so you have to use use {@linkplain #getProjectFilePath()}
+ * if it's desired to keep symlinks in original path.
+ *
+ * @return project descriptor file, or null for default project
+ */
+ @Nullable
+ VirtualFile getProjectFile();
+
+ /**
+ * Returns a system-dependent path to project descriptor file (see {@linkplain #getProjectFile()}).
+ * Returns empty string ("") for default project.
+ *
+ * @return project descriptor file, or empty string for default project
+ */
+ @NotNull
+ @NonNls
+ String getProjectFilePath();
+
+ /**
+ * Returns presentable project path:
+ * {@linkplain #getProjectFilePath()} for file-based projects, {@linkplain #getLocation()} for directory-based ones.
+ *
+ * @return presentable project path
+ * todo: check usages
+ */
@Nullable
@NonNls
String getPresentableUrl();
+ /**
+ * Returns a workspace file:
+ *
+ * path/to/project/project.iws - for file-based projects
+ * path/to/project/.idea/workspace.xml - for directory-based ones
+ *
+ * Returns null for default project.
+ *
+ * @return workspace file, or null for default project
+ */
+ @Nullable
+ VirtualFile getWorkspaceFile();
+
@NotNull
@NonNls
String getLocationHash();
-
+ /**
+ * @deprecated please use {@linkplain #getPresentableUrl()} or {@linkplain #getBasePath()} (to remove in IDEA 13).
+ * todo: remove usages
+ */
@Nullable
@NonNls
String getLocation();
diff --git a/platform/core-impl/src/com/intellij/mock/MockProject.java b/platform/core-impl/src/com/intellij/mock/MockProject.java
index 86d618118281..e06167f2ae0a 100644
--- a/platform/core-impl/src/com/intellij/mock/MockProject.java
+++ b/platform/core-impl/src/com/intellij/mock/MockProject.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2011 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -117,6 +117,11 @@ public class MockProject extends MockComponentManager implements Project {
return null;
}
+ @Override
+ public String getBasePath() {
+ return null;
+ }
+
@Override
public void save() {
}
diff --git a/platform/lang-impl/src/com/intellij/conversion/impl/ConversionServiceImpl.java b/platform/lang-impl/src/com/intellij/conversion/impl/ConversionServiceImpl.java
index 9702c5bf0c67..7b1a93ef7733 100644
--- a/platform/lang-impl/src/com/intellij/conversion/impl/ConversionServiceImpl.java
+++ b/platform/lang-impl/src/com/intellij/conversion/impl/ConversionServiceImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -295,7 +295,9 @@ public class ConversionServiceImpl extends ConversionService {
@NotNull
public ConversionResult convertModule(@NotNull final Project project, @NotNull final File moduleFile) {
final IProjectStore stateStore = ((ProjectImpl)project).getStateStore();
- String projectPath = FileUtil.toSystemDependentName(stateStore.getLocation());
+ final String url = stateStore.getPresentableUrl();
+ assert url != null : project;
+ final String projectPath = FileUtil.toSystemDependentName(url);
if (!isConversionNeeded(projectPath, moduleFile)) {
return ConversionResultImpl.CONVERSION_NOT_NEEDED;
@@ -322,7 +324,7 @@ public class ConversionServiceImpl extends ConversionService {
}
}
context.saveFiles(Collections.singletonList(moduleFile));
- Messages.showInfoMessage(project, IdeBundle.message("message.your.module.was.succesfully.converted.br.old.version.was.saved.to.0", backupFile.getAbsolutePath()),
+ Messages.showInfoMessage(project, IdeBundle.message("message.your.module.was.successfully.converted.br.old.version.was.saved.to.0", backupFile.getAbsolutePath()),
IdeBundle.message("dialog.title.convert.module"));
return new ConversionResultImpl(runners);
}
diff --git a/platform/platform-impl/src/com/intellij/openapi/command/impl/DummyProject.java b/platform/platform-impl/src/com/intellij/openapi/command/impl/DummyProject.java
index c8587a70e4c3..156c0dbaa2e0 100644
--- a/platform/platform-impl/src/com/intellij/openapi/command/impl/DummyProject.java
+++ b/platform/platform-impl/src/com/intellij/openapi/command/impl/DummyProject.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -86,6 +86,11 @@ public class DummyProject extends UserDataHolderBase implements Project {
return null;
}
+ @Override
+ public String getBasePath() {
+ return null;
+ }
+
public void save() {
}
diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/FileBasedStorage.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/FileBasedStorage.java
index 1edab5c1bf5a..356244d76a30 100644
--- a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/FileBasedStorage.java
+++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/FileBasedStorage.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,7 +15,6 @@
*/
package com.intellij.openapi.components.impl.stores;
-
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
@@ -28,7 +27,7 @@ import com.intellij.openapi.components.TrackingPathMacroSubstitutor;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.options.StreamProvider;
import com.intellij.openapi.util.JDOMUtil;
-import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileAdapter;
@@ -78,6 +77,7 @@ public class FileBasedStorage extends XmlElementStorage {
syncRefreshPathRecursively(PathManager.getConfigPath(true), "componentVersions");
}
finally {
+ //noinspection AssignmentToStaticFieldFromInstanceMethod
myConfigDirectoryRefreshed = true;
}
}
@@ -125,10 +125,6 @@ public class FileBasedStorage extends XmlElementStorage {
}
}
- private static boolean isOptionsFile(final String filePath) {
- return FileUtil.isAncestor(new File(PathManager.getOptionsPath()), new File(filePath), false);
- }
-
protected MySaveSession createSaveSession(final MyExternalizationSession externalizationSession) {
return new FileSaveSession(externalizationSession);
}
@@ -162,7 +158,7 @@ public class FileBasedStorage extends XmlElementStorage {
protected void doSave() throws StateStorageException {
if (!myBlockSavingTheContent) {
- if (ApplicationManager.getApplication().isUnitTestMode() && myFile != null && myFile.getPath().startsWith("$")) {
+ if (ApplicationManager.getApplication().isUnitTestMode() && myFile != null && StringUtil.startsWithChar(myFile.getPath(), '$')) {
throw new StateStorageException("It seems like some macros were not expanded for path: " + myFile.getPath());
}
@@ -228,9 +224,8 @@ public class FileBasedStorage extends XmlElementStorage {
return StorageUtil.getVirtualFile(myFile);
}
-
- public IFile getFile() {
- return myFile;
+ public File getFile() {
+ return new File(myFile.getPath());
}
@Nullable
@@ -254,6 +249,7 @@ public class FileBasedStorage extends XmlElementStorage {
}
}
+ @Nullable
private Document processReadException(final Exception e) {
myBlockSavingTheContent = isProjectOrModuleFile();
if (!ApplicationManager.getApplication().isUnitTestMode() && !ApplicationManager.getApplication().isHeadlessEnvironment()) {
diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/IProjectStore.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/IProjectStore.java
index 376c64a10ff1..abc3fbe30928 100644
--- a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/IProjectStore.java
+++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/IProjectStore.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -31,8 +31,6 @@ import java.io.IOException;
import java.util.Set;
public interface IProjectStore extends IComponentStore {
-
-
boolean checkVersion();
void setProjectFilePath(final String filePath);
@@ -40,6 +38,12 @@ public interface IProjectStore extends IComponentStore {
@Nullable
VirtualFile getProjectBaseDir();
+ @Nullable
+ String getProjectBasePath();
+
+ /**
+ * @deprecated please use {@linkplain #getPresentableUrl()} or {@linkplain #getProjectBasePath()} (to remove in IDEA 13).
+ */
@Nullable
String getLocation();
diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/ProjectStoreImpl.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/ProjectStoreImpl.java
index fc45c3d4d4b1..9032270e62a5 100644
--- a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/ProjectStoreImpl.java
+++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/ProjectStoreImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -35,10 +35,8 @@ import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.vfs.LocalFileSystem;
-import com.intellij.openapi.vfs.ReadonlyStatusHandler;
-import com.intellij.openapi.vfs.VfsUtil;
-import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.openapi.vfs.*;
import com.intellij.util.containers.OrderedSet;
import com.intellij.util.io.fs.FileSystem;
import com.intellij.util.io.fs.IFile;
@@ -46,7 +44,6 @@ import org.jdom.Element;
import org.jdom.JDOMException;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
import java.io.*;
import java.lang.annotation.Annotation;
@@ -57,30 +54,31 @@ import java.util.Set;
class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProjectStore {
private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.components.impl.stores.ProjectStoreImpl");
+
@NonNls private static final String OLD_PROJECT_SUFFIX = "_old.";
@NonNls static final String OPTION_WORKSPACE = "workspace";
-
- protected ProjectImpl myProject;
-
@NonNls static final String PROJECT_FILE_MACRO = "PROJECT_FILE";
@NonNls static final String WS_FILE_MACRO = "WORKSPACE_FILE";
@NonNls private static final String PROJECT_CONFIG_DIR = "PROJECT_CONFIG_DIR";
- static final String PROJECT_FILE_STORAGE = "$" + PROJECT_FILE_MACRO + "$";
- static final String WS_FILE_STORAGE = "$" + WS_FILE_MACRO + "$";
- static final String DEFAULT_STATE_STORAGE = PROJECT_FILE_STORAGE;
+ @NonNls static final String PROJECT_FILE_STORAGE = "$" + PROJECT_FILE_MACRO + "$";
+ @NonNls static final String WS_FILE_STORAGE = "$" + WS_FILE_MACRO + "$";
+ @NonNls static final String DEFAULT_STATE_STORAGE = PROJECT_FILE_STORAGE;
static final Storage DEFAULT_STORAGE_ANNOTATION = new MyStorage();
private static int originalVersion = -1;
+ protected ProjectImpl myProject;
private StorageScheme myScheme = StorageScheme.DEFAULT;
private String myCachedLocation;
+ private String myPresentableUrl;
ProjectStoreImpl(final ProjectImpl project) {
super(project);
myProject = project;
}
+ @Override
public boolean checkVersion() {
final ApplicationNamesInfo appNamesInfo = ApplicationNamesInfo.getInstance();
if (originalVersion >= 0 && originalVersion < ProjectManagerImpl.CURRENT_FORMAT_VERSION) {
@@ -130,10 +128,10 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject
private void backup(final VirtualFile projectDir, final VirtualFile vile) throws IOException {
final String oldName = vile.getNameWithoutExtension() + OLD_PROJECT_SUFFIX + vile.getExtension();
- VirtualFile oldFile = projectDir.findOrCreateChildData(this, oldName);
- VfsUtil.saveText(oldFile, VfsUtil.loadText(vile));
+ final VirtualFile oldFile = projectDir.findOrCreateChildData(this, oldName);
+ assert oldFile != null : projectDir + ", " + oldName;
+ VfsUtil.saveText(oldFile, VfsUtilCore.loadText(vile));
}
-
});
}
@@ -147,6 +145,7 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject
return true;
}
+ @Override
public TrackingPathMacroSubstitutor[] getSubstitutors() {
return new TrackingPathMacroSubstitutor[] {getStateStorageManager().getMacroSubstitutor()};
}
@@ -161,79 +160,77 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject
return myProject;
}
+ @Override
public void setProjectFilePath(final String filePath) {
if (filePath == null) {
return;
}
- final IFile iFile = FileSystem.FILE_SYSTEM.createFile(filePath);
final StateStorageManager stateStorageManager = getStateStorageManager();
-
- if (!isIprPath(iFile)) {
- final IFile dir_store =
- iFile.isDirectory()
- ? iFile.getChild(Project.DIRECTORY_STORE_FOLDER)
- : iFile.getParentFile().getChild(Project.DIRECTORY_STORE_FOLDER);
- FileBasedStorage.syncRefreshPathRecursively(dir_store.getPath(), null);
+ final File file = new File(filePath);
+ if (!isIprPath(file)) {
+ final File dirStore = file.isDirectory() ? new File(file, Project.DIRECTORY_STORE_FOLDER)
+ : new File(file.getParentFile(), Project.DIRECTORY_STORE_FOLDER);
+ FileBasedStorage.syncRefreshPathRecursively(dirStore.getPath(), null);
myScheme = StorageScheme.DIRECTORY_BASED;
+ stateStorageManager.addMacro(PROJECT_FILE_MACRO, new File(dirStore, "misc.xml").getPath());
- stateStorageManager.addMacro(PROJECT_FILE_MACRO, dir_store.getChild("misc.xml").getPath());
- final IFile ws = dir_store.getChild("workspace.xml");
+ final File ws = new File(dirStore, "workspace.xml");
stateStorageManager.addMacro(WS_FILE_MACRO, ws.getPath());
- if (!ws.exists() && !iFile.isDirectory()) {
+ if (!ws.exists() && !file.isDirectory()) {
useOldWsContent(filePath, ws);
}
- stateStorageManager.addMacro(PROJECT_CONFIG_DIR, dir_store.getPath());
- } else {
+ stateStorageManager.addMacro(PROJECT_CONFIG_DIR, dirStore.getPath());
+ }
+ else {
+ LocalFileSystem.getInstance().refreshAndFindFileByPath(filePath);
+
myScheme = StorageScheme.DEFAULT;
stateStorageManager.addMacro(PROJECT_FILE_MACRO, filePath);
- LocalFileSystem.getInstance().refreshAndFindFileByPath(filePath);
-
- int lastDot = filePath.lastIndexOf(".");
- final String filePathWithoutExt = lastDot > 0 ? filePath.substring(0, lastDot) : filePath;
- String workspacePath = filePathWithoutExt + WorkspaceFileType.DOT_DEFAULT_EXTENSION;
-
+ final String workspacePath = composeWsPath(filePath);
LocalFileSystem.getInstance().refreshAndFindFileByPath(workspacePath);
stateStorageManager.addMacro(WS_FILE_MACRO, workspacePath);
}
myCachedLocation = null;
- }
-
- private static boolean isIprPath(final IFile file) {
- return file.getName().indexOf(".") > 0 && ProjectFileType.DEFAULT_EXTENSION.equals(FileUtil.getExtension(file.getName()));
+ myPresentableUrl = null;
}
- private static void useOldWsContent(final String filePath, final IFile ws) {
- int lastDot = filePath.lastIndexOf(".");
+ private static boolean isIprPath(final File file) {
+ final String name = file.getName();
+ return name.indexOf(".") > 0 && ProjectFileType.DEFAULT_EXTENSION.equals(FileUtil.getExtension(name));
+ }
+
+ private static String composeWsPath(String filePath) {
+ final int lastDot = filePath.lastIndexOf(".");
final String filePathWithoutExt = lastDot > 0 ? filePath.substring(0, lastDot) : filePath;
- String workspacePath = filePathWithoutExt + WorkspaceFileType.DOT_DEFAULT_EXTENSION;
- IFile oldWs = FileSystem.FILE_SYSTEM.createFile(workspacePath);
+ return filePathWithoutExt + WorkspaceFileType.DOT_DEFAULT_EXTENSION;
+ }
+
+ private static void useOldWsContent(final String filePath, final File ws) {
+ final File oldWs = new File(composeWsPath(filePath));
if (oldWs.exists()) {
try {
- final InputStream is = oldWs.openInputStream();
- final byte[] bytes;
-
+ final InputStream is = new FileInputStream(oldWs);
try {
- bytes = FileUtil.loadBytes(is, (int)oldWs.length());
+ final byte[] bytes = FileUtil.loadBytes(is, (int)oldWs.length());
+
+ final OutputStream os = new FileOutputStream(ws);
+ try {
+ os.write(bytes);
+ }
+ finally {
+ os.close();
+ }
}
finally {
is.close();
}
-
- final OutputStream os = ws.openOutputStream();
- try {
- os.write(bytes);
- }
- finally {
- os.close();
- }
-
}
catch (IOException e) {
LOG.error(e);
@@ -241,24 +238,37 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject
}
}
- @Nullable
+ @Override
public VirtualFile getProjectBaseDir() {
- final VirtualFile projectFile = getProjectFile();
- if (projectFile != null) return myScheme == StorageScheme.DEFAULT ? projectFile.getParent() : projectFile.getParent().getParent();
+ if (myProject.isDefault()) return null;
+
+ final String path = getProjectBasePath();
+ if (path == null) return null;
+
+ return LocalFileSystem.getInstance().findFileByPath(path);
+ }
+
+ @Override
+ public String getProjectBasePath() {
+ if (myProject.isDefault()) return null;
+
+ final String path = getProjectFilePath();
+ if (!StringUtil.isEmptyOrSpaces(path)) {
+ return myScheme == StorageScheme.DEFAULT ? new File(path).getParent() : new File(path).getParentFile().getParent();
+ }
//we are not yet initialized completely ("open directory", etc)
final StateStorage s = getStateStorageManager().getFileStateStorage(PROJECT_FILE_STORAGE);
if (!(s instanceof FileBasedStorage)) return null;
final FileBasedStorage storage = (FileBasedStorage)s;
- final IFile file = storage.getFile();
+ final File file = storage.getFile();
if (file == null) return null;
- return LocalFileSystem.getInstance()
- .findFileByIoFile(myScheme == StorageScheme.DEFAULT ? file.getParentFile() : file.getParentFile().getParentFile());
+ return myScheme == StorageScheme.DEFAULT ? file.getParent() : file.getParentFile().getParent();
}
- @Nullable
+ @Override
public String getLocation() {
if (myCachedLocation == null) {
if (myScheme == StorageScheme.DEFAULT) {
@@ -274,79 +284,70 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject
}
@NotNull
+ @Override
public String getProjectName() {
if (myScheme == StorageScheme.DIRECTORY_BASED) {
final VirtualFile baseDir = getProjectBaseDir();
- assert baseDir != null : "project file: " + (getProjectFile() == null ? "[NULL]" : getProjectFile().getPath());
+ assert baseDir != null : "project file: " + getProjectFile();
final VirtualFile ideaDir = baseDir.findChild(".idea");
if (ideaDir != null && ideaDir.isValid()) {
final VirtualFile nameFile = ideaDir.findChild(".name");
if (nameFile != null && nameFile.isValid()) {
- BufferedReader in = null;
try {
- in = new BufferedReader(new InputStreamReader(nameFile.getInputStream(), "UTF-8"));
- final String name = in.readLine();
- if (name != null && name.length() > 0) return name.trim();
- }
- catch (IOException e) {
- // ignore
- }
- finally {
- if (in != null) {
- try {
- in.close();
- }
- catch (IOException e) {
- // ignore
+ BufferedReader in = new BufferedReader(new InputStreamReader(nameFile.getInputStream(), "UTF-8"));
+ try {
+ final String name = in.readLine();
+ if (name != null && name.length() > 0) {
+ return name.trim();
}
}
+ finally {
+ in.close();
+ }
}
+ catch (IOException ignored) { }
}
}
-
return baseDir.getName().replace(":", "");
}
-
- String temp = getProjectFileName();
- FileType fileType = FileTypeManager.getInstance().getFileTypeByFileName(temp);
- if (fileType instanceof ProjectFileType) {
- temp = temp.substring(0, temp.length() - fileType.getDefaultExtension().length()-1);
+ else {
+ String temp = getProjectFileName();
+ FileType fileType = FileTypeManager.getInstance().getFileTypeByFileName(temp);
+ if (fileType instanceof ProjectFileType) {
+ temp = temp.substring(0, temp.length() - fileType.getDefaultExtension().length()-1);
+ }
+ final int i = temp.lastIndexOf(File.separatorChar);
+ if (i >= 0) {
+ temp = temp.substring(i + 1, temp.length() - i + 1);
+ }
+ return temp;
}
- final int i = temp.lastIndexOf(File.separatorChar);
- if (i >= 0) {
- temp = temp.substring(i + 1, temp.length() - i + 1);
- }
- return temp;
}
@NotNull
+ @Override
public StorageScheme getStorageScheme() {
return myScheme;
}
- @Nullable
+ @Override
public String getPresentableUrl() {
if (myProject.isDefault()) return null;
- if (myScheme == StorageScheme.DIRECTORY_BASED) {
- final VirtualFile baseDir = getProjectBaseDir();
- return baseDir != null ? baseDir.getPresentableUrl() : null;
- }
- else {
- if (myProject.isDefault()) return null;
- final FileBasedStorage storage = (FileBasedStorage)getStateStorageManager().getFileStateStorage(PROJECT_FILE_STORAGE);
- assert storage != null;
- return storage.getFilePath().replace('/', File.separatorChar);
+ if (myPresentableUrl == null) {
+ final String url = myScheme == StorageScheme.DIRECTORY_BASED ? getProjectBasePath() : getProjectFilePath();
+ myPresentableUrl = url != null ? FileUtil.toSystemDependentName(url) : url;
}
+ return myPresentableUrl;
}
+ @Override
public void loadProject() throws IOException, JDOMException, InvalidDataException, StateStorageException {
- //load();
myProject.init();
}
- @Nullable
+ @Override
public VirtualFile getProjectFile() {
if (myProject.isDefault()) return null;
final FileBasedStorage storage = (FileBasedStorage)getStateStorageManager().getFileStateStorage(PROJECT_FILE_STORAGE);
@@ -354,7 +355,7 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject
return storage.getVirtualFile();
}
- @Nullable
+ @Override
public VirtualFile getWorkspaceFile() {
if (myProject.isDefault()) return null;
final FileBasedStorage storage = (FileBasedStorage)getStateStorageManager().getFileStateStorage(WS_FILE_STORAGE);
@@ -362,6 +363,7 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject
return storage.getVirtualFile();
}
+ @Override
public void loadProjectFromTemplate(final ProjectImpl defaultProject) {
final StateStorage stateStorage = getStateStorageManager().getFileStateStorage(DEFAULT_STATE_STORAGE);
@@ -379,6 +381,7 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject
}
@NotNull
+ @Override
public String getProjectFileName() {
final FileBasedStorage storage = (FileBasedStorage)getStateStorageManager().getFileStateStorage(PROJECT_FILE_STORAGE);
assert storage != null;
@@ -386,20 +389,22 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject
}
@NotNull
+ @Override
public String getProjectFilePath() {
if (myProject.isDefault()) return "";
-
final FileBasedStorage storage = (FileBasedStorage)getStateStorageManager().getFileStateStorage(PROJECT_FILE_STORAGE);
assert storage != null;
return storage.getFilePath();
}
+ @Override
protected XmlElementStorage getMainStorage() {
final XmlElementStorage storage = (XmlElementStorage)getStateStorageManager().getFileStateStorage(DEFAULT_STATE_STORAGE);
assert storage != null;
return storage;
}
+ @Override
protected StateStorageManager createStateStorageManager() {
return new ProjectStateStorageManager(PathMacroManager.getInstance(getComponentManager()).createTrackingSubstitutor(), myProject);
}
@@ -424,7 +429,6 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject
}
static class WsStorageData extends ProjectStorageData {
-
WsStorageData(final String rootElementName, final Project project) {
super(rootElementName, project);
}
@@ -449,6 +453,7 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject
protected void load(@NotNull final Element root) throws IOException {
final String v = root.getAttributeValue(VERSION_OPTION);
+ //noinspection AssignmentToStaticFieldFromInstanceMethod
originalVersion = v != null ? Integer.parseInt(v) : 0;
if (originalVersion != ProjectManagerImpl.CURRENT_FORMAT_VERSION) {
@@ -466,12 +471,12 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject
}
}
+ @Override
protected SaveSessionImpl createSaveSession() throws StateStorageException {
return new ProjectSaveSession();
}
protected class ProjectSaveSession extends SaveSessionImpl {
-
ProjectSaveSession() throws StateStorageException {
}
@@ -533,7 +538,7 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject
List readonlyFiles = new ArrayList();
- if (((ProjectImpl)myProject).isToSaveProjectName()) {
+ if (myProject.isToSaveProjectName()) {
final VirtualFile baseDir = getProjectBaseDir();
if (baseDir != null && baseDir.isValid()) {
filesToSave.add(FileSystem.FILE_SYSTEM
@@ -627,14 +632,15 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject
}
};
- @Nullable
+ @Override
protected StateStorageChooser getDefaultStateStorageChooser() {
return myStateStorageChooser;
}
@NotNull
- protected Storage[] getComponentStorageSpecs(@NotNull final PersistentStateComponent persistentStateComponent, final StateStorageOperation operation) throws
- StateStorageException {
+ @Override
+ protected Storage[] getComponentStorageSpecs(@NotNull final PersistentStateComponent persistentStateComponent,
+ final StateStorageOperation operation) throws StateStorageException {
Storage[] result = super.getComponentStorageSpecs(persistentStateComponent, operation);
if (operation == StateStorageOperation.READ) {
@@ -647,6 +653,7 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject
return result;
}
+ @SuppressWarnings("ClassExplicitlyAnnotation")
private static class MyStorage implements Storage {
public String id() {
return "___Default___";
@@ -716,7 +723,6 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject
}
}
-
return true;
}
}
diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java
index 8d3c6c24b150..5280652f8858 100644
--- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java
+++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2011 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -71,7 +71,6 @@ import java.io.IOException;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
-
public class ProjectImpl extends ComponentManagerImpl implements ProjectEx {
private static final Logger LOG = Logger.getInstance("#com.intellij.project.impl.ProjectImpl");
private static final String PLUGIN_SETTINGS_ERROR = "Plugin Settings Error";
@@ -103,10 +102,14 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx {
myOptimiseTestLoadSpeed = isOptimiseTestLoadSpeed;
myManager = manager;
+
myName = isDefault() ? TEMPLATE_PROJECT_NAME : projectName == null ? getStateStore().getProjectName() : projectName;
- if (!isDefault() && projectName != null && getStateStore().getStorageScheme().equals(StorageScheme.DIRECTORY_BASED)) myOldName = ""; // new project
+ if (!isDefault() && projectName != null && getStateStore().getStorageScheme().equals(StorageScheme.DIRECTORY_BASED)) {
+ myOldName = ""; // new project
+ }
}
+ @Override
public void setProjectName(@NotNull String projectName) {
if (!projectName.equals(myName)) {
myOldName = myName;
@@ -175,6 +178,7 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx {
}
@NotNull
+ @Override
public synchronized IProjectStore getStateStore() {
if (myComponentStore == null) {
myComponentStore = (IProjectStore)getPicoContainer().getComponentInstance(IComponentStore.class);
@@ -196,10 +200,12 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx {
getStateStore().initComponent(component, service);
}
+ @Override
public boolean isOpen() {
return ProjectManagerEx.getInstanceEx().isProjectOpened(this);
}
+ @Override
public boolean isInitialized() {
return isOpen() && !isDisposed() && StartupManagerEx.getInstanceEx(this).startupActivityPassed();
}
@@ -217,40 +223,49 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx {
return getStateStore().getProjectFilePath();
}
-
- @Nullable
+ @Override
public VirtualFile getProjectFile() {
return getStateStore().getProjectFile();
}
- @Nullable
+ @Override
public VirtualFile getBaseDir() {
return getStateStore().getProjectBaseDir();
}
+ @Override
+ public String getBasePath() {
+ return getStateStore().getProjectBasePath();
+ }
+
@NotNull
+ @Override
public String getName() {
return myName;
}
- @Nullable
@NonNls
+ @Override
public String getPresentableUrl() {
+ if (myName == null) return null; // not yet initialized
return getStateStore().getPresentableUrl();
}
@NotNull
@NonNls
+ @Override
public String getLocationHash() {
String str = getPresentableUrl();
if (str == null) str = getName();
- final String prefix = getStateStore().getStorageScheme() == StorageScheme.DIRECTORY_BASED? "" : getName();
+ final String prefix = getStateStore().getStorageScheme() == StorageScheme.DIRECTORY_BASED ? "" : getName();
return prefix + Integer.toHexString(str.hashCode());
}
+ @SuppressWarnings("deprecation")
@Nullable
@NonNls
+ @Override
public String getLocation() {
if (myName == null) return null; // was called before initialized
return isDisposed() ? null : getStateStore().getLocation();
@@ -261,15 +276,17 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx {
return getStateStore().getWorkspaceFile();
}
+ @Override
public boolean isOptimiseTestLoadSpeed() {
return myOptimiseTestLoadSpeed;
}
+ @Override
public void setOptimiseTestLoadSpeed(final boolean optimiseTestLoadSpeed) {
myOptimiseTestLoadSpeed = optimiseTestLoadSpeed;
}
-
+ @Override
public void init() {
long start = System.currentTimeMillis();
// ProfilingUtil.startCPUProfiling();
@@ -297,6 +314,7 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx {
return false;
}
+ @Override
public void save() {
if (ApplicationManagerEx.getApplicationEx().isDoNotSave()) return; //no need to save
@@ -327,11 +345,14 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx {
}
catch (PluginException e) {
PluginManager.disablePlugin(e.getPluginId().getIdString());
- Notifications.Bus.notify(new Notification(PLUGIN_SETTINGS_ERROR, "Unable to save plugin settings!",
- "The plugin " + e.getPluginId() + " failed to save settings and has been disabled. Please restart" +
- ApplicationNamesInfo.getInstance().getFullProductName() + "
" +
- (ApplicationManagerEx.getApplicationEx().isInternal() ? "" + StringUtil.getThrowableText(e) + "
": ""),
- NotificationType.ERROR), NotificationDisplayType.BALLOON, this);
+ Notification notification = new Notification(
+ PLUGIN_SETTINGS_ERROR,
+ "Unable to save plugin settings!",
+ "The plugin " + e.getPluginId() + " failed to save settings and has been disabled. Please restart" +
+ ApplicationNamesInfo.getInstance().getFullProductName() + "
" +
+ (ApplicationManagerEx.getApplicationEx().isInternal() ? "" + StringUtil.getThrowableText(e) + "
" : ""),
+ NotificationType.ERROR);
+ Notifications.Bus.notify(notification, this);
LOG.info("Unable to save plugin settings",e);
}
catch (IOException e) {
@@ -344,6 +365,7 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx {
}
}
+ @Override
public synchronized void dispose() {
ApplicationEx application = ApplicationManagerEx.getApplicationEx();
assert application.isWriteAccessAllowed(); // dispose must be under write action
@@ -382,7 +404,6 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx {
}
}
}
-
private void projectClosed() {
List components = new ArrayList(Arrays.asList(getComponents(ProjectComponent.class)));
@@ -397,6 +418,7 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx {
}
}
+ @Override
public T[] getExtensions(final ExtensionPointName extensionPointName) {
return Extensions.getArea(this).getExtensionPoint(extensionPointName).getExtensions();
}
@@ -423,10 +445,12 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx {
return Extensions.getArea(this).getPicoContainer();
}
+ @Override
public boolean isDefault() {
return false;
}
+ @Override
public void checkUnknownMacros(final boolean showDialog) {
final IProjectStore stateStore = getStateStore();
@@ -472,7 +496,7 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx {
});
}
else {
- if (Messages.showYesNoDialog(this, "Component could not be reloaded. Reload project?", "Configuration changed",
+ if (Messages.showYesNoDialog(this, "Component could not be reloaded. Reload project?", "Configuration Changed",
Messages.getQuestionIcon()) == 0) {
ProjectManagerEx.getInstanceEx().reloadProject(this);
}
@@ -483,13 +507,12 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx {
}
@Override
- public String toString() {
- return "Project"
- + (isDisposed() ? " (Disposed" + (temporarilyDisposed ? " temporarily" : "") + ")"
- :isDefault() ? "" : " '" + getLocation()+"'")
- + (isDefault() ? " (Default)" : "")
- + " " + myName
- ;
+ public String toString() {
+ return "Project" +
+ (isDisposed() ? " (Disposed" + (temporarilyDisposed ? " temporarily" : "") + ")"
+ : isDefault() ? "" : " '" + getPresentableUrl() + "'") +
+ (isDefault() ? " (Default)" : "") +
+ " " + myName;
}
@Override
diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/PlatformFrameTitleBuilder.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/PlatformFrameTitleBuilder.java
index cf824c6cf6f6..468e749a9597 100644
--- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/PlatformFrameTitleBuilder.java
+++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/PlatformFrameTitleBuilder.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -35,6 +35,7 @@ public class PlatformFrameTitleBuilder extends FrameTitleBuilder {
return project.getName() + " - [" + FileUtil.getLocationRelativeToUserHome(baseDir.getPresentableUrl()) + "]";
}
+
return project.getName();
}
diff --git a/platform/platform-resources-en/src/messages/IdeBundle.properties b/platform/platform-resources-en/src/messages/IdeBundle.properties
index 77fc75407f13..f4f0d19b1e0c 100644
--- a/platform/platform-resources-en/src/messages/IdeBundle.properties
+++ b/platform/platform-resources-en/src/messages/IdeBundle.properties
@@ -708,7 +708,7 @@ prompt.select.module.file.to.import=Select {0} module file (.iml) to import
message.module.file.has.an.older.format.do.you.want.to.convert.it=Module file has an older format. Do you want to convert it?
dialog.title.convert.module=Convert Module
error.message.cannot.modify.file.0=Cannot modify file ''{0}''
-message.your.module.was.succesfully.converted.br.old.version.was.saved.to.0=Your module was successfully converted.
\
+message.your.module.was.successfully.converted.br.old.version.was.saved.to.0=Your module was successfully converted.
\
Old version was saved to ''{0}''
label.select.module.type=Module type:
error.please.specify.path.to.module.file=Please specify path to {0} module file (.iml)
diff --git a/platform/testFramework/src/com/intellij/mock/MockProjectStore.java b/platform/testFramework/src/com/intellij/mock/MockProjectStore.java
index 8efc9ba48ed6..af32d43cdc3b 100644
--- a/platform/testFramework/src/com/intellij/mock/MockProjectStore.java
+++ b/platform/testFramework/src/com/intellij/mock/MockProjectStore.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -29,10 +29,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
-import java.util.Collection;
-import java.util.List;
import java.util.Set;
-import java.util.TreeSet;
/**
* @author peter
@@ -64,10 +61,14 @@ public class MockProjectStore implements IProjectStore {
}
@Override
- @Nullable
public VirtualFile getProjectBaseDir() {
throw new UnsupportedOperationException("Method getProjectBaseDir is not yet implemented in " + getClass().getName());
- }//------ This methods should be got rid of
+ }
+
+ @Override
+ public String getProjectBasePath() {
+ throw new UnsupportedOperationException("Method getProjectBasePath is not yet implemented in " + getClass().getName());
+ }
@Override
public String getLocation() {
@@ -117,18 +118,7 @@ public class MockProjectStore implements IProjectStore {
@Override
@NotNull
public String getProjectFilePath() {
- return null;
- }
-
- public void setUsedMacros(@NotNull Collection macros) {
- }
-
- public Set getMacroTrackingSet() {
- return new TreeSet();
- }
-
- public void initStore() {
- throw new UnsupportedOperationException("Method initStore is not yet implemented in " + getClass().getName());
+ throw new UnsupportedOperationException("Method getProjectFilePath is not yet implemented in " + getClass().getName());
}
@Override
@@ -149,20 +139,12 @@ public class MockProjectStore implements IProjectStore {
throw new UnsupportedOperationException("Method load is not yet implemented in " + getClass().getName());
}
- public Collection getUsedMacros() {
- throw new UnsupportedOperationException("Method getUsedMacros not implemented in " + getClass());
- }
-
@Override
@NotNull
public SaveSession startSave() throws IOException {
throw new UnsupportedOperationException("Method startSave not implemented in " + getClass());
}
- public List getAllStorageFilesToSave(final boolean includingSubStructures) {
- throw new UnsupportedOperationException("Method getAllStorageFilesToSave is not yet implemented in " + getClass().getName());
- }
-
@Override
@Nullable
public String getPresentableUrl() {
From 3fbcc7c19fd0675ce7461bc99871f5bd4bb3ad7b Mon Sep 17 00:00:00 2001
From: Roman Shevchenko
Date: Mon, 20 Feb 2012 15:08:21 +0100
Subject: [PATCH 08/17] Cleanup
---
.../intellij/openapi/project/ProjectUtil.java | 15 ++---
.../ide/projectView/impl/ProjectViewImpl.java | 58 +------------------
.../com/intellij/ide/impl/ProjectUtil.java | 35 ++++++-----
.../intellij/openapi/util/io/FileUtil.java | 8 +--
4 files changed, 32 insertions(+), 84 deletions(-)
diff --git a/platform/lang-api/src/com/intellij/openapi/project/ProjectUtil.java b/platform/lang-api/src/com/intellij/openapi/project/ProjectUtil.java
index cd22a9b403f6..f17e68759dcb 100644
--- a/platform/lang-api/src/com/intellij/openapi/project/ProjectUtil.java
+++ b/platform/lang-api/src/com/intellij/openapi/project/ProjectUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,10 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-/*
- * @author max
- */
package com.intellij.openapi.project;
import com.intellij.ide.DataManager;
@@ -40,16 +36,17 @@ import org.jetbrains.annotations.Nullable;
import javax.swing.*;
+/**
+ * @author max
+ */
public class ProjectUtil {
@NonNls public static final String DIRECTORY_BASED_PROJECT_DIR = ".idea";
- private ProjectUtil() {
- }
+ private ProjectUtil() { }
@Nullable
public static String getProjectLocationString(@NotNull final Project project) {
- String projectPath = project.getLocation();
- return FileUtil.getLocationRelativeToUserHome(projectPath);
+ return FileUtil.getLocationRelativeToUserHome(project.getBasePath());
}
public static String calcRelativeToProjectPath(final VirtualFile file, final Project project, final boolean includeFilePath) {
diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewImpl.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewImpl.java
index 1f18a4de9dcd..73589cae29d7 100644
--- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewImpl.java
+++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2011 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -39,7 +39,6 @@ import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
-import com.intellij.openapi.application.ex.ApplicationInfoEx;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.ServiceManager;
@@ -61,7 +60,6 @@ import com.intellij.openapi.ui.SimpleToolWindowPanel;
import com.intellij.openapi.ui.SplitterProportionsData;
import com.intellij.openapi.ui.popup.PopupChooserBuilder;
import com.intellij.openapi.util.*;
-import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.JarFileSystem;
import com.intellij.openapi.vfs.LocalFileSystem;
@@ -75,6 +73,7 @@ import com.intellij.openapi.wm.impl.content.ToolWindowContentUi;
import com.intellij.psi.*;
import com.intellij.psi.impl.file.PsiDirectoryFactory;
import com.intellij.psi.util.PsiUtilBase;
+import com.intellij.psi.util.PsiUtilCore;
import com.intellij.ui.AutoScrollFromSourceHandler;
import com.intellij.ui.AutoScrollToSourceHandler;
import com.intellij.ui.GuiUtils;
@@ -157,7 +156,6 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
@Deprecated static final String PROJECT_VIEW_DATA_CONSTANT = DATA_KEY.getName();
private DefaultActionGroup myActionGroup;
- private final Runnable myTreeChangeListener;
private String mySavedPaneId = ProjectViewPane.ID;
private String mySavedPaneSubId;
//private static final Icon COMPACT_EMPTY_MIDDLE_PACKAGES_ICON = IconLoader.getIcon("/objectBrowser/compactEmptyPackages.png");
@@ -200,11 +198,6 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
Disposer.register(myProject, this);
myFileEditorManager = fileEditorManager;
- myTreeChangeListener = new Runnable() {
- public void run() {
- updateToolWindowTitle();
- }
- };
myConnection = project.getMessageBus().connect();
myConnection.subscribe(ProjectTopics.PROJECT_ROOTS, new ModuleRootListener() {
@@ -474,15 +467,13 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
createToolbarActions();
updateTitleActions();
- newPane.setTreeChangeListener(myTreeChangeListener);
myAutoScrollToSourceHandler.install(newPane.myTree);
IdeFocusManager.getInstance(myProject).requestFocus(newPane.getComponentToFocus(), false);
- updateToolWindowTitle();
newPane.restoreExpandedPaths();
if (selectedPsiElement != null) {
- final VirtualFile virtualFile = PsiUtilBase.getVirtualFile(selectedPsiElement);
+ final VirtualFile virtualFile = PsiUtilCore.getVirtualFile(selectedPsiElement);
if (virtualFile != null && ((ProjectViewSelectInTarget)newPane.createSelectInTarget()).isSubIdSelectable(newSubId, new SelectInContext() {
@NotNull
public Project getProject() {
@@ -754,49 +745,6 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
return myCurrentViewId;
}
- private void updateToolWindowTitle() {
- if (true) return;
- ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(myProject);
- ToolWindow toolWindow = toolWindowManager == null ? null : toolWindowManager.getToolWindow(ToolWindowId.PROJECT_VIEW);
- if (toolWindow == null) return;
- String title = null;
- final AbstractProjectViewPane pane = getCurrentProjectViewPane();
- if (pane != null) {
- final DefaultMutableTreeNode selectedNode = pane.getSelectedNode();
- if (selectedNode != null) {
- final Object o = selectedNode.getUserObject();
- if (o instanceof ProjectViewNode) {
- title = ((ProjectViewNode)o).getTitle();
- }
- }
- }
- if (title == null) {
- if (true) return;
-
- final PsiElement element = (PsiElement)myDataProvider.getData(LangDataKeys.PSI_ELEMENT.getName());
- if (element != null) {
- PsiFile file = element.getContainingFile();
- if (file != null) {
- title = FileUtil.getLocationRelativeToUserHome(file.getVirtualFile().getPresentableUrl());
- }
- else if (element instanceof PsiDirectory) {
- title = PsiDirectoryFactory.getInstance(myProject).getQualifiedName((PsiDirectory) element, true);
- }
- else {
- title = element.toString();
- }
- }
- else {
- title = "";
- if (myProject != null) {
- title = FileUtil.getLocationRelativeToUserHome(myProject.getPresentableUrl());
- }
- }
- }
-
- toolWindow.setTitle(title);
- }
-
public PsiElement getParentOfCurrentSelection() {
final AbstractProjectViewPane viewPane = getCurrentProjectViewPane();
if (viewPane == null) {
diff --git a/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java b/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java
index f304cf85b715..1e1dfef7ea35 100644
--- a/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java
+++ b/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,14 +18,12 @@ package com.intellij.ide.impl;
import com.intellij.CommonBundle;
import com.intellij.ide.GeneralSettings;
import com.intellij.ide.IdeBundle;
-import com.intellij.ide.highlighter.InternalFileType;
import com.intellij.ide.highlighter.ProjectFileType;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.components.StorageScheme;
import com.intellij.openapi.components.impl.stores.IProjectStore;
import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.project.ex.ProjectEx;
@@ -53,13 +51,12 @@ import java.io.IOException;
public class ProjectUtil {
private static final Logger LOG = Logger.getInstance("#com.intellij.ide.impl.ProjectUtil");
- private ProjectUtil() {
- }
+ private ProjectUtil() { }
public static void updateLastProjectLocation(final String projectFilePath) {
File lastProjectLocation = new File(projectFilePath);
if (lastProjectLocation.isFile()) {
- lastProjectLocation = lastProjectLocation.getParentFile(); //for directory based project storages
+ lastProjectLocation = lastProjectLocation.getParentFile(); // for directory-based project storage
}
if (lastProjectLocation == null) { // the immediate parent of the ipr file
return;
@@ -205,19 +202,23 @@ public class ProjectUtil {
if (confirmOpenNewProject == GeneralSettings.OPEN_PROJECT_ASK) {
if (isNewProject) {
int exitCode = Messages.showYesNoDialog(IdeBundle.message("prompt.open.project.in.new.frame"),
- IdeBundle.message("title.new.project"),
- IdeBundle.message("button.existingframe"),
- IdeBundle.message("button.newframe"),
- Messages.getQuestionIcon(), new ProjectNewWindowDoNotAskOption());
+ IdeBundle.message("title.new.project"),
+ IdeBundle.message("button.existingframe"),
+ IdeBundle.message("button.newframe"),
+ Messages.getQuestionIcon(),
+ new ProjectNewWindowDoNotAskOption());
return exitCode == 0 ? GeneralSettings.OPEN_PROJECT_SAME_WINDOW : GeneralSettings.OPEN_PROJECT_NEW_WINDOW;
}
else {
int exitCode = Messages.showYesNoCancelDialog(IdeBundle.message("prompt.open.project.in.new.frame"),
- IdeBundle.message("title.open.project"),
- IdeBundle.message("button.existingframe"), IdeBundle.message("button.newframe"),
- CommonBundle.getCancelButtonText(), Messages.getQuestionIcon(),
- new ProjectNewWindowDoNotAskOption());
- return exitCode == 0 ? GeneralSettings.OPEN_PROJECT_SAME_WINDOW : exitCode == 1 ? GeneralSettings.OPEN_PROJECT_NEW_WINDOW : Messages.CANCEL;
+ IdeBundle.message("title.open.project"),
+ IdeBundle.message("button.existingframe"),
+ IdeBundle.message("button.newframe"),
+ CommonBundle.getCancelButtonText(),
+ Messages.getQuestionIcon(),
+ new ProjectNewWindowDoNotAskOption());
+ return exitCode == 0 ? GeneralSettings.OPEN_PROJECT_SAME_WINDOW :
+ exitCode == 1 ? GeneralSettings.OPEN_PROJECT_NEW_WINDOW : Messages.CANCEL;
}
}
return confirmOpenNewProject;
@@ -265,6 +266,10 @@ public class ProjectUtil {
}
}
+ /**
+ * @deprecated use {@linkplain com.intellij.openapi.project.ProjectUtil#isProjectOrWorkspaceFile(com.intellij.openapi.vfs.VirtualFile)} (to remove in IDEA 13)
+ */
+ @SuppressWarnings("UnusedDeclaration")
public static boolean isProjectOrWorkspaceFile(final VirtualFile file) {
return com.intellij.openapi.project.ProjectUtil.isProjectOrWorkspaceFile(file);
}
diff --git a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java
index 2140094c72dc..96aef7f4b09a 100644
--- a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java
+++ b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java
@@ -1290,17 +1290,15 @@ public class FileUtil {
public static String getLocationRelativeToUserHome(final String path) {
if (path == null) return null;
- String _path = path;
-
- if (SystemInfo.isLinux || SystemInfo.isMac) {
+ if (SystemInfo.isUnix) {
final File projectDir = new File(path);
final File userHomeDir = new File(SystemProperties.getUserHome());
if (isAncestor(userHomeDir, projectDir, true)) {
- _path = "~/" + getRelativePath(userHomeDir, projectDir);
+ return "~/" + getRelativePath(userHomeDir, projectDir);
}
}
- return _path;
+ return path;
}
public static boolean isHashBangLine(CharSequence firstCharsIfText, String marker) {
From 6390969c3c6cbfd07b52b1293cb4f460d3fce5a4 Mon Sep 17 00:00:00 2001
From: Roman Shevchenko
Date: Mon, 20 Feb 2012 16:02:48 +0100
Subject: [PATCH 09/17] Funniest typo so far :)
---
bin/scripts/unix/idea.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/bin/scripts/unix/idea.sh b/bin/scripts/unix/idea.sh
index 6b63c1264612..0da33fa5eb4f 100755
--- a/bin/scripts/unix/idea.sh
+++ b/bin/scripts/unix/idea.sh
@@ -8,7 +8,7 @@
OS_TYPE="`uname -s`"
# ---------------------------------------------------------------------
-# Locate a JDK installation directory which will be used to ruin the IDE.
+# Locate a JDK installation directory which will be used to run the IDE.
# Try (in order): @@product_uc@@_JDK, JDK_HOME, JAVA_HOME, "java" in PATH.
# ---------------------------------------------------------------------
if [ -n "$@@product_uc@@_JDK" -a -x "$@@product_uc@@_JDK/bin/java" ]; then
From 6f30544354d1f7382e70012c666748824fe4fefb Mon Sep 17 00:00:00 2001
From: Roman Shevchenko
Date: Mon, 20 Feb 2012 18:50:12 +0100
Subject: [PATCH 10/17] Project API usages corrected (part 1)
---
.../com/intellij/openapi/project/Project.java | 3 +--
.../src/com/intellij/analysis/AnalysisScope.java | 16 ++++++++++------
2 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/platform/core-api/src/com/intellij/openapi/project/Project.java b/platform/core-api/src/com/intellij/openapi/project/Project.java
index 1a562fbf6b47..bb57840075f1 100644
--- a/platform/core-api/src/com/intellij/openapi/project/Project.java
+++ b/platform/core-api/src/com/intellij/openapi/project/Project.java
@@ -83,10 +83,9 @@ public interface Project extends ComponentManager, AreaInstance {
/**
* Returns presentable project path:
- * {@linkplain #getProjectFilePath()} for file-based projects, {@linkplain #getLocation()} for directory-based ones.
+ * {@linkplain #getProjectFilePath()} for file-based projects, {@linkplain #getBasePath()} for directory-based ones.
*
* @return presentable project path
- * todo: check usages
*/
@Nullable
@NonNls
diff --git a/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java b/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java
index 2358db74dd8e..8d0539de8f66 100644
--- a/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java
+++ b/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -429,15 +429,13 @@ public class AnalysisScope {
return AnalysisScopeBundle.message("scope.module.list", modules, Integer.valueOf(myModules.size()));
case PROJECT:
- return AnalysisScopeBundle.message("scope.project", pathToName(myProject.getPresentableUrl()));
+ return AnalysisScopeBundle.message("scope.project", myProject.getName());
case FILE:
- final VirtualFile virtualFile = ((PsiFileSystemItem)myElement).getVirtualFile();
- LOG.assertTrue(virtualFile != null);
- return AnalysisScopeBundle.message("scope.file", virtualFile.getPresentableUrl());
+ return AnalysisScopeBundle.message("scope.file", getPresentableUrl((PsiFileSystemItem)myElement));
case DIRECTORY:
- return AnalysisScopeBundle.message("scope.directory", ((PsiFileSystemItem)myElement).getVirtualFile().getPresentableUrl());
+ return AnalysisScopeBundle.message("scope.directory", getPresentableUrl((PsiFileSystemItem)myElement));
case VIRTUAL_FILES:
return AnalysisScopeBundle.message("scope.virtual.files");
@@ -446,6 +444,12 @@ public class AnalysisScope {
return "";
}
+ private static String getPresentableUrl(final PsiFileSystemItem element) {
+ final VirtualFile virtualFile = element.getVirtualFile();
+ assert virtualFile != null : element;
+ return virtualFile.getPresentableUrl();
+ }
+
public String getShortenName(){
switch (myType) {
case CUSTOM:
From f1fa76e361e182de0c3e66f577360a58457505b0 Mon Sep 17 00:00:00 2001
From: Roman Shevchenko
Date: Mon, 20 Feb 2012 20:27:49 +0100
Subject: [PATCH 11/17] Project API usages corrected (part 2)
---
.../compiler/CompileServerManager.java | 16 ++++++++++++----
.../openapi/compiler/CompilerPaths.java | 10 +++++++---
.../intellij/ide/RecentProjectsManager.java | 7 ++-----
.../intellij/psi/search/UpdateCacheTest.java | 18 +++++++++++++++++-
.../com/intellij/openapi/project/Project.java | 11 ++++++++---
.../actions/AbstractLayoutCodeProcessor.java | 4 ++--
.../console/ConsoleHistoryController.java | 4 ++--
.../src/com/intellij/ide/impl/ProjectUtil.java | 5 +++--
.../impl/stores/ProjectStoreImpl.java | 2 +-
.../project/impl/ProjectManagerImpl.java | 4 ++--
.../vfs/newvfs/impl/VirtualDirectoryImpl.java | 10 ++++++----
.../openapi/wm/impl/ProjectWindowAction.java | 4 ++--
.../wm/impl/ProjectWindowActionGroup.java | 10 +++++-----
.../export/ExportTestResultsAction.java | 9 +++------
.../lang/ant/config/actions/TargetAction.java | 6 ++++--
.../ant/config/execution/ExecutionHandler.java | 7 ++++---
16 files changed, 80 insertions(+), 47 deletions(-)
diff --git a/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java b/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java
index 8abbe757472b..ced65cfc37f5 100644
--- a/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java
+++ b/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2011 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -191,6 +191,14 @@ public class CompileServerManager implements ApplicationComponent{
sendNotification(paths, true);
}
+ @Nullable
+ private static String getProjectPath(final Project project) {
+ final String path = project.getPresentableUrl();
+ if (path == null) return path;
+ final VirtualFile vFile = LocalFileSystem.getInstance().findFileByPath(path);
+ return vFile != null ? vFile.getPath() : null;
+ }
+
public void sendReloadRequest(final Project project) {
if (!project.isDefault() && project.isOpen()) {
myTaskExecutor.submit(new Runnable() {
@@ -200,7 +208,7 @@ public class CompileServerManager implements ApplicationComponent{
if (!project.isDisposed()) {
final CompileServerClient client = ensureServerRunningAndClientConnected(false);
if (client != null) {
- client.sendProjectReloadRequest(Collections.singletonList(project.getLocation()));
+ client.sendProjectReloadRequest(Collections.singletonList(getProjectPath(project)));
}
}
}
@@ -251,7 +259,7 @@ public class CompileServerManager implements ApplicationComponent{
}
for (Project project : openProjects) {
try {
- client.sendFSEvent(project.getLocation(), changed, deleted);
+ client.sendFSEvent(getProjectPath(project), changed, deleted);
}
catch (Exception e) {
LOG.info(e);
@@ -317,7 +325,7 @@ public class CompileServerManager implements ApplicationComponent{
final Collection modules, final Collection artifacts,
final Collection paths,
final Map userData, final JpsServerResponseHandler handler) {
- final String projectId = project.getLocation();
+ final String projectId = getProjectPath(project);
final Ref futureRef = new Ref(null);
final RunnableFuture future = myTaskExecutor.submit(new Runnable() {
public void run() {
diff --git a/java/compiler/openapi/src/com/intellij/openapi/compiler/CompilerPaths.java b/java/compiler/openapi/src/com/intellij/openapi/compiler/CompilerPaths.java
index 7f21c224225f..b366bc5a443d 100644
--- a/java/compiler/openapi/src/com/intellij/openapi/compiler/CompilerPaths.java
+++ b/java/compiler/openapi/src/com/intellij/openapi/compiler/CompilerPaths.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -96,13 +96,17 @@ public class CompilerPaths {
return new File(getCompilerSystemDirectory(), projectName + "." + project.getLocationHash());
}
+ @Nullable
private static String getPresentableName(final Project project) {
if (project.isDefault()) {
return project.getName();
}
- String location = project.getLocation();
- if (location == null) return null;
+ String location = project.getPresentableUrl();
+ if (location == null) {
+ return null;
+ }
+
String projectName = FileUtil.toSystemIndependentName(location);
if (projectName.endsWith("/")) {
projectName = projectName.substring(0, projectName.length() - 1);
diff --git a/java/idea-ui/src/com/intellij/ide/RecentProjectsManager.java b/java/idea-ui/src/com/intellij/ide/RecentProjectsManager.java
index c3ff4043ae1e..cd5a83b0d706 100644
--- a/java/idea-ui/src/com/intellij/ide/RecentProjectsManager.java
+++ b/java/idea-ui/src/com/intellij/ide/RecentProjectsManager.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,8 +23,6 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.util.messages.MessageBus;
-import java.io.File;
-
@State(
name = "RecentProjectsManager",
roamingType = RoamingType.DISABLED,
@@ -39,8 +37,7 @@ public class RecentProjectsManager extends RecentProjectsManagerBase {
}
protected String getProjectPath(Project project) {
- final String location = project.getLocation();
- return location == null ? null : location.replace('/', File.separatorChar);
+ return project.getPresentableUrl();
}
protected void doOpenProject(final String projectPath, Project projectToClose, final boolean forceOpenInNewFrame) {
diff --git a/java/java-tests/testSrc/com/intellij/psi/search/UpdateCacheTest.java b/java/java-tests/testSrc/com/intellij/psi/search/UpdateCacheTest.java
index d1877bd01d70..cd2cf6890ac3 100644
--- a/java/java-tests/testSrc/com/intellij/psi/search/UpdateCacheTest.java
+++ b/java/java-tests/testSrc/com/intellij/psi/search/UpdateCacheTest.java
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2000-2012 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package com.intellij.psi.search;
import com.intellij.JavaTestUtil;
@@ -139,7 +154,8 @@ public class UpdateCacheTest extends PsiTestCase{
checkUsages(objectClass, new String[]{});
FileBasedIndex.getInstance().getContainingFiles(TodoIndex.NAME, new TodoIndexEntry("todo", true), GlobalSearchScope.allScope(getProject()));
- final String projectLocation = myProject.getLocation();
+ final String projectLocation = myProject.getPresentableUrl();
+ assert projectLocation != null : myProject;
myProject.save();
final VirtualFile content = ModuleRootManager.getInstance(getModule()).getContentRoots()[0];
ProjectUtil.closeAndDispose(myProject);
diff --git a/platform/core-api/src/com/intellij/openapi/project/Project.java b/platform/core-api/src/com/intellij/openapi/project/Project.java
index bb57840075f1..f70e4025e64b 100644
--- a/platform/core-api/src/com/intellij/openapi/project/Project.java
+++ b/platform/core-api/src/com/intellij/openapi/project/Project.java
@@ -28,6 +28,12 @@ import org.jetbrains.annotations.Nullable;
public interface Project extends ComponentManager, AreaInstance {
@NonNls String DIRECTORY_STORE_FOLDER = ".idea";
+ /**
+ * Returns a name ot the project. For a directory-based project it's an arbitrary string specified by user at project creation
+ * or later in a project settings. For a file-based project it's a name of a project file without extension.
+ *
+ * @return project name
+ */
@NotNull
@NonNls
String getName();
@@ -40,7 +46,6 @@ public interface Project extends ComponentManager, AreaInstance {
* if it's desired to keep symlinks in original path.
*
* @return project base directory, or null for default project
- * todo: check usages
*/
@Nullable
VirtualFile getBaseDir();
@@ -83,7 +88,8 @@ public interface Project extends ComponentManager, AreaInstance {
/**
* Returns presentable project path:
- * {@linkplain #getProjectFilePath()} for file-based projects, {@linkplain #getBasePath()} for directory-based ones.
+ * {@linkplain #getProjectFilePath()} for file-based projects, {@linkplain #getBasePath()} for directory-based ones.
+ * Note: the word "presentable" here implies file system presentation, not a UI one.
*
* @return presentable project path
*/
@@ -110,7 +116,6 @@ public interface Project extends ComponentManager, AreaInstance {
/**
* @deprecated please use {@linkplain #getPresentableUrl()} or {@linkplain #getBasePath()} (to remove in IDEA 13).
- * todo: remove usages
*/
@Nullable
@NonNls
diff --git a/platform/lang-impl/src/com/intellij/codeInsight/actions/AbstractLayoutCodeProcessor.java b/platform/lang-impl/src/com/intellij/codeInsight/actions/AbstractLayoutCodeProcessor.java
index 7dc21a333c96..b13222bb406b 100644
--- a/platform/lang-impl/src/com/intellij/codeInsight/actions/AbstractLayoutCodeProcessor.java
+++ b/platform/lang-impl/src/com/intellij/codeInsight/actions/AbstractLayoutCodeProcessor.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2011 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -389,7 +389,7 @@ public abstract class AbstractLayoutCodeProcessor {
private static Set getIgnoreRoots(@NotNull Project project) {
Set result = new HashSet();
- String location = project.getLocation();
+ String location = project.getBasePath();
if (location != null) {
File projectDir = new File(location, Project.DIRECTORY_STORE_FOLDER);
if (projectDir.isDirectory()) {
diff --git a/platform/lang-impl/src/com/intellij/execution/console/ConsoleHistoryController.java b/platform/lang-impl/src/com/intellij/execution/console/ConsoleHistoryController.java
index 3806e0ff9656..29b8a89c4645 100644
--- a/platform/lang-impl/src/com/intellij/execution/console/ConsoleHistoryController.java
+++ b/platform/lang-impl/src/com/intellij/execution/console/ConsoleHistoryController.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2011 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -75,7 +75,7 @@ public class ConsoleHistoryController {
@NotNull final LanguageConsoleImpl console,
@NotNull final ConsoleHistoryModel model) {
myType = type;
- myId = StringUtil.isEmpty(persistenceId)? console.getProject().getLocation() : persistenceId;
+ myId = StringUtil.isEmpty(persistenceId)? console.getProject().getPresentableUrl() : persistenceId;
myConsole = console;
myModel = model;
}
diff --git a/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java b/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java
index 1e1dfef7ea35..8d1732e88c5a 100644
--- a/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java
+++ b/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java
@@ -138,7 +138,7 @@ public class ProjectUtil {
}
@Nullable
- public static Project openProject(final String path, Project projectToClose, boolean forceOpenInNewFrame) {
+ public static Project openProject(final String path, @Nullable Project projectToClose, boolean forceOpenInNewFrame) {
File file = new File(path);
if (!file.exists()) {
Messages.showErrorDialog(IdeBundle.message("error.project.file.does.not.exist", path), CommonBundle.getErrorTitle());
@@ -161,7 +161,8 @@ public class ProjectUtil {
if (!forceOpenInNewFrame && openProjects.length > 0) {
int exitCode = confirmOpenNewProject(false);
if (exitCode == GeneralSettings.OPEN_PROJECT_SAME_WINDOW) {
- if (!closeAndDispose(projectToClose != null ? projectToClose : openProjects[openProjects.length - 1])) return null;
+ final Project toClose = projectToClose != null ? projectToClose : openProjects[openProjects.length - 1];
+ if (!closeAndDispose(toClose)) return null;
}
else if (exitCode != GeneralSettings.OPEN_PROJECT_NEW_WINDOW) {
return null;
diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/ProjectStoreImpl.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/ProjectStoreImpl.java
index 9032270e62a5..6b49310d49fa 100644
--- a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/ProjectStoreImpl.java
+++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/ProjectStoreImpl.java
@@ -316,7 +316,7 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject
String temp = getProjectFileName();
FileType fileType = FileTypeManager.getInstance().getFileTypeByFileName(temp);
if (fileType instanceof ProjectFileType) {
- temp = temp.substring(0, temp.length() - fileType.getDefaultExtension().length()-1);
+ temp = temp.substring(0, temp.length() - fileType.getDefaultExtension().length() - 1);
}
final int i = temp.lastIndexOf(File.separatorChar);
if (i >= 0) {
diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java
index faf376e92bd1..d957eca4d645 100644
--- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java
+++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -918,7 +918,7 @@ public class ProjectManagerImpl extends ProjectManagerEx implements NamedJDOMExt
ProjectImpl projectImpl = (ProjectImpl)project[0];
if (projectImpl.isDisposed()) return;
IProjectStore projectStore = projectImpl.getStateStore();
- final String location = projectImpl.getLocation();
+ final String location = projectImpl.getPresentableUrl();
final List original;
try {
diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualDirectoryImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualDirectoryImpl.java
index e28e5e496034..d5d81f96374e 100644
--- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualDirectoryImpl.java
+++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualDirectoryImpl.java
@@ -222,6 +222,7 @@ public class VirtualDirectoryImpl extends VirtualFileSystemEntry {
String childPath = child.getPath();
if (child.getFileSystem() == JarFileSystem.getInstance()) {
VirtualFile local = JarFileSystem.getInstance().getVirtualFileForJar(child);
+ assert local != null : child;
childPath = local.getPath();
}
if (FileUtil.startsWith(childPath, root)) {
@@ -238,13 +239,14 @@ public class VirtualDirectoryImpl extends VirtualFileSystemEntry {
if (!isUnder) {
if (!allowed.isEmpty()) {
- assert false : "File accessed outside allowed roots: " + child + ";\n Allowed roots: " + new ArrayList(allowed);
+ assert false : "File accessed outside allowed roots: " + child + ";\n Allowed roots: " + allowed;
}
}
}
}
// null means we were unable to get roots, so do not check access
+ @Nullable
private static Set allowedRoots() {
if (insideGettingRoots) return null;
Project[] openProjects = ProjectManager.getInstance().getOpenProjects();
@@ -257,8 +259,7 @@ public class VirtualDirectoryImpl extends VirtualFileSystemEntry {
String output = new File(outUrl.toURI()).getParentFile().getParentFile().getPath();
allowed.add(FileUtil.toSystemIndependentName(output));
}
- catch (URISyntaxException ignored) {
- }
+ catch (URISyntaxException ignored) { }
String javaHome = SystemProperties.getJavaHome();
allowed.add(FileUtil.toSystemIndependentName(javaHome));
String tempDirectorySpecific = new File(FileUtil.getTempDirectory()).getParent();
@@ -277,7 +278,8 @@ public class VirtualDirectoryImpl extends VirtualFileSystemEntry {
for (VirtualFile root : getAllRoots(project)) {
allowed.add(StringUtil.trimEnd(root.getPath(), JarFileSystem.JAR_SEPARATOR));
}
- String location = project.getLocation();
+ String location = project.getBasePath();
+ assert location != null : project;
allowed.add(FileUtil.toSystemIndependentName(location));
}
diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ProjectWindowAction.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ProjectWindowAction.java
index 60ce09d2c921..997e85a14001 100644
--- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ProjectWindowAction.java
+++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ProjectWindowAction.java
@@ -90,7 +90,7 @@ public class ProjectWindowAction extends ToggleAction implements DumbAware {
public Frame findProjectFrame() {
final Project[] projects = ProjectManager.getInstance().getOpenProjects();
for (Project project : projects) {
- if (myProjectLocation.equals(project.getLocation())) {
+ if (myProjectLocation.equals(project.getPresentableUrl())) {
final WindowManager windowManager = WindowManager.getInstance();
return windowManager.getFrame(project);
}
@@ -104,7 +104,7 @@ public class ProjectWindowAction extends ToggleAction implements DumbAware {
if (project == null) {
return false;
}
- return myProjectLocation.equals(project.getLocation());
+ return myProjectLocation.equals(project.getPresentableUrl());
}
public void setSelected(@Nullable AnActionEvent e, boolean selected) {
diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ProjectWindowActionGroup.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ProjectWindowActionGroup.java
index 4c8bc785c276..341d28d166dc 100644
--- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ProjectWindowActionGroup.java
+++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ProjectWindowActionGroup.java
@@ -36,7 +36,7 @@ public class ProjectWindowActionGroup extends DefaultActionGroup {
private ProjectWindowAction latest = null;
public void addProject(@NotNull Project project) {
- final String projectLocation = project.getLocation();
+ final String projectLocation = project.getPresentableUrl();
if (projectLocation == null) {
return;
}
@@ -56,7 +56,7 @@ public class ProjectWindowActionGroup extends DefaultActionGroup {
}
public void removeProject(@NotNull Project project) {
- final ProjectWindowAction windowAction = findWindowAction(project.getLocation());
+ final ProjectWindowAction windowAction = findWindowAction(project.getPresentableUrl());
if (windowAction == null) {
return;
}
@@ -91,7 +91,7 @@ public class ProjectWindowActionGroup extends DefaultActionGroup {
if (project == null) {
return;
}
- final ProjectWindowAction windowAction = findWindowAction(project.getLocation());
+ final ProjectWindowAction windowAction = findWindowAction(project.getPresentableUrl());
if (windowAction == null) {
return;
}
@@ -106,7 +106,7 @@ public class ProjectWindowActionGroup extends DefaultActionGroup {
if (project == null) {
return;
}
- final ProjectWindowAction windowAction = findWindowAction(project.getLocation());
+ final ProjectWindowAction windowAction = findWindowAction(project.getPresentableUrl());
if (windowAction == null) {
return;
}
@@ -144,7 +144,7 @@ public class ProjectWindowActionGroup extends DefaultActionGroup {
final ProjectWindowAction windowAction = (ProjectWindowAction) child;
if (projectName.equals(windowAction.getProjectName())) {
if (result == null) {
- result = new ArrayList();
+ result = new ArrayList();
}
result.add(windowAction);
}
diff --git a/platform/testRunner/src/com/intellij/execution/testframework/export/ExportTestResultsAction.java b/platform/testRunner/src/com/intellij/execution/testframework/export/ExportTestResultsAction.java
index 6c08399b0199..67bfa9c18dde 100644
--- a/platform/testRunner/src/com/intellij/execution/testframework/export/ExportTestResultsAction.java
+++ b/platform/testRunner/src/com/intellij/execution/testframework/export/ExportTestResultsAction.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2010 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,7 +19,6 @@ import com.intellij.diagnostic.LogMessageEx;
import com.intellij.diagnostic.errordialog.Attachment;
import com.intellij.execution.ExecutionBundle;
import com.intellij.execution.configurations.RuntimeConfiguration;
-import com.intellij.execution.testframework.AbstractTestProxy;
import com.intellij.execution.testframework.TestFrameworkRunningModel;
import com.intellij.ide.BrowserUtil;
import com.intellij.openapi.actionSystem.ActionManager;
@@ -28,7 +27,6 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
-import com.intellij.openapi.application.ex.ApplicationManagerEx;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.progress.PerformInBackgroundOption;
@@ -142,12 +140,11 @@ public class ExportTestResultsAction extends DumbAwareAction {
outputFolder = new File(config.getOutputFolder());
}
else {
- outputFolder = new File(new File(project.getLocation()), config.getOutputFolder());
+ outputFolder = new File(new File(project.getBasePath()), config.getOutputFolder());
}
}
else {
- outputFolder = new File(project.getLocation());
-
+ outputFolder = new File(project.getBasePath());
}
final File outputFile = new File(outputFolder, filename_);
final String outputText;
diff --git a/plugins/ant/src/com/intellij/lang/ant/config/actions/TargetAction.java b/plugins/ant/src/com/intellij/lang/ant/config/actions/TargetAction.java
index 9f6e9e7c7ab2..e7c1e3528bf9 100644
--- a/plugins/ant/src/com/intellij/lang/ant/config/actions/TargetAction.java
+++ b/plugins/ant/src/com/intellij/lang/ant/config/actions/TargetAction.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -41,7 +41,9 @@ public final class TargetAction extends AnAction {
templatePresentation.setDescription(description);
myBuildName = buildFile.getPresentableName();
myTargets = targets;
- myDebugString = "Target action: " + displayName+ "; Build: " + buildFile.getPresentableName() + "; Project: " + buildFile.getProject().getLocation();
+ myDebugString = "Target action: " + displayName +
+ "; Build: " + buildFile.getPresentableName() +
+ "; Project: " + buildFile.getProject().getPresentableUrl();
}
public String toString() {
diff --git a/plugins/ant/src/com/intellij/lang/ant/config/execution/ExecutionHandler.java b/plugins/ant/src/com/intellij/lang/ant/config/execution/ExecutionHandler.java
index 77e9bd77b1ad..25d4c498804f 100644
--- a/plugins/ant/src/com/intellij/lang/ant/config/execution/ExecutionHandler.java
+++ b/plugins/ant/src/com/intellij/lang/ant/config/execution/ExecutionHandler.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -46,6 +46,7 @@ import com.intellij.openapi.vfs.encoding.EncodingProjectManager;
import com.intellij.openapi.wm.*;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -63,7 +64,7 @@ public final class ExecutionHandler {
*/
public static void runBuild(final AntBuildFileBase buildFile,
String[] targets,
- final AntBuildMessageView buildMessageViewToReuse,
+ @Nullable final AntBuildMessageView buildMessageViewToReuse,
final DataContext dataContext,
List additionalProperties, @NotNull final AntBuildListener antBuildListener) {
FileDocumentManager.getInstance().saveAllDocuments();
@@ -223,7 +224,7 @@ public final class ExecutionHandler {
}
}
- private static AntBuildMessageView prepareMessageView(AntBuildMessageView buildMessageViewToReuse,
+ private static AntBuildMessageView prepareMessageView(@Nullable AntBuildMessageView buildMessageViewToReuse,
AntBuildFileBase buildFile,
String[] targets) throws RunCanceledException {
AntBuildMessageView messageView;
From 4a4df0dc399cb94ccde9bba9f8275e3107f7aa1a Mon Sep 17 00:00:00 2001
From: Roman Shevchenko
Date: Tue, 21 Feb 2012 11:31:57 +0100
Subject: [PATCH 12/17] To English dictionary
---
plugins/spellchecker/src/com/intellij/spellchecker/english.dic | 2 ++
1 file changed, 2 insertions(+)
diff --git a/plugins/spellchecker/src/com/intellij/spellchecker/english.dic b/plugins/spellchecker/src/com/intellij/spellchecker/english.dic
index e5e1f75b4c06..8e1321bb6ff0 100644
--- a/plugins/spellchecker/src/com/intellij/spellchecker/english.dic
+++ b/plugins/spellchecker/src/com/intellij/spellchecker/english.dic
@@ -134293,6 +134293,8 @@ versifying
versing
version
version's
+versional
+versioned
versions
verso
verso's
From a59749c742f91da1a260550889e1c0678e8dc8f8 Mon Sep 17 00:00:00 2001
From: Roman Shevchenko
Date: Tue, 21 Feb 2012 12:21:14 +0100
Subject: [PATCH 13/17] Just formatting
---
.../intellij/ui/mac/MacFileChooserDialogImpl.java | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/platform/platform-impl/src/com/intellij/ui/mac/MacFileChooserDialogImpl.java b/platform/platform-impl/src/com/intellij/ui/mac/MacFileChooserDialogImpl.java
index de80c1b6561b..65bc28bec9ba 100644
--- a/platform/platform-impl/src/com/intellij/ui/mac/MacFileChooserDialogImpl.java
+++ b/platform/platform-impl/src/com/intellij/ui/mac/MacFileChooserDialogImpl.java
@@ -192,24 +192,23 @@ public class MacFileChooserDialogImpl implements PathChooserDialog {
}
static {
- final ID delegateClass = Foundation.allocateObjcClassPair(Foundation.getObjcClass("NSObject"), "NSOpenPanelDelegate_");
- if (!Foundation.addMethod(delegateClass, Foundation.createSelector("panel:shouldShowFilename:"), SHOULD_SHOW_FILENAME_CALLBACK, "B*")) {
+ final ID delegate = Foundation.allocateObjcClassPair(Foundation.getObjcClass("NSObject"), "NSOpenPanelDelegate_");
+ if (!Foundation.addMethod(delegate, Foundation.createSelector("panel:shouldShowFilename:"), SHOULD_SHOW_FILENAME_CALLBACK, "B*")) {
throw new RuntimeException("Unable to add method to objective-c delegate class!");
}
- if (!Foundation.addMethod(delegateClass, Foundation.createSelector("panel:isValidFilename:"), IS_VALID_FILENAME_CALLBACK, "B*")) {
+ if (!Foundation.addMethod(delegate, Foundation.createSelector("panel:isValidFilename:"), IS_VALID_FILENAME_CALLBACK, "B*")) {
throw new RuntimeException("Unable to add method to objective-c delegate class!");
}
- if (!Foundation.addMethod(delegateClass, Foundation.createSelector("showOpenPanel:"), MAIN_THREAD_RUNNABLE, "v*")) {
+ if (!Foundation.addMethod(delegate, Foundation.createSelector("showOpenPanel:"), MAIN_THREAD_RUNNABLE, "v*")) {
throw new RuntimeException("Unable to add method to objective-c delegate class!");
}
- if (!Foundation.addMethod(delegateClass, Foundation.createSelector("openPanelDidEnd:returnCode:contextInfo:"), OPEN_PANEL_DID_END,
- "v*i")) {
+ if (!Foundation.addMethod(delegate, Foundation.createSelector("openPanelDidEnd:returnCode:contextInfo:"), OPEN_PANEL_DID_END, "v*i")) {
throw new RuntimeException("Unable to add method to objective-c delegate class!");
}
- if (!Foundation.addMethod(delegateClass, Foundation.createSelector("panel:shouldEnableURL:"), SHOULD_ENABLE_URL, "B@@")) {
+ if (!Foundation.addMethod(delegate, Foundation.createSelector("panel:shouldEnableURL:"), SHOULD_ENABLE_URL, "B@@")) {
throw new RuntimeException("Unable to add method to objective-c delegate class!");
}
- Foundation.registerObjcClassPair(delegateClass);
+ Foundation.registerObjcClassPair(delegate);
}
public MacFileChooserDialogImpl(@NotNull FileChooserDescriptor chooserDescriptor, Project project) {
From d7b980dfc38054fa082382258d4fa577ec84ba87 Mon Sep 17 00:00:00 2001
From: Roman Shevchenko
Date: Tue, 21 Feb 2012 13:51:03 +0100
Subject: [PATCH 14/17] Show logical project path in a frame title
---
.../openapi/wm/IdeaFrameTitleBuilder.java | 6 ++--
.../intellij/openapi/project/ProjectUtil.java | 10 ++++--
.../openapi/wm/impl/FrameTitleBuilder.java | 7 ++--
.../openapi/wm/impl/IdeFrameImpl.java | 4 +--
.../wm/impl/PlatformFrameTitleBuilder.java | 32 +++++++++++--------
.../intellij/openapi/util/io/FileUtil.java | 2 +-
6 files changed, 37 insertions(+), 24 deletions(-)
diff --git a/java/idea-ui/src/com/intellij/openapi/wm/IdeaFrameTitleBuilder.java b/java/idea-ui/src/com/intellij/openapi/wm/IdeaFrameTitleBuilder.java
index b82da4da9fd1..9796f9e8db3b 100644
--- a/java/idea-ui/src/com/intellij/openapi/wm/IdeaFrameTitleBuilder.java
+++ b/java/idea-ui/src/com/intellij/openapi/wm/IdeaFrameTitleBuilder.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,12 +20,14 @@ import com.intellij.openapi.project.ProjectUtil;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.impl.PlatformFrameTitleBuilder;
+import org.jetbrains.annotations.NotNull;
/**
* @author yole
*/
public class IdeaFrameTitleBuilder extends PlatformFrameTitleBuilder {
- public String getFileTitle(final Project project, final VirtualFile file) {
+ @Override
+ public String getFileTitle(@NotNull final Project project, @NotNull final VirtualFile file) {
return ProjectUtil.calcRelativeToProjectPath(file, project, !SystemInfo.isMac);
}
}
diff --git a/platform/lang-api/src/com/intellij/openapi/project/ProjectUtil.java b/platform/lang-api/src/com/intellij/openapi/project/ProjectUtil.java
index f17e68759dcb..8683342f873e 100644
--- a/platform/lang-api/src/com/intellij/openapi/project/ProjectUtil.java
+++ b/platform/lang-api/src/com/intellij/openapi/project/ProjectUtil.java
@@ -49,12 +49,16 @@ public class ProjectUtil {
return FileUtil.getLocationRelativeToUserHome(project.getBasePath());
}
- public static String calcRelativeToProjectPath(final VirtualFile file, final Project project, final boolean includeFilePath) {
+ @NotNull
+ public static String calcRelativeToProjectPath(@NotNull final VirtualFile file,
+ @Nullable final Project project,
+ final boolean includeFilePath) {
return calcRelativeToProjectPath(file, project, includeFilePath, false);
}
- public static String calcRelativeToProjectPath(final VirtualFile file,
- final Project project,
+ @NotNull
+ public static String calcRelativeToProjectPath(@NotNull final VirtualFile file,
+ @Nullable final Project project,
final boolean includeFilePath,
final boolean keepModuleAlwaysOnTheLeft) {
if (file instanceof VirtualFilePathWrapper) {
diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/FrameTitleBuilder.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/FrameTitleBuilder.java
index ce0250378b27..3432f48dbe73 100644
--- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/FrameTitleBuilder.java
+++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/FrameTitleBuilder.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@ package com.intellij.openapi.wm.impl;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.project.Project;
+import org.jetbrains.annotations.NotNull;
/**
* @author yole
@@ -27,7 +28,7 @@ public abstract class FrameTitleBuilder {
return ServiceManager.getService(FrameTitleBuilder.class);
}
- public abstract String getFileTitle(final Project project, final VirtualFile file);
+ public abstract String getProjectTitle(@NotNull final Project project);
- public abstract String getProjectTitle(final Project project);
+ public abstract String getFileTitle(@NotNull final Project project, @NotNull final VirtualFile file);
}
diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeFrameImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeFrameImpl.java
index 76422cc6e8e1..ddb0d4f6ad93 100644
--- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeFrameImpl.java
+++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeFrameImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2011 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -256,7 +256,7 @@ public class IdeFrameImpl extends JFrame implements IdeFrame, DataProvider {
myUpdatingTitle = false;
}
}
-
+
private static final class Builder {
public StringBuilder sb = new StringBuilder();
diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/PlatformFrameTitleBuilder.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/PlatformFrameTitleBuilder.java
index 468e749a9597..7f91b64d9cdf 100644
--- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/PlatformFrameTitleBuilder.java
+++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/PlatformFrameTitleBuilder.java
@@ -21,39 +21,45 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFilePathWrapper;
import com.intellij.platform.ProjectBaseDirectory;
+import org.jetbrains.annotations.NotNull;
/**
* @author yole
*/
public class PlatformFrameTitleBuilder extends FrameTitleBuilder {
- public String getProjectTitle(final Project project) {
- final VirtualFile baseDir = project.getBaseDir();
- if (baseDir != null) {
- if (SystemInfo.isMac && baseDir.getName().equals(project.getName())) {
- return "[" + FileUtil.getLocationRelativeToUserHome(baseDir.getPresentableUrl()) + "]";
- }
-
- return project.getName() + " - [" + FileUtil.getLocationRelativeToUserHome(baseDir.getPresentableUrl()) + "]";
- }
+ @Override
+ public String getProjectTitle(@NotNull final Project project) {
+ final String basePath = project.getBasePath();
+ if (basePath == null) return project.getName();
- return project.getName();
+ if (basePath.equals(project.getName())) {
+ return "[" + FileUtil.getLocationRelativeToUserHome(basePath) + "]";
+ }
+ else {
+ return project.getName() + " - [" + FileUtil.getLocationRelativeToUserHome(basePath) + "]";
+ }
}
- public String getFileTitle(final Project project, final VirtualFile file) {
+ @Override
+ public String getFileTitle(@NotNull final Project project, @NotNull final VirtualFile file) {
if (SystemInfo.isMac) return file.getName();
if (file instanceof VirtualFilePathWrapper) {
return ((VirtualFilePathWrapper)file).getPresentablePath();
}
+
String url = FileUtil.getLocationRelativeToUserHome(file.getPresentableUrl());
+ if (url == null) url = file.getPresentableUrl();
+
VirtualFile baseDir = ProjectBaseDirectory.getInstance(project).getBaseDir();
if (baseDir == null) baseDir = project.getBaseDir();
+
if (baseDir != null) {
- //noinspection ConstantConditions
final String projectHomeUrl = FileUtil.getLocationRelativeToUserHome(baseDir.getPresentableUrl());
- if (url.startsWith(projectHomeUrl)) {
+ if (projectHomeUrl != null && url.startsWith(projectHomeUrl)) {
url = "..." + url.substring(projectHomeUrl.length());
}
}
+
return url;
}
}
diff --git a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java
index 96aef7f4b09a..e02187132e29 100644
--- a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java
+++ b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java
@@ -1287,7 +1287,7 @@ public class FileUtil {
}
@Nullable
- public static String getLocationRelativeToUserHome(final String path) {
+ public static String getLocationRelativeToUserHome(@Nullable final String path) {
if (path == null) return null;
if (SystemInfo.isUnix) {
From e2668561de321777f7ddefda712c6e7a207da724 Mon Sep 17 00:00:00 2001
From: Roman Shevchenko
Date: Tue, 21 Feb 2012 14:04:48 +0100
Subject: [PATCH 15/17] IDEA-81487 (fix Windows startup script to locate
bundled JRE)
---
bin/scripts/win/idea.bat | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/bin/scripts/win/idea.bat b/bin/scripts/win/idea.bat
index d92bc5e11c1c..214e41642168 100644
--- a/bin/scripts/win/idea.bat
+++ b/bin/scripts/win/idea.bat
@@ -5,15 +5,21 @@
::----------------------------------------------------------------------
:: ---------------------------------------------------------------------
-:: Locate a JDK installation directory which will be used to ruin the IDE.
-:: Try (in order): @@product_uc@@_JDK, JDK_HOME, JAVA_HOME.
+:: Locate a JDK installation directory which will be used to run the IDE.
+:: Try (in order): @@product_uc@@_JDK, ..\jre, JDK_HOME, JAVA_HOME.
:: ---------------------------------------------------------------------
-SET JDK=%@@product_uc@@_JDK%
-IF "%JDK%" == "" SET JDK=%JDK_HOME%
-IF "%JDK%" == "" SET JDK=%JAVA_HOME%
+IF EXIST "%@@product_uc@@_JDK%" SET JDK=%@@product_uc@@_JDK%
+IF NOT "%JDK%" == "" GOTO jdk
+IF EXIST "%~dp0\..\jre" SET JDK=%~dp0\..\jre
+IF NOT "%JDK%" == "" GOTO jdk
+IF EXIST "%JDK_HOME%" SET JDK=%JDK_HOME%
+IF NOT "%JDK%" == "" GOTO jdk
+IF EXIST "%JAVA_HOME%" SET JDK=%JAVA_HOME%
IF "%JDK%" == "" GOTO error
+:jdk
SET JAVA_EXE=%JDK%\bin\java.exe
+IF NOT EXIST "%JAVA_EXE%" SET JAVA_EXE=%JDK%\jre\bin\java.exe
IF NOT EXIST "%JAVA_EXE%" GOTO error
:: ---------------------------------------------------------------------
From d47214a1735e034db9cd5332a7b7f6eb9d710ce4 Mon Sep 17 00:00:00 2001
From: anna
Date: Tue, 21 Feb 2012 14:07:38 +0100
Subject: [PATCH 16/17] testdata fixed to exclude copyright
---
.../quickFix/changeNewOperatorType/after3.java | 16 ----------------
1 file changed, 16 deletions(-)
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/after3.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/after3.java
index b74263a1f326..d3be807be02c 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/after3.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeNewOperatorType/after3.java
@@ -1,19 +1,3 @@
-/*
- * Copyright 2000-2012 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
// "Change 'new TTT[0][]' to 'new TTT[]'" "true"
public class TTT {
void f() {
From 1bde0a1fe1daa96112df9e07061b7ff81efbe197 Mon Sep 17 00:00:00 2001
From: Dmitry Boulytchev
Date: Tue, 21 Feb 2012 17:13:33 +0400
Subject: [PATCH 17/17] Fixed bug in integrate (compile-server).
---
.../src/org/jetbrains/ether/dependencyView/Mappings.java | 8 ++++----
.../org/jetbrains/ether/dependencyView/MultiMaplet.java | 3 ++-
.../ether/dependencyView/PersistentMultiMaplet.java | 7 +++++++
.../ether/dependencyView/TransientMultiMaplet.java | 9 ++++++++-
4 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java
index 9d4e522c83e4..cc67d6620648 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java
+++ b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java
@@ -1605,7 +1605,7 @@ public class Mappings {
}
}
- if (delta.isDifferentiated()) {
+ if (delta.isDifferentiated() && false) {
for (DependencyContext.S c : delta.getChangedClasses()) {
myClassToSubclasses.remove(c);
@@ -1651,9 +1651,9 @@ public class Mappings {
}
}
else {
- mySourceFileToClasses.putAll(delta.mySourceFileToClasses);
- mySourceFileToUsages.putAll(delta.mySourceFileToUsages);
- mySourceFileToAnnotationUsages.putAll(delta.mySourceFileToAnnotationUsages);
+ mySourceFileToClasses.replaceAll(delta.mySourceFileToClasses);
+ mySourceFileToUsages.replaceAll(delta.mySourceFileToUsages);
+ mySourceFileToAnnotationUsages.replaceAll(delta.mySourceFileToAnnotationUsages);
}
final Collection compiledSet = new HashSet(compiled.size());
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/MultiMaplet.java b/jps/model/src/org/jetbrains/ether/dependencyView/MultiMaplet.java
index 68b1f350dd68..a7152b3684dc 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/MultiMaplet.java
+++ b/jps/model/src/org/jetbrains/ether/dependencyView/MultiMaplet.java
@@ -30,7 +30,8 @@ interface MultiMaplet {
Collection get(final K key);
void put(final K key, final V value);
void put(final K key, final Collection value);
- void putAll(MultiMaplet m);
+ void putAll(MultiMaplet m);
+ void replaceAll(MultiMaplet m);
void remove(final K key);
void removeFrom(final K key, final V value);
void removeAll(final K key, final Collection value);
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/PersistentMultiMaplet.java b/jps/model/src/org/jetbrains/ether/dependencyView/PersistentMultiMaplet.java
index 3cfc2966da50..f1d288696244 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/PersistentMultiMaplet.java
+++ b/jps/model/src/org/jetbrains/ether/dependencyView/PersistentMultiMaplet.java
@@ -141,6 +141,13 @@ class PersistentMultiMaplet implements MultiMaplet {
@Override
public void putAll(MultiMaplet m) {
+ for (Map.Entry> entry : m.entrySet()) {
+ put(entry.getKey(), entry.getValue());
+ }
+ }
+
+ @Override
+ public void replaceAll(MultiMaplet m) {
for (Map.Entry> entry : m.entrySet()) {
final K key = entry.getKey();
remove(key);
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/TransientMultiMaplet.java b/jps/model/src/org/jetbrains/ether/dependencyView/TransientMultiMaplet.java
index 2177cfdbd44b..7a5f2b85eb90 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/TransientMultiMaplet.java
+++ b/jps/model/src/org/jetbrains/ether/dependencyView/TransientMultiMaplet.java
@@ -54,6 +54,13 @@ class TransientMultiMaplet implements MultiMaplet {
return myMap.get(key);
}
+ @Override
+ public void putAll(final MultiMaplet m) {
+ for (Map.Entry> e : m.entrySet()) {
+ put(e.getKey(), e.getValue());
+ }
+ }
+
@Override
public void put(final K key, final Collection value) {
final Collection x = myMap.get(key);
@@ -102,7 +109,7 @@ class TransientMultiMaplet implements MultiMaplet {
}
@Override
- public void putAll(MultiMaplet m) {
+ public void replaceAll(MultiMaplet m) {
for (Map.Entry> e : m.entrySet()) {
remove(e.getKey());
put(e.getKey(), e.getValue());