michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: package org.mozilla.gecko.menu; michael@0: michael@0: import org.mozilla.gecko.R; michael@0: import org.mozilla.gecko.widget.GeckoActionProvider; michael@0: michael@0: import android.content.Intent; michael@0: import android.graphics.drawable.Drawable; michael@0: import android.os.Build; michael@0: import android.view.ActionProvider; michael@0: import android.view.ContextMenu; michael@0: import android.view.MenuItem; michael@0: import android.view.SubMenu; michael@0: import android.view.View; michael@0: michael@0: public class GeckoMenuItem implements MenuItem { michael@0: private static final String LOGTAG = "GeckoMenuItem"; michael@0: michael@0: public static final int SHOW_AS_ACTION_NEVER = 0; michael@0: public static final int SHOW_AS_ACTION_IF_ROOM = 1; michael@0: public static final int SHOW_AS_ACTION_ALWAYS = 2; michael@0: michael@0: // A View that can show a MenuItem should be able to initialize from michael@0: // the properties of the MenuItem. michael@0: public static interface Layout { michael@0: public void initialize(GeckoMenuItem item); michael@0: public void setShowIcon(boolean show); michael@0: } michael@0: michael@0: public static interface OnShowAsActionChangedListener { michael@0: public boolean hasActionItemBar(); michael@0: public void onShowAsActionChanged(GeckoMenuItem item); michael@0: } michael@0: michael@0: private int mId; michael@0: private int mOrder; michael@0: private View mActionView; michael@0: private int mActionEnum; michael@0: private CharSequence mTitle; michael@0: private CharSequence mTitleCondensed; michael@0: private boolean mCheckable = false; michael@0: private boolean mChecked = false; michael@0: private boolean mVisible = true; michael@0: private boolean mEnabled = true; michael@0: private Drawable mIcon; michael@0: private int mIconRes; michael@0: private GeckoActionProvider mActionProvider; michael@0: private GeckoMenu mMenu; michael@0: private GeckoSubMenu mSubMenu; michael@0: private MenuItem.OnMenuItemClickListener mMenuItemClickListener = null; michael@0: private OnShowAsActionChangedListener mShowAsActionChangedListener; michael@0: michael@0: public GeckoMenuItem(GeckoMenu menu, int id, int order, int titleRes) { michael@0: mMenu = menu; michael@0: mId = id; michael@0: mOrder = order; michael@0: setTitle(titleRes); michael@0: } michael@0: michael@0: public GeckoMenuItem(GeckoMenu menu, int id, int order, CharSequence title) { michael@0: mMenu = menu; michael@0: mId = id; michael@0: mOrder = order; michael@0: setTitle(title); michael@0: } michael@0: michael@0: @Override michael@0: public boolean collapseActionView() { michael@0: return false; michael@0: } michael@0: michael@0: @Override michael@0: public boolean expandActionView() { michael@0: return false; michael@0: } michael@0: michael@0: public boolean hasActionProvider() { michael@0: if (Build.VERSION.SDK_INT < 14) { michael@0: return false; michael@0: } michael@0: michael@0: return (mActionProvider != null); michael@0: } michael@0: michael@0: public int getActionEnum() { michael@0: return mActionEnum; michael@0: } michael@0: michael@0: public GeckoActionProvider getGeckoActionProvider() { michael@0: return mActionProvider; michael@0: } michael@0: michael@0: @Override michael@0: public ActionProvider getActionProvider() { michael@0: return null; michael@0: } michael@0: michael@0: @Override michael@0: public View getActionView() { michael@0: if (mActionProvider != null) { michael@0: return mActionProvider.getView(); michael@0: } michael@0: michael@0: return mActionView; michael@0: } michael@0: michael@0: @Override michael@0: public char getAlphabeticShortcut() { michael@0: return 0; michael@0: } michael@0: michael@0: @Override michael@0: public int getGroupId() { michael@0: return 0; michael@0: } michael@0: michael@0: @Override michael@0: public Drawable getIcon() { michael@0: if (mIcon == null) { michael@0: if (mIconRes != 0) michael@0: return mMenu.getResources().getDrawable(mIconRes); michael@0: else michael@0: return null; michael@0: } else { michael@0: return mIcon; michael@0: } michael@0: } michael@0: michael@0: @Override michael@0: public Intent getIntent() { michael@0: return null; michael@0: } michael@0: michael@0: @Override michael@0: public int getItemId() { michael@0: return mId; michael@0: } michael@0: michael@0: @Override michael@0: public ContextMenu.ContextMenuInfo getMenuInfo() { michael@0: return null; michael@0: } michael@0: michael@0: @Override michael@0: public char getNumericShortcut() { michael@0: return 0; michael@0: } michael@0: michael@0: @Override michael@0: public int getOrder() { michael@0: return mOrder; michael@0: } michael@0: michael@0: @Override michael@0: public SubMenu getSubMenu() { michael@0: return mSubMenu; michael@0: } michael@0: michael@0: @Override michael@0: public CharSequence getTitle() { michael@0: return mTitle; michael@0: } michael@0: michael@0: @Override michael@0: public CharSequence getTitleCondensed() { michael@0: return mTitleCondensed; michael@0: } michael@0: michael@0: @Override michael@0: public boolean hasSubMenu() { michael@0: if (mActionProvider != null) michael@0: return mActionProvider.hasSubMenu(); michael@0: michael@0: return (mSubMenu != null); michael@0: } michael@0: michael@0: public boolean isActionItem() { michael@0: return (mActionEnum > 0); michael@0: } michael@0: michael@0: @Override michael@0: public boolean isActionViewExpanded() { michael@0: return false; michael@0: } michael@0: michael@0: @Override michael@0: public boolean isCheckable() { michael@0: return mCheckable; michael@0: } michael@0: michael@0: @Override michael@0: public boolean isChecked() { michael@0: return mChecked; michael@0: } michael@0: michael@0: @Override michael@0: public boolean isEnabled() { michael@0: return mEnabled; michael@0: } michael@0: michael@0: @Override michael@0: public boolean isVisible() { michael@0: return mVisible; michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setActionProvider(ActionProvider actionProvider) { michael@0: return this; michael@0: } michael@0: michael@0: public MenuItem setActionProvider(GeckoActionProvider actionProvider) { michael@0: mActionProvider = actionProvider; michael@0: if (mActionProvider != null) { michael@0: actionProvider.setOnTargetSelectedListener(new GeckoActionProvider.OnTargetSelectedListener() { michael@0: @Override michael@0: public void onTargetSelected() { michael@0: mMenu.close(); michael@0: michael@0: // Refresh the menu item to show the high frequency apps. michael@0: mShowAsActionChangedListener.onShowAsActionChanged(GeckoMenuItem.this); michael@0: } michael@0: }); michael@0: } michael@0: michael@0: mShowAsActionChangedListener.onShowAsActionChanged(this); michael@0: return this; michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setActionView(int resId) { michael@0: return this; michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setActionView(View view) { michael@0: return this; michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setAlphabeticShortcut(char alphaChar) { michael@0: return this; michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setCheckable(boolean checkable) { michael@0: mCheckable = checkable; michael@0: mMenu.onItemChanged(this); michael@0: return this; michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setChecked(boolean checked) { michael@0: mChecked = checked; michael@0: mMenu.onItemChanged(this); michael@0: return this; michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setEnabled(boolean enabled) { michael@0: mEnabled = enabled; michael@0: mMenu.onItemChanged(this); michael@0: return this; michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setIcon(Drawable icon) { michael@0: mIcon = icon; michael@0: mMenu.onItemChanged(this); michael@0: return this; michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setIcon(int iconRes) { michael@0: mIconRes = iconRes; michael@0: mMenu.onItemChanged(this); michael@0: return this; michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setIntent(Intent intent) { michael@0: return this; michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setNumericShortcut(char numericChar) { michael@0: return this; michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setOnActionExpandListener(MenuItem.OnActionExpandListener listener) { michael@0: return this; michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener menuItemClickListener) { michael@0: mMenuItemClickListener = menuItemClickListener; michael@0: return this; michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setShortcut(char numericChar, char alphaChar) { michael@0: return this; michael@0: } michael@0: michael@0: @Override michael@0: public void setShowAsAction(int actionEnum) { michael@0: setShowAsAction(actionEnum, 0); michael@0: } michael@0: michael@0: public void setShowAsAction(int actionEnum, int style) { michael@0: if (mShowAsActionChangedListener == null) michael@0: return; michael@0: michael@0: if (mActionEnum == actionEnum) michael@0: return; michael@0: michael@0: if (actionEnum > 0) { michael@0: if (!mShowAsActionChangedListener.hasActionItemBar()) michael@0: return; michael@0: michael@0: if (!hasActionProvider()) { michael@0: // Change the type to just an icon michael@0: MenuItemActionBar actionView; michael@0: if (style != 0) { michael@0: actionView = new MenuItemActionBar(mMenu.getContext(), null, style); michael@0: } else { michael@0: if (actionEnum == SHOW_AS_ACTION_ALWAYS) { michael@0: actionView = new MenuItemActionBar(mMenu.getContext()); michael@0: } else { michael@0: actionView = new MenuItemActionBar(mMenu.getContext(), null, R.attr.menuItemSecondaryActionBarStyle); michael@0: } michael@0: } michael@0: michael@0: actionView.initialize(this); michael@0: mActionView = actionView; michael@0: } michael@0: michael@0: mActionEnum = actionEnum; michael@0: } michael@0: michael@0: mShowAsActionChangedListener.onShowAsActionChanged(this); michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setShowAsActionFlags(int actionEnum) { michael@0: return this; michael@0: } michael@0: michael@0: public MenuItem setSubMenu(GeckoSubMenu subMenu) { michael@0: mSubMenu = subMenu; michael@0: return this; michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setTitle(CharSequence title) { michael@0: mTitle = title; michael@0: mMenu.onItemChanged(this); michael@0: return this; michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setTitle(int title) { michael@0: mTitle = mMenu.getResources().getString(title); michael@0: mMenu.onItemChanged(this); michael@0: return this; michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setTitleCondensed(CharSequence title) { michael@0: mTitleCondensed = title; michael@0: return this; michael@0: } michael@0: michael@0: @Override michael@0: public MenuItem setVisible(boolean visible) { michael@0: mVisible = visible; michael@0: mMenu.onItemChanged(this); michael@0: return this; michael@0: } michael@0: michael@0: public boolean invoke() { michael@0: if (mMenuItemClickListener != null) michael@0: return mMenuItemClickListener.onMenuItemClick(this); michael@0: else michael@0: return false; michael@0: } michael@0: michael@0: public void setOnShowAsActionChangedListener(OnShowAsActionChangedListener listener) { michael@0: mShowAsActionChangedListener = listener; michael@0: } michael@0: }