package com.door43.translationstudio.newui.newtranslation;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.ImageView;
import android.widget.TextView;
import com.door43.translationstudio.R;
import com.door43.translationstudio.core.ProjectCategory;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* Created by joel on 9/4/2015.
*/
public class ProjectCategoryAdapter extends BaseAdapter {
private ProjectCategory[] mCategories;
private ProjectCategory[] mFilteredCategories;
private ProjectCategoryFilter mProjectFilter;
public ProjectCategoryAdapter(ProjectCategory[] categories) {
List<ProjectCategory> categoriesList = Arrays.asList(categories);
mCategories = categoriesList.toArray(new ProjectCategory[categoriesList.size()]);
mFilteredCategories = mCategories;
}
@Override
public int getCount() {
if(mFilteredCategories != null) {
return mFilteredCategories.length;
} else {
return 0;
}
}
@Override
public ProjectCategory getItem(int position) {
return mFilteredCategories[position];
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
ViewHolder holder;
if(convertView == null) {
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_project_list_item, null);
holder = new ViewHolder(v);
} else {
holder = (ViewHolder)v.getTag();
}
// render view
holder.mProjectView.setText(getItem(position).title);
if(getItem(position).isProject()) {
holder.mMoreImage.setVisibility(View.GONE);
} else {
holder.mMoreImage.setVisibility(View.VISIBLE);
}
// TODO: render icon
return v;
}
/**
* Updates the data set
* @param categories
*/
public void changeData(ProjectCategory[] categories) {
mCategories = categories;
mFilteredCategories = categories;
notifyDataSetChanged();
}
/**
* Returns the project filter
* @return
*/
public Filter getFilter() {
if(mProjectFilter == null) {
mProjectFilter = new ProjectCategoryFilter();
}
return mProjectFilter;
}
public static class ViewHolder {
public ImageView mIconImage;
public TextView mProjectView;
public ImageView mMoreImage;
public ViewHolder(View view) {
mIconImage = (ImageView) view.findViewById(R.id.projectIcon);
mProjectView = (TextView) view.findViewById(R.id.projectName);
mMoreImage = (ImageView) view.findViewById(R.id.moreIcon);
view.setTag(this);
}
}
/**
* A filter for projects
*/
private class ProjectCategoryFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
FilterResults results = new FilterResults();
if(charSequence == null || charSequence.length() == 0) {
// no filter
results.values = Arrays.asList(mCategories);
results.count = mCategories.length;
} else {
// perform filter
List<ProjectCategory> filteredCategories = new ArrayList<>();
for(ProjectCategory category:mCategories) {
boolean match = false;
if(category.isProject()) {
// match the project id
match = category.projectId.toLowerCase().startsWith(charSequence.toString().toLowerCase());
}
if(!match) {
String[] categoryComponents = category.getId().split("-");
String[] titleComponents = category.title.split(" ");
if (category.title.toLowerCase().startsWith(charSequence.toString().toLowerCase())) {
// match the project title in any language
match = true;
} else if (category.sourcelanguageId.toLowerCase().startsWith(charSequence.toString().toLowerCase())) {// || l.getName().toLowerCase().startsWith(charSequence.toString().toLowerCase())) {
// match the language id or name
match = true;
} else {
// match category id components
for(String component:categoryComponents) {
if (component.toLowerCase().startsWith(charSequence.toString().toLowerCase())) {
match = true;
break;
}
}
if(!match) {
// match title components
for(String component:titleComponents) {
if (component.toLowerCase().startsWith(charSequence.toString().toLowerCase())) {
match = true;
break;
}
}
}
}
}
if(match) {
filteredCategories.add(category);
}
}
results.values = filteredCategories;
results.count = filteredCategories.size();
}
return results;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
List<ProjectCategory> filteredProjects = ((List<ProjectCategory>) filterResults.values);
if(filteredProjects != null) {
mFilteredCategories = filteredProjects.toArray(new ProjectCategory[filterResults.count]);
} else {
mFilteredCategories = new ProjectCategory[0];
}
notifyDataSetChanged();
}
}
/**
* Sorts project categories by id
* @param categories
* @param referenceId categories are sorted according to the reference id
*/
private static void sortProjectCategories(List<ProjectCategory> categories, final CharSequence referenceId) {
Collections.sort(categories, new Comparator<ProjectCategory>() {
@Override
public int compare(ProjectCategory lhs, ProjectCategory rhs) {
String lhId = lhs.projectId;
String rhId = rhs.projectId;
// give priority to matches with the reference
if (lhId.startsWith(referenceId.toString().toLowerCase())) {
lhId = "!" + lhId;
}
if (rhId.startsWith(referenceId.toString().toLowerCase())) {
rhId = "!" + rhId;
}
return lhId.compareToIgnoreCase(rhId);
}
});
}
}