diff options
Diffstat (limited to 'android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/HoloListMenuItemView.java')
-rw-r--r-- | android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/HoloListMenuItemView.java | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/HoloListMenuItemView.java b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/HoloListMenuItemView.java new file mode 100644 index 0000000000..2fa871e719 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/com/actionbarsherlock/internal/view/menu/HoloListMenuItemView.java @@ -0,0 +1,259 @@ + +package com.actionbarsherlock.internal.view.menu; + +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.R; +import org.holoeverywhere.widget.LinearLayout; +import org.holoeverywhere.widget.TextView; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.ImageView; +import android.widget.RadioButton; + +public class HoloListMenuItemView extends LinearLayout implements + MenuView.ItemView { + private Drawable mBackground; + private CheckBox mCheckBox; + private boolean mForceShowIcon; + private ImageView mIconView; + private LayoutInflater mInflater; + private MenuItemImpl mItemData; + private boolean mPreserveIconSpacing; + private RadioButton mRadioButton; + private TextView mShortcutView; + private int mTextAppearance; + private Context mTextAppearanceContext; + private TextView mTitleView; + + public HoloListMenuItemView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public HoloListMenuItemView(Context context, AttributeSet attrs, + int defStyle) { + super(context, attrs); + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.MenuView, defStyle, 0); + mBackground = a.getDrawable(R.styleable.MenuView_dialogItemBackground); + mTextAppearance = a.getResourceId( + R.styleable.MenuView_dialogItemTextAppearance, -1); + mPreserveIconSpacing = a.getBoolean( + R.styleable.MenuView_android_preserveIconSpacing, false); + mTextAppearanceContext = context; + a.recycle(); + } + + private LayoutInflater getInflater() { + if (mInflater == null) { + mInflater = LayoutInflater.from(getContext()); + } + return mInflater; + } + + @Override + public MenuItemImpl getItemData() { + return mItemData; + } + + @Override + public void initialize(MenuItemImpl itemData, int menuType) { + mItemData = itemData; + setVisibility(itemData.isVisible() ? View.VISIBLE : View.GONE); + setTitle(itemData.getTitleForItemView(this)); + setCheckable(itemData.isCheckable()); + setShortcut(itemData.shouldShowShortcut(), itemData.getShortcut()); + setIcon(itemData.getIcon()); + setEnabled(itemData.isEnabled()); + } + + private void insertCheckBox() { + LayoutInflater inflater = getInflater(); + mCheckBox = (CheckBox) inflater.inflate( + R.layout.list_menu_item_checkbox, this, false); + addView(mCheckBox); + } + + private void insertIconView() { + LayoutInflater inflater = getInflater(); + mIconView = (ImageView) inflater.inflate(R.layout.list_menu_item_icon, + this, false); + addView(mIconView, 0); + } + + private void insertRadioButton() { + LayoutInflater inflater = getInflater(); + mRadioButton = (RadioButton) inflater.inflate( + R.layout.list_menu_item_radio, this, false); + addView(mRadioButton); + } + + @SuppressWarnings("deprecation") + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + setBackgroundDrawable(mBackground); + mTitleView = (TextView) findViewById(R.id.title); + if (mTextAppearance != -1) { + mTitleView.setTextAppearance(mTextAppearanceContext, + mTextAppearance); + } + mShortcutView = (TextView) findViewById(R.id.shortcut); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (mIconView != null && mPreserveIconSpacing) { + // Enforce minimum icon spacing + ViewGroup.LayoutParams lp = getLayoutParams(); + LayoutParams iconLp = (LayoutParams) mIconView.getLayoutParams(); + if (lp.height > 0 && iconLp.width <= 0) { + iconLp.width = lp.height; + } + } + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + @Override + public boolean prefersCondensedTitle() { + return false; + } + + @Override + public void setCheckable(boolean checkable) { + if (!checkable && mRadioButton == null && mCheckBox == null) { + return; + } + + // Depending on whether its exclusive check or not, the checkbox or + // radio button will be the one in use (and the other will be + // otherCompoundButton) + final CompoundButton compoundButton; + final CompoundButton otherCompoundButton; + + if (mItemData.isExclusiveCheckable()) { + if (mRadioButton == null) { + insertRadioButton(); + } + compoundButton = mRadioButton; + otherCompoundButton = mCheckBox; + } else { + if (mCheckBox == null) { + insertCheckBox(); + } + compoundButton = mCheckBox; + otherCompoundButton = mRadioButton; + } + + if (checkable) { + compoundButton.setChecked(mItemData.isChecked()); + + final int newVisibility = checkable ? View.VISIBLE : View.GONE; + if (compoundButton.getVisibility() != newVisibility) { + compoundButton.setVisibility(newVisibility); + } + + // Make sure the other compound button isn't visible + if (otherCompoundButton != null + && otherCompoundButton.getVisibility() != View.GONE) { + otherCompoundButton.setVisibility(View.GONE); + } + } else { + if (mCheckBox != null) { + mCheckBox.setVisibility(View.GONE); + } + if (mRadioButton != null) { + mRadioButton.setVisibility(View.GONE); + } + } + } + + @Override + public void setChecked(boolean checked) { + CompoundButton compoundButton; + + if (mItemData.isExclusiveCheckable()) { + if (mRadioButton == null) { + insertRadioButton(); + } + compoundButton = mRadioButton; + } else { + if (mCheckBox == null) { + insertCheckBox(); + } + compoundButton = mCheckBox; + } + + compoundButton.setChecked(checked); + } + + public void setForceShowIcon(boolean forceShow) { + mPreserveIconSpacing = mForceShowIcon = forceShow; + } + + @Override + public void setIcon(Drawable icon) { + final boolean showIcon = mItemData.shouldShowIcon() || mForceShowIcon; + if (!showIcon && !mPreserveIconSpacing) { + return; + } + + if (mIconView == null && icon == null && !mPreserveIconSpacing) { + return; + } + + if (mIconView == null) { + insertIconView(); + } + + if (icon != null || mPreserveIconSpacing) { + mIconView.setImageDrawable(showIcon ? icon : null); + + if (mIconView.getVisibility() != View.VISIBLE) { + mIconView.setVisibility(View.VISIBLE); + } + } else { + mIconView.setVisibility(View.GONE); + } + } + + @Override + public void setShortcut(boolean showShortcut, char shortcutKey) { + final int newVisibility = showShortcut + && mItemData.shouldShowShortcut() ? View.VISIBLE : View.GONE; + + if (newVisibility == View.VISIBLE) { + mShortcutView.setText(mItemData.getShortcutLabel()); + } + + if (mShortcutView.getVisibility() != newVisibility) { + mShortcutView.setVisibility(newVisibility); + } + } + + @Override + public void setTitle(CharSequence title) { + if (title != null) { + mTitleView.setText(title); + + if (mTitleView.getVisibility() != View.VISIBLE) { + mTitleView.setVisibility(View.VISIBLE); + } + } else { + if (mTitleView.getVisibility() != View.GONE) { + mTitleView.setVisibility(View.GONE); + } + } + } + + @Override + public boolean showsIcon() { + return mForceShowIcon; + } +} |