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