diff --git a/csl.api/src/org/netbeans/modules/csl/editor/fold/GsfFoldScheduler.java b/csl.api/src/org/netbeans/modules/csl/editor/fold/GsfFoldScheduler.java --- a/csl.api/src/org/netbeans/modules/csl/editor/fold/GsfFoldScheduler.java +++ b/csl.api/src/org/netbeans/modules/csl/editor/fold/GsfFoldScheduler.java @@ -68,7 +68,6 @@ private JTextComponent currentEditor; private Document currentDocument; - private Source source; public GsfFoldScheduler() { setEditor (EditorRegistry.focusedComponent ()); @@ -80,12 +79,11 @@ Document document = editor.getDocument (); if (currentDocument == document) return; currentDocument = document; - source = Source.create (currentDocument); + final Source source = Source.create (currentDocument); schedule (source, new SchedulerEvent (this) {}); } else { currentDocument = null; - source = null; schedule(null, null); } } @@ -126,7 +124,7 @@ @Override protected SchedulerEvent createSchedulerEvent (SourceModificationEvent event) { - if (event.getModifiedSource () == source) + if (event.getModifiedSource () == getSource()) return new SchedulerEvent (this) {}; return null; } diff --git a/csl.api/src/org/netbeans/modules/csl/navigation/CSLNavigatorScheduler.java b/csl.api/src/org/netbeans/modules/csl/navigation/CSLNavigatorScheduler.java --- a/csl.api/src/org/netbeans/modules/csl/navigation/CSLNavigatorScheduler.java +++ b/csl.api/src/org/netbeans/modules/csl/navigation/CSLNavigatorScheduler.java @@ -64,8 +64,7 @@ @ServiceProvider(service=Scheduler.class) public class CSLNavigatorScheduler extends Scheduler { - private RequestProcessor requestProcessor; - private Source source; + private RequestProcessor requestProcessor; public CSLNavigatorScheduler () { ClassMemberNavigatorSourceFactory.getInstance().addPropertyChangeListener (new AListener ()); @@ -83,14 +82,13 @@ if (f != null && f.getContext() != null) { final FileObject fileObject = f.getContext().lookup(FileObject.class); if (fileObject != null && fileObject.isValid() && Util.canBeParsed(fileObject.getMIMEType())) { - source = Source.create (fileObject); + final Source source = Source.create (fileObject); if (source != null) { schedule (source, new SchedulerEvent (CSLNavigatorScheduler.this) {}); return; } } } - source = null; schedule(null, null); } }); @@ -103,7 +101,7 @@ @Override protected SchedulerEvent createSchedulerEvent (SourceModificationEvent event) { - if (event.getModifiedSource () == source) + if (event.getModifiedSource () == getSource()) return new SchedulerEvent (this) {}; return null; } diff --git a/editor.breadcrumbs/nbproject/project.xml b/editor.breadcrumbs/nbproject/project.xml --- a/editor.breadcrumbs/nbproject/project.xml +++ b/editor.breadcrumbs/nbproject/project.xml @@ -56,7 +56,7 @@ 1 - 1.56 + 1.69 diff --git a/editor.breadcrumbs/src/org/netbeans/modules/editor/breadcrumbs/support/BreadCrumbsScheduler.java b/editor.breadcrumbs/src/org/netbeans/modules/editor/breadcrumbs/support/BreadCrumbsScheduler.java --- a/editor.breadcrumbs/src/org/netbeans/modules/editor/breadcrumbs/support/BreadCrumbsScheduler.java +++ b/editor.breadcrumbs/src/org/netbeans/modules/editor/breadcrumbs/support/BreadCrumbsScheduler.java @@ -81,8 +81,8 @@ SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - if (currentEditor == null || source == null) return; - schedule (source, new CursorMovedSchedulerEvent (this, currentEditor.getCaret ().getDot (), currentEditor.getCaret ().getMark ()) {}); + if (currentEditor == null || getSource() == null) return; + schedule (getSource(), new CursorMovedSchedulerEvent (this, currentEditor.getCaret ().getDot (), currentEditor.getCaret ().getMark ()) {}); } }); } @@ -98,7 +98,6 @@ private JTextComponent currentEditor; private CaretListener caretListener; private Document currentDocument; - private Source source; protected void setEditor (JTextComponent editor) { @@ -112,12 +111,11 @@ Document document = editor.getDocument (); if (currentDocument == document) return; currentDocument = document; - source = Source.create (currentDocument); + final Source source = Source.create (currentDocument); schedule (source, new CursorMovedSchedulerEvent (this, editor.getCaret ().getDot (), editor.getCaret ().getMark ()) {}); } else { currentDocument = null; - source = null; schedule(null, null); } } @@ -131,7 +129,7 @@ protected SchedulerEvent createSchedulerEvent (SourceModificationEvent event) { final JTextComponent ce = currentEditor; final Caret caret = ce != null ? ce.getCaret() : null; - final Source s = source; + final Source s = getSource(); if (event.getModifiedSource() == s && caret != null) { return new CursorMovedSchedulerEvent(this, caret.getDot(), caret.getMark()) { }; } diff --git a/parsing.api/apichanges.xml b/parsing.api/apichanges.xml --- a/parsing.api/apichanges.xml +++ b/parsing.api/apichanges.xml @@ -110,6 +110,21 @@ + + + Added Sheduler.getSource method for obtaining the active source + + + + + +

Added protected final method Schedulter.getSource allowing Scheduler subclasses + to obtain the active Source rather than caching it itself. +

+
+ + +
Allow refresh of EmbeddingIndexer diff --git a/parsing.api/nbproject/project.properties b/parsing.api/nbproject/project.properties --- a/parsing.api/nbproject/project.properties +++ b/parsing.api/nbproject/project.properties @@ -3,7 +3,7 @@ javac.source=1.7 javadoc.apichanges=${basedir}/apichanges.xml javadoc.arch=${basedir}/arch.xml -spec.version.base=1.68.0 +spec.version.base=1.69.0 test.config.stableBTD.includes=**/*Test.class test.config.stableBTD.excludes=\ diff --git a/parsing.api/src/org/netbeans/modules/parsing/impl/CurrentDocumentScheduler.java b/parsing.api/src/org/netbeans/modules/parsing/impl/CurrentDocumentScheduler.java --- a/parsing.api/src/org/netbeans/modules/parsing/impl/CurrentDocumentScheduler.java +++ b/parsing.api/src/org/netbeans/modules/parsing/impl/CurrentDocumentScheduler.java @@ -60,19 +60,17 @@ public class CurrentDocumentScheduler extends CurrentEditorTaskScheduler { private Document currentDocument; - private Source source; protected void setEditor (JTextComponent editor) { if (editor != null) { Document document = editor.getDocument (); if (currentDocument == document) return; currentDocument = document; - source = Source.create (currentDocument); + final Source source = Source.create (currentDocument); schedule (source, new SchedulerEvent (this) {}); } else { - currentDocument = null; - source = null; + currentDocument = null; schedule(null, null); } } @@ -82,7 +80,6 @@ * @param source */ void schedule (Source source) { - this.source = source; schedule (source, new SchedulerEvent (this) {}); } @@ -93,7 +90,7 @@ @Override protected SchedulerEvent createSchedulerEvent (SourceModificationEvent event) { - if (event.getModifiedSource () == source) + if (event.getModifiedSource () == getSource()) return new SchedulerEvent (this) {}; return null; } diff --git a/parsing.api/src/org/netbeans/modules/parsing/impl/CursorSensitiveScheduler.java b/parsing.api/src/org/netbeans/modules/parsing/impl/CursorSensitiveScheduler.java --- a/parsing.api/src/org/netbeans/modules/parsing/impl/CursorSensitiveScheduler.java +++ b/parsing.api/src/org/netbeans/modules/parsing/impl/CursorSensitiveScheduler.java @@ -66,7 +66,6 @@ private JTextComponent currentEditor; private CaretListener caretListener; private Document currentDocument; - private Source source; protected void setEditor (JTextComponent editor) { @@ -80,12 +79,11 @@ Document document = editor.getDocument (); if (currentDocument == document) return; currentDocument = document; - source = Source.create (currentDocument); + final Source source = Source.create (currentDocument); schedule (source, new CursorMovedSchedulerEvent (this, editor.getCaret ().getDot (), editor.getCaret ().getMark ()) {}); } else { currentDocument = null; - source = null; schedule(null, null); } } @@ -99,7 +97,7 @@ protected SchedulerEvent createSchedulerEvent (SourceModificationEvent event) { final JTextComponent ce = currentEditor; final Caret caret = ce != null ? ce.getCaret() : null; - final Source s = source; + final Source s = getSource(); if (event.getModifiedSource() == s && caret != null) { return new CursorMovedSchedulerEvent(this, caret.getDot(), caret.getMark()) { }; } diff --git a/parsing.api/src/org/netbeans/modules/parsing/impl/SelectedNodesScheduler.java b/parsing.api/src/org/netbeans/modules/parsing/impl/SelectedNodesScheduler.java --- a/parsing.api/src/org/netbeans/modules/parsing/impl/SelectedNodesScheduler.java +++ b/parsing.api/src/org/netbeans/modules/parsing/impl/SelectedNodesScheduler.java @@ -66,7 +66,6 @@ public class SelectedNodesScheduler extends Scheduler { - private Source source; public SelectedNodesScheduler () { TopComponent.getRegistry ().addPropertyChangeListener (new AListener ()); @@ -86,7 +85,7 @@ if (dataObject != null && dataObject.isValid()) { final FileObject fileObject = dataObject.getPrimaryFile (); if (fileObject.isValid() && Util.canBeParsed(fileObject.getMIMEType())) { - source = Source.create (fileObject); + final Source source = Source.create (fileObject); if (source != null) { schedule (source, new SchedulerEvent (SelectedNodesScheduler.this) {}); return; @@ -95,7 +94,6 @@ } } - source = null; schedule(null, null); } }); @@ -108,7 +106,7 @@ @Override protected SchedulerEvent createSchedulerEvent (SourceModificationEvent event) { - if (event.getModifiedSource () == source) + if (event.getModifiedSource () == getSource()) return new SchedulerEvent (this) {}; return null; } diff --git a/parsing.api/src/org/netbeans/modules/parsing/spi/Scheduler.java b/parsing.api/src/org/netbeans/modules/parsing/spi/Scheduler.java --- a/parsing.api/src/org/netbeans/modules/parsing/spi/Scheduler.java +++ b/parsing.api/src/org/netbeans/modules/parsing/spi/Scheduler.java @@ -42,6 +42,11 @@ package org.netbeans.modules.parsing.spi; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.modules.parsing.api.Source; import org.netbeans.modules.parsing.impl.CurrentDocumentScheduler; import org.netbeans.modules.parsing.impl.CursorSensitiveScheduler; @@ -49,9 +54,13 @@ import org.netbeans.modules.parsing.impl.SelectedNodesScheduler; import org.netbeans.modules.parsing.impl.SourceAccessor; import org.netbeans.modules.parsing.impl.SourceCache; +import org.openide.filesystems.FileObject; +import org.openide.loaders.DataObject; +import org.openide.loaders.DataObjectNotFoundException; import org.openide.util.RequestProcessor; import org.openide.util.RequestProcessor.Task; +import org.openide.util.WeakListeners; /** @@ -73,13 +82,35 @@ * Default reparse delay */ public static final int DEFAULT_REPARSE_DELAY = 500; + + private static final Logger LOG = Logger.getLogger(Scheduler.class.getName()); + + private final PropertyChangeListener listener = new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (DataObject.PROP_PRIMARY_FILE.equals(evt.getPropertyName())) { + final DataObject dobj = (DataObject) evt.getSource(); + final Source newSource = Source.create(dobj.getPrimaryFile()); + if (newSource != null) { + LOG.log( + Level.FINE, + "Rescheduling {0} due to change of primary file.", //NOI18N + dobj.getPrimaryFile()); + schedule(newSource, new SchedulerEvent(newSource)); + } + } + } + }; /** * May be changed by unit test */ int reparseDelay = DEFAULT_REPARSE_DELAY; - + + //@GuardedBy("this") private Source source; + //@GuardedBy("this") + private PropertyChangeListener wlistener; /** * This implementations of {@link Scheduler} reschedules all tasks when: @@ -142,15 +173,39 @@ if (requestProcessor == null) { requestProcessor = new RequestProcessor (); } - if (this.source != source && this.source != null) { - final SourceCache cache = SourceAccessor.getINSTANCE().getCache(this.source); - cache.unscheduleTasks(Scheduler.this.getClass()); + if (this.source != source) { + if (this.source != null) { + final SourceCache cache = SourceAccessor.getINSTANCE().getCache(this.source); + cache.unscheduleTasks(Scheduler.this.getClass()); + if (wlistener != null) { + final FileObject fo = this.source.getFileObject(); + if (fo != null) { + try { + final DataObject dobj = DataObject.find(fo); + dobj.removePropertyChangeListener(wlistener); + } catch (DataObjectNotFoundException nfe) { + //No DataObject for file - ignore + } + } + } + } + this.source = source; + if (source != null) { + final FileObject fo = source.getFileObject(); + if (fo != null) { + try { + final DataObject dobj = DataObject.find(fo); + wlistener = WeakListeners.propertyChange(listener, dobj); + dobj.addPropertyChangeListener(wlistener); + } catch (DataObjectNotFoundException ex) { + //No DataObject for file - ignore + } + } + } } if (source == null) { - this.source = null; - return ; + return; } - this.source = source; task = requestProcessor.create (new Runnable () { @Override public void run () { @@ -163,6 +218,18 @@ task.schedule (reparseDelay); } + /** + * Returns active {@link Source}. + * The {@link Scheduler} subclasses should use this method to obtain the active + * {@link Source} rather than caching the {@link Source} them self. + * @return the {@link Source} currently handled by scheduler. + * @since 1.69 + */ + @CheckForNull + protected final synchronized Source getSource() { + return this.source; + } + protected abstract SchedulerEvent createSchedulerEvent (SourceModificationEvent event); static {