]> git.pond.sub.org Git - eow/blobdiff - static/dojo-release-1.1.1/dojox/sketch/Annotation.js
add Dojo 1.1.1
[eow] / static / dojo-release-1.1.1 / dojox / sketch / Annotation.js
diff --git a/static/dojo-release-1.1.1/dojox/sketch/Annotation.js b/static/dojo-release-1.1.1/dojox/sketch/Annotation.js
new file mode 100644 (file)
index 0000000..ea260ca
--- /dev/null
@@ -0,0 +1,223 @@
+if(!dojo._hasResource["dojox.sketch.Annotation"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.sketch.Annotation"] = true;
+dojo.provide("dojox.sketch.Annotation");
+dojo.require("dojox.sketch.Anchor");
+dojo.require("dojox.sketch._Plugin");
+
+(function(){
+       var ta=dojox.sketch;
+       dojo.declare("dojox.sketch.AnnotationTool", ta._Plugin, {
+//             constructor: function(){
+////                   console.log('this.shape',this.shape);
+////                   this.annotation=ta.tools[this.shape];
+//             },
+               onMouseMove: function(e,rect){
+                               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){
+                       var f=this.figure;
+                       if(!(f._startPoint.x==e.pageX&&f._startPoint.y==e.pageY)){
+                               if(this._cshape){
+                                       //      The minimum number of pixels one has to travel before a shape
+                                       //              gets drawn.
+                                       var limit=40;
+                                       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);
+                                       }
+                               }
+                       }
+                       if(this._cshape) f.surface.remove(this._cshape);
+               },
+               _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, "annotation-"+_);
+                       a.transform={dx:start.x/f.zoomFactor, dy:start.y/f.zoomFactor};
+                       a.end={ x:end.x/f.zoomFactor, y:end.y/f.zoomFactor };
+                       if(a.control){
+                               a.control={ x:Math.round((end.x/2)/f.zoomFactor),y:Math.round((end.y/2)/f.zoomFactor) };
+                       }
+                       f.onBeforeCreateShape(a);
+                       a.initialize();
+                       f.select(a);
+                       f.onCreateShape(a);
+                       f.history.add(ta.CommandTypes.Create,a);
+               }
+       });
+       ta.Annotation=function(figure, id){
+               //      for editing stuff.
+               this.id=this._key=id;
+               this.figure=figure;
+               this.mode=ta.Annotation.Modes.View;
+               this.shape=null;        // dojox.gfx.Group
+               this.boundingBox=null;  // rect for boundaries
+               this.hasAnchors=true;
+               this.anchors={};        //      ta.Anchor
+               this._properties={
+                       'stroke':{ color:"blue", width:2 },
+                       'fill': "blue",
+                       'label': ""
+               };
+
+               if(this.figure) this.figure.add(this);
+       };
+       var p=ta.Annotation.prototype;
+       p.constructor=ta.Annotation;
+       p.type=function(){ return ''; };
+       p.getType=function(){ return ta.Annotation; };
+
+       p.remove=function(){
+               this.figure.history.add(ta.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(ta.CommandTypes.Create,this);
+       }
+       p.onDblClick=function(event){
+               var l=prompt('Set new text:',this.property('label'));
+               if(l!==false){
+                       this.beginEdit(ta.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){
+               this._type=type||ta.CommandTypes.Move;
+               this._prevState=this.serialize();
+       };
+       p.endEdit=function(){
+               var newstep=true;
+               if(this._type==ta.CommandTypes.Move){
+                       var f=this.figure;
+                       if(f._absEnd.x==f._start.x&&f._absEnd.y==f._start.y){
+                               newstep=false;
+                       }
+               }
+               if(newstep){
+                       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(){
+               return dojox.gfx._base._getTextBox(this.property('label'),ta.Annotation.labelFont);
+       };
+       p.setMode=function(m){
+               if(this.mode==m) return;
+               this.mode=m;
+               var method="disable";
+               if(m==ta.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.writeProperties=function(){
+//             var ps=this._properties;
+//             return "<!CDATA[properties:"+dojo.toJson(ps)+"]]>";
+//     };
+       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);
+               }
+       };
+       ta.Annotation.Modes={ View:0, Edit:1 };
+       ta.Annotation.labelFont={family:"Arial", size:"16px", weight:"bold"};
+       ta.Annotation.register=function(name){
+               var cls=ta[name+'Annotation'];
+               ta.registerTool(name, function(p){dojo.mixin(p,{shape: name,annotation:cls});return new ta.AnnotationTool(p)});
+       };
+})();
+
+}