/* * Copyright 2003-2016 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.cells; import jetbrains.mps.nodeEditor.cells.EditorCell_Label.DummyUndoableAction; import jetbrains.mps.openapi.editor.EditorContext; import jetbrains.mps.openapi.editor.cells.EditorCell; import jetbrains.mps.smodel.UndoHelper; import org.jetbrains.mps.openapi.model.SNode; public class TransactionalPropertyAccessor extends PropertyAccessor implements TransactionalModelAccessor { private String myOldValue; private String myUncommittedValue; private boolean myHasValueToCommit = false; private EditorCell myEditorCell; public TransactionalPropertyAccessor(SNode node, String propertyName, boolean readOnly, boolean allowEmptyText, EditorContext editorContext) { super(node, propertyName, readOnly, allowEmptyText, editorContext); } void setCell(EditorCell editorCell) { myEditorCell = editorCell; } @Override public String doGetValue() { if (myHasValueToCommit) { return myUncommittedValue; } return super.doGetValue(); } @Override public void doSetValue(String newText) { myUncommittedValue = newText; myHasValueToCommit = true; myOldValue = super.doGetValue(); } @Override public boolean hasValueToCommit() { return myHasValueToCommit; } @Override public void resetUncommittedValue() { if (myHasValueToCommit) { myUncommittedValue = null; myHasValueToCommit = false; } } @Override public void commit() { if (myHasValueToCommit) { doCommit(myOldValue, myUncommittedValue); getRepository().getModelAccess().executeCommand(new ChangePropertyEditorCommand(myEditorCell.getContext(), getGroupId()) { @Override protected void doExecute() { resetUncommittedValue(); UndoHelper.getInstance().addUndoableAction(new DummyUndoableAction(getNode())); } }); myOldValue = null; synchronizeCell(); } } protected void doCommit(String oldValue, String newValue) { } private void synchronizeCell() { if (myEditorCell instanceof SynchronizeableEditorCell) { ((SynchronizeableEditorCell) myEditorCell).synchronize(); } } private String getGroupId() { if (myEditorCell instanceof EditorCell_Label) { return ((EditorCell_Label) myEditorCell).getCommandGroupId(); } return null; } }