--- /dev/null
+package org.openintents.filemanager;\r
+\r
+/* $Id: BulletedTextListAdapter.java 57 2007-11-21 18:31:52Z steven $ \r
+ * \r
+ * Copyright 2007 Steven Osborn \r
+ * \r
+ * Licensed under the Apache License, Version 2.0 (the "License"); \r
+ * you may not use this file except in compliance with the License. \r
+ * You may obtain a copy of the License at \r
+ * \r
+ * http://www.apache.org/licenses/LICENSE-2.0 \r
+ * \r
+ * Unless required by applicable law or agreed to in writing, software \r
+ * distributed under the License is distributed on an "AS IS" BASIS, \r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. \r
+ * See the License for the specific language governing permissions and \r
+ * limitations under the License. \r
+ */ \r
+\r
+import java.io.File;\r
+import java.util.ArrayList; \r
+import java.util.List; \r
+\r
+import org.openintents.filemanager.util.FileUtils;\r
+import org.openintents.filemanager.util.MimeTypes;\r
+\r
+import android.content.Context; \r
+import android.graphics.Bitmap;\r
+import android.graphics.BitmapFactory;\r
+import android.graphics.drawable.Drawable;\r
+import android.view.View; \r
+import android.view.ViewGroup; \r
+import android.widget.BaseAdapter; \r
+import android.widget.Filter;\r
+import android.widget.Filterable;\r
+\r
+/** @author Steven Osborn - http://steven.bitsetters.com */ \r
+public class IconifiedTextListAdapter extends BaseAdapter implements Filterable { \r
+\r
+ /** Remember our context so we can use it when constructing views. */ \r
+ private Context mContext; \r
+ \r
+ private static String lastFilter;\r
+ \r
+ class IconifiedFilter extends Filter {\r
+ @Override\r
+ protected FilterResults performFiltering(CharSequence arg0) {\r
+ \r
+ lastFilter = (arg0 != null) ? arg0.toString() : null;\r
+ \r
+ Filter.FilterResults results = new Filter.FilterResults();\r
+\r
+ // No results yet?\r
+ if (mOriginalItems == null) {\r
+ results.count = 0;\r
+ results.values = null;\r
+ return results;\r
+ }\r
+ \r
+ int count = mOriginalItems.size();\r
+\r
+ if (arg0 == null || arg0.length() == 0) {\r
+ results.count = count;\r
+ results.values = mOriginalItems;\r
+ return results;\r
+ }\r
+ \r
+ \r
+ List<IconifiedText> filteredItems = new ArrayList<IconifiedText>(count);\r
+ \r
+ int outCount = 0;\r
+ CharSequence lowerCs = arg0.toString().toLowerCase();\r
+ \r
+ \r
+ for (int x=0; x<count; x++) {\r
+ IconifiedText text = mOriginalItems.get(x);\r
+ \r
+ if (text.getText().toLowerCase().contains(lowerCs)) {\r
+ // This one matches.\r
+ filteredItems.add(text);\r
+ outCount++;\r
+ }\r
+ }\r
+ \r
+ results.count = outCount;\r
+ results.values = filteredItems;\r
+ return results;\r
+ }\r
+\r
+ @Override\r
+ protected void publishResults(CharSequence arg0, FilterResults arg1) {\r
+ mItems = (List<IconifiedText>) arg1.values;\r
+ notifyDataSetChanged();\r
+ }\r
+ \r
+ List<IconifiedText> synchronousFilter(CharSequence filter) {\r
+ FilterResults results = performFiltering(filter);\r
+ return (List<IconifiedText>) (results.values);\r
+ }\r
+ }\r
+ \r
+ private IconifiedFilter mFilter = new IconifiedFilter();\r
+\r
+ private List<IconifiedText> mItems = new ArrayList<IconifiedText>(); \r
+ private List<IconifiedText> mOriginalItems = new ArrayList<IconifiedText>();\r
+ \r
+ private Drawable mIconChecked;\r
+ private Drawable mIconUnchecked;\r
+ \r
+ public ThumbnailLoader mThumbnailLoader;\r
+ \r
+ private File parentFile;\r
+ \r
+ private MimeTypes mMimeTypes;\r
+ \r
+ private boolean scrolling = false;\r
+ \r
+ public IconifiedTextListAdapter(Context context) { \r
+ mContext = context; \r
+ \r
+ mThumbnailLoader = new ThumbnailLoader(context);\r
+ \r
+ // Cache the checked and unchecked icons so we're not decoding them everytime getView is called.\r
+ mIconChecked = context.getResources().getDrawable(R.drawable.ic_button_checked);\r
+ mIconUnchecked = context.getResources().getDrawable(R.drawable.ic_button_unchecked);\r
+ } \r
+\r
+ public void addItem(IconifiedText it) { mItems.add(it); } \r
+\r
+ public void setListItems(List<IconifiedText> lit, boolean filter, File parentFile, MimeTypes mimeTypes) {\r
+ mOriginalItems = lit;\r
+ this.parentFile = parentFile;\r
+ mMimeTypes = mimeTypes;\r
+ \r
+ if (filter) {\r
+ mItems = mFilter.synchronousFilter(lastFilter);\r
+ } else {\r
+ mItems = lit;\r
+ }\r
+ } \r
+\r
+ /** @return The number of items in the */ \r
+ public int getCount() { return mItems.size(); } \r
+\r
+ public Object getItem(int position) { return mItems.get(position); } \r
+\r
+ public boolean areAllItemsSelectable() { return false; } \r
+/*\r
+ public boolean isSelectable(int position) { \r
+ try{ \r
+ return mItems.get(position).isSelectable(); \r
+ }catch (IndexOutOfBoundsException aioobe){ \r
+ return super.isSelectable(position); \r
+ } \r
+ } \r
+ */\r
+\r
+ /** Use the array index as a unique id. */ \r
+ public long getItemId(int position) { \r
+ return position; \r
+ } \r
+ \r
+ public ThumbnailLoader getThumbnailLoader(){\r
+ return mThumbnailLoader;\r
+ }\r
+\r
+ public void toggleScrolling(boolean isScrolling){\r
+ scrolling = isScrolling;\r
+ }\r
+ \r
+ /** @param convertView The old view to overwrite, if one is passed \r
+ * @returns a IconifiedTextView that holds wraps around an IconifiedText */ \r
+ public View getView(int position, View convertView, ViewGroup parent) { \r
+ IconifiedText curItem = mItems.get(position);\r
+ IconifiedTextView btv; \r
+ if (convertView == null) { \r
+ btv = new IconifiedTextView(mContext, curItem); \r
+ } else { // Reuse/Overwrite the View passed \r
+ // We are assuming(!) that it is castable! \r
+ btv = (IconifiedTextView) convertView; \r
+ } \r
+ btv.setText(curItem.getText()); \r
+ btv.setInfo(curItem.getInfo()); \r
+ if(curItem.isCheckIconVisible()){\r
+ btv.setCheckVisible(true);\r
+ if(curItem.isSelected()){\r
+ btv.setCheckDrawable(mIconChecked);\r
+ } else {\r
+ btv.setCheckDrawable(mIconUnchecked);\r
+ }\r
+ } else {\r
+ btv.setCheckVisible(false);\r
+ }\r
+ \r
+ Object icon = curItem.getIconBitmap();\r
+ if(icon instanceof Bitmap){\r
+ btv.setIcon((Bitmap) icon);\r
+ } else {\r
+ btv.setIcon((Drawable) icon);\r
+ }\r
+ \r
+ if(!scrolling && FileUtils.getFile(parentFile, curItem.getText()).isFile() && !"video/mpeg".equals(mMimeTypes.getMimeType(curItem.getText()))){\r
+ if(mThumbnailLoader != null) {\r
+ mThumbnailLoader.loadImage(parentFile.getPath(), curItem, btv.getImageView());\r
+ }\r
+ }\r
+ \r
+ return btv; \r
+ }\r
+\r
+ public Filter getFilter() {\r
+ return mFilter;\r
+ } \r
+ \r
+ public void cancelLoader(){\r
+ mThumbnailLoader.cancel();\r
+ }\r
+}
\ No newline at end of file