diff --git a/platform/favorites/src/org/netbeans/modules/favorites/Module.java b/platform/favorites/src/org/netbeans/modules/favorites/Module.java index 67a29608cc1a..90bd2cd0159b 100644 --- a/platform/favorites/src/org/netbeans/modules/favorites/Module.java +++ b/platform/favorites/src/org/netbeans/modules/favorites/Module.java @@ -18,17 +18,24 @@ */ package org.netbeans.modules.favorites; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Function; +import java.util.prefs.Preferences; +import javax.swing.SwingUtilities; import javax.swing.UIManager; import org.netbeans.modules.favorites.api.Favorites; import org.netbeans.swing.plaf.LFCustoms; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; +import org.openide.util.NbPreferences; +import org.openide.windows.Mode; import org.openide.windows.OnShowing; +import org.openide.windows.WindowManager; /** * For lifecycle tasks. @@ -36,12 +43,20 @@ */ public final class Module { + private static final String INITIAL_OPEN_DONE_KEY = "initial-open-done"; //NOI18N + private Module() {} @OnShowing public final static class EDTInit implements Runnable { + @Override public void run() { + registerFavAppenderFunction(); + attachFirstEditorOpenListener(); + } + + private void registerFavAppenderFunction() { Function favAppender = (files) -> { if (!UIManager.getBoolean(LFCustoms.FILECHOOSER_FAVORITES_ENABLED)) { return files; @@ -53,10 +68,40 @@ public void run() { shortcuts.add(file); } } - return shortcuts.toArray(new File[0]); + return shortcuts.toArray(File[]::new); }; UIManager.put(LFCustoms.FILECHOOSER_SHORTCUTS_FILESFUNCTION, favAppender); } + + // very first on-editor-open event will also open the Favorites tab + private void attachFirstEditorOpenListener() { + Preferences prefs = NbPreferences.forModule(Module.class); + if (prefs.getBoolean(INITIAL_OPEN_DONE_KEY, false)) { + return; + } + WindowManager wm = WindowManager.getDefault(); + wm.addPropertyChangeListener(new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + if ("activeMode".equals(evt.getPropertyName()) //NOI18N + && evt.getNewValue() instanceof Mode mode + && wm.isEditorMode(mode)) { + try { + Tab favTab = Tab.findDefault(); + if (favTab != null && !favTab.wasOpened() && !favTab.isOpened()) { + favTab.open(); + } + } finally { + prefs.putBoolean(INITIAL_OPEN_DONE_KEY, true); + PropertyChangeListener thisListener = this; + SwingUtilities.invokeLater(() -> { + wm.removePropertyChangeListener(thisListener); + }); + } + } + } + }); + } } - + } diff --git a/platform/favorites/src/org/netbeans/modules/favorites/Tab.java b/platform/favorites/src/org/netbeans/modules/favorites/Tab.java index 1d2eb1389ade..e7742fd70e0d 100644 --- a/platform/favorites/src/org/netbeans/modules/favorites/Tab.java +++ b/platform/favorites/src/org/netbeans/modules/favorites/Tab.java @@ -139,6 +139,11 @@ protected void componentShowing () { run(); } + /// true if this tab has been opened during this session + boolean wasOpened() { + return view != null; + } + /** Initializes gui of this component. Subclasses can override * this method to install their own gui. * @return Tree view that will serve as main view for this explorer. diff --git a/platform/favorites/src/org/netbeans/modules/favorites/resources/favorites.wstcgrp b/platform/favorites/src/org/netbeans/modules/favorites/resources/favorites.wstcgrp new file mode 100644 index 000000000000..578b7576a28e --- /dev/null +++ b/platform/favorites/src/org/netbeans/modules/favorites/resources/favorites.wstcgrp @@ -0,0 +1,27 @@ + + + + + + + + diff --git a/platform/favorites/src/org/netbeans/modules/favorites/resources/layer.xml b/platform/favorites/src/org/netbeans/modules/favorites/resources/layer.xml index 0e4f18cb431a..dd6e81bb2cde 100644 --- a/platform/favorites/src/org/netbeans/modules/favorites/resources/layer.xml +++ b/platform/favorites/src/org/netbeans/modules/favorites/resources/layer.xml @@ -21,6 +21,7 @@ --> + @@ -38,4 +39,13 @@ + + + + + + + + +