package org.holoeverywhere.app;
import android.content.Context;
import android.content.res.TypedArray;
import android.support.v7.internal.view.menu.ContextMenuDecorView.ContextMenuListenersProvider;
import android.support.v7.internal.view.menu.ContextMenuListener;
import android.text.Layout;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.ContextMenu;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import org.holoeverywhere.LayoutInflater;
import org.holoeverywhere.R;
import org.holoeverywhere.widget.WindowDecorView;
import org.holoeverywhere.util.WeaklyMap;
import org.holoeverywhere.widget.TextView;
import java.util.Map;
public class Dialog extends android.app.Dialog implements ContextMenuListener,
ContextMenuListenersProvider {
private Map<View, ContextMenuListener> mContextMenuListeners;
private WindowDecorView mDecorView;
public Dialog(Context context) {
this(context, 0);
}
public Dialog(Context context, boolean cancelable,
OnCancelListener cancelListener) {
this(context);
setCancelable(cancelable);
setOnCancelListener(cancelListener);
}
public Dialog(Context context, int theme) {
this(context, checkTheme(context, theme), -1);
setCancelable(true);
}
private Dialog(Context context, int theme, int fallback) {
super(new ContextThemeWrapperPlus(context, theme), theme);
}
private static final int checkTheme(Context context, int theme) {
if (theme >= 0x01000000) {
return theme;
}
TypedValue value = new TypedValue();
context.getTheme().resolveAttribute(R.attr.dialogTheme, value, true);
if (value.resourceId > 0) {
return value.resourceId;
}
return R.style.Holo_Theme_Dialog;
}
@Override
public void onContextMenuClosed(ContextMenu menu) {
}
@Override
public void addContentView(View view, LayoutParams params) {
if (requestDecorView(view, params, -1)) {
mDecorView.addView(view, params);
}
}
@Override
public ContextMenuListener getContextMenuListener(View view) {
if (mContextMenuListeners == null) {
return null;
}
return mContextMenuListeners.get(view);
}
@Override
public LayoutInflater getLayoutInflater() {
return LayoutInflater.from(getContext());
}
@Override
public void registerForContextMenu(View view) {
registerForContextMenu(view, this);
}
public void registerForContextMenu(View view, ContextMenuListener listener) {
if (mContextMenuListeners == null) {
mContextMenuListeners = new WeaklyMap<View, ContextMenuListener>();
}
mContextMenuListeners.put(view, listener);
view.setLongClickable(true);
}
private boolean requestDecorView(View view, LayoutParams params, int layoutRes) {
if (mDecorView != null) {
return true;
}
mDecorView = new WindowDecorView(getContext());
mDecorView.setId(android.R.id.content);
mDecorView.setProvider(this);
if (view != null) {
mDecorView.addView(view, params);
} else if (layoutRes > 0) {
getLayoutInflater().inflate(layoutRes, mDecorView, true);
}
getWindow().setContentView(mDecorView, new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
return false;
}
@Override
public void setCancelable(boolean flag) {
super.setCancelable(flag);
setCanceledOnTouchOutside(flag);
}
@Override
public void setContentView(int layoutResID) {
if (requestDecorView(null, null, layoutResID)) {
mDecorView.removeAllViewsInLayout();
getLayoutInflater().inflate(layoutResID, mDecorView, true);
}
}
@Override
public void setContentView(View view) {
setContentView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
}
@Override
public void setContentView(View view, LayoutParams params) {
if (requestDecorView(view, params, -1)) {
mDecorView.removeAllViewsInLayout();
mDecorView.addView(view, params);
}
}
@Override
public void unregisterForContextMenu(View view) {
if (mContextMenuListeners != null) {
mContextMenuListeners.remove(view);
}
view.setLongClickable(false);
}
public static class DialogTitle extends TextView {
public DialogTitle(Context context) {
super(context);
}
public DialogTitle(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DialogTitle(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
final Layout layout = getLayout();
if (layout != null) {
final int lineCount = layout.getLineCount();
if (lineCount > 0) {
final int ellipsisCount = layout
.getEllipsisCount(lineCount - 1);
if (ellipsisCount > 0) {
setSingleLine(false);
setMaxLines(2);
final TypedArray a = getContext().obtainStyledAttributes(
null, R.styleable.TextAppearance,
android.R.attr.textAppearanceMedium,
R.style.Holo_TextAppearance_Medium);
final int textSize = a.getDimensionPixelSize(
R.styleable.TextAppearance_android_textSize, 0);
if (textSize != 0) {
setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
}
a.recycle();
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
}
}
}
}