@Override
  public View onCreateView(
      LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    log.d(this, "onCreateView()");

    View view = inflater.inflate(R.layout.chapter_list, container, false);
    if (view == null) {
      log.w(this, "Problem inflating view, returned null");
      return null;
    }

    View search = view.findViewById(R.id.button_search);
    if (search != null) {
      search.setVisibility(View.INVISIBLE);
    } else {
      search = view.findViewById(R.id.sv_search);
      if (search != null) {
        search.setVisibility(View.INVISIBLE);
      }
    }

    setHasOptionsMenu(true);
    //        getSherlockActivity().getSupportActionBar().setSubtitle("Search Result");
    //        getSherlockActivity().getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    return view;
  }
 @Override
 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
   log.v(this, "onCreateLoader(id:" + id + ")");
   Uri baseUri;
   baseUri = DhammapadaContentProvider.getSearchUri(args.getString("query"));
   return new CursorLoader(getActivity(), baseUri, LOADER_SEARCH_PROJECTION, null, null, null);
 }
 @Override
 public void onListItemClick(ListView l, View v, int position, long id) {
   super.onListItemClick(l, v, position, id);
   log.v(this, "onListItemClick(pos:" + position + "|id:" + id);
   Message message = Message.obtain();
   message.what = Constant.WHAT_SELECT_VERSE;
   message.obj = v.getTag();
   controller.executeMessage(message);
 }
 private String getQueryPart(String content, String query) {
   log.v(this, "getQueryPart(content:" + content + "|query:" + query + ")");
   content = content.toLowerCase();
   int pos = content.indexOf(query);
   int start = pos - 30;
   if (start < 0) {
     start = 0;
   }
   String result = content.substring(start, pos);
   result += "<b>" + query + "</b>";
   int end = pos + (query.length());
   if (result.length() <= 70) {
     end += 70 - result.length();
   }
   if (end > content.length()) {
     end = content.length();
   }
   log.d(this, "start:" + start + "|end:" + end);
   result += content.substring(pos + query.length(), end);
   return result.replaceAll("\n", " ");
 }
    @Override
    public void bindView(View view, Context context, Cursor cursor) {
      Chapter chapter = new Chapter();
      chapter.setNo(cursor.getInt(cursor.getColumnIndex(TableVerse.VERSE_NO)));
      chapter.setStart(cursor.getInt(cursor.getColumnIndex(TableChapter.START)));
      chapter.setEnd(cursor.getInt(cursor.getColumnIndex(TableChapter.END)));
      chapter.setTotal(cursor.getInt(cursor.getColumnIndex(TableChapter.TOTAL)));
      chapter.setTitlePali(cursor.getString(cursor.getColumnIndex(TableChapter.TITLE_PALI)));
      chapter.setTitleEng(cursor.getString(cursor.getColumnIndex(TableChapter.TITLE_ENG)));
      chapter.setTitleId(cursor.getString(cursor.getColumnIndex(TableChapter.TITLE_ID)));

      SearchVerse verse = new SearchVerse(chapter, cursor);
      if (verse.getContentPali().toLowerCase().indexOf(query.toLowerCase()) >= 0) {
        verse.setSearchContent(getQueryPart(verse.getContentPali(), query));
      } else if (verse.getContentEng().toLowerCase().indexOf(query.toLowerCase()) >= 0) {
        verse.setSearchContent(getQueryPart(verse.getContentEng(), query));
      } else if (verse.getContentId().toLowerCase().indexOf(query.toLowerCase()) >= 0) {
        verse.setSearchContent(getQueryPart(verse.getContentId(), query));
      }
      verse.setQuery(query);
      view.setTag(verse);
      log.v(this, "verse.getIndex():" + verse.getIndex() + "|" + verse.getContentPali());
      log.v(this, "verse.getIndex():" + verse.getIndex() + "|" + verse.getContentEng());
      log.v(this, "verse.getIndex():" + verse.getIndex() + "|" + verse.getContentId());

      TextView txtSearchChapter = (TextView) view.findViewById(R.id.searchChapter);
      TextView txtSearchVerseIndex = (TextView) view.findViewById(R.id.searchVerseIndex);
      TextView txtSearchVerseContent = (TextView) view.findViewById(R.id.searchVerseContent);

      txtSearchChapter.setTypeface(tf);
      txtSearchVerseIndex.setTypeface(tf);
      //		    txtSearchVerseContent.setTypeface(tf);

      txtSearchChapter.setText(verse.getChapter().getTitlePali());
      txtSearchVerseIndex.setText("" + verse.getIndex());
      log.v(this, "verse.getSearchContent():" + verse.getSearchContent());
      txtSearchVerseContent.setText(Html.fromHtml(verse.getSearchContent()));
    }
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
   log.v(this, "onOptionsItemSelected(" + item.getItemId() + ")");
   Message message;
   switch (item.getItemId()) {
     case android.R.id.home:
       message = Message.obtain();
       message.what = Constant.WHAT_GOTO_BACK;
       message.obj = this;
       controller.executeMessage(message);
       break;
     case 99:
       break;
     default:
       //			Toast.makeText(getActivity(), "Unknown", Toast.LENGTH_SHORT).show();
       break;
   }
   return true;
 }
  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
    log.v(this, "onActivityCreated()");
    super.onActivityCreated(savedInstanceState);

    query = getArguments().getString("query").trim().toLowerCase();

    mAdapter =
        new CustomAdapter(
            getActivity(),
            R.layout.search_item,
            null,
            new String[] {DhammapadaContentProvider.TableChapter.TITLE_PALI},
            new int[] {R.id.searchChapter},
            0,
            query);
    setListAdapter(mAdapter);

    controller = new DhammapadaController(getActivity(), null);

    Bundle bundle = new Bundle();
    bundle.putString("query", query);
    getLoaderManager().initLoader(0, bundle, this);
  }
public class SearchFragment extends ListFragment implements LoaderCallbacks<Cursor> {

  private LogUtility log = LogUtility.getInstance();

  private SimpleCursorAdapter mAdapter;
  private Controller controller;
  private String query;

  private static String[] LOADER_SEARCH_PROJECTION =
      new String[] {
        DhammapadaContentProvider.TableVerse._NAME + "." + DhammapadaContentProvider.TableVerse.ID,
        DhammapadaContentProvider.TableChapter.TOTAL,
        DhammapadaContentProvider.TableChapter.START,
        DhammapadaContentProvider.TableChapter.END,
        DhammapadaContentProvider.TableChapter.TITLE_PALI,
        DhammapadaContentProvider.TableChapter.TITLE_ENG,
        DhammapadaContentProvider.TableChapter.TITLE_ID,
        DhammapadaContentProvider.TableVerse.CHAPTER_NO,
        DhammapadaContentProvider.TableVerse.VERSE_NO,
        DhammapadaContentProvider.TableVerse.VERSE_INDEX,
        DhammapadaContentProvider.TableVerse.CONTENT_PALI,
        DhammapadaContentProvider.TableVerse.CONTENT_ID,
        DhammapadaContentProvider.TableVerse.CONTENT_ENG
      };

  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
    log.v(this, "onActivityCreated()");
    super.onActivityCreated(savedInstanceState);

    query = getArguments().getString("query").trim().toLowerCase();

    mAdapter =
        new CustomAdapter(
            getActivity(),
            R.layout.search_item,
            null,
            new String[] {DhammapadaContentProvider.TableChapter.TITLE_PALI},
            new int[] {R.id.searchChapter},
            0,
            query);
    setListAdapter(mAdapter);

    controller = new DhammapadaController(getActivity(), null);

