]> gitweb @ CieloNegro.org - task-reporter.git/blobdiff - src/main/scala/preferences.scala
wip
[task-reporter.git] / src / main / scala / preferences.scala
diff --git a/src/main/scala/preferences.scala b/src/main/scala/preferences.scala
new file mode 100644 (file)
index 0000000..dc35ef8
--- /dev/null
@@ -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);
+}