You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by ge...@apache.org on 2019/05/02 09:13:13 UTC

[netbeans] branch master updated: NETBEANS-888 Open Recent file not working (#1216)

This is an automated email from the ASF dual-hosted git repository.

geertjan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new c450d14  NETBEANS-888 Open Recent file not working (#1216)
c450d14 is described below

commit c450d145f94574809d4712c852b2d7c3403a2fa3
Author: mck <mi...@thelastpickle.com>
AuthorDate: Thu May 2 19:13:08 2019 +1000

    NETBEANS-888 Open Recent file not working (#1216)
    
    - update menuItems under RecentFileAction via a RecentFiles property change listener, rather than popup menu listener
---
 .../modules/openfile/RecentFileAction.java         | 97 ++++++++++------------
 .../org/netbeans/modules/openfile/RecentFiles.java | 16 ++++
 2 files changed, 61 insertions(+), 52 deletions(-)

diff --git a/ide/utilities/src/org/netbeans/modules/openfile/RecentFileAction.java b/ide/utilities/src/org/netbeans/modules/openfile/RecentFileAction.java
index 118aa8a..2138d1a 100644
--- a/ide/utilities/src/org/netbeans/modules/openfile/RecentFileAction.java
+++ b/ide/utilities/src/org/netbeans/modules/openfile/RecentFileAction.java
@@ -25,19 +25,18 @@ import java.awt.Point;
 import java.awt.PointerInfo;
 import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
 import java.io.File;
 import java.util.List;
 import javax.swing.*;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
-import javax.swing.event.PopupMenuEvent;
-import javax.swing.event.PopupMenuListener;
 import org.netbeans.modules.openfile.RecentFiles.HistoryItem;
 import org.openide.awt.*;
 import org.openide.filesystems.FileUtil;
 import org.openide.util.NbBundle;
 import org.openide.util.RequestProcessor;
-import org.openide.util.Utilities;
 import org.openide.util.actions.Presenter;
 
 /**
@@ -51,10 +50,9 @@ import org.openide.util.actions.Presenter;
 @ActionID(category="System", id="org.netbeans.modules.openfile.RecentFileAction")
 @ActionReference(path="Menu/File", position=900)
 public class RecentFileAction extends AbstractAction
-        implements Presenter.Menu, PopupMenuListener, ChangeListener {
+        implements Presenter.Menu, ChangeListener, PropertyChangeListener {
 
-    private static final RequestProcessor RP =
-            new RequestProcessor(RecentFileAction.class);
+    private static final RequestProcessor RP = new RequestProcessor(RecentFileAction.class);
 
     /** property of menu items where we store fileobject to open */
     private static final String PATH_PROP =
@@ -73,12 +71,15 @@ public class RecentFileAction extends AbstractAction
                                          "OFMSG_NO_RECENT_FILE");     // NOI18N
 
     private JMenu menu;
+    private boolean recreate = true;
     
     public RecentFileAction() {
         super(NbBundle.getMessage(RecentFileAction.class,
                                   "LBL_RecentFileAction_Name")); // NOI18N
+
+        RecentFiles.addPropertyChangeListener(this);
     }
-    
+
     /********* Presenter.Menu impl **********/
     
     @Override
@@ -87,70 +88,60 @@ public class RecentFileAction extends AbstractAction
             menu = new UpdatingMenu(this);
             menu.setMnemonic(NbBundle.getMessage(RecentFileAction.class,
                               "MNE_RecentFileAction_Name").charAt(0)); // NOI18N
-            // #115277 - workaround, PopupMenuListener don't work on Mac 
-            if (!Utilities.isMac()) {
-                menu.getPopupMenu().addPopupMenuListener(this);
-            } else {
-                menu.addChangeListener(this);
-            }
+
+            menu.getModel().addChangeListener(this);
+            fillSubMenu();
         }
         return menu;
     }
-    
-    /******* PopupMenuListener impl *******/
 
-    /* Fills submenu when popup is about to be displayed.
-     * Note that argument may be null on Mac due to #115277 fix
-     */
-    @Override
-    public void popupMenuWillBecomeVisible(PopupMenuEvent arg0) {
-        fillSubMenu();
-    }
+    // Implementation of change listener ---------------------------------------
     
-    /* Clears submenu when popup is about to be hidden.
-     * Note that argument may be null on Mac due to #115277 fix
-     */
     @Override
