diff options
Diffstat (limited to 'platform/platform-impl/src/com/intellij/openapi/wm/impl')
5 files changed, 286 insertions, 198 deletions
diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeGlassPaneImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeGlassPaneImpl.java index 83696e07c7f8..71f964504102 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeGlassPaneImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeGlassPaneImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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,8 +20,9 @@ import com.intellij.ide.IdeTooltipManager; import com.intellij.ide.dnd.DnDAware; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.ui.Divider; import com.intellij.openapi.ui.Painter; -import com.intellij.openapi.ui.Splitter; import com.intellij.openapi.ui.impl.GlassPaneDialogWrapperPeer; import com.intellij.openapi.ui.popup.Balloon; import com.intellij.openapi.ui.popup.JBPopupFactory; @@ -42,6 +43,8 @@ import java.util.List; public class IdeGlassPaneImpl extends JPanel implements IdeGlassPaneEx, IdeEventQueue.EventDispatcher, Painter.Listener { + private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.wm.impl.IdeGlassPaneImpl"); + private final List<EventListener> myMouseListeners = new ArrayList<EventListener>(); private final Set<EventListener> mySortedMouseListeners = new TreeSet<EventListener>(new Comparator<EventListener>() { @Override @@ -360,9 +363,12 @@ public class IdeGlassPaneImpl extends JPanel implements IdeGlassPaneEx, IdeEvent } else { cursor = Cursor.getDefaultCursor(); - getRootPane().setCursor(cursor); - - + JRootPane rootPane = getRootPane(); + if (rootPane != null) { + rootPane.setCursor(cursor); + } else { + LOG.warn("Root pane is null. Event: " + e); + } restoreLastComponent(null); myLastOriginalCursor = null; myLastCursorComponent = null; @@ -375,7 +381,7 @@ public class IdeGlassPaneImpl extends JPanel implements IdeGlassPaneEx, IdeEvent private boolean canProcessCursorFor(Component target) { if (target instanceof JMenu || target instanceof JMenuItem || - target instanceof Splitter.Divider || + target instanceof Divider || target instanceof JSeparator || (target instanceof JEditorPane && ((JEditorPane)target).getEditorKit() instanceof HTMLEditorKit)) { return false; diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeadlessManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeadlessManagerImpl.java index d6e1d9994500..8b78b1632f79 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeadlessManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeadlessManagerImpl.java @@ -27,9 +27,11 @@ import com.intellij.openapi.actionSystem.ActionGroup; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.popup.Balloon; import com.intellij.openapi.util.ActionCallback; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.wm.*; @@ -41,7 +43,7 @@ import com.intellij.ui.content.ContentFactory; import com.intellij.ui.content.ContentManager; import com.intellij.ui.content.ContentManagerListener; import com.intellij.util.ArrayUtil; -import org.jetbrains.annotations.NonNls; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -50,12 +52,18 @@ import javax.swing.event.HyperlinkListener; import java.awt.*; import java.awt.event.InputEvent; import java.beans.PropertyChangeListener; -import java.util.ArrayList; -import java.util.Collections; +import java.util.*; import java.util.List; @SuppressWarnings({"ConstantConditions"}) public class ToolWindowHeadlessManagerImpl extends ToolWindowManagerEx { + private final Map<String, ToolWindow> myToolWindows = new HashMap<String, ToolWindow>(); + private final Project myProject; + + public ToolWindowHeadlessManagerImpl(Project project) { + myProject = project; + } + @Override public boolean canShowNotification(@NotNull String toolWindowId) { return false; @@ -65,7 +73,184 @@ public class ToolWindowHeadlessManagerImpl extends ToolWindowManagerEx { public void notifyByBalloon(@NotNull final String toolWindowId, @NotNull final MessageType type, @NotNull final String htmlBody) { } - public static final ToolWindow HEADLESS_WINDOW = new ToolWindowEx() { + private ToolWindow doRegisterToolWindow(final String id, @Nullable Disposable parentDisposable) { + MockToolWindow tw = new MockToolWindow(myProject); + myToolWindows.put(id, tw); + if (parentDisposable != null) { + Disposer.register(parentDisposable, new Disposable() { + @Override + public void dispose() { + unregisterToolWindow(id); + } + }); + } + return tw; + } + + @Override + public ToolWindow registerToolWindow(@NotNull String id, + @NotNull JComponent component, + @NotNull ToolWindowAnchor anchor, + Disposable parentDisposable, + boolean canWorkInDumbMode) { + return doRegisterToolWindow(id, parentDisposable); + } + + @Override + public ToolWindow registerToolWindow(@NotNull String id, @NotNull JComponent component, @NotNull ToolWindowAnchor anchor) { + return doRegisterToolWindow(id, null); + } + + @Override + public ToolWindow registerToolWindow(@NotNull String id, + @NotNull JComponent component, + @NotNull ToolWindowAnchor anchor, + Disposable parentDisposable, + boolean canWorkInDumbMode, + boolean canCloseContents) { + return doRegisterToolWindow(id, parentDisposable); + } + + @Override + public ToolWindow registerToolWindow(@NotNull String id, + @NotNull JComponent component, + @NotNull ToolWindowAnchor anchor, + Disposable parentDisposable) { + return doRegisterToolWindow(id, parentDisposable); + } + + @Override + public ToolWindow registerToolWindow(@NotNull final String id, final boolean canCloseContent, @NotNull final ToolWindowAnchor anchor) { + return doRegisterToolWindow(id, null); + } + + @Override + public ToolWindow registerToolWindow(@NotNull final String id, + final boolean canCloseContent, + @NotNull final ToolWindowAnchor anchor, + final boolean secondary) { + return doRegisterToolWindow(id, null); + } + + @Override + public ToolWindow registerToolWindow(@NotNull final String id, final boolean canCloseContent, @NotNull final ToolWindowAnchor anchor, + final Disposable parentDisposable, final boolean dumbAware) { + return doRegisterToolWindow(id, parentDisposable); + } + + @Override + public void unregisterToolWindow(@NotNull String id) { + myToolWindows.remove(id); + } + + @Override + public void activateEditorComponent() { + } + + @Override + public boolean isEditorComponentActive() { + return false; + } + + @Override + public String[] getToolWindowIds() { + return ArrayUtil.EMPTY_STRING_ARRAY; + } + + @Override + public String getActiveToolWindowId() { + return null; + } + + @Override + public ToolWindow getToolWindow(String id) { + return myToolWindows.get(id); + } + + @Override + public void invokeLater(Runnable runnable) { + } + + @Override + public IdeFocusManager getFocusManager() { + return IdeFocusManagerHeadless.INSTANCE; + } + + @Override + public void notifyByBalloon(@NotNull final String toolWindowId, + @NotNull final MessageType type, + @NotNull final String text, + @Nullable final Icon icon, + @Nullable final HyperlinkListener listener) { + } + + @Override + public Balloon getToolWindowBalloon(String id) { + return null; + } + + @Override + public void initToolWindow(ToolWindowEP bean) { + + } + + @Override + public void addToolWindowManagerListener(@NotNull ToolWindowManagerListener l) { + + } + + @Override + public void removeToolWindowManagerListener(@NotNull ToolWindowManagerListener l) { + } + + @Override + public String getLastActiveToolWindowId() { + return null; + } + + @Override + public String getLastActiveToolWindowId(Condition<JComponent> condition) { + return null; + } + + @Override + public DesktopLayout getLayout() { + return new DesktopLayout(); + } + + @Override + public void setLayoutToRestoreLater(DesktopLayout layout) { + } + + @Override + public DesktopLayout getLayoutToRestoreLater() { + return new DesktopLayout(); + } + + @Override + public void setLayout(@NotNull DesktopLayout layout) { + } + + @Override + public void clearSideStack() { + } + + @Override + public void hideToolWindow(@NotNull final String id, final boolean hideSide) { + } + + @Override + public List<String> getIdsOn(@NotNull final ToolWindowAnchor anchor) { + return new ArrayList<String>(); + } + + public static class MockToolWindow implements ToolWindowEx { + ContentManager myContentManager = new MockContentManager(); + + public MockToolWindow(@NotNull Project project) { + Disposer.register(project, myContentManager); + } + @Override public boolean isActive() { return false; @@ -206,7 +391,7 @@ public class ToolWindowHeadlessManagerImpl extends ToolWindowManagerEx { @Override public ContentManager getContentManager() { - return MOCK_CONTENT_MANAGER; + return myContentManager; } @Override @@ -270,9 +455,9 @@ public class ToolWindowHeadlessManagerImpl extends ToolWindowManagerEx { public boolean isUseLastFocusedOnActivation() { return false; } - }; + } - @NonNls private static final ContentManager MOCK_CONTENT_MANAGER = new ContentManager() { + private static class MockContentManager implements ContentManager { private final List<Content> myContents = new ArrayList<Content>(); private Content mySelected; @@ -284,27 +469,33 @@ public class ToolWindowHeadlessManagerImpl extends ToolWindowManagerEx { @Override public void addContent(@NotNull final Content content) { + myContents.add(content); + if (mySelected == null) mySelected = content; } @Override public void addContent(@NotNull Content content, int order) { myContents.add(order, content); + if (mySelected == null) mySelected = content; } @Override public void addContent(@NotNull final Content content, final Object constraints) { + addContent(content); } @Override - public void addContentManagerListener(@NotNull final ContentManagerListener l) { + public void addSelectedContent(@NotNull final Content content) { + addContent(content); + setSelectedContent(content); } @Override - public void addDataProvider(@NotNull final DataProvider provider) { + public void addContentManagerListener(@NotNull final ContentManagerListener l) { } @Override - public void addSelectedContent(@NotNull final Content content) { + public void addDataProvider(@NotNull final DataProvider provider) { } @Override @@ -319,6 +510,9 @@ public class ToolWindowHeadlessManagerImpl extends ToolWindowManagerEx { @Override public Content findContent(final String displayName) { + for (Content each : myContents) { + if (each.getDisplayName().equals(displayName)) return each; + } return null; } @@ -359,18 +553,24 @@ public class ToolWindowHeadlessManagerImpl extends ToolWindowManagerEx { @Override public Content getContent(final JComponent component) { + Content[] contents = getContents(); + for (Content content : contents) { + if (Comparing.equal(component, content.getComponent())) { + return content; + } + } return null; } @Override @Nullable public Content getContent(final int index) { - return null; + return myContents.get(index); } @Override public int getContentCount() { - return 0; + return myContents.size(); } @Override @@ -381,7 +581,7 @@ public class ToolWindowHeadlessManagerImpl extends ToolWindowManagerEx { @Override public int getIndexOfContent(final Content content) { - return -1; + return myContents.indexOf(content); } @Override @@ -393,35 +593,37 @@ public class ToolWindowHeadlessManagerImpl extends ToolWindowManagerEx { @Override @NotNull public Content[] getSelectedContents() { - return new Content[0]; + return mySelected != null ? new Content[]{mySelected} : new Content[0]; } @Override public boolean isSelected(@NotNull final Content content) { - return false; + return content == mySelected; } @Override public void removeAllContents(final boolean dispose) { for (int i = myContents.size() - 1; i >= 0; i--) { Content content = myContents.get(i); - removeContent(content, true); + removeContent(content, dispose); } mySelected = null; } @Override public boolean removeContent(@NotNull final Content content, final boolean dispose) { - Disposer.dispose(content); + if (dispose) Disposer.dispose(content); + boolean result = myContents.remove(content); if (mySelected == content) { - mySelected = null; + mySelected = ContainerUtil.getFirstItem(myContents); } - return myContents.remove(content); + return result; } @NotNull @Override public ActionCallback removeContent(@NotNull Content content, boolean dispose, boolean trackFocus, boolean implicitFocus) { + removeContent(content, dispose); return new ActionCallback.Done(); } @@ -451,33 +653,36 @@ public class ToolWindowHeadlessManagerImpl extends ToolWindowManagerEx { @NotNull @Override public ActionCallback setSelectedContentCB(@NotNull Content content) { + setSelectedContent(content); return new ActionCallback.Done(); } @Override public void setSelectedContent(@NotNull final Content content, final boolean requestFocus) { + setSelectedContent(content); } @NotNull @Override public ActionCallback setSelectedContentCB(@NotNull final Content content, final boolean requestFocus) { - return new ActionCallback.Done(); + return setSelectedContentCB(content); } @Override public void setSelectedContent(@NotNull Content content, boolean requestFocus, boolean forcedFocus) { + setSelectedContent(content); } @NotNull @Override public ActionCallback setSelectedContentCB(@NotNull final Content content, final boolean requestFocus, final boolean forcedFocus) { - return new ActionCallback.Done(); + return setSelectedContentCB(content); } @NotNull @Override public ActionCallback setSelectedContent(@NotNull Content content, boolean requestFocus, boolean forcedFocus, boolean implicit) { - return new ActionCallback.Done(); + return setSelectedContentCB(content); } @NotNull @@ -506,161 +711,4 @@ public class ToolWindowHeadlessManagerImpl extends ToolWindowManagerEx { public ContentFactory getFactory() { return ServiceManager.getService(ContentFactory.class); } - }; - - @Override - public ToolWindow registerToolWindow(@NotNull String id, - @NotNull JComponent component, - @NotNull ToolWindowAnchor anchor, - Disposable parentDisposable, - boolean canWorkInDumbMode) { - return HEADLESS_WINDOW; - } - - @Override - public ToolWindow registerToolWindow(@NotNull String id, @NotNull JComponent component, @NotNull ToolWindowAnchor anchor) { - return HEADLESS_WINDOW; - } - - @Override - public ToolWindow registerToolWindow(@NotNull String id, - @NotNull JComponent component, - @NotNull ToolWindowAnchor anchor, - Disposable parentDisposable, - boolean canWorkInDumbMode, - boolean canCloseContents) { - return HEADLESS_WINDOW; - } - - @Override - public ToolWindow registerToolWindow(@NotNull String id, - @NotNull JComponent component, - @NotNull ToolWindowAnchor anchor, - Disposable parentDisposable) { - return HEADLESS_WINDOW; - } - - @Override - public ToolWindow registerToolWindow(@NotNull final String id, final boolean canCloseContent, @NotNull final ToolWindowAnchor anchor) { - return HEADLESS_WINDOW; - } - - @Override - public ToolWindow registerToolWindow(@NotNull final String id, - final boolean canCloseContent, - @NotNull final ToolWindowAnchor anchor, - final boolean secondary) { - return HEADLESS_WINDOW; - } - - @Override - public ToolWindow registerToolWindow(@NotNull final String id, final boolean canCloseContent, @NotNull final ToolWindowAnchor anchor, - final Disposable parentDisposable, final boolean dumbAware) { - return HEADLESS_WINDOW; - } - - @Override - public void unregisterToolWindow(@NotNull String id) { - } - - @Override - public void activateEditorComponent() { - } - - @Override - public boolean isEditorComponentActive() { - return false; - } - - @Override - public String[] getToolWindowIds() { - return ArrayUtil.EMPTY_STRING_ARRAY; - } - - @Override - public String getActiveToolWindowId() { - return null; - } - - @Override - public ToolWindow getToolWindow(String id) { - return HEADLESS_WINDOW; - } - - @Override - public void invokeLater(Runnable runnable) { - } - - @Override - public IdeFocusManager getFocusManager() { - return IdeFocusManagerHeadless.INSTANCE; - } - - @Override - public void notifyByBalloon(@NotNull final String toolWindowId, - @NotNull final MessageType type, - @NotNull final String text, - @Nullable final Icon icon, - @Nullable final HyperlinkListener listener) { - } - - @Override - public Balloon getToolWindowBalloon(String id) { - return null; - } - - @Override - public void initToolWindow(ToolWindowEP bean) { - - } - - @Override - public void addToolWindowManagerListener(@NotNull ToolWindowManagerListener l) { - - } - - @Override - public void removeToolWindowManagerListener(@NotNull ToolWindowManagerListener l) { - } - - @Override - public String getLastActiveToolWindowId() { - return null; - } - - @Override - public String getLastActiveToolWindowId(Condition<JComponent> condition) { - return null; - } - - @Override - public DesktopLayout getLayout() { - return new DesktopLayout(); - } - - @Override - public void setLayoutToRestoreLater(DesktopLayout layout) { - } - - @Override - public DesktopLayout getLayoutToRestoreLater() { - return new DesktopLayout(); - } - - @Override - public void setLayout(@NotNull DesktopLayout layout) { - } - - @Override - public void clearSideStack() { - } - - @Override - public void hideToolWindow(@NotNull final String id, final boolean hideSide) { - } - - @Override - public List<String> getIdsOn(@NotNull final ToolWindowAnchor anchor) { - return new ArrayList<String>(); - } -} + }} diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/X11UiUtil.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/X11UiUtil.java index 6c6bcd137949..120579bcb809 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/X11UiUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/X11UiUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -16,9 +16,11 @@ package com.intellij.openapi.wm.impl; import com.intellij.Patches; +import com.intellij.execution.util.ExecUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.registry.Registry; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.IdeFrame; import com.intellij.openapi.wm.WindowManager; import org.jetbrains.annotations.Nullable; @@ -29,6 +31,8 @@ import java.awt.*; import java.awt.peer.ComponentPeer; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import static com.intellij.util.ArrayUtil.newLongArray; import static com.intellij.util.containers.ContainerUtil.newHashSet; @@ -254,11 +258,17 @@ public class X11UiUtil { setWM("MARCO_WM", "METACITY_WM"); } else if ("awesome".equals(wmName)) { - setWM("SAWFISH_WM"); + String version = getAwesomeWMVersion(); + if (StringUtil.compareVersionNumbers(version, "3.5") >= 0) { + setWM("SAWFISH_WM"); + } + else if (version != null) { + setWM("OTHER_NONREPARENTING_WM", "LG3D_WM"); + } } } - catch (Throwable e) { - LOG.warn(e); + catch (Throwable t) { + LOG.warn(t); } } @@ -273,6 +283,7 @@ public class X11UiUtil { if (id != null) { field(xwmClass, "awt_wmgr").set(null, id); field(xwmClass, "WMID").set(xwm, id); + LOG.info("impersonated WM: " + wmConstant); break; } } @@ -281,6 +292,23 @@ public class X11UiUtil { } } + @Nullable + private static String getAwesomeWMVersion() { + try { + String version = ExecUtil.execAndReadLine("awesome", "--version"); + if (version != null) { + Matcher m = Pattern.compile("awesome v([0-9.]+)").matcher(version); + if (m.find()) { + return m.group(1); + } + } + } + catch (Throwable t) { + LOG.warn(t); + } + return null; + } + // full-screen support public static boolean isFullScreenSupported() { diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/commands/RequestFocusInEditorComponentCmd.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/commands/RequestFocusInEditorComponentCmd.java index 7a772e7aed34..2c681856a328 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/commands/RequestFocusInEditorComponentCmd.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/commands/RequestFocusInEditorComponentCmd.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 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,11 +19,13 @@ */ package com.intellij.openapi.wm.impl.commands; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileEditor.impl.EditorWindow; import com.intellij.openapi.fileEditor.impl.EditorWithProviderComposite; import com.intellij.openapi.fileEditor.impl.EditorsSplitters; import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.Expirable; +import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.openapi.wm.impl.FloatingDecorator; import com.intellij.openapi.wm.impl.IdeFrameImpl; @@ -44,10 +46,16 @@ public final class RequestFocusInEditorComponentCmd extends FinalizableCommand{ private final IdeFocusManager myFocusManager; private final Expirable myTimestamp; + private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.wm.impl.commands.RequestFocusInEditorComponentCmd"); + public RequestFocusInEditorComponentCmd(@NotNull final EditorsSplitters splitters, IdeFocusManager focusManager, final Runnable finishCallBack, boolean forced){ super(finishCallBack); + boolean shouldLogFocuses = Registry.is("ide.log.focuses"); + if (shouldLogFocuses) { + LOG.info(new Exception()); + } myComponent = null; final EditorWindow window = splitters.getCurrentWindow(); if (window != null) { @@ -94,7 +102,8 @@ public final class RequestFocusInEditorComponentCmd extends FinalizableCommand{ } if(myComponent != null){ - myFocusManager.requestFocus(myComponent, myForced).notifyWhenDone(myDoneCallback).doWhenDone(new Runnable() { + final boolean forced = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() == null; + myFocusManager.requestFocus(myComponent, myForced || forced).notifyWhenDone(myDoneCallback).doWhenDone(new Runnable() { public void run() { // if owner is active window or it has active child window which isn't floating decorator then // don't bring owner window to font. If we will make toFront every time then it's possible diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/RecentProjectPanel.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/RecentProjectPanel.java index 9140fc200a77..82dba7430827 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/RecentProjectPanel.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/RecentProjectPanel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -186,14 +186,11 @@ public class RecentProjectPanel extends JPanel { private String getTitle2Text(ReopenProjectAction action, JComponent pathLabel) { String fullText = action.getProjectPath(); - int labelWidth = pathLabel.getWidth(); if (fullText == null || fullText.length() == 0) return " "; - String home = SystemProperties.getUserHome(); - if (FileUtil.startsWith(fullText, home)) { - fullText = "~" + fullText.substring(home.length()); - } + fullText = FileUtil.getLocationRelativeToUserHome(fullText, false); + int labelWidth = pathLabel.getWidth(); if (pathLabel.getFontMetrics(pathLabel.getFont()).stringWidth(fullText) > labelWidth) { return myPathShortener.getShortPath(action); } |