IconMenuPresenter.java revision 696cba573e651b0e4f18a4718627c8ccecb3bda0
1/* 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} 142