-    public void popupMenuWillBecomeInvisible(PopupMenuEvent arg0) {
-        menu.removeAll();
-    }
-    
-    @Override
-    public void popupMenuCanceled(PopupMenuEvent arg0) {
+    public void propertyChange(PropertyChangeEvent e) {
+        if ( RecentFiles.PROPERTY_RECENT_FILES.equals( e.getPropertyName() ) ) {
+            SwingUtilities.invokeLater(new Runnable() {
+                @Override
+                public void run() {
+                    recreate = true;
+                }
+            });
+        }
     }
 
     /******** ChangeListener impl *********/
 
-    /** Delegates to popupMenuListener based on menu current selection status */ 
     @Override
     public void stateChanged(ChangeEvent e) {
-        if (menu.isSelected()) {
-            popupMenuWillBecomeVisible(null);
-        } else {
-            popupMenuWillBecomeInvisible(null);
+        if (menu.getModel().isSelected()) {
+            fillSubMenu();
         }
     }
     
     /** Fills submenu with recently closed files got from RecentFiles support */
     private void fillSubMenu () {
-        List<HistoryItem> files = RecentFiles.getRecentFiles();
-        boolean first = true;
-        for (final HistoryItem hItem : files) {
-            try { // #188403
-                JMenuItem jmi = newSubMenuItem(hItem);
-                menu.add(jmi);
-                if( first ) {
-                    Object accel = getValue( Action.ACCELERATOR_KEY );
-                    if( accel instanceof KeyStroke ) {
-                        jmi.setAccelerator( (KeyStroke)accel );
+        if (recreate && RecentFiles.hasRecentFiles()) {
+            menu.removeAll();
+            List<HistoryItem> files = RecentFiles.getRecentFiles();
+            boolean first = true;
+            for (final HistoryItem hItem : files) {
+                try { // #188403
+                    JMenuItem jmi = newSubMenuItem(hItem);
+                    menu.add(jmi);
+                    if( first ) {
+                        Object accel = getValue( Action.ACCELERATOR_KEY );
+                        if( accel instanceof KeyStroke ) {
+                            jmi.setAccelerator( (KeyStroke)accel );
+                        }
+                        first = false;
                     }
-                    first = false;
+                } catch (Exception ex) {
+                    continue;
                 }
-            } catch (Exception ex) {
-                continue;
             }
+            ensureSelected();
+            recreate = false;
         }
-        ensureSelected();
     }
 
     /**
@@ -270,7 +261,6 @@ public class RecentFileAction extends AbstractAction
     
         @Override
         public JComponent[] getMenuPresenters() {
-            setEnabled(RecentFiles.hasRecentFiles());
             return content;
         }
 
@@ -278,6 +268,9 @@ public class RecentFileAction extends AbstractAction
         public JComponent[] synchMenuPresenters(JComponent[] items) {
             return getMenuPresenters();
         }
-    }
 
+        @Override public boolean isEnabled() {
+            return RecentFiles.hasRecentFiles();
+        }
+    }
 }
diff --git a/ide/utilities/src/org/netbeans/modules/openfile/RecentFiles.java b/ide/utilities/src/org/netbeans/modules/openfile/RecentFiles.java
index dc95106..16fddcb 100644
--- a/ide/utilities/src/org/netbeans/modules/openfile/RecentFiles.java
+++ b/ide/utilities/src/org/netbeans/modules/openfile/RecentFiles.java
@@ -22,6 +22,7 @@ package org.netbeans.modules.openfile;
 import java.beans.BeanInfo;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -59,6 +60,8 @@ import org.openide.windows.WindowManager;
  */
 public final class RecentFiles {
 
+    static final String PROPERTY_RECENT_FILES = "RecentFiles";
+
     /** List of recently closed files */
     private static List<HistoryItem> history = new ArrayList<HistoryItem>();
     /** Request processor */
@@ -80,10 +83,19 @@ public final class RecentFiles {
             RecentFiles.class.getName());
 
     private static final String RECENT_FILE_KEY = "nb.recent.file.path"; // NOI18N
+    private static final PropertyChangeSupport PCH_SUPPORT = new PropertyChangeSupport(PROPERTY_RECENT_FILES);
 
     private RecentFiles() {
     }
 
+    static void addPropertyChangeListener(PropertyChangeListener l) {
+        PCH_SUPPORT.addPropertyChangeListener(l);
+    }
+
+    static void removePropertyChangeListener(PropertyChangeListener l) {
+        PCH_SUPPORT.removePropertyChangeListener(l);
+    }
+
     /** Starts to listen for recently closed files */
     public static void init() {
         WindowManager.getDefault().invokeWhenUIReady(new Runnable() {
@@ -93,6 +105,7 @@ public final class RecentFiles {
                 List<HistoryItem> loaded = load();
                 synchronized (HISTORY_LOCK) {
                     history.addAll(0, loaded);
+                    PCH_SUPPORT.firePropertyChange(PROPERTY_RECENT_FILES, null, null);
                     if (windowRegistryListener == null) {
                         windowRegistryListener = new WindowRegistryL();
                         TopComponent.getRegistry().addPropertyChangeListener(
@@ -208,6 +221,7 @@ public final class RecentFiles {
         try {
             synchronized (HISTORY_LOCK) {
                 history.clear();
+                PCH_SUPPORT.firePropertyChange(PROPERTY_RECENT_FILES, null, null);
                 getPrefs().clear();
                 getPrefs().flush();
             }
@@ -251,6 +265,7 @@ public final class RecentFiles {
                     history.remove(i);
                 }
                 newItem.setIcon(findIconForPath(newItem.getPath()));
+                PCH_SUPPORT.firePropertyChange(PROPERTY_RECENT_FILES, null, null);
                 store();
             }
         }
@@ -268,6 +283,7 @@ public final class RecentFiles {
                         HistoryItem hItem = findHistoryItem(path);
                         if (hItem != null) {
                             history.remove(hItem);
+                            PCH_SUPPORT.firePropertyChange(PROPERTY_RECENT_FILES, null, null);
                         }
                         store();
                     }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists