1 21 22 package org.armedbear.j; 23 24 import java.io.BufferedReader ; 25 import java.io.BufferedWriter ; 26 import java.io.IOException ; 27 import java.io.InputStreamReader ; 28 import java.io.OutputStreamWriter ; 29 import java.util.ArrayList ; 30 import java.util.List ; 31 32 public final class RecentFiles implements Constants 33 { 34 private static final int MAX_ENTRIES = 100; 35 36 private static RecentFiles instance; 38 39 private final ArrayList entries = new ArrayList (); 40 private final File file; 41 private int version; 42 private boolean changed; 43 44 private RecentFiles() 45 { 46 file = File.getInstance(Directories.getEditorDirectory(), "recent"); 47 if (file != null && file.isFile()) 48 load(); 49 } 50 51 public static synchronized RecentFiles getInstance() 52 { 53 if (instance == null) 54 Editor.protect(instance = new RecentFiles()); 55 return instance; 56 } 57 58 public synchronized final List getEntries() 59 { 60 return entries; 61 } 62 63 private RecentFilesEntry findEntry(File file) 64 { 65 if (file != null) { 66 final int limit = entries.size(); 67 for (int i = 0; i < limit; i++) { 68 RecentFilesEntry entry = (RecentFilesEntry) entries.get(i); 69 if (entry.matches(file)) 70 return entry; 71 } 72 } 73 return null; 74 } 75 76 private static boolean excluded(Buffer buffer) 77 { 78 if (buffer.isTransient()) 79 return true; 80 if (buffer instanceof Directory) 81 return true; 82 if (buffer instanceof RemoteBuffer) 83 return true; 84 if (buffer.getModeId() == MAN_MODE) 85 return true; 86 if (buffer instanceof ImageBuffer) 87 return true; 88 if (buffer.getModeId() == SEND_MAIL_MODE) 89 return true; 90 if (buffer.isUntitled()) 91 return true; 92 File file = buffer.getFile(); 93 if (file == null) 94 return true; 95 File parent = file.getParentFile(); 96 if (parent != null && parent.equals(Directories.getTempDirectory())) 97 return true; 98 return false; 99 } 100 101 public synchronized void bufferActivated(Buffer buffer) 102 { 103 if (excluded(buffer)) 104 return; 105 File file = buffer.getFile(); 106 if (file != null) { 107 long now = System.currentTimeMillis(); 108 RecentFilesEntry entry = findEntry(file); 109 if (entry == null) 110 entry = new RecentFilesEntry(file); 111 if (entry.firstVisit == 0) 112 entry.firstVisit = now; 113 entry.lastVisit = now; 114 store(entry); 115 changed = true; 116 } 117 } 118 119 public synchronized void bufferDeactivated(Buffer buffer, Position dot) 120 { 121 if (dot == null) 122 return; 123 if (excluded(buffer)) 124 return; 125 File file = buffer.getFile(); 126 if (file != null) { 127 RecentFilesEntry entry = findEntry(file); 128 if (entry != null) { 129 entry.lineNumber = dot.lineNumber(); 130 entry.offs = dot.getOffset(); 131 store(entry); 132 changed = true; 133 } 134 } 135 } 136 137 private void store(RecentFilesEntry newEntry) 138 { 139 Debug.assertTrue(newEntry != null); 140 final int limit = entries.size(); 141 for (int i = 0; i < limit; i++) { 142 RecentFilesEntry entry = (RecentFilesEntry) entries.get(i); 143 if (entry.equals(newEntry)) { 144 if (i == 0) { 145 entries.set(0, newEntry); 146 return; 147 } 148 entries.remove(i); 149 break; 150 } 151 } 152 entries.add(0, newEntry); 154 } 155 156 private void load() 157 { 158 if (file == null) 159 return; 160 if (!file.isFile()) 161 return; 162 Debug.assertTrue(entries.size() == 0); 163 try { 164 BufferedReader reader = 165 new BufferedReader (new InputStreamReader (file.getInputStream())); 166 String s = reader.readLine(); 167 if (s != null) { 168 try { 169 version = Integer.parseInt(s); 170 } 171 catch (NumberFormatException e) {} 172 if (version == RecentFilesEntry.getVersion()) { 173 while ((s = reader.readLine()) != null) { 174 try { 175 RecentFilesEntry entry = new RecentFilesEntry(s); 177 entries.add(entry); 178 } 179 catch (Exception e) { 180 Log.error("malformed recent files entry"); 181 } 182 } 183 } 184 } 185 reader.close(); 186 } 187 catch (IOException e) { 188 Log.error(e); 189 } 190 if (entries.size() == 0) 191 file.delete(); 192 } 193 194 public synchronized void save() 195 { 196 if (!changed) 197 return; 198 if (file == null) 199 return; 200 if (entries.size() == 0) 201 return; 202 try { 203 BufferedWriter writer = 204 new BufferedWriter (new OutputStreamWriter (file.getOutputStream())); 205 writer.write(String.valueOf(RecentFilesEntry.getVersion())); 206 writer.newLine(); 207 int limit = entries.size(); 208 if (limit > MAX_ENTRIES) 209 limit = MAX_ENTRIES; 210 for (int i = 0; i < limit; i++) { 211 RecentFilesEntry entry = (RecentFilesEntry) entries.get(i); 212 writer.write(entry.toString()); 213 writer.newLine(); 214 } 215 writer.flush(); 216 writer.close(); 217 changed = false; 218 } 219 catch (Exception e) { 220 Log.error(e); 221 } 222 } 223 } 224 | Popular Tags |