123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- // 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");
- });
|