package com.applang.tagesberichte;
import java.io.StringReader;
import java.util.Locale;
import java.util.Map;
import org.apache.velocity.runtime.parser.Token;
import org.apache.velocity.runtime.parser.node.Node;
import org.apache.velocity.runtime.parser.node.SimpleNode;
import com.applang.BaseDirective;
import com.applang.Dialogs;
import com.applang.UserContext;
import com.applang.Util.Function;
import com.applang.Util.Job;
import com.applang.Util.ValMap;
import com.applang.VelocityUtil.Visitor;
import com.applang.berichtsheft.R;
import static com.applang.Util.*;
import static com.applang.Util2.*;
import static com.applang.VelocityUtil.*;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.ListView;
import android.widget.TextView;
public class Baustein extends ListActivity
{
private static final String TAG = Baustein.class.getSimpleName();
private static final int MENU_ITEM_SEARCH = Menu.FIRST;
private static SimpleNode document = null;
public ListView listView;
private BausteinListAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.baustein);
adapter = new BausteinListAdapter();
Helper.listViewSearch(true, this, adapter.getFilter());
listView = getListView();
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
listView.setOnCreateContextMenuListener(this);
listView.setAdapter(adapter);
unregisterForContextMenu(listView);
}
@Override
protected void onResume() {
super.onResume();
populate(true);
}
Job<Object[]> checkout = new Job<Object[]>() {
public void perform(Object[] objects, Object[] params) throws Exception {
int indents = (Integer) objects[0];
Node node = (Node) objects[1];
Token t = (Token) objects[2];
adapter.addItem(node, indents, t);
}
};
public void populate(boolean clear) {
if (clear)
adapter.clear();
if (document != null) {
Visitor.walk(document, new Function<Object>() {
public Object apply(Object...params) {
Node node = param(null, 0, params);
Visitor.visitLostAndFound(checkout, null,
Visitor.beginLC(node));
if (Visitor.isEssential.apply(node)) {
int indents = param_Integer(0, 1, params);
adapter.addItem(node, indents);
}
return null;
}
});
Visitor.visitLostAndFound(checkout, null,
Integer.MAX_VALUE, 0);
}
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
ValMap map = (ValMap) l.getItemAtPosition(position);
Node node = (Node) map.get(NODE);
Token t = (Token) map.get(TOKEN);
int[] span = Visitor.span(t != null ? t : node);
setResult(RESULT_OK, new Intent()
.putExtra(NoteEditor.SPAN, span));
finish();
}
private void modify(ValMap map) {
Node node = (Node) map.get(NODE);
UserContext.modifyNode(node, this, new ValMap(), null, null, new Job<Object>() {
public void perform(Object node, Object[] params) {
if (node != null) {
populate(true);
}
}
});
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
AdapterView.AdapterContextMenuInfo info;
try {
info = (AdapterView.AdapterContextMenuInfo) menuInfo;
} catch (ClassCastException e) {
Log.e(TAG, "bad menuInfo", e);
return;
}
mMap = (ValMap) adapter.getItem(info.position);
menu.clear();
menu.setHeaderTitle(getString(R.string.particle));
getMenuInflater().inflate(R.menu.contextmenu_baustein, menu);
if (!isPossible(DELETE, mMap))
menu.removeItem(R.id.menu_item_delete);
menu.removeItem(R.id.menu_item_before);
menu.removeItem(R.id.menu_item_after);
if (isPossible(INSERT, mMap)) {
SubMenu before = menu.addSubMenu(Menu.NONE, R.id.menu_item_before, Menu.NONE, R.string.menu_insert_before);
SubMenu after = menu.addSubMenu(Menu.NONE, R.id.menu_item_after, Menu.NONE, R.string.menu_insert_after);
anweisungen = UserContext.directives(mMap);
for (String key : anweisungen.keySet()) {
before.add(Menu.NONE, Menu.FIRST, Menu.NONE, key);
after.add(Menu.NONE, Menu.FIRST, Menu.NONE, key);
}
}
if (!isPossible(MODIFY, mMap))
menu.removeItem(R.id.menu_item_modify);
}
ValMap mMap = null;
Map<String,String> anweisungen = null;
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_item_modify:
modify(mMap);
break;
case R.id.menu_item_delete:
break;
case R.id.menu_item_before:
case R.id.menu_item_after:
break;
}
return super.onContextItemSelected(item);
}
class BausteinListAdapter extends BaseAdapter
{
ValList list = new ValList();
ValList origList = null;
public void clear() {
list.clear();
}
Filter particleFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if (origList == null)
origList = list;
if (notNullOrEmpty(constraint)) {
list = new ValList();
String crit = constraint.toString().toLowerCase(Locale.getDefault());
for (Object item : origList) {
ValMap map = (ValMap) item;
if (!hasEndToken(map)) {
Node node = (Node) map.get(NODE);
String s = Visitor.nodeInfo(node);
if (s.toLowerCase(Locale.getDefault()).startsWith(crit))
list.add(map);
}
}
}
else if (origList != null)
list = origList;
FilterResults results = new FilterResults();
results.values = list;
results.count = list.size();
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results.count < 1)
notifyDataSetInvalidated();
else
notifyDataSetChanged();
}
};
public Filter getFilter() {
return particleFilter;
}
public void addItem(Node node, Object...params) {
ValMap map = nodeMap(node,
param_Integer(0, 0, params),
param(null, 1, params));
list.add(map);
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
convertView = inflater.inflate(R.layout.baustein_list_item, parent, false);
}
TextView textView = (TextView) convertView.findViewById(R.id.textView1);
ValMap map = (ValMap) list.get(position);
Node node = (Node) map.get(NODE);
Integer indents = (Integer)map.get(INDENTS);
Integer blocks = node != null ? Visitor.blockDepth(node) : (Integer)map.get(BLOCKS);
Token token = (Token) map.get(TOKEN);
boolean endToken = hasEndToken(map);
String text = indentedLine(
endToken ? token.image : Visitor.nodeInfo(node),
indentor,
indents,
blocks);
textView.setText(text);
textView = (TextView) convertView.findViewById(R.id.textView2);
text = Visitor.nodeCategory(endToken ? null : node);
textView.setText(text);
return convertView;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, MENU_ITEM_SEARCH, 0, R.string.menu_search)
.setShortcut('5', 's')
.setIcon(android.R.drawable.ic_menu_search);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_ITEM_SEARCH:
Helper.listViewSearch(false, this, null);
return true;
}
return super.onOptionsItemSelected(item);
}
public static class AnalysisTask extends Task<Boolean>
{
public AnalysisTask(Activity activity, Job<Boolean> followUp, Object... params) {
super(activity, followUp, params);
}
@Override
protected Boolean doInBackground(Object... params) {
boolean problem = false;
String text = param_String(null, 0, params);
String title = param_String("", 1, params);
if (notNullOrEmpty(text)) {
document = parse(new StringReader(text), title);
problem = problem();
if (title.length() > 0 && problem)
publishProgress(
new Intent(Dialogs.PROMPT_ACTION)
.putExtra(BaseDirective.PROMPT, title)
.putExtra(BaseDirective.VALUES, new String[]{getMessage()})
.putExtra(BaseDirective.TYPE, Dialogs.DIALOG_TEXT_INFO));
}
return problem;
}
}
}