This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 234361
Collapse All | Expand All

(-)a/csl.api/src/org/netbeans/modules/csl/editor/fold/GsfFoldScheduler.java (-4 / +2 lines)
Lines 68-74 Link Here
68
    
68
    
69
    private JTextComponent  currentEditor;
69
    private JTextComponent  currentEditor;
70
    private Document        currentDocument;
70
    private Document        currentDocument;
71
    private Source          source;
72
71
73
    public GsfFoldScheduler() {
72
    public GsfFoldScheduler() {
74
        setEditor (EditorRegistry.focusedComponent ());
73
        setEditor (EditorRegistry.focusedComponent ());
Lines 80-91 Link Here
80
            Document document = editor.getDocument ();
79
            Document document = editor.getDocument ();
81
            if (currentDocument == document) return;
80
            if (currentDocument == document) return;
82
            currentDocument = document;
81
            currentDocument = document;
83
            source = Source.create (currentDocument);
82
            final Source source = Source.create (currentDocument);
84
            schedule (source, new SchedulerEvent (this) {});
83
            schedule (source, new SchedulerEvent (this) {});
85
        }
84
        }
86
        else {
85
        else {
87
            currentDocument = null;
86
            currentDocument = null;
88
            source = null;
89
            schedule(null, null);
87
            schedule(null, null);
90
        }
88
        }
91
    }
89
    }
Lines 126-132 Link Here
126
124
127
    @Override
125
    @Override
128
    protected SchedulerEvent createSchedulerEvent (SourceModificationEvent event) {
126
    protected SchedulerEvent createSchedulerEvent (SourceModificationEvent event) {
129
        if (event.getModifiedSource () == source)
127
        if (event.getModifiedSource () == getSource())
130
            return new SchedulerEvent (this) {};
128
            return new SchedulerEvent (this) {};
131
        return null;
129
        return null;
132
    }
130
    }
(-)a/csl.api/src/org/netbeans/modules/csl/navigation/CSLNavigatorScheduler.java (-5 / +3 lines)
Lines 64-71 Link Here
64
@ServiceProvider(service=Scheduler.class)
64
@ServiceProvider(service=Scheduler.class)
65
public class CSLNavigatorScheduler extends Scheduler {
65
public class CSLNavigatorScheduler extends Scheduler {
66
66
67
    private RequestProcessor requestProcessor;
67
    private RequestProcessor requestProcessor; 
68
    private Source source;
69
68
70
    public CSLNavigatorScheduler () {
69
    public CSLNavigatorScheduler () {
71
        ClassMemberNavigatorSourceFactory.getInstance().addPropertyChangeListener (new AListener ());
70
        ClassMemberNavigatorSourceFactory.getInstance().addPropertyChangeListener (new AListener ());
Lines 83-96 Link Here
83
                if (f != null && f.getContext() != null) {
82
                if (f != null && f.getContext() != null) {
84
                    final FileObject fileObject = f.getContext().lookup(FileObject.class);
83
                    final FileObject fileObject = f.getContext().lookup(FileObject.class);
85
                    if (fileObject != null && fileObject.isValid() && Util.canBeParsed(fileObject.getMIMEType())) {
84
                    if (fileObject != null && fileObject.isValid() && Util.canBeParsed(fileObject.getMIMEType())) {
86
                        source = Source.create (fileObject);
85
                        final Source source = Source.create (fileObject);
87
                        if (source != null) {
86
                        if (source != null) {
88
                            schedule (source, new SchedulerEvent (CSLNavigatorScheduler.this) {});
87
                            schedule (source, new SchedulerEvent (CSLNavigatorScheduler.this) {});
89
                            return;
88
                            return;
90
                        }
89
                        }
91
                    }
90
                    }
92
                }
91
                }
93
                source = null;
94
                schedule(null, null);
92
                schedule(null, null);
95
            }
93
            }
96
        });
94
        });
Lines 103-109 Link Here
103
101
104
    @Override
