/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.redgeek.android.eventrend.synthetic; import net.redgeek.android.eventrend.EvenTrendActivity; import net.redgeek.android.eventrend.R; import net.redgeek.android.eventrend.db.CategoryDbTable; import net.redgeek.android.eventrend.util.DynamicSpinner; import android.app.Dialog; import android.database.Cursor; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; public class FormulaEditorActivity extends EvenTrendActivity { private static final int FORMULA_HELP_MENU_ITEM = Menu.FIRST; private static final int HELP_DIALOG = 0; private static final int PARSE_ERROR_DIALOG = 1; // UI elements private EditText mPage; private DynamicSpinner mAddSeries; private Spinner mAddOperator; private DynamicSpinner mAddConstant; private Button mAddGroupButton; private Button mClearButton; private Button mSaveButton; private Button mCancelButton; // Listeners private Spinner.OnItemSelectedListener mAddSeriesListener; private Spinner.OnItemSelectedListener mAddOperatorListener; private Spinner.OnItemSelectedListener mAddConstantListener; private View.OnClickListener mAddGroupListener; private View.OnClickListener mClearListener; private View.OnClickListener mSaveListener; private View.OnClickListener mCancelListener; // private data private Formula mFormula; private long mCatId; private boolean mSave; private String mText; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.formula_edit); setupData(icicle); setupUI(); populateFields(); } private void setupData(Bundle icicle) { mText = new String(""); mCatId = -1; if (icicle != null) { mCatId = icicle.getLong(CATEGORY_ID); if (icicle.getString(FORMULA_TEXT) != null) mText = new String(icicle.getString(FORMULA_TEXT)); } if (mCatId < 0) { Bundle extras = getIntent().getExtras(); if (extras != null) { mCatId = extras.getLong(CATEGORY_ID); if (mText.equals("")) if (extras.getString(FORMULA_TEXT) != null) mText = new String(extras.getString(FORMULA_TEXT)); } } mSave = false; mFormula = new Formula(); } private void setupUI() { setupListeners(); LinearLayout addMenuLayout = (LinearLayout) findViewById(R.id.formula_add_series_layout); mAddSeries = new DynamicSpinner(getCtx()); mAddSeries.setPrompt("Insert Category"); addMenuLayout.addView(mAddSeries, new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); mAddSeries.addSpinnerItem("(Series)", new Long(0)); Cursor c = getDbh().fetchAllCategories(); c.moveToFirst(); for (int i = 0; i < c.getCount(); i++) { long id = CategoryDbTable.getId(c); String name = CategoryDbTable.getCategoryName(c); mAddSeries.addSpinnerItem(name, new Long(id)); c.moveToNext(); } c.close(); mAddSeries.setSelected(false); mAddSeries.setOnItemSelectedListener(mAddSeriesListener); mAddOperator = (Spinner) findViewById(R.id.formula_operator_menu); mAddOperator.setPrompt("Insert Operator"); ArrayAdapter adapter = ArrayAdapter.createFromResource( this, R.array.formula_operators, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mAddOperator.setAdapter(adapter); mAddOperator.setOnItemSelectedListener(mAddOperatorListener); mAddConstant = new DynamicSpinner(getCtx()); mAddConstant.setPrompt("Insert Contant"); LinearLayout addConstantLayout = (LinearLayout) findViewById(R.id.formula_add_constant_layout); addConstantLayout.addView(mAddConstant, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); mAddConstant.addSpinnerItem("(Constant)", new Long(0)); for (int i = 0; i < CategoryDbTable.KEY_PERIODS.length; i++) { if (CategoryDbTable.KEY_PERIODS[i].equals("None") == false) { mAddConstant.addSpinnerItem(CategoryDbTable.KEY_PERIODS[i], new Long(i)); } } mAddConstant.setOnItemSelectedListener(mAddConstantListener); mAddGroupButton = (Button) findViewById(R.id.formula_add_group); mAddGroupButton.setOnClickListener(mAddGroupListener); mClearButton = (Button) findViewById(R.id.formula_clear); mClearButton.setOnClickListener(mClearListener); mSaveButton = (Button) findViewById(R.id.formula_save); mSaveButton.setOnClickListener(mSaveListener); mCancelButton = (Button) findViewById(R.id.formula_cancel); mCancelButton.setOnClickListener(mCancelListener); mPage = (EditText) findViewById(R.id.formula_edit); mPage.setText(mText); } private void setupListeners() { mAddSeriesListener = new Spinner.OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View v, int position, long id) { if (position != 0) { int cursor = mPage.getSelectionStart(); String series = Tokenizer.escape(((TextView) v).getText().toString()); mPage.getText().insert(cursor, "series \"" + series + "\""); } mAddSeries.setSelection(0); return; } public void onNothingSelected(AdapterView arg0) { return; } }; mAddOperatorListener = new Spinner.OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View v, int position, long id) { if (position != 0) { int cursor = mPage.getSelectionStart(); String operator = ((TextView) v).getText().toString(); mPage.getText().insert(cursor, " " + operator + " "); } mAddOperator.setSelection(0); return; } public void onNothingSelected(AdapterView arg0) { return; } }; mAddConstantListener = new Spinner.OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View v, int position, long id) { if (position != 0) { int cursor = mPage.getSelectionStart(); String constant = ((TextView) v).getText().toString(); mPage.getText().insert(cursor, constant); } mAddSeries.setSelection(0); return; } public void onNothingSelected(AdapterView arg0) { return; } }; mAddGroupListener = new View.OnClickListener() { public void onClick(View view) { int cursor = mPage.getSelectionStart(); mPage.getText().insert(cursor, "( )"); } }; mClearListener = new View.OnClickListener() { public void onClick(View view) { mPage.getText().clear(); } }; mSaveListener = new View.OnClickListener() { public void onClick(View view) { // TODO: try parsing, check result mFormula.setFormula(mPage.getText().toString()); if (mFormula.isValid()) { mSave = true; setResult(RESULT_OK); finish(); } else { showDialog(PARSE_ERROR_DIALOG); } } }; mCancelListener = new View.OnClickListener() { public void onClick(View view) { finish(); } }; } public void setupMenu() { } private String escape(String escape) { String escapedName = ""; for (int i = 0; i < escape.length(); i++) { char c = escape.charAt(i); if (c == '\\' || c == '"') { escapedName += '\\'; } escapedName += c; } return escapedName; } private void populateFields() { CategoryDbTable.Row row = getDbh().fetchCategory(mCatId); if (mText.equals("")) mPage.setText(row.getFormula()); else mPage.setText(mText); } @Override public boolean onCreateOptionsMenu(Menu menu) { boolean result = super.onCreateOptionsMenu(menu); menu.add(0, FORMULA_HELP_MENU_ITEM, 0, R.string.menu_app_help).setIcon( R.drawable.help); return result; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case FORMULA_HELP_MENU_ITEM: showDialog(HELP_DIALOG); return true; } return super.onOptionsItemSelected(item); } @Override protected Dialog onCreateDialog(int id) { String str; switch (id) { case HELP_DIALOG: str = getResources().getString(R.string.formula_help); return getDialogUtil().newOkDialog("Help", str); case PARSE_ERROR_DIALOG: str = mFormula.getErrorString(); return getDialogUtil().newOkDialog("Parse Eror", str); default: } return null; } @Override protected void onSaveInstanceState(Bundle outState) { outState.putLong(CATEGORY_ID, mCatId); outState.putString(FORMULA_TEXT, mPage.getText().toString()); super.onSaveInstanceState(outState); } @Override protected void onPause() { super.onPause(); saveState(); } @Override protected void onResume() { super.onResume(); populateFields(); } private void saveState() { if (mSave == true) { CategoryDbTable.Row cat = getDbh().fetchCategory(mCatId); cat.setFormula(mFormula.toString()); getDbh().updateCategory(cat); // mFormula.parseString(mPage.getText().toString()); // String s = mFormula.toString(); // getIntent().putExtra(FORMULA, s); } } }