All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.openide.text.WrapUndoEdit Maven / Gradle / Ivy

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.openide.text;

import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
import javax.swing.undo.UndoableEdit;

/**
 * Undoable edit that wraps each undoable edit added to CloneableEditorSupport's undo manager.
 * 
* It is needed to *
    *
  • Prohibit addEdit() operation on last edit when the undo manager is at savepoint.
  • *
  • Prohibit replaceEdit() operation on last edit when the undo manager is at savepoint.
  • *
  • Identify non-significant edits that are otherwise not reported by editToBeUndone() * and editToBeRedone().
  • *
* * @author Miloslav Metelka * @since 6.43 */ final class WrapUndoEdit implements UndoableEdit { /** * Support for which this edit is created. */ final UndoRedoManager undoRedoManager; // 8=Object + 4 = 12 bytes /** * Real undoable edit passed to undoableEditHappened(). */ private UndoableEdit delegate; // 12 + 4 = 16 bytes WrapUndoEdit(UndoRedoManager undoRedoManager, UndoableEdit delegate) { assert (delegate != null) : "Delegate is null"; // NOI18N this.undoRedoManager = undoRedoManager; this.delegate = delegate; } UndoableEdit delegate() { return delegate; } void setDelegate(UndoableEdit delegate) { this.delegate = delegate; } @Override public void undo() throws CannotUndoException { undoRedoManager.checkLogOp("WrapUndoEdit.undo", this); boolean savepoint = undoRedoManager.isAtSavepoint(); if (savepoint) { undoRedoManager.beforeUndoAtSavepoint(this); } boolean done = false; try { delegate.undo(); done = true; // This will only happen if delegate.undo() does not throw CannotUndoException undoRedoManager.afterUndoCheck(this); } finally { if (!done && savepoint) { undoRedoManager.delegateUndoFailedAtSavepoint(this); } } } @Override public boolean canUndo() { return delegate.canUndo(); } @Override public void redo() throws CannotRedoException { undoRedoManager.checkLogOp("WrapUndoEdit.redo", this); boolean savepoint = undoRedoManager.isAtSavepoint(); if (savepoint) { undoRedoManager.beforeRedoAtSavepoint(this); } boolean done = false; try { delegate.redo(); done = true; // This will only happen if delegate.redo() does not throw CannotRedoException undoRedoManager.afterRedoCheck(this); } finally { if (!done && savepoint) { undoRedoManager.delegateRedoFailedAtSavepoint(this); } } } @Override public boolean canRedo() { return delegate.canRedo(); } @Override public void die() { undoRedoManager.checkLogOp("WrapUndoEdit.die", this); delegate.die(); undoRedoManager.notifyWrapEditDie(this); } @Override public boolean addEdit(UndoableEdit anEdit) { if (undoRedoManager.isAtSavepoint()) { // Check whether save actions can be merged with last edit. The check is done here // since at this time trimEdits() was called already so this is truly a last edit. undoRedoManager.mergeSaveActionsToLastEdit(this); // Prohibit adding to existing edit at savepoint since undo to savepoint could no longer be done // when merging with another edit. // Since addEdit() will fail the anEdit.replaceEdit() will be attempted; but it will not succeed too // (see impl) so anEdit will be added as a fresh edit to end of UM.edits. // However undoRedoManager.savepointEdit must be set by undoRedoManager.addEdit() (not here) // since UM.edits may be empty in which case WUE.addEdit() is not called. return false; } // anEdit is already wrapped for possible regular addition WrapUndoEdit wrapEdit = (WrapUndoEdit) anEdit; boolean added = delegate.addEdit(wrapEdit.delegate); return added; } @Override public boolean replaceEdit(UndoableEdit anEdit) { if (undoRedoManager.isAtSavepoint()) { // Prohibit replacing at savepoint return false; } WrapUndoEdit wrapEdit = (WrapUndoEdit) anEdit; boolean replaced = delegate.replaceEdit(wrapEdit.delegate); undoRedoManager.checkLogOp("WrapUndoEdit.replaceEdit=" + replaced, anEdit); if (replaced) { undoRedoManager.checkReplaceSavepointEdit(wrapEdit, this); } return replaced; } @Override public boolean isSignificant() { return delegate.isSignificant(); } @Override public String getPresentationName() { return delegate.getPresentationName(); } @Override public String getUndoPresentationName() { return delegate.getUndoPresentationName(); } @Override public String getRedoPresentationName() { return delegate.getRedoPresentationName(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy