package com.actionbarsherlock.internal.view.menu; import org.holoeverywhere.HoloEverywhere; import org.holoeverywhere.widget.FrameLayout; import android.content.Context; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewDebug.ExportedProperty; import android.view.ViewGroup; import android.view.ViewParent; import com.actionbarsherlock.view.ContextMenu; import com.actionbarsherlock.view.MenuItem; public class ContextMenuDecorView extends FrameLayout implements MenuPresenter.Callback, MenuBuilder.Callback { public interface ContextMenuListenersProvider { public ContextMenuListener getContextMenuListener(View view); } private ContextMenuBuilder mContextMenu; private ContextMenuListener mListener; private MenuDialogHelper mMenuDialogHelper; private ContextMenuListenersProvider mProvider; private final String TAG = getClass().getSimpleName(); public ContextMenuDecorView(Context context) { super(context); } public ContextMenuDecorView(Context context, View view, ViewGroup.LayoutParams params) { this(context); if (view != null) { attachView(view, params); } } public synchronized void attachView(View view, ViewGroup.LayoutParams params) { if (view == null) { throw new NullPointerException("View cannot be null"); } ViewParent parent = view.getParent(); if (parent != null && parent instanceof ViewGroup) { ((ViewGroup) parent).removeView(view); } removeAllViews(); if (params == null) { params = view.getLayoutParams(); } if (params == null) { params = new FrameLayout.LayoutParams(android.view.ViewGroup.LayoutParams.MATCH_PARENT, android.view.ViewGroup.LayoutParams.MATCH_PARENT); } addView(view, params); } @Override @ExportedProperty(deepExport = true, prefix = "layout_") public ViewGroup.LayoutParams getLayoutParams() { if (getChildCount() == 0) { return super.getLayoutParams(); } final View child = unwrap(); ViewGroup.LayoutParams params = super.getLayoutParams(); if (params == null) { params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); setLayoutParams(params); } ViewGroup.LayoutParams childParams = child.getLayoutParams(); if (childParams == null) { child.setLayoutParams(params); return params; } if (params.width != childParams.width) { params.width = childParams.width; } if (params.height != childParams.height) { params.height = childParams.height; } return params; } @Override public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { if (mListener == null) { return; } if (HoloEverywhere.DEBUG) { Log.v(TAG, "Calling onContextMenuClosed on " + mListener); } mListener.onContextMenuClosed((ContextMenu) menu); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return false; } @Override public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { if (mListener == null) { return false; } if (HoloEverywhere.DEBUG) { Log.v(TAG, "Calling onContextItemSelected on " + mListener); } if (menu instanceof ContextMenuBuilder && item instanceof MenuItemImpl) { ((MenuItemImpl) item).setMenuInfo(((ContextMenuBuilder) menu) .getContextMenuInfo()); } return mListener.onContextItemSelected(item); } @Override public void onMenuModeChange(MenuBuilder menu) { } @Override public boolean onOpenSubMenu(MenuBuilder subMenu) { return false; } @Override public boolean onTouchEvent(MotionEvent event) { return false; } public void setProvider(ContextMenuListenersProvider provider) { mProvider = provider; } @Override public boolean showContextMenuForChild(View originalView) { if (HoloEverywhere.WRAP_TO_NATIVE_CONTEXT_MENU) { return super.showContextMenuForChild(originalView); } mListener = mProvider.getContextMenuListener(originalView); if (mListener == null) { return false; } if (mContextMenu == null) { mContextMenu = new ContextMenuBuilder(getContext(), mListener); mContextMenu.setCallback(this); } else { mContextMenu.clearAll(); mContextMenu.setContextMenuListener(mListener); } mMenuDialogHelper = mContextMenu.show(originalView, originalView.getWindowToken()); if (mMenuDialogHelper != null) { mMenuDialogHelper.setPresenterCallback(this); return true; } else { return false; } } public View unwrap() { return getChildCount() > 0 ? getChildAt(0) : null; } }