summaryrefslogtreecommitdiff
path: root/js/dojo/dojox/sketch/Annotation.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/dojo/dojox/sketch/Annotation.js')
-rw-r--r--js/dojo/dojox/sketch/Annotation.js276
1 files changed, 276 insertions, 0 deletions
diff --git a/js/dojo/dojox/sketch/Annotation.js b/js/dojo/dojox/sketch/Annotation.js
new file mode 100644
index 0000000..b062a4d
--- /dev/null
+++ b/js/dojo/dojox/sketch/Annotation.js
@@ -0,0 +1,276 @@
+//>>built
+define("dojox/sketch/Annotation", [
+ "dojo/_base/kernel",
+ "dojo/_base/lang",
+ "dojo/_base/declare",
+ "dojo/_base/json",
+ "./Anchor",
+ "./_Plugin"
+], function(dojo){
+ dojo.declare("dojox.sketch.AnnotationTool", dojox.sketch._Plugin, {
+ onMouseDown: function(e){
+ this._omd=true;
+ },
+ onMouseMove: function(e,rect){
+ if(!this._omd){
+ return;
+ }
+ if(this._cshape){
+ this._cshape.setShape(rect);
+ } else {
+ this._cshape=this.figure.surface.createRect(rect)
+ .setStroke({color:"#999", width:1, style:"ShortDot"})
+ .setFill([255,255,255,0.7]);
+ this._cshape.getEventSource().setAttribute("shape-rendering","crispEdges");
+ }
+ },
+ onMouseUp: function(e){
+ if(!this._omd){
+ return;
+ }
+ this._omd=false;
+ var f=this.figure;
+ if(this._cshape){
+ f.surface.remove(this._cshape);
+ delete this._cshape;
+ }
+ if(!(f._startPoint.x==e.pageX&&f._startPoint.y==e.pageY)){
+ // The minimum number of pixels one has to travel before a shape
+ // gets drawn.
+ var limit=10;
+ if(Math.max(
+ limit,
+ Math.abs(f._absEnd.x-f._start.x),
+ Math.abs(f._absEnd.y-f._start.y)
+ )>limit){
+ this._create(f._start, f._end);
+ }
+ }
+ },
+ _create: function(start,end){
+ // create a new shape, needs to be accessible from the
+ // dragging functions.
+ var f=this.figure;
+ var _=f.nextKey();
+ var a=new (this.annotation)(f, _);
+ a.transform={
+ dx:f._calCol(start.x/f.zoomFactor),
+ dy:f._calCol(start.y/f.zoomFactor)
+ };
+ a.end={
+ x:f._calCol(end.x/f.zoomFactor),
+ y:f._calCol(end.y/f.zoomFactor)
+ };
+ if(a.control){
+ a.control={
+ x:f._calCol((end.x/2)/f.zoomFactor),
+ y:f._calCol((end.y/2)/f.zoomFactor)
+ };
+ }
+ f.onBeforeCreateShape(a);
+ a.initialize();
+ f.select(a);
+ f.onCreateShape(a);
+ f.history.add(dojox.sketch.CommandTypes.Create,a);
+ }
+ });
+
+ dojox.sketch.Annotation=function(figure, id){
+ // for editing stuff.
+ this.id=this._key=id;
+ this.figure=figure;
+ this.mode=dojox.sketch.Annotation.Modes.View;
+ this.shape=null; // dojox.gfx.Group
+ this.boundingBox=null; // rect for boundaries
+ this.hasAnchors=true;
+ this.anchors={}; // dojox.sketch.Anchor
+ this._properties={
+ 'stroke':{ color:"blue", width:2 },
+ 'font': {family:"Arial", size:16, weight:"bold"},
+ 'fill': "blue",
+ 'label': ""
+ };
+
+ if(this.figure){
+ this.figure.add(this);
+ }
+ };
+
+ var p=dojox.sketch.Annotation.prototype;
+ p.constructor=dojox.sketch.Annotation;
+ p.type=function(){ return ''; };
+ p.getType=function(){ return dojox.sketch.Annotation; };
+ p.onRemove=function(noundo){
+ //this.figure._delete([this],noundo);
+ this.figure.history.add(dojox.sketch.CommandTypes.Delete, this, this.serialize());
+ };
+ p.property=function(name,/*?*/value){
+ var r;
+ name=name.toLowerCase();
+ if(this._properties[name]!==undefined){
+ r=this._properties[name];
+ }
+ if(arguments.length>1){
+ this._properties[name]=value;
+ if(r!=value){
+ this.onPropertyChange(name,r);
+ }
+ }
+ return r;
+ };
+ p.onPropertyChange=function(name,oldvalue){};
+ p.onCreate=function(){
+ this.figure.history.add(dojox.sketch.CommandTypes.Create,this);
+ }
+ p.onDblClick=function(e){
+ var l=prompt('Set new text:',this.property('label'));
+ if(l!==false){
+ this.beginEdit(dojox.sketch.CommandTypes.Modify);
+ this.property('label',l);
+ this.draw();
+ this.endEdit();
+ }
+ }
+ p.initialize=function(){ };
+ p.destroy=function(){ };
+ p.draw=function(){ };
+ p.apply=function(obj){ };
+ p.serialize=function(){ };
+ p.getBBox=function(){ };
+ p.beginEdit=function(type){
+ if(!this._type){
+ this._type=type||dojox.sketch.CommandTypes.Move;
+ this._prevState=this.serialize();
+ }
+ };
+ p.endEdit=function(){
+ if(this._prevState!=this.serialize()){
+ this.figure.history.add(this._type,this,this._prevState);
+ }
+ this._type=this._prevState='';
+ };
+ p.calculate={
+ slope:function(p1, p2){
+ if(!(p1.x-p2.x)){ return 0; }
+ return ((p1.y-p2.y)/(p1.x-p2.x));
+ },
+ dx:function(p1, p2, dy){
+ var s=this.slope(p1,p2);
+ if(s==0){ return s; }
+ return dy/s;
+ },
+ dy:function(p1, p2, dx){
+ return this.slope(p1,p2)*dx;
+ }
+ };
+ p.drawBBox=function(){
+ var r=this.getBBox();
+ if(!this.boundingBox){
+ this.boundingBox=this.shape.createRect(r)
+ .moveToBack()
+ .setStroke({color:"#999", width:1, style:"Dash"})
+ .setFill([238,238,238,0.3]);
+ this.boundingBox.getEventSource().setAttribute("id",this.id+"-boundingBox");
+ this.boundingBox.getEventSource().setAttribute("shape-rendering","crispEdges");
+ this.figure._add(this);
+ } else {
+ this.boundingBox.setShape(r);
+ }
+ };
+ p.setBinding=function(pt){
+ this.transform.dx+=pt.dx;
+ this.transform.dy+=pt.dy;
+ this.draw();
+ };
+ //p.doChange=function(pt){ };
+ p.getTextBox=function(zoomfactor){
+ var fp=this.property('font');
+ //_getTextBox expect style camlCase properties, do it manually here
+ var f = {fontFamily:fp.family,fontSize:fp.size,fontWeight:fp.weight};
+ if(zoomfactor){
+ f.fontSize = Math.floor(f.fontSize/zoomfactor);
+ }
+ return dojox.gfx._base._getTextBox(this.property('label'),f);
+ };
+ p.setMode=function(m){
+ if(this.mode==m){ return; }
+ this.mode=m;
+ var method="disable";
+ if(m==dojox.sketch.Annotation.Modes.Edit){ method="enable"; }
+ if(method=="enable"){
+ // draw the bounding box
+ this.drawBBox();
+ this.figure._add(this);
+ } else {
+ if(this.boundingBox){
+ if(this.shape){ this.shape.remove(this.boundingBox); }
+ this.boundingBox=null;
+ }
+ }
+ for(var p in this.anchors){
+ this.anchors[p][method]();
+ }
+ };
+ p.zoom=function(pct){
+ pct = pct || this.figure.zoomFactor;
+ if(this.labelShape){
+ var f=dojo.clone(this.property('font'));
+ f.size=Math.ceil(f.size/pct)+"px";
+ this.labelShape.setFont(f);
+ }
+
+ for(var n in this.anchors){
+ this.anchors[n].zoom(pct);
+ }
+
+ //In VML, path are always the same width no matter scaling factors,
+ //so aways use 1 for VML
+ if(dojox.gfx.renderer=='vml'){
+ pct=1;
+ }
+ if(this.pathShape){
+ var s=dojo.clone(this.property('stroke'));
+ s.width=pct>1?s.width:Math.ceil(s.width/pct)+"px";
+ this.pathShape.setStroke(s);
+ }
+ };
+ p.writeCommonAttrs=function(){
+ return 'id="' + this.id + '" dojoxsketch:type="' + this.type() + '"'
+ + ' transform="translate('+ this.transform.dx + "," + this.transform.dy + ')"'
+ + (this.data?(' ><![CDATA[data:'+dojo.toJson(this.data)+']]'):'');
+ };
+ p.readCommonAttrs=function(obj){
+ var i=0,cs=obj.childNodes,c;
+ while((c=cs[i++])){
+ if(c.nodeType==4){ //CDATA
+ if(c.nodeValue.substr(0,11)=='properties:'){
+ this._properties=dojo.fromJson(c.nodeValue.substr(11));
+ }else if(c.nodeValue.substr(0,5)=='data:'){
+ this.data=dojo.fromJson(c.nodeValue.substr(5));
+ }else{
+ console.error('unknown CDATA node in node ',obj);
+ }
+ }
+ }
+
+ if(obj.getAttribute('transform')){
+ var t=obj.getAttribute('transform').replace("translate(","");
+ var pt=t.split(",");
+ this.transform.dx=parseFloat(pt[0],10);
+ this.transform.dy=parseFloat(pt[1],10);
+ }
+ };
+ dojox.sketch.Annotation.Modes={ View:0, Edit:1 };
+ dojox.sketch.Annotation.register=function(name,toolclass){
+ var cls=dojox.sketch[name+'Annotation'];
+ dojox.sketch.registerTool(name, function(p){
+ dojo.mixin(p, {
+ shape: name,
+ annotation:cls
+ });
+ return new (toolclass || dojox.sketch.AnnotationTool)(p);
+ });
+ };
+
+ return dojox.sketch.Annotation;
+});