X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=task-reporter.git;a=blobdiff_plain;f=src%2Fmain%2Fscala%2Fpreferences.scala;fp=src%2Fmain%2Fscala%2Fpreferences.scala;h=dc35ef830120c10b960991d03b9db468649ed667;hp=0000000000000000000000000000000000000000;hb=8bb945088ae66f9687f1fd5aa72a1440aba54466;hpb=cac69ad60a6bf6df341e65e3309b7700e14741df diff --git a/src/main/scala/preferences.scala b/src/main/scala/preferences.scala new file mode 100644 index 0000000..dc35ef8 --- /dev/null +++ b/src/main/scala/preferences.scala @@ -0,0 +1,69 @@ +// Borrowed from http://code.google.com/p/preferscala/ +package preferscala; +import sbinary._; +import sbinary.Operations._; +import java.io.File; +import java.util.prefs.Preferences; + +sealed abstract class PreferenceType{ + private[preferscala] def nodeForPackage(clazz : Class[_]) : Preferences; + private[preferscala] def root : Preferences; +} + +object PreferenceType{ + case object User extends PreferenceType{ + private[preferscala] def nodeForPackage(clazz : Class[_]) = Preferences.userNodeForPackage(clazz); + private[preferscala] def root = Preferences.userRoot; + } + + case object System extends PreferenceType{ + private[preferscala] def nodeForPackage(clazz : Class[_]) = Preferences.systemNodeForPackage(clazz); + private[preferscala] def root = Preferences.systemRoot; + } +} + +abstract class PreferenceGroup{ + def underlying : Preferences; + class Preference[T](name : String, default : => T)(implicit bin : Format[T]){ + private var localCache : T = null.asInstanceOf[T]; + + def apply() : T = { + if (localCache == null){ + var bytes = underlying.getByteArray(name, null); + if (bytes == null){ + localCache = default; + } else { + localCache = fromByteArray[T](bytes) + } + } + localCache + } + + def update(t : T){ + localCache = t; + underlying.putByteArray(name, toByteArray[T](t)); + } + + def reset(){ + localCache = null.asInstanceOf[T]; + underlying.remove(name); + underlying.flush(); + } + + def exportToFile(file : File){ + toFile(apply())(file); + } + + def loadFromFile(file : File){ + update(fromFile[T](file)); + } + } +} + +class NamedGroup(groupName : String, pt : PreferenceType) extends PreferenceGroup{ + val underlying = pt.root.node(groupName); +} + +abstract class PackageGroup(pt : PreferenceType) extends PreferenceGroup{ + val underlying = pt.nodeForPackage(getClass); +}