[483] | 1 | define(["dojo", "../util/oo", "./_Base", "../manager/_registry"], |
---|
| 2 | function(dojo, oo, Base, registry){ |
---|
| 3 | |
---|
| 4 | var Image = oo.declare( |
---|
| 5 | Base, |
---|
| 6 | function(options){ |
---|
| 7 | // summary: |
---|
| 8 | // constructor |
---|
| 9 | }, |
---|
| 10 | { |
---|
| 11 | // summary: |
---|
| 12 | // Creates an dojox.gfx Image based on the data |
---|
| 13 | // provided. |
---|
| 14 | |
---|
| 15 | type:"dojox.drawing.stencil.Image", |
---|
| 16 | anchorType: "group", |
---|
| 17 | baseRender:true, |
---|
| 18 | |
---|
| 19 | /*===== |
---|
| 20 | StencilData: { |
---|
| 21 | // summary: |
---|
| 22 | // The data used to create the dojox.gfx Shape |
---|
| 23 | // x: Number |
---|
| 24 | // Left point x |
---|
| 25 | // y: Number |
---|
| 26 | // Top point y |
---|
| 27 | // width: Number? |
---|
| 28 | // Optional width of Image. If not provided, it is obtained |
---|
| 29 | // height: Number? |
---|
| 30 | // Optional height of Image. If not provided, it is obtained |
---|
| 31 | // src: String |
---|
| 32 | // The location of the source image |
---|
| 33 | }, |
---|
| 34 | |
---|
| 35 | StencilPoints: [ |
---|
| 36 | // summary: |
---|
| 37 | // An Array of dojox.__StencilPoint objects that describe the Stencil |
---|
| 38 | // [Top left point, Top right point, Bottom right point, Bottom left point] |
---|
| 39 | ], |
---|
| 40 | =====*/ |
---|
| 41 | |
---|
| 42 | dataToPoints: function(/*Object*/o){ |
---|
| 43 | // summary: |
---|
| 44 | // Converts data to points. |
---|
| 45 | o = o || this.data; |
---|
| 46 | this.points = [ |
---|
| 47 | {x:o.x, y:o.y}, // TL |
---|
| 48 | {x:o.x + o.width, y:o.y}, // TR |
---|
| 49 | {x:o.x + o.width, y:o.y + o.height}, // BR |
---|
| 50 | {x:o.x, y:o.y + o.height} // BL |
---|
| 51 | ]; |
---|
| 52 | return this.points; |
---|
| 53 | }, |
---|
| 54 | |
---|
| 55 | pointsToData: function(/*Array*/p){ |
---|
| 56 | // summary: |
---|
| 57 | // Converts points to data |
---|
| 58 | p = p || this.points; |
---|
| 59 | var s = p[0]; |
---|
| 60 | var e = p[2]; |
---|
| 61 | this.data = { |
---|
| 62 | x: s.x, |
---|
| 63 | y: s.y, |
---|
| 64 | width: e.x-s.x, |
---|
| 65 | height: e.y-s.y, |
---|
| 66 | src: this.src || this.data.src |
---|
| 67 | }; |
---|
| 68 | return this.data; |
---|
| 69 | |
---|
| 70 | }, |
---|
| 71 | |
---|
| 72 | _createHilite: function(){ |
---|
| 73 | // summary: |
---|
| 74 | // Create the hit and highlight area |
---|
| 75 | // for the Image. |
---|
| 76 | this.remove(this.hit); |
---|
| 77 | this.hit = this.container.createRect(this.data) |
---|
| 78 | .setStroke(this.style.current) |
---|
| 79 | .setFill(this.style.current.fill); |
---|
| 80 | this._setNodeAtts(this.hit); |
---|
| 81 | }, |
---|
| 82 | _create: function(/*String*/shp, /*StencilData*/d, /*Object*/sty){ |
---|
| 83 | // summary: |
---|
| 84 | // Creates a dojox.gfx.shape based on passed arguments. |
---|
| 85 | // Can be called many times by implementation to create |
---|
| 86 | // multiple shapes in one stencil. |
---|
| 87 | |
---|
| 88 | this.remove(this[shp]); |
---|
| 89 | var s = this.container.getParent(); |
---|
| 90 | this[shp] = s.createImage(d) |
---|
| 91 | this.container.add(this[shp]); |
---|
| 92 | this._setNodeAtts(this[shp]); |
---|
| 93 | }, |
---|
| 94 | |
---|
| 95 | render: function(dbg){ |
---|
| 96 | // summary: |
---|
| 97 | // Renders the 'hit' object (the shape used for an expanded |
---|
| 98 | // hit area and for highlighting) and the'shape' (the actual |
---|
| 99 | // display object). Image is slightly different than other |
---|
| 100 | // implementations. Instead of calling render twice, it calls |
---|
| 101 | // _createHilite for the 'hit' |
---|
| 102 | |
---|
| 103 | if(this.data.width == "auto" || isNaN(this.data.width)){ |
---|
| 104 | this.getImageSize(true); |
---|
| 105 | console.warn("Image size not provided. Acquiring...") |
---|
| 106 | return; |
---|
| 107 | } |
---|
| 108 | this.onBeforeRender(this); |
---|
| 109 | this.renderHit && this._createHilite(); |
---|
| 110 | this._create("shape", this.data, this.style.current); |
---|
| 111 | }, |
---|
| 112 | getImageSize: function(render){ |
---|
| 113 | // summary: |
---|
| 114 | // Internal. If no image size is passed in with the data |
---|
| 115 | // create a dom node, insert and image, gets its dimensions |
---|
| 116 | // record them - then destroy everything. |
---|
| 117 | |
---|
| 118 | if(this._gettingSize){ return; } // IE gets it twice (will need to mod if src changes) |
---|
| 119 | this._gettingSize = true; |
---|
| 120 | var img = dojo.create("img", {src:this.data.src}, dojo.body()); |
---|
| 121 | var err = dojo.connect(img, "error", this, function(){ |
---|
| 122 | dojo.disconnect(c); |
---|
| 123 | dojo.disconnect(err); |
---|
| 124 | console.error("Error loading image:", this.data.src) |
---|
| 125 | console.warn("Error image:", this.data) |
---|
| 126 | |
---|
| 127 | }); |
---|
| 128 | var c = dojo.connect(img, "load", this, function(){ |
---|
| 129 | var dim = dojo.marginBox(img); |
---|
| 130 | this.setData({ |
---|
| 131 | x:this.data.x, |
---|
| 132 | y:this.data.y, |
---|
| 133 | src:this.data.src, |
---|
| 134 | width:dim.w, |
---|
| 135 | height:dim.h |
---|
| 136 | }); |
---|
| 137 | dojo.disconnect(c); |
---|
| 138 | dojo.destroy(img); |
---|
| 139 | render && this.render(true); |
---|
| 140 | }); |
---|
| 141 | } |
---|
| 142 | } |
---|
| 143 | ); |
---|
| 144 | |
---|
| 145 | dojo.setObject("dojox.drawing.stencil.Image", Image); |
---|
| 146 | registry.register({ |
---|
| 147 | name:"dojox.drawing.stencil.Image" |
---|
| 148 | }, "stencil"); |
---|
| 149 | |
---|
| 150 | return Image; |
---|
| 151 | }); |
---|