Index: projects/projectui/src/org/netbeans/modules/project/ui/ProjectTab.java =================================================================== RCS file: /cvs/projects/projectui/src/org/netbeans/modules/project/ui/ProjectTab.java,v retrieving revision 1.29 diff -u -r1.29 ProjectTab.java --- projects/projectui/src/org/netbeans/modules/project/ui/ProjectTab.java 21 Sep 2005 14:24:03 -0000 1.29 +++ projects/projectui/src/org/netbeans/modules/project/ui/ProjectTab.java 13 Jan 2006 19:22:00 -0000 @@ -7,7 +7,7 @@ * http://www.sun.com/ * * The Original Code is NetBeans. The Initial Developer of the Original - * Code is Sun Microsystems, Inc. Portions Copyright 1997-2005 Sun + * Code is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun * Microsystems, Inc. All Rights Reserved. */ @@ -24,6 +24,7 @@ import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.ArrayList; +import java.util.Collection; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; @@ -47,13 +48,18 @@ import org.openide.explorer.view.BeanTreeView; import org.openide.explorer.view.Visualizer; import org.openide.filesystems.FileObject; +import org.openide.loaders.DataObject; import org.openide.nodes.Node; import org.openide.nodes.NodeNotFoundException; import org.openide.nodes.NodeOp; import org.openide.util.HelpCtx; +import org.openide.util.Lookup; +import org.openide.util.LookupEvent; +import org.openide.util.LookupListener; import org.openide.util.NbBundle; import org.openide.util.RequestProcessor; import org.openide.util.Utilities; +import org.openide.util.WeakListeners; import org.openide.windows.TopComponent; import org.openide.windows.WindowManager; @@ -295,15 +301,58 @@ // SEARCHING NODES + private static final Lookup context = Utilities.actionsGlobalContext(); + private static final Lookup.Result foSelection = context.lookup(new Lookup.Template(FileObject.class)); + private static final Lookup.Result doSelection = context.lookup(new Lookup.Template(DataObject.class)); + private final LookupListener baseListener = new LookupListener() { + public void resultChanged(LookupEvent ev) { + if (TopComponent.getRegistry().getActivated() == ProjectTab.this) { + // Do not want to go into a loop. + return; + } + Collection fos = foSelection.allInstances(); + if (fos.size() == 1) { + selectNodeAsyncNoSelect((FileObject) fos.iterator().next()); + } else { + Collection dos = doSelection.allInstances(); + if (dos.size() == 1) { + selectNodeAsyncNoSelect(((DataObject) dos.iterator().next()).getPrimaryFile()); + } + } + } + }; + private final LookupListener weakListener = (LookupListener) WeakListeners.create(LookupListener.class, baseListener, null); + private void startListening() { + foSelection.addLookupListener(weakListener); + doSelection.addLookupListener(weakListener); + baseListener.resultChanged(null); + } + private void stopListening() { + foSelection.removeLookupListener(weakListener); + doSelection.removeLookupListener(weakListener); + } + protected void componentShowing() { + super.componentShowing(); + startListening(); + } + protected void componentHidden() { + super.componentHidden(); + stopListening(); + } + // Called from the SelectNodeAction private final RequestProcessor RP = new RequestProcessor(); - public void selectNodeAsync(final FileObject object) { - + public void selectNodeAsync(FileObject object) { setCursor( Utilities.createProgressCursor( this ) ); open(); requestActive(); + + selectNodeAsyncNoSelect(object); + } + + private void selectNodeAsyncNoSelect(final FileObject object) { // Do it in different thread than AWT RP.post( new Runnable() {