/* * Copyright (C) 2007 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 android.view.menu; import android.app.Activity; import android.os.Bundle; import android.util.ListScenario; import android.util.SparseArray; import android.view.Menu; import android.view.MenuItem; /** * Utility base class for creating various Menu scenarios. Configurable by the * number of menu items. Used @link {@link ListScenario} as a reference. */ public class MenuScenario extends Activity implements MenuItem.OnMenuItemClickListener { private Params mParams = new Params(); private Menu mMenu; private MenuItem[] mItems; private boolean[] mWasItemClicked; @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); dispatchInitParams(); } private void dispatchInitParams() { onInitParams(mParams); onParamsChanged(); } public void setParams(Params params) { mParams = params; onParamsChanged(); } public void onParamsChanged() { mItems = new MenuItem[mParams.numItems]; mWasItemClicked = new boolean[mParams.numItems]; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Safe to hold on to mMenu = menu; if (!mParams.shouldShowMenu) return false; MenuItem item; for (int i = 0; i < mParams.numItems; i++) { if ((item = onAddMenuItem(menu, i)) == null) { // Add a default item for this position if the subclasses // haven't CharSequence givenTitle = mParams.itemTitles.get(i); item = menu.add(0, 0, 0, (givenTitle != null) ? givenTitle : ("Item " + i)); } if (item != null) { mItems[i] = item; if (mParams.listenForClicks) { item.setOnMenuItemClickListener(this); } } } return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { // Safe to hold on to mMenu = menu; return mParams.shouldShowMenu; } /** * Override this to add an item to the menu. * * @param itemPosition The position of the item to add (only for your * reference). * @return The item that was added to the menu, or null if nothing was * added. */ protected MenuItem onAddMenuItem(Menu menu, int itemPosition) { return null; } /** * Override this to set the parameters for the scenario. Call through to super first. * * @param params */ protected void onInitParams(Params params) { } public Menu getMenu() { return mMenu; } public boolean onMenuItemClick(MenuItem item) { final int position = findItemPosition(item); if (position < 0) return false; mWasItemClicked[position] = true; return true; } public boolean wasItemClicked(int position) { return mWasItemClicked[position]; } /** * Finds the position for a given Item. * * @param item The item to find. * @return The position, or -1 if not found. */ public int findItemPosition(MenuItem item) { // Could create reverse mapping, but optimizations aren't important (yet :P) for (int i = 0; i < mParams.numItems; i++) { if (mItems[i] == item) return i; } return -1; } public static class Params { // Using as data structure, so no m prefix private boolean shouldShowMenu = true; private int numItems = 10; private boolean listenForClicks = true; private SparseArray itemTitles = new SparseArray(); public Params setShouldShowMenu(boolean shouldShowMenu) { this.shouldShowMenu = shouldShowMenu; return this; } public Params setNumItems(int numItems) { this.numItems = numItems; return this; } public Params setListenForClicks(boolean listenForClicks) { this.listenForClicks = listenForClicks; return this; } public Params setItemTitle(int itemPos, CharSequence title) { itemTitles.put(itemPos, title); return this; } } }