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; } } }