Figure.js 9.6 KB

12345678
  1. /*
  2. Copyright (c) 2004-2009, 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. if(!dojo._hasResource["dojox.sketch.Figure"]){dojo._hasResource["dojox.sketch.Figure"]=true;dojo.provide("dojox.sketch.Figure");dojo.experimental("dojox.sketch");dojo.require("dojox.gfx");dojo.require("dojox.sketch.UndoStack");(function(){var ta=dojox.sketch;ta.tools={};ta.registerTool=function(_1,fn){ta.tools[_1]=fn;};ta.Figure=function(_2){var _3=this;this.annCounter=1;this.shapes=[];this.image=null;this.imageSrc=null;this.size={w:0,h:0};this.surface=null;this.group=null;this.node=null;this.zoomFactor=1;this.tools=null;this.obj={};dojo.mixin(this,_2);this.selected=[];this.hasSelections=function(){return this.selected.length>0;};this.isSelected=function(_4){for(var i=0;i<_3.selected.length;i++){if(_3.selected[i]==_4){return true;}}return false;};this.select=function(_5){if(!_3.isSelected(_5)){_3.clearSelections();_3.selected=[_5];}_5.setMode(ta.Annotation.Modes.View);_5.setMode(ta.Annotation.Modes.Edit);};this.deselect=function(_6){var _7=-1;for(var i=0;i<_3.selected.length;i++){if(_3.selected[i]==_6){_7=i;break;}}if(_7>-1){_6.setMode(ta.Annotation.Modes.View);_3.selected.splice(_7,1);}return _6;};this.clearSelections=function(){for(var i=0;i<_3.selected.length;i++){_3.selected[i].setMode(ta.Annotation.Modes.View);}_3.selected=[];};this.replaceSelection=function(n,o){if(!_3.isSelected(o)){_3.select(n);return;}var _8=-1;for(var i=0;i<_3.selected.length;i++){if(_3.selected[i]==o){_8=i;break;}}if(_8>-1){_3.selected.splice(_8,1,n);}};this._c=null;this._ctr=null;this._lp=null;this._action=null;this._prevState=null;this._startPoint=null;this._ctool=null;this._start=null;this._end=null;this._absEnd=null;this._cshape=null;this._dblclick=function(e){var o=_3._fromEvt(e);if(o){_3.onDblClickShape(o,e);}};this._keydown=function(e){var _9=false;if(e.ctrlKey){if(e.keyCode===90||e.keyCode===122){_3.undo();_9=true;}else{if(e.keyCode===89||e.keyCode===121){_3.redo();_9=true;}}}if(e.keyCode===46||e.keyCode===8){_3._delete(_3.selected);_9=true;}if(_9){dojo.stopEvent(e);}};this._md=function(e){if(dojox.gfx.renderer=="vml"){_3.node.focus();}var o=_3._fromEvt(e);_3._startPoint={x:e.pageX,y:e.pageY};_3._ctr=dojo.position(_3.node);var _a={x:_3.node.scrollLeft,y:_3.node.scrollTop};_3._ctr={x:_3._ctr.x-_a.x,y:_3._ctr.y-_a.y};var X=e.clientX-_3._ctr.x,Y=e.clientY-_3._ctr.y;_3._lp={x:X,y:Y};_3._start={x:X,y:Y};_3._end={x:X,y:Y};_3._absEnd={x:X,y:Y};if(!o){_3.clearSelections();_3._ctool.onMouseDown(e);}else{if(o.type&&o.type()!="Anchor"){if(!_3.isSelected(o)){_3.select(o);_3._sameShapeSelected=false;}else{_3._sameShapeSelected=true;}}o.beginEdit();_3._c=o;}};this._mm=function(e){if(!_3._ctr){return;}var x=e.clientX-_3._ctr.x;var y=e.clientY-_3._ctr.y;var dx=x-_3._lp.x;var dy=y-_3._lp.y;_3._absEnd={x:x,y:y};if(_3._c){_3._c.setBinding({dx:dx/_3.zoomFactor,dy:dy/_3.zoomFactor});_3._lp={x:x,y:y};}else{_3._end={x:dx,y:dy};var _b={x:Math.min(_3._start.x,_3._absEnd.x),y:Math.min(_3._start.y,_3._absEnd.y),width:Math.abs(_3._start.x-_3._absEnd.x),height:Math.abs(_3._start.y-_3._absEnd.y)};if(_b.width&&_b.height){_3._ctool.onMouseMove(e,_b);}}};this._mu=function(e){if(_3._c){_3._c.endEdit();}else{_3._ctool.onMouseUp(e);}_3._c=_3._ctr=_3._lp=_3._action=_3._prevState=_3._startPoint=null;_3._cshape=_3._start=_3._end=_3._absEnd=null;};this.initUndoStack();};var p=ta.Figure.prototype;p.initUndoStack=function(){this.history=new ta.UndoStack(this);};p.setTool=function(t){this._ctool=t;};p.gridSize=0;p._calCol=function(v){return this.gridSize?(Math.round(v/this.gridSize)*this.gridSize):v;};p._delete=function(_c,_d){for(var i=0;i<_c.length;i++){_c[i].setMode(ta.Annotation.Modes.View);_c[i].destroy(_d);this.remove(_c[i]);this._remove(_c[i]);if(!_d){_c[i].onRemove();}}_c.splice(0,_c.length);};p.onDblClickShape=function(_e,e){if(_e["onDblClick"]){_e.onDblClick(e);}};p.onCreateShape=function(_f){};p.onBeforeCreateShape=function(_10){};p.initialize=function(_11){this.node=_11;this.surface=dojox.gfx.createSurface(_11,this.size.w,this.size.h);this.group=this.surface.createGroup();this._cons=[];var es=this.surface.getEventSource();this._cons.push(dojo.connect(es,"ondraggesture",dojo.stopEvent),dojo.connect(es,"ondragenter",dojo.stopEvent),dojo.connect(es,"ondragover",dojo.stopEvent),dojo.connect(es,"ondragexit",dojo.stopEvent),dojo.connect(es,"ondragstart",dojo.stopEvent),dojo.connect(es,"onselectstart",dojo.stopEvent),dojo.connect(es,"onmousedown",this._md),dojo.connect(es,"onmousemove",this._mm),dojo.connect(es,"onmouseup",this._mu),dojo.connect(es,"onclick",this,"onClick"),dojo.connect(es,"ondblclick",this._dblclick),dojo.connect(_11,"onkeydown",this._keydown));this.image=this.group.createImage({width:this.imageSize.w,height:this.imageSize.h,src:this.imageSrc});};p.destroy=function(_12){if(!this.node){return;}if(!_12){if(this.history){this.history.destroy();}if(this._subscribed){dojo.unsubscribe(this._subscribed);delete this._subscribed;}}dojo.forEach(this._cons,dojo.disconnect);this._cons=[];dojo.empty(this.node);this.group=this.surface=null;this.obj={};this.shapes=[];};p.nextKey=function(){return "annotation-"+this.annCounter++;};p.draw=function(){};p.zoom=function(pct){this.zoomFactor=pct/100;var w=this.size.w*this.zoomFactor;var h=this.size.h*this.zoomFactor;this.surface.setDimensions(w,h);this.group.setTransform(dojox.gfx.matrix.scale(this.zoomFactor,this.zoomFactor));for(var i=0;i<this.shapes.length;i++){this.shapes[i].zoom(this.zoomFactor);}};p.getFit=function(){var wF=(this.node.parentNode.offsetWidth-5)/this.size.w;var hF=(this.node.parentNode.offsetHeight-5)/this.size.h;return Math.min(wF,hF)*100;};p.unzoom=function(){this.zoomFactor=1;this.surface.setDimensions(this.size.w,this.size.h);this.group.setTransform();};p._add=function(obj){this.obj[obj._key]=obj;};p._remove=function(obj){if(this.obj[obj._key]){delete this.obj[obj._key];}};p._get=function(key){if(key&&key.indexOf("bounding")>-1){key=key.replace("-boundingBox","");}else{if(key&&key.indexOf("-labelShape")>-1){key=key.replace("-labelShape","");}}return this.obj[key];};p._keyFromEvt=function(e){var key=e.target.id+"";if(key.length==0){var p=e.target.parentNode;var _13=this.surface.getEventSource();while(p&&p.id.length==0&&p!=_13){p=p.parentNode;}key=p.id;}return key;};p._fromEvt=function(e){return this._get(this._keyFromEvt(e));};p.add=function(_14){for(var i=0;i<this.shapes.length;i++){if(this.shapes[i]==_14){return true;}}this.shapes.push(_14);return true;};p.remove=function(_15){var idx=-1;for(var i=0;i<this.shapes.length;i++){if(this.shapes[i]==_15){idx=i;break;}}if(idx>-1){this.shapes.splice(idx,1);}return _15;};p.get=function(id){for(var i=0;i<this.shapes.length;i++){if(this.shapes[i].id==id){return this.shapes[i];}}return null;};p.convert=function(ann,t){var _16=t+"Annotation";if(!ta[_16]){return;}var _17=ann.type(),id=ann.id,_18=ann.label,_19=ann.mode,_1a=ann.tokenId;var _1b,end,_1c,_1d;switch(_17){case "Preexisting":case "Lead":_1d={dx:ann.transform.dx,dy:ann.transform.dy};_1b={x:ann.start.x,y:ann.start.y};end={x:ann.end.x,y:ann.end.y};var cx=end.x-((end.x-_1b.x)/2);var cy=end.y-((end.y-_1b.y)/2);_1c={x:cx,y:cy};break;case "SingleArrow":case "DoubleArrow":_1d={dx:ann.transform.dx,dy:ann.transform.dy};_1b={x:ann.start.x,y:ann.start.y};end={x:ann.end.x,y:ann.end.y};_1c={x:ann.control.x,y:ann.control.y};break;case "Underline":_1d={dx:ann.transform.dx,dy:ann.transform.dy};_1b={x:ann.start.x,y:ann.start.y};_1c={x:_1b.x+50,y:_1b.y+50};end={x:_1b.x+100,y:_1b.y+100};break;case "Brace":}var n=new ta[_16](this,id);if(n.type()=="Underline"){n.transform={dx:_1d.dx+_1b.x,dy:_1d.dy+_1b.y};}else{if(n.transform){n.transform=_1d;}if(n.start){n.start=_1b;}}if(n.end){n.end=end;}if(n.control){n.control=_1c;}n.label=_18;n.token=dojo.lang.shallowCopy(ann.token);n.initialize();this.replaceSelection(n,ann);this._remove(ann);this.remove(ann);ann.destroy();n.setMode(_19);};p.setValue=function(_1e){var obj=dojox.xml.DomParser.parse(_1e);var _1f=this.node;this.load(obj,_1f);};p.load=function(obj,n){if(this.surface){this.destroy(true);}var _20=obj.documentElement;this.size={w:parseFloat(_20.getAttribute("width"),10),h:parseFloat(_20.getAttribute("height"),10)};var g=_20.childrenByName("g")[0];var img=g.childrenByName("image")[0];this.imageSize={w:parseFloat(img.getAttribute("width"),10),h:parseFloat(img.getAttribute("height"),10)};this.imageSrc=img.getAttribute("xlink:href");this.initialize(n);var ann=g.childrenByName("g");for(var i=0;i<ann.length;i++){this._loadAnnotation(ann[i]);}if(this._loadDeferred){this._loadDeferred.callback(this);this._loadDeferred=null;}this.onLoad();};p.onLoad=function(){};p.onClick=function(){};p._loadAnnotation=function(obj){var _21=obj.getAttribute("dojoxsketch:type")+"Annotation";if(ta[_21]){var a=new ta[_21](this,obj.id);a.initialize(obj);this.nextKey();a.setMode(ta.Annotation.Modes.View);this._add(a);return a;}return null;};p.onUndo=function(){};p.onBeforeUndo=function(){};p.onRedo=function(){};p.onBeforeRedo=function(){};p.undo=function(){if(this.history){this.onBeforeUndo();this.history.undo();this.onUndo();}};p.redo=function(){if(this.history){this.onBeforeRedo();this.history.redo();this.onRedo();}};p.serialize=function(){var s="<svg xmlns=\"http://www.w3.org/2000/svg\" "+"xmlns:xlink=\"http://www.w3.org/1999/xlink\" "+"xmlns:dojoxsketch=\"http://dojotoolkit.org/dojox/sketch\" "+"width=\""+this.size.w+"\" height=\""+this.size.h+"\">"+"<g>"+"<image xlink:href=\""+this.imageSrc+"\" x=\"0\" y=\"0\" width=\""+this.size.w+"\" height=\""+this.size.h+"\" />";for(var i=0;i<this.shapes.length;i++){s+=this.shapes[i].serialize();}s+="</g></svg>";return s;};p.getValue=p.serialize;})();}