summaryrefslogtreecommitdiffstats
path: root/mobile/android/base/java/org/mozilla/gecko/menu/MenuItemDefault.java
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/base/java/org/mozilla/gecko/menu/MenuItemDefault.java')
-rw-r--r--mobile/android/base/java/org/mozilla/gecko/menu/MenuItemDefault.java152
1 files changed, 152 insertions, 0 deletions
diff --git a/mobile/android/base/java/org/mozilla/gecko/menu/MenuItemDefault.java b/mobile/android/base/java/org/mozilla/gecko/menu/MenuItemDefault.java
new file mode 100644
index 000000000..5b5069334
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/menu/MenuItemDefault.java
@@ -0,0 +1,152 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.menu;
+
+import org.mozilla.gecko.R;
+import org.mozilla.gecko.util.ResourceDrawableUtils;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+public class MenuItemDefault extends TextView
+ implements GeckoMenuItem.Layout {
+ private static final int[] STATE_MORE = new int[] { R.attr.state_more };
+ private static final int[] STATE_CHECKED = new int[] { android.R.attr.state_checkable, android.R.attr.state_checked };
+ private static final int[] STATE_UNCHECKED = new int[] { android.R.attr.state_checkable };
+
+ private Drawable mIcon;
+ private final Drawable mState;
+ private static Rect sIconBounds;
+
+ private boolean mCheckable;
+ private boolean mChecked;
+ private boolean mHasSubMenu;
+ private boolean mShowIcon;
+
+ public MenuItemDefault(Context context) {
+ this(context, null);
+ }
+
+ public MenuItemDefault(Context context, AttributeSet attrs) {
+ this(context, attrs, R.attr.menuItemDefaultStyle);
+ }
+
+ public MenuItemDefault(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+
+ Resources res = getResources();
+ int width = res.getDimensionPixelSize(R.dimen.menu_item_row_width);
+ int height = res.getDimensionPixelSize(R.dimen.menu_item_row_height);
+ setMinimumWidth(width);
+ setMinimumHeight(height);
+
+ int stateIconSize = res.getDimensionPixelSize(R.dimen.menu_item_state_icon);
+ Rect stateIconBounds = new Rect(0, 0, stateIconSize, stateIconSize);
+
+ mState = res.getDrawable(R.drawable.menu_item_state).mutate();
+ mState.setBounds(stateIconBounds);
+
+ if (sIconBounds == null) {
+ int iconSize = res.getDimensionPixelSize(R.dimen.menu_item_icon);
+ sIconBounds = new Rect(0, 0, iconSize, iconSize);
+ }
+
+ setCompoundDrawables(mIcon, null, mState, null);
+ }
+
+ @Override
+ public int[] onCreateDrawableState(int extraSpace) {
+ final int[] drawableState = super.onCreateDrawableState(extraSpace + 2);
+
+ if (mHasSubMenu)
+ mergeDrawableStates(drawableState, STATE_MORE);
+ else if (mCheckable && mChecked)
+ mergeDrawableStates(drawableState, STATE_CHECKED);
+ else if (mCheckable && !mChecked)
+ mergeDrawableStates(drawableState, STATE_UNCHECKED);
+
+ return drawableState;
+ }
+
+ @Override
+ public void initialize(GeckoMenuItem item) {
+ if (item == null)
+ return;
+
+ setTitle(item.getTitle());
+ setIcon(item.getIcon());
+ setEnabled(item.isEnabled());
+ setCheckable(item.isCheckable());
+ setChecked(item.isChecked());
+ setSubMenuIndicator(item.hasSubMenu());
+ }
+
+ private void refreshIcon() {
+ setCompoundDrawables(mShowIcon ? mIcon : null, null, mState, null);
+ }
+
+ void setIcon(Drawable icon) {
+ mIcon = icon;
+
+ if (mIcon != null) {
+ mIcon.setBounds(sIconBounds);
+ mIcon.setAlpha(isEnabled() ? 255 : 99);
+ }
+
+ refreshIcon();
+ }
+
+ void setIcon(int icon) {
+ setIcon((icon == 0) ? null : ResourceDrawableUtils.getDrawable(getContext(), icon));
+ }
+
+ void setTitle(CharSequence title) {
+ setText(title);
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ super.setEnabled(enabled);
+
+ if (mIcon != null)
+ mIcon.setAlpha(enabled ? 255 : 99);
+
+ if (mState != null)
+ mState.setAlpha(enabled ? 255 : 99);
+ }
+
+ private void setCheckable(boolean checkable) {
+ if (mCheckable != checkable) {
+ mCheckable = checkable;
+ refreshDrawableState();
+ }
+ }
+
+ private void setChecked(boolean checked) {
+ if (mChecked != checked) {
+ mChecked = checked;
+ refreshDrawableState();
+ }
+ }
+
+ @Override
+ public void setShowIcon(boolean show) {
+ if (mShowIcon != show) {
+ mShowIcon = show;
+ refreshIcon();
+ }
+ }
+
+ void setSubMenuIndicator(boolean hasSubMenu) {
+ if (mHasSubMenu != hasSubMenu) {
+ mHasSubMenu = hasSubMenu;
+ refreshDrawableState();
+ }
+ }
+}