KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > armedbear > j > RecentFiles


1 /*
2  * RecentFiles.java
3  *
4  * Copyright (C) 1998-2003 Peter Graves
5  * $Id: RecentFiles.java,v 1.3 2003/06/29 00:19:34 piso Exp $
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20  */

21
22 package org.armedbear.j;
23
24 import java.io.BufferedReader JavaDoc;
25 import java.io.BufferedWriter JavaDoc;
26 import java.io.IOException JavaDoc;
27 import java.io.InputStreamReader JavaDoc;
28 import java.io.OutputStreamWriter JavaDoc;
29 import java.util.ArrayList JavaDoc;
30 import java.util.List JavaDoc;
31
32 public final class RecentFiles implements Constants
33 {
34     private static final int MAX_ENTRIES = 100;
35
36     // Singleton.
37
private static RecentFiles instance;
38
39     private final ArrayList JavaDoc entries = new ArrayList JavaDoc();
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 JavaDoc 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         // Add new entry.
153
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 JavaDoc reader =
165                 new BufferedReader JavaDoc(new InputStreamReader JavaDoc(file.getInputStream()));
166             String JavaDoc s = reader.readLine();
167             if (s != null) {
168                 try {
169                     version = Integer.parseInt(s);
170                 }
171                 catch (NumberFormatException JavaDoc e) {}
172                 if (version == RecentFilesEntry.getVersion()) {
173                     while ((s = reader.readLine()) != null) {
174                         try {
175                             // Constructor will throw exception if string is invalid.
176
RecentFilesEntry entry = new RecentFilesEntry(s);
177                             entries.add(entry);
178                         }
179                         catch (Exception JavaDoc e) {
180                             Log.error("malformed recent files entry");
181                         }
182                     }
183                 }
184             }
185             reader.close();
186         }
187         catch (IOException JavaDoc 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 JavaDoc writer =
204                 new BufferedWriter JavaDoc(new OutputStreamWriter JavaDoc(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 JavaDoc e) {
220             Log.error(e);
221         }
222     }
223 }
224
Popular Tags