package app.create.rpg;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import android.view.*;
import android.widget.*;
import android.text.*;
public class ActivityFileDialog extends ListActivity implements
OnClickListener, OnItemClickListener, OnItemLongClickListener {
/** Item key for SimpleAdapter */
public static final String ITEM_KEY = "key";
/** Item image for SimpleAdatper */
public static final String ITEM_IMAGE = "image";
/** Item key/image pair for SimpleAdapter */
public static final String[] ITEMS = new String[] { ITEM_KEY, ITEM_IMAGE };
/** Matching view Id for SimpleAdapter */
public static final int[] ITEM_IDS = new int[] { R.id.row_text,
R.id.row_image };
/** Current directory path / result path intent key */
public static final String FILE_PATH = "FILE_PATH";
/** File name filter intent parameter key */
public static final String FILENAME_FILTER = "FILENAME_FILTER";
/** Selection mode flags */
public static final String SELECTION_MODE_FLAGS = "SELECTION_MODE_FLAGS";
private int mFlags;
private String mDirectoryPath;
private String[] mFilters;
@Override
public void onCreate(Bundle state) {
super.onCreate(state);
//setMarquee();
setContentView(R.layout.dialog_file);
setMarquee();
findViewById(android.R.id.button1).setOnClickListener(this);
findViewById(android.R.id.button2).setOnClickListener(this);
findViewById(R.id.btn_new_dir).setOnClickListener(this);
final ListView lv = getListView();
lv.setOnItemClickListener(this);
lv.setLongClickable(true);
lv.setOnItemLongClickListener(this);
Intent in = getIntent();
mFlags = in.getIntExtra(SELECTION_MODE_FLAGS, SelectionFlags.FLAG_ONLY_AVAILABLE);
if ((mDirectoryPath = in.getStringExtra(FILE_PATH)) == null)
mDirectoryPath = Environment.getExternalStorageDirectory()
.getAbsolutePath();
File f = new File(mDirectoryPath);
if (!f.isAbsolute()) {
f = new File(Environment.getExternalStorageDirectory(), f.getPath());
}
if (!f.isDirectory() && f.getParentFile().isDirectory()) {
mDirectoryPath = f.getParent();
((EditText) findViewById(R.id.textFilePath)).setText(f.getName());
}
mFilters = in.getStringArrayExtra(FILENAME_FILTER);
restoreState(state);
refreshDir(mDirectoryPath);
}
protected void setMarquee () {
TextView tv = (TextView) findViewById(android.R.id.title);
if (tv != null) {
tv.setEllipsize(TextUtils.TruncateAt.MARQUEE);
tv.setMarqueeRepeatLimit(-1);
tv.setSingleLine(true);
tv.setHorizontallyScrolling(true);
tv.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
//* Seems like the marquee needs focus...
tv.setFocusable(true);
tv.setFocusableInTouchMode(true);
//*/
/* Test code
Toast.makeText(this, "lol", Toast.LENGTH_SHORT).show();
//*/
}
}
@Override
public void onStart() {
super.onStart();
// setMarquee ();
}
@Override
protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
restoreState(state);
}
protected void restoreState(Bundle state) {
if (state != null) {
mFlags = state.getInt(SELECTION_MODE_FLAGS);
mDirectoryPath = state.getString(FILE_PATH);
mFilters = state.getStringArray(FILENAME_FILTER);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(SELECTION_MODE_FLAGS, mFlags);
outState.putString(FILE_PATH, mDirectoryPath);
outState.putStringArray(FILENAME_FILTER, mFilters);
}
protected void addItem(List<Map<String, Object>> map, File file, int icon) {
HashMap<String, Object> item = new HashMap<String, Object>(2);
item.put(ITEM_KEY, file.getName());
item.put(ITEM_IMAGE, icon);
map.add(item);
}
protected void refreshDir(String newDir) {
File folder = new File(newDir);
if (!folder.isDirectory())
return;
try {
File[] files = folder.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
if (file.isDirectory() || mFilters == null)
return true;
for (String filter : mFilters) {
if (file.getName().endsWith("."
+ filter.toLowerCase(Locale.ENGLISH))) {
return true;
}
}
return false;
}
});
List<File> fileList = new ArrayList<File>(), folderList = new ArrayList<File>();
for (File file : files) {
if (file.isDirectory()) {
folderList.add(file);
} else {
fileList.add(file);
}
}
Collections.sort(fileList);
Collections.sort(folderList);
//setMarquee();
setTitle(mDirectoryPath = newDir);
final ListView listView = getListView();
FileListAdapter adapter = (FileListAdapter) listView.getAdapter();
if (adapter == null) {
List<File> totalList = new ArrayList<File>(folderList);
totalList.addAll(fileList);
listView.setAdapter(new FileListAdapter(this, totalList));
} else {
adapter.setNotifyOnChange(false);
adapter.clear();
for (File f : folderList)
adapter.add(f);
for (File f : fileList)
adapter.add(f);
adapter.notifyDataSetChanged();
}
} catch (Exception e) {
Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view,
int position, long id) {
File file = (File) ((Adapter) adapterView.getAdapter()).getItem(position);
if (file.isDirectory()) {
refreshDir(file.getAbsolutePath());
} else if ((mFlags & SelectionFlags.FLAG_DIR) != SelectionFlags.FLAG_DIR) {
if (file.isFile()) {
setResult(RESULT_OK,
getIntent().putExtra(FILE_PATH, file.getAbsolutePath()));
finish();
}
}
}
protected void deleteRecursive(File file) {
if (file.isDirectory())
for (File child : file.listFiles())
deleteRecursive(child);
file.delete();
}
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view,
int position, long id) {
final File file = (File) ((Adapter) adapterView.getAdapter()).getItem(position);
CharSequence[] items =
file.isDirectory() == ((mFlags & SelectionFlags.FLAG_DIR) == SelectionFlags.FLAG_DIR)
? new CharSequence[]{getText(R.string.str_delete), getText(R.string.str_rename), getText(R.string.str_select)}
: new CharSequence[]{getText(R.string.str_delete), getText(R.string.str_rename)};
new AlertDialog.Builder(this)
.setTitle(R.string.str_menu)
.setItems(items,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
if (which == 0) {
try {
if (!file.delete()) {
if (file.list().length > 0) {
new AlertDialog.Builder(ActivityFileDialog.this)
.setTitle(android.R.string.dialog_alert_title)
.setMessage(R.string.str_question_delete)
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { }
})
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try { deleteRecursive(file); refreshDir(mDirectoryPath); } catch (Exception e) { Toast.makeText(ActivityFileDialog.this, "Error", Toast.LENGTH_SHORT).show(); }
}
}).show();
} else throw new Exception();
} else refreshDir(mDirectoryPath);
} catch (Exception e) {
Toast.makeText(ActivityFileDialog.this, "Error", Toast.LENGTH_SHORT).show();
}
} else if (which == 1) {
final EditText et = ((EditText) findViewById(R.id.textFilePath));
final String str = et.getText().toString();
if (str.length() > 0) {
String path = file.getParent();
if (file.renameTo(new File((path == null ? "" : path) + "/" + str))) {
et.setText("");
refreshDir(mDirectoryPath);
} else Toast.makeText(ActivityFileDialog.this, "Error", Toast.LENGTH_SHORT);
} else {
et.setText(file.getName());
Toast.makeText(ActivityFileDialog.this, R.string.str_error_empty, Toast.LENGTH_LONG).show();
}
} else {
setResult(RESULT_OK, getIntent().putExtra(FILE_PATH, file.getAbsolutePath()));
finish();
}
}
}).show();
return false;
}
@Override
public void onBackPressed() {
File folder = new File(mDirectoryPath);
if (folder.getParentFile() == null) {
setResult(RESULT_CANCELED);
finish();
return;
}
refreshDir(folder.getParent());
}
@Override
public void onClick(View v) {
final EditText et = ((EditText) findViewById(R.id.textFilePath));
final String fileName = et.getText()
.toString();
File f;
switch (v.getId()) {
case R.id.btn_new_dir:
if (fileName.length() < 1) break;
f = new File(mDirectoryPath, fileName);
f.mkdirs();
refreshDir(f.getAbsolutePath());
et.setText("");
break;
case android.R.id.button2:
if (fileName.length() > 0) {
f = new File(mDirectoryPath, fileName);
if (((mFlags & SelectionFlags.FLAG_ONLY_AVAILABLE) != SelectionFlags.FLAG_ONLY_AVAILABLE) || f.exists() || (f = new File(mDirectoryPath)).isDirectory()) {
if (f.isDirectory() == ((mFlags & SelectionFlags.FLAG_DIR) != 0)) {
setResult(RESULT_OK, getIntent().putExtra(FILE_PATH, f.getAbsolutePath()));
finish();
} else if (f.isDirectory()) {
refreshDir(f.getAbsolutePath());
}
} else {
Toast.makeText(this, R.string.str_error_nonexist, Toast.LENGTH_SHORT).show();
}
} else {
setResult(RESULT_OK, getIntent()
.putExtra(FILE_PATH, mDirectoryPath));
}
finish();
break;
case android.R.id.button1:
setResult(RESULT_CANCELED);
finish();
break;
}
}
}