102
    @Override
105
    protected SchedulerEvent createSchedulerEvent (SourceModificationEvent event) {
103
    protected SchedulerEvent createSchedulerEvent (SourceModificationEvent event) {
106
        if (event.getModifiedSource () == source)
104
        if (event.getModifiedSource () == getSource())
107
            return new SchedulerEvent (this) {};
105
            return new SchedulerEvent (this) {};
108
        return null;
106
        return null;
109
    }
107
    }
(-)a/editor.breadcrumbs/nbproject/project.xml (-1 / +1 lines)
Lines 56-62 Link Here
56
                    <compile-dependency/>
56
                    <compile-dependency/>
57
                    <run-dependency>
57
                    <run-dependency>
58
                        <release-version>1</release-version>
58
                        <release-version>1</release-version>
59
                        <specification-version>1.56</specification-version>
59
                        <specification-version>1.69</specification-version>
60
                    </run-dependency>
60
                    </run-dependency>
61
                </dependency>
61
                </dependency>
62
                <dependency>
62
                <dependency>
(-)a/editor.breadcrumbs/src/org/netbeans/modules/editor/breadcrumbs/support/BreadCrumbsScheduler.java (-6 / +4 lines)
Lines 81-88 Link Here
81
        SwingUtilities.invokeLater(new Runnable() {
81
        SwingUtilities.invokeLater(new Runnable() {
82
            @Override
82
            @Override
83
            public void run() {
83
            public void run() {
84
                if (currentEditor == null || source == null) return;
84
                if (currentEditor == null || getSource() == null) return;
85
                schedule (source, new CursorMovedSchedulerEvent (this, currentEditor.getCaret ().getDot (), currentEditor.getCaret ().getMark ()) {});
85
                schedule (getSource(), new CursorMovedSchedulerEvent (this, currentEditor.getCaret ().getDot (), currentEditor.getCaret ().getMark ()) {});
86
            }
86
            }
87
        });
87
        });
88
    }
88
    }
Lines 98-104 Link Here
98
    private JTextComponent  currentEditor;
98
    private JTextComponent  currentEditor;
99
    private CaretListener   caretListener;
99
    private CaretListener   caretListener;
100
    private Document        currentDocument;
100
    private Document        currentDocument;
101
    private Source          source;
102
101
103
    
102
    
104
    protected void setEditor (JTextComponent editor) {
103
    protected void setEditor (JTextComponent editor) {
Lines 112-123 Link Here
112
            Document document = editor.getDocument ();
111
            Document document = editor.getDocument ();
113
            if (currentDocument == document) return;
112
            if (currentDocument == document) return;
114
            currentDocument = document;
113
            currentDocument = document;
115
            source = Source.create (currentDocument);
114
            final Source source = Source.create (currentDocument);
116
            schedule (source, new CursorMovedSchedulerEvent (this, editor.getCaret ().getDot (), editor.getCaret ().getMark ()) {});
115
            schedule (source, new CursorMovedSchedulerEvent (this, editor.getCaret ().getDot (), editor.getCaret ().getMark ()) {});
117
        }
116
        }
118
        else {
117
        else {
119
            currentDocument = null;
118
            currentDocument = null;
120
            source = null;
121
            schedule(null, null);
119
            schedule(null, null);
122
        }
120
        }
123
    }
121
    }
