package com.actionbarsherlock.internal.view.menu; import org.holoeverywhere.HoloEverywhere; import android.content.Context; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; import android.widget.FrameLayout; import com.actionbarsherlock.view.ContextMenu; import com.actionbarsherlock.view.MenuItem; public final class ContextMenuDecorView extends FrameLayout { private static final class InternalWrapper implements MenuPresenter.Callback, MenuBuilder.Callback { private final ContextMenuListener listener; private final String TAG = getClass().getSimpleName(); public InternalWrapper(ContextMenuListener listener) { if (listener == null) { throw new IllegalArgumentException("Listener cannot be null"); } this.listener = listener; } @Override public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { if (HoloEverywhere.DEBUG) { Log.v(TAG, "Calling onContextMenuClosed on " + listener); } listener.onContextMenuClosed((ContextMenu) menu); } @Override public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { if (HoloEverywhere.DEBUG) { Log.v(TAG, "Calling onContextItemSelected on " + listener); } if (menu instanceof ContextMenuBuilder && item instanceof MenuItemImpl) { ((MenuItemImpl) item).setMenuInfo(((ContextMenuBuilder) menu) .getContextMenuInfo()); } return listener.onContextItemSelected(item); } @Override public void onMenuModeChange(MenuBuilder menu) { } @Override public boolean onOpenSubMenu(MenuBuilder subMenu) { return false; } public ContextMenuListener unwrap() { return listener; } } public static View prepareDecorView(Context context, View v, ContextMenuListener listener, int decorViewId) { if (v != null) { v = new ContextMenuDecorView(context, v, listener); if (decorViewId > 0) { v.setId(decorViewId); } } return v; } private ContextMenuBuilder contextMenu; private final InternalWrapper listener; private MenuDialogHelper menuDialogHelper; public ContextMenuDecorView(Context context, ContextMenuListener listener) { super(context); this.listener = new InternalWrapper(listener); } public ContextMenuDecorView(Context context, View view, ContextMenuListener listener) { this(context, listener); attachView(view); } @Override public void addView(View child) { LayoutParams params = (LayoutParams) child.getLayoutParams(); if (params == null) { params = generateDefaultLayoutParams(); } params.height = android.view.ViewGroup.LayoutParams.MATCH_PARENT; params.width = android.view.ViewGroup.LayoutParams.MATCH_PARENT; addView(child, params); } public synchronized void attachView(View view) { 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(); addView(view, android.view.ViewGroup.LayoutParams.MATCH_PARENT, android.view.ViewGroup.LayoutParams.MATCH_PARENT); } @Override public boolean showContextMenuForChild(View originalView) { if (HoloEverywhere.WRAP_TO_NATIVE_CONTEXT_MENU) { return super.showContextMenuForChild(originalView); } if (contextMenu == null) { contextMenu = new ContextMenuBuilder(getContext(), listener.unwrap()); contextMenu.setCallback(listener); } else { contextMenu.clearAll(); } final MenuDialogHelper helper = contextMenu.show(originalView, originalView.getWindowToken()); if (helper != null) { helper.setPresenterCallback(listener); } menuDialogHelper = helper; return menuDialogHelper != null; } public View unwrap() { return getChildCount() > 0 ? getChildAt(0) : null; } }