diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java index 0598d4e90046..fca175a3bee8 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java @@ -625,6 +625,8 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se return myToFocus; } - + protected void hideErrorsComponent() { + myErrorsComponent.setVisible(false); + } } diff --git a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java index 78e19e9979ee..bb0c6eed7d53 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java @@ -54,13 +54,9 @@ import com.intellij.openapi.ui.popup.PopupStep; import com.intellij.openapi.ui.popup.util.BaseListPopupStep; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.IconLoader; -import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; -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.vfs.*; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.util.PsiFormatUtil; @@ -68,10 +64,7 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.XmlDocument; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; -import com.intellij.util.ArrayUtil; -import com.intellij.util.Function; -import com.intellij.util.IncorrectOperationException; -import com.intellij.util.StringBuilderSpinAllocator; +import com.intellij.util.*; import com.intellij.util.containers.ConcurrentWeakHashMap; import com.intellij.util.messages.MessageBusConnection; import com.intellij.util.ui.OptionsMessageDialog; @@ -85,13 +78,14 @@ import java.awt.event.ActionEvent; import java.io.IOException; import java.util.*; import java.util.List; +import java.util.concurrent.atomic.AtomicReference; public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { public static final Icon ICON = IconLoader.getIcon("/modules/annotation.png"); private static final Logger LOG = Logger.getInstance("#" + ExternalAnnotationsManagerImpl.class.getName()); private final Map> myExternalAnnotations = new ConcurrentWeakHashMap>(); - private final Ref myHasAnyAnnotationsRoots = new Ref(); + private final AtomicReference myHasAnyAnnotationsRoots = new AtomicReference(ThreeState.UNSURE); private static final List NULL = new ArrayList(); private final PsiManager myPsiManager; @@ -104,28 +98,24 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { public void rootsChanged(ModuleRootEvent event) { myExternalAnnotations.clear(); - synchronized (myHasAnyAnnotationsRoots) { - myHasAnyAnnotationsRoots.set(null); - } + myHasAnyAnnotationsRoots.set(ThreeState.UNSURE); } }); } - private boolean hasAnyAnnotationsRoots() { - if (myHasAnyAnnotationsRoots.get() == null) { - synchronized (myHasAnyAnnotationsRoots) { - final Module[] modules = ModuleManager.getInstance(myPsiManager.getProject()).getModules(); - for (Module module : modules) { - for (OrderEntry entry : ModuleRootManager.getInstance(module).getOrderEntries()) { - final String[] urls = AnnotationOrderRootType.getUrls(entry); - if (urls.length > 0) { - myHasAnyAnnotationsRoots.set(Boolean.TRUE); - return true; - } + private ThreeState hasAnyAnnotationsRoots() { + if (myHasAnyAnnotationsRoots.get() == ThreeState.UNSURE) { + final Module[] modules = ModuleManager.getInstance(myPsiManager.getProject()).getModules(); + for (Module module : modules) { + for (OrderEntry entry : ModuleRootManager.getInstance(module).getOrderEntries()) { + final String[] urls = AnnotationOrderRootType.getUrls(entry); + if (urls.length > 0) { + myHasAnyAnnotationsRoots.set(ThreeState.YES); + return ThreeState.YES; } } - myHasAnyAnnotationsRoots.set(Boolean.FALSE); } + myHasAnyAnnotationsRoots.set(ThreeState.NO); } return myHasAnyAnnotationsRoots.get(); } @@ -143,8 +133,8 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { @NotNull private Map collectExternalAnnotations(final PsiModifierListOwner listOwner) { + if (hasAnyAnnotationsRoots() == ThreeState.NO) return Collections.emptyMap(); final Map result = new HashMap(); - if (!hasAnyAnnotationsRoots()) return result; final List files = findExternalAnnotationsFile(listOwner); if (files != null) { for (XmlFile file : files) { @@ -295,7 +285,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { for (XmlFile xmlFile : xmlFiles) { final VirtualFile vXmlFile = xmlFile.getVirtualFile(); assert vXmlFile != null; - if (VfsUtil.isAncestor(file, vXmlFile, false)) { + if (VfsUtilCore.isAncestor(file, vXmlFile, false)) { annotationsXml[0] = xmlFile; if (!CodeInsightUtilBase.preparePsiElementForWrite(xmlFile)) return; } @@ -488,8 +478,9 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { } } + @NonNls private static String createAnnotationTag(String annotationFQName, PsiNameValuePair[] values) { - String text; + @NonNls String text; if (values != null) { text = " \n"; text += StringUtil.join(values, new Function() { @@ -502,17 +493,18 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { } }, " \n"); text += " "; - } else { + } + else { text = " \n"; } return text; } @Nullable - private XmlFile createAnnotationsXml(VirtualFile root, String packageName) { + private XmlFile createAnnotationsXml(VirtualFile root, @NonNls @NotNull String packageName) { final String[] dirs = packageName.split("[\\.]"); for (String dir : dirs) { - if (dir.length() == 0) break; + if (dir.isEmpty()) break; VirtualFile subdir = root.findChild(dir); if (subdir == null) { try { @@ -550,7 +542,8 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { final PsiJavaFile javaFile = (PsiJavaFile)containingFile; final String packageName = javaFile.getPackageName(); final VirtualFile virtualFile = containingFile.getVirtualFile(); - final List files = myExternalAnnotations.get(getFQN(packageName, virtualFile)); + String fqn = getFQN(packageName, virtualFile); + final List files = myExternalAnnotations.get(fqn); if (files == NULL) return null; if (files != null) { for (Iterator it = files.iterator(); it.hasNext();) { @@ -559,34 +552,35 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { return files; } - if (virtualFile != null) { - final List entries = ProjectRootManager.getInstance(project).getFileIndex().getOrderEntriesForFile(virtualFile); - for (OrderEntry entry : entries) { - if (!(entry instanceof ModuleOrderEntry)) { - List possibleAnnotationsXmls = null; - final String[] externalUrls = AnnotationOrderRootType.getUrls(entry); - for (String url : externalUrls) { - final VirtualFile ext = LocalFileSystem.getInstance() - .findFileByPath(VfsUtil.urlToPath(url) + "/" + packageName.replace(".", "/") + "/" + ANNOTATIONS_XML); - if (ext != null) { - final PsiFile psiFile = myPsiManager.findFile(ext); - if (psiFile instanceof XmlFile) { - if (possibleAnnotationsXmls == null) { - possibleAnnotationsXmls = new ArrayList(); - } - possibleAnnotationsXmls.add((XmlFile)psiFile); + if (virtualFile == null) { + return null; + } + final List entries = ProjectRootManager.getInstance(project).getFileIndex().getOrderEntriesForFile(virtualFile); + for (OrderEntry entry : entries) { + if (!(entry instanceof ModuleOrderEntry)) { + List possibleAnnotationsXmls = null; + final String[] externalUrls = AnnotationOrderRootType.getUrls(entry); + for (String url : externalUrls) { + final VirtualFile ext = LocalFileSystem.getInstance() + .findFileByPath(VfsUtil.urlToPath(url) + "/" + packageName.replace(".", "/") + "/" + ANNOTATIONS_XML); + if (ext != null) { + final PsiFile psiFile = myPsiManager.findFile(ext); + if (psiFile instanceof XmlFile) { + if (possibleAnnotationsXmls == null) { + possibleAnnotationsXmls = new ArrayList(); } + possibleAnnotationsXmls.add((XmlFile)psiFile); } } - if (possibleAnnotationsXmls != null) { - myExternalAnnotations.put(getFQN(packageName, virtualFile), possibleAnnotationsXmls); - return possibleAnnotationsXmls; - } - break; } + if (possibleAnnotationsXmls != null) { + myExternalAnnotations.put(fqn, possibleAnnotationsXmls); + return possibleAnnotationsXmls; + } + break; } - myExternalAnnotations.put(getFQN(packageName, virtualFile), NULL); } + myExternalAnnotations.put(fqn, NULL); } /*final VirtualFile virtualFile = containingFile.getVirtualFile(); //for java files only if (virtualFile != null) { diff --git a/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java b/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java index 40409edd890a..2ad7eca581c8 100644 --- a/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java @@ -17,6 +17,7 @@ package com.intellij.codeInsight.hint.api.impls; import com.intellij.codeInsight.CodeInsightBundle; import com.intellij.codeInsight.CodeInsightSettings; +import com.intellij.codeInsight.ExternalAnnotationsManager; import com.intellij.codeInsight.completion.JavaCompletionUtil; import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; import com.intellij.codeInsight.lookup.LookupElement; @@ -60,7 +61,7 @@ public class MethodParameterInfoHandler implements ParameterInfoHandlerWithTabAc if (p instanceof MethodCandidateInfo) { return ((MethodCandidateInfo)p).getElement().getParameterList().getParameters(); } - else if (p instanceof PsiMethod) { + if (p instanceof PsiMethod) { return ((PsiMethod)p).getParameterList().getParameters(); } return ArrayUtil.EMPTY_OBJECT_ARRAY; @@ -262,18 +263,16 @@ public class MethodParameterInfoHandler implements ParameterInfoHandlerWithTabAc if (list.getParent() instanceof PsiMethodCallExpression) { return (PsiCall)list.getParent(); } - else if (list.getParent() instanceof PsiNewExpression) { + if (list.getParent() instanceof PsiNewExpression) { return (PsiCall)list.getParent(); } - else if (list.getParent() instanceof PsiAnonymousClass) { + if (list.getParent() instanceof PsiAnonymousClass) { return (PsiCall)list.getParent().getParent(); } - else if (list.getParent() instanceof PsiEnumConstant) { + if (list.getParent() instanceof PsiEnumConstant) { return (PsiCall)list.getParent(); } - else { - return null; - } + return null; } private static CandidateInfo[] getMethods(PsiExpressionList argList) { @@ -335,7 +334,7 @@ public class MethodParameterInfoHandler implements ParameterInfoHandlerWithTabAc returnType = substitutor.substitute(returnType); } - appendModifierList(buffer, method.getModifierList()); + appendModifierList(buffer, method); buffer.append(returnType.getPresentableText()); buffer.append(" "); } @@ -360,7 +359,7 @@ public class MethodParameterInfoHandler implements ParameterInfoHandlerWithTabAc if (substitutor != null) { paramType = substitutor.substitute(paramType); } - appendModifierList(buffer, param.getModifierList()); + appendModifierList(buffer, param); buffer.append(paramType.getPresentableText()); String name = param.getName(); if (name != null) { @@ -401,13 +400,22 @@ public class MethodParameterInfoHandler implements ParameterInfoHandlerWithTabAc ); } - private static void appendModifierList(final StringBuilder buffer, final PsiModifierList list) { - if (list == null) return; + private static void appendModifierList(@NotNull StringBuilder buffer, @NotNull PsiModifierListOwner owner) { + final PsiModifierList list = owner.getModifierList(); + PsiAnnotation[] annotations = PsiAnnotation.EMPTY_ARRAY; int lastSize = buffer.length(); - for (PsiAnnotation a : list.getAnnotations()) { + if (list != null) { + annotations = list.getAnnotations(); + } + final PsiAnnotation[] externalAnnotations = ExternalAnnotationsManager.getInstance(owner.getProject()).findExternalAnnotations(owner); + if (externalAnnotations != null) { + annotations = ArrayUtil.mergeArrays(annotations, externalAnnotations, PsiAnnotation.ARRAY_FACTORY); + } + + for (PsiAnnotation a : annotations) { if (lastSize != buffer.length()) buffer.append(" "); final PsiJavaCodeReferenceElement element = a.getNameReferenceElement(); - if (element != null) buffer.append("@").append(element.getText()); + if (element != null) buffer.append("@").append(element.getReferenceName()); } if (lastSize != buffer.length()) buffer.append(" "); } diff --git a/java/java-impl/src/com/intellij/ide/projectView/impl/nodes/PackageElement.java b/java/java-impl/src/com/intellij/ide/projectView/impl/nodes/PackageElement.java index cd724db939e4..f3ba0bded81f 100644 --- a/java/java-impl/src/com/intellij/ide/projectView/impl/nodes/PackageElement.java +++ b/java/java-impl/src/com/intellij/ide/projectView/impl/nodes/PackageElement.java @@ -96,7 +96,7 @@ public final class PackageElement implements Queryable, RootsProvider { - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { PsiPackage pkg = getPackage(); if (pkg instanceof Queryable) { ((Queryable)pkg).putInfo(info); diff --git a/java/java-impl/src/com/intellij/ide/todo/nodes/TodoPackageNode.java b/java/java-impl/src/com/intellij/ide/todo/nodes/TodoPackageNode.java index 7adfab1b46c3..501552de4234 100644 --- a/java/java-impl/src/com/intellij/ide/todo/nodes/TodoPackageNode.java +++ b/java/java-impl/src/com/intellij/ide/todo/nodes/TodoPackageNode.java @@ -142,7 +142,7 @@ public final class TodoPackageNode extends PackageElementNode implements Highlig } @Override - public void apply(Map info) { + public void apply(@NotNull Map info) { info.put("toDoFileCount", String.valueOf(getFileCount(getValue()))); info.put("toDoItemCount", String.valueOf(getTodoItemCount(getValue()))); } diff --git a/java/java-psi-impl/src/com/intellij/lang/java/parser/FileParser.java b/java/java-psi-impl/src/com/intellij/lang/java/parser/FileParser.java index af79846224af..e4ef509e762e 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/parser/FileParser.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/parser/FileParser.java @@ -15,6 +15,7 @@ */ package com.intellij.lang.java.parser; +import com.intellij.CommonBundle; import com.intellij.codeInsight.daemon.JavaErrorMessages; import com.intellij.lang.PsiBuilder; import com.intellij.openapi.util.Pair; @@ -26,10 +27,10 @@ import com.intellij.psi.tree.TokenSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ResourceBundle; + import static com.intellij.lang.PsiBuilderUtil.expect; -import static com.intellij.lang.java.parser.JavaParserUtil.done; -import static com.intellij.lang.java.parser.JavaParserUtil.exprType; -import static com.intellij.lang.java.parser.JavaParserUtil.semicolon; +import static com.intellij.lang.java.parser.JavaParserUtil.*; public class FileParser { @@ -51,10 +52,14 @@ public class FileParser { } public void parse(final PsiBuilder builder) { - parseFile(builder, IMPORT_LIST_STOPPER_SET, JavaErrorMessages.message("expected.class.or.interface")); + parseFile(builder, IMPORT_LIST_STOPPER_SET, JavaErrorMessages.BUNDLE, "expected.class.or.interface"); } - public void parseFile(final PsiBuilder builder, final TokenSet importListStoppers, final String errorMessage) { + private static String error(@NotNull String bundle, @NotNull String errorMessageKey) { + return CommonBundle.message(ResourceBundle.getBundle(bundle), errorMessageKey); + } + + public void parseFile(final PsiBuilder builder, final TokenSet importListStoppers, @NotNull String bundle, @NotNull String errorMessageKey) { parsePackageStatement(builder); final Pair impListInfo = parseImportList(builder, importListStoppers); @@ -65,7 +70,7 @@ public class FileParser { while (!builder.eof()) { if (builder.getTokenType() == JavaTokenType.SEMICOLON) { if (invalidElements != null) { - invalidElements.error(errorMessage); + invalidElements.error(error(bundle, errorMessageKey)); invalidElements = null; } builder.advanceLexer(); @@ -76,7 +81,7 @@ public class FileParser { final PsiBuilder.Marker declaration = parseInitial(builder); if (declaration != null) { if (invalidElements != null) { - invalidElements.errorBefore(errorMessage, declaration); + invalidElements.errorBefore(error(bundle, errorMessageKey), declaration); invalidElements = null; } if (firstDeclarationOk == null) { @@ -96,7 +101,7 @@ public class FileParser { } if (invalidElements != null) { - invalidElements.error(errorMessage); + invalidElements.error(error(bundle, errorMessageKey)); } if (impListInfo.second && firstDeclarationOk == Boolean.TRUE) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsClassImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsClassImpl.java index 33375329898a..4f9a03907002 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsClassImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsClassImpl.java @@ -603,7 +603,7 @@ public class ClsClassImpl extends ClsRepositoryPsiElement> imple } @Override - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { PsiClassImpl.putInfo(this, info); } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsFileImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsFileImpl.java index b3d3a7cf2173..de4067340f55 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsFileImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsFileImpl.java @@ -483,7 +483,7 @@ public class ClsFileImpl extends ClsRepositoryPsiElement } @Override - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { PsiFileImpl.putInfo(this, info); } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaStubPsiElement.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaStubPsiElement.java index 6620f0a493fe..3cf087f62c96 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaStubPsiElement.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaStubPsiElement.java @@ -186,7 +186,7 @@ public abstract class JavaStubPsiElement extends StubBase return cloneImpl(treeElementClone); } - protected StubBasedPsiElementBase cloneImpl(CompositeElement treeElementClone) { + protected StubBasedPsiElementBase cloneImpl(@NotNull CompositeElement treeElementClone) { StubBasedPsiElementBase clone = (StubBasedPsiElementBase)super.clone(); clone.setNode(treeElementClone); treeElementClone.setPsi(clone); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassImpl.java index e6acdad103bc..186b3430cb39 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassImpl.java @@ -655,11 +655,11 @@ public class PsiClassImpl extends JavaStubPsiElement> implements } @Override - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { putInfo(this, info); } - public static void putInfo(PsiClass psiClass, Map info) { + public static void putInfo(@NotNull PsiClass psiClass, @NotNull Map info) { info.put("className", psiClass.getName()); info.put("qualifiedClassName", psiClass.getQualifiedName()); PsiFile file = psiClass.getContainingFile(); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiFieldImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiFieldImpl.java index feffcfa8b6d3..675b4d58efa0 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiFieldImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiFieldImpl.java @@ -458,7 +458,7 @@ public class PsiFieldImpl extends JavaStubPsiElement implements Ps } @Override - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { info.put("fieldName", getName()); } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiMethodImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiMethodImpl.java index 20948f4e00f2..ba7bed204c82 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiMethodImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiMethodImpl.java @@ -381,7 +381,7 @@ public class PsiMethodImpl extends JavaStubPsiElement implements } @Override - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { info.put("methodName", getName()); } diff --git a/java/testFramework/src/com/intellij/testFramework/fixtures/LightCodeInsightFixtureTestCase.java b/java/testFramework/src/com/intellij/testFramework/fixtures/LightCodeInsightFixtureTestCase.java index 085ef157c107..8774292a3550 100644 --- a/java/testFramework/src/com/intellij/testFramework/fixtures/LightCodeInsightFixtureTestCase.java +++ b/java/testFramework/src/com/intellij/testFramework/fixtures/LightCodeInsightFixtureTestCase.java @@ -16,7 +16,6 @@ package com.intellij.testFramework.fixtures; import com.intellij.lang.Language; -import com.intellij.openapi.application.PathManager; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; @@ -27,6 +26,7 @@ import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.testFramework.IdeaTestCase; import com.intellij.testFramework.LightProjectDescriptor; +import com.intellij.testFramework.PlatformTestUtil; import com.intellij.testFramework.UsefulTestCase; import com.intellij.testFramework.fixtures.impl.LightTempDirTestFixtureImpl; import org.jetbrains.annotations.NonNls; @@ -93,7 +93,10 @@ public abstract class LightCodeInsightFixtureTestCase extends UsefulTestCase{ */ @NonNls protected final String getTestDataPath() { - return PathManager.getHomePath().replace(File.separatorChar, '/') + getBasePath(); + String communityPath = PlatformTestUtil.getCommunityPath().replace(File.separatorChar, '/'); + String path = communityPath + getBasePath(); + if (new File(path).exists()) return path; + return communityPath + "/../" + getBasePath(); } @Override diff --git a/platform/core-api/src/com/intellij/openapi/ui/Queryable.java b/platform/core-api/src/com/intellij/openapi/ui/Queryable.java index f57b6e4dcb8e..263153ffc0e2 100644 --- a/platform/core-api/src/com/intellij/openapi/ui/Queryable.java +++ b/platform/core-api/src/com/intellij/openapi/ui/Queryable.java @@ -23,7 +23,7 @@ import java.util.Map; public interface Queryable { - void putInfo(Map info); + void putInfo(@NotNull Map info); class PrintInfo { String[] myIdKeys; @@ -69,7 +69,7 @@ public interface Queryable { id = map.values().iterator().next(); } - StringBuffer info = new StringBuffer(); + StringBuilder info = new StringBuilder(); if (print.myInfoKeys != null) { for (String eachKey : print.myInfoKeys) { String eachValue = map.get(eachKey); @@ -92,7 +92,7 @@ public interface Queryable { } interface Contributor { - void apply(Map info); + void apply(@NotNull Map info); } } \ No newline at end of file diff --git a/platform/core-impl/src/com/intellij/psi/impl/file/PsiBinaryFileImpl.java b/platform/core-impl/src/com/intellij/psi/impl/file/PsiBinaryFileImpl.java index 3cac0a42fa82..63c635330433 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/file/PsiBinaryFileImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/file/PsiBinaryFileImpl.java @@ -307,7 +307,7 @@ public class PsiBinaryFileImpl extends PsiElementBase implements PsiBinaryFile, } @Override - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { info.put("fileName", getName()); info.put("fileType", getFileType().getName()); } diff --git a/platform/core-impl/src/com/intellij/psi/impl/file/PsiDirectoryImpl.java b/platform/core-impl/src/com/intellij/psi/impl/file/PsiDirectoryImpl.java index 051dd1d5990e..4a8e7f0a0e07 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/file/PsiDirectoryImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/file/PsiDirectoryImpl.java @@ -612,7 +612,7 @@ public class PsiDirectoryImpl extends PsiElementBase implements PsiDirectory, Qu } @Override - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { info.put("fileName", getName()); } } diff --git a/platform/core-impl/src/com/intellij/psi/impl/file/PsiPackageBase.java b/platform/core-impl/src/com/intellij/psi/impl/file/PsiPackageBase.java index 276ef9cbef08..9daf93817a0e 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/file/PsiPackageBase.java +++ b/platform/core-impl/src/com/intellij/psi/impl/file/PsiPackageBase.java @@ -299,7 +299,7 @@ public abstract class PsiPackageBase extends PsiElementBase implements PsiDirect } @Override - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { info.put("packageName", getName()); info.put("packageQualifiedName", getQualifiedName()); } diff --git a/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java b/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java index 61e535774ca6..028136323a38 100644 --- a/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java +++ b/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java @@ -16,12 +16,14 @@ package com.intellij.execution; +import com.intellij.execution.configurations.ConfigurationType; import com.intellij.execution.configurations.RunConfiguration; import com.intellij.execution.impl.RunDialog; import com.intellij.execution.impl.RunManagerImpl; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.runners.ExecutionUtil; import com.intellij.execution.runners.ProgramRunner; +import com.intellij.internal.statistic.UsageTrigger; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; @@ -76,6 +78,11 @@ public class ProgramRunnerUtil { } } + final ConfigurationType configurationType = configuration.getType(); + if (configurationType != null) { + UsageTrigger.trigger("execute." + configurationType.getId() + "." + executor.getId()); + } + try { runner.execute(executor, new ExecutionEnvironment(runner, configuration, project)); } diff --git a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java index c15259f45760..a6d8f607482a 100644 --- a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java +++ b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java @@ -815,7 +815,7 @@ public class NavBarPanel extends JPanel implements DataProvider, PopupOwner, Dis } @Override - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { StringBuilder result = new StringBuilder(); for (int i = 0; i < myList.size(); i++) { NavBarItem each = myList.get(i); diff --git a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPopup.java b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPopup.java index 98fe6fdddcc2..f131e966b4fc 100644 --- a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPopup.java +++ b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPopup.java @@ -220,7 +220,7 @@ public class NavBarPopup extends LightweightHint implements Disposable{ } @Override - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { myPanel.putInfo(info); } diff --git a/platform/lang-impl/src/com/intellij/psi/stubs/StubUpdatingIndex.java b/platform/lang-impl/src/com/intellij/psi/stubs/StubUpdatingIndex.java index 47391f79d55f..b8326d3e5a84 100644 --- a/platform/lang-impl/src/com/intellij/psi/stubs/StubUpdatingIndex.java +++ b/platform/lang-impl/src/com/intellij/psi/stubs/StubUpdatingIndex.java @@ -80,7 +80,7 @@ public class StubUpdatingIndex extends CustomImplementationFileBasedIndexExtensi return elementType instanceof IStubFileElementType && (((IStubFileElementType)elementType).shouldBuildStubFor(file) || IndexingStamp.isFileIndexed(file, INDEX_ID, IndexInfrastructure.getIndexCreationStamp(INDEX_ID))); } - else if (fileType.isBinary()) { + if (fileType.isBinary()) { final BinaryFileStubBuilder builder = BinaryFileStubBuilders.INSTANCE.forFileType(fileType); return builder != null && builder.acceptsFile(file); } diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeNode.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeNode.java index 18dd2a9ded50..d38c34d6e7a5 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeNode.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeNode.java @@ -153,7 +153,7 @@ public abstract class AbstractTreeNode extends PresentableNodeDescriptor impl return getTestPresentation(); } - public void apply(Map info) { + public void apply(@NotNull Map info) { } /** diff --git a/platform/platform-api/src/com/intellij/ui/tabs/TabInfo.java b/platform/platform-api/src/com/intellij/ui/tabs/TabInfo.java index ec5e96c72169..3ffe498ed2e8 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/TabInfo.java +++ b/platform/platform-api/src/com/intellij/ui/tabs/TabInfo.java @@ -21,6 +21,7 @@ import com.intellij.openapi.util.IconLoader; import com.intellij.ui.SimpleColoredText; import com.intellij.ui.SimpleTextAttributes; import com.intellij.ui.content.AlertIcon; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -350,7 +351,7 @@ public final class TabInfo implements Queryable { return this; } - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { if (myQueryable != null) { myQueryable.putInfo(info); } diff --git a/platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.java b/platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.java index d3bcf1b42a69..58fe30399f6d 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.java +++ b/platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.java @@ -3038,7 +3038,7 @@ public class JBTabsImpl extends JComponent return getTabsPosition() == JBTabsPosition.top || getTabsPosition() == JBTabsPosition.bottom; } - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { final TabInfo selected = getSelectedInfo(); if (selected != null) { selected.putInfo(info); diff --git a/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java b/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java index 2746d51ddb37..c3d613338de0 100644 --- a/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java +++ b/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java @@ -638,7 +638,7 @@ public class Tree extends JTree implements ComponentWithEmptyText, ComponentWith boolean accept(T node); } - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { final TreePath[] selection = getSelectionPaths(); if (selection == null) return; diff --git a/platform/platform-impl/src/com/intellij/internal/statistic/UsageTrigger.java b/platform/platform-impl/src/com/intellij/internal/statistic/UsageTrigger.java new file mode 100644 index 000000000000..5fac770339de --- /dev/null +++ b/platform/platform-impl/src/com/intellij/internal/statistic/UsageTrigger.java @@ -0,0 +1,97 @@ +/* + * Copyright 2000-2011 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.internal.statistic; + +import com.intellij.internal.statistic.beans.GroupDescriptor; +import com.intellij.internal.statistic.beans.UsageDescriptor; +import com.intellij.openapi.components.PersistentStateComponent; +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.components.State; +import com.intellij.openapi.components.Storage; +import com.intellij.openapi.project.Project; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.xmlb.annotations.MapAnnotation; +import com.intellij.util.xmlb.annotations.Tag; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * User: ksafonov + */ +@State(name = "UsageTrigger", storages = {@Storage(file = "$APP_CONFIG$/statistics.application.usages.xml")}) +public class UsageTrigger implements PersistentStateComponent { + + public static class State { + @Tag("counts") + @MapAnnotation(surroundWithTag = false, keyAttributeName = "feature", valueAttributeName = "count") + public Map myValues = new HashMap(); + } + + private State myState = new State(); + + public static void trigger(@NotNull String feature) { + getInstance().doTrigger(feature); + } + + private static UsageTrigger getInstance() { + return ServiceManager.getService(UsageTrigger.class); + } + + private void doTrigger(String feature) { + final Integer count = myState.myValues.get(feature); + if (count == null) { + myState.myValues.put(feature, 1); + } + else { + myState.myValues.put(feature, count + 1); + } + } + + public State getState() { + return myState; + } + + public void loadState(final State state) { + myState = state; + } + + + public static class MyCollector extends UsagesCollector { + + private static final GroupDescriptor GROUP = GroupDescriptor.create("features counts", GroupDescriptor.HIGHER_PRIORITY); + + @NotNull + public Set getUsages(@Nullable final Project project) { + final State state = UsageTrigger.getInstance().getState(); + return ContainerUtil.map2Set(state.myValues.entrySet(), new Function, UsageDescriptor>() { + public UsageDescriptor fun(final Map.Entry e) { + return new UsageDescriptor(e.getKey(), e.getValue()); + } + }); + } + + @NotNull + public GroupDescriptor getGroupId() { + return GROUP; + } + } + +} diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorComponentImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorComponentImpl.java index 50a87000b721..5d650e62dacc 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorComponentImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorComponentImpl.java @@ -29,6 +29,7 @@ import com.intellij.openapi.ui.Queryable; import com.intellij.openapi.ui.TypingTarget; import com.intellij.openapi.util.ActionCallback; import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; @@ -206,7 +207,7 @@ public class EditorComponentImpl extends JComponent implements Scrollable, DataP } @Override - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { myEditor.putInfo(info); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 5ad9c5efe6d9..31193d3708bd 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -317,6 +317,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi @Override public void attributesChanged(@NotNull RangeHighlighterEx highlighter) { + if (myDocument.isInBulkUpdate()) return; // bulkUpdateFinished() will repaint anything int textLength = myDocument.getTextLength(); int start = Math.min(Math.max(highlighter.getAffectedAreaStartOffset(), 0), textLength); @@ -2500,6 +2501,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi myPaintSelection = paintSelection; } + @NonNls public String dumpState() { return "prefix: '" + (myPrefixText == null ? "none" : new String(myPrefixText)) + "', allow caret inside tab: " + mySettings.isCaretInsideTabs() @@ -5167,6 +5169,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi selectWordAtCaret(false); break; } + //noinspection fallthrough case 4: mySelectionModel.selectLineAtCaret(); setMouseSelectionState(MOUSE_SELECTION_STATE_LINE_SELECTED); @@ -6090,7 +6093,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } @Override - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { final VisualPosition visual = getCaretModel().getVisualPosition(); info.put("caret", visual.getLine() + ":" + visual.getColumn()); } diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorTabbedContainer.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorTabbedContainer.java index f4cc2045a3ea..7e1a872618ee 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorTabbedContainer.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorTabbedContainer.java @@ -331,7 +331,7 @@ final class EditorTabbedContainer implements Disposable, CloseAction.CloseTarget myTab = tab; } - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { info.put("editorTab", myTab.getText()); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java b/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java index 8d203c82592b..d3e4871fe115 100644 --- a/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java @@ -537,7 +537,7 @@ public class DialogWrapperPeerImpl extends DialogWrapperPeer implements FocusTra return this; } - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { info.put("dialog", getTitle()); } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/InternalDecorator.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/InternalDecorator.java index 208870ddfb03..1a9bd32106cf 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/InternalDecorator.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/InternalDecorator.java @@ -38,6 +38,7 @@ import com.intellij.ui.content.Content; import com.intellij.util.Producer; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import javax.swing.border.Border; @@ -825,7 +826,7 @@ public final class InternalDecorator extends JPanel implements Queryable, TypeSa return myTitlePanel; } - public void putInfo(Map info) { + public void putInfo(@NotNull Map info) { info.put("toolWindowTitle", myToolWindow.getTitle()); final Content selection = myToolWindow.getContentManager().getSelectedContent(); diff --git a/platform/platform-resources/src/META-INF/PlatformExtensions.xml b/platform/platform-resources/src/META-INF/PlatformExtensions.xml index 44f163993192..475822941e4f 100644 --- a/platform/platform-resources/src/META-INF/PlatformExtensions.xml +++ b/platform/platform-resources/src/META-INF/PlatformExtensions.xml @@ -138,6 +138,8 @@ + + + diff --git a/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java b/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java index 22c2b96272d4..51dc16b45582 100644 --- a/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java +++ b/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java @@ -57,6 +57,7 @@ import com.intellij.openapi.module.ModuleType; import com.intellij.openapi.project.ModuleListener; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; +import com.intellij.openapi.project.ProjectManagerAdapter; import com.intellij.openapi.project.ex.ProjectEx; import com.intellij.openapi.project.ex.ProjectManagerEx; import com.intellij.openapi.project.impl.ProjectImpl; @@ -212,7 +213,6 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da new Throwable(projectFile.getPath()).printStackTrace(new PrintStream(buffer)); ourProject = PlatformTestCase.createProject(projectFile, LIGHT_PROJECT_MARK +buffer.toString()); - if (!ourHaveShutdownHook) { ourHaveShutdownHook = true; registerShutdownHook(); @@ -348,7 +348,8 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da } ((ProjectImpl)ourProject).setTemporarilyDisposed(false); - ProjectManagerEx.getInstanceEx().setCurrentTestProject(ourProject); + ProjectManagerEx projectManagerEx = ProjectManagerEx.getInstanceEx(); + projectManagerEx.setCurrentTestProject(ourProject); ((PsiDocumentManagerImpl)PsiDocumentManager.getInstance(getProject())).clearUncommitedDocuments(); @@ -417,7 +418,8 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da catch (Exception e) { } - assertTrue("open: "+getProject().isOpen()+"; disposed:"+getProject().isDisposed()+"; startup passed:"+ passed+"; testProjectIsOurProject:"+(getProject() == ProjectManagerEx.getInstanceEx().getCurrentTestProject())+"; all open projects: "+ + assertTrue("open: "+getProject().isOpen()+"; disposed:"+getProject().isDisposed()+"; startup passed:"+ passed+"; testProjectIsOurProject:"+(getProject() == projectManagerEx + .getCurrentTestProject())+"; all open projects: "+ Arrays.asList(ProjectManager.getInstance().getOpenProjects()), getProject().isInitialized()); CodeStyleSettingsManager.getInstance(getProject()).setTemporarySettings(new CodeStyleSettings()); @@ -427,6 +429,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da Document[] unsavedDocuments = manager.getUnsavedDocuments(); manager.saveAllDocuments(); ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override public void run() { ((FileDocumentManagerImpl)manager).dropAllUnsavedDocuments(); } @@ -549,16 +552,28 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da } } - public static void checkEditorsReleased() { + public static void checkEditorsReleased() throws Exception { + CompositeException result = new CompositeException(); final Editor[] allEditors = EditorFactory.getInstance().getAllEditors(); if (allEditors.length > 0) { String fail = null; for (Editor editor : allEditors) { fail = EditorFactoryImpl.notReleasedError(editor); - EditorFactory.getInstance().releaseEditor(editor); + try { + EditorFactory.getInstance().releaseEditor(editor); + } + catch (Throwable e) { + result.add(e); + } + } + try { + fail("Unreleased editors: " + allEditors.length + "\n"+fail); + } + catch (Throwable e) { + result.add(e); } - fail("Unreleased editors: " + allEditors.length + "\n"+fail); } + if (!result.isEmpty()) throw result; } @Override @@ -723,6 +738,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da @Override public void run() { ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override public void run() { closeAndDeleteProject(); } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java index 6b82dc03f532..81ddc58e5cf2 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java @@ -102,7 +102,7 @@ public class ChangesViewManager implements ChangesViewI, JDOMExternalizable, Pro private final TreeSelectionListener myTsl; private final FileAndDocumentListenersForShortDiff myListenersForShortDiff; private Content myContent; - private TreePath[] mySelectedPaths; + private Change[] mySelectedPaths; public static ChangesViewI getInstance(Project project) { return PeriodicalTasksCloser.getInstance().safeGetComponent(project, ChangesViewI.class); @@ -160,11 +160,24 @@ public class ChangesViewManager implements ChangesViewI, JDOMExternalizable, Pro myTsl = new TreeSelectionListener() { @Override public void valueChanged(TreeSelectionEvent e) { - if (mySelectedPaths == null && e.getPaths() == null) { + Change[] selectedChanges = myView.getSelectedChanges(); + if (mySelectedPaths == null && selectedChanges == null) { return; } - if (checkSelectionNotChanged(e)) return; - mySelectedPaths = e.getPaths(); + if (mySelectedPaths != null && selectedChanges != null) { + if (mySelectedPaths.length == selectedChanges.length) { + boolean changed = false; + int idx = 0; + for (; idx < selectedChanges.length; idx++) { + Change change = selectedChanges[idx]; + if (! change.equals(mySelectedPaths[idx])) { + changed = true; + break; + } + } + if (! changed) return; + } + } if (LOG.isDebugEnabled()) { StringWriter sw = new StringWriter(); new Throwable().printStackTrace(new PrintWriter(sw)); @@ -178,31 +191,6 @@ public class ChangesViewManager implements ChangesViewI, JDOMExternalizable, Pro }); } - private boolean checkSelectionNotChanged(TreeSelectionEvent e) { - if (mySelectedPaths != null && e.getPaths() != null) { - if (mySelectedPaths.length == e.getPaths().length) { - boolean equal = true; - int idx = 0; - TreePath[] paths = e.getPaths(); - for (; idx < mySelectedPaths.length; idx ++) { - Object last1 = mySelectedPaths[idx].getLastPathComponent(); - Object last2 = paths[idx].getLastPathComponent(); - if (last1 instanceof ChangesBrowserNode && last2.getClass().equals(last1.getClass())) { - equal = Comparing.equal(((ChangesBrowserNode)last1).getUserObject(), ((ChangesBrowserNode) last2).getUserObject()); - if (! equal) break; - } else { - equal = false; - break; - } - } - if (equal) { - return true; - } - } - } - return false; - } - private String toStringPaths(TreePath[] paths) { if (paths == null) return "null"; if (paths.length == 0) return "empty"; diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsChangeDetailsManager.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsChangeDetailsManager.java index fe8754870adc..0de56dc1eaf5 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsChangeDetailsManager.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsChangeDetailsManager.java @@ -106,6 +106,8 @@ public class VcsChangeDetailsManager { @Override public boolean canComment(Change change) { + FilePath path = ChangesUtil.getFilePath(change); + if (path != null && path.isDirectory()) return false; return ShowDiffAction.isBinaryChangeAndCanShow(myProject, change); } diff --git a/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/history/RootsAndBranches.java b/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/history/RootsAndBranches.java index aaee1d9663ce..15c8d5302923 100644 --- a/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/history/RootsAndBranches.java +++ b/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/history/RootsAndBranches.java @@ -210,11 +210,12 @@ public class RootsAndBranches implements CommittedChangeListDecorator { indicator.setIndeterminate(true); final Map panels = new HashMap(); final Map holders = new HashMap(); - final JPanel mainPanel = prepareData(panels, holders); + final List roots = myDataLoader.loadRoots(); SwingUtilities.invokeLater(new Runnable() { public void run() { if (myDisposed) return; - + final JPanel mainPanel = prepareData(panels, holders, roots); + myMergePanels.clear(); myHolders.clear(); myMergePanels.putAll(panels); @@ -270,9 +271,9 @@ public class RootsAndBranches implements CommittedChangeListDecorator { myToolbarComponent = actionToolbar.getComponent(); } - private JPanel prepareData(final Map panels, final Map holders) { - final List roots = myDataLoader.loadRoots(); - + private JPanel prepareData(final Map panels, + final Map holders, + List roots) { final JPanel mainPanel = new JPanel(new GridBagLayout()); boolean onlyOneRoot = roots.size() == 1; final GridBagConstraints gb = new GridBagConstraints(0, 0, 1, 1, 1, 0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL,