package com.jecelyin.editor; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.*; import android.widget.AdapterView.OnItemClickListener; import com.jecelyin.util.FileBrowser; import java.io.File; import java.util.ArrayList; import java.util.List; public class Grep extends BaseActivity { static { System.loadLibrary("grep"); } public native static void find(String[] cmd); private static ArrayList<GrepResult> mGrepResults = new ArrayList<GrepResult>(); private JecEditor mJecEditor; private boolean isRoot = false; private EditText keywordEditText; private EditText pathEditText; private CheckBox recurseCheckBox; private CheckBox ignorecaseCheckBox; private CheckBox regexCheckBox; private CheckBox wholewordCheckBox; private ListView filelistsListView; private ProgressDialog mProgressDialog; private SearchHandler mSearchHandler; private ResultAdapter adapter; public static void clearResult() { mGrepResults.clear(); } public static void addMatchResult(String file, int linenum, String line, long offset) { //Log.d("Grep", file+":"+linenum+":"+line); mGrepResults.add(new GrepResult(file, linenum, line, offset)); } public static ArrayList<GrepResult> getResults() { return mGrepResults; } protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.folder_search); Intent it = getIntent(); final String path = it.getStringExtra("path"); String keyword = it.getStringExtra("keyword"); isRoot = it.getBooleanExtra("isRoot", false); keywordEditText = (EditText) findViewById(R.id.keyword); keywordEditText.setText(keyword); pathEditText = (EditText) findViewById(R.id.path); recurseCheckBox = (CheckBox) findViewById(R.id.recurse); ignorecaseCheckBox = (CheckBox) findViewById(R.id.ignore_case); regexCheckBox = (CheckBox) findViewById(R.id.use_regex); wholewordCheckBox = (CheckBox) findViewById(R.id.match_whole_word); filelistsListView = (ListView) findViewById(R.id.filelists); pathEditText.setText("".equals(path) ? android.os.Environment.getExternalStorageDirectory().getPath() : path); Button browse = (Button) findViewById(R.id.browse); browse.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent intent = new Intent(); intent.putExtra("path", path); intent.putExtra("mode", FileBrowser.MODE_BROWSE); intent.putExtra("isRoot", isRoot); intent.setClass(Grep.this, FileBrowser.class); startActivityForResult(intent, FileBrowser.MODE_BROWSE); } }); ImageButton search = (ImageButton) findViewById(R.id.search); search.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { search(); } }); adapter = new ResultAdapter(this.getApplicationContext(), R.layout.search_list, mGrepResults); filelistsListView.setAdapter(adapter); filelistsListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { GrepResult res = adapter.getItem(position); Intent intent = new Intent(); intent.putExtra("file", res.file); intent.putExtra("offset", res.offset); intent.putExtra("line", res.lineNum); setResult(RESULT_OK, intent); finish(); } }); } /** * startActivityForResult回调函数 * * @param requestCode * 这里的requestCode就是前面启动新Activity时的带过去的requestCode * @param resultCode * resultCode则关联上了setResult中的resultCode * @param data * 返回的Intent参数 */ protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(RESULT_OK != resultCode) { return; } if(requestCode == FileBrowser.MODE_BROWSE) { pathEditText.setText(data.getStringExtra("path")); } } private void search() { String pathStr = pathEditText.getText().toString().trim(); if(pathStr == null || "".equals(pathStr)) { msgbox(R.string.path_not_correct); return; } File path = new File(pathStr); if(!path.exists()) { msgbox(R.string.path_not_correct); return; } String keyword = keywordEditText.getText().toString(); if("".equals(keyword)) { msgbox(R.string.keyword_notbe_empty); return; } final ArrayList<String> cmd = new ArrayList<String>(); if(recurseCheckBox.isChecked()) cmd.add("-r"); if(ignorecaseCheckBox.isChecked()) cmd.add("-i"); if(wholewordCheckBox.isChecked()) cmd.add("-w"); if(regexCheckBox.isChecked()) cmd.add("-E"); cmd.add(keyword); cmd.add(path.getAbsolutePath()); mProgressDialog = new ProgressDialog(this); mProgressDialog.setTitle(R.string.spinner_message); mProgressDialog.setMessage(getText(R.string.searching)); mProgressDialog.setIndeterminate(true); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); mProgressDialog.setCancelable(true); mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface dialog) { dismissProgress(); } }); mProgressDialog.show(); mSearchHandler = new SearchHandler(Grep.this); Thread thread = new Thread(new Runnable() { @Override public void run() { Message msg = mSearchHandler.obtainMessage(); clearResult(); String[] args = cmd.toArray(new String[cmd.size()]); find(args); msg.sendToTarget(); } }); thread.start(); } private void msgbox(int id) { Toast.makeText(this, id, Toast.LENGTH_SHORT).show(); } public void dismissProgress() { if(mProgressDialog != null) mProgressDialog.dismiss(); } public void showResult() { adapter.notifyDataSetChanged(); } static class SearchHandler extends Handler { private Grep mGrep; public SearchHandler(Grep grep) { super(); mGrep = grep; } @Override public void handleMessage(Message msg) { mGrep.showResult(); //Grep.clearResult(); mGrep.dismissProgress(); Toast.makeText(mGrep, mGrep.getString(R.string.find_result).replaceAll("%s", String.valueOf(getResults().size())), Toast.LENGTH_LONG).show(); } } } class GrepResult { public String file; public int lineNum; public String line; public long offset; public GrepResult(String file, int linenum, String line, long offset) { this.file = file; this.lineNum = linenum; this.line = line; this.offset = offset; } } class ResultAdapter extends ArrayAdapter<GrepResult> { private LayoutInflater mInflater; private String lineStr; public ResultAdapter(Context context, int textViewResourceId, List<GrepResult> objects) { super(context, textViewResourceId, objects); mInflater = LayoutInflater.from(context); lineStr = mInflater.getContext().getString(R.string.line_num); } public View getView(int position, View view, ViewGroup parent) { TextView file, line, code; if (view == null) { view = mInflater.inflate(R.layout.search_list, null); } file = (TextView) view.findViewById(R.id.file); line = (TextView) view.findViewById(R.id.line); code = (TextView) view.findViewById(R.id.code); GrepResult res = getItem(position); file.setText(res.file); line.setText(lineStr.replaceAll("%s", String.valueOf(res.lineNum))); code.setText(res.line); return view; } }