16a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard/*
26a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard * Copyright (C) 2013 The Android Open Source Project
36a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard *
46a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard * Licensed under the Apache License, Version 2.0 (the "License");
56a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard * you may not use this file except in compliance with the License.
66a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard * You may obtain a copy of the License at
76a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard *
86a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard *      http://www.apache.org/licenses/LICENSE-2.0
96a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard *
106a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard * Unless required by applicable law or agreed to in writing, software
116a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard * distributed under the License is distributed on an "AS IS" BASIS,
126a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard * See the License for the specific language governing permissions and
146a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard * limitations under the License.
156a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard */
166a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
176a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroardpackage com.android.gallery3d.filtershow.history;
186a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
196a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroardimport android.graphics.drawable.Drawable;
206a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroardimport android.view.MenuItem;
216a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
226a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroardimport java.util.Vector;
236a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
246a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroardpublic class HistoryManager {
256a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    private static final String LOGTAG = "HistoryManager";
266a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
276a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    private Vector<HistoryItem> mHistoryItems = new Vector<HistoryItem>();
286a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    private int mCurrentPresetPosition = 0;
296a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    private MenuItem mUndoMenuItem = null;
306a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    private MenuItem mRedoMenuItem = null;
316a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    private MenuItem mResetMenuItem = null;
326a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
336a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    public void setMenuItems(MenuItem undoItem, MenuItem redoItem, MenuItem resetItem) {
346a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        mUndoMenuItem = undoItem;
356a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        mRedoMenuItem = redoItem;
366a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        mResetMenuItem = resetItem;
376a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        updateMenuItems();
386a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
396a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
406a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    private int getCount() {
416a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        return mHistoryItems.size();
426a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
436a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
446a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    public HistoryItem getItem(int position) {
4532646aabd8228e1494ba090a02ffb8adaa369127nicolasroard        if (position > mHistoryItems.size() - 1) {
4632646aabd8228e1494ba090a02ffb8adaa369127nicolasroard            return null;
4732646aabd8228e1494ba090a02ffb8adaa369127nicolasroard        }
486a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        return mHistoryItems.elementAt(position);
496a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
506a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
516a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    private void clear() {
526a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        mHistoryItems.clear();
536a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
546a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
556a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    private void add(HistoryItem item) {
566a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        mHistoryItems.add(item);
576a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
586a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
596a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    private void notifyDataSetChanged() {
606a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        // TODO
616a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
626a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
636a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    public boolean canReset() {
6432646aabd8228e1494ba090a02ffb8adaa369127nicolasroard        if (getCount() <= 0) {
656a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            return false;
666a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        }
676a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        return true;
686a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
696a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
706a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    public boolean canUndo() {
716a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        if (mCurrentPresetPosition == getCount() - 1) {
726a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            return false;
736a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        }
746a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        return true;
756a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
766a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
776a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    public boolean canRedo() {
786a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        if (mCurrentPresetPosition == 0) {
796a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            return false;
806a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        }
816a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        return true;
826a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
836a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
846a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    public void updateMenuItems() {
856a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        if (mUndoMenuItem != null) {
866a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            setEnabled(mUndoMenuItem, canUndo());
876a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        }
886a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        if (mRedoMenuItem != null) {
896a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            setEnabled(mRedoMenuItem, canRedo());
906a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        }
916a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        if (mResetMenuItem != null) {
926a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            setEnabled(mResetMenuItem, canReset());
936a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        }
946a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
956a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
966a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    private void setEnabled(MenuItem item, boolean enabled) {
976a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        item.setEnabled(enabled);
986a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        Drawable drawable = item.getIcon();
996a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        if (drawable != null) {
1006a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            drawable.setAlpha(enabled ? 255 : 80);
1016a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        }
1026a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
1036a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
1046a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    public void setCurrentPreset(int n) {
1056a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        mCurrentPresetPosition = n;
1066a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        updateMenuItems();
1076a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        notifyDataSetChanged();
1086a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
1096a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
1106a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    public void reset() {
1116a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        if (getCount() == 0) {
1126a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            return;
1136a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        }
1146a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        clear();
1156a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        updateMenuItems();
1166a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
1176a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
1186a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    public HistoryItem getLast() {
1196a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        if (getCount() == 0) {
1206a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            return null;
1216a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        }
1226a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        return getItem(0);
1236a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
1246a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
1256a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    public HistoryItem getCurrent() {
1266a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        return getItem(mCurrentPresetPosition);
1276a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
1286a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
1296a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    public void addHistoryItem(HistoryItem preset) {
1306a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        insert(preset, 0);
1316a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        updateMenuItems();
1326a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
1336a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
1346a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    private void insert(HistoryItem preset, int position) {
1356a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        if (mCurrentPresetPosition != 0) {
1366a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            // in this case, let's discount the presets before the current one
1376a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            Vector<HistoryItem> oldItems = new Vector<HistoryItem>();
1386a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            for (int i = mCurrentPresetPosition; i < getCount(); i++) {
1396a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard                oldItems.add(getItem(i));
1406a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            }
1416a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            clear();
1426a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            for (int i = 0; i < oldItems.size(); i++) {
1436a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard                add(oldItems.elementAt(i));
1446a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            }
1456a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            mCurrentPresetPosition = position;
1466a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            notifyDataSetChanged();
1476a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        }
1486a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        mHistoryItems.insertElementAt(preset, position);
1496a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        mCurrentPresetPosition = position;
1506a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        notifyDataSetChanged();
1516a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
1526a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
1536a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    public int redo() {
1546a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        mCurrentPresetPosition--;
1556a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        if (mCurrentPresetPosition < 0) {
1566a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            mCurrentPresetPosition = 0;
1576a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        }
1586a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        notifyDataSetChanged();
1596a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        updateMenuItems();
1606a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        return mCurrentPresetPosition;
1616a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
1626a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
1636a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    public int undo() {
1646a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        mCurrentPresetPosition++;
1656a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        if (mCurrentPresetPosition >= getCount()) {
1666a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard            mCurrentPresetPosition = getCount() - 1;
1676a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        }
1686a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        notifyDataSetChanged();
1696a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        updateMenuItems();
1706a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard        return mCurrentPresetPosition;
1716a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard    }
1726a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard
1736a50273a45cdda757daf9840e9e36a2b60eff1aanicolasroard}
174