changeset 1355:c37c6e67ef07

create SVGs through factory
author hertzhaft
date Sun, 15 Feb 2015 13:03:15 +0100
parents 1712eef019e3
children 339e406772f9
files webapp/src/main/webapp/jquery/jquery.digilib.vector.js
diffstat 1 files changed, 118 insertions(+), 117 deletions(-) [+]
line wrap: on
line diff
--- a/webapp/src/main/webapp/jquery/jquery.digilib.vector.js	Sat Feb 14 17:44:50 2015 +0100
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.vector.js	Sun Feb 15 13:03:15 2015 +0100
@@ -47,7 +47,7 @@
  * }
  * 
  */
-(function($) {
+(function ($) {
 
     // affine geometry
     var geom = null;
@@ -81,7 +81,7 @@
          * @param shapes
          * @param layer
          */
-        setShapes : function(data, shapes, layer) {
+        setShapes : function (data, shapes, layer) {
             if (layer == null) {
                 // assume shape layer is 0
                 layer = data.vectorLayers[0];
@@ -102,7 +102,7 @@
          * @param onComplete
          * @param layer
          */
-        addShape : function(data, shape, onComplete, layer) {
+        addShape : function (data, shape, onComplete, layer) {
             if (layer == null) {
                 // assume shape layer is 0
                 layer = data.vectorLayers[0];
@@ -126,7 +126,7 @@
          * @param id
          * @returns shape
          */
-        getShapeById : function(data, id, layer) {
+        getShapeById : function (data, id, layer) {
             if (layer == null) {
                 // assume shape layer is 0
                 layer = data.vectorLayers[0];
@@ -147,7 +147,7 @@
          * @param data
          * @param id
          */
-        removeShapeById : function(data, id, layer) {
+        removeShapeById : function (data, id, layer) {
             if (layer == null) {
                 // assume shape layer is 0
                 layer = data.vectorLayers[0];
@@ -199,7 +199,7 @@
     /**
      * plugin installation routine, called by digilib on each plugin object.
      */
-    var install = function(plugin) {
+    var install = function (plugin) {
         digilib = plugin;
         console.debug('installing vector plugin. digilib:', digilib);
         // import geometry classes
@@ -225,7 +225,8 @@
         };
         // shapes layer is first
         data.vectorLayers = [shapeLayer];
-        // prepare pluggable handle create functions 
+        // pluggable SVG create functions 
+        setupSVGFactory(data);
         setupHandleFactory(data);
         // install event handlers
         $data.bind('update', handleUpdate);
@@ -249,7 +250,7 @@
     /**
      * render all layers on screen
      */
-    var renderLayers = function(data) {
+    var renderLayers = function (data) {
         if (data.imgRect == null)
             return;
         for (var i in data.vectorLayers) {
@@ -312,6 +313,94 @@
     };
 
     /**
+     * setup SVG creation functions
+     * (more functions can be plugged into data.settings.SVGFactory)
+     * 
+     * @param data
+     */
+    var setupSVGFactory = function (data) {
+        var settings = data.settings;
+        var css = settings.cssPrefix;
+        var hs = settings.editHandleSize;
+        // set standard SVG attributes
+        var svgAttr = function (shape) {
+            var props = shape.properties;
+            return {
+                'id': shape.id,
+                'stroke': props['stroke'] || settings.defaultStroke,
+                'stroke-width' : props['stroke-width'] || settings.defaultStrokeWidth,
+                'fill' : props['fill'] || settings.defaultFill,
+                'class' : props['cssclass'],
+                'style' : props['style']
+                };
+            };
+        var factory = {
+            'Point' : function (shape) {
+                var $s = $(svgElement('path', svgAttr(shape)));
+                $s.place = function () {
+                    // point uses pin-like path of size 3*pu
+                    var p = shape.properties.screenpos[0];
+                    var pu = hs / 3;
+                    this.attr({'d': 'M '+p.x+','+p.y+' l '+2*pu+','+pu+' c '+2*pu+','+pu+' '+0+','+3*pu+' '+(-pu)+','+pu+' Z'});
+                    };
+                return $s;
+                },
+            'Line' : function (shape) {
+                var $s = $(svgElement('line', svgAttr(shape)));
+                $s.place = function () {
+                    var p = shape.properties.screenpos;
+                    this.attr({'x1': p[0].x, 'y1': p[0].y, 'x2': p[1].x, 'y2': p[1].y});
+                    };
+                return $s;
+                },
+            'Rectangle' : function (shape) {
+                var $s = $(svgElement('rect', svgAttr(shape)));
+                $s.place = function () {
+                    var p = shape.properties.screenpos;
+                    var r = geom.rectangle(p[0], p[1]);
+                    this.attr({'x': r.x, 'y': r.y, 'width': r.width, 'height': r.height});
+                    };
+                return $s;
+                },
+            'Polygon' : function (shape) {
+                var $s = $(svgElement('polygon', svgAttr(shape)));
+                $s.place = function () {
+                    var p = shape.properties.screenpos;
+                    this.attr({'points': p.join(" ")});
+                    };
+                return $s;
+                },
+            'LineString' : function (shape) {
+                var $s = $(svgElement('polyline', svgAttr(shape)));
+                $s.place = function () {
+                    var p = shape.properties.screenpos;
+                    this.attr({'points': p.join(" ")});
+                    };
+                return $s;
+                },
+            'Circle' : function (shape) {
+                var $s = $(svgElement('circle', svgAttr(shape)));
+                $s.place = function () {
+                    var p = shape.properties.screenpos;
+                    this.attr({'cx': p[0].x, 'cy': p[0].y, 'r': p[0].distance(p[1])});
+                    };
+                return $s;
+                },
+            'Ellipse' : function (shape) {
+                var $s = $(svgElement('ellipse', svgAttr(shape)));
+                $s.place = function () {
+                    var p = shape.properties.screenpos;
+                    this.attr({'cx': p[0].x, 'cy': p[0].y,
+                        'rx' : Math.abs(p[0].x - p[1].x),
+                    'ry' : Math.abs(p[0].y - p[1].y)});
+                    };
+                return $s;
+                }
+            };
+        data.svgFactory = factory;
+    };
+
+    /**
      * setup handle creation functions
      * (more functions can be plugged into data.settings.handleFactory)
      * 
@@ -330,24 +419,24 @@
             'style': 'pointer-events:all'
             };
         var factory = {
-            'square' : function() {
+            'square' : function () {
                 var $h = $(svgElement('rect', attr));
                 $h.attr({'width': hs, 'height': hs});
-                $h.moveTo = function(p) {
+                $h.moveTo = function (p) {
                     this.attr({'x': p.x-d, 'y': p.y-d });
                     };
                 return $h;
                 },
-            'diamond' : function() {
+            'diamond' : function () {
                 var $h = $(svgElement('polygon', attr));
-                $h.moveTo = function(p) {
+                $h.moveTo = function (p) {
                     this.attr('points', (p.x-d) +','+ p.y+ ' '+p.x +','+(p.y+d)+' '+(p.x+d)+','+p.y+' '+p.x+','+(p.y-d));
                     };
                 return $h;
                 },
-            'cross' : function() {
+            'cross' : function () {
                 var $h = $(svgElement('path', attr));
-                $h.moveTo = function(p) {
+                $h.moveTo = function (p) {
                     this.attr('d', 'M'+(p.x-d) +','+ p.y+ ' L'+(p.x+d)+','+p.y+' M'+p.x+','+(p.y+d)+' L'+p.x+','+(p.y-d));
                     };
                 return $h;
@@ -373,9 +462,7 @@
         var trafo = data.imgTrafo;
         // type of handle can be stated in layer
         var type = layer.handleType;
-        var newHandle = data.handleFactory[type];
-        if (newHandle == null) {
-            newHandle = data.handleFactory['square']; }
+        var newHandle = data.handleFactory[type] || data.handleFactory['square'];
         var handles = [];
         var createHandle = function (i, item) {
             var p = trafo.transform(geom.position(item));
@@ -404,7 +491,7 @@
     var createScreenCoords = function (data, shape) {
         var coords = shape.geometry.coordinates;
         var trafo = data.imgTrafo;
-        var screenpos = $.map(coords, function(coord) {
+        var screenpos = $.map(coords, function (coord) {
             return trafo.transform(geom.position(coord));
             });
         shape.properties.screenpos = screenpos;
@@ -427,102 +514,16 @@
             renderShapes(data, layer);
             return;
         }
-        var $svg = $(layer.svgElem);
-        var settings = data.settings;
-        var css = settings.cssPrefix;
-        var hs = settings.editHandleSize;
-        // use given id
-        var id = digilib.fn.createId(shape.id, css+'svg-');
-        // set properties
-        var props = shape.properties || {};
-        var stroke = props['stroke'] || settings.defaultStroke;
-        var strokeWidth = props['stroke-width'] || settings.defaultStrokeWidth;
-        var fill = props['fill'] || settings.defaultFill;
-        var cssclass = props['cssclass'];
-        var style = props['style'];
-        var gt = shape.geometry.type;
-        // convert coords into an array of screen points
-        var p = createScreenCoords(data, shape);
-        // convenience varables
-        var p1 = p[0];
-        var p2 = p[1];
-        var $elem;
-        // render the shape
-        if (gt === 'Point') { 
-            /*
-             * Point
-             */
-            // point uses pin-like path of size 3*pu
-            var pu = hs / 3;
-            $elem = $(svgElement('path', {
-                'id': id, 'class': cssclass,
-                'd': 'M '+p1.x+','+p1.y+' l '+2*pu+','+pu+' c '+2*pu+','+pu+' '+0+','+3*pu+' '+(-pu)+','+pu+' Z',
-                'stroke': stroke, 'stroke-width': strokeWidth, 
-                'fill': fill, 'style': style}));
-        } else if (gt === 'Line') {
-            /*
-             * Line
-             */
-            $elem = $(svgElement('line', {
-                'id': id, 'class': cssclass,
-                'x1': p1.x, 'y1': p1.y,
-                'x2': p2.x, 'y2': p2.y,
-                'stroke': stroke, 'stroke-width': strokeWidth, 'style': style}));
-        } else if (gt === 'Rectangle') {
-            /*
-             * Rectangle
-             */
-            var rect = geom.rectangle(p1, p2);
-            $elem = $(svgElement('rect', {
-                'id': id, 'class': cssclass,
-                'x': rect.x, 'y': rect.y,
-                'width': rect.width, 'height': rect.height,
-                'stroke': stroke, 'stroke-width': strokeWidth,
-                'fill': fill, 'style': style}));
-        } else if (gt === 'Polygon') {
-            /*
-             * Polygon
-             */
-            $elem = $(svgElement('polygon', {
-                'id': id, 'class': cssclass,
-                'points': p.join(" "),
-                'stroke': stroke, 'stroke-width': strokeWidth,
-                'fill': fill, 'style': style}));
-        } else if (gt === 'LineString') {
-            /*
-             * Polyline
-             */
-            $elem = $(svgElement('polyline', {
-                'id': id, 'class': cssclass,
-                'points': p.join(" "),
-                'stroke': stroke, 'stroke-width': strokeWidth,
-                'fill': 'none', 'style': style}));
-        } else if (gt === 'Circle') {
-            /*
-             * Circle
-             */
-            $elem = $(svgElement('circle', {
-                'id': id, 'class': cssclass,
-                'cx': p1.x, 'cy': p1.y, 'r' : p1.distance(p2),
-                'fill' : 'none', 'stroke': stroke, 'stroke-width': strokeWidth, 
-                'style': style}));
-        } else if (gt === 'Ellipse') {
-            /*
-             * Ellipse
-             */
-            $elem = $(svgElement('ellipse', {
-                'id': id, 'class': cssclass,
-                'cx': p1.x, 'cy': p1.y,
-                'rx' : Math.abs(p1.x - p2.x),
-                'ry' : Math.abs(p1.y - p2.y),
-                'fill' : 'none', 'stroke': stroke, 'stroke-width': strokeWidth, 
-                'style': style}));
-        } else {
-        	console.error("Unable to render shape type:", gt);
-        	return;
-        }
+        // create the SVG
+        var shapeType = shape.geometry.type;
+        var newSVG = data.svgFactory[shapeType];
+        var $elem = newSVG(shape);
         shape.$elem = $elem;
-        $svg.append($elem);
+        // place the SVG
+        createScreenCoords(data, shape);
+        $elem.place();
+        // render the SVG
+        $(layer.svgElem).append($elem);
         createHandles(data, shape, layer);
         $(data).trigger("renderShape", shape);
     };
@@ -556,7 +557,7 @@
      * @param data
      * @param shape shape to drag
      * @param vtx vertex number on shape
-     * @onComplete function(data, shape)
+     * @onComplete function (data, shape)
      */
     var getVertexDragHandler = function (data, shape, vtx, onComplete) {
         var $document = $(document);
@@ -675,7 +676,7 @@
      * 
      * @param shapeType shapeType to test
      */
-    var isSupported = function(data, shapeType) {
+    var isSupported = function (data, shapeType) {
         return $.inArray(shapeType, data.settings.supportedShapeTypes) > -1;
     };
 
@@ -687,9 +688,9 @@
      * @param data
      * @param shape the shape to define
      * @param layer the layer to draw on
-     * @onComplete function(data, shape)
+     * @onComplete function (data, shape)
      */
-    var defineShape = function(data, shape, layer, onComplete) {
+    var defineShape = function (data, shape, layer, onComplete) {
         if (layer == null) {
             // assume shape layer is 0
             layer = data.vectorLayers[0];