root / trunk / web / dojo / dojox / sketch / Annotation.js @ 13
History | View | Annotate | Download (5.92 KB)
1 |
/*
|
---|---|
2 |
Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
3 |
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
4 |
see: http://dojotoolkit.org/license for details
|
5 |
*/
|
6 |
|
7 |
|
8 |
if(!dojo._hasResource["dojox.sketch.Annotation"]){ |
9 |
dojo._hasResource["dojox.sketch.Annotation"]=true; |
10 |
dojo.provide("dojox.sketch.Annotation");
|
11 |
dojo.require("dojox.sketch.Anchor");
|
12 |
dojo.require("dojox.sketch._Plugin");
|
13 |
(function(){
|
14 |
var ta=dojox.sketch;
|
15 |
dojo.declare("dojox.sketch.AnnotationTool",ta._Plugin,{onMouseDown:function(e){ |
16 |
this._omd=true; |
17 |
},onMouseMove:function(e,_1){ |
18 |
if(!this._omd){ |
19 |
return;
|
20 |
} |
21 |
if(this._cshape){ |
22 |
this._cshape.setShape(_1);
|
23 |
}else{
|
24 |
this._cshape=this.figure.surface.createRect(_1).setStroke({color:"#999",width:1,style:"ShortDot"}).setFill([255,255,255,0.7]); |
25 |
this._cshape.getEventSource().setAttribute("shape-rendering","crispEdges"); |
26 |
} |
27 |
},onMouseUp:function(e){ |
28 |
if(!this._omd){ |
29 |
return;
|
30 |
} |
31 |
this._omd=false; |
32 |
var f=this.figure; |
33 |
if(this._cshape){ |
34 |
f.surface.remove(this._cshape);
|
35 |
delete this._cshape; |
36 |
} |
37 |
if(!(f._startPoint.x==e.pageX&&f._startPoint.y==e.pageY)){
|
38 |
var _2=10; |
39 |
if(Math.max(_2,Math.abs(f._absEnd.x-f._start.x),Math.abs(f._absEnd.y-f._start.y))>_2){
|
40 |
this._create(f._start,f._end);
|
41 |
} |
42 |
} |
43 |
},_create:function(_3,_4){ |
44 |
var f=this.figure; |
45 |
var _5=f.nextKey();
|
46 |
var a=new (this.annotation)(f,_5); |
47 |
a.transform={dx:f._calCol(_3.x/f.zoomFactor),dy:f._calCol(_3.y/f.zoomFactor)}; |
48 |
a.end={x:f._calCol(_4.x/f.zoomFactor),y:f._calCol(_4.y/f.zoomFactor)}; |
49 |
if(a.control){
|
50 |
a.control={x:f._calCol((_4.x/2)/f.zoomFactor),y:f._calCol((_4.y/2)/f.zoomFactor)}; |
51 |
} |
52 |
f.onBeforeCreateShape(a); |
53 |
a.initialize(); |
54 |
f.select(a); |
55 |
f.onCreateShape(a); |
56 |
f.history.add(ta.CommandTypes.Create,a); |
57 |
}}); |
58 |
ta.Annotation=function(_6,id){ |
59 |
this.id=this._key=id; |
60 |
this.figure=_6;
|
61 |
this.mode=ta.Annotation.Modes.View;
|
62 |
this.shape=null; |
63 |
this.boundingBox=null; |
64 |
this.hasAnchors=true; |
65 |
this.anchors={};
|
66 |
this._properties={"stroke":{color:"blue",width:2},"font":{family:"Arial",size:16,weight:"bold"},"fill":"blue","label":""}; |
67 |
if(this.figure){ |
68 |
this.figure.add(this); |
69 |
} |
70 |
}; |
71 |
var p=ta.Annotation.prototype;
|
72 |
p.constructor=ta.Annotation; |
73 |
p.type=function(){ |
74 |
return ""; |
75 |
}; |
76 |
p.getType=function(){ |
77 |
return ta.Annotation;
|
78 |
}; |
79 |
p.onRemove=function(_7){ |
80 |
this.figure.history.add(ta.CommandTypes.Delete,this,this.serialize()); |
81 |
}; |
82 |
p.property=function(_8,_9){ |
83 |
var r;
|
84 |
_8=_8.toLowerCase(); |
85 |
if(this._properties[_8]!==undefined){ |
86 |
r=this._properties[_8];
|
87 |
} |
88 |
if(arguments.length>1){ |
89 |
this._properties[_8]=_9;
|
90 |
if(r!=_9){
|
91 |
this.onPropertyChange(_8,r);
|
92 |
} |
93 |
} |
94 |
return r;
|
95 |
}; |
96 |
p.onPropertyChange=function(_a,_b){ |
97 |
}; |
98 |
p.onCreate=function(){ |
99 |
this.figure.history.add(ta.CommandTypes.Create,this); |
100 |
}; |
101 |
p.onDblClick=function(e){ |
102 |
var l=prompt("Set new text:",this.property("label")); |
103 |
if(l!==false){ |
104 |
this.beginEdit(ta.CommandTypes.Modify);
|
105 |
this.property("label",l); |
106 |
this.draw();
|
107 |
this.endEdit();
|
108 |
} |
109 |
}; |
110 |
p.initialize=function(){ |
111 |
}; |
112 |
p.destroy=function(){ |
113 |
}; |
114 |
p.draw=function(){ |
115 |
}; |
116 |
p.apply=function(_c){ |
117 |
}; |
118 |
p.serialize=function(){ |
119 |
}; |
120 |
p.getBBox=function(){ |
121 |
}; |
122 |
p.beginEdit=function(_d){ |
123 |
if(!this._type){ |
124 |
this._type=_d||ta.CommandTypes.Move;
|
125 |
this._prevState=this.serialize(); |
126 |
} |
127 |
}; |
128 |
p.endEdit=function(){ |
129 |
if(this._prevState!=this.serialize()){ |
130 |
this.figure.history.add(this._type,this,this._prevState); |
131 |
} |
132 |
this._type=this._prevState=""; |
133 |
}; |
134 |
p.calculate={slope:function(p1,p2){ |
135 |
if(!(p1.x-p2.x)){
|
136 |
return 0; |
137 |
} |
138 |
return ((p1.y-p2.y)/(p1.x-p2.x));
|
139 |
},dx:function(p1,p2,dy){ |
140 |
var s=this.slope(p1,p2); |
141 |
if(s==0){ |
142 |
return s;
|
143 |
} |
144 |
return dy/s;
|
145 |
},dy:function(p1,p2,dx){ |
146 |
return this.slope(p1,p2)*dx; |
147 |
}}; |
148 |
p.drawBBox=function(){ |
149 |
var r=this.getBBox(); |
150 |
if(!this.boundingBox){ |
151 |
this.boundingBox=this.shape.createRect(r).moveToBack().setStroke({color:"#999",width:1,style:"Dash"}).setFill([238,238,238,0.3]); |
152 |
this.boundingBox.getEventSource().setAttribute("id",this.id+"-boundingBox"); |
153 |
this.boundingBox.getEventSource().setAttribute("shape-rendering","crispEdges"); |
154 |
this.figure._add(this); |
155 |
}else{
|
156 |
this.boundingBox.setShape(r);
|
157 |
} |
158 |
}; |
159 |
p.setBinding=function(pt){ |
160 |
this.transform.dx+=pt.dx;
|
161 |
this.transform.dy+=pt.dy;
|
162 |
this.draw();
|
163 |
}; |
164 |
p.getTextBox=function(_e){ |
165 |
var fp=this.property("font"); |
166 |
var f={fontFamily:fp.family,fontSize:fp.size,fontWeight:fp.weight}; |
167 |
if(_e){
|
168 |
f.fontSize=Math.floor(f.fontSize/_e); |
169 |
} |
170 |
return dojox.gfx._base._getTextBox(this.property("label"),f); |
171 |
}; |
172 |
p.setMode=function(m){ |
173 |
if(this.mode==m){ |
174 |
return;
|
175 |
} |
176 |
this.mode=m;
|
177 |
var _f="disable"; |
178 |
if(m==ta.Annotation.Modes.Edit){
|
179 |
_f="enable";
|
180 |
} |
181 |
if(_f=="enable"){ |
182 |
this.drawBBox();
|
183 |
this.figure._add(this); |
184 |
}else{
|
185 |
if(this.boundingBox){ |
186 |
if(this.shape){ |
187 |
this.shape.remove(this.boundingBox); |
188 |
} |
189 |
this.boundingBox=null; |
190 |
} |
191 |
} |
192 |
for(var p in this.anchors){ |
193 |
this.anchors[p][_f]();
|
194 |
} |
195 |
}; |
196 |
p.zoom=function(pct){ |
197 |
pct=pct||this.figure.zoomFactor;
|
198 |
if(this.labelShape){ |
199 |
var f=dojo.clone(this.property("font")); |
200 |
f.size=Math.ceil(f.size/pct)+"px";
|
201 |
this.labelShape.setFont(f);
|
202 |
} |
203 |
for(var n in this.anchors){ |
204 |
this.anchors[n].zoom(pct);
|
205 |
} |
206 |
if(dojox.gfx.renderer=="vml"){ |
207 |
pct=1;
|
208 |
} |
209 |
if(this.pathShape){ |
210 |
var s=dojo.clone(this.property("stroke")); |
211 |
s.width=pct>1?s.width:Math.ceil(s.width/pct)+"px"; |
212 |
this.pathShape.setStroke(s);
|
213 |
} |
214 |
}; |
215 |
p.writeCommonAttrs=function(){ |
216 |
return "id=\""+this.id+"\" dojoxsketch:type=\""+this.type()+"\""+" transform=\"translate("+this.transform.dx+","+this.transform.dy+")\""+(this.data?(" ><![CDATA[data:"+dojo.toJson(this.data)+"]]"):""); |
217 |
}; |
218 |
p.readCommonAttrs=function(obj){ |
219 |
var i=0,cs=obj.childNodes,c; |
220 |
while((c=cs[i++])){
|
221 |
if(c.nodeType==4){ |
222 |
if(c.nodeValue.substr(0,11)=="properties:"){ |
223 |
this._properties=dojo.fromJson(c.nodeValue.substr(11)); |
224 |
}else{
|
225 |
if(c.nodeValue.substr(0,5)=="data:"){ |
226 |
this.data=dojo.fromJson(c.nodeValue.substr(5)); |
227 |
}else{
|
228 |
console.error("unknown CDATA node in node ",obj);
|
229 |
} |
230 |
} |
231 |
} |
232 |
} |
233 |
if(obj.getAttribute("transform")){ |
234 |
var t=obj.getAttribute("transform").replace("translate(",""); |
235 |
var pt=t.split(","); |
236 |
this.transform.dx=parseFloat(pt[0],10); |
237 |
this.transform.dy=parseFloat(pt[1],10); |
238 |
} |
239 |
}; |
240 |
ta.Annotation.Modes={View:0,Edit:1}; |
241 |
ta.Annotation.register=function(_10,_11){ |
242 |
var cls=ta[_10+"Annotation"]; |
243 |
ta.registerTool(_10,function(p){
|
244 |
dojo.mixin(p,{shape:_10,annotation:cls}); |
245 |
return new (_11||ta.AnnotationTool)(p); |
246 |
}); |
247 |
}; |
248 |
})(); |
249 |
} |