package com.example.wordbook;

import java.io.File;
import java.io.FilenameFilter;
import java.io.Serializable;
import java.text.MessageFormat;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.example.wordbook.Eula.OnEulaAgreedTo;
import com.example.wordbook.common.Common;
import com.example.wordbook.common.DBAccess;
import com.example.wordbook.common.Message;
import com.example.wordbook.task.AsyncTaskBase.OnAsyncTaskFinished;
import com.example.wordbook.task.AsyncTaskClear;
import com.example.wordbook.task.AsyncTaskDelete;
import com.example.wordbook.task.AsyncTaskExport;
import com.example.wordbook.task.AsyncTaskImport;

/**
 * メイン画面クラス
 */
public class MainActivity extends Activity implements OnAsyncTaskFinished,
		OnEulaAgreedTo {

	/** TAG */
	private static final String TAG = MainActivity.class.getSimpleName();

	/** タイトル編集ダイアログ */
	private static final int DIALOG_EDIT_TITLE = 0;
	/** Import選択ダイアログ */
	private static final int DIALOG_SELECT_IMPORT = 11;
	/** Export選択ダイアログ */
	private static final int DIALOG_SELECT_EXPORT = 12;
	/** Clear選択ダイアログ */
	private static final int DIALOG_SELECT_CLEAR = 13;
	/** Delete選択ダイアログ */
	private static final int DIALOG_SELECT_DELETE = 14;

	/** インスタンス状態用単語帳情報位置キー */
	private static final String IS_POS = "pos";
	/** インスタンス状態用単語帳情報リストキー */
	private static final String IS_MAIN = "main";

	/** 詳細画面リクエストコード */
	private static final int ACTIVITY_DETAIL = 1;
	/** 四択画面リクエストコード */
	private static final int ACTIVITY_CHOICE = 2;
	/** 一覧画面リクエストコード */
	private static final int ACTIVITY_SIMPLE = 3;
	/** 設定画面リクエストコード */
	private static final int ACTIVITY_PREF = 4;

	/** 単語帳DB問題集入力タスク */
	private static AsyncTaskImport mTaskImport = null;
	/** 単語帳DB問題集出力タスク */
	private static AsyncTaskExport mTaskExport = null;
	/** 単語帳DB成績クリアタスク */
	private static AsyncTaskClear mTaskClear = null;
	/** 単語帳DB問題集削除タスク */
	private static AsyncTaskDelete mTaskDelete = null;

	/** 試験形式 */
	private int mType;

	/** 単語帳情報位置 */
	private int mPos;
	/** 単語帳情報リスト */
	private List<Map<String, Object>> mMain;

	/** ハンドル領域タッチ状態 */
	private boolean mDragFlag;
	/** ドラッグ中オブジェクト */
	private Map<String, Object> mDragData;

	/** ListView */
	private ListView mListView;

	/*
	 * (非 Javadoc)
	 * 
	 * @see android.app.Activity#onCreate(android.os.Bundle)
	 */
	@SuppressWarnings("unchecked")
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.d(TAG, "onCreate()");

		// EULA表示
		Eula.show(this);

		// 状態復帰
		if (savedInstanceState != null) {
			mPos = savedInstanceState.getInt(IS_POS);
			mMain = (List<Map<String, Object>>) savedInstanceState
					.getSerializable(IS_MAIN);
		} else {
			mPos = 0;
			mMain = Common.getWordbookPrefList(getApplicationContext());
			// 単語帳情報リスト順序設定
			Common.setPrefListOrder(getApplicationContext(), mMain);
		}
		Log.d(TAG, "pos=" + mPos + "/main=" + mMain.size());

		// 設定取得
		mType = Common.getType(getApplicationContext());

		// レイアウト設定
		setContentView(R.layout.main);

		// データ無しメッセージ設定
		TextView empty = (TextView) findViewById(R.id.empty);
		String msg = MessageFormat.format(getString(R.string.msg_nodata_main),
				new Object[] { Common.WORDBOOK_DIRECTORY });
		empty.setText(msg);

		// ListView設定
		mListView = (ListView) findViewById(R.id.list);
		mListView.setEmptyView(empty);

		// アダプタ設定
		final MainAdapter adp = new MainAdapter(this, mMain,
				R.layout.list_main, new String[] { Common.WORDBOOK_TITLE,
						Common.WORDBOOK_VALUE }, new int[] {
						android.R.id.text1, android.R.id.text2 });
		mListView.setAdapter(adp);

		// クリック用イベントリスナ設定
		mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				doItemClick(parent, position, id);
			}
		});

		// ロングクリック用イベントリスナ設定
		mListView
				.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
					@Override
					public boolean onItemLongClick(AdapterView<?> parent,
							View view, int position, long id) {
						return doItemLongClick(parent, position, id);
					}
				});

		// タッチ用イベントリスナ設定
		mListView.setOnTouchListener(new View.OnTouchListener() {
			@Override
			public boolean onTouch(View view, MotionEvent event) {
				return doItemTouch(event);
			}
		});

		// アイコン用イベントリスナ設定
		final ImageView img1 = (ImageView) findViewById(R.id.imageViewImport);
		img1.setOnClickListener(new View.OnClickListener() {
			@SuppressWarnings("deprecation")
			@Override
			public void onClick(View view) {
				showDialog(DIALOG_SELECT_IMPORT);
			}
		});
		final ImageView img2 = (ImageView) findViewById(R.id.imageViewExport);
		img2.setOnClickListener(new View.OnClickListener() {
			@SuppressWarnings("deprecation")
			@Override
			public void onClick(View view) {
				showDialog(DIALOG_SELECT_EXPORT);
			}
		});
		final ImageView img3 = (ImageView) findViewById(R.id.imageViewClear);
		img3.setOnClickListener(new View.OnClickListener() {
			@SuppressWarnings("deprecation")
			@Override
			public void onClick(View view) {
				showDialog(DIALOG_SELECT_CLEAR);
			}
		});
		final ImageView img4 = (ImageView) findViewById(R.id.imageViewDelete);
		img4.setOnClickListener(new View.OnClickListener() {
			@SuppressWarnings("deprecation")
			@Override
			public void onClick(View view) {
				showDialog(DIALOG_SELECT_DELETE);
			}
		});
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see android.app.Activity#onResume()
	 */
	@Override
	protected void onResume() {
		super.onResume();
		Log.d(TAG, "onResume()");

		// 単語帳DB問題集入力タスク用ダイアログ復帰
		if (mTaskImport != null
				&& mTaskImport.getStatus() == AsyncTask.Status.RUNNING) {
			mTaskImport.showDialog(this);
		}
		// 単語帳DB問題集出力タスク用ダイアログ復帰
		if (mTaskExport != null
				&& mTaskExport.getStatus() == AsyncTask.Status.RUNNING) {
			mTaskExport.showDialog(this);
		}
		// 単語帳DB成績クリアタスク用ダイアログ復帰
		if (mTaskClear != null
				&& mTaskClear.getStatus() == AsyncTask.Status.RUNNING) {
			mTaskClear.showDialog(this);
		}
		// 単語帳DB問題集削除タスク用ダイアログ復帰
		if (mTaskDelete != null
				&& mTaskDelete.getStatus() == AsyncTask.Status.RUNNING) {
			mTaskDelete.showDialog(this);
		}
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see android.app.Activity#onPause()
	 */
	@Override
	protected void onPause() {
		super.onPause();
		Log.d(TAG, "onPause()");

		// 単語帳DB問題集入力タスク用ダイアログ除去
		if (mTaskImport != null
				&& mTaskImport.getStatus() == AsyncTask.Status.RUNNING) {
			mTaskImport.dismissDialog();
		}
		// 単語帳DB問題集出力タスク用ダイアログ除去
		if (mTaskExport != null
				&& mTaskExport.getStatus() == AsyncTask.Status.RUNNING) {
			mTaskExport.dismissDialog();
		}
		// 単語帳DB成績クリアタスク用ダイアログ除去
		if (mTaskClear != null
				&& mTaskClear.getStatus() == AsyncTask.Status.RUNNING) {
			mTaskClear.dismissDialog();
		}
		// 単語帳DB問題集削除タスク用ダイアログ除去
		if (mTaskDelete != null
				&& mTaskDelete.getStatus() == AsyncTask.Status.RUNNING) {
			mTaskDelete.dismissDialog();
		}
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see android.app.Activity#onSaveInstanceState(android.os.Bundle)
	 */
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		Log.d(TAG, "onSaveInstanceState()");

		// 状態保存
		outState.putInt(IS_POS, mPos);
		outState.putSerializable(IS_MAIN, (Serializable) mMain);
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see android.app.Activity#onCreateDialog(int)
	 */
	@Override
	protected Dialog onCreateDialog(int id) {

		switch (id) {
		case DIALOG_EDIT_TITLE:
			// タイトル編集ダイアログ生成
			return getDialogTitle();
		case DIALOG_SELECT_IMPORT:
			// Import選択ダイアログ生成
			return getDialogImport();
		case DIALOG_SELECT_EXPORT:
			// Export選択ダイアログ生成
			return getDialogExport();
		case DIALOG_SELECT_CLEAR:
			// Clear選択ダイアログ生成
			return getDialogClear();
		case DIALOG_SELECT_DELETE:
			// Delete選択ダイアログ生成
			return getDialogDelete();
		default:
			Log.w(TAG, "onCreateDialog() id=" + id);
			return null;
		}
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see android.app.Activity#onPrepareDialog(int, android.app.Dialog)
	 */
	@Override
	protected void onPrepareDialog(int id, Dialog dialog) {

		switch (id) {
		case DIALOG_EDIT_TITLE:
			// タイトル編集ダイアログ準備
			setDialogTitle(dialog);
			break;
		case DIALOG_SELECT_IMPORT:
			// Import選択ダイアログ準備
			// 処理無し
			break;
		case DIALOG_SELECT_EXPORT:
			// Export選択ダイアログ準備
			// 処理無し
			break;
		case DIALOG_SELECT_CLEAR:
			// Clear選択ダイアログ準備
			// 処理無し
			break;
		case DIALOG_SELECT_DELETE:
			// Delete選択ダイアログ準備
			// 処理無し
			break;
		default:
			Log.w(TAG, "onPrepareDialog() id=" + id);
			break;
		}
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see android.app.Activity#onActivityResult(int, int,
	 * android.content.Intent)
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		Log.d(TAG, "onActivityResult()");

		// 遷移元アクティビティ識別
		switch (requestCode) {
		case ACTIVITY_DETAIL:
			// break;
		case ACTIVITY_CHOICE:
			// 単語帳情報更新必要
			Bundle ext = data.getExtras();
			if (ext != null) {
				saveResult(ext.getInt(Common.INTENT_INDEX),
						ext.getInt(Common.INTENT_BASE));
			}
			break;
		case ACTIVITY_SIMPLE:
			// 単語帳情報更新不要
			break;
		case ACTIVITY_PREF:
			// 設定画面から戻った後はメイン画面で必要な情報を更新すること
			// 試験形式更新
			mType = Common.getType(getApplicationContext());
			// 単語帳情報リスト一括更新（管理画面修正処理対応）
			updateWordbookPrefList();
			break;
		default:
			Log.w(TAG, "onActivityResult() code=" + requestCode);
			break;
		}
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
	 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		getMenuInflater().inflate(R.menu.main, menu);

		return true;
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see android.app.Activity#onMenuItemSelected(int, android.view.MenuItem)
	 */
	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item) {

		int id = item.getItemId();
		switch (id) {
		case R.id.menu_search:
			onSearchRequested();
			break;
		case R.id.menu_settings:
			startActivityForResult(new Intent(getApplicationContext(),
					PrefActivity.class), ACTIVITY_PREF);
			break;
		case R.id.menu_help:
			startActivity(new Intent(getApplicationContext(),
					HelpActivity.class));
			break;
		default:
			Log.w(TAG, "onMenuItemSelected() id=" + id);
			break;
		}

		return true;
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see AsyncTaskBase.OnAsyncTaskFinished#onAsyncTaskFinished()
	 */
	@Override
	public void onAsyncTaskFinished() {
		Log.d(TAG, "onAsyncTaskFinished()");

		// 設定ファイル更新
		Common.modPrefListOrder(getApplicationContext(), mMain);

		// 単語帳情報リスト一括更新（メイン画面DB処理対応）
		updateWordbookPrefList();
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see Eula.OnEulaAgreedTo#onEulaAgreedTo()
	 */
	@Override
	public void onEulaAgreedTo() {
		Log.d(TAG, "onEulaAgreedTo()");
	}

	/**
	 * 単語帳情報リスト一括更新
	 */
	private void updateWordbookPrefList() {

		List<Map<String, Object>> list = Common
				.getWordbookPrefList(getApplicationContext());
		// 単語帳情報リスト順序設定
		Common.setPrefListOrder(getApplicationContext(), list);
		mMain.clear();
		mMain.addAll(list);
		// 単語帳情報リスト反映
		((BaseAdapter) mListView.getAdapter()).notifyDataSetChanged();
	}

	/**
	 * タイトル編集ダイアログ生成
	 * 
	 * @return タイトル編集ダイアログ
	 */
	private AlertDialog getDialogTitle() {

		// ダイアログ生成
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setCancelable(false);
		builder.setTitle(getString(R.string.title_editdialog));
		// インフレート対象にダイアログ用テーマを反映
		LayoutInflater inflater = builder.create().getLayoutInflater();
		View view = inflater.inflate(R.layout.dlg_edit, null);
		// ビュー取得
		final EditText edit = (EditText) view.findViewById(R.id.editText);
		// イベントリスナ設定
		builder.setPositiveButton(android.R.string.ok,
				new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						int index = (Integer) mMain.get(mPos).get(
								Common.WORDBOOK_INDEX);
						String title = Common.normWordbookPrefTitle(mMain, edit
								.getText().toString());
						// 設定ファイル更新
						Common.modWordbookPref(getApplicationContext(), index,
								title, null, -1);
						// 単語帳情報リスト更新
						mMain.get(mPos).put(Common.WORDBOOK_TITLE, title);
						// 単語帳情報リスト反映
						((BaseAdapter) mListView.getAdapter())
								.notifyDataSetChanged();
					}
				});
		builder.setNegativeButton(android.R.string.cancel, null);

		builder.setView(view);
		return builder.create();
	}

	/**
	 * Import選択ダイアログ生成
	 * 
	 * @return Import選択ダイアログ
	 */
	private AlertDialog getDialogImport() {
		// リスト生成
		final String[] file = getFileArray();
		if (file.length == 0) {
			return null;
		}

		// ダイアログ生成
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setCancelable(false);
		builder.setTitle(getString(R.string.title_import));
		// イベントリスナ設定
		builder.setSingleChoiceItems(file, -1,
				new DialogInterface.OnClickListener() {
					@SuppressWarnings("deprecation")
					@Override
					public void onClick(DialogInterface dialog, int which) {
						// ダイアログ削除
						removeDialog(DIALOG_SELECT_IMPORT);
						// タスク生成
						mTaskImport = new AsyncTaskImport(MainActivity.this,
								true);
						mTaskImport.execute(file[which]);
					}
				});
		builder.setNegativeButton(android.R.string.cancel,
				new DialogInterface.OnClickListener() {
					@SuppressWarnings("deprecation")
					@Override
					public void onClick(DialogInterface dialog, int which) {
						// ダイアログ削除
						removeDialog(DIALOG_SELECT_IMPORT);
					}
				});

		return builder.create();
	}

	/**
	 * Export選択ダイアログ生成
	 * 
	 * @return Export選択ダイアログ
	 */
	private AlertDialog getDialogExport() {
		// リスト生成
		final String[] data = getDataArray();
		if (data.length == 0) {
			return null;
		}

		// ダイアログ生成
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setCancelable(false);
		builder.setTitle(getString(R.string.title_export));
		// イベントリスナ設定
		builder.setSingleChoiceItems(data, -1,
				new DialogInterface.OnClickListener() {
					@SuppressWarnings("deprecation")
					@Override
					public void onClick(DialogInterface dialog, int which) {
						// ダイアログ削除
						removeDialog(DIALOG_SELECT_EXPORT);
						// タスク生成
						mTaskExport = new AsyncTaskExport(MainActivity.this,
								true);
						mTaskExport.execute(data[which]);
					}
				});
		builder.setNegativeButton(android.R.string.cancel,
				new DialogInterface.OnClickListener() {
					@SuppressWarnings("deprecation")
					@Override
					public void onClick(DialogInterface dialog, int which) {
						// ダイアログ削除
						removeDialog(DIALOG_SELECT_EXPORT);
					}
				});

		return builder.create();
	}

	/**
	 * Clear選択ダイアログ生成
	 * 
	 * @return Clear選択ダイアログ
	 */
	private AlertDialog getDialogClear() {
		// リスト生成
		final String[] data = getDataArray();
		if (data.length == 0) {
			return null;
		}

		// ダイアログ生成
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setCancelable(false);
		builder.setTitle(getString(R.string.title_clear));
		// イベントリスナ設定
		final boolean[] select = new boolean[data.length];
		builder.setSingleChoiceItems(data, -1,
				new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						select[which] = true;
					}
				});
		builder.setPositiveButton(android.R.string.ok,
				new DialogInterface.OnClickListener() {
					@SuppressWarnings("deprecation")
					@Override
					public void onClick(DialogInterface dialog, int which) {
						for (int i = 0; i < select.length; i++) {
							if (select[i]) {
								// ダイアログ削除
								removeDialog(DIALOG_SELECT_CLEAR);
								// タスク生成
								mTaskClear = new AsyncTaskClear(
										MainActivity.this, false);
								mTaskClear.execute(data[i]);
								break;
							}
						}
					}
				});
		builder.setNegativeButton(android.R.string.cancel,
				new DialogInterface.OnClickListener() {
					@SuppressWarnings("deprecation")
					@Override
					public void onClick(DialogInterface dialog, int which) {
						// ダイアログ削除
						removeDialog(DIALOG_SELECT_CLEAR);
					}
				});

		return builder.create();
	}

	/**
	 * Delete選択ダイアログ生成
	 * 
	 * @return Delete選択ダイアログ
	 */
	private AlertDialog getDialogDelete() {
		// リスト生成
		final String[] data = getDataArray();
		if (data.length == 0) {
			return null;
		}

		// ダイアログ生成
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setCancelable(false);
		builder.setTitle(getString(R.string.title_delete));
		// イベントリスナ設定
		final boolean[] select = new boolean[data.length];
		builder.setSingleChoiceItems(data, -1,
				new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						select[which] = true;
					}
				});
		builder.setPositiveButton(android.R.string.ok,
				new DialogInterface.OnClickListener() {
					@SuppressWarnings("deprecation")
					@Override
					public void onClick(DialogInterface dialog, int which) {
						for (int i = 0; i < select.length; i++) {
							if (select[i]) {
								// ダイアログ削除
								removeDialog(DIALOG_SELECT_DELETE);
								// タスク生成
								mTaskDelete = new AsyncTaskDelete(
										MainActivity.this, false);
								mTaskDelete.execute(data[i]);
								break;
							}
						}
					}
				});
		builder.setNegativeButton(android.R.string.cancel,
				new DialogInterface.OnClickListener() {
					@SuppressWarnings("deprecation")
					@Override
					public void onClick(DialogInterface dialog, int which) {
						// ダイアログ削除
						removeDialog(DIALOG_SELECT_DELETE);
					}
				});

		return builder.create();
	}

	/**
	 * タイトル編集ダイアログ準備
	 * 
	 * @param dialog
	 *            タイトル編集ダイアログ
	 */
	private void setDialogTitle(Dialog dialog) {

		// 現状 タイトル設定
		EditText edit = (EditText) dialog.findViewById(R.id.editText);
		edit.setText(mMain.get(mPos).get(Common.WORDBOOK_TITLE).toString());
	}

	/**
	 * アイテムクリック処理
	 * 
	 * @param parent
	 *            AdapterView
	 * @param position
	 *            Position
	 * @param id
	 *            ID
	 */
	private void doItemClick(AdapterView<?> parent, int position, long id) {
		Log.d(TAG, "doItemClick() id=" + id);

		// 単語帳情報更新タスク動作時は処理無し
		if (mTask != null && mTask.getStatus() == AsyncTask.Status.RUNNING) {
			Log.w(TAG, "doItemClick()=RUNNING");
			return;
		}

		// クリック領域識別（ハンドル）
		if (id < 0) {
			// アダプタからタッチイベントを送信できないためIDで識別
			if (id == Common.ITEM_TOUCH) {
				// ダウン＆ドラッグ開始
				mPos = -1;
				mDragFlag = true;
				mDragData = mMain.get(position);
				mDragData.put(Common.WORDBOOK_HL, true);
				((BaseAdapter) mListView.getAdapter()).notifyDataSetChanged();
			} else {
				Log.w(TAG, "doItemClick() id=" + id);
			}
		} else {
			// 選択アイテム位置保存
			mPos = position;
			int index = (Integer) mMain.get(position)
					.get(Common.WORDBOOK_INDEX);
			int count = (Integer) mMain.get(position)
					.get(Common.WORDBOOK_COUNT);
			int base = (Integer) mMain.get(position).get(Common.WORDBOOK_BASE);
			String title = mMain.get(position).get(Common.WORDBOOK_TITLE)
					.toString();
			Intent intent;
			// 遷移先アクティビティ識別
			switch (mType) {
			case 0:
				// 詳細
				intent = new Intent(getApplicationContext(),
						DetailActivity.class);
				intent.putExtra(Common.INTENT_INDEX, index);
				intent.putExtra(Common.INTENT_COUNT, count);
				intent.putExtra(Common.INTENT_BASE, base);
				intent.putExtra(Common.INTENT_TITLE, title);
				startActivityForResult(intent, ACTIVITY_DETAIL);
				// overridePendingTransition(0, 0);
				break;
			case 1:
				// 四択
				intent = new Intent(getApplicationContext(),
						ChoiceActivity.class);
				intent.putExtra(Common.INTENT_INDEX, index);
				intent.putExtra(Common.INTENT_COUNT, count);
				intent.putExtra(Common.INTENT_BASE, base);
				intent.putExtra(Common.INTENT_TITLE, title);
				startActivityForResult(intent, ACTIVITY_CHOICE);
				// overridePendingTransition(0, 0);
				break;
			case 2:
				// 一覧
				intent = new Intent(getApplicationContext(),
						WBListActivity.class);
				intent.putExtra(Common.INTENT_INDEX, index);
				intent.putExtra(Common.INTENT_COUNT, count);
				intent.putExtra(Common.INTENT_TITLE, title);
				startActivityForResult(intent, ACTIVITY_SIMPLE);
				// overridePendingTransition(0, 0);
				break;
			default:
				Log.w(TAG, "doItemClick() type=" + mType);
				break;
			}
		}
	}

	/**
	 * アイテムロングクリック処理
	 * 
	 * @param parent
	 *            AdapterView
	 * @param position
	 *            Position
	 * @param id
	 *            ID
	 * @return イベント消費結果
	 */
	@SuppressWarnings("deprecation")
	private boolean doItemLongClick(AdapterView<?> parent, int position, long id) {
		Log.d(TAG, "doItemLongClick() id=" + id);

		// 単語帳情報更新タスク動作時は処理無し
		if (mTask != null && mTask.getStatus() == AsyncTask.Status.RUNNING) {
			Log.w(TAG, "doItemLongClick()=RUNNING");
			return true;
		}

		// 選択アイテム位置保存
		mPos = position;
		// タイトル編集ダイアログ表示
		showDialog(DIALOG_EDIT_TITLE);

		return true;
	}

	/**
	 * アイテムタッチ処理
	 * 
	 * @param event
	 *            MotionEvent
	 * @return イベント消費結果
	 */
	private boolean doItemTouch(MotionEvent event) {
		Log.v(TAG, "doItemTouch() event=" + event);

		// ハンドル領域ドラッグ中以外は処理無し
		if (!mDragFlag) {
			return false;
		}

		// ドラッグによるアイテム位置の入れ替え
		switch (event.getAction()) {
		case MotionEvent.ACTION_MOVE:
			// 位置算出
			int pos = mListView.pointToPosition((int) event.getX(),
					(int) event.getY());
			if (pos == AdapterView.INVALID_POSITION) {
				Log.w(TAG, "doItemTouch() pos=" + pos);
				break;
			}
			// 入れ替え
			if (pos != mPos) {
				mPos = pos;
				mMain.remove(mDragData);
				mMain.add(mPos, mDragData);
				((BaseAdapter) mListView.getAdapter()).notifyDataSetChanged();
			}
			return true;
		case MotionEvent.ACTION_UP:
		case MotionEvent.ACTION_CANCEL:
		case MotionEvent.ACTION_OUTSIDE:
			// アップ＆ドラッグ終了
			mPos = -1;
			mDragFlag = false;
			mDragData.put(Common.WORDBOOK_HL, false);
			mDragData = null;
			((BaseAdapter) mListView.getAdapter()).notifyDataSetChanged();

			// 設定ファイル更新
			Common.modPrefListOrder(getApplicationContext(), mMain);

			return true;
		case MotionEvent.ACTION_DOWN:
			// アダプタ側で処理済み
			break;
		default:
			// その他は処理無し
			break;
		}

		return false;
	}

	/**
	 * 検索フィルタ定義クラス
	 */
	private static class WBFilenameFilter implements FilenameFilter {
		@Override
		public boolean accept(File dir, String name) {
			// 拡張子でフィルタ
			return name.endsWith(Common.WORDBOOK_EXT);
		}
	};

	/**
	 * ファイル名リスト生成
	 * 
	 * @return ファイル名リスト
	 */
	private String[] getFileArray() {
		final WBFilenameFilter filter = new WBFilenameFilter();

		String[] array = new File(Common.WORDBOOK_DIRECTORY).list(filter);
		if (array == null) {
			array = new String[0];
		}
		// 存在しない場合はエラー表示
		if (array.length == 0) {
			Message.show(getApplicationContext(), Message.ID.FILE_NOT_FOUND);
		}

		return array;
	}

	/**
	 * データタイトルリスト生成
	 * 
	 * @return データタイトルリスト
	 */
	private String[] getDataArray() {

		int size = mMain.size();
		String[] array = new String[size];
		for (int i = 0; i < size; i++) {
			array[i] = mMain.get(i).get(Common.WORDBOOK_TITLE).toString();
		}
		// 存在しない場合はエラー表示
		if (array.length == 0) {
			Message.show(getApplicationContext(), Message.ID.DATA_NOT_FOUND);
		}

		return array;
	}

	/** 単語帳情報更新タスク */
	private AsyncTask<Void, Void, int[]> mTask = null;

	/**
	 * 単語帳情報更新タスク呼び出し
	 * 
	 * @param index
	 *            インデックス
	 * @param base
	 *            試験データ先頭
	 */
	private void saveResult(final int index, final int base) {

		// 単語帳情報更新タスク動作時は処理無し
		if (mTask != null && mTask.getStatus() == AsyncTask.Status.RUNNING) {
			Log.w(TAG, "saveResult()=RUNNING");
			return;
		}

		// 単語帳情報更新タスク実行
		mTask = new AsyncTask<Void, Void, int[]>() {

			@Override
			protected void onPreExecute() {
				super.onPreExecute();
				Log.d(TAG, "onPreExecute()");

				// 単語帳情報リスト更新
				mMain.get(mPos).put(Common.WORDBOOK_VALUE,
						getString(R.string.label_processing));
				// 単語帳情報リスト反映
				((BaseAdapter) mListView.getAdapter()).notifyDataSetChanged();
			}

			@Override
			protected void onPostExecute(int[] result) {

				// 単語帳情報コメント生成
				String value = Common.makeWordbookPrefValue(
						getApplicationContext(), result);

				// 単語帳情報リスト更新
				Map<String, Object> item = mMain.get(mPos);
				item.put(Common.WORDBOOK_VALUE, value);
				item.put(Common.WORDBOOK_BASE, base);
				item.put(Common.WORDBOOK_ZERO, result[1]);
				item.put(Common.WORDBOOK_OK, result[2]);
				item.put(Common.WORDBOOK_NG, result[3]);
				// 単語帳情報リスト反映
				((BaseAdapter) mListView.getAdapter()).notifyDataSetChanged();

				Log.d(TAG, "onPostExecute()=" + result[0] + "/" + result[1]
						+ "/" + result[2] + "/" + result[3]);
				super.onPostExecute(result);
			}

			@Override
			protected int[] doInBackground(Void... params) {
				Log.d(TAG, "doInBackground()=" + index + "/" + base);

				// 設定ファイル更新
				int[] info = DBAccess.getDBInfo(getApplicationContext(), index);
				Common.modWordbookPref(getApplicationContext(), index, null,
						info, base);

				return info;
			};
		}.execute();

	}

}
