1 /* 2 * Copyright (C) 2006 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 */ 16 17 package com.android.internal.view.menu; 18 19 import android.content.Context; 20 import android.content.res.TypedArray; 21 import android.graphics.drawable.Drawable; 22 import android.util.AttributeSet; 23 import android.view.LayoutInflater; 24 import android.view.View; 25 import android.widget.CheckBox; 26 import android.widget.CompoundButton; 27 import android.widget.ImageView; 28 import android.widget.LinearLayout; 29 import android.widget.RadioButton; 30 import android.widget.TextView; 31 32 /** 33 * The item view for each item in the ListView-based MenuViews. 34 */ 35 public class ListMenuItemView extends LinearLayout implements MenuView.ItemView { 36 private MenuItemImpl mItemData; 37 38 private ImageView mIconView; 39 private RadioButton mRadioButton; 40 private TextView mTitleView; 41 private CheckBox mCheckBox; 42 private TextView mShortcutView; 43 44 private Drawable mBackground; 45 private int mTextAppearance; 46 private Context mTextAppearanceContext; 47 48 private int mMenuType; 49 50 public ListMenuItemView(Context context, AttributeSet attrs, int defStyle) { 51 super(context, attrs); 52 53 TypedArray a = 54 context.obtainStyledAttributes( 55 attrs, com.android.internal.R.styleable.MenuView, defStyle, 0); 56 57 mBackground = a.getDrawable(com.android.internal.R.styleable.MenuView_itemBackground); 58 mTextAppearance = a.getResourceId(com.android.internal.R.styleable. 59 MenuView_itemTextAppearance, -1); 60 mTextAppearanceContext = context; 61 62 a.recycle(); 63 } 64 65 public ListMenuItemView(Context context, AttributeSet attrs) { 66 this(context, attrs, 0); 67 } 68 69 @Override 70 protected void onFinishInflate() { 71 super.onFinishInflate(); 72 73 setBackgroundDrawable(mBackground); 74 75 mTitleView = (TextView) findViewById(com.android.internal.R.id.title); 76 if (mTextAppearance != -1) { 77 mTitleView.setTextAppearance(mTextAppearanceContext, 78 mTextAppearance); 79 } 80 81 mShortcutView = (TextView) findViewById(com.android.internal.R.id.shortcut); 82 } 83 84 public void initialize(MenuItemImpl itemData, int menuType) { 85 mItemData = itemData; 86 mMenuType = menuType; 87 88 setVisibility(itemData.isVisible() ? View.VISIBLE : View.GONE); 89 90 setTitle(itemData.getTitleForItemView(this)); 91 setCheckable(itemData.isCheckable()); 92 setShortcut(itemData.shouldShowShortcut(), itemData.getShortcut()); 93 setIcon(itemData.getIcon()); 94 setEnabled(itemData.isEnabled()); 95 } 96 97 public void setTitle(CharSequence title) { 98 if (title != null) { 99 mTitleView.setText(title); 100 101 if (mTitleView.getVisibility() != VISIBLE) mTitleView.setVisibility(VISIBLE); 102 } else { 103 if (mTitleView.getVisibility() != GONE) mTitleView.setVisibility(GONE); 104 } 105 } 106 107 public MenuItemImpl getItemData() { 108 return mItemData; 109 } 110 111 public void setCheckable(boolean checkable) { 112 113 if (!checkable && mRadioButton == null && mCheckBox == null) { 114 return; 115 } 116 117 if (mRadioButton == null) { 118 insertRadioButton(); 119 } 120 if (mCheckBox == null) { 121 insertCheckBox(); 122 } 123 124 // Depending on whether its exclusive check or not, the checkbox or 125 // radio button will be the one in use (and the other will be otherCompoundButton) 126 final CompoundButton compoundButton; 127 final CompoundButton otherCompoundButton; 128 129 if (mItemData.isExclusiveCheckable()) { 130 compoundButton = mRadioButton; 131 otherCompoundButton = mCheckBox; 132 } else { 133 compoundButton = mCheckBox; 134 otherCompoundButton = mRadioButton; 135 } 136 137 if (checkable) { 138 compoundButton.setChecked(mItemData.isChecked()); 139 140 final int newVisibility = checkable ? VISIBLE : GONE; 141 if (compoundButton.getVisibility() != newVisibility) { 142 compoundButton.setVisibility(newVisibility); 143 } 144 145 // Make sure the other compound button isn't visible 146 if (otherCompoundButton.getVisibility() != GONE) { 147 otherCompoundButton.setVisibility(GONE); 148 } 149 } else { 150 mCheckBox.setVisibility(GONE); 151 mRadioButton.setVisibility(GONE); 152 } 153 } 154 155 public void setChecked(boolean checked) { 156 CompoundButton compoundButton; 157 158 if (mItemData.isExclusiveCheckable()) { 159 if (mRadioButton == null) { 160 insertRadioButton(); 161 } 162 compoundButton = mRadioButton; 163 } else { 164 if (mCheckBox == null) { 165 insertCheckBox(); 166 } 167 compoundButton = mCheckBox; 168 } 169 170 compoundButton.setChecked(checked); 171 } 172 173 public void setShortcut(boolean showShortcut, char shortcutKey) { 174 final int newVisibility = (showShortcut && mItemData.shouldShowShortcut()) 175 ? VISIBLE : GONE; 176 177 if (newVisibility == VISIBLE) { 178 mShortcutView.setText(mItemData.getShortcutLabel()); 179 } 180 181 if (mShortcutView.getVisibility() != newVisibility) { 182 mShortcutView.setVisibility(newVisibility); 183 } 184 } 185 186 public void setIcon(Drawable icon) { 187 188 if (!mItemData.shouldShowIcon(mMenuType)) { 189 return; 190 } 191 192 if (mIconView == null && icon == null) { 193 return; 194 } 195 196 if (mIconView == null) { 197 insertIconView(); 198 } 199 200 if (icon != null) { 201 mIconView.setImageDrawable(icon); 202 203 if (mIconView.getVisibility() != VISIBLE) { 204 mIconView.setVisibility(VISIBLE); 205 } 206 } else { 207 mIconView.setVisibility(GONE); 208 } 209 } 210 211 private void insertIconView() { 212 LayoutInflater inflater = mItemData.getLayoutInflater(mMenuType); 213 mIconView = (ImageView) inflater.inflate(com.android.internal.R.layout.list_menu_item_icon, 214 this, false); 215 addView(mIconView, 0); 216 } 217 218 private void insertRadioButton() { 219 LayoutInflater inflater = mItemData.getLayoutInflater(mMenuType); 220 mRadioButton = 221 (RadioButton) inflater.inflate(com.android.internal.R.layout.list_menu_item_radio, 222 this, false); 223 addView(mRadioButton); 224 } 225 226 private void insertCheckBox() { 227 LayoutInflater inflater = mItemData.getLayoutInflater(mMenuType); 228 mCheckBox = 229 (CheckBox) inflater.inflate(com.android.internal.R.layout.list_menu_item_checkbox, 230 this, false); 231 addView(mCheckBox); 232 } 233 234 public boolean prefersCondensedTitle() { 235 return false; 236 } 237 238 public boolean showsIcon() { 239 return false; 240 } 241 242 } 243