    Bundle bundle = new Bundle();
    bundle.putString("query", query);
    getLoaderManager().initLoader(0, bundle, this);
  }

  @Override
  public View onCreateView(
      LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    log.d(this, "onCreateView()");

    View view = inflater.inflate(R.layout.chapter_list, container, false);
    if (view == null) {
      log.w(this, "Problem inflating view, returned null");
      return null;
    }

    View search = view.findViewById(R.id.button_search);
    if (search != null) {
      search.setVisibility(View.INVISIBLE);
    } else {
      search = view.findViewById(R.id.sv_search);
      if (search != null) {
        search.setVisibility(View.INVISIBLE);
      }
    }

    setHasOptionsMenu(true);
    //        getSherlockActivity().getSupportActionBar().setSubtitle("Search Result");
    //        getSherlockActivity().getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    return view;
  }

  @Override
  public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    log.v(this, "onCreateLoader(id:" + id + ")");
    Uri baseUri;
    baseUri = DhammapadaContentProvider.getSearchUri(args.getString("query"));
    return new CursorLoader(getActivity(), baseUri, LOADER_SEARCH_PROJECTION, null, null, null);
  }

  @Override
  public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    log.v(this, "onLoadFinished(data:" + data.getCount() + ")");
    mAdapter.swapCursor(data);
  }

  @Override
  public void onLoaderReset(Loader<Cursor> loader) {
    log.v(this, "onLoaderReset()");
    mAdapter.swapCursor(null);
  }

  @Override
  public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    log.v(this, "onListItemClick(pos:" + position + "|id:" + id);
    Message message = Message.obtain();
    message.what = Constant.WHAT_SELECT_VERSE;
    message.obj = v.getTag();
    controller.executeMessage(message);
  }

  public static Fragment newInstance(String query) {
    SearchFragment myFragment = new SearchFragment();
    Bundle args = new Bundle();
    args.putSerializable("query", query);
    myFragment.setArguments(args);
    return myFragment;
  }

  @TargetApi(Build.VERSION_CODES.HONEYCOMB)
  @Override
  public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.clear();
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    log.v(this, "onOptionsItemSelected(" + item.getItemId() + ")");
    Message message;
    switch (item.getItemId()) {
      case android.R.id.home:
        message = Message.obtain();
        message.what = Constant.WHAT_GOTO_BACK;
        message.obj = this;
        controller.executeMessage(message);
        break;
      case 99:
        break;
      default:
        //			Toast.makeText(getActivity(), "Unknown", Toast.LENGTH_SHORT).show();
        break;
    }
    return true;
  }

  private static class CustomAdapter extends SimpleCursorAdapter {

    private LayoutInflater layoutInflater;
    private int layout;
    private Typeface tf;
    private String query;
    private LogUtility log = LogUtility.getInstance();

    public CustomAdapter(
        Context context, int layout, Cursor c, String[] from, int[] to, int flags, String query) {
      super(context, layout, c, from, to, flags);
      layoutInflater = LayoutInflater.from(context);
      this.layout = layout;
      tf = Typeface.createFromAsset(context.getAssets(), "fonts/arlrdbd.ttf");
      this.query = query;
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
      View view = layoutInflater.inflate(layout, parent, false);

      Chapter chapter = new Chapter();
      chapter.setNo(cursor.getInt(cursor.getColumnIndex(TableVerse.VERSE_NO)));
      chapter.setStart(cursor.getInt(cursor.getColumnIndex(TableChapter.START)));
      chapter.setEnd(cursor.getInt(cursor.getColumnIndex(TableChapter.END)));
      chapter.setTotal(cursor.getInt(cursor.getColumnIndex(TableChapter.TOTAL)));
      chapter.setTitlePali(cursor.getString(cursor.getColumnIndex(TableChapter.TITLE_PALI)));
      chapter.setTitleEng(cursor.getString(cursor.getColumnIndex(TableChapter.TITLE_ENG)));
      chapter.setTitleId(cursor.getString(cursor.getColumnIndex(TableChapter.TITLE_ID)));

      SearchVerse verse = new SearchVerse(chapter, cursor);
      if (verse.getContentPali().indexOf(query) >= 0) {
        verse.setSearchContent(getQueryPart(verse.getContentPali(), query));
      } else if (verse.getContentEng().indexOf(query) >= 0) {
        verse.setSearchContent(getQueryPart(verse.getContentEng(), query));
      } else if (verse.getContentId().indexOf(query) >= 0) {
        verse.setSearchContent(getQueryPart(verse.getContentId(), query));
      }
      verse.setQuery(query);
      view.setTag(verse);

      return view;
    }

    private String getQueryPart(String content, String query) {
      log.v(this, "getQueryPart(content:" + content + "|query:" + query + ")");
      content = content.toLowerCase();
      int pos = content.indexOf(query);
      int start = pos - 30;
      if (start < 0) {
        start = 0;
      }
      String result = content.substring(start, pos);
      result += "<b>" + query + "</b>";
      int end = pos + (query.length());
      if (result.length() <= 70) {
        end += 70 - result.length();
      }
      if (end > content.length()) {
        end = content.length();
      }
      log.d(this, "start:" + start + "|end:" + end);
      result += content.substring(pos + query.length(), end);
      return result.replaceAll("\n", " ");
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
      Chapter chapter = new Chapter();
      chapter.setNo(cursor.getInt(cursor.getColumnIndex(TableVerse.VERSE_NO)));
      chapter.setStart(cursor.getInt(cursor.getColumnIndex(TableChapter.START)));
      chapter.setEnd(cursor.getInt(cursor.getColumnIndex(TableChapter.END)));
      chapter.setTotal(cursor.getInt(cursor.getColumnIndex(TableChapter.TOTAL)));
      chapter.setTitlePali(cursor.getString(cursor.getColumnIndex(TableChapter.TITLE_PALI)));
      chapter.setTitleEng(cursor.getString(cursor.getColumnIndex(TableChapter.TITLE_ENG)));
      chapter.setTitleId(cursor.getString(cursor.getColumnIndex(TableChapter.TITLE_ID)));

      SearchVerse verse = new SearchVerse(chapter, cursor);
      if (verse.getContentPali().toLowerCase().indexOf(query.toLowerCase()) >= 0) {
        verse.setSearchContent(getQueryPart(verse.getContentPali(), query));
      } else if (verse.getContentEng().toLowerCase().indexOf(query.toLowerCase()) >= 0) {
        verse.setSearchContent(getQueryPart(verse.getContentEng(), query));
      } else if (verse.getContentId().toLowerCase().indexOf(query.toLowerCase()) >= 0) {
        verse.setSearchContent(getQueryPart(verse.getContentId(), query));
      }
      verse.setQuery(query);
      view.setTag(verse);
      log.v(this, "verse.getIndex():" + verse.getIndex() + "|" + verse.getContentPali());
      log.v(this, "verse.getIndex():" + verse.getIndex() + "|" + verse.getContentEng());
      log.v(this, "verse.getIndex():" + verse.getIndex() + "|" + verse.getContentId());

      TextView txtSearchChapter = (TextView) view.findViewById(R.id.searchChapter);
      TextView txtSearchVerseIndex = (TextView) view.findViewById(R.id.searchVerseIndex);
      TextView txtSearchVerseContent = (TextView) view.findViewById(R.id.searchVerseContent);

      txtSearchChapter.setTypeface(tf);
      txtSearchVerseIndex.setTypeface(tf);
      //		    txtSearchVerseContent.setTypeface(tf);

      txtSearchChapter.setText(verse.getChapter().getTitlePali());
      txtSearchVerseIndex.setText("" + verse.getIndex());
      log.v(this, "verse.getSearchContent():" + verse.getSearchContent());
      txtSearchVerseContent.setText(Html.fromHtml(verse.getSearchContent()));
    }
  }

  //	@Override
  //	public boolean onQueryTextSubmit(String query) {
  //		log.v(this, "onQueryTextSubmit("+query+")");
  //		Message message = Message.obtain();
  //		message.what = Constant.WHAT_SEARCH_VERSE;
  //		message.obj = query;
  //		controller.executeMessage(message);
  //		return false;
  //	}
  //
  //	@Override
  //	public boolean onQueryTextChange(String newText) {
  //		// TODO Auto-generated method stub
  //		return false;
  //	}

}
  private static class CustomAdapter extends SimpleCursorAdapter {

    private LayoutInflater layoutInflater;
    private int layout;
    private Typeface tf;
    private String query;
    private LogUtility log = LogUtility.getInstance();

    public CustomAdapter(
        Context context, int layout, Cursor c, String[] from, int[] to, int flags, String query) {
      super(context, layout, c, from, to, flags);
      layoutInflater = LayoutInflater.from(context);
      this.layout = layout;
      tf = Typeface.createFromAsset(context.getAssets(), "fonts/arlrdbd.ttf");
      this.query = query;
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
      View view = layoutInflater.inflate(layout, parent, false);

      Chapter chapter = new Chapter();
      chapter.setNo(cursor.getInt(cursor.getColumnIndex(TableVerse.VERSE_NO)));
      chapter.setStart(cursor.getInt(cursor.getColumnIndex(TableChapter.START)));
      chapter.setEnd(cursor.getInt(cursor.getColumnIndex(TableChapter.END)));
      chapter.setTotal(cursor.getInt(cursor.getColumnIndex(TableChapter.TOTAL)));
      chapter.setTitlePali(cursor.getString(cursor.getColumnIndex(TableChapter.TITLE_PALI)));
      chapter.setTitleEng(cursor.getString(cursor.getColumnIndex(TableChapter.TITLE_ENG)));
      chapter.setTitleId(cursor.getString(cursor.getColumnIndex(TableChapter.TITLE_ID)));

      SearchVerse verse = new SearchVerse(chapter, cursor);
      if (verse.getContentPali().indexOf(query) >= 0) {
        verse.setSearchContent(getQueryPart(verse.getContentPali(), query));
      } else if (verse.getContentEng().indexOf(query) >= 0) {
        verse.setSearchContent(getQueryPart(verse.getContentEng(), query));
      } else if (verse.getContentId().indexOf(query) >= 0) {
        verse.setSearchContent(getQueryPart(verse.getContentId(), query));
      }
      verse.setQuery(query);
      view.setTag(verse);

      return view;
    }

    private String getQueryPart(String content, String query) {
      log.v(this, "getQueryPart(content:" + content + "|query:" + query + ")");
      content = content.toLowerCase();
      int pos = content.indexOf(query);
      int start = pos - 30;
      if (start < 0) {
        start = 0;
      }
      String result = content.substring(start, pos);
      result += "<b>" + query + "</b>";
      int end = pos + (query.length());
      if (result.length() <= 70) {
        end += 70 - result.length();
      }
      if (end > content.length()) {
        end = content.length();
      }
      log.d(this, "start:" + start + "|end:" + end);
      result += content.substring(pos + query.length(), end);
      return result.replaceAll("\n", " ");
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
      Chapter chapter = new Chapter();
      chapter.setNo(cursor.getInt(cursor.getColumnIndex(TableVerse.VERSE_NO)));
      chapter.setStart(cursor.getInt(cursor.getColumnIndex(TableChapter.START)));
      chapter.setEnd(cursor.getInt(cursor.getColumnIndex(TableChapter.END)));
      chapter.setTotal(cursor.getInt(cursor.getColumnIndex(TableChapter.TOTAL)));
      chapter.setTitlePali(cursor.getString(cursor.getColumnIndex(TableChapter.TITLE_PALI)));
      chapter.setTitleEng(cursor.getString(cursor.getColumnIndex(TableChapter.TITLE_ENG)));
      chapter.setTitleId(cursor.getString(cursor.getColumnIndex(TableChapter.TITLE_ID)));

      SearchVerse verse = new SearchVerse(chapter, cursor);
      if (verse.getContentPali().toLowerCase().indexOf(query.toLowerCase()) >= 0) {
        verse.setSearchContent(getQueryPart(verse.getContentPali(), query));
      } else if (verse.getContentEng().toLowerCase().indexOf(query.toLowerCase()) >= 0) {
        verse.setSearchContent(getQueryPart(verse.getContentEng(), query));
      } else if (verse.getContentId().toLowerCase().indexOf(query.toLowerCase()) >= 0) {
        verse.setSearchContent(getQueryPart(verse.getContentId(), query));
      }
      verse.setQuery(query);
      view.setTag(verse);
      log.v(this, "verse.getIndex():" + verse.getIndex() + "|" + verse.getContentPali());
      log.v(this, "verse.getIndex():" + verse.getIndex() + "|" + verse.getContentEng());
      log.v(this, "verse.getIndex():" + verse.getIndex() + "|" + verse.getContentId());

      TextView txtSearchChapter = (TextView) view.findViewById(R.id.searchChapter);
      TextView txtSearchVerseIndex = (TextView) view.findViewById(R.id.searchVerseIndex);
      TextView txtSearchVerseContent = (TextView) view.findViewById(R.id.searchVerseContent);

      txtSearchChapter.setTypeface(tf);
      txtSearchVerseIndex.setTypeface(tf);
      //		    txtSearchVerseContent.setTypeface(tf);

      txtSearchChapter.setText(verse.getChapter().getTitlePali());
      txtSearchVerseIndex.setText("" + verse.getIndex());
      log.v(this, "verse.getSearchContent():" + verse.getSearchContent());
      txtSearchVerseContent.setText(Html.fromHtml(verse.getSearchContent()));
    }
  }
 @Override
 public void onLoaderReset(Loader<Cursor> loader) {
   log.v(this, "onLoaderReset()");
   mAdapter.swapCursor(null);
 }
 @Override
 public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
   log.v(this, "onLoadFinished(data:" + data.getCount() + ")");
   mAdapter.swapCursor(data);
 }