| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.calculator2; |
| |
| import android.widget.BaseAdapter; |
| |
| import java.io.DataInput; |
| import java.io.DataOutput; |
| import java.io.IOException; |
| import java.util.Vector; |
| |
| class History { |
| private static final int VERSION_1 = 1; |
| private static final int MAX_ENTRIES = 100; |
| Vector<HistoryEntry> mEntries = new Vector<HistoryEntry>(); |
| int mPos; |
| BaseAdapter mObserver; |
| |
| History() { |
| clear(); |
| } |
| |
| History(int version, DataInput in) throws IOException { |
| if (version >= VERSION_1) { |
| int size = in.readInt(); |
| for (int i = 0; i < size; ++i) { |
| mEntries.add(new HistoryEntry(version, in)); |
| } |
| mPos = in.readInt(); |
| } else { |
| throw new IOException("invalid version " + version); |
| } |
| } |
| |
| void setObserver(BaseAdapter observer) { |
| mObserver = observer; |
| } |
| |
| private void notifyChanged() { |
| if (mObserver != null) { |
| mObserver.notifyDataSetChanged(); |
| } |
| } |
| |
| void clear() { |
| mEntries.clear(); |
| mEntries.add(new HistoryEntry("")); |
| mPos = 0; |
| notifyChanged(); |
| } |
| |
| void write(DataOutput out) throws IOException { |
| out.writeInt(mEntries.size()); |
| for (HistoryEntry entry : mEntries) { |
| entry.write(out); |
| } |
| out.writeInt(mPos); |
| } |
| |
| void update(String text) { |
| current().setEdited(text); |
| } |
| |
| boolean moveToPrevious() { |
| if (mPos > 0) { |
| --mPos; |
| return true; |
| } |
| return false; |
| } |
| |
| boolean moveToNext() { |
| if (mPos < mEntries.size() - 1) { |
| ++mPos; |
| return true; |
| } |
| return false; |
| } |
| |
| void enter(String text) { |
| current().clearEdited(); |
| if (mEntries.size() >= MAX_ENTRIES) { |
| mEntries.remove(0); |
| } |
| if (mEntries.size() < 2 || |
| !text.equals(mEntries.elementAt(mEntries.size() - 2).getBase())) { |
| mEntries.insertElementAt(new HistoryEntry(text), mEntries.size() - 1); |
| } |
| mPos = mEntries.size() - 1; |
| notifyChanged(); |
| } |
| |
| HistoryEntry current() { |
| return mEntries.elementAt(mPos); |
| } |
| |
| String getText() { |
| return current().getEdited(); |
| } |
| |
| String getBase() { |
| return current().getBase(); |
| } |
| } |