Mercurial > projects > dwt2
comparison org.eclipse.text/src/org/eclipse/jface/text/SequentialRewriteTextStore.d @ 12:bc29606a740c
Added dwt-addons in original directory structure of eclipse.org
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sat, 14 Mar 2009 18:23:29 +0100 |
parents | |
children | 5feec68b4556 |
comparison
equal
deleted
inserted
replaced
11:43904fec5dca | 12:bc29606a740c |
---|---|
1 /******************************************************************************* | |
2 * Copyright (c) 2000, 2006 IBM Corporation and others. | |
3 * All rights reserved. This program and the accompanying materials | |
4 * are made available under the terms of the Eclipse Public License v1.0 | |
5 * which accompanies this distribution, and is available at | |
6 * http://www.eclipse.org/legal/epl-v10.html | |
7 * | |
8 * Contributors: | |
9 * IBM Corporation - initial API and implementation | |
10 * Port to the D programming language: | |
11 * Frank Benoit <benoit@tionex.de> | |
12 *******************************************************************************/ | |
13 module org.eclipse.jface.text.SequentialRewriteTextStore; | |
14 | |
15 import org.eclipse.jface.text.IDocumentPartitioningListener; // packageimport | |
16 import org.eclipse.jface.text.DefaultTextHover; // packageimport | |
17 import org.eclipse.jface.text.AbstractInformationControl; // packageimport | |
18 import org.eclipse.jface.text.TextUtilities; // packageimport | |
19 import org.eclipse.jface.text.IInformationControlCreatorExtension; // packageimport | |
20 import org.eclipse.jface.text.AbstractInformationControlManager; // packageimport | |
21 import org.eclipse.jface.text.ITextViewerExtension2; // packageimport | |
22 import org.eclipse.jface.text.IDocumentPartitioner; // packageimport | |
23 import org.eclipse.jface.text.DefaultIndentLineAutoEditStrategy; // packageimport | |
24 import org.eclipse.jface.text.ITextSelection; // packageimport | |
25 import org.eclipse.jface.text.Document; // packageimport | |
26 import org.eclipse.jface.text.FindReplaceDocumentAdapterContentProposalProvider; // packageimport | |
27 import org.eclipse.jface.text.ITextListener; // packageimport | |
28 import org.eclipse.jface.text.BadPartitioningException; // packageimport | |
29 import org.eclipse.jface.text.ITextViewerExtension5; // packageimport | |
30 import org.eclipse.jface.text.IDocumentPartitionerExtension3; // packageimport | |
31 import org.eclipse.jface.text.IUndoManager; // packageimport | |
32 import org.eclipse.jface.text.ITextHoverExtension2; // packageimport | |
33 import org.eclipse.jface.text.IRepairableDocument; // packageimport | |
34 import org.eclipse.jface.text.IRewriteTarget; // packageimport | |
35 import org.eclipse.jface.text.DefaultPositionUpdater; // packageimport | |
36 import org.eclipse.jface.text.RewriteSessionEditProcessor; // packageimport | |
37 import org.eclipse.jface.text.TextViewerHoverManager; // packageimport | |
38 import org.eclipse.jface.text.DocumentRewriteSession; // packageimport | |
39 import org.eclipse.jface.text.TextViewer; // packageimport | |
40 import org.eclipse.jface.text.ITextViewerExtension8; // packageimport | |
41 import org.eclipse.jface.text.RegExMessages; // packageimport | |
42 import org.eclipse.jface.text.IDelayedInputChangeProvider; // packageimport | |
43 import org.eclipse.jface.text.ITextOperationTargetExtension; // packageimport | |
44 import org.eclipse.jface.text.IWidgetTokenOwner; // packageimport | |
45 import org.eclipse.jface.text.IViewportListener; // packageimport | |
46 import org.eclipse.jface.text.GapTextStore; // packageimport | |
47 import org.eclipse.jface.text.MarkSelection; // packageimport | |
48 import org.eclipse.jface.text.IDocumentPartitioningListenerExtension; // packageimport | |
49 import org.eclipse.jface.text.IDocumentAdapterExtension; // packageimport | |
50 import org.eclipse.jface.text.IInformationControlExtension; // packageimport | |
51 import org.eclipse.jface.text.IDocumentPartitioningListenerExtension2; // packageimport | |
52 import org.eclipse.jface.text.DefaultDocumentAdapter; // packageimport | |
53 import org.eclipse.jface.text.ITextViewerExtension3; // packageimport | |
54 import org.eclipse.jface.text.IInformationControlCreator; // packageimport | |
55 import org.eclipse.jface.text.TypedRegion; // packageimport | |
56 import org.eclipse.jface.text.ISynchronizable; // packageimport | |
57 import org.eclipse.jface.text.IMarkRegionTarget; // packageimport | |
58 import org.eclipse.jface.text.TextViewerUndoManager; // packageimport | |
59 import org.eclipse.jface.text.IRegion; // packageimport | |
60 import org.eclipse.jface.text.IInformationControlExtension2; // packageimport | |
61 import org.eclipse.jface.text.IDocumentExtension4; // packageimport | |
62 import org.eclipse.jface.text.IDocumentExtension2; // packageimport | |
63 import org.eclipse.jface.text.IDocumentPartitionerExtension2; // packageimport | |
64 import org.eclipse.jface.text.Assert; // packageimport | |
65 import org.eclipse.jface.text.DefaultInformationControl; // packageimport | |
66 import org.eclipse.jface.text.IWidgetTokenOwnerExtension; // packageimport | |
67 import org.eclipse.jface.text.DocumentClone; // packageimport | |
68 import org.eclipse.jface.text.DefaultUndoManager; // packageimport | |
69 import org.eclipse.jface.text.IFindReplaceTarget; // packageimport | |
70 import org.eclipse.jface.text.IAutoEditStrategy; // packageimport | |
71 import org.eclipse.jface.text.ILineTrackerExtension; // packageimport | |
72 import org.eclipse.jface.text.IUndoManagerExtension; // packageimport | |
73 import org.eclipse.jface.text.TextSelection; // packageimport | |
74 import org.eclipse.jface.text.DefaultAutoIndentStrategy; // packageimport | |
75 import org.eclipse.jface.text.IAutoIndentStrategy; // packageimport | |
76 import org.eclipse.jface.text.IPainter; // packageimport | |
77 import org.eclipse.jface.text.IInformationControl; // packageimport | |
78 import org.eclipse.jface.text.IInformationControlExtension3; // packageimport | |
79 import org.eclipse.jface.text.ITextViewerExtension6; // packageimport | |
80 import org.eclipse.jface.text.IInformationControlExtension4; // packageimport | |
81 import org.eclipse.jface.text.DefaultLineTracker; // packageimport | |
82 import org.eclipse.jface.text.IDocumentInformationMappingExtension; // packageimport | |
83 import org.eclipse.jface.text.IRepairableDocumentExtension; // packageimport | |
84 import org.eclipse.jface.text.ITextHover; // packageimport | |
85 import org.eclipse.jface.text.FindReplaceDocumentAdapter; // packageimport | |
86 import org.eclipse.jface.text.ILineTracker; // packageimport | |
87 import org.eclipse.jface.text.Line; // packageimport | |
88 import org.eclipse.jface.text.ITextViewerExtension; // packageimport | |
89 import org.eclipse.jface.text.IDocumentAdapter; // packageimport | |
90 import org.eclipse.jface.text.TextEvent; // packageimport | |
91 import org.eclipse.jface.text.BadLocationException; // packageimport | |
92 import org.eclipse.jface.text.AbstractDocument; // packageimport | |
93 import org.eclipse.jface.text.AbstractLineTracker; // packageimport | |
94 import org.eclipse.jface.text.TreeLineTracker; // packageimport | |
95 import org.eclipse.jface.text.ITextPresentationListener; // packageimport | |
96 import org.eclipse.jface.text.Region; // packageimport | |
97 import org.eclipse.jface.text.ITextViewer; // packageimport | |
98 import org.eclipse.jface.text.IDocumentInformationMapping; // packageimport | |
99 import org.eclipse.jface.text.MarginPainter; // packageimport | |
100 import org.eclipse.jface.text.IPaintPositionManager; // packageimport | |
101 import org.eclipse.jface.text.TextPresentation; // packageimport | |
102 import org.eclipse.jface.text.IFindReplaceTargetExtension; // packageimport | |
103 import org.eclipse.jface.text.ISlaveDocumentManagerExtension; // packageimport | |
104 import org.eclipse.jface.text.ISelectionValidator; // packageimport | |
105 import org.eclipse.jface.text.IDocumentExtension; // packageimport | |
106 import org.eclipse.jface.text.PropagatingFontFieldEditor; // packageimport | |
107 import org.eclipse.jface.text.ConfigurableLineTracker; // packageimport | |
108 import org.eclipse.jface.text.SlaveDocumentEvent; // packageimport | |
109 import org.eclipse.jface.text.IDocumentListener; // packageimport | |
110 import org.eclipse.jface.text.PaintManager; // packageimport | |
111 import org.eclipse.jface.text.IFindReplaceTargetExtension3; // packageimport | |
112 import org.eclipse.jface.text.ITextDoubleClickStrategy; // packageimport | |
113 import org.eclipse.jface.text.IDocumentExtension3; // packageimport | |
114 import org.eclipse.jface.text.Position; // packageimport | |
115 import org.eclipse.jface.text.TextMessages; // packageimport | |
116 import org.eclipse.jface.text.CopyOnWriteTextStore; // packageimport | |
117 import org.eclipse.jface.text.WhitespaceCharacterPainter; // packageimport | |
118 import org.eclipse.jface.text.IPositionUpdater; // packageimport | |
119 import org.eclipse.jface.text.DefaultTextDoubleClickStrategy; // packageimport | |
120 import org.eclipse.jface.text.ListLineTracker; // packageimport | |
121 import org.eclipse.jface.text.ITextInputListener; // packageimport | |
122 import org.eclipse.jface.text.BadPositionCategoryException; // packageimport | |
123 import org.eclipse.jface.text.IWidgetTokenKeeperExtension; // packageimport | |
124 import org.eclipse.jface.text.IInputChangedListener; // packageimport | |
125 import org.eclipse.jface.text.ITextOperationTarget; // packageimport | |
126 import org.eclipse.jface.text.IDocumentInformationMappingExtension2; // packageimport | |
127 import org.eclipse.jface.text.ITextViewerExtension7; // packageimport | |
128 import org.eclipse.jface.text.IInformationControlExtension5; // packageimport | |
129 import org.eclipse.jface.text.IDocumentRewriteSessionListener; // packageimport | |
130 import org.eclipse.jface.text.JFaceTextUtil; // packageimport | |
131 import org.eclipse.jface.text.AbstractReusableInformationControlCreator; // packageimport | |
132 import org.eclipse.jface.text.TabsToSpacesConverter; // packageimport | |
133 import org.eclipse.jface.text.CursorLinePainter; // packageimport | |
134 import org.eclipse.jface.text.ITextHoverExtension; // packageimport | |
135 import org.eclipse.jface.text.IEventConsumer; // packageimport | |
136 import org.eclipse.jface.text.IDocument; // packageimport | |
137 import org.eclipse.jface.text.IWidgetTokenKeeper; // packageimport | |
138 import org.eclipse.jface.text.DocumentCommand; // packageimport | |
139 import org.eclipse.jface.text.TypedPosition; // packageimport | |
140 import org.eclipse.jface.text.IEditingSupportRegistry; // packageimport | |
141 import org.eclipse.jface.text.IDocumentPartitionerExtension; // packageimport | |
142 import org.eclipse.jface.text.AbstractHoverInformationControlManager; // packageimport | |
143 import org.eclipse.jface.text.IEditingSupport; // packageimport | |
144 import org.eclipse.jface.text.IMarkSelection; // packageimport | |
145 import org.eclipse.jface.text.ISlaveDocumentManager; // packageimport | |
146 import org.eclipse.jface.text.DocumentEvent; // packageimport | |
147 import org.eclipse.jface.text.DocumentPartitioningChangedEvent; // packageimport | |
148 import org.eclipse.jface.text.ITextStore; // packageimport | |
149 import org.eclipse.jface.text.JFaceTextMessages; // packageimport | |
150 import org.eclipse.jface.text.DocumentRewriteSessionEvent; // packageimport | |
151 import org.eclipse.jface.text.DocumentRewriteSessionType; // packageimport | |
152 import org.eclipse.jface.text.TextAttribute; // packageimport | |
153 import org.eclipse.jface.text.ITextViewerExtension4; // packageimport | |
154 import org.eclipse.jface.text.ITypedRegion; // packageimport | |
155 | |
156 | |
157 import java.lang.all; | |
158 import java.util.LinkedList; | |
159 import java.util.Iterator; | |
160 import java.util.Set; | |
161 | |
162 | |
163 | |
164 | |
165 | |
166 /** | |
167 * A text store that optimizes a given source text store for sequential rewriting. | |
168 * While rewritten it keeps a list of replace command that serve as patches for | |
169 * the source store. Only on request, the source store is indeed manipulated | |
170 * by applying the patch commands to the source text store. | |
171 * | |
172 * @since 2.0 | |
173 * @deprecated since 3.3 as {@link GapTextStore} performs better even for sequential rewrite scenarios | |
174 */ | |
175 public class SequentialRewriteTextStore : ITextStore { | |
176 | |
177 /** | |
178 * A buffered replace command. | |
179 */ | |
180 private static class Replace { | |
181 public int newOffset; | |
182 public const int offset; | |
183 public const int length; | |
184 public const String text; | |
185 | |
186 public this(int offset, int newOffset, int length, String text) { | |
187 this.newOffset= newOffset; | |
188 this.offset= offset; | |
189 this.length= length; | |
190 this.text= text; | |
191 } | |
192 } | |
193 | |
194 /** The list of buffered replacements. */ | |
195 private LinkedList fReplaceList; | |
196 /** The source text store */ | |
197 private ITextStore fSource; | |
198 /** A flag to enforce sequential access. */ | |
199 private static const bool ASSERT_SEQUENTIALITY= false; | |
200 | |
201 | |
202 /** | |
203 * Creates a new sequential rewrite store for the given source store. | |
204 * | |
205 * @param source the source text store | |
206 */ | |
207 public this(ITextStore source) { | |
208 fReplaceList= new LinkedList(); | |
209 fSource= source; | |
210 } | |
211 | |
212 /** | |
213 * Returns the source store of this rewrite store. | |
214 * | |
215 * @return the source store of this rewrite store | |
216 */ | |
217 public ITextStore getSourceStore() { | |
218 commit(); | |
219 return fSource; | |
220 } | |
221 | |
222 /* | |
223 * @see org.eclipse.jface.text.ITextStore#replace(int, int, java.lang.String) | |
224 */ | |
225 public void replace(int offset, int length, String text) { | |
226 if (text is null) | |
227 text= ""; //$NON-NLS-1$ | |
228 | |
229 if (fReplaceList.size() is 0) { | |
230 fReplaceList.add(new Replace(offset, offset, length, text)); | |
231 | |
232 } else { | |
233 Replace firstReplace= cast(Replace) fReplaceList.getFirst(); | |
234 Replace lastReplace= cast(Replace) fReplaceList.getLast(); | |
235 | |
236 // backward | |
237 if (offset + length <= firstReplace.newOffset) { | |
238 int delta= text.length - length; | |
239 if (delta !is 0) { | |
240 for (Iterator i= fReplaceList.iterator(); i.hasNext(); ) { | |
241 Replace replace= cast(Replace) i.next(); | |
242 replace.newOffset += delta; | |
243 } | |
244 } | |
245 | |
246 fReplaceList.addFirst(new Replace(offset, offset, length, text)); | |
247 | |
248 // forward | |
249 } else if (offset >= lastReplace.newOffset + lastReplace.text.length) { | |
250 int delta= getDelta(lastReplace); | |
251 fReplaceList.add(new Replace(offset - delta, offset, length, text)); | |
252 | |
253 } else if (ASSERT_SEQUENTIALITY) { | |
254 throw new IllegalArgumentException(null); | |
255 | |
256 } else { | |
257 commit(); | |
258 fSource.replace(offset, length, text); | |
259 } | |
260 } | |
261 } | |
262 | |
263 /* | |
264 * @see org.eclipse.jface.text.ITextStore#set(java.lang.String) | |
265 */ | |
266 public void set(String text) { | |
267 fSource.set(text); | |
268 fReplaceList.clear(); | |
269 } | |
270 | |
271 /* | |
272 * @see org.eclipse.jface.text.ITextStore#get(int, int) | |
273 */ | |
274 public String get(int offset, int length) { | |
275 | |
276 if (fReplaceList.isEmpty()) | |
277 return fSource.get(offset, length); | |
278 | |
279 | |
280 Replace firstReplace= cast(Replace) fReplaceList.getFirst(); | |
281 Replace lastReplace= cast(Replace) fReplaceList.getLast(); | |
282 | |
283 // before | |
284 if (offset + length <= firstReplace.newOffset) { | |
285 return fSource.get(offset, length); | |
286 | |
287 // after | |
288 } else if (offset >= lastReplace.newOffset + lastReplace.text.length) { | |
289 int delta= getDelta(lastReplace); | |
290 return fSource.get(offset - delta, length); | |
291 | |
292 } else if (ASSERT_SEQUENTIALITY) { | |
293 throw new IllegalArgumentException(null); | |
294 | |
295 } else { | |
296 | |
297 int delta= 0; | |
298 for (Iterator i= fReplaceList.iterator(); i.hasNext(); ) { | |
299 Replace replace= cast(Replace) i.next(); | |
300 | |
301 if (offset + length < replace.newOffset) { | |
302 return fSource.get(offset - delta, length); | |
303 | |
304 } else if (offset >= replace.newOffset && offset + length <= replace.newOffset + replace.text.length) { | |
305 return replace.text.substring(offset - replace.newOffset, offset - replace.newOffset + length); | |
306 | |
307 } else if (offset >= replace.newOffset + replace.text.length) { | |
308 delta= getDelta(replace); | |
309 continue; | |
310 | |
311 } else { | |
312 commit(); | |
313 return fSource.get(offset, length); | |
314 } | |
315 } | |
316 | |
317 return fSource.get(offset - delta, length); | |
318 } | |
319 | |
320 } | |
321 | |
322 /** | |
323 * Returns the difference between the offset in the source store and the "same" offset in the | |
324 * rewrite store after the replace operation. | |
325 * | |
326 * @param replace the replace command | |
327 * @return the difference | |
328 */ | |
329 private static final int getDelta(Replace replace) { | |
330 return replace.newOffset - replace.offset + replace.text.length() - replace.length; | |
331 } | |
332 | |
333 /* | |
334 * @see org.eclipse.jface.text.ITextStore#get(int) | |
335 */ | |
336 public char get(int offset) { | |
337 if (fReplaceList.isEmpty()) | |
338 return fSource.get(offset); | |
339 | |
340 Replace firstReplace= cast(Replace) fReplaceList.getFirst(); | |
341 Replace lastReplace= cast(Replace) fReplaceList.getLast(); | |
342 | |
343 // before | |
344 if (offset < firstReplace.newOffset) { | |
345 return fSource.get(offset); | |
346 | |
347 // after | |
348 } else if (offset >= lastReplace.newOffset + lastReplace.text.length()) { | |
349 int delta= getDelta(lastReplace); | |
350 return fSource.get(offset - delta); | |
351 | |
352 } else if (ASSERT_SEQUENTIALITY) { | |
353 throw new IllegalArgumentException(null); | |
354 | |
355 } else { | |
356 | |
357 int delta= 0; | |
358 for (Iterator i= fReplaceList.iterator(); i.hasNext(); ) { | |
359 Replace replace= cast(Replace) i.next(); | |
360 | |
361 if (offset < replace.newOffset) | |
362 return fSource.get(offset - delta); | |
363 | |
364 else if (offset < replace.newOffset + replace.text.length()) | |
365 return replace.text.charAt(offset - replace.newOffset); | |
366 | |
367 delta= getDelta(replace); | |
368 } | |
369 | |
370 return fSource.get(offset - delta); | |
371 } | |
372 } | |
373 | |
374 /* | |
375 * @see org.eclipse.jface.text.ITextStore#getLength() | |
376 */ | |
377 public int getLength() { | |
378 if (fReplaceList.isEmpty()) | |
379 return fSource.getLength(); | |
380 | |
381 Replace lastReplace= cast(Replace) fReplaceList.getLast(); | |
382 return fSource.getLength() + getDelta(lastReplace); | |
383 } | |
384 | |
385 /** | |
386 * Disposes this rewrite store. | |
387 */ | |
388 public void dispose() { | |
389 fReplaceList= null; | |
390 fSource= null; | |
391 } | |
392 | |
393 /** | |
394 * Commits all buffered replace commands. | |
395 */ | |
396 private void commit() { | |
397 | |
398 if (fReplaceList.isEmpty()) | |
399 return; | |
400 | |
401 StringBuffer buffer= new StringBuffer(); | |
402 | |
403 int delta= 0; | |
404 for (Iterator i= fReplaceList.iterator(); i.hasNext(); ) { | |
405 Replace replace= cast(Replace) i.next(); | |
406 | |
407 int offset= buffer.length() - delta; | |
408 buffer.append(fSource.get(offset, replace.offset - offset)); | |
409 buffer.append(replace.text); | |
410 delta= getDelta(replace); | |
411 } | |
412 | |
413 int offset= buffer.length() - delta; | |
414 buffer.append(fSource.get(offset, fSource.getLength() - offset)); | |
415 | |
416 fSource.set(buffer.toString()); | |
417 fReplaceList.clear(); | |
418 } | |
419 } |