📄 registers.java
字号:
StringBuffer buf = new StringBuffer(); for(int i = 0; i < registers.length; i++) { if(registers[i] != null) { if(buf.length() != 0) buf.append(' '); buf.append((char)i); } } if(buf.length() == 0) return jEdit.getProperty("view.status.no-registers"); else return buf.toString(); } //}}} //{{{ saveRegisters() method public static void saveRegisters() { if(!loaded || !modified) return; Log.log(Log.MESSAGE,Registers.class,"Saving registers.xml"); File file1 = new File(MiscUtilities.constructPath( jEdit.getSettingsDirectory(), "#registers.xml#save#")); File file2 = new File(MiscUtilities.constructPath( jEdit.getSettingsDirectory(), "registers.xml")); if(file2.exists() && file2.lastModified() != registersModTime) { Log.log(Log.WARNING,Registers.class,file2 + " changed" + " on disk; will not save registers"); return; } jEdit.backupSettingsFile(file2); String lineSep = System.getProperty("line.separator"); BufferedWriter out = null; boolean ok = false; try { out = new BufferedWriter(new FileWriter(file1)); out.write("<?xml version=\"1.0\"?>"); out.write(lineSep); out.write("<!DOCTYPE REGISTERS SYSTEM \"registers.dtd\">"); out.write(lineSep); out.write("<REGISTERS>"); out.write(lineSep); Register[] registers = getRegisters(); for(int i = 0; i < registers.length; i++) { Register register = registers[i]; if(register == null || i == '$' || i == '%') continue; out.write("<REGISTER NAME=\""); if(i == '"') out.write("""); else out.write((char)i); out.write("\">"); out.write(MiscUtilities.charsToEntities( register.toString())); out.write("</REGISTER>"); out.write(lineSep); } out.write("</REGISTERS>"); out.write(lineSep); ok = true; } catch(Exception e) { Log.log(Log.ERROR,Registers.class,e); } finally { try { if(out != null) out.close(); } catch(IOException e) { } } if(ok) { /* to avoid data loss, only do this if the above * completed successfully */ file2.delete(); file1.renameTo(file2); } registersModTime = file2.lastModified(); modified = false; } //}}} //{{{ Private members private static Register[] registers; private static long registersModTime; private static boolean loaded, loading, modified; private Registers() {} static { registers = new Register[256]; registers['$'] = new ClipboardRegister(Toolkit .getDefaultToolkit().getSystemClipboard()); } //{{{ loadRegisters() method private static void loadRegisters() { String settingsDirectory = jEdit.getSettingsDirectory(); if(settingsDirectory == null) return; File registerFile = new File(MiscUtilities.constructPath( jEdit.getSettingsDirectory(),"registers.xml")); if(!registerFile.exists()) return; registersModTime = registerFile.lastModified(); loaded = true; Log.log(Log.MESSAGE,jEdit.class,"Loading registers.xml"); RegistersHandler handler = new RegistersHandler(); XmlParser parser = new XmlParser(); parser.setHandler(handler); Reader in = null; try { loading = true; in = new BufferedReader(new FileReader(registerFile)); parser.parse(null, null, in); } catch(XmlException xe) { int line = xe.getLine(); String message = xe.getMessage(); Log.log(Log.ERROR,Registers.class,registerFile + ":" + line + ": " + message); } catch(FileNotFoundException fnf) { //Log.log(Log.DEBUG,Registers.class,fnf); } catch(Exception e) { Log.log(Log.ERROR,Registers.class,e); } finally { loading = false; try { if(in != null) in.close(); } catch(IOException io) { Log.log(Log.ERROR,Registers.class,io); } } } //}}} //}}} //{{{ Inner classes //{{{ Register interface /** * A register. */ public interface Register { /** * Converts to a string. */ String toString(); /** * Sets the register contents. */ void setValue(String value); } //}}} //{{{ ClipboardRegister class /** * A clipboard register. Register "$" should always be an * instance of this. */ public static class ClipboardRegister implements Register { Clipboard clipboard; public ClipboardRegister(Clipboard clipboard) { this.clipboard = clipboard; } /** * Sets the clipboard contents. */ public void setValue(String value) { StringSelection selection = new StringSelection(value); clipboard.setContents(selection,null); } /** * Returns the clipboard contents. */ public String toString() { try { String selection = (String)(clipboard .getContents(this).getTransferData( DataFlavor.stringFlavor)); boolean trailingEOL = (selection.endsWith("\n") || selection.endsWith(System.getProperty( "line.separator"))); // Some Java versions return the clipboard // contents using the native line separator, // so have to convert it here BufferedReader in = new BufferedReader( new StringReader(selection)); StringBuffer buf = new StringBuffer(); String line; while((line = in.readLine()) != null) { // broken Eclipse workaround! // 24 Febuary 2004 if(line.endsWith("\0")) { line = line.substring(0, line.length() - 1); } buf.append(line); buf.append('\n'); } // remove trailing \n if(!trailingEOL && buf.length() != 0) buf.setLength(buf.length() - 1); return buf.toString(); } catch(Exception e) { Log.log(Log.NOTICE,this,e); return null; } } } //}}} //{{{ StringRegister class /** * Register that stores a string. */ public static class StringRegister implements Register { private String value; /** * Creates a new string register. * @param value The contents */ public StringRegister(String value) { this.value = value; } /** * Sets the register contents. */ public void setValue(String value) { this.value = value; } /** * Converts to a string. */ public String toString() { return value; } /** * Called when this register is no longer available. This * implementation does nothing. */ public void dispose() {} } //}}} //{{{ RegistersHandler class static class RegistersHandler extends HandlerBase { //{{{ resolveEntity() method public Object resolveEntity(String publicId, String systemId) { if("registers.dtd".equals(systemId)) { // this will result in a slight speed up, since we // don't need to read the DTD anyway, as AElfred is // non-validating return new StringReader("<!-- -->"); /* try { return new BufferedReader(new InputStreamReader( getClass().getResourceAsStream("registers.dtd"))); } catch(Exception e) { Log.log(Log.ERROR,this,"Error while opening" + " recent.dtd:"); Log.log(Log.ERROR,this,e); } */ } return null; } //}}} //{{{ attribute() method public void attribute(String aname, String value, boolean isSpecified) { if(aname.equals("NAME")) registerName = value; } //}}} //{{{ doctypeDecl() method public void doctypeDecl(String name, String publicId, String systemId) throws Exception { if("REGISTERS".equals(name)) return; Log.log(Log.ERROR,this,"registers.xml: DOCTYPE must be REGISTERS"); } //}}} //{{{ endElement() method public void endElement(String name) { if(name.equals("REGISTER")) { if(registerName == null || registerName.length() != 1) Log.log(Log.ERROR,this,"Malformed NAME: " + registerName); else setRegister(registerName.charAt(0),charData); } } //}}} //{{{ charData() method public void charData(char[] ch, int start, int length) { charData = new String(ch,start,length); } //}}} //{{{ Private members private String registerName; private String charData; //}}} } //}}} //}}}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -