package name.abuchen.portfolio.ui.util;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.e4.core.di.annotations.Creatable;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.core.di.extensions.EventTopic;
import org.eclipse.e4.core.di.extensions.Preference;
import org.osgi.service.prefs.BackingStoreException;
import name.abuchen.portfolio.ui.PortfolioPlugin;
import name.abuchen.portfolio.ui.UIConstants;
@SuppressWarnings("restriction")
@Creatable
@Singleton
public class RecentFilesCache
{
@Inject
@Preference
IEclipsePreferences preferences;
private static final int MAXIMUM = 10;
private final Set<String> files = Collections
.newSetFromMap(new LinkedHashMap<String, Boolean>(32, 0.7f, true)
{
private static final long serialVersionUID = 1L;
@Override
protected boolean removeEldestEntry(Map.Entry<String, Boolean> eldest)
{
return size() > MAXIMUM;
}
});
@PostConstruct
public void load()
{
String pref = preferences.get(UIConstants.Preferences.RECENT_FILES, ""); //$NON-NLS-1$
if (!pref.isEmpty())
files.addAll(Arrays.asList(pref.split(File.pathSeparator)));
}
@PreDestroy
public void save()
{
try
{
preferences.put(UIConstants.Preferences.RECENT_FILES, String.join(File.pathSeparator, files));
preferences.flush();
}
catch (BackingStoreException e)
{
PortfolioPlugin.log(e);
}
}
@Inject
@Optional
public void onFileOpened(@EventTopic(UIConstants.Event.File.OPENED) String file)
{
files.add(file);
}
@Inject
@Optional
public void onFileSaved(@EventTopic(UIConstants.Event.File.SAVED) String file)
{
files.add(file);
}
@Inject
@Optional
public void onFileRemoved(@EventTopic(UIConstants.Event.File.REMOVED) String file)
{
files.remove(file);
}
public List<String> getRecentFiles()
{
List<String> answer = new ArrayList<>(files);
Collections.reverse(answer);
return answer;
}
public void clearRecentFiles()
{
files.clear();
}
}