diff options
Diffstat (limited to 'js/dojo/dojox/drawing/stencil/Path.js')
| -rw-r--r-- | js/dojo/dojox/drawing/stencil/Path.js | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/js/dojo/dojox/drawing/stencil/Path.js b/js/dojo/dojox/drawing/stencil/Path.js new file mode 100644 index 0000000..8bc3dde --- /dev/null +++ b/js/dojo/dojox/drawing/stencil/Path.js @@ -0,0 +1,173 @@ +//>>built +// wrapped by build app +define("dojox/drawing/stencil/Path", ["dijit","dojo","dojox"], function(dijit,dojo,dojox){ +dojo.provide("dojox.drawing.stencil.Path"); + + +dojox.drawing.stencil.Path = dojox.drawing.util.oo.declare( + // summary: + // Creates a dojox.gfx Path based on points provided. + // + dojox.drawing.stencil._Base, + function(options){ + dojo.disconnect(this._postRenderCon); + }, + { + type:"dojox.drawing.stencil.Path", + closePath: true, + baseRender:true, + closeRadius:10, + closeColor:{r:255,g:255,b:0,a:.5}, + +/*===== +StencilData: { + // NOT SUPPORTED FOR PATH +}, + +StencilPoints: [ + // summary: + // An Array of StencilPoint objects that describe the Stencil + // 0: Object + // First point + // [1, 2, 3...] more points +], +=====*/ + + _create: function(/*String*/shp, /*Object*/sty){ + // summary: + // Creates a dojox.gfx.shape based on passed arguments. + // Can be called many times by implementation to create + // multiple shapes in one stencil. + // + this.remove(this[shp]); + if(!this.points.length){ return; } + + if(dojox.gfx.renderer=="svg"){ + // NOTE: + // In order to avoid the Safari d="" errors, + // we'll need to build a string and set that. + var strAr = []; + dojo.forEach(this.points, function(o, i){ + if(!o.skip){ + if(i==0){ + strAr.push("M " + o.x +" "+ o.y); + }else{ + var cmd = (o.t || "") + " "; + if(o.x===undefined){// Z + undefined works here, but checking anyway + strAr.push(cmd); + }else{ + strAr.push(cmd + o.x +" "+ o.y); + } + } + } + }, this); + if(this.closePath){ + strAr.push("Z"); + } + + this.stringPath = strAr.join(" "); + + this[shp] = this.container.createPath(strAr.join(" ")).setStroke(sty); + this.closePath && this[shp].setFill(sty.fill); + + }else{ + // Leaving this code for VML. It seems slightly faster but times vary. + this[shp] = this.container.createPath({}).setStroke(sty); + + this.closePath && this[shp].setFill(sty.fill); + + dojo.forEach(this.points, function(o, i){ + if(!o.skip){ + if(i==0 || o.t=="M"){ + this[shp].moveTo(o.x, o.y); + }else if(o.t=="Z"){ + this.closePath && this[shp].closePath(); + }else{ + this[shp].lineTo(o.x, o.y); + } + } + }, this); + + this.closePath && this[shp].closePath(); + } + + this._setNodeAtts(this[shp]); + }, + + render: function(){ + // summary: + // Renders the 'hit' object (the shape used for an expanded + // hit area and for highlighting) and the'shape' (the actual + // display object). + // + this.onBeforeRender(this); + this.renderHit && this._create("hit", this.style.currentHit); + this._create("shape", this.style.current); + //console.log("path render") + + + //console.log("---------------------rend hit", this.renderHit, this.id) + }, + getBounds: function(/* ? Boolean*/absolute){ + // summary: + // Overwriting _Base.getBounds. Not sure how absolute should + // work for a path. + var minx = 10000, miny = 10000, maxx = 0, maxy = 0; + dojo.forEach(this.points, function(p){ + if(p.x!==undefined && !isNaN(p.x)){ + minx = Math.min(minx, p.x); + miny = Math.min(miny, p.y); + maxx = Math.max(maxx, p.x); + maxy = Math.max(maxy, p.y); + } + }); + + return { + x1:minx, + y1:miny, + x2:maxx, + y2:maxy, + x:minx, + y:miny, + w:maxx-minx, + h:maxy-miny + }; + }, + + checkClosePoint: function(/*Object*/firstPt, /*Object*/currPt, /*Boolean*/remove){ + // summary: + // Checks if points are close enough to indicate that + // path should be close. Provides a visual cue. + // description: + // Not actually used in stencil.path - this is used for + // drawable tools that extend it. Note that those tools + // need to remove the shape created: this.closeGuide, or + // add arg: remove + // + var dist = this.util.distance(firstPt.x, firstPt.y, currPt.x, currPt.y); + if(this.points.length>1){ + if(dist<this.closeRadius && !this.closeGuide && !remove){ + var c = { + cx:firstPt.x, + cy:firstPt.y, + rx:this.closeRadius, + ry:this.closeRadius + } + this.closeGuide = this.container.createEllipse(c) + .setFill(this.closeColor); + + }else if(remove || dist > this.closeRadius && this.closeGuide){ + this.remove(this.closeGuide); + this.closeGuide = null; + } + } + // return if we are within close distance + return dist < this.closeRadius; // Boolean + } + } +); + +dojox.drawing.register({ + name:"dojox.drawing.stencil.Path" +}, "stencil"); +}); |
