--- /dev/null
+package tim.prune.data;
+
+/**
+ * Class to hold and manage the list of recently used files
+ */
+public class RecentFileList
+{
+ private RecentFile[] _files = null;
+ private static final int DEFAULT_SIZE = 6;
+ private static final int MAX_SIZE = 20;
+
+ /**
+ * Default constructor
+ */
+ public RecentFileList()
+ {
+ _files = new RecentFile[DEFAULT_SIZE];
+ }
+
+ /**
+ * Constructor
+ * @param inString String from config
+ */
+ public RecentFileList(String inString)
+ {
+ _files = null;
+ int pos = 0;
+ if (inString != null && inString.length() > 0)
+ {
+ for (String s : inString.split(";"))
+ {
+ if (pos == 0)
+ {
+ int listSize = DEFAULT_SIZE;
+ try
+ {
+ listSize = Integer.parseInt(s);
+ if (listSize < 1 || listSize > MAX_SIZE) {
+ listSize = DEFAULT_SIZE;
+ }
+ }
+ catch (NumberFormatException nfe) {}
+ _files = new RecentFile[listSize];
+ pos++;
+ }
+ else if (pos <= _files.length)
+ {
+ RecentFile rf = new RecentFile(s);
+ if (rf.isValid())
+ {
+ _files[pos-1] = rf;
+ pos++;
+ }
+ }
+ }
+ }
+ if (_files == null) {
+ _files = new RecentFile[DEFAULT_SIZE];
+ }
+ }
+
+ /**
+ * @return size of list (may not have this many entries yet)
+ */
+ public int getSize()
+ {
+ if (_files == null) return 0;
+ return _files.length;
+ }
+
+ /**
+ * @return the number of valid entries in the list
+ */
+ public int getNumEntries()
+ {
+ if (_files == null) return 0;
+ int numFound = 0;
+ for (RecentFile rf : _files) {
+ if (rf != null && rf.isValid())
+ numFound++;
+ }
+ return numFound;
+ }
+
+ /**
+ * @return string to save in config
+ */
+ public String getConfigString()
+ {
+ StringBuilder builder = new StringBuilder(100);
+ int size = getSize();
+ builder.append("" + size);
+ for (RecentFile f : _files)
+ {
+ builder.append(';');
+ if (f != null) builder.append(f.getConfigString());
+ }
+ return builder.toString();
+ }
+
+ /**
+ * Add the given file to the top of the list
+ * @param inRF file to add
+ */
+ public void addFile(RecentFile inRF)
+ {
+ // Build a new array with the latest file at the top
+ RecentFile[] files = new RecentFile[_files.length];
+ int rfIndex = 0;
+ if (inRF != null && inRF.isValid())
+ {
+ files[rfIndex] = inRF;
+ rfIndex++;
+ }
+ // Loop, copying the other files
+ for (RecentFile rf : _files)
+ {
+ if (rf != null && rf.isValid() && (inRF==null || !rf.isSameFile(inRF)))
+ {
+ files[rfIndex] = rf;
+ rfIndex++;
+ if (rfIndex >= files.length) break;
+ }
+ }
+ _files = files;
+ }
+
+ /**
+ * Verify all the entries and remove the invalid ones
+ */
+ public void verifyAll() {
+ addFile(null);
+ }
+
+ /**
+ * Get the RecentFile object at the given index
+ * @param inIndex index, starting at 0
+ * @return RecentFile object or null if out of range
+ */
+ public RecentFile getFile(int inIndex)
+ {
+ if (inIndex < 0 || inIndex >= _files.length) return null;
+ return _files[inIndex];
+ }
+
+ /**
+ * Resize the list to the new size
+ * @param inNewSize new size of list
+ */
+ public void resizeList(int inNewSize)
+ {
+ // don't do anything if size doesn't make sense
+ if (inNewSize > 0 && inNewSize <= MAX_SIZE)
+ {
+ RecentFile[] files = new RecentFile[inNewSize];
+ int numToCopy = _files.length;
+ if (inNewSize < numToCopy) {
+ numToCopy = inNewSize;
+ }
+ System.arraycopy(_files, 0, files, 0, numToCopy);
+ _files = files;
+ }
+ }
+}