fIsReconciling= true;
}
fJobPresenter = fPresenter;
fJobSemanticHighlightings = fSemanticHighlightings;
fJobHighlightings = fHighlightings;
IStructuredModel model = null;
try {
if (fJobPresenter == null || fJobSemanticHighlightings == null || fJobHighlightings == null || fDocument == null)
return;
fJobPresenter.setCanceled(false);
startReconcilingPositions();
IStructuredDocument document = (IStructuredDocument) fDocument;
model = ModelManagerImpl.getInstance().getModelForRead(document);
IStructuredDocumentRegion[] regions = document.getStructuredDocumentRegions(partition.getOffset(), partition.getLength());
for (int i = 0; i < regions.length && fIsInstalled; i++) {
if (document.containsReadOnly(regions[i].getStartOffset(), regions[i].getLength()))
addPosition(new Position(regions[i].getStartOffset(), regions[i].getLength()), null, true);
else {
for (int j = 0; j < fJobSemanticHighlightings.length && fIsInstalled; j++) {
if (fJobHighlightings[j].isEnabled()) {
Position[] consumes = null;
if (fJobSemanticHighlightings[j] instanceof ISemanticHighlightingExtension && model != null) {
consumes = ((ISemanticHighlightingExtension) fJobSemanticHighlightings[j]).consumes(regions[i], model.getIndexedRegion(regions[i].getStartOffset()));
}
else {
consumes = fJobSemanticHighlightings[j].consumes(regions[i]);
}
if (consumes != null) {
for (int k = 0; k < consumes.length; k++)
addPosition(consumes[k], fJobHighlightings[j]);
}
}
}
}
}
if (fIsInstalled) {
List oldPositions = fRemovedPositions;
List newPositions = new ArrayList(fNOfRemovedPositions);
for (int i = 0, n = oldPositions.size(); i < n && fIsInstalled; i++) {
Object current = oldPositions.get(i);
if (current != null)
newPositions.add(current);
}
fRemovedPositions = newPositions;
TextPresentation presentation = null;
if (!fJobPresenter.isCanceled())
presentation = fJobPresenter.createPresentation(fAddedPositions, fRemovedPositions);
if (!fJobPresenter.isCanceled())
updatePresentation(presentation, fAddedPositions, fRemovedPositions);
}
stopReconcilingPositions();
}
finally {
fJobPresenter= null;
fJobSemanticHighlightings= null;
fJobHighlightings= null;
if (model != null)
model.releaseFromRead();
synchronized (fReconcileLock) {
fIsReconciling= false;
}
}
}