/* * Copyright 2003-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.nodeEditor.updater; import jetbrains.mps.smodel.SModelUtil_new; import jetbrains.mps.smodel.SNodePointer; import jetbrains.mps.smodel.event.SModelChildEvent; import jetbrains.mps.smodel.event.SModelDevKitEvent; import jetbrains.mps.smodel.event.SModelEvent; import jetbrains.mps.smodel.event.SModelEventVisitor; import jetbrains.mps.smodel.event.SModelFileChangedEvent; import jetbrains.mps.smodel.event.SModelImportEvent; import jetbrains.mps.smodel.event.SModelLanguageEvent; import jetbrains.mps.smodel.event.SModelPropertyEvent; import jetbrains.mps.smodel.event.SModelReferenceEvent; import jetbrains.mps.smodel.event.SModelRenamedEvent; import jetbrains.mps.smodel.event.SModelReplacedEvent; import jetbrains.mps.smodel.event.SModelRootEvent; import jetbrains.mps.util.Pair; import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.model.SNodeReference; import java.util.List; /** * User: shatalin * Date: 09/09/14 */ class ModelEventsVisitor implements SModelEventVisitor { private final UpdateInfoIndex myUpdateInfoIndex; private Boolean myIsPropertyModification = null; private Pair<SNodeReference, String> myModifiedProperty = null; private Boolean myIsPropertyAddedRemoved; private ModelEventsSelectionHandler mySelectionHandler; ModelEventsVisitor(List<SModelEvent> events, UpdateInfoIndex updateInfoIndex) { myUpdateInfoIndex = updateInfoIndex; for (SModelEvent event : events) { event.accept(this); } } ModelEventsSelectionHandler getSelectionHandler() { return mySelectionHandler; } boolean isPropertyModification() { return myIsPropertyModification != null && myIsPropertyModification; } boolean isPropertyAddedRemoved() { return isPropertyModification() && myIsPropertyAddedRemoved; } Pair<SNodeReference, String> getModifiedProperty() { return myModifiedProperty; } @Override public void visitRootEvent(SModelRootEvent event) { visitNonPropertyEvent(); } @Override public void visitChildEvent(SModelChildEvent event) { visitNonPropertyEvent(); if (!mayAffectSelection(event.getParent())) { return; } if (event.isAdded()) { mySelectionHandler = new ChildAddedSelectionHandler(event.getChild()); } else { mySelectionHandler = new ChildRemovedSelectionHandler(event.getParent(), event.getChildRole(), event.getChildIndex()); } } @Override public void visitReferenceEvent(SModelReferenceEvent event) { visitNonPropertyEvent(); if (!mayAffectSelection(event.getReference().getSourceNode())) { return; } if (event.isAdded()) { mySelectionHandler = new ReferenceAddedSelectionHandler(event.getReference()); } else { mySelectionHandler = new ReferenceRemovedSelectionHandler(event.getReference()); } } @Override public void visitLanguageEvent(SModelLanguageEvent event) { visitNonPropertyEvent(); } @Override public void visitDevKitEvent(SModelDevKitEvent event) { visitNonPropertyEvent(); } @Override public void visitPropertyEvent(SModelPropertyEvent event) { if (myIsPropertyModification != null) { visitNonPropertyEvent(); return; } myIsPropertyModification = Boolean.TRUE; myModifiedProperty = new Pair<SNodeReference, String>(new SNodePointer(event.getNode()), event.getPropertyName()); myIsPropertyAddedRemoved = SModelUtil_new.isEmptyPropertyValue(event.getOldPropertyValue()) != SModelUtil_new.isEmptyPropertyValue(event.getNewPropertyValue()); } @Override public void visitReplacedEvent(SModelReplacedEvent event) { visitNonPropertyEvent(); } @Override public void visitRenamedEvent(SModelRenamedEvent event) { visitNonPropertyEvent(); } @Override public void visitImportEvent(SModelImportEvent event) { visitNonPropertyEvent(); } @Override public void visitModelFileEvent(SModelFileChangedEvent event) { visitNonPropertyEvent(); } private void visitNonPropertyEvent() { myIsPropertyModification = Boolean.FALSE; myModifiedProperty = null; myIsPropertyAddedRemoved = null; } private boolean mayAffectSelection(SNode changedNode) { return myUpdateInfoIndex.isVisualized(changedNode); } }