public void UpdateFoldSegments (List<FoldSegment> newSegments, bool startTask = false, bool useApplicationInvoke = false, CancellationToken masterToken = default(CancellationToken))
{
if (newSegments == null) {
return;
}
InterruptFoldWorker ();
bool update;
if (!startTask) {
var newFoldedSegments = UpdateFoldSegmentWorker (newSegments, out update);
if (useApplicationInvoke) {
Gtk.Application.Invoke (delegate {
foldedSegments = newFoldedSegments;
InformFoldTreeUpdated ();
});
} else {
foldedSegments = newFoldedSegments;
InformFoldTreeUpdated ();
}
return;
}
foldSegmentSrc = new CancellationTokenSource ();
masterToken.Register (InterruptFoldWorker);
var token = foldSegmentSrc.Token;
foldSegmentTask = Task.Factory.StartNew (delegate {
var segments = UpdateFoldSegmentWorker (newSegments, out update, token);
if (token.IsCancellationRequested)
return;
Gtk.Application.Invoke (delegate {
if (token.IsCancellationRequested)
return;
foldedSegments = segments;
InformFoldTreeUpdated ();
if (update)
CommitUpdateAll ();
});
}, token);
}