summaryrefslogtreecommitdiffstats
path: root/src/com/android/gallery3d/ui/PopupList.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/gallery3d/ui/PopupList.java')
-rw-r--r--src/com/android/gallery3d/ui/PopupList.java206
1 files changed, 206 insertions, 0 deletions
diff --git a/src/com/android/gallery3d/ui/PopupList.java b/src/com/android/gallery3d/ui/PopupList.java
new file mode 100644
index 000000000..248f50b25
--- /dev/null
+++ b/src/com/android/gallery3d/ui/PopupList.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.gallery3d.ui;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.MeasureSpec;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.BaseAdapter;
+import android.widget.ListView;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+
+import com.android.gallery3d.R;
+
+import java.util.ArrayList;
+
+public class PopupList {
+
+ public static interface OnPopupItemClickListener {
+ public boolean onPopupItemClick(int itemId);
+ }
+
+ public static class Item {
+ public final int id;
+ public String title;
+
+ public Item(int id, String title) {
+ this.id = id;
+ this.title = title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+ }
+
+ private final Context mContext;
+ private final View mAnchorView;
+ private final ArrayList<Item> mItems = new ArrayList<Item>();
+ private PopupWindow mPopupWindow;
+ private ListView mContentList;
+ private OnPopupItemClickListener mOnPopupItemClickListener;
+ private int mPopupOffsetX;
+ private int mPopupOffsetY;
+ private int mPopupWidth;
+ private int mPopupHeight;
+
+ public PopupList(Context context, View anchorView) {
+ mContext = context;
+ mAnchorView = anchorView;
+ }
+
+ public void setOnPopupItemClickListener(OnPopupItemClickListener listener) {
+ mOnPopupItemClickListener = listener;
+ }
+
+ public void addItem(int id, String title) {
+ mItems.add(new Item(id, title));
+ }
+
+ public void clearItems() {
+ mItems.clear();
+ }
+
+ private final PopupWindow.OnDismissListener mOnDismissListener =
+ new PopupWindow.OnDismissListener() {
+ @SuppressWarnings("deprecation")
+ @Override
+ public void onDismiss() {
+ if (mPopupWindow == null) return;
+ mPopupWindow = null;
+ ViewTreeObserver observer = mAnchorView.getViewTreeObserver();
+ if (observer.isAlive()) {
+ // We used the deprecated function for backward compatibility
+ // The new "removeOnGlobalLayoutListener" is introduced in API level 16
+ observer.removeGlobalOnLayoutListener(mOnGLobalLayoutListener);
+ }
+ }
+ };
+
+ private final OnItemClickListener mOnItemClickListener =
+ new OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ if (mPopupWindow == null) return;
+ mPopupWindow.dismiss();
+ if (mOnPopupItemClickListener != null) {
+ mOnPopupItemClickListener.onPopupItemClick((int) id);
+ }
+ }
+ };
+
+ private final OnGlobalLayoutListener mOnGLobalLayoutListener =
+ new OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ if (mPopupWindow == null) return;
+ updatePopupLayoutParams();
+ // Need to update the position of the popup window
+ mPopupWindow.update(mAnchorView,
+ mPopupOffsetX, mPopupOffsetY, mPopupWidth, mPopupHeight);
+ }
+ };
+
+ public void show() {
+ if (mPopupWindow != null) return;
+ mAnchorView.getViewTreeObserver()
+ .addOnGlobalLayoutListener(mOnGLobalLayoutListener);
+ mPopupWindow = createPopupWindow();
+ updatePopupLayoutParams();
+ mPopupWindow.setWidth(mPopupWidth);
+ mPopupWindow.setHeight(mPopupHeight);
+ mPopupWindow.showAsDropDown(mAnchorView, mPopupOffsetX, mPopupOffsetY);
+ }
+
+ private void updatePopupLayoutParams() {
+ ListView content = mContentList;
+ PopupWindow popup = mPopupWindow;
+
+ Rect p = new Rect();
+ popup.getBackground().getPadding(p);
+
+ int maxHeight = mPopupWindow.getMaxAvailableHeight(mAnchorView) - p.top - p.bottom;
+ mContentList.measure(
+ MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
+ MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST));
+ mPopupWidth = content.getMeasuredWidth() + p.top + p.bottom;
+ mPopupHeight = Math.min(maxHeight, content.getMeasuredHeight() + p.left + p.right);
+ mPopupOffsetX = -p.left;
+ mPopupOffsetY = -p.top;
+ }
+
+ private PopupWindow createPopupWindow() {
+ PopupWindow popup = new PopupWindow(mContext);
+ popup.setOnDismissListener(mOnDismissListener);
+
+ popup.setBackgroundDrawable(mContext.getResources().getDrawable(
+ R.drawable.menu_dropdown_panel_holo_dark));
+
+ mContentList = new ListView(mContext, null,
+ android.R.attr.dropDownListViewStyle);
+ mContentList.setAdapter(new ItemDataAdapter());
+ mContentList.setOnItemClickListener(mOnItemClickListener);
+ popup.setContentView(mContentList);
+ popup.setFocusable(true);
+ popup.setOutsideTouchable(true);
+
+ return popup;
+ }
+
+ public Item findItem(int id) {
+ for (Item item : mItems) {
+ if (item.id == id) return item;
+ }
+ return null;
+ }
+
+ private class ItemDataAdapter extends BaseAdapter {
+ @Override
+ public int getCount() {
+ return mItems.size();
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return mItems.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return mItems.get(position).id;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ if (convertView == null) {
+ convertView = LayoutInflater.from(mContext)
+ .inflate(R.layout.popup_list_item, null);
+ }
+ TextView text = (TextView) convertView.findViewById(android.R.id.text1);
+ text.setText(mItems.get(position).title);
+ return convertView;
+ }
+ }
+}