com.dpcsoftware.mn.EditCategories.java Source code

Java tutorial

Introduction

Here is the source code for com.dpcsoftware.mn.EditCategories.java

Source

/*
 *   Copyright 2013, 2014 Daniel Pereira Coelho
 *   
 *   This file is part of the Expenses Android Application.
 *
 *   Expenses is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation in version 3.
 *
 *   Expenses is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with Expenses.  If not, see <http://www.gnu.org/licenses/>.
 * 
 */

package com.dpcsoftware.mn;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.widget.CursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;

public class EditCategories extends SherlockActivity {
    private App app;
    private ListView lv;
    private CategoriesAdapter adapter;
    private boolean comingFromAddEx = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        lv = new ListView(EditCategories.this);
        app = (App) getApplication();

        renderCategories();

        getSupportActionBar().setTitle(R.string.editcategories_c1);

        Bundle args = getIntent().getExtras();
        if (args != null && args.getBoolean("ADD_CATEGORY", false) == true) {
            comingFromAddEx = true;
            AddEditDialog addDg = new AddEditDialog(this, null, AddEditDialog.ADD);
            addDg.show();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getSupportMenuInflater().inflate(R.menu.categories, menu);
        return true;
    }

    @Override
    public View findViewById(int id) {
        return lv.findViewById(id);
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.item1:
            AddEditDialog addDg = new AddEditDialog(this, null, AddEditDialog.ADD);
            addDg.show();
            break;
        }
        return true;
    }

    private void renderCategories() {
        SQLiteDatabase db = DatabaseHelper.quickDb(this, 0);
        Cursor c = db
                .rawQuery(
                        "SELECT " + Db.Table2._ID + "," + Db.Table2.COLUMN_NCAT + "," + Db.Table2.COLUMN_CORCAT
                                + " FROM " + Db.Table2.TABLE_NAME + " ORDER BY " + Db.Table2.COLUMN_NCAT + " ASC",
                        null);
        if (adapter == null) {
            adapter = new CategoriesAdapter(this, c);
            lv.setAdapter(adapter);
            setContentView(lv);
        } else {
            adapter.swapCursor(c);
            adapter.notifyDataSetChanged();
        }
        db.close();
    }

    private class CategoriesAdapter extends CursorAdapter implements OnClickListener {
        private LayoutInflater mInflater;

        public CategoriesAdapter(Context context, Cursor c) {
            super(context, c, 0);
            mInflater = LayoutInflater.from(context);
        }

        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            return mInflater.inflate(R.layout.editcategories_listitem, parent, false);
        }

        public void bindView(View view, Context context, Cursor cursor) {
            ((ImageView) view.findViewById(R.id.imageViewCategory)).getDrawable().setColorFilter(cursor.getInt(2),
                    App.colorFilterMode);
            ((TextView) view.findViewById(R.id.textViewCategory)).setText(cursor.getString(1));
            ImageButton btEdit = (ImageButton) view.findViewById(R.id.imageButtonEdit);
            btEdit.setOnClickListener(this);
            btEdit.setTag(Integer.valueOf(cursor.getPosition()));
            ImageButton btDelete = (ImageButton) view.findViewById(R.id.imageButtonDelete);
            btDelete.setOnClickListener(this);
            btDelete.setTag(Integer.valueOf(cursor.getPosition()));
        }

        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.imageButtonDelete:
                if (getCursor().getCount() == 1) {
                    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(EditCategories.this);
                    dialogBuilder.setTitle(R.string.editcategories_c2);
                    dialogBuilder.setMessage(R.string.editcategories_c3);
                    dialogBuilder.create().show();
                } else {
                    Bundle args = new Bundle();
                    args.putLong("DELETE_ID", getItemId((Integer) v.getTag()));
                    DeleteDialog delDg = new DeleteDialog(EditCategories.this, args);
                    delDg.show();
                }
                break;
            case R.id.imageButtonEdit:
                Bundle args2 = new Bundle();
                args2.putLong("EDIT_ID", getItemId((Integer) v.getTag()));
                Cursor c = getCursor();
                c.moveToPosition((Integer) v.getTag());
                args2.putString("CURRENT_NAME", c.getString(c.getColumnIndex(Db.Table2.COLUMN_NCAT)));
                args2.putInt("CURRENT_COLOR", c.getInt(c.getColumnIndex(Db.Table2.COLUMN_CORCAT)));
                AddEditDialog edtDg = new AddEditDialog(EditCategories.this, args2, AddEditDialog.EDIT);
                edtDg.show();
                break;
            }
        }

    }

    private class DeleteDialog extends Dialog implements OnCheckedChangeListener, View.OnClickListener {
        private long deleteId;

        public DeleteDialog(Context ctx, Bundle args) {
            super(ctx);

            setContentView(R.layout.editgroupseditcategories_deldialog);
            deleteId = args.getLong("DELETE_ID");

            ((RadioButton) findViewById(R.id.radio0)).setText(R.string.editcategories_c4);
            ((RadioButton) findViewById(R.id.radio1)).setText(R.string.editcategories_c5);

            Spinner sp = (Spinner) findViewById(R.id.spinner1);
            SQLiteDatabase db = DatabaseHelper.quickDb(EditCategories.this, 0);
            Cursor c = db.rawQuery("SELECT " + Db.Table2._ID + "," + Db.Table2.COLUMN_NCAT + " FROM "
                    + Db.Table2.TABLE_NAME + " WHERE " + Db.Table2._ID + " <> " + deleteId + " ORDER BY "
                    + Db.Table2.COLUMN_NCAT + " ASC", null);
            SimpleCursorAdapter adapter = new SimpleCursorAdapter(EditCategories.this,
                    android.R.layout.simple_spinner_item, c, new String[] { Db.Table2.COLUMN_NCAT },
                    new int[] { android.R.id.text1 }, 0);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            sp.setAdapter(adapter);
            sp.setEnabled(false);

            setTitle(R.string.editcategories_c6);

            ((RadioButton) findViewById(R.id.radio1)).setOnCheckedChangeListener(this);
            ((Button) findViewById(R.id.button1)).setOnClickListener(this);
            ((Button) findViewById(R.id.button2)).setOnClickListener(this);
            db.close();
        }

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            ((Spinner) findViewById(R.id.spinner1)).setEnabled(isChecked);
        }

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.button1:
                this.dismiss();
                break;
            case R.id.button2:
                deleteGroup();
                break;
            }

        }

        private void deleteGroup() {
            SQLiteDatabase db = DatabaseHelper.quickDb(EditCategories.this, 1);
            RadioGroup rg = (RadioGroup) findViewById(R.id.radioGroup1);
            int toastString;

            int result = db.delete(Db.Table2.TABLE_NAME, new String(Db.Table2._ID + " = " + deleteId), null);
            if (result == 1) {
                if (rg.getCheckedRadioButtonId() == R.id.radio0)
                    db.delete(Db.Table1.TABLE_NAME, Db.Table1.COLUMN_IDCAT + " = " + deleteId, null);
                else {
                    ContentValues cv = new ContentValues();
                    cv.put(Db.Table1.COLUMN_IDCAT, ((Spinner) findViewById(R.id.spinner1)).getSelectedItemId());
                    db.update(Db.Table1.TABLE_NAME, cv, new String(Db.Table1.COLUMN_IDCAT + " = " + deleteId),
                            null);
                }
                toastString = R.string.editcategories_c12;
                app.setFlag(1);
                app.setFlag(2);
                renderCategories();
                this.dismiss();
            } else
                toastString = R.string.editcategories_c13;

            Toast ts = Toast.makeText(EditCategories.this, toastString, Toast.LENGTH_SHORT);
            ts.show();
            db.close();
        }
    }

    private class AddEditDialog extends Dialog implements View.OnClickListener {
        public static final int ADD = 0, EDIT = 1;
        private long editId;
        private int mode, selectedColor;
        private int[] colors = { R.color.c0, R.color.c1, R.color.c2, R.color.c3, R.color.c4, R.color.c5, R.color.c6,
                R.color.c7, R.color.c8, R.color.c9, R.color.c10, R.color.c11, R.color.c12, R.color.c13, R.color.c14,
                R.color.c15 };
        private LinearLayout colorList;
        private View.OnClickListener selectColorListener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ImageView target = (ImageView) findViewById(R.id.imageView1);
                target.getDrawable().clearColorFilter();
                selectedColor = getResources().getColor(colors[colorList.indexOfChild(v)]);
                target.getDrawable().setColorFilter(selectedColor, App.colorFilterMode);
                target.invalidate();
            }
        };

        public AddEditDialog(Context ctx, Bundle args, int md) {
            super(ctx);
            setContentView(R.layout.editcategories_editdialog);
            mode = md;

            colorList = (LinearLayout) findViewById(R.id.colorList);
            int i;
            for (i = 0; i < 16; i++) {
                ImageButton item = new ImageButton(EditCategories.this);
                item.setImageResource(R.drawable.square_shape);
                item.setPadding(15, 15, 15, 15);
                item.getDrawable().setColorFilter(getResources().getColor(colors[i]), App.colorFilterMode);
                item.setOnClickListener(selectColorListener);
                colorList.addView(item);
            }

            if (mode == ADD) {
                setTitle(R.string.editcategories_c7);
                colorList.getChildAt(0).performClick();
            } else {
                setTitle(R.string.editcategories_c8);
                editId = args.getLong("EDIT_ID");
                selectedColor = args.getInt("CURRENT_COLOR");
                ImageView target = (ImageView) findViewById(R.id.imageView1);
                target.getDrawable().setColorFilter(selectedColor, App.colorFilterMode);
                ((EditText) findViewById(R.id.editText1)).setText(args.getString("CURRENT_NAME"));
            }

            ((Button) findViewById(R.id.button1)).setOnClickListener(this);
            ((Button) findViewById(R.id.button2)).setOnClickListener(this);

            ((EditText) findViewById(R.id.editText1)).setOnFocusChangeListener(new OnFocusChangeListener() {
                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    if (hasFocus) {
                        AddEditDialog.this.getWindow()
                                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                    }
                }
            });
        }

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.button2:
                if (((EditText) findViewById(R.id.editText1)).getText().toString().equals("")) {
                    App.Toast(EditCategories.this, R.string.editcategories_c14);
                    return;
                }
                saveGroupName();
                break;
            case R.id.button1:
                this.dismiss();
                break;
            }

            if (comingFromAddEx == true)
                EditCategories.this.finish();
        }

        private void saveGroupName() {
            SQLiteDatabase db = DatabaseHelper.quickDb(EditCategories.this, 1);
            ContentValues cv = new ContentValues();
            cv.put(Db.Table2.COLUMN_NCAT, ((EditText) findViewById(R.id.editText1)).getText().toString());
            cv.put(Db.Table2.COLUMN_CORCAT, selectedColor);
            long result;
            if (mode == EDIT)
                result = db.update(Db.Table2.TABLE_NAME, cv, Db.Table2._ID + " = " + editId, null);
            else
                result = db.insert(Db.Table2.TABLE_NAME, null, cv);
            int toastText;
            if ((mode == EDIT && result == 1) | (mode == ADD && result != -1)) {
                if (mode == EDIT)
                    toastText = R.string.editcategories_c9;
                else
                    toastText = R.string.editcategories_c10;
                app.setFlag(2);
                if (comingFromAddEx == true) {
                    app.addExUpdateCategoryId = result;
                    app.addExUpdateCategories = true;
                }
                renderCategories();
                this.dismiss();
            } else
                toastText = R.string.editcategories_c11;
            App.Toast(EditCategories.this, toastText);
            db.close();
        }
    }

}