13aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn/* 23aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * Copyright (C) 2013 The Android Open Source Project 33aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * 43aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 53aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * you may not use this file except in compliance with the License. 63aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * You may obtain a copy of the License at 73aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * 83aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 93aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * 103aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * Unless required by applicable law or agreed to in writing, software 113aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 123aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * See the License for the specific language governing permissions and 143aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * limitations under the License. 153aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn */ 163aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn 173aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackbornpackage android.content; 183aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn 193aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackbornimport android.os.Parcel; 203aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackbornimport android.os.Parcelable; 213aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn 223aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn/** 233aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * A single undoable operation. You must subclass this to implement the state 243aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * and behavior for your operation. Instances of this class are placed and 253aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * managed in an {@link UndoManager}. 26b811e64cb325c8b9c46a2e8e97ef1aa86ac8664bDianne Hackborn * 27b811e64cb325c8b9c46a2e8e97ef1aa86ac8664bDianne Hackborn * @hide 283aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn */ 293aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackbornpublic abstract class UndoOperation<DATA> implements Parcelable { 303aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn UndoOwner mOwner; 313aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn 323aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn /** 333aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * Create a new instance of the operation. 343aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * @param owner Who owns the data being modified by this undo state; must be 353aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * returned by {@link UndoManager#getOwner(String, Object) UndoManager.getOwner}. 363aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn */ 373aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn public UndoOperation(UndoOwner owner) { 383aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn mOwner = owner; 393aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn } 403aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn 413aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn /** 423aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * Construct from a Parcel. 433aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn */ 443aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn protected UndoOperation(Parcel src, ClassLoader loader) { 453aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn } 463aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn 473aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn /** 483aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * Owning object as given to {@link #UndoOperation(UndoOwner)}. 493aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn */ 503aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn public UndoOwner getOwner() { 513aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn return mOwner; 523aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn } 533aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn 543aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn /** 553aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * Synonym for {@link #getOwner()}.{@link android.content.UndoOwner#getData()}. 563aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn */ 573aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn public DATA getOwnerData() { 583aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn return (DATA)mOwner.getData(); 593aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn } 603aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn 613aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn /** 623aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * Return true if this undo operation is a member of the given owner. 633aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * The default implementation is <code>owner == getOwner()</code>. You 643aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * can override this to provide more sophisticated dependencies between 653aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * owners. 663aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn */ 673aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn public boolean matchOwner(UndoOwner owner) { 683aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn return owner == getOwner(); 693aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn } 703aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn 713aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn /** 723aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * Return true if this operation actually contains modification data. The 733aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * default implementation always returns true. If you return false, the 743aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * operation will be dropped when the final undo state is being built. 753aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn */ 763aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn public boolean hasData() { 773aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn return true; 783aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn } 793aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn 803aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn /** 813aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * Return true if this operation can be merged with a later operation. 823aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * The default implementation always returns true. 833aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn */ 843aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn public boolean allowMerge() { 853aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn return true; 863aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn } 873aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn 883aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn /** 893aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * Called when this undo state is being committed to the undo stack. 903aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * The implementation should perform the initial edits and save any state that 913aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * may be needed to undo them. 923aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn */ 933aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn public abstract void commit(); 943aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn 953aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn /** 963aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * Called when this undo state is being popped off the undo stack (in to 973aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * the temporary redo stack). The implementation should remove the original 983aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * edits and thus restore the target object to its prior value. 993aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn */ 1003aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn public abstract void undo(); 1013aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn 1023aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn /** 1033aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * Called when this undo state is being pushed back from the transient 1043aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * redo stack to the main undo stack. The implementation should re-apply 1053aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn * the edits that were previously removed by {@link #undo}. 1063aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn */ 1073aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn public abstract void redo(); 1083aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn 1093aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn public int describeContents() { 1103aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn return 0; 1113aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn } 1123aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn} 113