diff --git a/java/java-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationPresentation.java b/java/java-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationPresentation.java index 9b64466a5a97..302e1faca415 100644 --- a/java/java-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationPresentation.java +++ b/java/java-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationPresentation.java @@ -15,6 +15,7 @@ */ package com.intellij.codeInspection.deadCode; +import com.intellij.codeInsight.highlighting.HighlightManager; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInspection.*; import com.intellij.codeInspection.ex.*; @@ -26,11 +27,19 @@ import com.intellij.lang.annotation.HighlightSeverity; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.colors.EditorColors; +import com.intellij.openapi.editor.colors.EditorColorsManager; +import com.intellij.openapi.editor.markup.TextAttributes; +import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vcs.FileStatus; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.profile.codeInspection.ui.SingleInspectionProfilePanel; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; @@ -39,8 +48,8 @@ import com.intellij.psi.PsiModifierListOwner; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtilCore; import com.intellij.refactoring.safeDelete.SafeDeleteHandler; +import com.intellij.ui.HyperlinkAdapter; import com.intellij.ui.ScrollPaneFactory; -import com.intellij.ui.components.JBScrollPane; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; @@ -54,10 +63,17 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import javax.swing.event.HyperlinkEvent; +import javax.swing.text.AttributeSet; +import javax.swing.text.SimpleAttributeSet; +import javax.swing.text.html.HTML; +import javax.swing.text.html.HTMLDocument; import javax.swing.text.html.HTMLEditorKit; import javax.swing.text.html.StyleSheet; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; +import java.awt.event.MouseEvent; +import java.net.URL; import java.util.*; public class UnusedDeclarationPresentation extends DefaultInspectionToolPresentation { @@ -529,14 +545,60 @@ public class UnusedDeclarationPresentation extends DefaultInspectionToolPresenta @Override public JComponent getCustomPreviewPanel(RefEntity entity) { - JEditorPane htmlView = new JEditorPane(); + final Project project = entity.getRefManager().getProject(); + JEditorPane htmlView = new JEditorPane() { + @Override + public String getToolTipText(MouseEvent evt) { + int pos = viewToModel(evt.getPoint()); + if (pos >= 0) { + HTMLDocument hdoc = (HTMLDocument) getDocument(); + javax.swing.text.Element e = hdoc.getCharacterElement(pos); + AttributeSet a = e.getAttributes(); + + SimpleAttributeSet value = (SimpleAttributeSet) a.getAttribute(HTML.Tag.A); + if (value != null) { + String objectPackage = (String) value.getAttribute("qualifiedname"); + if (objectPackage != null) { + return objectPackage; + } + } + } + return null; + } + }; htmlView.setContentType(UIUtil.HTML_MIME); htmlView.setEditable(false); htmlView.setOpaque(false); + htmlView.addHyperlinkListener(new HyperlinkAdapter() { + @Override + protected void hyperlinkActivated(HyperlinkEvent e) { + URL url = e.getURL(); + if (url == null) { + return; + } + @NonNls String ref = url.getRef(); + + int offset = Integer.parseInt(ref); + String fileURL = url.toExternalForm(); + fileURL = fileURL.substring(0, fileURL.indexOf('#')); + VirtualFile vFile = VirtualFileManager.getInstance().findFileByUrl(fileURL); + if (vFile == null) { + vFile = VfsUtil.findFileByURL(url); + } + if (vFile != null) { + final OpenFileDescriptor descriptor = new OpenFileDescriptor(project, vFile, offset); + FileEditorManager.getInstance(project).openTextEditor(descriptor, true); + } + } + }); final StyleSheet css = ((HTMLEditorKit)htmlView.getEditorKit()).getStyleSheet(); css.addRule("p.problem-description-group {text-indent: " + JBUI.scale(12) + "px;font-weight:bold;}"); css.addRule("div.problem-description {margin-left: " + JBUI.scale(10) + "px;}"); css.addRule("ul {margin-left:" + JBUI.scale(10) + "px;text-indent: 0}"); + //TODO Dmitry Batkovich: it's hack to hide tags in JEditorPane (any standard methods (display...) are unsupported in java) + final StringBuilder sb = new StringBuilder(); + UIUtil.appendColor(UIUtil.getLabelBackground(), sb); + css.addRule(".package {color: #" + sb.toString() + ";}"); final StringBuffer buf = new StringBuffer(); getComposer().compose(buf, entity, false); final String text = buf.toString(); diff --git a/java/java-impl/src/com/intellij/codeInspection/ex/HTMLJavaHTMLComposerImpl.java b/java/java-impl/src/com/intellij/codeInspection/ex/HTMLJavaHTMLComposerImpl.java index 53a444eaaeb0..ea448a93c7fc 100644 --- a/java/java-impl/src/com/intellij/codeInspection/ex/HTMLJavaHTMLComposerImpl.java +++ b/java/java-impl/src/com/intellij/codeInspection/ex/HTMLJavaHTMLComposerImpl.java @@ -273,6 +273,7 @@ public class HTMLJavaHTMLComposerImpl extends HTMLJavaHTMLComposer { public void appendReferencePresentation(RefEntity refElement, final StringBuffer buf, final boolean isPackageIncluded) { if (refElement instanceof RefImplicitConstructor) { buf.append(InspectionsBundle.message("inspection.export.results.implicit.constructor")); + buf.append(" "); refElement = ((RefImplicitConstructor)refElement).getOwnerClass(); } @@ -304,7 +305,15 @@ public class HTMLJavaHTMLComposerImpl extends HTMLJavaHTMLComposer { buf.append(myComposer.myExporter.getURL(refElement)); } - buf.append("\">"); + buf.append("\""); + + if (isPackageIncluded) { + buf.append(" qualifiedname=\""); + buf.append(refElement.getQualifiedName()); + buf.append("\""); + } + + buf.append(">"); if (refElement instanceof RefClass && ((RefClass)refElement).isAnonymous()) { buf.append(InspectionsBundle.message("inspection.reference.anonymous")); @@ -336,7 +345,7 @@ public class HTMLJavaHTMLComposerImpl extends HTMLJavaHTMLComposer { myComposer.appendElementReference(buf, ((RefElement)refElement.getOwner()), isPackageIncluded); } else if (isPackageIncluded) { - buf.append(" ").append(HTMLComposerImpl.CODE_OPENING).append("("); + buf.append(" ").append("").append("("); myComposer.appendQualifiedName(buf, refElement.getOwner()); // buf.append(RefUtil.getPackageName(refElement)); buf.append(")").append(HTMLComposerImpl.CODE_CLOSING); diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateInfoDialog.java b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateInfoDialog.java index 577ff2d93ac2..6c7a1ced59fe 100644 --- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateInfoDialog.java +++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateInfoDialog.java @@ -26,7 +26,6 @@ import com.intellij.openapi.application.PathManager; import com.intellij.openapi.application.ex.ApplicationInfoEx; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.util.Version; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.BrowserHyperlinkListener; import com.intellij.ui.JBColor; @@ -243,8 +242,6 @@ class UpdateInfoDialog extends AbstractUpdateDialog { } protected static String formatVersion(String versionString, String build) { - Version version = Version.parseVersion(versionString); - String formattedVersion = version != null ? version.toString() : versionString; - return IdeBundle.message("updates.version.info", formattedVersion, build); + return IdeBundle.message("updates.version.info", versionString, build); } } \ No newline at end of file diff --git a/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/GroovyLanguageInjectionSupport.java b/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/GroovyLanguageInjectionSupport.java index d7ebf757dc7c..0d66d21002f0 100644 --- a/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/GroovyLanguageInjectionSupport.java +++ b/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/GroovyLanguageInjectionSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2016 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,6 +31,7 @@ import org.intellij.plugins.intelliLang.inject.InjectorUtils; import org.intellij.plugins.intelliLang.inject.LanguageInjectionSupport; import org.intellij.plugins.intelliLang.inject.config.BaseInjection; import org.intellij.plugins.intelliLang.inject.java.JavaLanguageInjectionSupport; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -228,6 +229,7 @@ public class GroovyLanguageInjectionSupport extends AbstractLanguageInjectionSup }; } + @Contract("null -> false") private static boolean isStringLiteral(@Nullable PsiLanguageInjectionHost element) { if (element instanceof GrStringContent) { return true;