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