package jetbrains.mps.vcs.changesmanager;
/*Generated by MPS */
import org.jetbrains.mps.openapi.model.EditableSModel;
import jetbrains.mps.vcs.diff.ChangeSetImpl;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.internal.collections.runtime.IVisitor;
import jetbrains.mps.vcs.diff.changes.ModelChange;
import org.jetbrains.annotations.Nullable;
import jetbrains.mps.vcs.diff.ChangeSet;
public class CurrentDifference {
private final SimpleCommandQueue myCommandQueue;
private final EditableSModel myModelDescriptor;
private final ChangesTracking myTracking;
private ChangeSetImpl myChangeSet;
private final CurrentDifferenceBroadcaster myBroadcaster;
private boolean myEnabled = false;
public CurrentDifference(@NotNull CurrentDifferenceRegistry registry, @NotNull EditableSModel modelDescriptor) {
myCommandQueue = registry.getCommandQueue();
myModelDescriptor = modelDescriptor;
myTracking = new ChangesTracking(registry, this);
myBroadcaster = new CurrentDifferenceBroadcaster(myCommandQueue);
myBroadcaster.addDifferenceListener(registry.getGlobalBroadcaster());
}
public void dispose() {
myTracking.dispose();
}
public void addDifferenceListener(@NotNull CurrentDifferenceListener listener) {
myBroadcaster.addDifferenceListener(listener);
}
public void removeDifferenceListener(@NotNull CurrentDifferenceListener listener) {
myBroadcaster.removeDifferenceListener(listener);
}
/*package*/ void removeChangeSet() {
myCommandQueue.assertSoftlyIsCommandThread();
if (myChangeSet != null) {
myBroadcaster.changeUpdateStarted();
ListSequence.fromList(myChangeSet.getModelChanges()).visitAll(new IVisitor<ModelChange>() {
public void visit(ModelChange ch) {
myBroadcaster.changeRemoved(ch);
}
});
myChangeSet = null;
myBroadcaster.changeUpdateFinished();
}
}
/*package*/ void setChangeSet(@NotNull ChangeSetImpl changeSetImpl) {
myCommandQueue.assertSoftlyIsCommandThread();
removeChangeSet();
myBroadcaster.changeUpdateStarted();
myChangeSet = changeSetImpl;
ListSequence.fromList(myChangeSet.getModelChanges()).visitAll(new IVisitor<ModelChange>() {
public void visit(ModelChange ch) {
myBroadcaster.changeAdded(ch);
}
});
myBroadcaster.changeUpdateFinished();
}
/*package*/ CurrentDifferenceBroadcaster getBroadcaster() {
return myBroadcaster;
}
/*package*/ void addChange(@NotNull ModelChange change) {
if (myChangeSet != null) {
myChangeSet.add(change);
myBroadcaster.changeAdded(change);
}
}
/*package*/ void removeChange(@NotNull ModelChange change) {
if (myChangeSet != null) {
myChangeSet.remove(change);
myBroadcaster.changeRemoved(change);
}
}
public EditableSModel getModelDescriptor() {
return myModelDescriptor;
}
/*package*/ ChangesTracking getChangesTracker() {
return myTracking;
}
/*package*/ boolean isEnabled() {
return myEnabled;
}
public void setEnabled(boolean enabled) {
if (myEnabled != enabled) {
myEnabled = enabled;
if (enabled) {
myTracking.scheduleFullUpdate(true);
} else {
myCommandQueue.addTask(new Runnable() {
public void run() {
setChangeSet(null);
}
});
}
}
}
@Nullable
public ChangeSet getChangeSet() {
return myChangeSet;
}
}