Lines 131-137 Link Here
131
    protected SchedulerEvent createSchedulerEvent (SourceModificationEvent event) {
129
    protected SchedulerEvent createSchedulerEvent (SourceModificationEvent event) {
132
        final JTextComponent ce = currentEditor;
130
        final JTextComponent ce = currentEditor;
133
        final Caret caret = ce != null ? ce.getCaret() : null;
131
        final Caret caret = ce != null ? ce.getCaret() : null;
134
        final Source s = source;
132
        final Source s = getSource();
135
        if (event.getModifiedSource() == s && caret != null) {
133
        if (event.getModifiedSource() == s && caret != null) {
136
            return new CursorMovedSchedulerEvent(this, caret.getDot(), caret.getMark()) { };
134
            return new CursorMovedSchedulerEvent(this, caret.getDot(), caret.getMark()) { };
137
        }
135
        }
(-)a/parsing.api/apichanges.xml (+15 lines)
Lines 110-115 Link Here
110
<!-- ACTUAL CHANGES BEGIN HERE: -->
110
<!-- ACTUAL CHANGES BEGIN HERE: -->
111
111
112
  <changes>
112
  <changes>
113
      <change id="Scheduler.getSource">
114
          <api name="ParsingAPI"/>
115
          <summary>Added <code>Sheduler.getSource</code> method for obtaining the active source</summary>
116
          <version major="1" minor="69"/>
117
          <date day="19" month="8" year="2013"/>
118
          <author login="tzezula"/>
119
          <compatibility source="compatible" binary="compatible" semantic="compatible" addition="yes"/>
120
          <description>
121
              <p>Added protected final method <code>Schedulter.getSource</code> allowing <code>Scheduler</code> subclasses
122
              to obtain the active <code>Source</code> rather than caching it itself.
123
              </p>
124
          </description>
125
          <class package="org.netbeans.modules.parsing.spi" name="Scheduler"/>
126
          <issue number="199357"/>
127
      </change>
113
      <change id="EmbeddingIndexer.refresh">
128
      <change id="EmbeddingIndexer.refresh">
114
          <api name="ParsingAPI"/>
129
          <api name="ParsingAPI"/>
115
          <summary>Allow refresh of <code>EmbeddingIndexer</code></summary>
130
          <summary>Allow refresh of <code>EmbeddingIndexer</code></summary>
(-)a/parsing.api/nbproject/project.properties (-1 / +1 lines)
Lines 3-9 Link Here
3
javac.source=1.7
3
javac.source=1.7
4
javadoc.apichanges=${basedir}/apichanges.xml
4
javadoc.apichanges=${basedir}/apichanges.xml
5
javadoc.arch=${basedir}/arch.xml
5
javadoc.arch=${basedir}/arch.xml
6
spec.version.base=1.68.0
6
spec.version.base=1.69.0
7
7
8
test.config.stableBTD.includes=**/*Test.class
8
test.config.stableBTD.includes=**/*Test.class
9
test.config.stableBTD.excludes=\
9
test.config.stableBTD.excludes=\
(-)a/parsing.api/src/org/netbeans/modules/parsing/impl/CurrentDocumentScheduler.java (-6 / +3 lines)
Lines 60-78 Link Here
60
public class CurrentDocumentScheduler extends CurrentEditorTaskScheduler {
60
public class CurrentDocumentScheduler extends CurrentEditorTaskScheduler {
61
    
61
    
62
    private Document        currentDocument;
62
    private Document        currentDocument;
63
    private Source          source;
64
    
63
    
65
    protected void setEditor (JTextComponent editor) {
64
    protected void setEditor (JTextComponent editor) {
66
        if (editor != null) {
65
        if (editor != null) {
67
            Document document = editor.getDocument ();
66
            Document document = editor.getDocument ();
68
            if (currentDocument == document) return;
67
            if (currentDocument == document) return;
69
            currentDocument = document;
68
            currentDocument = document;
70
            source = Source.create (currentDocument);
69
            final Source source = Source.create (currentDocument);
71
            schedule (source, new SchedulerEvent (this) {});
70
            schedule (source, new SchedulerEvent (this) {});
72
        }
71
        }
73
        else {
72
        else {
74
            currentDocument = null;
73
            currentDocument = null;            
75
            source = null;
76
            schedule(null, null);
74
            schedule(null, null);
77
        }
75
        }
78
    }
76
    }
Lines 82-88 Link Here
82
     * @param source
80
     * @param source
83
     */
81
     */
84
    void schedule (Source source) {
82
    void schedule (Source source) {
85
        this.source = source;
86
        schedule (source, new SchedulerEvent (this) {});
83
        schedule (source, new SchedulerEvent (this) {});
87
    }
84
    }
88
    
85
    
Lines 93-99 Link Here
93
90
94
    @Override
91
    @Override
95
    protected SchedulerEvent createSchedulerEvent (SourceModificationEvent event) {
92
    protected SchedulerEvent createSchedulerEvent (SourceModificationEvent event) {
96
        if (event.getModifiedSource () == source)
93
        if (event.getModifiedSource () == getSource())
97
            return new SchedulerEvent (this) {};
94
            return new SchedulerEvent (this) {};
98
        return null;
95
        return null;
99
    }
96
    }
(-)a/parsing.api/src/org/netbeans/modules/parsing/impl/CursorSensitiveScheduler.java (-4 / +2 lines)
Lines 66-72 Link Here
66
    private JTextComponent  currentEditor;
66
    private JTextComponent  currentEditor;
67
    private CaretListener   caretListener;
67
    private CaretListener   caretListener;
68
    private Document        currentDocument;
68
    private Document        currentDocument;
69
    private Source          source;
70
69
71
    
70
    
72
    protected void setEditor (JTextComponent editor) {
71
    protected void setEditor (JTextComponent editor) {
Lines 80-91 Link Here
80
            Document document = editor.getDocument ();
79
            Document document = editor.getDocument ();
81
            if (currentDocument == document) return;
80
            if (currentDocument == document) return;
82
            currentDocument = document;
81
            currentDocument = document;
83
            source = Source.create (currentDocument);
82
            final Source source = Source.create (currentDocument);
84
            schedule (source, new CursorMovedSchedulerEvent (this, editor.getCaret ().getDot (), editor.getCaret ().getMark ()) {});
83
            schedule (source, new CursorMovedSchedulerEvent (this, editor.getCaret ().getDot (), editor.getCaret ().getMark ()) {});
85
        }
84
        }
86
        else {
85
        else {
87
            currentDocument = null;
86
            currentDocument = null;
88
            source = null;
89
            schedule(null, null);
87
            schedule(null, null);
90
        }
88
        }
91
    }
89
    }
Lines 99-105 Link Here
99
    protected SchedulerEvent createSchedulerEvent (SourceModificationEvent event) {
97
    protected SchedulerEvent createSchedulerEvent (SourceModificationEvent event) {
100
        final JTextComponent ce = currentEditor;
98
        final JTextComponent ce = currentEditor;
101
        final Caret caret = ce != null ? ce.getCaret() : null;
99
        final Caret caret = ce != null ? ce.getCaret() : null;
102
        final Source s = source;
100
        final Source s = getSource();
103
        if (event.getModifiedSource() == s && caret != null) {
101
        if (event.getModifiedSource() == s && caret != null) {
104
            return new CursorMovedSchedulerEvent(this, caret.getDot(), caret.getMark()) { };
102
            return new CursorMovedSchedulerEvent(this, caret.getDot(), caret.getMark()) { };
105
        }
103
        }
(-)a/parsing.api/src/org/netbeans/modules/parsing/impl/SelectedNodesScheduler.java (-4 / +2 lines)
Lines 66-72 Link Here
66
public class SelectedNodesScheduler extends Scheduler {
66
public class SelectedNodesScheduler extends Scheduler {
67
67
68
68
69
    private Source              source;
70
69
71
    public SelectedNodesScheduler () {
70
    public SelectedNodesScheduler () {
72
        TopComponent.getRegistry ().addPropertyChangeListener (new AListener ());
71
        TopComponent.getRegistry ().addPropertyChangeListener (new AListener ());
Lines 86-92 Link Here
86
                    if (dataObject != null && dataObject.isValid()) {
85
                    if (dataObject != null && dataObject.isValid()) {
87
                        final FileObject fileObject = dataObject.getPrimaryFile ();
86
                        final FileObject fileObject = dataObject.getPrimaryFile ();
88
                        if (fileObject.isValid() && Util.canBeParsed(fileObject.getMIMEType())) {
87
                        if (fileObject.isValid() && Util.canBeParsed(fileObject.getMIMEType())) {
89
                            source = Source.create (fileObject);
88
                            final Source source = Source.create (fileObject);
90
                            if (source != null) {
89
                            if (source != null) {
91
                                schedule (source, new SchedulerEvent (SelectedNodesScheduler.this) {});
90
                                schedule (source, new SchedulerEvent (SelectedNodesScheduler.this) {});
92
                                return;
91
                                return;
Lines 95-101 Link Here
95
                    }
94
                    }
96
                }
95
                }
97
96
98
                source = null;
99
                schedule(null, null);
97
                schedule(null, null);
100
            }
98
            }
101
        });
99
        });
Lines 108-114 Link Here
108
106
109
    @Override
107
    @Override
110
    protected SchedulerEvent createSchedulerEvent (SourceModificationEvent event) {
108
    protected SchedulerEvent createSchedulerEvent (SourceModificationEvent event) {
111
        if (event.getModifiedSource () == source)
109
        if (event.getModifiedSource () == getSource())
112
            return new SchedulerEvent (this) {};
110
            return new SchedulerEvent (this) {};
113
        return null;
111
        return null;
114
    }
112
    }
(-)a/parsing.api/src/org/netbeans/modules/parsing/spi/Scheduler.java (-7 / +74 lines)
Lines 42-47 Link Here
42
42
43
package org.netbeans.modules.parsing.spi;
43
package org.netbeans.modules.parsing.spi;
44
44
45
import java.beans.PropertyChangeEvent;
46
import java.beans.PropertyChangeListener;
47
import java.util.logging.Level;
48
import java.util.logging.Logger;
49
import org.netbeans.api.annotations.common.CheckForNull;
45
import org.netbeans.modules.parsing.api.Source;
50
import org.netbeans.modules.parsing.api.Source;
46
import org.netbeans.modules.parsing.impl.CurrentDocumentScheduler;
51
import org.netbeans.modules.parsing.impl.CurrentDocumentScheduler;
47
import org.netbeans.modules.parsing.impl.CursorSensitiveScheduler;
52
import org.netbeans.modules.parsing.impl.CursorSensitiveScheduler;
Lines 49-57 Link Here
49
import org.netbeans.modules.parsing.impl.SelectedNodesScheduler;
54
import org.netbeans.modules.parsing.impl.SelectedNodesScheduler;
50
import org.netbeans.modules.parsing.impl.SourceAccessor;
55
import org.netbeans.modules.parsing.impl.SourceAccessor;
51
import org.netbeans.modules.parsing.impl.SourceCache;
56
import org.netbeans.modules.parsing.impl.SourceCache;
57
import org.openide.filesystems.FileObject;
58
import org.openide.loaders.DataObject;
59
import org.openide.loaders.DataObjectNotFoundException;
52
60
53
import org.openide.util.RequestProcessor;
61
import org.openide.util.RequestProcessor;
54
import org.openide.util.RequestProcessor.Task;
62
import org.openide.util.RequestProcessor.Task;
63
import org.openide.util.WeakListeners;
55
64
56
65
57
/**
66
/**
Lines 73-85 Link Here
73
     * Default reparse delay
82
     * Default reparse delay
74
     */
83
     */
75
    public static final int DEFAULT_REPARSE_DELAY = 500;
84
    public static final int DEFAULT_REPARSE_DELAY = 500;
85
86
    private static final Logger LOG = Logger.getLogger(Scheduler.class.getName());
87
88
    private final PropertyChangeListener listener = new PropertyChangeListener() {
89
        @Override
90
        public void propertyChange(PropertyChangeEvent evt) {
91
            if (DataObject.PROP_PRIMARY_FILE.equals(evt.getPropertyName())) {
92
                final DataObject dobj = (DataObject) evt.getSource();
93
                final Source newSource = Source.create(dobj.getPrimaryFile());
94
                if (newSource != null) {
95
                    LOG.log(
96
                        Level.FINE,
97
                        "Rescheduling {0} due to change of primary file.",  //NOI18N
98
                        dobj.getPrimaryFile());
99
                    schedule(newSource, new SchedulerEvent(newSource));
100
                }
101
            }
102
        }
103
    };
76
    
104
    
77
    /**
105
    /**
78
     * May be changed by unit test
106
     * May be changed by unit test
79
     */
107
     */
80
    int                     reparseDelay = DEFAULT_REPARSE_DELAY;
108
    int                     reparseDelay = DEFAULT_REPARSE_DELAY;
81
    
109
110
    //@GuardedBy("this")
82
    private Source          source;
111
    private Source          source;
112
    //@GuardedBy("this")
113
    private PropertyChangeListener wlistener;
83
    
114
    
84
    /**
115
    /**
85
     * This implementations of {@link Scheduler} reschedules all tasks when:
116
     * This implementations of {@link Scheduler} reschedules all tasks when:
Lines 142-156 Link Here
142
        if (requestProcessor == null) {
173
        if (requestProcessor == null) {
143
            requestProcessor = new RequestProcessor ();
174
            requestProcessor = new RequestProcessor ();
144
        }        
175
        }        
145
        if (this.source != source && this.source != null) {
176
        if (this.source != source) {
146
            final SourceCache cache = SourceAccessor.getINSTANCE().getCache(this.source);
177
            if (this.source != null) {
147
            cache.unscheduleTasks(Scheduler.this.getClass());
178
                final SourceCache cache = SourceAccessor.getINSTANCE().getCache(this.source);
179
                cache.unscheduleTasks(Scheduler.this.getClass());
180
                if (wlistener != null) {
181
                    final FileObject fo = this.source.getFileObject();
182
                    if (fo != null) {
183
                        try {
184
                            final DataObject dobj = DataObject.find(fo);
185
                            dobj.removePropertyChangeListener(wlistener);
186
                        } catch (DataObjectNotFoundException nfe) {
187
                            //No DataObject for file - ignore
188
                        }
189
                    }
190
                }
191
            }
192
            this.source = source;
193
            if (source != null) {
194
                final FileObject fo = source.getFileObject();
195
                if (fo != null) {
196
                    try {
197
                        final DataObject dobj = DataObject.find(fo);
198
                        wlistener = WeakListeners.propertyChange(listener, dobj);
199
                        dobj.addPropertyChangeListener(wlistener);
200
                    } catch (DataObjectNotFoundException ex) {
201
                        //No DataObject for file - ignore
202
                    }
203
                }
204
            }
148
        }
205
        }
149
        if (source == null) {
206
        if (source == null) {
150
            this.source = null;
207
            return;
151
            return ;
152
        }
208
        }
153
        this.source = source;
154
        task = requestProcessor.create (new Runnable () {
209
        task = requestProcessor.create (new Runnable () {
155
            @Override
210
            @Override
156
            public void run () {
211
            public void run () {
Lines 163-168 Link Here
163
        task.schedule (reparseDelay);
218
        task.schedule (reparseDelay);
164
    }
219
    }
165
220
221
    /**
222
     * Returns active {@link Source}.
223
     * The {@link Scheduler} subclasses should use this method to obtain the active
224
     * {@link Source} rather than caching the {@link Source} them self.
225
     * @return the {@link Source} currently handled by scheduler.
226
     * @since 1.69
227
     */
228
    @CheckForNull
229
    protected final synchronized Source getSource() {
230
        return this.source;
231
    }
232
166
    protected abstract SchedulerEvent createSchedulerEvent (SourceModificationEvent event);
233
    protected abstract SchedulerEvent createSchedulerEvent (SourceModificationEvent event);
167
234
168
    static {
235
    static {

Return to bug 234361