package interdroid.swan.ui;
import interdroid.swan.R;
import interdroid.swan.swansong.Expression;
import interdroid.swan.swansong.ExpressionFactory;
import interdroid.swan.swansong.ExpressionParseException;
import interdroid.swan.swansong.LogicExpression;
import interdroid.swan.swansong.TriStateExpression;
import interdroid.swan.swansong.UnaryLogicOperator;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class ExpressionBuilderActivity extends Activity {
private final List<Expression> expressions = new ArrayList<Expression>();
private final BaseAdapter expressionlistAdapter = new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = new TextView(ExpressionBuilderActivity.this);
((TextView) convertView).setTextSize(14.0f);
}
((TextView) convertView).setText(expressions.get(position)
.toString());
if (position == currentPosition) {
convertView.setBackgroundColor(Color.RED);
} else {
convertView.setBackgroundColor(Color.TRANSPARENT);
}
return convertView;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public Object getItem(int position) {
return expressions.get(position);
}
@Override
public int getCount() {
return expressions.size();
}
};
private final static String TAG = "Expression Builder";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setResult(RESULT_CANCELED);
setContentView(R.layout.expression_builder);
findViewById(R.id.new_expression).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivityForResult(new Intent(
getApplicationContext(),
NewExpressionDialog.class), 0);
}
});
findViewById(R.id.merge_expression).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
if (expressions.size() >= 2) {
// we need at least two expression to merge
ArrayList<String> expressionList = new ArrayList<String>();
for (Expression expression : expressions) {
expressionList.add(expression.toParseString());
}
Intent request = new Intent(
getApplicationContext(),
MergeExpressionDialog.class);
request.putStringArrayListExtra("Expressions",
expressionList);
startActivityForResult(request, 0);
} else {
Toast.makeText(
getApplicationContext(),
"At least 2 expressions needed for merging. Create them with the new button",
Toast.LENGTH_LONG).show();
}
}
});
findViewById(R.id.negate_expression).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
// showDialog(DIALOG_NEGATE_EXPRESSION);
}
});
((ListView) findViewById(R.id.expression_list))
.setAdapter(expressionlistAdapter);
((ListView) findViewById(R.id.expression_list))
.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
currentPosition = position;
findViewById(R.id.expression_finished).setEnabled(true);
parent.invalidate();
}
});
registerForContextMenu(findViewById(R.id.expression_list));
findViewById(R.id.expression_finished).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
if (currentPosition >= 0
&& currentPosition < expressions.size()) {
String expression = expressions
.get(currentPosition).toParseString();
setResult(RESULT_OK, new Intent().putExtra(
"Expression", expression));
finish();
} else {
Toast.makeText(getApplicationContext(),
"Please Select an Expression",
Toast.LENGTH_SHORT).show();
}
}
});
}
private int currentPosition = -1;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (data.hasExtra("Expression")) {
try {
expressions.add(ExpressionFactory.parse(data
.getStringExtra("Expression")));
expressionlistAdapter.notifyDataSetChanged();
} catch (ExpressionParseException e) {
// should not happen, already checked for in new expression
// dialog
Log.e(TAG, "should not happen: " + e);
}
} else if (data.hasExtra("Expressions")) {
expressions.clear();
for (String expression : data
.getStringArrayListExtra("Expressions")) {
try {
expressions.add(ExpressionFactory.parse(expression));
} catch (ExpressionParseException e) {
// should not happen
e.printStackTrace();
}
}
expressionlistAdapter.notifyDataSetChanged();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.add("Negate");
menu.add("Delete");
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
int position = ((AdapterContextMenuInfo) item.getMenuInfo()).position;
if (item.getTitle().toString().equals("Negate")) {
expressions.set(position, new LogicExpression(
Expression.LOCATION_INFER, UnaryLogicOperator.NOT,
(TriStateExpression) expressions.get(position)));
expressionlistAdapter.notifyDataSetChanged();
} else if (item.getTitle().toString().equals("Delete")) {
expressions.remove(position);
expressionlistAdapter.notifyDataSetChanged();
}
return super.onContextItemSelected(item);
}
/*** OLD STUFF ***/
}