mirror of https://github.com/tasks/tasks
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
224 lines
8.5 KiB
Java
224 lines
8.5 KiB
Java
/**
|
|
* Copyright (c) 2012 Todoroo Inc
|
|
*
|
|
* See the file "LICENSE" for the full license governing this code.
|
|
*/
|
|
package com.todoroo.astrid.core;
|
|
|
|
import java.util.List;
|
|
|
|
import android.app.AlertDialog;
|
|
import android.content.Context;
|
|
import android.content.DialogInterface;
|
|
import android.content.DialogInterface.OnClickListener;
|
|
import android.view.ContextMenu;
|
|
import android.view.LayoutInflater;
|
|
import android.view.MenuItem;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.ArrayAdapter;
|
|
import android.widget.EditText;
|
|
import android.widget.FrameLayout;
|
|
import android.widget.ImageView;
|
|
import android.widget.TextView;
|
|
|
|
import org.tasks.R;
|
|
import com.todoroo.astrid.api.MultipleSelectCriterion;
|
|
import com.todoroo.astrid.api.TextInputCriterion;
|
|
import com.todoroo.astrid.core.CustomFilterActivity.CriterionInstance;
|
|
import com.todoroo.astrid.data.AddOn;
|
|
|
|
/**
|
|
* Adapter for {@link AddOn}s
|
|
*
|
|
* @author Tim Su <tim@todoroo.com>
|
|
*
|
|
*/
|
|
public class CustomFilterAdapter extends ArrayAdapter<CriterionInstance> {
|
|
|
|
private final CustomFilterActivity activity;
|
|
private final LayoutInflater inflater;
|
|
|
|
public CustomFilterAdapter(CustomFilterActivity activity, List<CriterionInstance> objects) {
|
|
super(activity, R.id.name, objects);
|
|
this.activity = activity;
|
|
inflater = (LayoutInflater) activity.getSystemService(
|
|
Context.LAYOUT_INFLATER_SERVICE);
|
|
}
|
|
|
|
// --- view event handling
|
|
|
|
View.OnClickListener filterClickListener = new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
ViewHolder viewHolder = (ViewHolder) v.getTag();
|
|
if(viewHolder == null) {
|
|
return;
|
|
}
|
|
if(viewHolder.item.type == CriterionInstance.TYPE_UNIVERSE) {
|
|
return;
|
|
}
|
|
|
|
showOptionsFor(viewHolder.item, new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
activity.updateList();
|
|
notifyDataSetInvalidated();
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
public void onCreateContextMenu(ContextMenu menu, View v) {
|
|
// view holder
|
|
ViewHolder viewHolder = (ViewHolder) v.getTag();
|
|
if(viewHolder == null || viewHolder.item.type == CriterionInstance.TYPE_UNIVERSE) {
|
|
return;
|
|
}
|
|
|
|
int index = getPosition(viewHolder.item);
|
|
|
|
menu.setHeaderTitle(viewHolder.name.getText());
|
|
if(viewHolder.icon.getVisibility() == View.VISIBLE) {
|
|
menu.setHeaderIcon(viewHolder.icon.getDrawable());
|
|
}
|
|
|
|
|
|
MenuItem item = menu.add(CustomFilterActivity.MENU_GROUP_CONTEXT_TYPE, CriterionInstance.TYPE_INTERSECT, index,
|
|
activity.getString(R.string.CFA_context_chain,
|
|
activity.getString(R.string.CFA_type_intersect)));
|
|
item.setChecked(viewHolder.item.type == CriterionInstance.TYPE_INTERSECT);
|
|
item = menu.add(CustomFilterActivity.MENU_GROUP_CONTEXT_TYPE, CriterionInstance.TYPE_ADD, index,
|
|
activity.getString(R.string.CFA_context_chain,
|
|
activity.getString(R.string.CFA_type_add)));
|
|
item.setChecked(viewHolder.item.type == CriterionInstance.TYPE_ADD);
|
|
|
|
item = menu.add(CustomFilterActivity.MENU_GROUP_CONTEXT_TYPE, CriterionInstance.TYPE_SUBTRACT, index,
|
|
activity.getString(R.string.CFA_context_chain,
|
|
activity.getString(R.string.CFA_type_subtract)));
|
|
item.setChecked(viewHolder.item.type == CriterionInstance.TYPE_SUBTRACT);
|
|
menu.setGroupCheckable(CustomFilterActivity.MENU_GROUP_CONTEXT_TYPE, true, true);
|
|
|
|
menu.add(CustomFilterActivity.MENU_GROUP_CONTEXT_DELETE, 0, index,
|
|
R.string.CFA_context_delete);
|
|
}
|
|
|
|
/**
|
|
* Show options menu for the given criterioninstance
|
|
* @param item
|
|
*/
|
|
public void showOptionsFor(final CriterionInstance item, final Runnable onComplete) {
|
|
AlertDialog.Builder dialog = new AlertDialog.Builder(activity).
|
|
setTitle(item.criterion.name);
|
|
|
|
if(item.criterion instanceof MultipleSelectCriterion) {
|
|
MultipleSelectCriterion multiSelectCriterion = (MultipleSelectCriterion) item.criterion;
|
|
final String[] titles = multiSelectCriterion.entryTitles;
|
|
ArrayAdapter<String> adapter = new ArrayAdapter<String>(activity,
|
|
android.R.layout.simple_spinner_dropdown_item, titles);
|
|
DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface click, int which) {
|
|
item.selectedIndex = which;
|
|
if(onComplete != null) {
|
|
onComplete.run();
|
|
}
|
|
}
|
|
};
|
|
dialog.setAdapter(adapter, listener);
|
|
} else if(item.criterion instanceof TextInputCriterion) {
|
|
TextInputCriterion textInCriterion = (TextInputCriterion) item.criterion;
|
|
FrameLayout frameLayout = new FrameLayout(activity);
|
|
frameLayout.setPadding(10, 0, 10, 0);
|
|
final EditText editText = new EditText(activity);
|
|
editText.setText(item.selectedText);
|
|
editText.setHint(textInCriterion.hint);
|
|
frameLayout.addView(editText, new FrameLayout.LayoutParams(
|
|
FrameLayout.LayoutParams.FILL_PARENT,
|
|
FrameLayout.LayoutParams.WRAP_CONTENT));
|
|
dialog.setMessage(textInCriterion.prompt).setView(frameLayout).
|
|
setPositiveButton(android.R.string.ok, new OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialogInterface, int which) {
|
|
item.selectedText = editText.getText().toString();
|
|
if(onComplete != null) {
|
|
onComplete.run();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
dialog.show().setOwnerActivity(activity);
|
|
}
|
|
|
|
// --- view construction
|
|
|
|
@Override
|
|
public View getView(int position, View convertView, ViewGroup parent) {
|
|
if(convertView == null) {
|
|
convertView = inflater.inflate(R.layout.custom_filter_row, parent, false);
|
|
ViewHolder viewHolder = new ViewHolder();
|
|
viewHolder.type = (ImageView) convertView.findViewById(R.id.type);
|
|
viewHolder.icon = (ImageView) convertView.findViewById(R.id.icon);
|
|
viewHolder.name= (TextView) convertView.findViewById(R.id.name);
|
|
viewHolder.filterView = (FilterView) convertView.findViewById(R.id.filter);
|
|
convertView.setTag(viewHolder);
|
|
}
|
|
|
|
ViewHolder viewHolder = (ViewHolder)convertView.getTag();
|
|
viewHolder.item = getItem(position);
|
|
initializeView(convertView);
|
|
|
|
// listeners
|
|
convertView.setOnCreateContextMenuListener(activity);
|
|
convertView.setOnClickListener(filterClickListener);
|
|
|
|
return convertView;
|
|
}
|
|
|
|
private class ViewHolder {
|
|
public CriterionInstance item;
|
|
public ImageView type;
|
|
public ImageView icon;
|
|
public TextView name;
|
|
public FilterView filterView;
|
|
}
|
|
|
|
private void initializeView(View convertView) {
|
|
ViewHolder viewHolder = (ViewHolder) convertView.getTag();
|
|
CriterionInstance item = viewHolder.item;
|
|
|
|
String title = item.getTitleFromCriterion();
|
|
|
|
viewHolder.type.setVisibility(item.type == CriterionInstance.TYPE_UNIVERSE ?
|
|
View.GONE : View.VISIBLE);
|
|
switch(item.type) {
|
|
case CriterionInstance.TYPE_ADD:
|
|
viewHolder.type.setImageResource(R.drawable.arrow_join);
|
|
title = activity.getString(R.string.CFA_type_add) + " " + title;
|
|
break;
|
|
case CriterionInstance.TYPE_SUBTRACT:
|
|
viewHolder.type.setImageResource(R.drawable.arrow_branch);
|
|
title = activity.getString(R.string.CFA_type_subtract) + " " + title;
|
|
break;
|
|
case CriterionInstance.TYPE_INTERSECT:
|
|
viewHolder.type.setImageResource(R.drawable.arrow_down);
|
|
break;
|
|
}
|
|
|
|
viewHolder.icon.setVisibility(item.criterion.icon == null ? View.GONE :
|
|
View.VISIBLE);
|
|
if(item.criterion.icon != null) {
|
|
viewHolder.icon.setImageBitmap(item.criterion.icon);
|
|
}
|
|
|
|
viewHolder.name.setText(title);
|
|
|
|
viewHolder.filterView.setMax(item.max);
|
|
viewHolder.filterView.setStart(item.start);
|
|
viewHolder.filterView.setEnd(item.end);
|
|
}
|
|
|
|
|
|
}
|