blob: f71790479f7f0fa7085031a8b5a1073af0e8068a [file] [log] [blame]
Adam Powell696cba52011-03-29 10:38:16 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.internal.view.menu;
17
18import com.android.internal.view.menu.MenuView.ItemView;
19
20import android.content.Context;
21import android.os.Bundle;
22import android.os.Parcelable;
23import android.util.SparseArray;
24import android.view.ContextThemeWrapper;
25import android.view.LayoutInflater;
26import android.view.View;
27import android.view.ViewGroup;
28
29import java.util.ArrayList;
30
31/**
32 * MenuPresenter for the classic "six-pack" icon menu.
33 */
34public class IconMenuPresenter extends BaseMenuPresenter {
35 private IconMenuItemView mMoreView;
36 private int mMaxItems = -1;
37
38 private static final String VIEWS_TAG = "android:menu:icon";
39
40 public IconMenuPresenter() {
41 super(com.android.internal.R.layout.icon_menu_layout,
42 com.android.internal.R.layout.icon_menu_item_layout);
43 }
44
45 @Override
46 public void initForMenu(Context context, MenuBuilder menu) {
47 mContext = new ContextThemeWrapper(context, com.android.internal.R.style.Theme_IconMenu);
48 mInflater = LayoutInflater.from(mContext);
49 mMenu = menu;
50 mMaxItems = -1;
51 }
52
53 @Override
54 public void bindItemView(MenuItemImpl item, ItemView itemView) {
55 final IconMenuItemView view = (IconMenuItemView) itemView;
56 view.setItemData(item);
57
58 view.initialize(item.getTitleForItemView(view), item.getIcon());
59
60 view.setVisibility(item.isVisible() ? View.VISIBLE : View.GONE);
61 view.setEnabled(view.isEnabled());
62 view.setLayoutParams(view.getTextAppropriateLayoutParams());
63 }
64
65 @Override
66 public boolean shouldIncludeItem(int childIndex, MenuItemImpl item) {
67 final ArrayList<MenuItemImpl> itemsToShow = mMenu.getNonActionItems();
68 boolean fits = (itemsToShow.size() == mMaxItems && childIndex < mMaxItems) ||
69 childIndex < mMaxItems - 1;
70 return fits && !item.isActionButton();
71 }
72
73 @Override
74 protected void addItemView(View itemView, int childIndex) {
75 final IconMenuItemView v = (IconMenuItemView) itemView;
76 final IconMenuView parent = (IconMenuView) mMenuView;
77
78 v.setIconMenuView(parent);
79 v.setItemInvoker(parent);
80 v.setBackgroundDrawable(parent.getItemBackgroundDrawable());
81 super.addItemView(itemView, childIndex);
82 }
83
84 @Override
85 public boolean onSubMenuSelected(SubMenuBuilder subMenu) {
86 if (!subMenu.hasVisibleItems()) return false;
87
88 // The window manager will give us a token.
89 new MenuDialogHelper(subMenu).show(null);
90 super.onSubMenuSelected(subMenu);
91 return true;
92 }
93
94 @Override
95 public void updateMenuView(boolean cleared) {
96 final IconMenuView menuView = (IconMenuView) mMenuView;
97 if (mMaxItems < 0) mMaxItems = menuView.getMaxItems();
98 final ArrayList<MenuItemImpl> itemsToShow = mMenu.getNonActionItems();
99 final boolean needsMore = itemsToShow.size() > mMaxItems;
100 super.updateMenuView(cleared);
101
102 if (needsMore && (mMoreView == null || mMoreView.getParent() != menuView)) {
103 if (mMoreView == null) {
104 mMoreView = menuView.createMoreItemView();
105 mMoreView.setBackgroundDrawable(menuView.getItemBackgroundDrawable());
106 }
107 menuView.addView(mMoreView);
108 } else if (!needsMore && mMoreView != null) {
109 menuView.removeView(mMoreView);
110 }
111
112 menuView.setNumActualItemsShown(needsMore ? mMaxItems - 1 : itemsToShow.size());
113 }
114
115 @Override
116 protected boolean filterLeftoverView(ViewGroup parent, int childIndex) {
117 if (parent.getChildAt(childIndex) != mMoreView) {
118 return super.filterLeftoverView(parent, childIndex);
119 }
120 return false;
121 }
122
123 public int getNumActualItemsShown() {
124 return ((IconMenuView) mMenuView).getNumActualItemsShown();
125 }
126
127 public void saveHierarchyState(Bundle outState) {
128 SparseArray<Parcelable> viewStates = new SparseArray<Parcelable>();
129 if (mMenuView != null) {
130 ((View) mMenuView).saveHierarchyState(viewStates);
131 }
132 outState.putSparseParcelableArray(VIEWS_TAG, viewStates);
133 }
134
135 public void restoreHierarchyState(Bundle inState) {
136 SparseArray<Parcelable> viewStates = inState.getSparseParcelableArray(VIEWS_TAG);
137 if (viewStates != null) {
138 ((View) mMenuView).restoreHierarchyState(viewStates);
139 }
140 }
141}