introduce touch events (or try that), start refactoring toolbar; also KILL THE XUL...
[mandelbrot.git] / content / mandelbrot.js
similarity index 85%
rename from xulapp/chrome/mandelbrot/content/mandelbrot.js
rename to content/mandelbrot.js
index 1ccebbedd725b884acd92d2358a1210ff4dd1d17..68cdffe30e20cb902589518683a53182fefd3903 100644 (file)
@@ -51,6 +51,16 @@ function Startup() {
   updatePaletteMenu();
   gMbrotBundle = document.getElementById("mbrotBundle");
   document.getElementById("statusLabel").value = gMbrotBundle.getString("statusEmpty");
+
+  let img = document.getElementById("mbrotImage");
+  img.addEventListener("mouseup", imgEvHandler, false);
+  img.addEventListener("mousedown", imgEvHandler, false);
+  img.addEventListener("mousemove", imgEvHandler, false);
+  img.addEventListener("touchstart", imgEvHandler, false);
+  img.addEventListener("touchend", imgEvHandler, false);
+  img.addEventListener("touchcancel", imgEvHandler, false);
+  img.addEventListener("touchleave", imgEvHandler, false);
+  img.addEventListener("touchmove", imgEvHandler, false);
 }
 
 function getAdjustPref(prefname) {
@@ -451,60 +461,65 @@ function drawPoint(context, img_x, img_y, C, iterMax, algorithm) {
 var zoomstart;
 var imgBackup;
 
-function mouseevent(etype, event) {
-  let canvas = document.getElementById("mbrotImage");
-  let context = canvas.getContext("2d");
-  switch (etype) {
-    case 'down':
-      if (event.button == 0) {
-        // left button - start dragzoom
-        zoomstart = {x: event.clientX - canvas.offsetLeft,
-                     y: event.clientY - canvas.offsetTop};
-        imgBackup = context.getImageData(0, 0, canvas.width, canvas.height);
-      }
-      break;
-    case 'up':
-      if (event.button == 0 && zoomstart) {
-        context.putImageData(imgBackup, 0, 0);
-        let zoomend = {x: event.clientX - canvas.offsetLeft,
-                       y: event.clientY - canvas.offsetTop};
-
-        // make sure zoomend is bigger than zoomstart
-        if ((zoomend.x == zoomstart.x) || (zoomend.y == zoomstart.y)) {
-          // cannot zoom what has no area, discard it
-          zoomstart = undefined;
-          return;
+let imgEvHandler = {
+  handleEvent: function(aEvent) {
+    let canvas = document.getElementById("mbrotImage");
+    let context = canvas.getContext("2d");
+    switch (aEvent.type) {
+      case 'mousedown':
+      case 'touchstart':
+        if (aEvent.button == 0) {
+          // left button - start dragzoom
+          zoomstart = {x: aEvent.clientX - canvas.offsetLeft,
+                       y: aEvent.clientY - canvas.offsetTop};
+          imgBackup = context.getImageData(0, 0, canvas.width, canvas.height);
+        }
+        break;
+      case 'mouseup':
+      case 'touchend':
+        if (aEvent.button == 0 && zoomstart) {
+          context.putImageData(imgBackup, 0, 0);
+          let zoomend = {x: aEvent.clientX - canvas.offsetLeft,
+                        y: aEvent.clientY - canvas.offsetTop};
+
+          // make sure zoomend is bigger than zoomstart
+          if ((zoomend.x == zoomstart.x) || (zoomend.y == zoomstart.y)) {
+            // cannot zoom what has no area, discard it
+            zoomstart = undefined;
+            return;
+          }
+          if (zoomend.x < zoomstart.x)
+            [zoomend.x, zoomstart.x] = [zoomstart.x, zoomend.x];
+          if (zoomend.y < zoomstart.y)
+            [zoomend.y, zoomstart.y] = [zoomstart.y, zoomend.y];
+
+          // determine new "coordinates"
+          let CWidth = gCurrentImageData.C_max.r - gCurrentImageData.C_min.r;
+          let CHeight = gCurrentImageData.C_max.i - gCurrentImageData.C_min.i;
+          let newC_min = new complex(
+              gCurrentImageData.C_min.r + zoomstart.x / gCurrentImageData.iWidth * CWidth,
+              gCurrentImageData.C_min.i + zoomstart.y / gCurrentImageData.iHeight * CHeight);
+          let newC_max = new complex(
+              gCurrentImageData.C_min.r + zoomend.x / gCurrentImageData.iWidth * CWidth,
+              gCurrentImageData.C_min.i + zoomend.y / gCurrentImageData.iHeight * CHeight);
+
+          adjustCoordsAndDraw(newC_min, newC_max);
+        }
+        zoomstart = undefined;
+        break;
+      case 'mousemove':
+      case 'touchmove':
+        if (aEvent.button == 0 && zoomstart) {
+          context.putImageData(imgBackup, 0, 0);
+          context.strokeStyle = "rgb(255,255,31)";
+          context.strokeRect(zoomstart.x, zoomstart.y,
+                             aEvent.clientX - canvas.offsetLeft - zoomstart.x,
+                             aEvent.clientY - canvas.offsetTop - zoomstart.y);
         }
-        if (zoomend.x < zoomstart.x)
-          [zoomend.x, zoomstart.x] = [zoomstart.x, zoomend.x];
-        if (zoomend.y < zoomstart.y)
-          [zoomend.y, zoomstart.y] = [zoomstart.y, zoomend.y];
-
-        // determine new "coordinates"
-        let CWidth = gCurrentImageData.C_max.r - gCurrentImageData.C_min.r;
-        let CHeight = gCurrentImageData.C_max.i - gCurrentImageData.C_min.i;
-        let newC_min = new complex(
-            gCurrentImageData.C_min.r + zoomstart.x / gCurrentImageData.iWidth * CWidth,
-            gCurrentImageData.C_min.i + zoomstart.y / gCurrentImageData.iHeight * CHeight);
-        let newC_max = new complex(
-            gCurrentImageData.C_min.r + zoomend.x / gCurrentImageData.iWidth * CWidth,
-            gCurrentImageData.C_min.i + zoomend.y / gCurrentImageData.iHeight * CHeight);
-
-        adjustCoordsAndDraw(newC_min, newC_max);
-      }
-      zoomstart = undefined;
       break;
-    case 'move':
-      if (event.button == 0 && zoomstart) {
-        context.putImageData(imgBackup, 0, 0);
-        context.strokeStyle = "rgb(255,255,31)";
-        context.strokeRect(zoomstart.x, zoomstart.y,
-                           event.clientX - canvas.offsetLeft - zoomstart.x,
-                           event.clientY - canvas.offsetTop - zoomstart.y);
-      }
-    break;
+    }
   }
-}
+};
 
 function saveImage() {
   const nsIFilePicker = Components.interfaces.nsIFilePicker;
@@ -760,29 +775,6 @@ function setAlgorithm(algoID) {
   gPref.setCharPref("mandelbrot.use_algorithm", algoID);
 }
 
-function addonsManager(aPane) {
-  let theEM = Components.classes["@mozilla.org/appshell/window-mediator;1"]
-                        .getService(Components.interfaces.nsIWindowMediator)
-                        .getMostRecentWindow("Extension:Manager");
-  if (theEM) {
-    theEM.focus();
-    if (aPane)
-      theEM.showView(aPane);
-    return;
-  }
-
-  const EMURL = "chrome://mozapps/content/extensions/extensions.xul";
-  const EMFEATURES = "all,dialog=no";
-  if (aPane)
-    window.openDialog(EMURL, "", EMFEATURES, aPane);
-  else
-    window.openDialog(EMURL, "", EMFEATURES);
-}
-
-function errorConsole() {
-  toOpenWindowByType("global:console", "chrome://global/content/console.xul");
-}
-
 function initImgSettings() {
   // Get values from prefs.
   for each (let coord in ["Cr", "Ci"]) {
@@ -884,8 +876,9 @@ function recalcCoord(coord, target) {
   let othercoord = (coord == "Ci") ? "Cr" : "Ci";
   let owndim = (coord == "Ci") ? "height" : "width";
   let otherdim = (coord == "Ci") ? "width" : "height";
+  let myscale;
   if (target == "scale") {
-    var myscale =
+    myscale =
       parseFloat(document.getElementById("is_" + coord + "_max").value) -
       parseFloat(document.getElementById("is_" + coord + "_min").value);
     document.getElementById("is_" + coord + "_scale").value = roundCoord(myscale);
@@ -895,7 +888,7 @@ function recalcCoord(coord, target) {
       parseFloat(document.getElementById("is_" + coord + "_min").value) +
       parseFloat(document.getElementById("is_" + coord + "_scale").value);
     document.getElementById("is_" + coord + "_max").value = roundCoord(mymax);
-    var myscale = document.getElementById("is_" + coord + "_scale").value;
+    myscale = document.getElementById("is_" + coord + "_scale").value;
   }
   if (document.getElementById("is_syncProp").checked) {
     let otherscale = myscale *
@@ -943,52 +936,3 @@ function saveCanvas(aCanvas, aDestFile) {
   // save the canvas data to the file
   persist.saveURI(source, null, null, null, null, aDestFile);
 }
-
-// function below is from http://developer.mozilla.org/en/docs/How_to_Quit_a_XUL_Application
-function quitApp(aForceQuit) {
-  var appStartup = Components.classes['@mozilla.org/toolkit/app-startup;1']
-                             .getService(Components.interfaces.nsIAppStartup);
-
-  // eAttemptQuit will try to close each XUL window, but the XUL window can cancel the quit
-  // process if there is unsaved data. eForceQuit will quit no matter what.
-  var quitSeverity = aForceQuit ? Components.interfaces.nsIAppStartup.eForceQuit :
-                                  Components.interfaces.nsIAppStartup.eAttemptQuit;
-  appStartup.quit(quitSeverity);
-}
-
-// functions below are from comm-central/suite/common/tasksOverlay.js
-function toOpenWindow(aWindow) {
-  try {
-    // Try to focus the previously focused window e.g. message compose body
-    aWindow.document.commandDispatcher.focusedWindow.focus();
-  } catch (e) {
-    // e.g. full-page plugin or non-XUL document; just raise the top window
-    aWindow.focus();
-  }
-}
-
-function toOpenWindowByType(inType, uri, features) {
-  // don't do several loads in parallel
-  if (uri in window)
-    return;
-
-  var topWindow = Components.classes["@mozilla.org/appshell/window-mediator;1"]
-                            .getService(Components.interfaces.nsIWindowMediator)
-                            .getMostRecentWindow(inType);
-  if ( topWindow )
-    toOpenWindow( topWindow );
-  else {
-    // open the requested window, but block it until it's fully loaded
-    function newWindowLoaded(event) {
-      // make sure that this handler is called only once
-      window.removeEventListener("unload", newWindowLoaded, false);
-      window[uri].removeEventListener("load", newWindowLoaded, false);
-      delete window[uri];
-    }
-    // remember the newly loading window until it's fully loaded
-    // or until the current window passes away
-    window[uri] = window.openDialog(uri, "", features || "all,dialog=no");
-    window[uri].addEventListener("load", newWindowLoaded, false);
-    window.addEventListener("unload", newWindowLoaded, false);
-  }
-}