From 287a980b69cc2ab6bba1159822b42eb033c70efd Mon Sep 17 00:00:00 2001
From: Robert Kaiser <kairo@kairo.at>
Date: Wed, 29 Jul 2009 02:34:12 +0200
Subject: [PATCH] make bookmarks menu work up to a point where it saves the
 current location with a default name and fills the menu correctly with saved
 entries

---
 .../chrome/mandelbrot/content/mandelbrot.js   | 122 ++++++++++--------
 .../chrome/mandelbrot/content/mandelbrot.xul  |   8 +-
 .../mandelbrot/locales/en-US/mandelbrot.dtd   |   3 +-
 .../locales/en-US/mandelbrot.properties       |   1 +
 4 files changed, 75 insertions(+), 59 deletions(-)

diff --git a/xulapp/chrome/mandelbrot/content/mandelbrot.js b/xulapp/chrome/mandelbrot/content/mandelbrot.js
index b515e83..8bce0da 100644
--- a/xulapp/chrome/mandelbrot/content/mandelbrot.js
+++ b/xulapp/chrome/mandelbrot/content/mandelbrot.js
@@ -148,6 +148,7 @@ function EndCalc() {
   let timeUsed = (endTime.getTime() - gStartTime.getTime()) / 1000;
   document.getElementById("statusLabel").value =
       document.getElementById("mbrotBundle").getFormattedString("statusTime", [timeUsed.toFixed(3)]);
+  gStartTime = 0;
 }
 
 function complex(aReal, aImag) {
@@ -376,69 +377,80 @@ function saveImage() {
   }
 }
 
-function updateBookmarksMenu(aParent) {
-  /* from SM UBhistory, needs to be adapted
-    while (aParent.hasChildNodes())
-      aParent.removeChild(aParent.lastChild);
-
-    var file = Components.classes["@mozilla.org/file/directory_service;1"]
-                         .getService(Components.interfaces.nsIProperties)
-                         .get("ProfD", Components.interfaces.nsIFile);
-    file.append("urlbarhistory.sqlite");
-    if (file.exists()) {
-      var connection = Components.classes["@mozilla.org/storage/service;1"]
-                                 .getService(Components.interfaces.mozIStorageService)
-                                 .openDatabase(file);
-      try {
-        if (connection.tableExists("urlbarhistory")) {
-          var statement = connection.createStatement(
-              "SELECT url FROM urlbarhistory ORDER BY ROWID DESC");
-          while (statement.executeStep())
-            aParent.appendChild(document.createElement("menuitem"))
-                   .setAttribute("label", statement.getString(0));
-          statement.reset();
-          statement.finalize();
-          return;
-        }
-      } finally {
-        connection.close();
+function updateBookmarkMenu(aParent) {
+  document.getElementById("bookmarkSave").disabled =
+    (!document.getElementById("drawButton").hidden || (gStartTime > 0));
+
+  while (aParent.hasChildNodes() &&
+         aParent.lastChild.id != 'bookmarkSeparator')
+    aParent.removeChild(aParent.lastChild);
+
+  var file = Components.classes["@mozilla.org/file/directory_service;1"]
+                       .getService(Components.interfaces.nsIProperties)
+                       .get("ProfD", Components.interfaces.nsIFile);
+  file.append("mandelbookmarks.sqlite");
+  if (file.exists()) {
+    var connection = Components.classes["@mozilla.org/storage/service;1"]
+                               .getService(Components.interfaces.mozIStorageService)
+                               .openDatabase(file);
+    try {
+      if (connection.tableExists("bookmarks")) {
+        var statement = connection.createStatement(
+            "SELECT name FROM bookmarks ORDER BY ROWID DESC");
+        while (statement.executeStep())
+          aParent.appendChild(document.createElement("menuitem"))
+                 .setAttribute("label", statement.getString(0));
+        statement.reset();
+        statement.finalize();
+        return;
       }
+    } finally {
+      connection.close();
     }
-    //Create the "Nothing Available" Menu item and disable it.
-    var na = aParent.appendChild(document.createElement("menuitem"));
-    na.setAttribute("label", gNavigatorBundle.getString("nothingAvailable"));
-    na.setAttribute("disabled", "true");
-  */
+  }
+  // Create the "Nothing Available" Menu item and disable it.
+  var na = aParent.appendChild(document.createElement("menuitem"));
+  na.setAttribute("label",
+                  document.getElementById("mbrotBundle").getString("noBookmarks"));
+  na.setAttribute("disabled", "true");
 }
 
 function callBookmark(evtarget) {
 }
 
 function saveBookmark() {
-  /* from SM UBhistory, needs to be adapted
-     // Open or create the urlbar history database.
-     var file = Components.classes["@mozilla.org/file/directory_service;1"]
-                          .getService(Components.interfaces.nsIProperties)
-                          .get("ProfD", Components.interfaces.nsIFile);
-     file.append("urlbarhistory.sqlite");
-     var connection = Components.classes["@mozilla.org/storage/service;1"]
-                                .getService(Components.interfaces.mozIStorageService)
-                                .openDatabase(file);
-     connection.beginTransaction();
-     if (!connection.tableExists("urlbarhistory"))
-       connection.createTable("urlbarhistory", "url TEXT, foo INTEGER, bar REAL");
-       // NULL. The value is a NULL value.
-       // INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value.
-       // REAL. The value is a floating point value, stored as an 8-byte IEEE floating point number.
-       // TEXT. The value is a text string, stored using the database encoding (UTF-8, UTF-16BE or UTF-16-LE).
-
-     // Put the value as it was typed by the user in to urlbar history
-     statement = connection.createStatement(
-         "INSERT INTO urlbarhistory (url) VALUES (?1)");
-     statement.bindStringParameter(0, aUrlToAdd);
-     statement.execute();
-     statement.finalize();
-  */
+  // XXX: retrieve wanted bookmark name
+  var bmName = "mandelbrot bm test";
+
+  // Open or create the bookmarks database.
+  var file = Components.classes["@mozilla.org/file/directory_service;1"]
+                       .getService(Components.interfaces.nsIProperties)
+                       .get("ProfD", Components.interfaces.nsIFile);
+  file.append("mandelbookmarks.sqlite");
+  var connection = Components.classes["@mozilla.org/storage/service;1"]
+                             .getService(Components.interfaces.mozIStorageService)
+                             .openDatabase(file);
+  connection.beginTransaction();
+  if (!connection.tableExists("bookmarks"))
+    connection.createTable("bookmarks", "name TEXT, iteration_max INTEGER, Cr_min REAL, Cr_max REAL, Ci_min REAL, Ci_max REAL");
+  // NULL. The value is a NULL value.
+  // INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value.
+  // REAL. The value is a floating point value, stored as an 8-byte IEEE floating point number.
+  // TEXT. The value is a text string, stored using the database encoding (UTF-8, UTF-16BE or UTF-16-LE).
+
+  // Put value of the current image into the bookmarks table
+  var statement = connection.createStatement(
+      "INSERT INTO bookmarks (name,iteration_max,Cr_min,Cr_max,Ci_min,Ci_max) VALUES (?1,?2,?3,?4,?5,?6)");
+  statement.bindStringParameter(0, bmName);
+  statement.bindStringParameter(1, gPref.getIntPref("mandelbrot.iteration_max"));
+  statement.bindStringParameter(2, parseFloat(gPref.getCharPref("mandelbrot.last_image.Cr_min")));
+  statement.bindStringParameter(3, parseFloat(gPref.getCharPref("mandelbrot.last_image.Cr_max")));
+  statement.bindStringParameter(4, parseFloat(gPref.getCharPref("mandelbrot.last_image.Ci_min")));
+  statement.bindStringParameter(5, parseFloat(gPref.getCharPref("mandelbrot.last_image.Ci_max")));
+  statement.execute();
+  statement.finalize();
+  connection.commitTransaction();
+  connection.close();
 }
 
 function updateIterMenu() {
diff --git a/xulapp/chrome/mandelbrot/content/mandelbrot.xul b/xulapp/chrome/mandelbrot/content/mandelbrot.xul
index 9099762..18b65b0 100644
--- a/xulapp/chrome/mandelbrot/content/mandelbrot.xul
+++ b/xulapp/chrome/mandelbrot/content/mandelbrot.xul
@@ -70,10 +70,12 @@
           <menuitem id="fileQuit" label="&fileQuit.label;" oncommand="quitApp(false);"/>
         </menupopup>
       </menu>
-      <menu id="bookmarksMenu" label="&bookmarksMenu.label;">
-        <menupopup id="menu_bookmarksPopup"
-                   onpopupshowing="updateBookmarksMenu(event.target);"
+      <menu id="bookmarkMenu" label="&bookmarkMenu.label;">
+        <menupopup id="menu_bookmarkPopup"
+                   onpopupshowing="updateBookmarkMenu(event.target);"
                    oncommand="callBookmark(event.target);">
+          <menuitem id="bookmarkSave" label="&bookmarkSave.label;" oncommand="saveBookmark();"/>
+          <menuseparator id="bookmarkSeparator"/>
         </menupopup>
       </menu>
       <menu id="prefMenu" label="&prefMenu.label;">
diff --git a/xulapp/chrome/mandelbrot/locales/en-US/mandelbrot.dtd b/xulapp/chrome/mandelbrot/locales/en-US/mandelbrot.dtd
index 93ce9e5..a8ef6b1 100644
--- a/xulapp/chrome/mandelbrot/locales/en-US/mandelbrot.dtd
+++ b/xulapp/chrome/mandelbrot/locales/en-US/mandelbrot.dtd
@@ -42,7 +42,8 @@
 <!ENTITY fileSave.label   "Save Image…">
 <!ENTITY fileQuit.label   "Quit">
 
-<!ENTITY bookmarksMenu.label "Bookmarks">
+<!ENTITY bookmarkMenu.label "Bookmarks">
+<!ENTITY bookmarkSave.label "Save Bookmark…">
 
 <!ENTITY prefMenu.label   "Settings">
 <!ENTITY iterMenu.label   "Iterations">
diff --git a/xulapp/chrome/mandelbrot/locales/en-US/mandelbrot.properties b/xulapp/chrome/mandelbrot/locales/en-US/mandelbrot.properties
index 2af8f05..f604a1e 100644
--- a/xulapp/chrome/mandelbrot/locales/en-US/mandelbrot.properties
+++ b/xulapp/chrome/mandelbrot/locales/en-US/mandelbrot.properties
@@ -40,3 +40,4 @@ statusDrawing=Drawing image…
 statusTime=Time: %S seconds
 savePrompt=Save Image As…
 pngFilterName=PNG Files
+noBookmarks=[No bookmarks found]
-- 
2.43.0