// #sijapp cond.if modules_FILES="true"#
package jimm.modules.fs;
import jimmui.view.text.*;
import jimmui.view.icons.Icon;
import jimmui.view.icons.ImageList;
import java.util.*;
import jimm.*;
import jimm.comm.*;
import jimmui.view.base.*;
public final class FileBrowser extends VirtualList implements Runnable {
private final ImageList fsIcons = ImageList.createImageList("/fs.png");
private static final int TYPE_FILE = 1;
private static final int TYPE_DIR = 0;
private FileBrowserListener listener;
private boolean needToSelectDirectory;
private boolean selectFirst;
private String currDir;
private String nextDir = null;
private Vector root = new Vector();
private Par errorMessage = null;
private void setError(JimmException err) {
Parser parser = new Parser(getFontSet(), getWidth() * 8 / 10);
parser.addText(err.getMessage(), THEME_TEXT, CanvasEx.FONT_STYLE_PLAIN);
errorMessage = parser.getPar();
currDir = FileSystem.ROOT_DIRECTORY;
root = new Vector();
restoring();
invalidate();
}
private Icon[] getIcon(int type) {
return new Icon[]{fsIcons.iconAt(type)};
}
public FileBrowser(boolean selectDir) {
super(selectDir ? "Dirs" : "Files");
needToSelectDirectory = selectDir;
}
public void setListener(FileBrowserListener _listener) {
this.listener = _listener;
}
public void activate() {
if (jimm.modules.fs.FileSystem.isSupported()) {
rebuildTree(FileSystem.ROOT_DIRECTORY);
show();
}
}
private FileNode createParentDir(String file) {
int i = file.lastIndexOf('/', file.length() - 2);
if (i <= 0) {
return null;
}
return new FileNode(file.substring(0, i + 1), file.substring(i + 1));
}
public void run() {
selectFirst = false;
try {
String currentPath = nextDir;
JSR75FileSystem fs = FileSystem.getInstance();
Vector newRoot = fs.getDirectoryContents(currentPath, needToSelectDirectory);
Vector<FileNode> files = new Vector<FileNode>();
for (int i = 0; i < newRoot.size(); ++i) {
FileNode file = (FileNode)newRoot.elementAt(i);
if (!FileSystem.PARENT_DIRECTORY.equals(file.getText())) {
files.addElement(file);
}
}
Util.sort(files);
if (needToSelectDirectory) {
FileNode parent = createParentDir(currentPath);
if (null != parent) {
files.insertElementAt(parent, 0);
selectFirst = true;
}
}
lock();
setAllToTop();
root = files;
currDir = currentPath;
restoring();
unlock();
} catch (JimmException e) {
setError(e);
} catch (Exception e) {
setError(new JimmException(191, 2));
}
nextDir = null;
}
private void rebuildTree(String next) {
if (null == nextDir) {
nextDir = next;
new Thread(this).start();
}
}
private void fileNodeSelected() {
FileNode file = getCurrentFile();
if (null == file) {
return;
}
String fullpath = file.getFullName();
if (selectFirst && (0 == getCurrItem())) {
listener.onDirectorySelect(fullpath);
return;
}
if (file.isDir()) {
rebuildTree(fullpath);
} else {
try {
listener.onFileSelect(fullpath);
} catch (JimmException e) {
setError(e);
}
}
}
protected void doJimmAction(int keyCode) {
switch (keyCode) {
case NativeCanvas.JIMM_SELECT:
fileNodeSelected();
break;
case NativeCanvas.JIMM_BACK:
if ((null != errorMessage) || FileSystem.ROOT_DIRECTORY.equals(currDir)) {
Jimm.getJimm().getCL().activate();
} else {
int d = currDir.lastIndexOf('/', currDir.length() - 2);
rebuildTree(currDir.substring(0, d + 1));
}
break;
}
}
protected boolean hasMenu() {
return false;
}
private FileNode getCurrentFile() {
int num = getCurrItem();
if ((0 <= num) && (num < root.size())) {
return (FileNode)root.elementAt(num);
}
return null;
}
protected void restoring() {
String cmd = "open";
FileNode file = getCurrentFile();
if (null != file) {
if (selectFirst ? (0 == getCurrItem()) : file.isFile()) {
cmd = "select";
}
}
if (null != errorMessage) {
cmd = "";
}
setSoftBarLabels(cmd, cmd, "back", false);
}
protected int getSize() {
return root.size();
}
protected int getItemHeight(int itemIndex) {
return Math.max(CanvasEx.minItemHeight,
Math.max(fsIcons.getHeight(), getDefaultFont().getHeight() + 1));
}
protected void drawEmptyItems(GraphicsEx g, int top_y) {
if (null != errorMessage) {
int height = getHeight() - top_y;
errorMessage.paint(getFontSet(), g, getWidth() / 10,
top_y + (height - errorMessage.getHeight()) / 2,
0, errorMessage.getHeight());
}
}
protected void drawItemData(GraphicsEx g, int index, int x1, int y1, int w, int h, int skip, int to) {
if (selectFirst && (0 == index)) {
g.setThemeColor(CanvasEx.THEME_CAP_BACKGROUND);
g.fillRect(x1, y1, w, h);
g.setThemeColor(CanvasEx.THEME_CAP_TEXT);
}else {
g.setThemeColor(THEME_TEXT);
}
g.setFont(getDefaultFont());
FileNode node = (FileNode)root.elementAt(index);
boolean isDir = node.isDir() || node.isParentDir();
g.drawString(getIcon(isDir ? TYPE_DIR : TYPE_FILE), node.getText(), null,
x1, y1, w, h);
if (selectFirst && (0 == index)) {
g.drawLine(x1, y1 + h, x1 + w, y1 + h);
}
}
}
// #sijapp cond.end#