/*
* 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<CharSequence> itemTitles = new SparseArray<CharSequence>();
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;
}
}
}