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());