1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.content; 18 19 import android.annotation.UnsupportedAppUsage; 20 import android.os.Parcel; 21 import android.os.Parcelable; 22 23 /** 24 * A single undoable operation. You must subclass this to implement the state 25 * and behavior for your operation. Instances of this class are placed and 26 * managed in an {@link UndoManager}. 27 * 28 * @hide 29 */ 30 public abstract class UndoOperation<DATA> implements Parcelable { 31 UndoOwner mOwner; 32 33 /** 34 * Create a new instance of the operation. 35 * @param owner Who owns the data being modified by this undo state; must be 36 * returned by {@link UndoManager#getOwner(String, Object) UndoManager.getOwner}. 37 */ 38 @UnsupportedAppUsage UndoOperation(UndoOwner owner)39 public UndoOperation(UndoOwner owner) { 40 mOwner = owner; 41 } 42 43 /** 44 * Construct from a Parcel. 45 */ 46 @UnsupportedAppUsage UndoOperation(Parcel src, ClassLoader loader)47 protected UndoOperation(Parcel src, ClassLoader loader) { 48 } 49 50 /** 51 * Owning object as given to {@link #UndoOperation(UndoOwner)}. 52 */ getOwner()53 public UndoOwner getOwner() { 54 return mOwner; 55 } 56 57 /** 58 * Synonym for {@link #getOwner()}.{@link android.content.UndoOwner#getData()}. 59 */ getOwnerData()60 public DATA getOwnerData() { 61 return (DATA)mOwner.getData(); 62 } 63 64 /** 65 * Return true if this undo operation is a member of the given owner. 66 * The default implementation is <code>owner == getOwner()</code>. You 67 * can override this to provide more sophisticated dependencies between 68 * owners. 69 */ matchOwner(UndoOwner owner)70 public boolean matchOwner(UndoOwner owner) { 71 return owner == getOwner(); 72 } 73 74 /** 75 * Return true if this operation actually contains modification data. The 76 * default implementation always returns true. If you return false, the 77 * operation will be dropped when the final undo state is being built. 78 */ hasData()79 public boolean hasData() { 80 return true; 81 } 82 83 /** 84 * Return true if this operation can be merged with a later operation. 85 * The default implementation always returns true. 86 */ allowMerge()87 public boolean allowMerge() { 88 return true; 89 } 90 91 /** 92 * Called when this undo state is being committed to the undo stack. 93 * The implementation should perform the initial edits and save any state that 94 * may be needed to undo them. 95 */ commit()96 public abstract void commit(); 97 98 /** 99 * Called when this undo state is being popped off the undo stack (in to 100 * the temporary redo stack). The implementation should remove the original 101 * edits and thus restore the target object to its prior value. 102 */ undo()103 public abstract void undo(); 104 105 /** 106 * Called when this undo state is being pushed back from the transient 107 * redo stack to the main undo stack. The implementation should re-apply 108 * the edits that were previously removed by {@link #undo}. 109 */ redo()110 public abstract void redo(); 111 describeContents()112 public int describeContents() { 113 return 0; 114 } 115 } 116