/* * PrefCacheManager.java * Eisenkraut * * Copyright (c) 2004-2016 Hanns Holger Rutz. All rights reserved. * * This software is published under the GNU General Public License v3+ * * * For further information, please contact Hanns Holger Rutz at * contact@sciss.de */ package de.sciss.eisenkraut.io; import java.io.File; import java.util.prefs.PreferenceChangeEvent; import java.util.prefs.PreferenceChangeListener; import java.util.prefs.Preferences; import de.sciss.app.AbstractApplication; import de.sciss.io.CacheManager; import de.sciss.util.Param; import de.sciss.util.ParamSpace; public class PrefCacheManager extends CacheManager implements PreferenceChangeListener { /** * Convenient name for preferences node */ public static final String DEFAULT_NODE = "cache"; public static final String KEY_ACTIVE = "active"; // boolean public static final String KEY_FOLDER = "folder"; // String public static final String KEY_CAPACITY = "capacity"; // Param private final Preferences prefs; private static final Param DEFAULT_CAPACITY = new Param( 100, ParamSpace.ABS); private static PrefCacheManager instance; public PrefCacheManager( Preferences prefs ) { super(); if( instance != null ) throw new IllegalStateException( "Only one instance allowed" ); instance = this; this.prefs = prefs; final int capacity; final File folder; final boolean active; if( prefs.get( KEY_CAPACITY, null ) == null ) { // create defaults capacity = (int) DEFAULT_CAPACITY.val ; folder = new File( new File( System.getProperty( "user.home" ), AbstractApplication.getApplication().getName() ), "cache" ); active = false; } else { capacity = (int) Param.fromPrefs( prefs, KEY_CAPACITY, DEFAULT_CAPACITY ).val; folder = new File( prefs.get( KEY_FOLDER, "" )); active = prefs.getBoolean( KEY_ACTIVE, false ); } setFolderAndCapacity( folder, capacity ); setActive( active ); prefs.addPreferenceChangeListener( this ); } public static PrefCacheManager getInstance() { return instance; } public Preferences getPreferences() { return prefs; } public void setActive(boolean onOff) { super.setActive(onOff); prefs.putBoolean(KEY_ACTIVE, onOff); } public void setFolderAndCapacity(File folder, int capacity) { super.setFolderAndCapacity(folder, capacity); prefs.put(KEY_FOLDER, folder.getPath()); prefs.put(KEY_CAPACITY, new Param(capacity, ParamSpace.ABS).toString()); } // ------- PreferenceChangeListener interface ------- public void preferenceChange( PreferenceChangeEvent e ) { final String key = e.getKey(); if( key.equals( KEY_FOLDER )) { final File f = new File( e.getNewValue() ); if( (getFolder() == null) || ! (getFolder().equals( f ))) { setFolder( f ); } } else if( key.equals( KEY_CAPACITY )) { final int c = (int) Param.fromPrefs( prefs, key, DEFAULT_CAPACITY ).val; if( getCapacity() != c ) { setCapacity( c ); } } else if( key.equals( KEY_ACTIVE )) { final boolean b = Boolean.valueOf(e.getNewValue()); if( isActive() != b ) { setActive( b ); } } } }