Source code
package android.support.v7.widget;
import android.content.Context;
import android.support.annotation.MenuRes;
import android.support.v7.appcompat.R;
import android.support.v7.internal.view.SupportMenuInflater;
import android.support.v7.internal.view.menu.MenuBuilder;
import android.support.v7.internal.view.menu.MenuBuilder.Callback;
import android.support.v7.internal.view.menu.MenuPopupHelper;
import android.support.v7.internal.view.menu.MenuPresenter;
import android.support.v7.internal.view.menu.SubMenuBuilder;
import android.support.v7.widget.ListPopupWindow.ForwardingListener;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnTouchListener;
public class PopupMenu implements Callback, MenuPresenter.Callback {
private View mAnchor;
private Context mContext;
private OnDismissListener mDismissListener;
private OnTouchListener mDragListener;
private MenuBuilder mMenu;
private OnMenuItemClickListener mMenuItemClickListener;
private MenuPopupHelper mPopup;
public interface OnDismissListener {
void onDismiss(PopupMenu popupMenu);
}
public interface OnMenuItemClickListener {
boolean onMenuItemClick(MenuItem menuItem);
}
public PopupMenu(Context context, View anchor) {
this(context, anchor, 0);
}
public PopupMenu(Context context, View anchor, int gravity) {
this(context, anchor, gravity, R.attr.popupMenuStyle, 0);
}
public PopupMenu(Context context, View anchor, int gravity, int popupStyleAttr, int popupStyleRes) {
this.mContext = context;
this.mMenu = new MenuBuilder(context);
this.mMenu.setCallback(this);
this.mAnchor = anchor;
this.mPopup = new MenuPopupHelper(context, this.mMenu, anchor, false, popupStyleAttr, popupStyleRes);
this.mPopup.setGravity(gravity);
this.mPopup.setCallback(this);
}
public void setGravity(int gravity) {
this.mPopup.setGravity(gravity);
}
public int getGravity() {
return this.mPopup.getGravity();
}
public OnTouchListener getDragToOpenListener() {
if (this.mDragListener == null) {
this.mDragListener = new ForwardingListener(this.mAnchor) {
protected boolean onForwardingStarted() {
PopupMenu.this.show();
return true;
}
protected boolean onForwardingStopped() {
PopupMenu.this.dismiss();
return true;
}
public ListPopupWindow getPopup() {
return PopupMenu.this.mPopup.getPopup();
}
};
}
return this.mDragListener;
}
public Menu getMenu() {
return this.mMenu;
}
public MenuInflater getMenuInflater() {
return new SupportMenuInflater(this.mContext);
}
public void inflate(@MenuRes int menuRes) {
getMenuInflater().inflate(menuRes, this.mMenu);
}
public void show() {
this.mPopup.show();
}
public void dismiss() {
this.mPopup.dismiss();
}
public void setOnMenuItemClickListener(OnMenuItemClickListener listener) {
this.mMenuItemClickListener = listener;
}
public void setOnDismissListener(OnDismissListener listener) {
this.mDismissListener = listener;
}
public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
if (this.mMenuItemClickListener != null) {
return this.mMenuItemClickListener.onMenuItemClick(item);
}
return false;
}
public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
if (this.mDismissListener != null) {
this.mDismissListener.onDismiss(this);
}
}
public boolean onOpenSubMenu(MenuBuilder subMenu) {
if (subMenu == null) {
return false;
}
if (!subMenu.hasVisibleItems()) {
return true;
}
new MenuPopupHelper(this.mContext, subMenu, this.mAnchor).show();
return true;
}
public void onCloseSubMenu(SubMenuBuilder menu) {
}
public void onMenuModeChange(MenuBuilder menu) {
}
}