/*
* Copyright 2010-2015 Institut Pasteur.
*
* This file is part of Icy.
*
* Icy is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Icy is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Icy. If not, see <http://www.gnu.org/licenses/>.
*/
package icy.type.collection.list;
import icy.file.FileUtil;
import icy.preferences.XMLPreferences;
import icy.util.StringUtil;
import java.io.File;
import java.util.Arrays;
/**
* @author stephane
*/
public class RecentFileList extends RecentList
{
protected final static int NB_MAX_ENTRY = 10;
protected final static int NB_MAX_FILE = 1000;
protected final static String ID_NB_FILE = "nbFile";
protected final static String ID_FILE = "file";
public RecentFileList(XMLPreferences preferences)
{
super(preferences, NB_MAX_ENTRY);
// clean the list
clean();
}
public void addEntry(String[] paths)
{
// check we are under files limit
if (paths.length > NB_MAX_FILE)
return;
// first remove previous entry
final int ind = find(paths);
synchronized (list)
{
if (ind != -1)
list.remove(ind);
}
// add the list
super.addEntry(paths);
}
public void addEntry(File[] files)
{
// check we are under files limit
if (files.length > NB_MAX_FILE)
return;
final String[] filenames = new String[files.length];
for (int i = 0; i < files.length; i++)
filenames[i] = files[i].getAbsolutePath();
addEntry(filenames);
}
protected int find(String[] filenames)
{
synchronized (list)
{
for (int i = 0; i < list.size(); i++)
if (Arrays.equals((String[]) list.get(i), filenames))
return i;
}
return -1;
}
@Override
public String[] getEntry(int index)
{
return (String[]) super.getEntry(index);
}
public File[] getEntryAsFiles(int index)
{
final String[] filenames = getEntry(index);
final File[] result = new File[filenames.length];
for (int i = 0; i < filenames.length; i++)
result[i] = new File(filenames[i]);
return result;
}
public String getEntryAsName(int index, int maxlen, boolean tailLimit)
{
final String[] filenames = getEntry(index);
if ((filenames == null) || (filenames.length == 0))
return "";
if (filenames.length == 1)
return StringUtil.limit(filenames[0], maxlen, tailLimit);
String result = filenames[0];
for (int i = 1; i < filenames.length; i++)
result += ", " + FileUtil.getFileName(filenames[i]);
return "[" + StringUtil.limit(result, maxlen, tailLimit) + "]";
}
/**
* Remove invalid files from the list
*/
public void clean()
{
for (int i = list.size() - 1; i >= 0; i--)
{
final File[] files = getEntryAsFiles(i);
boolean allExists = true;
for (File file : files)
allExists = allExists && file.exists();
synchronized (list)
{
// one of the files doesn't exist anymore ?
if (!allExists)
// remove it from the list
list.remove(i);
}
}
// save to pref
save();
// inform about change
changed();
}
@Override
protected String[] loadEntry(String key)
{
if (preferences.nodeExists(key))
{
final XMLPreferences pref = preferences.node(key);
if (pref != null)
{
synchronized (pref)
{
// load size
final int numFile = pref.getInt(ID_NB_FILE, 0);
final String[] result = new String[numFile];
// load filenames
for (int i = 0; i < numFile; i++)
result[i] = pref.get(ID_FILE + i, "");
return result;
}
}
}
return null;
}
@Override
protected void saveEntry(String key, Object value)
{
final XMLPreferences pref = preferences.node(key);
// need to check as preferences can have been cleared here
if (pref != null)
{
synchronized (pref)
{
// remove all children
pref.removeChildren();
// then save
if (value != null)
{
final String[] filenames = (String[]) value;
final int numFile = filenames.length;
// save size
pref.putInt(ID_NB_FILE, numFile);
// save filenames
for (int i = 0; i < numFile; i++)
pref.put(ID_FILE + i, filenames[i]);
}
else
{
// save size
pref.putInt(ID_NB_FILE, 0);
}
// then clean
pref.clean();
}
}
}
}