package org.intermine.app.adapter; /* * Copyright (C) 2015 InterMine * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public Licence. This should * be distributed with the code. See the LICENSE file for more * information or http://www.gnu.org/copyleft/lesser.html. * */ import android.content.Context; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.TextView; import org.intermine.app.R; import org.intermine.app.core.ListItems; import org.intermine.app.core.Tree; import org.intermine.app.util.Collections; import org.intermine.app.util.Strs; import java.util.List; /** * @author Daria Komkova <Daria_Komkova @ hotmail.com> */ public class ListAdapter extends BaseAdapter { private final Context mContext; private final LayoutInflater mLayoutInflater; private List<List<String>> mFilteredFeatures; private List<List<String>> mFeatures; private Tree mFeaturesNames; private String mQuery; public ListAdapter(Context ctx) { mContext = ctx; mLayoutInflater = LayoutInflater.from(ctx); mFilteredFeatures = Collections.newArrayList(); mFeatures = Collections.newArrayList(); } public void addListItems(ListItems listItems) { if (!Collections.isNullOrEmpty(listItems.getFeatures())) { mFeatures.addAll(listItems.getFeatures()); filter(mQuery); } if (!Collections.isNullOrEmpty(listItems.getFeaturesNames())) { mFeaturesNames = generateAttributesTree(listItems.getFeaturesNames()); mFeaturesNames.compact(mFeaturesNames.getRootElement()); mFeaturesNames.computeDepthOfEachNode(mFeaturesNames.getRootElement()); } notifyDataSetChanged(); } @Override public int getCount() { if (null != mFilteredFeatures) { return mFilteredFeatures.size(); } return 0; } @Override public Object getItem(int position) { if (null != mFilteredFeatures) { return mFilteredFeatures.get(position); } return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (null == convertView) { convertView = mLayoutInflater.inflate(R.layout.list_item, parent, false); ViewCreatorVisitor visitor = new ViewCreatorVisitor((ViewGroup) convertView); mFeaturesNames.visitNodes(visitor); } List<String> features = (List<String>) getItem(position); AttributeNodeVisitor visitor = new AttributeNodeVisitor(features, (ViewGroup) convertView); mFeaturesNames.visitNodes(visitor); return convertView; } public void filter(String query) { mQuery = query; mFilteredFeatures.clear(); if (Strs.isNullOrEmpty(query)) { mFilteredFeatures.addAll(mFeatures); } else { query = query.toLowerCase(); for (List<String> featureSet : mFeatures) { for (String feature : featureSet) { if ((!Strs.isNullOrEmpty(feature) && feature.toLowerCase().contains(query))) { mFilteredFeatures.add(featureSet); break; } } } } notifyDataSetChanged(); } public boolean isFilteredResultsEmpty() { return Collections.isNullOrEmpty(mFilteredFeatures); } private Tree generateAttributesTree(List<String> attributes) { Tree tree = new Tree(); int number = 0; for (String attribute : attributes) { String[] parts = attribute.split(" > "); Tree.Node node = tree.getRootElement(); for (String part : parts) { node = node.addChild(part); } node.setNumber(number++); } return tree; } private class AttributeNodeVisitor implements Tree.NodeVisitor { private ViewGroup mContainer; private List<java.lang.String> mValues; public AttributeNodeVisitor(List<String> values, ViewGroup container) { this.mValues = values; mContainer = container; } @Override public boolean visit(Tree.Node node) { if (null != node.getValue()) { if (node.getChildren().isEmpty()) { TextView attributeValue = (TextView) mContainer.findViewWithTag(node.getNumber()); attributeValue.setText(mValues.get(node.getNumber())); } } return true; } } private class ViewCreatorVisitor implements Tree.NodeVisitor { private ViewGroup mContainer; public ViewCreatorVisitor(ViewGroup container) { mContainer = container; } @Override public boolean visit(Tree.Node node) { if (!Strs.isNullOrEmpty(node.getValue())) { LayoutInflater inflater = LayoutInflater.from(mContext); if (!Collections.isNullOrEmpty(node.getChildren())) { TextView rowTitle = (TextView) inflater.inflate(R.layout.attribute_class_title, null); rowTitle.setText(node.getValue()); rowTitle.setGravity(Gravity.CENTER); mContainer.addView(rowTitle); } else { LinearLayout row = (LinearLayout) inflater.inflate(R.layout.attribute_row, null); TextView attributeTitle = (TextView) row.findViewById(R.id.attribute_title); attributeTitle.setText(node.getValue()); TextView attributeValue = (TextView) row.findViewById(R.id.attribute_value); attributeValue.setTag(node.getNumber()); mContainer.addView(row); } } return true; } } }