From 7a17222ff68ce0a31b05047e6d1303b0819cdb2e Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 17 Apr 2012 11:38:11 +0200 Subject: [PATCH 1/7] test data for (IDEA-70468) --- .../UncheckedWarningsLevel6.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/UncheckedWarningsLevel6.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/UncheckedWarningsLevel6.java index ad6d8e79d114..2765ed42befa 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/UncheckedWarningsLevel6.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/UncheckedWarningsLevel6.java @@ -1,3 +1,4 @@ +import java.lang.Override; import java.util.*; class GenericsTest { @@ -91,4 +92,30 @@ class GenericsTest2 { } }; } +} +class Example { + private static void assertThat(T actual, Matcher matcher) { + assert actual != null; + assert matcher != null; + } + + private static Matcher> hasSize(int size) { + assert size >=0; + return new Matcher>() { + @Override + public void foo(Collection es) { + System.out.println(es); + } + }; + } + + public static void main(String[] args) { + List list = new ArrayList(); + System.out.println(list); + assertThat(new ArrayList(), hasSize(0)); + } + + private interface Matcher { + void foo(T t); + } } \ No newline at end of file From ca8c474bf621e26fdfa02682fb1ce7b0636dd644 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 17 Apr 2012 12:08:52 +0200 Subject: [PATCH 2/7] illegal generic type for instanceof checks (IDEA-76997) --- .../impl/analysis/GenericsHighlightUtil.java | 7 +++++ .../IllegalGenericTypeInInstanceof.java | 27 +++++++++++++++++++ .../daemon/GenericsHighlightingTest.java | 1 + 3 files changed, 35 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IllegalGenericTypeInInstanceof.java diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java index 9186a5ba227c..23eb2f2969cc 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java @@ -973,6 +973,13 @@ public class GenericsHighlightUtil { return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, ref, JavaErrorMessages.message("generics.cannot.instanceof.type.parameters")); } + if (resolved instanceof PsiClass) { + final PsiClass containingClass = ((PsiClass)resolved).getContainingClass(); + if (containingClass != null && ref.getQualifier() == null && containingClass.getTypeParameters().length > 0) { + return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, typeElement, JavaErrorMessages.message("illegal.generic.type.for.instanceof")); + } + } + final PsiType[] parameters = ref.getTypeParameters(); for (PsiType parameterType : parameters) { if (parameterType != null && diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IllegalGenericTypeInInstanceof.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IllegalGenericTypeInInstanceof.java new file mode 100644 index 000000000000..bb183a1c2622 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IllegalGenericTypeInInstanceof.java @@ -0,0 +1,27 @@ +class A { + public void foo(Object object) { + if (object instanceof B) {} + if (object instanceof A.B) {} + if (object instanceof A.B) {} + if (object instanceof A) {} + if (object instanceof A) {} + if (object instanceof A) {} + if (object instanceof A[]) {} + if (object instanceof B[]) {} + if (object instanceof A.B[]) {} + } + + private class B { + } +} + +class A1 { + public void foo(Object object) { + if (object instanceof B1) {} + if (object instanceof A1.B1) {} + if (object instanceof B1[]) {} + } + + private class B1 { + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java index 246a97b67eb6..e86b90d047ac 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -132,6 +132,7 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { public void testIDEA74899() throws Exception {doTest(false);} public void testIDEA63291() throws Exception {doTest(false);} public void testIDEA72912() throws Exception {doTest(false);} + public void testIllegalGenericTypeInInstanceof() throws Exception {doTest(false);} public void testJavaUtilCollections_NoVerify() throws Exception { PsiClass collectionsClass = getJavaFacade().findClass("java.util.Collections", GlobalSearchScope.moduleWithLibrariesScope(getModule())); From 36ae1aa2b60215d62b052c459ebe223545af49c0 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 17 Apr 2012 14:18:35 +0400 Subject: [PATCH 3/7] cleanup --- .../openapi/editor/impl/MarkupModelImpl.java | 2 +- .../vfs/impl/VirtualFilePointerManagerImpl.java | 16 ++++++++-------- .../openapi/vfs/impl/jar/JarFileSystemImpl.java | 8 ++++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/MarkupModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/MarkupModelImpl.java index dbf009d2ea8d..9f291f683e54 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/MarkupModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/MarkupModelImpl.java @@ -91,7 +91,7 @@ public class MarkupModelImpl extends UserDataHolderBase implements MarkupModelEx return addRangeHighlighterAndChangeAttributes(offset, offset, layer, textAttributes, HighlighterTargetArea.LINES_IN_RANGE, true, null); } - static int getFirstNonspaceCharOffset(@NotNull Document doc, int lineNumber) { + private static int getFirstNonspaceCharOffset(@NotNull Document doc, int lineNumber) { int lineStart = doc.getLineStartOffset(lineNumber); int lineEnd = doc.getLineEndOffset(lineNumber); CharSequence text = doc.getCharsSequence(); diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/VirtualFilePointerManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/VirtualFilePointerManagerImpl.java index afde58208c46..93d834757446 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/VirtualFilePointerManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/VirtualFilePointerManagerImpl.java @@ -134,23 +134,23 @@ public class VirtualFilePointerManagerImpl extends VirtualFilePointerManager imp } private static boolean startsWith(final String url, final String pointerUrl) { - String urlSuffix = stripSuffix(url); - String pointerPrefix = stripToJarPrefix(pointerUrl); - if (urlSuffix.length() > 0) { - return Comparing.equal(stripToJarPrefix(url), pointerPrefix, SystemInfo.isFileSystemCaseSensitive) && - StringUtil.startsWith(urlSuffix, stripSuffix(pointerUrl)); + String urlSuffix = substringAfterJarSeparator(url); + String pointerPrefix = substringBeforeJarSeparator(pointerUrl); + if (!urlSuffix.isEmpty()) { + return Comparing.equal(substringBeforeJarSeparator(url), pointerPrefix, SystemInfo.isFileSystemCaseSensitive) && + StringUtil.startsWith(urlSuffix, substringAfterJarSeparator(pointerUrl)); } - return FileUtil.startsWith(pointerPrefix, stripToJarPrefix(url)); + return FileUtil.startsWith(pointerPrefix, substringBeforeJarSeparator(url)); } - private static String stripToJarPrefix(String url) { + private static String substringBeforeJarSeparator(String url) { int separatorIndex = url.indexOf(JarFileSystem.JAR_SEPARATOR); if (separatorIndex < 0) return url; return url.substring(0, separatorIndex); } - private static String stripSuffix(String url) { + private static String substringAfterJarSeparator(String url) { int separatorIndex = url.indexOf(JarFileSystem.JAR_SEPARATOR); if (separatorIndex < 0) return ""; return url.substring(separatorIndex + JarFileSystem.JAR_SEPARATOR.length()); diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/jar/JarFileSystemImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/jar/JarFileSystemImpl.java index ee58d65f44ba..12337975ee83 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/jar/JarFileSystemImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/jar/JarFileSystemImpl.java @@ -28,6 +28,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.*; import com.intellij.openapi.vfs.newvfs.*; import com.intellij.openapi.vfs.newvfs.events.VFileEvent; +import com.intellij.util.ArrayUtil; import com.intellij.util.containers.ConcurrentHashSet; import com.intellij.util.messages.MessageBus; import com.intellij.util.text.CaseInsensitiveStringHashingStrategy; @@ -76,11 +77,10 @@ public class JarFileSystemImpl extends JarFileSystem implements ApplicationCompo String[] jarPaths; synchronized (LOCK) { - if (jarPathsCache == null) { - Set jarPathsSet = myHandlers.keySet(); - jarPathsCache = jarPathsSet.toArray(new String[jarPathsSet.size()]); - } jarPaths = jarPathsCache; + if (jarPaths == null) { + jarPathsCache = jarPaths = ArrayUtil.toStringArray(myHandlers.keySet()); + } } for (String jarPath : jarPaths) { From 8c7d3c6fd3b3d9a14f742c22d7131eff69b25040 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 17 Apr 2012 15:14:01 +0400 Subject: [PATCH 4/7] html5 fixes: return xhtml schema from XmlDocument, return xhtml4 schema location if html4 is chosen as default language level --- .../javaee/ExternalResourceManagerImpl.java | 3 ++- .../javaee/HtmlLanguageLevelForm.java | 2 +- .../psi/impl/source/xml/XmlDocumentImpl.java | 10 +++++++++- .../src/com/intellij/xml/util/XmlUtil.java | 19 ++++++++++++++----- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/xml/impl/src/com/intellij/javaee/ExternalResourceManagerImpl.java b/xml/impl/src/com/intellij/javaee/ExternalResourceManagerImpl.java index 76a786182ce8..d2119ef9c9e0 100644 --- a/xml/impl/src/com/intellij/javaee/ExternalResourceManagerImpl.java +++ b/xml/impl/src/com/intellij/javaee/ExternalResourceManagerImpl.java @@ -417,7 +417,8 @@ public class ExternalResourceManagerImpl extends ExternalResourceManagerEx imple @Override @NotNull public String getDefaultHtmlDoctype(@NotNull Project project) { - return getProjectResources(project).myDefaultHtmlDoctype; + final String doctype = getProjectResources(project).myDefaultHtmlDoctype; + return XmlUtil.XHTML_URI.equals(doctype) ? XmlUtil.XHTML4_SCHEMA_LOCATION : doctype; } @Override diff --git a/xml/impl/src/com/intellij/javaee/HtmlLanguageLevelForm.java b/xml/impl/src/com/intellij/javaee/HtmlLanguageLevelForm.java index f978d1da683e..ba5f870f9273 100644 --- a/xml/impl/src/com/intellij/javaee/HtmlLanguageLevelForm.java +++ b/xml/impl/src/com/intellij/javaee/HtmlLanguageLevelForm.java @@ -80,7 +80,7 @@ public class HtmlLanguageLevelForm { } public void resetFromDoctype(String doctype) { - if (doctype == null || doctype.length() == 0 || doctype.equals(XmlUtil.XHTML_URI)) { + if (doctype == null || doctype.length() == 0 || doctype.equals(XmlUtil.XHTML4_SCHEMA_LOCATION)) { myHtml4RadioButton.setSelected(true); myDoctypeTextField.setEnabled(false); } diff --git a/xml/impl/src/com/intellij/psi/impl/source/xml/XmlDocumentImpl.java b/xml/impl/src/com/intellij/psi/impl/source/xml/XmlDocumentImpl.java index 2a9ba82516e3..cc2cb22980ed 100644 --- a/xml/impl/src/com/intellij/psi/impl/source/xml/XmlDocumentImpl.java +++ b/xml/impl/src/com/intellij/psi/impl/source/xml/XmlDocumentImpl.java @@ -43,6 +43,7 @@ import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.xml.*; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.ConcurrentHashMap; +import com.intellij.xml.Html5SchemaProvider; import com.intellij.xml.XmlExtension; import com.intellij.xml.XmlNSDescriptor; import com.intellij.xml.util.XmlNSDescriptorSequence; @@ -207,12 +208,19 @@ public class XmlDocumentImpl extends XmlElementImpl implements XmlDocument { if (nsDescriptor == null) { String htmlns = ExternalResourceManagerEx.getInstanceEx().getDefaultHtmlDoctype(getProject()); if (htmlns == null || htmlns.length() == 0) { - htmlns = XmlUtil.XHTML_URI; + htmlns = Html5SchemaProvider.HTML5_SCHEMA_LOCATION; } nsDescriptor = getDefaultNSDescriptor(htmlns, false); } return new HtmlNSDescriptorImpl(nsDescriptor); } + else if (XmlUtil.XHTML_URI.equals(namespace)) { + String xhtmlNamespace = XmlUtil.getDefaultXhtmlNamespace(getProject()); + if (xhtmlNamespace == null || xhtmlNamespace.length() == 0) { + xhtmlNamespace = Html5SchemaProvider.XHTML5_SCHEMA_LOCATION; + } + return getDefaultNSDescriptor(xhtmlNamespace, false); + } else if (namespace != null && namespace != XmlUtil.EMPTY_URI) { if (doctype == null || !namespace.equals(XmlUtil.getDtdUri(doctype))) { boolean documentIsSchemaThatDefinesNs = namespace.equals(XmlUtil.getTargetSchemaNsFromTag(getRootTag())); diff --git a/xml/impl/src/com/intellij/xml/util/XmlUtil.java b/xml/impl/src/com/intellij/xml/util/XmlUtil.java index 8fff78934727..ff45a36b38c3 100644 --- a/xml/impl/src/com/intellij/xml/util/XmlUtil.java +++ b/xml/impl/src/com/intellij/xml/util/XmlUtil.java @@ -19,6 +19,7 @@ import com.intellij.codeInsight.completion.CompletionUtil; import com.intellij.codeInsight.daemon.Validator; import com.intellij.javaee.ExternalResourceManager; import com.intellij.javaee.ExternalResourceManagerEx; +import com.intellij.javaee.ExternalResourceManagerImpl; import com.intellij.javaee.UriUtil; import com.intellij.lang.ASTNode; import com.intellij.lang.Language; @@ -35,9 +36,11 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.CharsetToolkit; import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.patterns.StandardPatterns; import com.intellij.patterns.StringPattern; @@ -74,6 +77,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; +import java.net.URL; import java.util.*; /** @@ -152,10 +156,16 @@ public class XmlUtil { @NonNls public static final String WSDL_SCHEMA_URI = "http://schemas.xmlsoap.org/wsdl/"; public static final Key ORIGINAL_ELEMENT = Key.create("ORIGINAL_ELEMENT"); + public static final String XHTML4_SCHEMA_LOCATION; private XmlUtil() { } + static { + final URL xhtml4SchemaLocationUrl = XmlUtil.class.getResource(ExternalResourceManagerImpl.STANDARD_SCHEMAS + "xhtml1-transitional.xsd"); + XHTML4_SCHEMA_LOCATION = VfsUtil.urlToPath(VfsUtil.fixURLforIDEA(FileUtil.unquote(xhtml4SchemaLocationUrl.toExternalForm()))); + } + @Nullable public static String getSchemaLocation(XmlTag tag, String namespace) { final String uri = ExternalResourceManagerEx.getInstanceEx().getResourceLocation(namespace, tag.getProject()); @@ -604,11 +614,10 @@ public class XmlUtil { } public static String getDefaultXhtmlNamespace(Project project) { - String defaultHtmlDoctype = ExternalResourceManagerEx.getInstanceEx().getDefaultHtmlDoctype(project); - if (Html5SchemaProvider.HTML5_SCHEMA_LOCATION.equals(defaultHtmlDoctype)) { - defaultHtmlDoctype = Html5SchemaProvider.XHTML5_SCHEMA_LOCATION; - } - return defaultHtmlDoctype; + final String doctype = ExternalResourceManagerEx.getInstanceEx().getDefaultHtmlDoctype(project); + return Html5SchemaProvider.HTML5_SCHEMA_LOCATION.equals(doctype) + ? Html5SchemaProvider.XHTML5_SCHEMA_LOCATION + : doctype; } // //public static void expandTag(@NotNull XmlTag tag) { From e931f0d02f460209274caf0ee5d6424b3bab7a34 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 17 Apr 2012 15:16:10 +0400 Subject: [PATCH 5/7] change create html file action: html5 is by default now --- .../src/com/intellij/ide/actions/CreateHtmlFileAction.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xml/impl/src/com/intellij/ide/actions/CreateHtmlFileAction.java b/xml/impl/src/com/intellij/ide/actions/CreateHtmlFileAction.java index 7bc5112917cc..cbf690cf4ceb 100644 --- a/xml/impl/src/com/intellij/ide/actions/CreateHtmlFileAction.java +++ b/xml/impl/src/com/intellij/ide/actions/CreateHtmlFileAction.java @@ -43,8 +43,8 @@ public class CreateHtmlFileAction extends CreateFileFromTemplateAction implement protected void buildDialog(Project project, PsiDirectory directory, CreateFileFromTemplateDialog.Builder builder) { builder .setTitle(XmlBundle.message("new.html.file.action")) - .addKind("HTML file", StdFileTypes.HTML.getIcon(), FileTemplateManager.INTERNAL_HTML_TEMPLATE_NAME) - .addKind("HTML5 file", StdFileTypes.HTML.getIcon(), FileTemplateManager.INTERNAL_HTML5_TEMPLATE_NAME) + .addKind("HTML file", StdFileTypes.HTML.getIcon(), FileTemplateManager.INTERNAL_HTML5_TEMPLATE_NAME) + .addKind("HTML4 file", StdFileTypes.HTML.getIcon(), FileTemplateManager.INTERNAL_HTML_TEMPLATE_NAME) .addKind("XHTML file", StdFileTypes.XHTML.getIcon(), FileTemplateManager.INTERNAL_XHTML_TEMPLATE_NAME); } From c50fb806828a49ad33f26ab557f4a01fa1453f92 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Tue, 17 Apr 2012 15:49:38 +0400 Subject: [PATCH 6/7] Fix saving state of the checkbox "auto-commit on cherry-pick". --- plugins/git4idea/src/git4idea/config/GitVcsPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/git4idea/src/git4idea/config/GitVcsPanel.java b/plugins/git4idea/src/git4idea/config/GitVcsPanel.java index 6eedc1507ba3..d031d595c1d1 100644 --- a/plugins/git4idea/src/git4idea/config/GitVcsPanel.java +++ b/plugins/git4idea/src/git4idea/config/GitVcsPanel.java @@ -164,7 +164,7 @@ public class GitVcsPanel { !crlfPolicyItem(settings).equals(myConvertTextFilesComboBox.getSelectedItem()) || !settings.autoUpdateIfPushRejected() == myAutoUpdateIfPushRejected.isSelected() || ((settings.getSyncSetting() == GitBranchSyncSetting.SYNC) != mySyncBranchControl.isSelected() || - settings.isAutoCommitOnCherryPick() == myAutoCommitOnCherryPick.isSelected()); + settings.isAutoCommitOnCherryPick() != myAutoCommitOnCherryPick.isSelected()); } /** From 35b1953a938ce9be1b20e246f7ac65c1f41dd3eb Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Tue, 17 Apr 2012 14:02:14 +0200 Subject: [PATCH 7/7] IDEA-84698 Completion: shows focussed element way-off current completion list popup --- .../lookup/impl/CompletionExtender.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/CompletionExtender.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/CompletionExtender.java index 3ff721a98175..99e9b05e7517 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/CompletionExtender.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/CompletionExtender.java @@ -17,11 +17,14 @@ package com.intellij.codeInsight.lookup.impl; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.ui.HeavyweightHint; +import com.intellij.ui.awt.RelativePoint; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; /** * @author Konstantin Bulenkov @@ -36,6 +39,17 @@ public class CompletionExtender extends HeavyweightHint { myElement = element; myLookup = lookup; myIndex = myLookup.getList().getSelectedIndex(); + myLookup.getComponent().addComponentListener(new ComponentAdapter() { + @Override + public void componentResized(ComponentEvent e) { + recalculateLocation(); + } + + @Override + public void componentMoved(ComponentEvent e) { + recalculateLocation(); + } + }); } public LookupElement getLookupElement() { @@ -74,6 +88,18 @@ public class CompletionExtender extends HeavyweightHint { return false; } + void recalculateLocation() { + if (!isVisible()) return; + final JList list = myLookup.getList(); + final Point p = list.getLocationOnScreen(); + p.y += list.indexToLocation(list.getSelectedIndex()).y; + final JComponent rootPane = UIUtil.getRootPane(myLookup.getEditor().getContentComponent()); + if (rootPane != null) { + SwingUtilities.convertPointFromScreen(p, rootPane); + setLocation(new RelativePoint(rootPane, p)); + } + } + @Override public void hide() { super.hide();