📄 filemanager.java
字号:
} return pos; } public boolean action(Event e, Object o) { if (e.target == pathname) { // A new path was entered.. cd to it String p = pathname.getText().trim(); if (p.equals("")) return true; find_directory(p, true); return true; } return false; } // singleClick // Called on a single click on a list item public void singleClick(MultiColumn list, int num) { } // doubleClick // Called upon double-clicking on a list item public void doubleClick(MultiColumn list, int num) { if (num == 0) { // Go to parent directory if (showing_files.directory != null) { ((FileNode)nodemap.get(showing_files)).open = false; show_files(showing_files.directory); dirs.select((FileNode)nodemap.get(showing_files)); dirs.redraw(); } return; } RemoteFile d = (showing_files.list())[num-1]; if (d.type == 0) { // Open this directory FileNode pn = (FileNode)nodemap.get(showing_files); pn.fill(); pn.open = true; FileNode fn = (FileNode)nodemap.get(d); fn.fill(); fn.open = true; show_files(d); dirs.select(fn); dirs.redraw(); } else if (d.type <= 4) { // Direct the browser to this file show_file(d); } } void show_file(RemoteFile f) { try { URL u = new URL(getDocumentBase(), "show.cgi"+urlize(f.path)+ "?rand="+System.currentTimeMillis()); getAppletContext().showDocument(u, "show"); } catch(Exception e) { } } String urlize(String s) { StringBuffer rv = new StringBuffer(); for(int i=0; i<s.length(); i++) { char c = s.charAt(i); if (c == '%' || c == '+' || c == '&' || c == '?' || c == ' ') rv.append("%"+Integer.toString(c, 16)); else rv.append(c); } return rv.toString(); } public void upload_notify(String path_str, String info) { int sl = path_str.lastIndexOf('/'); String par_str = path_str.substring(0, sl), file_str = path_str.substring(sl+1); RemoteFile par = find_directory(par_str, false); RemoteFile upfile = par.find(file_str); if (upfile == null) { upfile = new RemoteFile(this, info, par); par.add(upfile); } show_files(showing_files); } public String text(String k, String p[]) { String rv = (String)lang.get(k); for(int i=0; i<p.length; i++) { int idx = rv.indexOf("$"+(i+1)); if (idx != -1) rv = rv.substring(0, idx)+p[i]+rv.substring(idx+2); } return rv; } public String text(String k) { String p[] = { }; return text(k, p); } public String text(String k, String p1) { String p[] = { p1 }; return text(k, p); } public String text(String k, String p1, String p2) { String p[] = { p1, p2 }; return text(k, p); }}// A node in the directory treeclass FileNode extends HierarchyNode{ FileManager parent; RemoteFile file; boolean known; FileNode(RemoteFile file) { this.file = file; parent = file.parent; im = parent.get_image("dir.gif"); ch = new Vector(); text = file.name; parent.nodemap.put(file, this); } // Create the nodes for subdirectories void fill() { if (!known) { RemoteFile l[] = file.list(); ch.removeAllElements(); for(int i=0; i<l.length; i++) if (l[i].type == 0) ch.addElement(new FileNode(l[i])); parent.dirs.redraw(); known = true; } } void add(FileNode n) { for(int i=0; i<=ch.size(); i++) { FileNode ni = i==ch.size() ? null : (FileNode)ch.elementAt(i); if (ni == null || ni.text.compareTo(n.text) > 0) { ch.insertElementAt(n, i); break; } } }}class RemoteFile{ static final int DIR = 0; static final int TEXT = 1; static final int IMAGE = 2; static final int BINARY = 3; static final int UNKNOWN = 4; static final int SYMLINK = 5; static final int DEVICE = 6; static final int PIPE = 7; static final String[] tmap = { "dir.gif", "text.gif", "image.gif", "binary.gif", "unknown.gif", "symlink.gif", "device.gif", "pipe.gif" }; FileManager parent; String path, name; int type; String user, group; int size; int perms; long modified; String linkto; RemoteFile list[]; RemoteFile directory; // Parse a line of text to a file object RemoteFile(FileManager parent, String line, RemoteFile d) { this.parent = parent; StringTokenizer tok = new StringTokenizer(line, "\t"); path = tok.nextToken(); type = Integer.parseInt(tok.nextToken()); user = tok.nextToken(); group = tok.nextToken(); size = Integer.parseInt(tok.nextToken()); perms = Integer.parseInt(tok.nextToken()); modified = Long.parseLong(tok.nextToken())*1000; if (type == 5) linkto = tok.nextToken(); directory = d; if (path.equals("/")) name = "/"; else name = path.substring(path.lastIndexOf('/')+1); } // Create a new, empty file object RemoteFile() { } // Returns a list of files in this directory RemoteFile[] list() { if (list == null) { String l[] = parent.get_text("list.cgi?dir="+ parent.urlize(path)); if (l[0].length() > 0) list = new RemoteFile[0]; else { list = new RemoteFile[l.length-3]; for(int i=3; i<l.length; i++) list[i-3] = new RemoteFile(parent, l[i], this); } } return list; } RemoteFile find(String n) { RemoteFile l[] = list(); for(int i=0; i<l.length; i++) if (l[i].name.equals(n)) return l[i]; return null; } void add(RemoteFile f) { RemoteFile nlist[] = new RemoteFile[list.length+1]; int offset = 0; for(int i=0; i<list.length; i++) { if (list[i].name.compareTo(f.name) > 0 && offset == 0) { nlist[i] = f; offset++; } nlist[i+offset] = list[i]; } if (offset == 0) nlist[list.length] = f; list = nlist; } void delete(RemoteFile f) { RemoteFile nlist[] = new RemoteFile[list.length-1]; for(int i=0,j=0; i<list.length; i++) if (list[i] != f) nlist[j++] = list[i]; list = nlist; }}class EditorWindow extends FixedFrame implements CbButtonCallback{ TextField name; TextArea edit; CbButton save_b, cancel_b; RemoteFile file; FileManager filemgr; // Editing an existing file EditorWindow(RemoteFile f, FileManager p) { super(500, 300); file = f; filemgr = p; makeUI(false); setTitle(filemgr.text("edit_title", file.path)); // Load the file try { URL u = new URL(filemgr.getDocumentBase(), "show.cgi"+filemgr.urlize(file.path)+ "?rand="+System.currentTimeMillis()); URLConnection uc = u.openConnection(); byte buf[] = new byte[uc.getContentLength()]; InputStream is = uc.getInputStream(); int got = 0; while(got < buf.length) got += is.read(buf, got, buf.length-got); edit.setText(new String(buf, 0)); is.close(); file.size = buf.length; } catch(Exception e) { e.printStackTrace(); } } // Creating a new file EditorWindow(String f, FileManager p) { super(500, 300); filemgr = p; makeUI(true); setTitle(filemgr.text("edit_title2")); name.setText(f.equals("/") ? f : f+"/"); name.select(name.getText().length(), name.getText().length()); } void makeUI(boolean add_name) { setLayout(new BorderLayout()); if (add_name) { Panel np = new Panel(); np.setLayout(new BorderLayout()); np.add("West", new Label(filemgr.text("edit_filename"))); np.add("Center", name = new TextField()); add("North", np); } add("Center", edit = new TextArea(20, 80)); edit.setFont(new Font("courier", Font.PLAIN, 10)); Panel bot = new Panel(); bot.setLayout(new FlowLayout(FlowLayout.RIGHT)); bot.add(save_b = new CbButton(filemgr.get_image("save.gif"), filemgr.text("save"), CbButton.LEFT, this)); bot.add(cancel_b = new CbButton(filemgr.get_image("cancel.gif"), filemgr.text("cancel"), CbButton.LEFT, this)); add("South", bot); pack(); show(); } public void click(CbButton b) { if (b == save_b) { RemoteFile par = null, already = null; String save_path; if (file == null) { // Locate the filemgr directory save_path = filemgr.trim_path(name.getText()); int sl = save_path.lastIndexOf('/'); par = filemgr.find_directory( save_path.substring(0, sl), false); if (par == null) return; already = par.find(save_path.substring(sl+1)); if (already != null && (already.type == 0 || already.type == 5)) { new ErrorWindow( filemgr.text("edit_eover", save_path)); return; } } else save_path = file.path; // Save the file back again String s = edit.getText(), line; try { URL u = new URL(filemgr.getDocumentBase(), "save.cgi"+filemgr.urlize(save_path)+ "?rand="+System.currentTimeMillis()); URLConnection uc = u.openConnection(); uc.setDoOutput(true); OutputStream os = uc.getOutputStream(); byte buf[] = new byte[s.length()]; s.getBytes(0, buf.length, buf, 0); os.write(buf); LineInputStream is = new LineInputStream( uc.getInputStream()); String err = is.gets(); if (err.length() > 0) { new ErrorWindow( filemgr.text("edit_esave", err)); is.close(); return; } line = is.gets(); is.close(); } catch(Exception e) { e.printStackTrace(); return; } if (file == null) { // Create and insert or replace the file object file = new RemoteFile(filemgr, line, par); if (already != null) { // A file with this name exists already.type = file.type; already.user = file.user; already.group = file.group; already.size = file.size; already.perms = file.perms; already.modified = file.modified; } else { // Add to the list par.add(file); } } else { file.size = s.length(); file.modified = System.currentTimeMillis(); } filemgr.show_files(filemgr.showing_files); dispose(); } else { // Just close dispose(); } }}class PropertiesWindow extends FixedFrame implements CbButtonCallback{ RemoteFile file; FileManager filemgr; CbButton save_b, cancel_b; TextField linkto; TextField user, group; Checkbox setuid, setgid; PermissionsPanel user_p, group_p, other_p; Checkbox sticky; Choice rec_mode; PropertiesWindow(RemoteFile f, FileManager p) { file = f; filemgr = p; // Create UI setTitle(f.path); setLayout(new BorderLayout()); Panel bot = new Panel(); bot.setLayout(new FlowLayout(FlowLayout.RIGHT)); bot.add(save_b = new CbButton(filemgr.get_image("save.gif"), filemgr.text("save"), CbButton.LEFT, this)); bot.add(cancel_b = new CbButton(filemgr.get_image("cancel.gif"), filemgr.text("cancel"), CbButton.LEFT, this)); add("South", bot); Panel mid = new Panel(); mid.setLayout(new BorderLayout()); add("Center", mid); // Create file details section Panel det = new LinedPanel(filemgr.text("info_file")), dl = new Panel(), dr = new Panel(); setup_leftright(det, dl, dr); add_item(filemgr.text("info_path"), new Label(file.path), dl, dr); add_item(filemgr.text("info_type"), new Label(filemgr.text("file_type"+file.type)), dl, dr); add_item(filemgr.text("info_size"), new Label(String.valueOf(file.size)),dl,dr); add_item(filemgr.text("info_mod"), new Label(String.valueOf(new Date(file.modified))), dl, dr); if (file.type == 5) add_item(filemgr.text("info_link"), linkto = new TextField(file.linkto, 30), dl, dr); mid = add_panel(mid, det); // Create permissions section Panel per = new LinedPanel(filemgr.text("info_perms")), pl = new Panel(), pr = new Panel(); setup_leftright(per, pl, pr); add_item(filemgr.text("info_user"), user_p = new PermissionsPanel(file, 64, filemgr), pl, pr); add_item(filemgr.text("info_group"), group_p = new PermissionsPanel(file, 8, filemgr), pl, pr); add_item(filemgr.text("info_other"), other_p = new PermissionsPanel(file, 1, filemgr), pl,pr); if (file.type == 0) { add_item(filemgr.text("info_sticky"), sticky = new Checkbox( filemgr.text("info_sticky2")), pl,pr); sticky.setState((file.perms&01000) != 0); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -