package com.actionbarsherlock.internal.view.menu;
import org.holoeverywhere.app.Application;
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 is null",
new NullPointerException());
}
this.listener = listener;
if (Application.isDebugMode()) {
Log.v(TAG, "Create new InternalWrapper with listener: "
+ listener);
}
}
@Override
public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
if (Application.isDebugMode()) {
Log.v(TAG, "Calling onContextMenuClosed on " + listener);
}
listener.onContextMenuClosed((ContextMenu) menu);
}
@Override
public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
if (Application.isDebugMode()) {
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 && !Application.config().isDisableContextMenu()) {
v = new ContextMenuDecorView(context, v, listener);
if (decorViewId > 0) {
v.setId(decorViewId);
}
}
return v;
}
private ContextMenuBuilder contextMenu;
private final InternalWrapper listener;
private MenuDialogHelper menuDialogHelper;
private final View view;
public ContextMenuDecorView(Context context, View view,
ContextMenuListener listener) {
super(context);
this.listener = new InternalWrapper(listener);
if (view != null) {
ViewParent parent = view.getParent();
if (parent != null && parent instanceof ViewGroup) {
((ViewGroup) parent).removeView(view);
}
addView(view, android.view.ViewGroup.LayoutParams.MATCH_PARENT,
android.view.ViewGroup.LayoutParams.MATCH_PARENT);
}
this.view = view;
}
@Override
public boolean showContextMenuForChild(View originalView) {
if (Application.config().isDisableContextMenu()) {
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 view;
}
}