Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ListPopupWindow.java')
-rw-r--r--android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ListPopupWindow.java858
1 files changed, 858 insertions, 0 deletions
diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ListPopupWindow.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ListPopupWindow.java
new file mode 100644
index 0000000000..de3f287e62
--- /dev/null
+++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/ListPopupWindow.java
@@ -0,0 +1,858 @@
+
+package org.holoeverywhere.widget;
+
+import org.holoeverywhere.R;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.res.Resources;
+import android.database.DataSetObserver;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Build.VERSION;
+import android.os.Handler;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.View.MeasureSpec;
+import android.view.View.OnTouchListener;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.widget.AbsListView;
+import android.widget.AbsListView.OnScrollListener;
+import android.widget.AdapterView;
+import android.widget.ListAdapter;
+
+public class ListPopupWindow {
+ private static class DropDownListView extends ListView {
+ private boolean mHijackFocus;
+ private boolean mListSelectionHidden;
+
+ public DropDownListView(Context context, boolean hijackFocus) {
+ super(context, null, R.attr.dropDownListViewStyle);
+ mHijackFocus = hijackFocus;
+ }
+
+ @Override
+ public boolean hasFocus() {
+ return mHijackFocus || super.hasFocus();
+ }
+
+ @Override
+ public boolean hasWindowFocus() {
+ return mHijackFocus || super.hasWindowFocus();
+ }
+
+ @Override
+ public boolean isFocused() {
+ return mHijackFocus || super.isFocused();
+ }
+
+ @Override
+ public boolean isInTouchMode() {
+ return mHijackFocus && mListSelectionHidden
+ || super.isInTouchMode();
+ }
+
+ @Override
+ public View onPrepareView(View view, int position) {
+ if (view instanceof android.widget.TextView) {
+ ((android.widget.TextView) view).setHorizontallyScrolling(true);
+ }
+ return view;
+ }
+ }
+
+ private class ListSelectorHider implements Runnable {
+ @Override
+ public void run() {
+ clearListSelection();
+ }
+ }
+
+ private class PopupDataSetObserver extends DataSetObserver {
+ @Override
+ public void onChanged() {
+ if (isShowing()) {
+ show();
+ }
+ }
+
+ @Override
+ public void onInvalidated() {
+ dismiss();
+ }
+ }
+
+ private class PopupScrollListener implements ListView.OnScrollListener {
+ @Override
+ public void onScroll(AbsListView view, int firstVisibleItem,
+ int visibleItemCount, int totalItemCount) {
+ }
+
+ @Override
+ public void onScrollStateChanged(AbsListView view, int scrollState) {
+ if (scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL
+ && !isInputMethodNotNeeded()
+ && mPopup.getContentView() != null) {
+ mHandler.removeCallbacks(mResizePopupRunnable);
+ mResizePopupRunnable.run();
+ }
+ }
+ }
+
+ private class PopupTouchInterceptor implements OnTouchListener {
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ final int action = event.getAction();
+ final int x = (int) event.getX();
+ final int y = (int) event.getY();
+ if (action == MotionEvent.ACTION_DOWN && mPopup != null
+ && mPopup.isShowing() && x >= 0 && x < mPopup.getWidth()
+ && y >= 0 && y < mPopup.getHeight()) {
+ mHandler.postDelayed(mResizePopupRunnable,
+ ListPopupWindow.EXPAND_LIST_TIMEOUT);
+ } else if (action == MotionEvent.ACTION_UP) {
+ mHandler.removeCallbacks(mResizePopupRunnable);
+ }
+ return false;
+ }
+ }
+
+ private class ResizePopupRunnable implements Runnable {
+ @Override
+ public void run() {
+ if (mDropDownList != null
+ && mDropDownList.getCount() > mDropDownList.getChildCount()
+ && mDropDownList.getChildCount() <= mListItemExpandMaximum) {
+ mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED);
+ show();
+ }
+ }
+ }
+
+ private static final boolean DEBUG = false;
+ private static final int EXPAND_LIST_TIMEOUT = 250;
+ public static final int INPUT_METHOD_FROM_FOCUSABLE = PopupWindow.INPUT_METHOD_FROM_FOCUSABLE;
+ public static final int INPUT_METHOD_NEEDED = PopupWindow.INPUT_METHOD_NEEDED;
+ public static final int INPUT_METHOD_NOT_NEEDED = PopupWindow.INPUT_METHOD_NOT_NEEDED;
+ public static final int MATCH_PARENT = ViewGroup.LayoutParams.MATCH_PARENT;
+ public static final int POSITION_PROMPT_ABOVE = 0;
+ public static final int POSITION_PROMPT_BELOW = 1;
+ private static final String TAG = "ListPopupWindow";
+ public static final int WRAP_CONTENT = ViewGroup.LayoutParams.WRAP_CONTENT;
+ private ListAdapter mAdapter;
+ private Context mContext;
+ private boolean mDropDownAlwaysVisible = false;
+ private View mDropDownAnchorView;
+ private int mDropDownHeight = ViewGroup.LayoutParams.WRAP_CONTENT;
+ private int mDropDownHorizontalOffset;
+ private DropDownListView mDropDownList;
+ private Drawable mDropDownListHighlight;
+ private int mDropDownVerticalOffset;
+ private boolean mDropDownVerticalOffsetSet;
+ private int mDropDownWidth = ViewGroup.LayoutParams.WRAP_CONTENT;
+ private boolean mForceIgnoreOutsideTouch = false;
+ private Handler mHandler = new Handler();
+ private final ListSelectorHider mHideSelector = new ListSelectorHider();
+ private AdapterView.OnItemClickListener mItemClickListener;
+ private AdapterView.OnItemSelectedListener mItemSelectedListener;
+ int mListItemExpandMaximum = Integer.MAX_VALUE;
+ private boolean mModal;
+ private DataSetObserver mObserver;
+ private PopupWindow mPopup;
+ private int mPromptPosition = ListPopupWindow.POSITION_PROMPT_ABOVE;
+ private View mPromptView;
+ private final ResizePopupRunnable mResizePopupRunnable = new ResizePopupRunnable();
+ private final PopupScrollListener mScrollListener = new PopupScrollListener();
+ private Runnable mShowDropDownRunnable;
+ private Rect mTempRect = new Rect();
+ private final PopupTouchInterceptor mTouchInterceptor = new PopupTouchInterceptor();
+
+ public ListPopupWindow(Context context) {
+ this(context, null, R.attr.listPopupWindowStyle, 0);
+ }
+
+ public ListPopupWindow(Context context, AttributeSet attrs) {
+ this(context, attrs, R.attr.listPopupWindowStyle, 0);
+ }
+
+ public ListPopupWindow(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public ListPopupWindow(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ mPopup = new PopupWindow(mContext = context, attrs, defStyleAttr, defStyleRes);
+ mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
+ }
+
+ private int buildDropDown() {
+ ViewGroup dropDownView;
+ int otherHeights = 0;
+ if (mDropDownList == null) {
+ Context context = mContext;
+ mShowDropDownRunnable = new Runnable() {
+ @Override
+ public void run() {
+ View view = getAnchorView();
+ if (view != null && view.getWindowToken() != null) {
+ show();
+ }
+ }
+ };
+ mDropDownList = new DropDownListView(context, !mModal);
+ if (mDropDownListHighlight != null) {
+ mDropDownList.setSelector(mDropDownListHighlight);
+ }
+ mDropDownList.setAdapter(mAdapter);
+ mDropDownList.setOnItemClickListener(mItemClickListener);
+ mDropDownList.setFocusable(true);
+ mDropDownList.setFocusableInTouchMode(true);
+ mDropDownList
+ .setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+ @Override
+ public void onItemSelected(AdapterView<?> parent,
+ View view, int position, long id) {
+
+ if (position != -1) {
+ DropDownListView dropDownList = mDropDownList;
+
+ if (dropDownList != null) {
+ dropDownList.mListSelectionHidden = false;
+ }
+ }
+ }
+
+ @Override
+ public void onNothingSelected(AdapterView<?> parent) {
+ }
+ });
+ mDropDownList.setOnScrollListener(mScrollListener);
+ if (mItemSelectedListener != null) {
+ mDropDownList.setOnItemSelectedListener(mItemSelectedListener);
+ }
+ dropDownView = mDropDownList;
+ View hintView = mPromptView;
+ if (hintView != null) {
+ LinearLayout hintContainer = new LinearLayout(context);
+ hintContainer
+ .setOrientation(android.widget.LinearLayout.VERTICAL);
+ LinearLayout.LayoutParams hintParams = new LinearLayout.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT, 0, 1.0f);
+ switch (mPromptPosition) {
+ case POSITION_PROMPT_BELOW:
+ hintContainer.addView(dropDownView, hintParams);
+ hintContainer.addView(hintView);
+ break;
+ case POSITION_PROMPT_ABOVE:
+ hintContainer.addView(hintView);
+ hintContainer.addView(dropDownView, hintParams);
+ break;
+ default:
+ Log.e(ListPopupWindow.TAG, "Invalid hint position "
+ + mPromptPosition);
+ break;
+ }
+ int widthSpec = MeasureSpec.makeMeasureSpec(mDropDownWidth,
+ MeasureSpec.AT_MOST);
+ int heightSpec = MeasureSpec.UNSPECIFIED;
+ hintView.measure(widthSpec, heightSpec);
+ hintParams = (LinearLayout.LayoutParams) hintView
+ .getLayoutParams();
+ otherHeights = hintView.getMeasuredHeight()
+ + hintParams.topMargin + hintParams.bottomMargin;
+ dropDownView = hintContainer;
+ }
+ mPopup.setContentView(dropDownView);
+ } else {
+ dropDownView = (ViewGroup) mPopup.getContentView();
+ final View view = mPromptView;
+ if (view != null) {
+ LinearLayout.LayoutParams hintParams = (LinearLayout.LayoutParams) view
+ .getLayoutParams();
+ otherHeights = view.getMeasuredHeight() + hintParams.topMargin
+ + hintParams.bottomMargin;
+ }
+ }
+ int padding = 0;
+ Drawable background = mPopup.getBackground();
+ if (background != null) {
+ background.getPadding(mTempRect);
+ padding = mTempRect.top + mTempRect.bottom;
+ if (!mDropDownVerticalOffsetSet) {
+ mDropDownVerticalOffset = -mTempRect.top;
+ }
+ } else {
+ mTempRect.setEmpty();
+ }
+ boolean ignoreBottomDecorations = mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED;
+ final int maxHeight = getMaxAvailableHeight(getAnchorView(),
+ mDropDownVerticalOffset, ignoreBottomDecorations);
+ if (mDropDownAlwaysVisible
+ || mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) {
+ return maxHeight + padding;
+ }
+ final int childWidthSpec;
+ switch (mDropDownWidth) {
+ case ViewGroup.LayoutParams.WRAP_CONTENT:
+ childWidthSpec = MeasureSpec.makeMeasureSpec(mContext
+ .getResources().getDisplayMetrics().widthPixels
+ - (mTempRect.left + mTempRect.right), MeasureSpec.AT_MOST);
+ break;
+ case ViewGroup.LayoutParams.MATCH_PARENT:
+ childWidthSpec = MeasureSpec.makeMeasureSpec(mContext
+ .getResources().getDisplayMetrics().widthPixels
+ - (mTempRect.left + mTempRect.right), MeasureSpec.EXACTLY);
+ break;
+ default:
+ childWidthSpec = MeasureSpec.makeMeasureSpec(mDropDownWidth,
+ MeasureSpec.EXACTLY);
+ break;
+ }
+ final int listContent = measureHeightOfChildren(childWidthSpec, 0, -1,
+ maxHeight - otherHeights, -1);
+ if (listContent > 0) {
+ otherHeights += padding;
+ }
+ return listContent + otherHeights;
+ }
+
+ public void clearListSelection() {
+ final DropDownListView list = mDropDownList;
+ if (list != null) {
+ list.mListSelectionHidden = true;
+ // TODO list.hideSelector();
+ list.requestLayout();
+ }
+ }
+
+ public void dismiss() {
+ mPopup.dismiss();
+ removePromptView();
+ mPopup.setContentView(null);
+ mDropDownList = null;
+ mHandler.removeCallbacks(mResizePopupRunnable);
+ }
+
+ public View getAnchorView() {
+ return mDropDownAnchorView;
+ }
+
+ public int getAnimationStyle() {
+ return mPopup.getAnimationStyle();
+ }
+
+ public Drawable getBackground() {
+ return mPopup.getBackground();
+ }
+
+ public int getHeight() {
+ return mDropDownHeight;
+ }
+
+ public int getHorizontalOffset() {
+ return mDropDownHorizontalOffset;
+ }
+
+ public int getInputMethodMode() {
+ return mPopup.getInputMethodMode();
+ }
+
+ public ListView getListView() {
+ return mDropDownList;
+ }
+
+ private int getMaxAvailableHeight(View anchor, int yOffset,
+ boolean ignoreBottomDecorations) {
+ final Rect displayFrame = new Rect();
+ anchor.getWindowVisibleDisplayFrame(displayFrame);
+ final int[] anchorPos = new int[2];
+ anchor.getLocationOnScreen(anchorPos);
+ int bottomEdge = displayFrame.bottom;
+ if (ignoreBottomDecorations) {
+ Resources res = anchor.getContext().getResources();
+ bottomEdge = res.getDisplayMetrics().heightPixels;
+ }
+ final int distanceToBottom = bottomEdge
+ - (anchorPos[1] + anchor.getHeight()) - yOffset;
+ final int distanceToTop = anchorPos[1] - displayFrame.top + yOffset;
+ int returnedHeight = Math.max(distanceToBottom, distanceToTop);
+ if (mPopup.getBackground() != null) {
+ mPopup.getBackground().getPadding(mTempRect);
+ returnedHeight -= mTempRect.top + mTempRect.bottom;
+ }
+ return returnedHeight;
+ }
+
+ public int getPromptPosition() {
+ return mPromptPosition;
+ }
+
+ public Object getSelectedItem() {
+ if (!isShowing()) {
+ return null;
+ }
+ return mDropDownList.getSelectedItem();
+ }
+
+ public long getSelectedItemId() {
+ if (!isShowing()) {
+ return AdapterView.INVALID_ROW_ID;
+ }
+ return mDropDownList.getSelectedItemId();
+ }
+
+ public int getSelectedItemPosition() {
+ if (!isShowing()) {
+ return AdapterView.INVALID_POSITION;
+ }
+ return mDropDownList.getSelectedItemPosition();
+ }
+
+ public View getSelectedView() {
+ if (!isShowing()) {
+ return null;
+ }
+ return mDropDownList.getSelectedView();
+ }
+
+ public int getSoftInputMode() {
+ return mPopup.getSoftInputMode();
+ }
+
+ public int getVerticalOffset() {
+ if (!mDropDownVerticalOffsetSet) {
+ return 0;
+ }
+ return mDropDownVerticalOffset;
+ }
+
+ public int getWidth() {
+ return mDropDownWidth;
+ }
+
+ public boolean isDropDownAlwaysVisible() {
+ return mDropDownAlwaysVisible;
+ }
+
+ public boolean isInputMethodNotNeeded() {
+ return mPopup.getInputMethodMode() == ListPopupWindow.INPUT_METHOD_NOT_NEEDED;
+ }
+
+ public boolean isModal() {
+ return mModal;
+ }
+
+ public boolean isShowing() {
+ return mPopup.isShowing();
+ }
+
+ private int measureHeightOfChildren(int widthMeasureSpec,
+ int startPosition, int endPosition, final int maxHeight,
+ int disallowPartialChildPosition) {
+ final ListAdapter adapter = mAdapter;
+ if (adapter == null) {
+ return mDropDownList.getListPaddingTop()
+ + mDropDownList.getListPaddingBottom();
+ }
+ int returnedHeight = mDropDownList.getListPaddingTop()
+ + mDropDownList.getListPaddingBottom();
+ final int dividerHeight = mDropDownList.getDividerHeight() > 0
+ && mDropDownList.getDivider() != null ? mDropDownList
+ .getDividerHeight() : 0;
+ int prevHeightWithoutPartialChild = 0;
+ int i;
+ View child;
+ endPosition = endPosition == -1 ? adapter.getCount() - 1 : endPosition;
+ for (i = startPosition; i <= endPosition; ++i) {
+ child = mAdapter.getView(i, null, mDropDownList);
+ if (mDropDownList.getCacheColorHint() != 0) {
+ child.setDrawingCacheBackgroundColor(mDropDownList
+ .getCacheColorHint());
+ }
+ measureScrapChild(child, i, widthMeasureSpec);
+ if (i > 0) {
+ returnedHeight += dividerHeight;
+ }
+ returnedHeight += child.getMeasuredHeight();
+ if (returnedHeight >= maxHeight) {
+ return disallowPartialChildPosition >= 0
+ && i > disallowPartialChildPosition
+ && prevHeightWithoutPartialChild > 0
+ && returnedHeight != maxHeight ? prevHeightWithoutPartialChild
+ : maxHeight;
+ }
+ if (disallowPartialChildPosition >= 0
+ && i >= disallowPartialChildPosition) {
+ prevHeightWithoutPartialChild = returnedHeight;
+ }
+ }
+ return returnedHeight;
+ }
+
+ private void measureScrapChild(View child, int position,
+ int widthMeasureSpec) {
+ ListView.LayoutParams p = (ListView.LayoutParams) child
+ .getLayoutParams();
+ if (p == null) {
+ p = new ListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT, 0);
+ child.setLayoutParams(p);
+ }
+ // TODO p.viewType = mAdapter.getItemViewType(position);
+ // TODO p.forceAdd = true;
+ int childWidthSpec = ViewGroup.getChildMeasureSpec(
+ widthMeasureSpec,
+ mDropDownList.getPaddingLeft()
+ + mDropDownList.getPaddingRight(), p.width);
+ int lpHeight = p.height;
+ int childHeightSpec;
+ if (lpHeight > 0) {
+ childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight,
+ MeasureSpec.EXACTLY);
+ } else {
+ childHeightSpec = MeasureSpec.makeMeasureSpec(0,
+ MeasureSpec.UNSPECIFIED);
+ }
+ child.measure(childWidthSpec, childHeightSpec);
+ }
+
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ if (isShowing()) {
+ if (keyCode != KeyEvent.KEYCODE_SPACE
+ && (mDropDownList.getSelectedItemPosition() >= 0 || keyCode != KeyEvent.KEYCODE_ENTER
+ && keyCode != KeyEvent.KEYCODE_DPAD_CENTER)) {
+ int curIndex = mDropDownList.getSelectedItemPosition();
+ boolean consumed;
+ final boolean below = !mPopup.isAboveAnchor();
+ final ListAdapter adapter = mAdapter;
+ @SuppressWarnings("unused")
+ boolean allEnabled;
+ int firstItem = Integer.MAX_VALUE;
+ int lastItem = Integer.MIN_VALUE;
+ if (adapter != null) {
+ allEnabled = adapter.areAllItemsEnabled();
+ firstItem = 0;
+ lastItem = adapter.getCount() - 1;
+ /*
+ * TODO firstItem = allEnabled ? 0 : mDropDownList
+ * .lookForSelectablePosition(0, true); lastItem =
+ * allEnabled ? adapter.getCount() - 1 :
+ * mDropDownList.lookForSelectablePosition(
+ * adapter.getCount() - 1, false);
+ */
+ }
+ if (below && keyCode == KeyEvent.KEYCODE_DPAD_UP
+ && curIndex <= firstItem || !below
+ && keyCode == KeyEvent.KEYCODE_DPAD_DOWN
+ && curIndex >= lastItem) {
+ clearListSelection();
+ mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
+ show();
+ return true;
+ } else {
+ mDropDownList.mListSelectionHidden = false;
+ }
+ consumed = mDropDownList.onKeyDown(keyCode, event);
+ if (ListPopupWindow.DEBUG) {
+ Log.v(ListPopupWindow.TAG, "Key down: code=" + keyCode
+ + " list consumed=" + consumed);
+ }
+
+ if (consumed) {
+ mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED);
+ mDropDownList.requestFocusFromTouch();
+ show();
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_ENTER:
+ case KeyEvent.KEYCODE_DPAD_CENTER:
+ case KeyEvent.KEYCODE_DPAD_DOWN:
+ case KeyEvent.KEYCODE_DPAD_UP:
+ return true;
+ }
+ } else {
+ if (below && keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
+ if (curIndex == lastItem) {
+ return true;
+ }
+ } else if (!below && keyCode == KeyEvent.KEYCODE_DPAD_UP
+ && curIndex == firstItem) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @SuppressLint("NewApi")
+ public boolean onKeyPreIme(int keyCode, KeyEvent event) {
+ if (VERSION.SDK_INT < 5) {
+ return false;
+ }
+ if (keyCode == KeyEvent.KEYCODE_BACK && isShowing()) {
+ final View anchorView = mDropDownAnchorView;
+ if (event.getAction() == KeyEvent.ACTION_DOWN
+ && event.getRepeatCount() == 0) {
+ KeyEvent.DispatcherState state = anchorView
+ .getKeyDispatcherState();
+ if (state != null) {
+ state.startTracking(event, this);
+ }
+ return true;
+ } else if (event.getAction() == KeyEvent.ACTION_UP) {
+ KeyEvent.DispatcherState state = anchorView
+ .getKeyDispatcherState();
+ if (state != null) {
+ state.handleUpEvent(event);
+ }
+ if (event.isTracking() && !event.isCanceled()) {
+ dismiss();
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public boolean onKeyUp(int keyCode, KeyEvent event) {
+ if (isShowing() && mDropDownList.getSelectedItemPosition() >= 0) {
+ boolean consumed = mDropDownList.onKeyUp(keyCode, event);
+ if (consumed) {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_ENTER:
+ case KeyEvent.KEYCODE_DPAD_CENTER:
+ dismiss();
+ break;
+ }
+ }
+ return consumed;
+ }
+ return false;
+ }
+
+ public boolean performItemClick(int position) {
+ if (isShowing()) {
+ if (mItemClickListener != null) {
+ final DropDownListView list = mDropDownList;
+ final View child = list.getChildAt(position
+ - list.getFirstVisiblePosition());
+ final ListAdapter adapter = list.getAdapter();
+ mItemClickListener.onItemClick(list, child, position,
+ adapter.getItemId(position));
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public void postShow() {
+ mHandler.post(mShowDropDownRunnable);
+ }
+
+ private void removePromptView() {
+ if (mPromptView != null) {
+ final ViewParent parent = mPromptView.getParent();
+ if (parent instanceof ViewGroup) {
+ final ViewGroup group = (ViewGroup) parent;
+ group.removeView(mPromptView);
+ }
+ }
+ }
+
+ public void setAdapter(ListAdapter adapter) {
+ if (mObserver == null) {
+ mObserver = new PopupDataSetObserver();
+ } else if (mAdapter != null) {
+ mAdapter.unregisterDataSetObserver(mObserver);
+ }
+ mAdapter = adapter;
+ if (mAdapter != null) {
+ mAdapter.registerDataSetObserver(mObserver);
+ }
+ if (mDropDownList != null) {
+ mDropDownList.setAdapter(mAdapter);
+ }
+ }
+
+ public void setAnchorView(View anchor) {
+ mDropDownAnchorView = anchor;
+ }
+
+ public void setAnimationStyle(int animationStyle) {
+ mPopup.setAnimationStyle(animationStyle);
+ }
+
+ public void setBackgroundDrawable(Drawable d) {
+ mPopup.setBackgroundDrawable(d);
+ }
+
+ public void setContentWidth(int width) {
+ Drawable popupBackground = mPopup.getBackground();
+ if (popupBackground != null) {
+ popupBackground.getPadding(mTempRect);
+ mDropDownWidth = mTempRect.left + mTempRect.right + width;
+ } else {
+ setWidth(width);
+ }
+ }
+
+ public void setDropDownAlwaysVisible(boolean dropDownAlwaysVisible) {
+ mDropDownAlwaysVisible = dropDownAlwaysVisible;
+ }
+
+ public void setForceIgnoreOutsideTouch(boolean forceIgnoreOutsideTouch) {
+ mForceIgnoreOutsideTouch = forceIgnoreOutsideTouch;
+ }
+
+ public void setHeight(int height) {
+ mDropDownHeight = height;
+ }
+
+ public void setHorizontalOffset(int offset) {
+ mDropDownHorizontalOffset = offset;
+ }
+
+ public void setInputMethodMode(int mode) {
+ mPopup.setInputMethodMode(mode);
+ }
+
+ void setListItemExpandMax(int max) {
+ mListItemExpandMaximum = max;
+ }
+
+ public void setListSelector(Drawable selector) {
+ mDropDownListHighlight = selector;
+ }
+
+ public void setModal(boolean modal) {
+ mModal = true;
+ mPopup.setFocusable(modal);
+ }
+
+ public void setOnDismissListener(PopupWindow.OnDismissListener listener) {
+ mPopup.setOnDismissListener(listener);
+ }
+
+ public void setOnItemClickListener(
+ AdapterView.OnItemClickListener clickListener) {
+ mItemClickListener = clickListener;
+ }
+
+ public void setOnItemSelectedListener(
+ AdapterView.OnItemSelectedListener selectedListener) {
+ mItemSelectedListener = selectedListener;
+ }
+
+ public void setPromptPosition(int position) {
+ mPromptPosition = position;
+ }
+
+ public void setPromptView(View prompt) {
+ boolean showing = isShowing();
+ if (showing) {
+ removePromptView();
+ }
+ mPromptView = prompt;
+ if (showing) {
+ show();
+ }
+ }
+
+ public void setSelection(int position) {
+ DropDownListView list = mDropDownList;
+ if (isShowing() && list != null) {
+ list.mListSelectionHidden = false;
+ list.setSelection(position);
+ if (list.getChoiceMode() != AbsListView.CHOICE_MODE_NONE) {
+ list.setItemChecked(position, true);
+ }
+ }
+ }
+
+ public void setSoftInputMode(int mode) {
+ mPopup.setSoftInputMode(mode);
+ }
+
+ public void setVerticalOffset(int offset) {
+ mDropDownVerticalOffset = offset;
+ mDropDownVerticalOffsetSet = true;
+ }
+
+ public void setWidth(int width) {
+ mDropDownWidth = width;
+ }
+
+ public void show() {
+ int height = buildDropDown();
+ int widthSpec = 0;
+ int heightSpec = 0;
+ boolean noInputMethod = isInputMethodNotNeeded();
+ mPopup.setAllowScrollingAnchorParent(!noInputMethod);
+ if (mPopup.isShowing()) {
+ if (mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT) {
+ widthSpec = -1;
+ } else if (mDropDownWidth == ViewGroup.LayoutParams.WRAP_CONTENT) {
+ widthSpec = getAnchorView().getWidth();
+ } else {
+ widthSpec = mDropDownWidth;
+ }
+ if (mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) {
+ heightSpec = noInputMethod ? height
+ : ViewGroup.LayoutParams.MATCH_PARENT;
+ if (noInputMethod) {
+ mPopup.setWindowLayoutMode(
+ mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT ? ViewGroup.LayoutParams.MATCH_PARENT
+ : 0, 0);
+ } else {
+ mPopup.setWindowLayoutMode(
+ mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT ? ViewGroup.LayoutParams.MATCH_PARENT
+ : 0, ViewGroup.LayoutParams.MATCH_PARENT);
+ }
+ } else if (mDropDownHeight == ViewGroup.LayoutParams.WRAP_CONTENT) {
+ heightSpec = height;
+ } else {
+ heightSpec = mDropDownHeight;
+ }
+ mPopup.setOutsideTouchable(!mForceIgnoreOutsideTouch
+ && !mDropDownAlwaysVisible);
+ mPopup.update(getAnchorView(), mDropDownHorizontalOffset,
+ mDropDownVerticalOffset, widthSpec, heightSpec);
+ } else {
+ if (mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT) {
+ widthSpec = ViewGroup.LayoutParams.MATCH_PARENT;
+ } else {
+ if (mDropDownWidth == ViewGroup.LayoutParams.WRAP_CONTENT) {
+ mPopup.setWidth(getAnchorView().getWidth());
+ } else {
+ mPopup.setWidth(mDropDownWidth);
+ }
+ }
+ if (mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) {
+ heightSpec = ViewGroup.LayoutParams.MATCH_PARENT;
+ } else {
+ if (mDropDownHeight == ViewGroup.LayoutParams.WRAP_CONTENT) {
+ mPopup.setHeight(height);
+ } else {
+ mPopup.setHeight(mDropDownHeight);
+ }
+ }
+ mPopup.setWindowLayoutMode(widthSpec, heightSpec);
+ mPopup.setClipToScreenEnabled(true);
+ mPopup.setOutsideTouchable(!mForceIgnoreOutsideTouch
+ && !mDropDownAlwaysVisible);
+ mPopup.setTouchInterceptor(mTouchInterceptor);
+ mPopup.showAsDropDown(getAnchorView(), mDropDownHorizontalOffset,
+ mDropDownVerticalOffset);
+ mDropDownList.setSelection(AdapterView.INVALID_POSITION);
+ if (!mModal || mDropDownList.isInTouchMode()) {
+ clearListSelection();
+ }
+ if (!mModal) {
+ mHandler.post(mHideSelector);
+ }
+ }
+ }
+}