/* * Copyright 2003-2015 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.smodel; import org.jetbrains.annotations.NotNull; import org.jetbrains.mps.openapi.model.EditableSModel; import org.jetbrains.mps.openapi.model.SModelChangeListener; import org.jetbrains.mps.openapi.model.SModelReference; import org.jetbrains.mps.openapi.model.SNodeChangeListener; import org.jetbrains.mps.openapi.persistence.DataSource; /** * Base implementation of {@link EditableSModel}. Since it relies on non-API {@link SModel j.m.smodel.SModel} model data * implementation, the class kept in our implementation package, rather than being part of openapi/extapi. * * This implementation is responsible for change state field, change listeners (both new and contemporary), * and root add/remove. Other aspects of {@link EditableSModel} shall be implemented in subclasses. * * @since 3.3 * @author Artem Tikhomirov */ public abstract class EditableModelDescriptor extends RegularModelDescriptor implements EditableSModel { // intentionally not volatile, as generally model could be changed from single thread only private boolean myIsChanged; protected EditableModelDescriptor(@NotNull SModelReference modelRef, @NotNull DataSource source) { super(modelRef, source); } @Override public boolean isChanged() { return myIsChanged; } @Override public void setChanged(boolean changed) { myIsChanged = changed; } @Override public void addRootNode(@NotNull org.jetbrains.mps.openapi.model.SNode node) { assertCanChange(); getModelData().addRootNode(node); } @Override public void removeRootNode(@NotNull org.jetbrains.mps.openapi.model.SNode node) { assertCanChange(); getModelData().removeRootNode(node); } @Override public boolean isReadOnly() { // FIXME why not this code in SModelBase? Looks pretty general, IMO. return getSource().isReadOnly(); } @Override public void addChangeListener(SNodeChangeListener listener) { getNodeEventDispatch().addChangeListener(listener); } @Override public void removeChangeListener(SNodeChangeListener listener) { getNodeEventDispatch().removeChangeListener(listener); } @Override public void addChangeListener(SModelChangeListener l) { // although there's no reason to handle legacy listeners that are scheduled for removal in the new class, // it doesn't hurt to. getNodeEventDispatch().addChangeListener(l); } @Override public void removeChangeListener(SModelChangeListener l) { // although there's no reason to handle legacy listeners that are scheduled for removal in the new class, // it doesn't hurt to. getNodeEventDispatch().removeChangeListener(l); } }