AjaxAppender.timeout");
+appender.httpRequest.onreadystatechange=function(){return
+};
+appender.httpRequest.abort();
+appender.isInProgress=false;
+if(appender.loggingEventMap.length()>0){appender.send()
+}log4jsLogger.trace("< AjaxAppender.timeout")
+},this.timeout)
+}catch(e){log4jsLogger.fatal(e)
+}log4jsLogger.trace("> AjaxAppender.send")
+}},onReadyStateChanged:function(){log4jsLogger.trace("> AjaxAppender.onReadyStateChanged");
+var req=this.httpRequest;
+if(this.httpRequest.readyState!=4){log4jsLogger.trace("< AjaxAppender.onReadyStateChanged: readyState "+req.readyState+" != 4");
+return
+}var success=((typeof req.status==="undefined")||req.status===0||(req.status>=200&&req.status<300));
+if(success){log4jsLogger.trace(" AjaxAppender.onReadyStateChanged: success");
+this.isInProgress=false
+}else{var msg=" AjaxAppender.onReadyStateChanged: XMLHttpRequest request to URL "+this.loggingUrl+" returned status code "+this.httpRequest.status;
+log4jsLogger.error(msg)
+}log4jsLogger.trace("< AjaxAppender.onReadyStateChanged: readyState == 4")
+},getXmlHttpRequest:function(){log4jsLogger.trace("> AjaxAppender.getXmlHttpRequest");
+var httpRequest=false;
+try{if(window.XMLHttpRequest){httpRequest=new XMLHttpRequest();
+if(httpRequest.overrideMimeType){httpRequest.overrideMimeType(this.layout.getContentType())
+}}else{if(window.ActiveXObject){try{httpRequest=new ActiveXObject("Msxml2.XMLHTTP")
+}catch(e){httpRequest=new ActiveXObject("Microsoft.XMLHTTP")
+}}}}catch(e){httpRequest=false
+}if(!httpRequest){log4jsLogger.fatal("Unfortunatelly your browser does not support AjaxAppender for log4js!")
+}log4jsLogger.trace("< AjaxAppender.getXmlHttpRequest");
+return httpRequest
+},toString:function(){return"Log4js.AjaxAppender[loggingUrl="+this.loggingUrl+", threshold="+this.threshold+"]"
+}});
+Log4js.FileAppender=function(file){this.layout=new Log4js.SimpleLayout();
+this.isIE="undefined";
+this.file=file||"log4js.log";
+try{this.fso=new ActiveXObject("Scripting.FileSystemObject");
+this.isIE=true
+}catch(e){try{netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+this.fso=Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
+this.isIE=false
+}catch(e){log4jsLogger.error(e)
+}}};
+Log4js.FileAppender.prototype=Log4js.extend(new Log4js.Appender(),{doAppend:function(loggingEvent){try{var fileHandle=null;
+if(this.isIE==="undefined"){log4jsLogger.error("Unsupported ")
+}else{if(this.isIE){fileHandle=this.fso.OpenTextFile(this.file,8,true);
+fileHandle.WriteLine(this.layout.format(loggingEvent));
+fileHandle.close()
+}else{netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+this.fso.initWithPath(this.file);
+if(!this.fso.exists()){this.fso.create(0,384)
+}fileHandle=Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
+fileHandle.init(this.fso,4|8|16,52,0);
+var line=this.layout.format(loggingEvent);
+fileHandle.write(line,line.length);
+fileHandle.close()
+}}}catch(e){log4jsLogger.error(e)
+}},doClear:function(){try{if(this.isIE){var fileHandle=this.fso.GetFile(this.file);
+fileHandle.Delete()
+}else{netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+this.fso.initWithPath(this.file);
+if(this.fso.exists()){this.fso.remove(false)
+}}}catch(e){log4jsLogger.error(e)
+}},toString:function(){return"Log4js.FileAppender[file="+this.file+"]"
+}});
+Log4js.WindowsEventAppender=function(){this.layout=new Log4js.SimpleLayout();
+try{this.shell=new ActiveXObject("WScript.Shell")
+}catch(e){log4jsLogger.error(e)
+}};
+Log4js.WindowsEventAppender.prototype=Log4js.extend(new Log4js.Appender(),{doAppend:function(loggingEvent){var winLevel=4;
+switch(loggingEvent.level){case Log4js.Level.FATAL:winLevel=1;
+break;
+case Log4js.Level.ERROR:winLevel=1;
+break;
+case Log4js.Level.WARN:winLevel=2;
+break;
+default:winLevel=4;
+break
+}try{this.shell.LogEvent(winLevel,this.level.format(loggingEvent))
+}catch(e){log4jsLogger.error(e)
+}},toString:function(){return"Log4js.WindowsEventAppender"
+}});
+Log4js.JSAlertAppender=function(){this.layout=new Log4js.SimpleLayout()
+};
+Log4js.JSAlertAppender.prototype=Log4js.extend(new Log4js.Appender(),{doAppend:function(loggingEvent){alert(this.layout.getHeader()+this.layout.format(loggingEvent)+this.layout.getFooter())
+},toString:function(){return"Log4js.JSAlertAppender"
+}});
+Log4js.MozillaJSConsoleAppender=function(){this.layout=new Log4js.SimpleLayout();
+try{netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+this.jsConsole=Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService);
+this.scriptError=Components.classes["@mozilla.org/scripterror;1"].createInstance(Components.interfaces.nsIScriptError)
+}catch(e){log4jsLogger.error(e)
+}};
+Log4js.MozillaJSConsoleAppender.prototype=Log4js.extend(new Log4js.Appender(),{doAppend:function(loggingEvent){try{netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+this.scriptError.init(this.layout.format(loggingEvent),null,null,null,null,this.levelCode(loggingEvent),loggingEvent.categoryName);
+this.jsConsole.logMessage(this.scriptError)
+}catch(e){log4jsLogger.error(e)
+}},toString:function(){return"Log4js.MozillaJSConsoleAppender"
+},levelCode:function(loggingEvent){var retval;
+switch(loggingEvent.level){case Log4js.Level.FATAL:retval=2;
+break;
+case Log4js.Level.ERROR:retval=0;
+break;
+case Log4js.Level.WARN:retval=1;
+break;
+default:retval=1;
+break
+}return retval
+}});
+Log4js.OperaJSConsoleAppender=function(){this.layout=new Log4js.SimpleLayout()
+};
+Log4js.OperaJSConsoleAppender.prototype=Log4js.extend(new Log4js.Appender(),{doAppend:function(loggingEvent){opera.postError(this.layout.format(loggingEvent))
+},toString:function(){return"Log4js.OperaJSConsoleAppender"
+}});
+Log4js.SafariJSConsoleAppender=function(){this.layout=new Log4js.SimpleLayout()
+};
+Log4js.SafariJSConsoleAppender.prototype=Log4js.extend(new Log4js.Appender(),{doAppend:function(loggingEvent){window.console.log(this.layout.format(loggingEvent))
+},toString:function(){return"Log4js.SafariJSConsoleAppender"
+}});
+Log4js.BrowserConsoleAppender=function(){this.consoleDelegate=null;
+if(window.console){this.consoleDelegate=new Log4js.SafariJSConsoleAppender()
+}else{if(window.opera){this.consoleDelegate=new Log4js.OperaJSConsoleAppender()
+}else{if(netscape){this.consoleDelegate=new Log4js.MozillaJSConsoleAppender()
+}else{log4jsLogger.error("Unsupported Browser")
+}}}};
+Log4js.BrowserConsoleAppender.prototype=Log4js.extend(new Log4js.Appender(),{doAppend:function(loggingEvent){this.consoleDelegate.doAppend(loggingEvent)
+},doClear:function(){this.consoleDelegate.doClear()
+},setLayout:function(layout){this.consoleDelegate.setLayout(layout)
+},toString:function(){return"Log4js.BrowserConsoleAppender: "+this.consoleDelegate.toString()
+}});
+Log4js.SimpleLayout=function(){this.LINE_SEP="\n";
+this.LINE_SEP_LEN=1
+};
+Log4js.SimpleLayout.prototype=Log4js.extend(new Log4js.Layout(),{format:function(loggingEvent){return loggingEvent.level.toString()+" - "+loggingEvent.message+this.LINE_SEP
+},getContentType:function(){return"text/plain"
+},getHeader:function(){return""
+},getFooter:function(){return""
+}});
+Log4js.BasicLayout=function(){this.LINE_SEP="\n"
+};
+Log4js.BasicLayout.prototype=Log4js.extend(new Log4js.Layout(),{format:function(loggingEvent){return loggingEvent.categoryName+"~"+loggingEvent.startTime.toLocaleString()+" ["+loggingEvent.level.toString()+"] "+loggingEvent.message+this.LINE_SEP
+},getContentType:function(){return"text/plain"
+},getHeader:function(){return""
+},getFooter:function(){return""
+}});
+Log4js.HtmlLayout=function(){return
+};
+Log4js.HtmlLayout.prototype=Log4js.extend(new Log4js.Layout(),{format:function(loggingEvent){return''+loggingEvent.getFormattedTimestamp()+" - "+loggingEvent.level.toString()+" - "+loggingEvent.message+"
\n"
+},getContentType:function(){return"text/html"
+},getHeader:function(){return"log4js"
+},getFooter:function(){return""
+},getStyle:function(loggingEvent){var style;
+if(loggingEvent.level.toString().search(/ERROR/)!=-1){style="color:red"
+}else{if(loggingEvent.level.toString().search(/FATAL/)!=-1){style="color:red"
+}else{if(loggingEvent.level.toString().search(/WARN/)!=-1){style="color:orange"
+}else{if(loggingEvent.level.toString().search(/DEBUG/)!=-1){style="color:green"
+}else{if(loggingEvent.level.toString().search(/INFO/)!=-1){style="color:white"
+}else{style="color:yellow"
+}}}}}return style
+}});
+Log4js.XMLLayout=function(){return
+};
+Log4js.XMLLayout.prototype=Log4js.extend(new Log4js.Layout(),{format:function(loggingEvent){var useragent="unknown";
+try{useragent=navigator.userAgent
+}catch(e){useragent="unknown"
+}var referer="unknown";
+try{referer=location.href
+}catch(e){referer="unknown"
+}var content='\n';
+content+="\t\n";
+if(loggingEvent.exception){content+=this.formatException(loggingEvent.exception)
+}content+="\n";
+return content
+},getContentType:function(){return"text/xml"
+},getHeader:function(){return'\n'
+},getFooter:function(){return"\n"
+},getSeparator:function(){return"\n"
+},formatException:function(ex){if(ex){var exStr="\t";
+if(ex.message){exStr+="\t\t\n"
+}if(ex.description){exStr+="\t\t\n"
+}exStr+="\t\t";
+exStr+='\t\t\t';
+exStr+="\t\t";
+exStr="\t";
+return exStr
+}return null
+},escapeCdata:function(str){return str.replace(/\]\]>/,"]]>]]>=loggerNameBits.length){replacement=loggerName
+}else{replacement=loggerNameBits.slice(loggerNameBits.length-precision).join(".")
+}}else{replacement=loggerName
+}break;
+case"d":var dateFormat=Log4js.PatternLayout.ISO8601_DATEFORMAT;
+if(specifier){dateFormat=specifier;
+if(dateFormat=="ISO8601"){dateFormat=Log4js.PatternLayout.ISO8601_DATEFORMAT
+}else{if(dateFormat=="ABSOLUTE"){dateFormat=Log4js.PatternLayout.ABSOLUTETIME_DATEFORMAT
+}else{if(dateFormat=="DATE"){dateFormat=Log4js.PatternLayout.DATETIME_DATEFORMAT
+}}}}replacement=(new Log4js.SimpleDateFormat(dateFormat)).format(loggingEvent.startTime);
+break;
+case"m":replacement=loggingEvent.message;
+break;
+case"n":replacement="\n";
+break;
+case"p":replacement=loggingEvent.level.toString();
+break;
+case"r":replacement=""+loggingEvent.startTime.toLocaleTimeString();
+break;
+case"%":replacement="%";
+break;
+default:replacement=matchedString;
+break
+}var len;
+if(truncation){len=parseInt(truncation.substr(1),10);
+replacement=replacement.substring(0,len)
+}if(padding){if(padding.charAt(0)=="-"){len=parseInt(padding.substr(1),10);
+while(replacement.length0){var firstItem=this.array[0];
+for(var i=0;
+i-1?vYearLong:vYearShort);
+var vHour=this.addZero(vDate.getHours());
+var vMinute=this.addZero(vDate.getMinutes());
+var vSecond=this.addZero(vDate.getSeconds());
+var vTimeZone=this.O(vDate);
+var vDateString=vFormat.replace(/dd/g,vDay).replace(/MM/g,vMonth).replace(/y{1,4}/g,vYear);
+vDateString=vDateString.replace(/hh/g,vHour).replace(/mm/g,vMinute).replace(/ss/g,vSecond);
+vDateString=vDateString.replace(/O/g,vTimeZone);
+return vDateString
+},addZero:function(vNumber){return((vNumber<10)?"0":"")+vNumber
+},O:function(date){var os=Math.abs(date.getTimezoneOffset());
+var h=String(Math.floor(os/60));
+var m=String(os%60);
+h.length==1?h="0"+h:1;
+m.length==1?m="0"+m:1;
+return date.getTimezoneOffset()<0?"+"+h+m:"-"+h+m
+}};
+var log4jsLogger=Log4js.getLogger("Log4js");
+log4jsLogger.addAppender(new Log4js.ConsoleAppender());
+log4jsLogger.setLevel(Log4js.Level.ALL);core.Monitor=function(fadeElement,logContentElem){$assert(fadeElement,"fadeElement can not be null");
+$assert(logContentElem,"logContentElem can not be null");
+this.pendingMessages=[];
+this.inProgress=false;
+this._container=fadeElement;
+this._currentMessage=null;
+this._logContentElem=logContentElem;
+this._fxOpacity=fadeElement.effect("opacity",{duration:6000})
+};
+core.Monitor.prototype._logMessage=function(msg,msgKind){this._fxOpacity.clearTimer();
+if(msgKind==core.Monitor.MsgKind.ERROR){msg=""+msg+"
"
+}this._currentMessage=msg;
+this._fxOpacity.start(1,0);
+this._logContentElem.innerHTML=msg
+};
+core.Monitor.prototype.logError=function(userMsg){this.logMessage(userMsg,core.Monitor.MsgKind.ERROR)
+};
+core.Monitor.prototype.logFatal=function(userMsg){this.logMessage(userMsg,core.Monitor.MsgKind.FATAL)
+};
+core.Monitor.prototype.logMessage=function(msg,msgKind){if(!msgKind){msgKind=core.Monitor.MsgKind.INFO
+}if(msgKind==core.Monitor.MsgKind.FATAL){new Windoo.Alert(msg,{window:{theme:Windoo.Themes.aero,title:"Outch!!. An unexpected error.",onClose:function(){}}})
+}else{var messages=this.pendingMessages;
+var monitor=this;
+if(!this.executer){monitor._logMessage(msg,msgKind);
+var disptacher=function(){if(messages.length>0){var msgToDisplay=messages.shift();
+monitor._logMessage(msgToDisplay)
+}if(messages.length==0){$clear(monitor.executer);
+monitor.executer=null;
+monitor._fxOpacity.hide();
+this._currentMessage=null
+}};
+this.executer=disptacher.periodical(600)
+}else{if(this._currentMessage!=msg){messages.push(msg)
+}}}};
+core.Monitor.setInstance=function(monitor){this.monitor=monitor
+};
+core.Monitor.getInstance=function(){var result=this.monitor;
+if(result==null){result={logError:function(){},logMessage:function(){}}
+}return result
+};
+core.Monitor.MsgKind={INFO:1,WARNING:2,ERROR:3,FATAL:4};core.Point=function(x,y){this.x=x;
+this.y=y
+};
+core.Point.prototype.setValue=function(x,y){this.x=x;
+this.y=y
+};
+core.Point.prototype.inspect=function(){return"{x:"+this.x+",y:"+this.y+"}"
+};
+core.Point.prototype.clone=function(){return new core.Point(this.x,this.y)
+};
+core.Point.fromString=function(point){var values=point.split(",");
+return new core.Point(values[0],values[1])
+};core.UserAgent={isMozillaFamily:function(){return this.browser=="Netscape"||this.browser=="Firefox"
+},isIE:function(){return this.browser=="Explorer"
+},init:function(){this.browser=this.searchString(this.dataBrowser)||"An unknown browser";
+this.version=this.searchVersion(navigator.userAgent)||this.searchVersion(navigator.appVersion)||"an unknown version";
+this.OS=this.searchString(this.dataOS)||"an unknown OS"
+},searchString:function(data){for(var i=0;
+i=0)?1:-1
+};
+function $import(src){var scriptElem=document.createElement("script");
+scriptElem.setAttribute("src",src);
+scriptElem.setAttribute("type","text/javascript");
+document.getElementsByTagName("head")[0].appendChild(scriptElem)
+}core.Utils.getMousePosition=function(event){var xcoord=-1;
+var ycoord=-1;
+if(!$defined(event)){if($defined(window.event)){event=window.event
+}else{throw"Could not obtain mouse position"
+}}if($defined(event.$extended)){event=event.event
+}if(typeof (event.pageX)=="number"){xcoord=event.pageX;
+ycoord=event.pageY
+}else{if(typeof (event.clientX)=="number"){xcoord=event.clientX;
+ycoord=event.clientY;
+var badOldBrowser=(window.navigator.userAgent.indexOf("Opera")+1)||(window.ScriptEngine&&ScriptEngine().indexOf("InScript")+1)||(navigator.vendor=="KDE");
+if(!badOldBrowser){if(document.body&&(document.body.scrollLeft||document.body.scrollTop)){xcoord+=document.body.scrollLeft;
+ycoord+=document.body.scrollTop
+}else{if(document.documentElement&&(document.documentElement.scrollLeft||document.documentElement.scrollTop)){xcoord+=document.documentElement.scrollLeft;
+ycoord+=document.documentElement.scrollTop
+}}}}else{throw"Could not obtain mouse position"
+}}return{x:xcoord,y:ycoord}
+};
+core.Utils.workOutDivElementPosition=function(divElement){var curleft=0;
+var curtop=0;
+if($defined(divElement.offsetParent)){curleft=divElement.offsetLeft;
+curtop=divElement.offsetTop;
+while(divElement=divElement.offsetParent){curleft+=divElement.offsetLeft;
+curtop+=divElement.offsetTop
+}}return{x:curleft,y:curtop}
+};
+core.Utils.innerXML=function(node){if($defined(node.innerXML)){return node.innerXML
+}else{if($defined(node.xml)){return node.xml
+}else{if($defined(XMLSerializer)){return(new XMLSerializer()).serializeToString(node)
+}}}};
+core.Utils.createDocument=function(){var doc=null;
+var _document=window.document;
+if($defined(window.ActiveXObject)){var prefixes=["MSXML2","Microsoft","MSXML","MSXML3"];
+for(var i=0;
+iposition.y+(size.height/2)){y=position.y+(size.height/2)+gap;
+x=position.x-((position.y-y)/m);
+if(x>position.x+(size.width/2)){x=position.x+(size.width/2)
+}else{if(xposition.x+(size.width/2)){x=position.x+(size.width/2)
+}else{if(xtarPos.x){fix=-1
+}var x1=srcPos.x+Math.sqrt(l*l/(1+(m*m)))*fix;
+var y1=m*(x1-srcPos.x)+srcPos.y;
+var x2=tarPos.x+Math.sqrt(l*l/(1+(m*m)))*fix*-1;
+var y2=m*(x2-tarPos.x)+tarPos.y;
+return[new core.Point(-srcPos.x+x1,-srcPos.y+y1),new core.Point(-tarPos.x+x2,-tarPos.y+y2)]
+};
+core.Utils.setVisibilityAnimated=function(elems,isVisible,doneFn){core.Utils.animateVisibility(elems,isVisible,doneFn)
+};
+core.Utils.setChildrenVisibilityAnimated=function(rootElem,isVisible){var children=core.Utils._addInnerChildrens(rootElem);
+core.Utils.animateVisibility(children,isVisible)
+};
+core.Utils.animateVisibility=function(elems,isVisible,doneFn){var _fadeEffect=null;
+var _opacity=(isVisible?0:1);
+if(isVisible){elems.forEach(function(child,index){if($defined(child)){child.setOpacity(_opacity);
+child.setVisibility(isVisible)
+}})
+}var fadeEffect=function(index){var step=10;
+if((_opacity<=0&&!isVisible)||(_opacity>=1&&isVisible)){$clear(_fadeEffect);
+_fadeEffect=null;
+elems.forEach(function(child,index){if($defined(child)){child.setVisibility(isVisible)
+}});
+if($defined(doneFn)){doneFn.attempt()
+}}else{var fix=1;
+if(isVisible){fix=-1
+}_opacity-=(1/step)*fix;
+elems.forEach(function(child,index){if($defined(child)){child.setOpacity(_opacity)
+}})
+}};
+_fadeEffect=fadeEffect.periodical(10)
+};
+core.Utils.animatePosition=function(elems,doneFn,designer){var _moveEffect=null;
+var i=10;
+var step=10;
+var moveEffect=function(){if(i>0){var keys=elems.keys();
+for(var j=0;
+j=length){throw"Could not remove the element."
+}this._native.removeChild(elementPeer._native)
+};
+web2d.peer.svg.ElementPeer.prototype.addEventListener=function(type,listener){if(type=="dblclick"){var dblListener=function(e){if(e.detail>=2){listener.call(this,e)
+}};
+this._dblClickListeners[listener]=dblListener;
+this._native.addEventListener(type,dblListener,false)
+}else{this._native.addEventListener(type,listener,false)
+}};
+web2d.peer.svg.ElementPeer.prototype.removeEventListener=function(type,listener){if(type=="dblclick"){var dblClickListener=this._dblClickListeners[listener];
+if(dblClickListener==null){throw"Could not find listener to remove"
+}type="click";
+this._native.removeEventListener(type,dblClickListener,false);
+delete this._dblClickListeners[listener]
+}else{this._native.removeEventListener(type,listener,false)
+}};
+web2d.peer.svg.ElementPeer.prototype.setSize=function(width,height){if($defined(width)&&this._size.width!=parseInt(width)){this._size.width=parseInt(width);
+this._native.setAttribute("width",parseInt(width))
+}if($defined(height)&&this._size.height!=parseInt(height)){this._size.height=parseInt(height);
+this._native.setAttribute("height",parseInt(height))
+}web2d.peer.utils.EventUtils.broadcastChangeEvent(this,"strokeStyle")
+};
+web2d.peer.svg.ElementPeer.prototype.getSize=function(){return{width:this._size.width,height:this._size.height}
+};
+web2d.peer.svg.ElementPeer.prototype.setFill=function(color,opacity){if($defined(color)){this._native.setAttribute("fill",color)
+}if($defined(opacity)){this._native.setAttribute("fill-opacity",opacity)
+}};
+web2d.peer.svg.ElementPeer.prototype.getFill=function(){var color=this._native.getAttribute("fill");
+var opacity=this._native.getAttribute("fill-opacity");
+return{color:color,opacity:Number(opacity)}
+};
+web2d.peer.svg.ElementPeer.prototype.getStroke=function(){var vmlStroke=this._native;
+var color=vmlStroke.getAttribute("stroke");
+var dashstyle=this._stokeStyle;
+var opacity=vmlStroke.getAttribute("stroke-opacity");
+var width=vmlStroke.getAttribute("stroke-width");
+return{color:color,style:dashstyle,opacity:opacity,width:width}
+};
+web2d.peer.svg.ElementPeer.prototype.__stokeStyleToStrokDasharray={solid:[],dot:[1,3],dash:[4,3],longdash:[10,2],dashdot:[5,3,1,3]};
+web2d.peer.svg.ElementPeer.prototype.setStroke=function(width,style,color,opacity){if($defined(width)){this._native.setAttribute("stroke-width",width+"px")
+}if($defined(color)){this._native.setAttribute("stroke",color)
+}if($defined(style)){var dashArrayPoints=this.__stokeStyleToStrokDasharray[style];
+var scale=1/web2d.peer.utils.TransformUtil.workoutScale(this).width;
+var strokeWidth=this._native.getAttribute("stroke-width");
+strokeWidth=parseFloat(strokeWidth);
+var scaledPoints=[];
+for(var i=0;
+i=length){throw"There is not listener to remove"
+}};
+web2d.EventDispatcher.prototype.getListenersCount=function(){return this._listeners.length
+};web2d.Font=function(fontFamily,textPeer){var font="web2d.peer.Toolkit.create"+fontFamily+"Font();";
+this._peer=eval(font);
+this._textPeer=textPeer
+};
+web2d.Font.prototype.getHtmlSize=function(){var scale=web2d.peer.utils.TransformUtil.workoutScale(this._textPeer);
+return this._peer.getHtmlSize(scale)
+};
+web2d.Font.prototype.getGraphSize=function(){var scale=web2d.peer.utils.TransformUtil.workoutScale(this._textPeer);
+return this._peer.getGraphSize(scale)
+};
+web2d.Font.prototype.getFontScale=function(){return web2d.peer.utils.TransformUtil.workoutScale(this._textPeer).height
+};
+web2d.Font.prototype.getSize=function(){return this._peer.getSize()
+};
+web2d.Font.prototype.getStyle=function(){return this._peer.getStyle()
+};
+web2d.Font.prototype.getWeight=function(){return this._peer.getWeight()
+};
+web2d.Font.prototype.getFontFamily=function(){return this._peer.getFontFamily()
+};
+web2d.Font.prototype.setSize=function(size){return this._peer.setSize(size)
+};
+web2d.Font.prototype.setStyle=function(style){return this._peer.setStyle(style)
+};
+web2d.Font.prototype.setWeight=function(weight){return this._peer.setWeight(weight)
+};
+web2d.Font.prototype.getFont=function(){return this._peer.getFont()
+};
+web2d.Font.prototype.getWidthMargin=function(){return this._peer.getWidthMargin()
+};
+web2d.Font.ARIAL="Arial";
+web2d.Font.TIMES="Times";
+web2d.Font.TAHOMA="Tahoma";
+web2d.Font.VERDANA="Verdana";web2d.Group=function(attributes){var peer=web2d.peer.Toolkit.createGroup();
+var defaultAttributes={width:50,height:50,x:50,y:50,coordOrigin:"0 0",coordSize:"50 50"};
+for(var key in attributes){defaultAttributes[key]=attributes[key]
+}web2d.Element.call(this,peer,defaultAttributes)
+};
+objects.extend(web2d.Group,web2d.Element);
+web2d.Group.prototype.removeChild=function(element){if(!$defined(element)){throw"Child element can not be null"
+}if(element==this){throw"It's not posible to add the group as a child of itself"
+}var elementType=element.getType();
+if(elementType==null){throw"It seems not to be an element ->"+element
+}this._peer.removeChild(element._peer)
+};
+web2d.Group.prototype.appendChild=function(element){if(!$defined(element)){throw"Child element can not be null"
+}if(element==this){throw"It's not posible to add the group as a child of itself"
+}var elementType=element.getType();
+if(elementType==null){throw"It seems not to be an element ->"+element
+}if(elementType=="Workspace"){throw"A group can not have a workspace as a child"
+}this._peer.appendChild(element._peer)
+};
+web2d.Group.prototype.getType=function(){return"Group"
+};
+web2d.Group.prototype.setCoordSize=function(width,height){this._peer.setCoordSize(width,height)
+};
+web2d.Group.prototype.getCoordSize=function(){return this.peer.getCoordSize()
+};
+web2d.Group.prototype.setCoordOrigin=function(x,y){this._peer.setCoordOrigin(x,y)
+};
+web2d.Group.prototype.getCoordOrigin=function(){return this._peer.getCoordOrigin()
+};
+web2d.Group.prototype.getSize=function(){return this._peer.getSize()
+};
+web2d.Group.prototype.setFill=function(color,opacity){throw"Unsupported operation. Fill can not be set to a group"
+};
+web2d.Group.prototype.setStroke=function(width,style,color,opacity){throw"Unsupported operation. Stroke can not be set to a group"
+};
+web2d.Group.prototype.getCoordSize=function(){return this._peer.getCoordSize()
+};
+web2d.Group.prototype.appendDomChild=function(DomElement){if(!$defined(DomElement)){throw"Child element can not be null"
+}if(DomElement==this){throw"It's not posible to add the group as a child of itself"
+}this._peer._native.appendChild(DomElement)
+};web2d.Image=function(attributes){var peer=web2d.peer.Toolkit.createImage();
+web2d.Element.call(this,peer,attributes)
+};
+objects.extend(web2d.Image,web2d.Element);
+web2d.Image.prototype.getType=function(){return"Image"
+};
+web2d.Image.prototype.setHref=function(href){this._peer.setHref(href)
+};
+web2d.Image.prototype.getHref=function(){return this._peer.getHref()
+};
+web2d.Image.prototype.getSize=function(){return this._peer.getSize()
+};web2d.Line=function(attributes){var peer=web2d.peer.Toolkit.createLine();
+var defaultAttributes={strokeColor:"#495879",strokeWidth:1,strokeOpacity:1};
+for(var key in attributes){defaultAttributes[key]=attributes[key]
+}web2d.Element.call(this,peer,defaultAttributes)
+};
+objects.extend(web2d.Line,web2d.Element);
+web2d.Line.prototype.getType=function(){return"Line"
+};
+web2d.Line.prototype.setFrom=function(x,y){this._peer.setFrom(x,y)
+};
+web2d.Line.prototype.setTo=function(x,y){this._peer.setTo(x,y)
+};
+web2d.Line.prototype.getFrom=function(){return this._peer.getFrom()
+};
+web2d.Line.prototype.getTo=function(){return this._peer.getTo()
+};
+web2d.Line.prototype.setArrowStyle=function(startStyle,endStyle){this._peer.setArrowStyle(startStyle,endStyle)
+};
+web2d.Line.prototype.setPosition=function(cx,cy){throw"Unsupported operation"
+};
+web2d.Line.prototype.setSize=function(width,height){throw"Unsupported operation"
+};
+web2d.Line.prototype.setFill=function(color,opacity){throw"Unsupported operation"
+};web2d.PolyLine=function(attributes){var peer=web2d.peer.Toolkit.createPolyLine();
+var defaultAttributes={strokeColor:"blue",strokeWidth:1,strokeStyle:"solid",strokeOpacity:1};
+for(var key in attributes){defaultAttributes[key]=attributes[key]
+}web2d.Element.call(this,peer,defaultAttributes)
+};
+objects.extend(web2d.PolyLine,web2d.Element);
+web2d.PolyLine.prototype.getType=function(){return"PolyLine"
+};
+web2d.PolyLine.prototype.setFrom=function(x,y){this._peer.setFrom(x,y)
+};
+web2d.PolyLine.prototype.setTo=function(x,y){this._peer.setTo(x,y)
+};
+web2d.PolyLine.prototype.setStyle=function(style){this._peer.setStyle(style)
+};
+web2d.PolyLine.prototype.getStyle=function(){return this._peer.getStyle()
+};
+web2d.PolyLine.buildCurvedPath=function(dist,x1,y1,x2,y2){var signx=1;
+var signy=1;
+if(x22){var middlex=x1+((x2-x1>0)?dist:-dist);
+path=x1.toFixed(1)+", "+y1.toFixed(1)+" "+middlex.toFixed(1)+", "+y1.toFixed(1)+" "+middlex.toFixed(1)+", "+(y2-5*signy).toFixed(1)+" "+(middlex+5*signx).toFixed(1)+", "+y2.toFixed(1)+" "+x2.toFixed(1)+", "+y2.toFixed(1)
+}else{path=x1.toFixed(1)+", "+y1.toFixed(1)+" "+x2.toFixed(1)+", "+y2.toFixed(1)
+}return path
+};
+web2d.PolyLine.buildStraightPath=function(dist,x1,y1,x2,y2){var middlex=x1+((x2-x1>0)?dist:-dist);
+return x1+", "+y1+" "+middlex+", "+y1+" "+middlex+", "+y2+" "+x2+", "+y2
+};web2d.CurvedLine=function(attributes){var peer=web2d.peer.Toolkit.createCurvedLine();
+var defaultAttributes={strokeColor:"blue",strokeWidth:1,strokeStyle:"solid",strokeOpacity:1};
+for(var key in attributes){defaultAttributes[key]=attributes[key]
+}web2d.Element.call(this,peer,defaultAttributes)
+};
+objects.extend(web2d.CurvedLine,web2d.Element);
+web2d.CurvedLine.prototype.getType=function(){return"CurvedLine"
+};
+web2d.CurvedLine.prototype.setFrom=function(x,y){this._peer.setFrom(x,y)
+};
+web2d.CurvedLine.prototype.setTo=function(x,y){this._peer.setTo(x,y)
+};
+web2d.CurvedLine.prototype.getFrom=function(){return this._peer.getFrom()
+};
+web2d.CurvedLine.prototype.getTo=function(){return this._peer.getTo()
+};
+web2d.CurvedLine.prototype.setShowEndArrow=function(visible){this._peer.setShowEndArrow(visible)
+};
+web2d.CurvedLine.prototype.isShowEndArrow=function(){return this._peer.isShowEndArrow()
+};
+web2d.CurvedLine.prototype.setShowStartArrow=function(visible){this._peer.setShowStartArrow(visible)
+};
+web2d.CurvedLine.prototype.isShowStartArrow=function(){return this._peer.isShowStartArrow()
+};
+web2d.CurvedLine.prototype.setSrcControlPoint=function(control){this._peer.setSrcControlPoint(control)
+};
+web2d.CurvedLine.prototype.setDestControlPoint=function(control){this._peer.setDestControlPoint(control)
+};
+web2d.CurvedLine.prototype.getControlPoints=function(){return this._peer.getControlPoints()
+};
+web2d.CurvedLine.prototype.isSrcControlPointCustom=function(){return this._peer.isSrcControlPointCustom()
+};
+web2d.CurvedLine.prototype.isDestControlPointCustom=function(){return this._peer.isDestControlPointCustom()
+};
+web2d.CurvedLine.prototype.setIsSrcControlPointCustom=function(isCustom){this._peer.setIsSrcControlPointCustom(isCustom)
+};
+web2d.CurvedLine.prototype.setIsDestControlPointCustom=function(isCustom){this._peer.setIsDestControlPointCustom(isCustom)
+};
+web2d.CurvedLine.prototype.updateLine=function(avoidControlPointFix){return this._peer.updateLine(avoidControlPointFix)
+};
+web2d.CurvedLine.prototype.setStyle=function(style){this._peer.setLineStyle(style)
+};
+web2d.CurvedLine.prototype.getStyle=function(){return this._peer.getLineStyle()
+};
+web2d.CurvedLine.prototype.setDashed=function(length,spacing){this._peer.setDashed(length,spacing)
+};
+web2d.CurvedLine.SIMPLE_LINE=false;
+web2d.CurvedLine.NICE_LINE=true;web2d.Arrow=function(attributes){var peer=web2d.peer.Toolkit.createArrow();
+var defaultAttributes={strokeColor:"black",strokeWidth:1,strokeStyle:"solid",strokeOpacity:1};
+for(var key in attributes){defaultAttributes[key]=attributes[key]
+}web2d.Element.call(this,peer,defaultAttributes)
+};
+objects.extend(web2d.Arrow,web2d.Element);
+web2d.Arrow.prototype.getType=function(){return"Arrow"
+};
+web2d.Arrow.prototype.setFrom=function(x,y){this._peer.setFrom(x,y)
+};
+web2d.Arrow.prototype.setControlPoint=function(point){this._peer.setControlPoint(point)
+};
+web2d.Arrow.prototype.setStrokeColor=function(color){this._peer.setStrokeColor(color)
+};
+web2d.Arrow.prototype.setStrokeWidth=function(width){this._peer.setStrokeWidth(width)
+};
+web2d.Arrow.prototype.setDashed=function(isDashed,length,spacing){this._peer.setDashed(isDashed,length,spacing)
+};
+web2d.Arrow.prototype.reDraw=function(){this._peer._redraw()
+};web2d.Rect=function(arc,attributes){if(arc&&arc>1){throw"Arc must be 0<=arc<=1"
+}if(arguments.length<=0){var rx=0;
+var ry=0
+}var peer=web2d.peer.Toolkit.createRect(arc);
+var defaultAttributes={width:40,height:40,x:5,y:5,stroke:"1 solid black",fillColor:"green"};
+for(var key in attributes){defaultAttributes[key]=attributes[key]
+}web2d.Element.call(this,peer,defaultAttributes)
+};
+objects.extend(web2d.Rect,web2d.Element);
+web2d.Rect.prototype.getType=function(){return"Rect"
+};
+web2d.Rect.prototype.getSize=function(){return this._peer.getSize()
+};web2d.Text=function(attributes){var peer=web2d.peer.Toolkit.createText();
+web2d.Element.call(this,peer,attributes)
+};
+objects.extend(web2d.Text,web2d.Element);
+web2d.Text.prototype.getType=function(){return"Text"
+};
+web2d.Text.prototype.setText=function(text){this._peer.setText(text)
+};
+web2d.Text.prototype.setTextSize=function(width,height){this._peer.setContentSize(width,height)
+};
+web2d.Text.prototype.getText=function(){return this._peer.getText()
+};
+web2d.Text.prototype.setFont=function(font,size,style,weight){this._peer.setFont(font,size,style,weight)
+};
+web2d.Text.prototype.setColor=function(color){this._peer.setColor(color)
+};
+web2d.Text.prototype.getColor=function(){return this._peer.getColor()
+};
+web2d.Text.prototype.setStyle=function(style){this._peer.setStyle(style)
+};
+web2d.Text.prototype.setWeight=function(weight){this._peer.setWeight(weight)
+};
+web2d.Text.prototype.setFontFamily=function(family){this._peer.setFontFamily(family)
+};
+web2d.Text.prototype.getFont=function(){return this._peer.getFont()
+};
+web2d.Text.prototype.setSize=function(size){this._peer.setSize(size)
+};
+web2d.Text.prototype.getHtmlFontSize=function(){return this._peer.getHtmlFontSize()
+};
+web2d.Text.prototype.getWidth=function(){return this._peer.getWidth()
+};
+web2d.Text.prototype.getHeight=function(){return parseInt(this._peer.getHeight())
+};web2d.peer.ToolkitSVG={init:function(){},createWorkspace:function(element){return new web2d.peer.svg.WorkspacePeer(element)
+},createGroup:function(element){return new web2d.peer.svg.GroupPeer()
+},createElipse:function(){return new web2d.peer.svg.ElipsePeer()
+},createLine:function(){return new web2d.peer.svg.LinePeer()
+},createPolyLine:function(){return new web2d.peer.svg.PolyLinePeer()
+},createCurvedLine:function(){return new web2d.peer.svg.CurvedLinePeer()
+},createArrow:function(){return new web2d.peer.svg.ArrowPeer()
+},createText:function(){return new web2d.peer.svg.TextPeer()
+},createImage:function(){return new web2d.peer.svg.ImagePeer()
+},createRect:function(arc){return new web2d.peer.svg.RectPeer(arc)
+},createArialFont:function(){return new web2d.peer.svg.ArialFont()
+},createTimesFont:function(){return new web2d.peer.svg.TimesFont()
+},createVerdanaFont:function(){return new web2d.peer.svg.VerdanaFont()
+},createTahomaFont:function(){return new web2d.peer.svg.TahomaFont()
+}};
+web2d.peer.Toolkit=web2d.peer.ToolkitSVG;web2d.Workspace=function(attributes){this._htmlContainer=this._createDivContainer();
+var peer=web2d.peer.Toolkit.createWorkspace(this._htmlContainer);
+var defaultAttributes={width:"200px",height:"200px",stroke:"1px solid #edf1be",fillColor:"white",coordOrigin:"0 0",coordSize:"200 200"};
+for(var key in attributes){defaultAttributes[key]=attributes[key]
+}web2d.Element.call(this,peer,defaultAttributes);
+this._htmlContainer.appendChild(this._peer._native);
+this._disableTextSelection()
+};
+objects.extend(web2d.Workspace,web2d.Element);
+web2d.Workspace.prototype._disableTextSelection=function(){var contaier=this._htmlContainer;
+function disabletext(e){return false
+}function reEnable(){return true
+}contaier.onselectstart=new Function("return false");
+if($defined(window.sidebar)){contaier.onmousedown=disabletext;
+contaier.onclick=reEnable
+}};
+web2d.Workspace.prototype.getType=function(){return"Workspace"
+};
+web2d.Workspace.prototype.appendChild=function(element){if(!$defined(element)){throw"Child element can not be null"
+}var elementType=element.getType();
+if(elementType==null){throw"It seems not to be an element ->"+element
+}if(elementType=="Workspace"){throw"A workspace can not have a workspace as a child"
+}this._peer.appendChild(element._peer)
+};
+web2d.Workspace.prototype.addItAsChildTo=function(element){if(!$defined(element)){throw"Workspace div container can not be null"
+}element.appendChild(this._htmlContainer)
+};
+web2d.Workspace.prototype._createDivContainer=function(domElement){var container=window.document.createElement("div");
+container.id="workspaceContainer";
+container.style.overflow="hidden";
+container.style.position="relative";
+container.style.top="0px";
+container.style.left="0px";
+container.style.height="688px";
+container.style.border="1px solid red";
+return container
+};
+web2d.Workspace.prototype.setSize=function(width,height){if($defined(width)){this._htmlContainer.style.width=width
+}if($defined(height)){this._htmlContainer.style.height=height
+}this._peer.setSize(width,height)
+};
+web2d.Workspace.prototype.setCoordSize=function(width,height){this._peer.setCoordSize(width,height)
+};
+web2d.Workspace.prototype.setCoordOrigin=function(x,y){this._peer.setCoordOrigin(x,y)
+};
+web2d.Workspace.prototype.getCoordOrigin=function(){return this._peer.getCoordOrigin()
+};
+web2d.Workspace.prototype._getHtmlContainer=function(){return this._htmlContainer
+};
+web2d.Workspace.prototype.setFill=function(color,opacity){this._htmlContainer.style.backgroundColor=color;
+if(opacity||opacity===0){throw"Unsupported operation. Opacity not supported."
+}};
+web2d.Workspace.prototype.getFill=function(){var color=this._htmlContainer.style.backgroundColor;
+return{color:color}
+};
+web2d.Workspace.prototype.getSize=function(){var width=this._htmlContainer.style.width;
+var height=this._htmlContainer.style.height;
+return{width:width,height:height}
+};
+web2d.Workspace.prototype.setStroke=function(width,style,color,opacity){if(style!="solid"){throw"Not supported style stroke style:"+style
+}this._htmlContainer.style.border=width+" "+style+" "+color;
+if(opacity||opacity===0){throw"Unsupported operation. Opacity not supported."
+}};
+web2d.Workspace.prototype.getCoordSize=function(){return this._peer.getCoordSize()
+};
+web2d.Workspace.prototype.removeChild=function(element){if(!$defined(element)){throw"Child element can not be null"
+}if(element==this){throw"It's not posible to add the group as a child of itself"
+}var elementType=element.getType();
+if(elementType==null){throw"It seems not to be an element ->"+element
+}this._peer.removeChild(element._peer)
+};
+web2d.Workspace.prototype.dumpNativeChart=function(){var elem=this._htmlContainer;
+return elem.innerHTML
+};/*
+* Copyright [2011] [wisemapping]
+*
+* Licensed under WiseMapping Public License, Version 1.0 (the "License").
+* It is basically the Apache License, Version 2.0 (the "License") plus the
+* "powered by wisemapping" text requirement on every single page;
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the license at
+*
+* http://www.wisemapping.org/license
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+// (C) Copyright 2007 WiseMapping.com. All Rights Reserved
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF WiseMapping.com
+// The copyright notice above does not evidence any actual or intended
+// publication of such source code.
+// ....................................................................
+
+var mindplot = {};
+mindplot.util = {};
+mindplot.commands = {};
+mindplot.layout = {};mindplot.EventBus = new Class({
+ Extends:Options,
+ Implements:Events,
+ options: {
+
+ },
+ initialize: function(options) {
+ this.setOptions(options);
+ }
+
+});
+
+mindplot.EventBus.events = {
+ NodeResizeEvent:'NodeResizeEvent',
+ NodeMoveEvent:'NodeMoveEvent',
+ NodeDisconnectEvent:'NodeDisconnectEvent',
+ NodeConnectEvent:'NodeConnectEvent',
+ NodeRepositionateEvent:'NodeRepositionateEvent',
+ NodeShrinkEvent:'NodeShrinkEvent',
+ NodeMouseOverEvent:'NodeMouseOverEvent',
+ NodeMouseOutEvent:'NodeMouseOutEvent'
+};
+
+mindplot.EventBus.instance = new mindplot.EventBus();/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+mindplot.model = {};
+mindplot.model.Mindmap = new Class({
+ initialize : function() {
+ this._branches = [];
+ this._description = null;
+ this._version = null;
+ this._relationships = [];
+ },
+
+ getCentralTopic : function() {
+ return this._branches[0];
+ },
+
+ getDescription : function() {
+ return this._description;
+ },
+
+ getId : function() {
+ return this._iconType;
+ },
+
+
+ setId : function(id) {
+ this._iconType = id;
+ },
+
+ getVersion : function() {
+ return this._version;
+ },
+
+
+ setVersion : function(version) {
+ this._version = version;
+ },
+
+ addBranch : function(nodeModel) {
+ $assert(nodeModel && nodeModel.isNodeModel(), 'Add node must be invoked with model objects');
+ if (this._branches.length == 0) {
+ $assert(nodeModel.getType() == mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE, "First element must be the central topic");
+ nodeModel.setPosition(0, 0);
+ } else {
+ $assert(nodeModel.getType() != mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE, "Mindmaps only have one cental topic");
+ }
+
+ this._branches.push(nodeModel);
+ },
+
+ getBranches : function() {
+ return this._branches;
+ },
+
+ getRelationships : function() {
+ return this._relationships;
+ },
+
+ connect : function(parent, child) {
+ // Child already has a parent ?
+ var branches = this.getBranches();
+ $assert(!child.getParent(), 'Child model seems to be already connected');
+
+ // Connect node...
+ parent._appendChild(child);
+
+ // Remove from the branch ...
+ branches.erase(child);
+ },
+
+ disconnect : function(child) {
+ var parent = child.getParent();
+ $assert(child, 'Child can not be null.');
+ $assert(parent, 'Child model seems to be already connected');
+
+ parent._removeChild(child);
+
+ var branches = this.getBranches();
+ branches.push(child);
+
+ },
+
+ hasAlreadyAdded : function(node) {
+ var result = false;
+
+ // Check in not connected nodes.
+ var branches = this._branches;
+ for (var i = 0; i < branches.length; i++) {
+ result = branches[i]._isChildNode(node);
+ if (result) {
+ break;
+ }
+ }
+ },
+
+ createNode : function(type, id) {
+ $assert(type, "node type can not be null");
+ return this._createNode(type, id);
+ },
+
+ _createNode : function(type, id) {
+ $assert(type, 'Node type must be specified.');
+ var result = new mindplot.model.NodeModel(type, this, id);
+ return result;
+ },
+
+ createRelationship : function(fromNode, toNode) {
+ $assert(fromNode, 'from node cannot be null');
+ $assert(toNode, 'to node cannot be null');
+
+ return new mindplot.model.RelationshipModel(fromNode, toNode);
+ },
+
+ addRelationship : function(relationship) {
+ this._relationships.push(relationship);
+ },
+
+ removeRelationship : function(relationship) {
+ this._relationships.erase(relationship);
+ },
+
+ inspect : function() {
+ var result = '';
+ result = '{ ';
+
+ var branches = this.getBranches();
+ for (var i = 0; i < branches.length; i++) {
+ var node = branches[i];
+ if (i != 0) {
+ result = result + ', ';
+ }
+
+ result = result + this._toString(node);
+ }
+
+ result = result + ' } ';
+
+ return result;
+ },
+
+ _toString : function(node) {
+ var result = node.inspect();
+ var children = node.getChildren();
+
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i];
+
+ if (i == 0) {
+ result = result + '-> {';
+ } else {
+ result = result + ', ';
+ }
+
+ result = result + this._toString(child);
+
+ if (i == children.length - 1) {
+ result = result + '}';
+ }
+ }
+
+ return result;
+ }
+ }
+);/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.model.NodeModel = new Class({
+ initialize:function(type, mindmap, id) {
+ $assert(type, 'Node type can not be null');
+ $assert(mindmap, 'mindmap can not be null');
+
+ this._order = null;
+ this._type = type;
+ this._children = [];
+ this._icons = [];
+ this._links = [];
+ this._notes = [];
+ this._size = {width:50,height:20};
+ this._position = null;
+ if ($defined(id)) {
+ if (!$defined(mindplot.model.NodeModel._uuid) || id > mindplot.model.NodeModel._uuid) {
+ mindplot.model.NodeModel._uuid = id;
+ }
+ this._id = id;
+ } else {
+ this._id = mindplot.model.NodeModel._nextUUID();
+ }
+ this._mindmap = mindmap;
+ this._text = null;
+ this._shapeType = null;
+ this._fontFamily = null;
+ this._fontSize = null;
+ this._fontStyle = null;
+ this._fontWeight = null;
+ this._fontColor = null;
+ this._borderColor = null;
+ this._backgroundColor = null;
+ this._areChildrenShrinked = false;
+ },
+
+ clone : function() {
+ var result = new mindplot.model.NodeModel(this._type, this._mindmap);
+ result._order = this._order;
+ result._type = this._type;
+ result._children = this._children.map(function(item, index) {
+ var model = item.clone();
+ model._parent = result;
+ return model;
+ });
+
+
+ result._icons = this._icons;
+ result._links = this._links;
+ result._notes = this._notes;
+ result._size = this._size;
+ result._position = this._position;
+ result._id = this._id;
+ result._mindmap = this._mindmap;
+ result._text = this._text;
+ result._shapeType = this._shapeType;
+ result._fontFamily = this._fontFamily;
+ result._fontSize = this._fontSize;
+ result._fontStyle = this._fontStyle;
+ result._fontWeight = this._fontWeight;
+ result._fontColor = this._fontColor;
+ result._borderColor = this._borderColor;
+ result._backgroundColor = this._backgroundColor;
+ result._areChildrenShrinked = this._areChildrenShrinked;
+ return result;
+ },
+
+ areChildrenShrinked : function() {
+ return this._areChildrenShrinked;
+ },
+
+ setChildrenShrinked : function(value) {
+ this._areChildrenShrinked = value;
+ },
+
+ getId : function() {
+ return this._id;
+ },
+
+
+ setId : function(id) {
+ this._id = id;
+ if (mindplot.model.NodeModel._uuid < id) {
+ mindplot.model.NodeModel._uuid = id;
+ }
+ },
+
+ getType : function() {
+ return this._type;
+ },
+
+ setText : function(text) {
+ this._text = text;
+ },
+
+ getText : function() {
+ return this._text;
+ },
+
+ isNodeModel : function() {
+ return true;
+ },
+
+ isConnected : function() {
+ return this._parent != null;
+ },
+
+ createLink : function(url) {
+ $assert(url, 'Link URL must be specified.');
+ return new mindplot.model.LinkModel(url, this);
+ },
+
+ addLink : function(link) {
+ $assert(link && link.isLinkModel(), 'Only LinkModel can be appended to Mindmap object as links');
+ this._links.push(link);
+ },
+
+ _removeLink : function(link) {
+ $assert(link && link.isLinkModel(), 'Only LinkModel can be appended to Mindmap object as links');
+ this._links.erase(link);
+ },
+
+ createNote : function(text) {
+ $assert(text != null, 'note text must be specified.');
+ return new mindplot.model.NoteModel(text, this);
+ },
+
+ addNote : function(note) {
+ $assert(note && note.isNoteModel(), 'Only NoteModel can be appended to Mindmap object as links');
+ this._notes.push(note);
+ },
+
+ _removeNote : function(note) {
+ $assert(note && note.isNoteModel(), 'Only NoteModel can be appended to Mindmap object as links');
+ this._notes.erase(note);
+ },
+
+ createIcon : function(iconType) {
+ $assert(iconType, 'IconType must be specified.');
+ return new mindplot.model.IconModel(iconType, this);
+ },
+
+ addIcon : function(icon) {
+ $assert(icon && icon.isIconModel(), 'Only IconModel can be appended to Mindmap object as icons');
+ this._icons.push(icon);
+ },
+
+ _removeIcon : function(icon) {
+ $assert(icon && icon.isIconModel(), 'Only IconModel can be appended to Mindmap object as icons');
+ this._icons.erase(icon);
+ },
+
+ removeLastIcon : function() {
+ this._icons.pop();
+ },
+
+ _appendChild : function(child) {
+ $assert(child && child.isNodeModel(), 'Only NodeModel can be appended to Mindmap object');
+ this._children.push(child);
+ child._parent = this;
+ },
+
+ _removeChild : function(child) {
+ $assert(child && child.isNodeModel(), 'Only NodeModel can be appended to Mindmap object.');
+ this._children.erase(child);
+ child._parent = null;
+ },
+
+ setPosition : function(x, y) {
+ $assert(x, "x coordinate must be defined");
+ $assert(y, "y coordinate must be defined");
+
+ if (!$defined(this._position)) {
+ this._position = new core.Point();
+ }
+ this._position.x = parseInt(x);
+ this._position.y = parseInt(y);
+ },
+
+ getPosition : function() {
+ return this._position;
+ },
+
+ setFinalPosition : function(x, y) {
+ $assert(x, "x coordinate must be defined");
+ $assert(y, "y coordinate must be defined");
+
+ if (!$defined(this._finalPosition)) {
+ this._finalPosition = new core.Point();
+ }
+ this._finalPosition.x = parseInt(x);
+ this._finalPosition.y = parseInt(y);
+ },
+
+ getFinalPosition : function() {
+ return this._finalPosition;
+ },
+
+ setSize : function(width, height) {
+ this._size.width = width;
+ this._size.height = height;
+ },
+
+ getSize : function() {
+ return {width:this._size.width,height:this._size.height};
+ },
+
+ getChildren : function() {
+ return this._children;
+ },
+
+ getIcons : function() {
+ return this._icons;
+ },
+
+ getLinks : function() {
+ return this._links;
+ },
+
+ getNotes : function() {
+ return this._notes;
+ },
+
+ getParent : function() {
+ return this._parent;
+ },
+
+ getMindmap : function() {
+ return this._mindmap;
+ },
+
+ setParent : function(parent) {
+ $assert(parent != this, 'The same node can not be parent and child if itself.');
+ this._parent = parent;
+ },
+
+ canBeConnected : function(sourceModel, sourcePosition, targetTopicHeight) {
+ $assert(sourceModel != this, 'The same node can not be parent and child if itself.');
+ $assert(sourcePosition, 'childPosition can not be null.');
+ $assert(targetTopicHeight, 'childrenWidth can not be null.');
+
+ // Only can be connected if the node is in the left or rigth.
+ var targetModel = this;
+ var mindmap = targetModel.getMindmap();
+ var targetPosition = targetModel.getPosition();
+ var result = false;
+
+ if (sourceModel.getType() == mindplot.model.NodeModel.MAIN_TOPIC_TYPE) {
+ // Finally, check current node ubication.
+ var targetTopicSize = targetModel.getSize();
+ var yDistance = Math.abs(sourcePosition.y - targetPosition.y);
+ var gap = 35 + targetTopicHeight / 2;
+ if (targetModel.getChildren().length > 0) {
+ gap += Math.abs(targetPosition.y - targetModel.getChildren()[0].getPosition().y);
+ }
+
+ if (yDistance <= gap) {
+ // Circular connection ?
+ if (!sourceModel._isChildNode(this)) {
+ var toleranceDistance = (targetTopicSize.width / 2) + targetTopicHeight;
+
+ var xDistance = sourcePosition.x - targetPosition.x;
+ var isTargetAtRightFromCentral = targetPosition.x >= 0;
+
+ if (isTargetAtRightFromCentral) {
+ if (xDistance >= -targetTopicSize.width / 2 && xDistance <= mindplot.model.NodeModel.MAIN_TOPIC_TO_MAIN_TOPIC_DISTANCE / 2 + (targetTopicSize.width / 2)) {
+ result = true;
+ }
+
+ } else {
+ if (xDistance <= targetTopicSize.width / 2 && Math.abs(xDistance) <= mindplot.model.NodeModel.MAIN_TOPIC_TO_MAIN_TOPIC_DISTANCE / 2 + (targetTopicSize.width / 2)) {
+ result = true;
+ }
+ }
+ }
+ }
+ } else {
+ throw "No implemented yet";
+ }
+ return result;
+ },
+
+ _isChildNode : function(node) {
+ var result = false;
+ if (node == this) {
+ result = true;
+ } else {
+ var children = this.getChildren();
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i];
+ result = child._isChildNode(node);
+ if (result) {
+ break;
+ }
+ }
+ }
+ return result;
+
+ },
+
+ connectTo : function(parent) {
+ var mindmap = this.getMindmap();
+ mindmap.connect(parent, this);
+ this._parent = parent;
+ },
+
+ disconnect : function() {
+ var mindmap = this.getMindmap();
+ mindmap.disconnect(this);
+ },
+
+ getOrder : function() {
+ return this._order;
+ },
+
+ getShapeType : function() {
+ return this._shapeType;
+ },
+
+ setShapeType : function(type) {
+ this._shapeType = type;
+ },
+
+ setOrder : function(value) {
+ this._order = value;
+ },
+
+ setFontFamily : function(value) {
+ this._fontFamily = value;
+ },
+
+ getOrder : function() {
+ return this._order;
+ },
+
+ getFontFamily : function() {
+ return this._fontFamily;
+ },
+
+ setFontStyle : function(value) {
+ this._fontStyle = value;
+ },
+
+ getFontStyle : function() {
+ return this._fontStyle;
+ },
+
+ setFontWeight : function(value) {
+ this._fontWeight = value;
+ },
+
+ getFontWeight : function() {
+ return this._fontWeight;
+ },
+
+ setFontColor : function(value) {
+ this._fontColor = value;
+ },
+
+ getFontColor : function() {
+ return this._fontColor;
+ },
+
+ setFontSize : function(value) {
+ this._fontSize = value;
+ },
+
+ getFontSize : function() {
+ return this._fontSize;
+ },
+
+ getBorderColor : function() {
+ return this._borderColor;
+ },
+
+ setBorderColor : function(color) {
+ this._borderColor = color;
+ },
+
+ getBackgroundColor : function() {
+ return this._backgroundColor;
+ },
+
+ setBackgroundColor : function(color) {
+ this._backgroundColor = color;
+ },
+
+ deleteNode : function() {
+ var mindmap = this._mindmap;
+
+ // if it has children nodes, Their must be disconnected.
+ var lenght = this._children;
+ for (var i = 0; i < lenght; i++) {
+ var child = this._children[i];
+ mindmap.disconnect(child);
+ }
+
+ var parent = this._parent;
+ if ($defined(parent)) {
+ // if it is connected, I must remove it from the parent..
+ mindmap.disconnect(this);
+ }
+
+ // It's an isolated node. It must be a hole branch ...
+ var branches = mindmap.getBranches();
+ branches.erase(this);
+
+ },
+
+ inspect : function() {
+ return '(type:' + this.getType() + ' , id: ' + this.getId() + ')';
+ }
+});
+
+mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE = 'CentralTopic';
+mindplot.model.NodeModel.MAIN_TOPIC_TYPE = 'MainTopic';
+mindplot.model.NodeModel.DRAGGED_TOPIC_TYPE = 'DraggedTopic';
+
+mindplot.model.NodeModel.SHAPE_TYPE_RECT = 'rectagle';
+mindplot.model.NodeModel.SHAPE_TYPE_ROUNDED_RECT = 'rounded rectagle';
+mindplot.model.NodeModel.SHAPE_TYPE_ELIPSE = 'elipse';
+mindplot.model.NodeModel.SHAPE_TYPE_LINE = 'line';
+
+mindplot.model.NodeModel.MAIN_TOPIC_TO_MAIN_TOPIC_DISTANCE = 220;
+
+/**
+ * @todo: This method must be implemented.
+ */
+mindplot.model.NodeModel._nextUUID = function() {
+ if (!$defined(this._uuid)) {
+ this._uuid = 0;
+ }
+
+ this._uuid = this._uuid + 1;
+ return this._uuid;
+}
+
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+mindplot.model.RelationshipModel = new Class({
+ initialize:function(fromNode, toNode) {
+ $assert(fromNode, 'from node type can not be null');
+ $assert(toNode, 'to node type can not be null');
+
+ this._id = mindplot.model.RelationshipModel._nextUUID();
+ this._fromNode = fromNode;
+ this._toNode = toNode;
+ this._lineType = mindplot.ConnectionLine.SIMPLE_CURVED;
+ this._srcCtrlPoint = null;
+ this._destCtrlPoint = null;
+ this._endArrow = true;
+ this._startArrow = false;
+ },
+
+ getFromNode : function() {
+ return this._fromNode;
+ },
+
+ getToNode : function() {
+ return this._toNode;
+ },
+
+ getId : function() {
+ return this._id;
+ },
+
+ getLineType : function() {
+ return this._lineType;
+ },
+
+ setLineType : function(lineType) {
+ this._lineType = lineType;
+ },
+
+ getSrcCtrlPoint : function() {
+ return this._srcCtrlPoint;
+ },
+
+ setSrcCtrlPoint : function(srcCtrlPoint) {
+ this._srcCtrlPoint = srcCtrlPoint;
+ },
+
+ getDestCtrlPoint : function() {
+ return this._destCtrlPoint;
+ },
+
+ setDestCtrlPoint : function(destCtrlPoint) {
+ this._destCtrlPoint = destCtrlPoint;
+ },
+
+ getEndArrow : function() {
+ return this._endArrow;
+ },
+
+ setEndArrow : function(endArrow) {
+ this._endArrow = endArrow;
+ },
+
+ getStartArrow : function() {
+ return this._startArrow;
+ },
+
+ setStartArrow : function(startArrow) {
+ this._startArrow = startArrow;
+ },
+
+ clone : function(model) {
+ var result = new mindplot.model.RelationshipModel(this._fromNode, this._toNode);
+ result._id = this._id;
+ result._lineType = this._lineType;
+ result._srcCtrlPoint = this._srcCtrlPoint;
+ result._destCtrlPoint = this._destCtrlPoint;
+ result._endArrow = this._endArrow;
+ result._startArrow = this._startArrow;
+ return result;
+ },
+
+ inspect : function() {
+ return '(fromNode:' + this.getFromNode().getId() + ' , toNode: ' + this.getToNode().getId() + ')';
+ }
+});
+
+
+/**
+ * @todo: This method must be implemented.
+ */
+mindplot.model.RelationshipModel._nextUUID = function() {
+ if (!$defined(this._uuid)) {
+ this._uuid = 0;
+ }
+
+ this._uuid = this._uuid + 1;
+ return this._uuid;
+}
+
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.MindmapDesigner = new Class({
+ initialize: function(profile, divElement) {
+ $assert(profile, "profile must be defined");
+ $assert(profile.zoom, "zoom must be defined");
+ $assert(divElement, "divElement must be defined");
+
+ // Undo manager ...
+ this._actionRunner = new mindplot.DesignerActionRunner(this);
+ mindplot.DesignerActionRunner.setInstance(this._actionRunner);
+
+ // Initial Zoom
+ this._zoom = profile.zoom;
+ this._viewMode = profile.viewMode;
+
+ // Init Screen manager..
+ var screenManager = new mindplot.ScreenManager(profile.width, profile.height, divElement);
+
+ this._workspace = new mindplot.Workspace(profile, screenManager, this._zoom);
+
+ //create editor
+ var editorClass = mindplot.TextEditorFactory.getTextEditorFromName(mindplot.EditorOptions.textEditor);
+ this._editor = new editorClass(this, this._actionRunner);
+
+
+ // Init layout managers ...
+ this._topics = [];
+// var layoutManagerClass = mindplot.layout.LayoutManagerFactory.getManagerByName(mindplot.EditorOptions.LayoutManager);
+// this._layoutManager = new layoutManagerClass(this);
+ this._layoutManager = new mindplot.layout.OriginalLayoutManager(this);
+
+ // Register handlers..
+ this._registerEvents();
+
+ this._relationships = {};
+
+ this._events = {};
+ },
+
+ _getTopics : function() {
+ return this._topics;
+ },
+
+ getCentralTopic : function() {
+ var topics = this._getTopics();
+ return topics[0];
+ },
+
+
+ addEventListener : function(eventType, listener) {
+
+ this._events[eventType] = listener;
+
+ },
+
+ _fireEvent : function(eventType, event) {
+ var listener = this._events[eventType];
+ if (listener != null) {
+ listener(event);
+ }
+ },
+
+ _registerEvents : function() {
+ var mindmapDesigner = this;
+ var workspace = this._workspace;
+ var screenManager = workspace.getScreenManager();
+
+ if (!$defined(this._viewMode) || ($defined(this._viewMode) && !this._viewMode)) {
+ // Initialize workspace event listeners.
+ // Create nodes on double click...
+ screenManager.addEventListener('click', function(event) {
+ if (workspace.isWorkspaceEventsEnabled()) {
+ var t = mindmapDesigner.getEditor().isVisible();
+ mindmapDesigner.getEditor().lostFocus();
+ // @todo: Puaj hack...
+ mindmapDesigner._cleanScreen();
+ }
+ });
+
+ screenManager.addEventListener('dblclick', function(event) {
+ if (workspace.isWorkspaceEventsEnabled()) {
+ mindmapDesigner.getEditor().lostFocus();
+ // Get mouse position
+ var pos = screenManager.getWorkspaceMousePosition(event);
+
+ // Create a new topic model ...
+ var mindmap = mindmapDesigner.getMindmap();
+ var model = mindmap.createNode(mindplot.model.NodeModel.MAIN_TOPIC_TYPE);
+ model.setPosition(pos.x, pos.y);
+
+ // Get central topic ...
+ var centralTopic = mindmapDesigner.getCentralTopic();
+ var centralTopicId = centralTopic.getId();
+
+ // Execute action ...
+ var command = new mindplot.commands.AddTopicCommand(model, centralTopicId, true);
+ this._actionRunner.execute(command);
+ }
+ }.bind(this));
+ }
+ },
+
+ _buildNodeGraph : function(model) {
+ var workspace = this._workspace;
+
+ // Create node graph ...
+ var topic = mindplot.NodeGraph.create(model);
+
+ this._layoutManager.addHelpers(topic);
+
+ // Append it to the workspace ...
+ var topics = this._topics;
+ topics.push(topic);
+
+ // Add Topic events ...
+ this._layoutManager.registerListenersOnNode(topic);
+
+ // Connect Topic ...
+ var isConnected = model.isConnected();
+ if (isConnected) {
+ // Improve this ...
+ var targetTopicModel = model.getParent();
+ var targetTopicId = targetTopicModel.getId();
+ var targetTopic = null;
+
+ for (var i = 0; i < topics.length; i++) {
+ var t = topics[i];
+ if (t.getModel() == targetTopicModel) {
+ targetTopic = t;
+ // Disconnect the node. It will be connected again later ...
+ model.disconnect();
+ break;
+ }
+ }
+ $assert(targetTopic, "Could not find a topic to connect");
+ topic.connectTo(targetTopic, workspace);
+ }
+
+ return topic;
+ },
+
+ onObjectFocusEvent : function(currentObject, event) {
+ this.getEditor().lostFocus();
+ var selectableObjects = this.getSelectedObjects();
+ // Disable all nodes on focus but not the current if Ctrl key isn't being pressed
+ if (!$defined(event) || event.ctrlKey == false) {
+ for (var i = 0; i < selectableObjects.length; i++) {
+ var selectableObject = selectableObjects[i];
+ if (selectableObject.isOnFocus() && selectableObject != currentObject) {
+ selectableObject.setOnFocus(false);
+ }
+ }
+ }
+ },
+
+ zoomOut : function() {
+ var scale = this._zoom * 1.2;
+ if (scale <= 4) {
+ this._zoom = scale;
+ this._workspace.setZoom(this._zoom);
+ }
+ else {
+ core.Monitor.getInstance().logMessage('Sorry, no more zoom can be applied. \n Why do you need more?');
+ }
+
+ },
+
+ zoomIn : function() {
+ var scale = this._zoom / 1.2;
+ if (scale >= 0.3) {
+ this._zoom = scale;
+ this._workspace.setZoom(this._zoom);
+ }
+ else {
+ core.Monitor.getInstance().logMessage('Sorry, no more zoom can be applied. \n Why do you need more?');
+ }
+ },
+
+ createChildForSelectedNode : function() {
+
+ var nodes = this._getSelectedNodes();
+ if (nodes.length <= 0) {
+ // If there are more than one node selected,
+ core.Monitor.getInstance().logMessage('Could not create a topic. Only one node must be selected.');
+ return;
+
+ }
+ if (nodes.length > 1) {
+
+ // If there are more than one node selected,
+ core.Monitor.getInstance().logMessage('Could not create a topic. One topic must be selected.');
+ return;
+ }
+
+ // Add new node ...
+ var centalTopic = nodes[0];
+ var parentTopicId = centalTopic.getId();
+ var childModel = centalTopic.createChildModel(this._layoutManager.needsPrepositioning());
+
+ var command = new mindplot.commands.AddTopicCommand(childModel, parentTopicId, true);
+ this._actionRunner.execute(command);
+ },
+
+ createSiblingForSelectedNode : function() {
+ var nodes = this._getSelectedNodes();
+ if (nodes.length <= 0) {
+ // If there are more than one node selected,
+ core.Monitor.getInstance().logMessage('Could not create a topic. Only one node must be selected.');
+ return;
+
+ }
+ if (nodes.length > 1) {
+ // If there are more than one node selected,
+ core.Monitor.getInstance().logMessage('Could not create a topic. One topic must be selected.');
+ return;
+ }
+
+ var topic = nodes[0];
+ if (topic.getType() == mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ // Central topic doesn't have siblings ...
+ this.createChildForSelectedNode();
+
+ } else {
+ var parentTopic = topic.getOutgoingConnectedTopic();
+ var siblingModel = topic.createSiblingModel(this._layoutManager.needsPrepositioning());
+ var parentTopicId = parentTopic.getId();
+ var command = new mindplot.commands.AddTopicCommand(siblingModel, parentTopicId, true);
+
+ this._actionRunner.execute(command);
+ }
+ },
+
+ addRelationShip2SelectedNode : function(event) {
+ var screen = this._workspace.getScreenManager();
+ var pos = screen.getWorkspaceMousePosition(event);
+ var selectedTopics = this.getSelectedNodes();
+ if (selectedTopics.length > 0 &&
+ (!$defined(this._creatingRelationship) || ($defined(this._creatingRelationship) && !this._creatingRelationship))) {
+ this._workspace.enableWorkspaceEvents(false);
+ var fromNodePosition = selectedTopics[0].getPosition();
+ this._relationship = new web2d.CurvedLine();
+ this._relationship.setStyle(web2d.CurvedLine.SIMPLE_LINE);
+ this._relationship.setDashed(2, 2);
+ this._relationship.setFrom(fromNodePosition.x, fromNodePosition.y);
+ this._relationship.setTo(pos.x, pos.y);
+ this._workspace.appendChild(this._relationship);
+ this._creatingRelationship = true;
+ this._relationshipMouseMoveFunction = this._relationshipMouseMove.bindWithEvent(this);
+ this._relationshipMouseClickFunction = this._relationshipMouseClick.bindWithEvent(this, selectedTopics[0]);
+ this._workspace.getScreenManager().addEventListener('mousemove', this._relationshipMouseMoveFunction);
+ this._workspace.getScreenManager().addEventListener('click', this._relationshipMouseClickFunction);
+ }
+ },
+
+ _relationshipMouseMove : function(event) {
+ var screen = this._workspace.getScreenManager();
+ var pos = screen.getWorkspaceMousePosition(event);
+ this._relationship.setTo(pos.x - 1, pos.y - 1); //to prevent click event target to be the line itself
+ event.preventDefault();
+ event.stop();
+ return false;
+ },
+
+ _relationshipMouseClick : function (event, fromNode) {
+ var target = event.target;
+ while (target.tagName != "g" && $defined(target.parentNode)) {
+ target = target.parentNode;
+ }
+ if ($defined(target.virtualRef)) {
+ var targetNode = target.virtualRef;
+ this.addRelationship(fromNode, targetNode);
+ }
+ this._workspace.removeChild(this._relationship);
+ this._relationship = null;
+ this._workspace.getScreenManager().removeEventListener('mousemove', this._relationshipMouseMoveFunction);
+ this._workspace.getScreenManager().removeEventListener('click', this._relationshipMouseClickFunction);
+ this._creatingRelationship = false;
+ this._workspace.enableWorkspaceEvents(true);
+ event.preventDefault();
+ event.stop();
+ return false;
+ },
+
+ addRelationship : function(fromNode, toNode) {
+ // Create a new topic model ...
+ var mindmap = this.getMindmap();
+ var model = mindmap.createRelationship(fromNode.getModel().getId(), toNode.getModel().getId());
+
+ var command = new mindplot.commands.AddRelationshipCommand(model, mindmap);
+ this._actionRunner.execute(command);
+ },
+
+ needsSave : function() {
+ return this._actionRunner.hasBeenChanged();
+ },
+
+ autoSaveEnabled : function(value) {
+ if ($defined(value) && value) {
+ var autosave = function() {
+
+ if (this.needsSave()) {
+ this.save(null, false);
+ }
+ };
+ autosave.bind(this).periodical(30000);
+ }
+ },
+
+ save : function(onSavedHandler, saveHistory) {
+ var persistantManager = mindplot.PersistanceManager;
+ var mindmap = this._mindmap;
+
+ var properties = {zoom:this._zoom, layoutManager:this._layoutManager.getClassName()};
+ persistantManager.save(mindmap, properties, onSavedHandler, saveHistory);
+ this._fireEvent("save", {type:saveHistory});
+
+ // Refresh undo state...
+ this._actionRunner.markAsChangeBase();
+ },
+
+ loadFromCollaborativeModel: function(collaborationManager){
+ var mindmap = collaborationManager.buildWiseModel();
+ this._loadMap(1, mindmap);
+
+ // Place the focus on the Central Topic
+ var centralTopic = this.getCentralTopic();
+ this._goToNode.attempt(centralTopic, this);
+
+ this._fireEvent("loadsuccess");
+ },
+
+ loadFromXML : function(mapId, xmlContent) {
+ $assert(xmlContent, 'mindmapId can not be null');
+ $assert(xmlContent, 'xmlContent can not be null');
+
+ // Explorer Hack with local files ...
+ var domDocument = core.Utils.createDocumentFromText(xmlContent);
+
+ var serializer = mindplot.XMLMindmapSerializerFactory.getSerializerFromDocument(domDocument);
+ var mindmap = serializer.loadFromDom(domDocument);
+
+ this._loadMap(mapId, mindmap);
+
+ // Place the focus on the Central Topic
+ var centralTopic = this.getCentralTopic();
+ this._goToNode.attempt(centralTopic, this);
+
+ this._fireEvent("loadsuccess");
+
+ },
+
+ load : function(mapId) {
+ $assert(mapId, 'mapName can not be null');
+
+ // Build load function ...
+ var persistantManager = mindplot.PersistanceManager;
+
+ // Loading mindmap ...
+ var mindmap = persistantManager.load(mapId);
+
+ // Finally, load the map in the editor ...
+ this._loadMap(mapId, mindmap);
+
+ // Place the focus on the Central Topic
+ var centralTopic = this.getCentralTopic();
+ this._goToNode.attempt(centralTopic, this);
+
+ this._fireEvent("loadsuccess");
+ },
+
+ _loadMap : function(mapId, mindmapModel) {
+ var designer = this;
+ if (mindmapModel != null) {
+ mindmapModel.setId(mapId);
+ designer._mindmap = mindmapModel;
+
+ // Building node graph ...
+ var branches = mindmapModel.getBranches();
+ for (var i = 0; i < branches.length; i++) {
+ // NodeModel -> NodeGraph ...
+ var nodeModel = branches[i];
+ var nodeGraph = this._nodeModelToNodeGraph(nodeModel);
+
+ // Update shrink render state...
+ nodeGraph.setBranchVisibility(true);
+ }
+ var relationships = mindmapModel.getRelationships();
+ for (var j = 0; j < relationships.length; j++) {
+ var relationship = this._relationshipModelToRelationship(relationships[j]);
+ }
+ }
+ core.Executor.instance.setLoading(false);
+ this._getTopics().forEach(function(topic) {
+ delete topic.getModel()._finalPosition;
+ });
+ this._fireEvent("loadsuccess");
+
+ },
+
+
+ getMindmap : function() {
+ return this._mindmap;
+ },
+
+ undo : function() {
+ this._actionRunner.undo();
+ },
+
+ redo : function() {
+ this._actionRunner.redo();
+ },
+
+ _nodeModelToNodeGraph : function(nodeModel, isVisible) {
+ $assert(nodeModel, "Node model can not be null");
+ var nodeGraph = this._buildNodeGraph(nodeModel);
+
+ if ($defined(isVisible))
+ nodeGraph.setVisibility(isVisible);
+
+ var children = nodeModel.getChildren().slice();
+
+ children = this._layoutManager.prepareNode(nodeGraph, children);
+
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i];
+ if ($defined(child))
+ this._nodeModelToNodeGraph(child);
+ }
+
+ var workspace = this._workspace;
+ workspace.appendChild(nodeGraph);
+ return nodeGraph;
+ },
+
+ _relationshipModelToRelationship : function(model) {
+ $assert(model, "Node model can not be null");
+ var relationship = this._buildRelationship(model);
+ var sourceTopic = relationship.getSourceTopic();
+ sourceTopic.addRelationship(relationship);
+ var targetTopic = relationship.getTargetTopic();
+ targetTopic.addRelationship(relationship);
+ relationship.setVisibility(sourceTopic.isVisible() && targetTopic.isVisible());
+ var workspace = this._workspace;
+ workspace.appendChild(relationship);
+ relationship.redraw();
+ return relationship;
+ },
+
+ createRelationship : function(model) {
+ this._mindmap.addRelationship(model);
+ return this._relationshipModelToRelationship(model);
+ },
+
+ removeRelationship : function(model) {
+ this._mindmap.removeRelationship(model);
+ var relationship = this._relationships[model.getId()];
+ var sourceTopic = relationship.getSourceTopic();
+ sourceTopic.removeRelationship(relationship);
+ var targetTopic = relationship.getTargetTopic();
+ targetTopic.removeRelationship(relationship);
+ this._workspace.removeChild(relationship);
+ delete this._relationships[model.getId()];
+ },
+
+ _buildRelationship : function (model) {
+ var workspace = this._workspace;
+ var elem = this;
+
+ var fromNodeId = model.getFromNode();
+ var toNodeId = model.getToNode();
+
+ var fromTopic = null;
+ var toTopic = null;
+ var topics = this._topics;
+
+ for (var i = 0; i < topics.length; i++) {
+ var t = topics[i];
+ if (t.getModel().getId() == fromNodeId) {
+ fromTopic = t;
+ }
+ if (t.getModel().getId() == toNodeId) {
+ toTopic = t;
+ }
+ if (toTopic != null && fromTopic != null) {
+ break;
+ }
+ }
+
+ // Create node graph ...
+ var relationLine = new mindplot.RelationshipLine(fromTopic, toTopic, model.getLineType());
+ if ($defined(model.getSrcCtrlPoint())) {
+ var srcPoint = model.getSrcCtrlPoint().clone();
+ relationLine.setSrcControlPoint(srcPoint);
+ }
+ if ($defined(model.getDestCtrlPoint())) {
+ var destPoint = model.getDestCtrlPoint().clone();
+ relationLine.setDestControlPoint(destPoint);
+ }
+
+
+ relationLine.getLine().setDashed(3, 2);
+ relationLine.setShowEndArrow(model.getEndArrow());
+ relationLine.setShowStartArrow(model.getStartArrow());
+ relationLine.setModel(model);
+
+ //Add Listeners
+ var elem = this;
+ relationLine.addEventListener('onfocus', function(event) {
+ elem.onObjectFocusEvent.attempt([relationLine, event], elem);
+ });
+
+ // Append it to the workspace ...
+ this._relationships[model.getId()] = relationLine;
+
+ return relationLine;
+ },
+
+ getEditor : function() {
+ return this._editor;
+ },
+
+ _removeNode : function(node) {
+ if (node.getTopicType() != mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ var parent = node._parent;
+ node.disconnect(this._workspace);
+
+ //remove children
+ while (node._getChildren().length > 0) {
+ this._removeNode(node._getChildren()[0]);
+ }
+
+ this._workspace.removeChild(node);
+ this._topics.erase(node);
+
+ // Delete this node from the model...
+ var model = node.getModel();
+ model.deleteNode();
+
+ if ($defined(parent)) {
+ this._goToNode(parent);
+ }
+ }
+ },
+
+ deleteCurrentNode : function() {
+
+ var validateFunc = function(selectedObject) {
+ return selectedObject.getType() == mindplot.RelationshipLine.type || selectedObject.getTopicType() != mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE
+ };
+ var validateError = 'Central topic can not be deleted.';
+ var selectedObjects = this._getValidSelectedObjectsIds(validateFunc, validateError);
+ if (selectedObjects.nodes.length > 0 || selectedObjects.relationshipLines.length > 0) {
+ var command = new mindplot.commands.DeleteTopicCommand(selectedObjects);
+ this._actionRunner.execute(command);
+ }
+
+ },
+
+ setFont2SelectedNode : function(font) {
+ var validSelectedObjects = this._getValidSelectedObjectsIds();
+ var topicsIds = validSelectedObjects.nodes;
+ if (topicsIds.length > 0) {
+ var commandFunc = function(topic, font) {
+ var result = topic.getFontFamily();
+ topic.setFontFamily(font, true);
+
+ core.Executor.instance.delay(topic.updateNode, 0, topic);
+ /*var updated = function() {
+ topic.updateNode();
+ };
+ updated.delay(0);*/
+ return result;
+ }
+ var command = new mindplot.commands.GenericFunctionCommand(commandFunc, font, topicsIds);
+ this._actionRunner.execute(command);
+ }
+ },
+
+ setStyle2SelectedNode : function() {
+ var validSelectedObjects = this._getValidSelectedObjectsIds();
+ var topicsIds = validSelectedObjects.nodes;
+ if (topicsIds.length > 0) {
+ var commandFunc = function(topic) {
+ var result = topic.getFontStyle();
+ var style = (result == "italic") ? "normal" : "italic";
+ topic.setFontStyle(style, true);
+ return result;
+ }
+ var command = new mindplot.commands.GenericFunctionCommand(commandFunc, "", topicsIds);
+ this._actionRunner.execute(command);
+ }
+ },
+
+ setFontColor2SelectedNode : function(color) {
+ var validSelectedObjects = this._getValidSelectedObjectsIds();
+ var topicsIds = validSelectedObjects.nodes;
+ if (topicsIds.length > 0) {
+ var commandFunc = function(topic, color) {
+ var result = topic.getFontColor();
+ topic.setFontColor(color, true);
+ return result;
+ }
+ var command = new mindplot.commands.GenericFunctionCommand(commandFunc, color, topicsIds);
+ command.discartDuplicated = "fontColorCommandId";
+ this._actionRunner.execute(command);
+ }
+ },
+
+ setBackColor2SelectedNode : function(color) {
+
+ var validateFunc = function(topic) {
+ return topic.getShapeType() != mindplot.model.NodeModel.SHAPE_TYPE_LINE
+ };
+ var validateError = 'Color can not be setted to line topics.';
+ var validSelectedObjects = this._getValidSelectedObjectsIds(validateFunc, validateError);
+ ;
+ var topicsIds = validSelectedObjects.nodes;
+
+ if (topicsIds.length > 0) {
+ var commandFunc = function(topic, color) {
+ var result = topic.getBackgroundColor();
+ topic.setBackgroundColor(color);
+ return result;
+ }
+ var command = new mindplot.commands.GenericFunctionCommand(commandFunc, color, topicsIds);
+ command.discartDuplicated = "backColor";
+ this._actionRunner.execute(command);
+ }
+ },
+
+
+ _getValidSelectedObjectsIds : function(validate, errorMsg) {
+ var result = {"nodes":[],"relationshipLines":[]};
+ var selectedNodes = this._getSelectedNodes();
+ var selectedRelationshipLines = this.getSelectedRelationshipLines();
+ if (selectedNodes.length == 0 && selectedRelationshipLines.length == 0) {
+ core.Monitor.getInstance().logMessage('At least one element must be selected to execute this operation.');
+ } else {
+ var isValid = true;
+ for (var i = 0; i < selectedNodes.length; i++) {
+ var selectedNode = selectedNodes[i];
+ if ($defined(validate)) {
+ isValid = validate(selectedNode);
+ }
+
+ // Add node only if it's valid.
+ if (isValid) {
+ result.nodes.push(selectedNode.getId());
+ } else {
+ core.Monitor.getInstance().logMessage(errorMsg);
+ }
+ }
+ for (var j = 0; j < selectedRelationshipLines.length; j++) {
+ var selectedLine = selectedRelationshipLines[j];
+ isValid = true;
+ if ($defined(validate)) {
+ isValid = validate(selectedLine);
+ }
+
+ if (isValid) {
+ result.relationshipLines.push(selectedLine.getId());
+ } else {
+ core.Monitor.getInstance().logMessage(errorMsg);
+ }
+ }
+ }
+ return result;
+ },
+
+ setBorderColor2SelectedNode : function(color) {
+ var validateFunc = function(topic) {
+ return topic.getShapeType() != mindplot.model.NodeModel.SHAPE_TYPE_LINE
+ };
+ var validateError = 'Color can not be setted to line topics.';
+ var validSelectedObjects = this._getValidSelectedObjectsIds(validateFunc, validateError);
+ ;
+ var topicsIds = validSelectedObjects.nodes;
+
+ if (topicsIds.length > 0) {
+ var commandFunc = function(topic, color) {
+ var result = topic.getBorderColor();
+ topic.setBorderColor(color);
+ return result;
+ }
+ var command = new mindplot.commands.GenericFunctionCommand(commandFunc, color, topicsIds);
+ command.discartDuplicated = "borderColorCommandId";
+ this._actionRunner.execute(command);
+ }
+ },
+
+ setFontSize2SelectedNode : function(size) {
+ var validSelectedObjects = this._getValidSelectedObjectsIds();
+ var topicsIds = validSelectedObjects.nodes;
+ if (topicsIds.length > 0) {
+ var commandFunc = function(topic, size) {
+ var result = topic.getFontSize();
+ topic.setFontSize(size, true);
+
+ core.Executor.instance.delay(topic.updateNode, 0, topic);
+ /*var updated = function() {
+ topic.updateNode();
+ };
+ updated.delay(0);*/
+ return result;
+ }
+ var command = new mindplot.commands.GenericFunctionCommand(commandFunc, size, topicsIds);
+ this._actionRunner.execute(command);
+ }
+ },
+
+ setShape2SelectedNode : function(shape) {
+ var validateFunc = function(topic) {
+ return !(topic.getType() == mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE && shape == mindplot.model.NodeModel.SHAPE_TYPE_LINE)
+ };
+ var validateError = 'Central Topic shape can not be changed to line figure.';
+ var validSelectedObjects = this._getValidSelectedObjectsIds(validateFunc, validateError);
+ var topicsIds = validSelectedObjects.nodes;
+
+ if (topicsIds.length > 0) {
+ var commandFunc = function(topic, size) {
+ var result = topic.getShapeType();
+ topic.setShapeType(size, true);
+ return result;
+ }
+ var command = new mindplot.commands.GenericFunctionCommand(commandFunc, shape, topicsIds);
+ this._actionRunner.execute(command);
+ }
+ },
+
+
+ setWeight2SelectedNode : function() {
+ var validSelectedObjects = this._getValidSelectedObjectsIds();
+ var topicsIds = validSelectedObjects.nodes;
+ if (topicsIds.length > 0) {
+ var commandFunc = function(topic) {
+ var result = topic.getFontWeight();
+ var weight = (result == "bold") ? "normal" : "bold";
+ topic.setFontWeight(weight, true);
+
+ core.Executor.instance.delay(topic.updateNode, 0, topic);
+ /*var updated = function() {
+ topic.updateNode();
+ };
+ updated.delay(0);*/
+ return result;
+ }
+ var command = new mindplot.commands.GenericFunctionCommand(commandFunc, "", topicsIds);
+ this._actionRunner.execute(command);
+ }
+ },
+
+ addImage2SelectedNode : function(iconType) {
+ var validSelectedObjects = this._getValidSelectedObjectsIds();
+ var topicsIds = validSelectedObjects.nodes;
+ if (topicsIds.length > 0) {
+
+ var command = new mindplot.commands.AddIconToTopicCommand(topicsIds[0], iconType);
+ this._actionRunner.execute(command);
+ }
+ },
+
+ addLink2Node : function(url) {
+ var validSelectedObjects = this._getValidSelectedObjectsIds();
+ var topicsIds = validSelectedObjects.nodes;
+ if (topicsIds.length > 0) {
+ var command = new mindplot.commands.AddLinkToTopicCommand(topicsIds[0], url);
+ this._actionRunner.execute(command);
+ }
+ },
+
+ addLink2SelectedNode : function() {
+ var selectedTopics = this.getSelectedNodes();
+ var topic = null;
+ if (selectedTopics.length > 0) {
+ topic = selectedTopics[0];
+ if (!$defined(topic._hasLink)) {
+ var msg = new Element('div');
+ var urlText = new Element('div').inject(msg);
+ urlText.innerHTML = "URL:"
+ var formElem = new Element('form', {'action': 'none', 'id':'linkFormId'});
+ var urlInput = new Element('input', {'type': 'text', 'size':30});
+ urlInput.inject(formElem);
+ formElem.inject(msg)
+
+ var okButtonId = "linkOkButtonId";
+ formElem.addEvent('submit', function(e) {
+ $(okButtonId).fireEvent('click', e);
+ e = new Event(e);
+ e.stop();
+ });
+
+
+ var okFunction = function() {
+ var url = urlInput.value;
+ var result = false;
+ if ("" != url.trim()) {
+ this.addLink2Node(url);
+ result = true;
+ }
+ return result;
+ }.bind(this);
+ var dialog = mindplot.LinkIcon.buildDialog(this, okFunction, okButtonId);
+ dialog.adopt(msg).show();
+
+ // IE doesn't like too much this focus action...
+ if (!core.UserAgent.isIE()) {
+ urlInput.focus();
+ }
+ }
+ } else {
+ core.Monitor.getInstance().logMessage('At least one topic must be selected to execute this operation.');
+ }
+ },
+
+ addNote2Node : function(text) {
+ var validSelectedObjects = this._getValidSelectedObjectsIds();
+ var topicsIds = validSelectedObjects.nodes;
+ if (topicsIds.length > 0) {
+ var command = new mindplot.commands.AddNoteToTopicCommand(topicsIds[0], text);
+ this._actionRunner.execute(command);
+ }
+ },
+
+ addNote2SelectedNode : function() {
+ var selectedTopics = this.getSelectedNodes();
+ var topic = null;
+ if (selectedTopics.length > 0) {
+ topic = selectedTopics[0];
+ if (!$defined(topic._hasNote)) {
+ var msg = new Element('div');
+ var text = new Element('div').inject(msg);
+ var formElem = new Element('form', {'action': 'none', 'id':'noteFormId'});
+ var textInput = new Element('textarea').setStyles({'width':280, 'height':50});
+ textInput.inject(formElem);
+ formElem.inject(msg);
+
+ var okButtonId = "noteOkButtonId";
+ formElem.addEvent('submit', function(e) {
+ $(okButtonId).fireEvent('click', e);
+ e = new Event(e);
+ e.stop();
+ });
+
+
+ var okFunction = function() {
+ var text = textInput.value;
+ var result = false;
+ if ("" != text.trim()) {
+ this.addNote2Node(text);
+ result = true;
+ }
+ return result;
+ }.bind(this);
+ var dialog = mindplot.Note.buildDialog(this, okFunction, okButtonId);
+ dialog.adopt(msg).show();
+
+ // IE doesn't like too much this focus action...
+ if (!core.UserAgent.isIE()) {
+ textInput.focus();
+ }
+ }
+ } else {
+ core.Monitor.getInstance().logMessage('At least one topic must be selected to execute this operation.');
+ }
+ },
+
+ removeLastImageFromSelectedNode : function() {
+ var nodes = this._getSelectedNodes();
+ if (nodes.length == 0) {
+ core.Monitor.getInstance().logMessage('A topic must be selected in order to execute this operation.');
+ } else {
+ var elem = nodes[0];
+ elem.removeLastIcon(this);
+ core.Executor.instance.delay(elem.updateNode, 0, elem);
+ /*var executor = function(editor)
+ {
+ return function()
+ {
+ elem.updateNode();
+ };
+ };
+
+ setTimeout(executor(this), 0);*/
+ }
+ },
+
+
+ _getSelectedNodes : function() {
+ var result = new Array();
+ for (var i = 0; i < this._topics.length; i++) {
+ if (this._topics[i].isOnFocus()) {
+ result.push(this._topics[i]);
+ }
+ }
+ return result;
+ },
+
+ getSelectedRelationshipLines : function() {
+ var result = new Array();
+ for (var id in this._relationships) {
+ var relationship = this._relationships[id];
+ if (relationship.isOnFocus()) {
+ result.push(relationship);
+ }
+ }
+ return result;
+ },
+
+ getSelectedNodes : function() {
+ return this._getSelectedNodes();
+ },
+
+ getSelectedObjects : function() {
+ var selectedNodes = this.getSelectedNodes();
+ var selectedRelationships = this.getSelectedRelationshipLines();
+ selectedRelationships.extend(selectedNodes);
+ return selectedRelationships;
+ },
+
+ keyEventHandler : function(event) {
+ if (this._workspace.isWorkspaceEventsEnabled()) {
+ var evt = (event) ? event : window.event;
+
+ if (evt.keyCode == 8) {
+ if ($defined(event)) {
+ if ($defined(event.preventDefault)) {
+ event.preventDefault();
+ } else {
+ event.returnValue = false;
+ }
+ new Event(event).stop();
+ }
+ else
+ evt.returnValue = false;
+ }
+ else {
+ evt = new Event(event);
+ var key = evt.key;
+ if (!this._editor.isVisible()) {
+ if (((evt.code >= 65 && evt.code <= 90) || (evt.code >= 48 && evt.code <= 57)) && !(evt.control || evt.meta)) {
+ if ($defined(evt.shift)) {
+ key = key.toUpperCase();
+ }
+ this._showEditor(key);
+ }
+ else {
+ switch (key) {
+ case 'delete':
+ this.deleteCurrentNode();
+ break;
+ case 'enter':
+ if (!evt.meta) {
+ this.createSiblingForSelectedNode();
+ break;
+ }
+ case 'insert':
+ this.createChildForSelectedNode();
+ break;
+ case 'right':
+ var nodes = this._getSelectedNodes();
+ if (nodes.length > 0) {
+ var node = nodes[0];
+ if (node.getTopicType() == mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ this._goToSideChild(node, 'RIGHT');
+ }
+ else {
+ if (node.getPosition().x < 0) {
+ this._goToParent(node);
+ }
+ else if (!node.areChildrenShrinked()) {
+ this._goToChild(node);
+ }
+ }
+ }
+ break;
+ case 'left':
+ var nodes = this._getSelectedNodes();
+ if (nodes.length > 0) {
+ var node = nodes[0];
+ if (node.getTopicType() == mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ this._goToSideChild(node, 'LEFT');
+ }
+ else {
+ if (node.getPosition().x > 0) {
+ this._goToParent(node);
+ }
+ else if (!node.areChildrenShrinked()) {
+ this._goToChild(node);
+ }
+ }
+ }
+ break;
+ case'up':
+ var nodes = this._getSelectedNodes();
+ if (nodes.length > 0) {
+ var node = nodes[0];
+ if (node.getTopicType() != mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ this._goToBrother(node, 'UP');
+ }
+ }
+ break;
+ case 'down':
+ var nodes = this._getSelectedNodes();
+ if (nodes.length > 0) {
+ var node = nodes[0];
+ if (node.getTopicType() != mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ this._goToBrother(node, 'DOWN');
+ }
+ }
+ break;
+ case 'f2':
+ this._showEditor();
+ break;
+ case 'space':
+
+ var nodes = this._getSelectedNodes();
+ if (nodes.length > 0) {
+ var topic = nodes[0];
+
+ var model = topic.getModel();
+ var isShrink = !model.areChildrenShrinked();
+ topic.setChildrenShrinked(isShrink);
+ }
+ break;
+ case 'backspace':
+ evt.preventDefault();
+ break;
+ case 'esc':
+ var nodes = this._getSelectedNodes();
+ for (var i = 0; i < nodes.length; i++) {
+ var node = nodes[i];
+ node.setOnFocus(false);
+ }
+ break;
+ case 'z':
+ if (evt.control || evt.meta) {
+ if (evt.shift) {
+ this.redo();
+ }
+ else {
+ this.undo();
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ evt.stop();
+ }
+ }
+ }
+ },
+
+ _showEditor : function(key) {
+ var nodes = this._getSelectedNodes();
+ if (nodes.length == 1) {
+ var node = nodes[0];
+ if (key && key != "") {
+ this._editor.setInitialText(key);
+ }
+ this._editor.getFocusEvent.attempt(node, this._editor);
+ }
+ },
+
+ _goToBrother : function(node, direction) {
+ var brothers = node._parent._getChildren();
+ var target = node;
+ var y = node.getPosition().y;
+ var x = node.getPosition().x;
+ var dist = null;
+ for (var i = 0; i < brothers.length; i++) {
+ var sameSide = (x * brothers[i].getPosition().x) >= 0;
+ if (brothers[i] != node && sameSide) {
+ var brother = brothers[i];
+ var brotherY = brother.getPosition().y;
+ if (direction == "DOWN" && brotherY > y) {
+ var distancia = y - brotherY;
+ if (distancia < 0) {
+ distancia = distancia * (-1);
+ }
+ if (dist == null || dist > distancia) {
+ dist = distancia;
+ target = brothers[i];
+ }
+ }
+ else if (direction == "UP" && brotherY < y) {
+ var distancia = y - brotherY;
+ if (distancia < 0) {
+ distancia = distancia * (-1);
+ }
+ if (dist == null || dist > distancia) {
+ dist = distancia;
+ target = brothers[i];
+ }
+ }
+ }
+ }
+ this._goToNode(target);
+ },
+
+ _goToNode : function(node) {
+ node.setOnFocus(true);
+ this.onObjectFocusEvent.attempt(node, this);
+ },
+
+ _goToSideChild : function(node, side) {
+ var children = node._getChildren();
+ if (children.length > 0) {
+ var target = children[0];
+ var top = null;
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i];
+ var childY = child.getPosition().y;
+ if (side == 'LEFT' && child.getPosition().x < 0) {
+ if (top == null || childY < top) {
+ target = child;
+ top = childY;
+ }
+ }
+ if (side == 'RIGHT' && child.getPosition().x > 0) {
+ if (top == null || childY < top) {
+ target = child;
+ top = childY;
+ }
+ }
+ }
+
+ this._goToNode(target);
+ }
+ },
+
+ _goToParent : function(node) {
+ var parent = node._parent;
+ this._goToNode(parent);
+ },
+
+ _goToChild : function(node) {
+ var children = node._getChildren();
+ if (children.length > 0) {
+ var target = children[0];
+ var top = target.getPosition().y;
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i];
+ if (child.getPosition().y < top) {
+ top = child.getPosition().y;
+ target = child;
+ }
+ }
+ this._goToNode(target);
+ }
+ },
+
+ getWorkSpace : function() {
+ return this._workspace;
+ },
+
+ findRelationShipsByTopicId : function(topicId) {
+ var result = [];
+ for (var relationshipId in this._relationships) {
+ var relationship = this._relationships[relationshipId];
+ if (relationship.getModel().getFromNode() == topicId || relationship.getModel().getToNode() == topicId) {
+ result.push(relationship);
+ }
+ }
+ return result;
+ }
+ }
+);
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.ScreenManager = new Class({
+ initialize:function(width, height, divElement) {
+ $assert(divElement, "can not be null");
+ this._divContainer = divElement;
+ this._offset = {x:0,y:0};
+ },
+
+ setScale : function(scale) {
+ $assert(scale, 'Screen scale can not be null');
+ this._workspaceScale = scale;
+ },
+
+ addEventListener : function(event, listener) {
+ $(this._divContainer).addEvent(event, listener);
+ },
+
+ removeEventListener : function(event, listener) {
+ $(this._divContainer).removeEvent(event, listener);
+ },
+
+ getWorkspaceElementPosition : function(e) {
+ // Retrive current element position.
+ var elementPosition = e.getPosition();
+ var x = elementPosition.x;
+ var y = elementPosition.y;
+
+ // Add workspace offset.
+ x = x - this._offset.x;
+ y = y - this._offset.y;
+
+ // Scale coordinate in order to be relative to the workspace. That's coordSize/size;
+ x = x / this._workspaceScale;
+ y = y / this._workspaceScale;
+
+ // Subtract div position.
+ /* var containerElem = this.getContainer();
+ var containerPosition = core.Utils.workOutDivElementPosition(containerElem);
+ x = x + containerPosition.x;
+ y = y + containerPosition.y;*/
+
+ // Remove decimal part..
+ return {x:x,y:y};
+ },
+
+ getWorkspaceIconPosition : function(e) {
+ // Retrieve current icon position.
+ var image = e.getImage();
+ var elementPosition = image.getPosition();
+ var imageSize = e.getSize();
+
+ //Add group offset
+ var iconGroup = e.getGroup();
+ var group = iconGroup.getNativeElement();
+ var coordOrigin = group.getCoordOrigin();
+ var groupSize = group.getSize();
+ var coordSize = group.getCoordSize();
+
+ var scale = {x:coordSize.width / parseInt(groupSize.width), y:coordSize.height / parseInt(groupSize.height)};
+
+ var x = (elementPosition.x - coordOrigin.x - (parseInt(imageSize.width) / 2)) / scale.x;
+ var y = (elementPosition.y - coordOrigin.y - (parseInt(imageSize.height) / 2)) / scale.y;
+
+ //Retrieve iconGroup Position
+ var groupPosition = iconGroup.getPosition();
+ x = x + groupPosition.x;
+ y = y + groupPosition.y;
+
+ //Retrieve topic Position
+ var topic = iconGroup.getTopic();
+ var topicPosition = this.getWorkspaceElementPosition(topic);
+ topicPosition.x = topicPosition.x - (parseInt(topic.getSize().width) / 2);
+
+
+ // Remove decimal part..
+ return {x:x + topicPosition.x,y:y + topicPosition.y};
+ },
+
+ getWorkspaceMousePosition : function(e) {
+ // Retrive current mouse position.
+ var mousePosition = this._getMousePosition(e);
+ var x = mousePosition.x;
+ var y = mousePosition.y;
+
+ // Subtract div position.
+ var containerElem = this.getContainer();
+ var containerPosition = core.Utils.workOutDivElementPosition(containerElem);
+ x = x - containerPosition.x;
+ y = y - containerPosition.y;
+
+ // Scale coordinate in order to be relative to the workspace. That's coordSize/size;
+ x = x * this._workspaceScale;
+ y = y * this._workspaceScale;
+
+ // Add workspace offset.
+ x = x + this._offset.x;
+ y = y + this._offset.y;
+
+ // Remove decimal part..
+ return new core.Point(x, y);
+ },
+
+ /**
+ * http://www.howtocreate.co.uk/tutorials/javascript/eventinfo
+ */
+ _getMousePosition : function(event) {
+ return core.Utils.getMousePosition(event);
+ },
+
+ getContainer : function() {
+ return this._divContainer;
+ },
+
+ setOffset : function(x, y) {
+ this._offset.x = x;
+ this._offset.y = y;
+ }});
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.Workspace = new Class({
+ initialize: function(profile, screenManager, zoom) {
+ // Create a suitable container ...
+ $assert(screenManager, 'Div container can not be null');
+ this._zoom = zoom;
+ this._screenManager = screenManager;
+ this._screenWidth = profile.width;
+ this._screenHeight = profile.height;
+
+ // Initalize web2d workspace.
+ var workspace = this._createWorkspace(profile);
+ this._workspace = workspace;
+
+ var screenContainer = screenManager.getContainer();
+ // Fix the height of the container ....
+ screenContainer.style.height = this._screenHeight + "px";
+
+ // Append to the workspace...
+ workspace.addItAsChildTo(screenContainer);
+ this.setZoom(zoom, true);
+
+ // Register drag events ...
+ this._registerDragEvents();
+
+ this._eventsEnabled = true;
+
+ },
+
+ _updateScreenManager: function() {
+ var zoom = this._zoom;
+ this._screenManager.setScale(zoom);
+
+ var coordOriginX = -((this._screenWidth * this._zoom) / 2);
+ var coordOriginY = -((this._screenHeight * this._zoom) / 2);
+ this._screenManager.setOffset(coordOriginX, coordOriginY);
+ },
+
+ _createWorkspace: function(profile) {
+ // Initialize workspace ...
+ var coordOriginX = -(this._screenWidth / 2);
+ var coordOriginY = -(this._screenHeight / 2);
+
+ var workspaceProfile = {
+ width: this._screenWidth + "px",
+ height: this._screenHeight + "px",
+ coordSizeWidth:this._screenWidth,
+ coordSizeHeight:this._screenHeight,
+ coordOriginX:coordOriginX,
+ coordOriginY:coordOriginY,
+ fillColor:'transparent',
+ strokeWidth:0
+ };
+ web2d.peer.Toolkit.init();
+ return new web2d.Workspace(workspaceProfile);
+ },
+
+ appendChild: function(shape) {
+ if ($defined(shape.addToWorkspace)) {
+ shape.addToWorkspace(this);
+ } else {
+ this._workspace.appendChild(shape);
+ }
+ },
+
+ removeChild: function(shape) {
+ // Element is a node, not a web2d element?
+ if ($defined(shape.removeFromWorkspace)) {
+ shape.removeFromWorkspace(this);
+ } else {
+ this._workspace.removeChild(shape);
+ }
+ },
+
+ addEventListener: function(type, listener) {
+ this._workspace.addEventListener(type, listener);
+ },
+
+ removeEventListener: function(type, listener) {
+ this._workspace.removeEventListener(type, listener);
+ },
+
+ getSize: function() {
+ return this._workspace.getCoordSize();
+ },
+
+ setZoom: function(zoom, center) {
+ this._zoom = zoom;
+ var workspace = this._workspace;
+
+ // Update coord scale...
+ var coordWidth = zoom * this._screenWidth;
+ var coordHeight = zoom * this._screenHeight;
+ workspace.setCoordSize(coordWidth, coordHeight);
+
+ // Center topic....
+ var coordOriginX;
+ var coordOriginY;
+ if (center) {
+ coordOriginX = -(coordWidth / 2);
+ coordOriginY = -(coordHeight / 2);
+ } else {
+ var coordOrigin = workspace.getCoordOrigin();
+ coordOriginX = coordOrigin.x;
+ coordOriginY = coordOrigin.y;
+ }
+
+ workspace.setCoordOrigin(coordOriginX, coordOriginY);
+
+ // Update screen.
+ this._screenManager.setOffset(coordOriginX, coordOriginY);
+ this._screenManager.setScale(zoom);
+ },
+
+ getScreenManager: function() {
+ return this._screenManager;
+ },
+
+ enableWorkspaceEvents: function(value) {
+ this._eventsEnabled = value;
+ },
+
+ isWorkspaceEventsEnabled: function() {
+ return this._eventsEnabled;
+ },
+
+ dumpNativeChart: function() {
+ var workspace = this._workspace;
+ return workspace.dumpNativeChart();
+ },
+ _registerDragEvents: function() {
+ var workspace = this._workspace;
+ var screenManager = this._screenManager;
+ this._dragging = true;
+ var mWorkspace = this;
+ var mouseDownListener = function(event) {
+ if (!$defined(workspace.mouseMoveListener)) {
+ if (mWorkspace.isWorkspaceEventsEnabled()) {
+ mWorkspace.enableWorkspaceEvents(false);
+
+ var mouseDownPosition = screenManager.getWorkspaceMousePosition(event);
+ var originalCoordOrigin = workspace.getCoordOrigin();
+
+ workspace.mouseMoveListener = function(event) {
+
+ var currentMousePosition = screenManager.getWorkspaceMousePosition(event);
+
+ var offsetX = currentMousePosition.x - mouseDownPosition.x;
+ var coordOriginX = -offsetX + originalCoordOrigin.x;
+
+ var offsetY = currentMousePosition.y - mouseDownPosition.y;
+ var coordOriginY = -offsetY + originalCoordOrigin.y;
+
+ workspace.setCoordOrigin(coordOriginX, coordOriginY);
+
+ // Change cursor.
+ if (core.UserAgent.isMozillaFamily()) {
+ window.document.body.style.cursor = "-moz-grabbing";
+ } else {
+ window.document.body.style.cursor = "move";
+ }
+ event.preventDefault();
+ }.bindWithEvent(this);
+ screenManager.addEventListener('mousemove', workspace.mouseMoveListener);
+
+ // Register mouse up listeners ...
+ workspace.mouseUpListener = function(event) {
+
+ screenManager.removeEventListener('mousemove', workspace.mouseMoveListener);
+ screenManager.removeEventListener('mouseup', workspace.mouseUpListener);
+ workspace.mouseUpListener = null;
+ workspace.mouseMoveListener = null;
+ window.document.body.style.cursor = 'default';
+
+ // Update screen manager offset.
+ var coordOrigin = workspace.getCoordOrigin();
+ screenManager.setOffset(coordOrigin.x, coordOrigin.y);
+ mWorkspace.enableWorkspaceEvents(true);
+ },
+ screenManager.addEventListener('mouseup', workspace.mouseUpListener);
+ }
+ } else {
+ workspace.mouseUpListener();
+ }
+ };
+ screenManager.addEventListener('mousedown', mouseDownListener);
+ }
+});
+
+
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.ShirinkConnector = new Class({
+ initialize: function(topic) {
+
+ var elipse = new web2d.Elipse(mindplot.Topic.prototype.INNER_RECT_ATTRIBUTES);
+ this._elipse = elipse;
+ elipse.setFill('#f7f7f7');
+
+ elipse.setSize(mindplot.Topic.CONNECTOR_WIDTH, mindplot.Topic.CONNECTOR_WIDTH);
+ elipse.addEventListener('click', function(event) {
+ var model = topic.getModel();
+ var isShrink = !model.areChildrenShrinked();
+
+ var actionRunner = mindplot.DesignerActionRunner.getInstance();
+ var topicId = topic.getId();
+
+ var commandFunc = function(topic, isShrink) {
+ topic.setChildrenShrinked(isShrink);
+ return !isShrink;
+ };
+
+ var command = new mindplot.commands.GenericFunctionCommand(commandFunc, isShrink, [topicId]);
+ actionRunner.execute(command);
+
+ var e = new Event(event).stop();
+ e.preventDefault();
+
+ });
+
+ elipse.addEventListener('mousedown', function(event) {
+ // Avoid node creation ...
+ var e = new Event(event).stop();
+ e.preventDefault();
+ });
+
+ elipse.addEventListener('dblclick', function(event) {
+ // Avoid node creation ...
+ event = new Event(event).stop();
+ event.preventDefault();
+
+ });
+
+ elipse.addEventListener('mouseover', function(event) {
+ this.setFill('#009900');
+ });
+
+ elipse.addEventListener('mouseout', function(event) {
+ var color = topic.getBackgroundColor();
+ this.setFill(color);
+ });
+
+ elipse.setCursor('default');
+ this._fillColor = '#f7f7f7';
+ var model = topic.getModel();
+ this.changeRender(model.areChildrenShrinked());
+
+ },
+ changeRender: function(isShrink) {
+ var elipse = this._elipse;
+ if (isShrink) {
+ elipse.setStroke('2', 'solid');
+ } else {
+ elipse.setStroke('1', 'solid');
+ }
+ },
+
+ setVisibility: function(value) {
+ this._elipse.setVisibility(value);
+ },
+
+ setOpacity: function(opacity) {
+ this._elipse.setOpacity(opacity);
+ },
+
+ setFill: function(color) {
+ this._fillColor = color;
+ this._elipse.setFill(color);
+ },
+
+ setAttribute: function(name, value) {
+ this._elipse.setAttribute(name, value);
+ },
+
+ addToWorkspace: function(group) {
+ group.appendChild(this._elipse);
+ },
+
+
+ setPosition: function(x, y) {
+ this._elipse.setPosition(x, y);
+ },
+
+ moveToBack: function() {
+ this._elipse.moveToBack();
+ },
+
+ moveToFront: function() {
+ this._elipse.moveToFront();
+ }
+});/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.NodeGraph = new Class({
+ initialize:function(nodeModel) {
+ $assert(nodeModel,"model can not be null");
+ this._mouseEvents = true;
+ this.setModel(nodeModel);
+ this._onFocus = false;
+ },
+
+ getType : function() {
+ var model = this.getModel();
+ return model.getType();
+ },
+
+ setId : function(id) {
+ this.getModel().setId(id);
+ },
+
+ _set2DElement : function(elem2d) {
+ this._elem2d = elem2d;
+ },
+
+ get2DElement : function() {
+ $assert(this._elem2d, 'NodeGraph has not been initialized propertly');
+ return this._elem2d;
+ },
+
+ setPosition : function(point) {
+ // Elements are positioned in the center.
+ var size = this._model.getSize();
+ this._elem2d.setPosition(point.x - (size.width / 2), point.y - (size.height / 2));
+ this._model.setPosition(point.x, point.y);
+ },
+
+ addEventListener : function(type, listener) {
+ var elem = this.get2DElement();
+ elem.addEventListener(type, listener);
+ },
+
+ isNodeGraph : function() {
+ return true;
+ },
+
+ setMouseEventsEnabled : function(isEnabled) {
+ this._mouseEvents = isEnabled;
+ },
+
+ isMouseEventsEnabled : function() {
+ return this._mouseEvents;
+ },
+
+ getSize : function() {
+ return this._model.getSize();
+ },
+
+ setSize : function(size) {
+ this._model.setSize(size.width, size.height);
+ },
+
+ getModel
+ :
+ function() {
+ $assert(this._model, 'Model has not been initialized yet');
+ return this._model;
+ }
+ ,
+
+ setModel : function(model) {
+ $assert(model, 'Model can not be null');
+ this._model = model;
+ },
+
+ getId : function() {
+ return this._model.getId();
+ },
+
+ setOnFocus : function(focus) {
+ this._onFocus = focus;
+ var outerShape = this.getOuterShape();
+ if (focus) {
+ outerShape.setFill('#c7d8ff');
+ outerShape.setOpacity(1);
+
+ } else {
+ // @todo: node must not know about the topic.
+
+ outerShape.setFill(mindplot.Topic.OUTER_SHAPE_ATTRIBUTES.fillColor);
+ outerShape.setOpacity(0);
+ }
+ this.setCursor('move');
+ },
+
+ isOnFocus : function() {
+ return this._onFocus;
+ },
+
+ dispose : function(workspace) {
+ workspace.removeChild(this);
+ },
+
+ createDragNode : function() {
+ var dragShape = this._buildDragShape();
+ return new mindplot.DragTopic(dragShape, this);
+ },
+
+ _buildDragShape : function() {
+ $assert(false, '_buildDragShape must be implemented by all nodes.');
+ },
+
+ getPosition : function() {
+ var model = this.getModel();
+ return model.getPosition();
+ }
+});
+
+mindplot.NodeGraph.create = function(nodeModel) {
+ $assert(nodeModel, 'Model can not be null');
+
+ var type = nodeModel.getType();
+ $assert(type, 'Node model type can not be null');
+
+ var result;
+ if (type == mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ result = new mindplot.CentralTopic(nodeModel);
+ } else
+ if (type == mindplot.model.NodeModel.MAIN_TOPIC_TYPE) {
+ result = new mindplot.MainTopic(nodeModel);
+ } else {
+ assert(false, "unsupported node type:" + type);
+ }
+
+ return result;
+}/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+mindplot.Topic = new Class({
+ Extends:mindplot.NodeGraph,
+ initialize : function(model) {
+ this.parent(model);
+ this._children = [];
+ this._parent = null;
+ this._relationships = [];
+ this._isInWorkspace = false;
+ this._helpers = [];
+
+ this._buildShape();
+ this.setMouseEventsEnabled(true);
+
+ // Positionate topic ....
+ var model = this.getModel();
+ var pos = model.getPosition();
+ if (pos != null && model.getType() == mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ this.setPosition(pos);
+ }
+ },
+
+ setShapeType : function(type) {
+ this._setShapeType(type, true);
+
+ },
+
+ getParent : function() {
+ return this._parent;
+ },
+
+ _setShapeType : function(type, updateModel) {
+ // Remove inner shape figure ...
+ var model = this.getModel();
+ if ($defined(updateModel) && updateModel) {
+ model.setShapeType(type);
+ }
+
+ var innerShape = this.getInnerShape();
+ if (innerShape != null) {
+ var dispatcherByEventType = innerShape._dispatcherByEventType;
+ // Remove old shape ...
+ this._removeInnerShape();
+
+ // Create a new one ...
+ innerShape = this.getInnerShape();
+
+ //Let's register all the events. The first one is the default one. The others will be copied.
+ //this._registerDefaultListenersToElement(innerShape, this);
+
+ var dispatcher = dispatcherByEventType['mousedown'];
+ if ($defined(dispatcher)) {
+ for (var i = 1; i < dispatcher._listeners.length; i++) {
+ innerShape.addEventListener('mousedown', dispatcher._listeners[i]);
+ }
+ }
+
+ // Update figure size ...
+ var size = model.getSize();
+ this.setSize(size, true);
+
+ var group = this.get2DElement();
+ group.appendChild(innerShape);
+
+ // Move text to the front ...
+ var text = this.getTextShape();
+ text.moveToFront();
+
+ //Move iconGroup to front ...
+ var iconGroup = this.getIconGroup();
+ if ($defined(iconGroup)) {
+ iconGroup.moveToFront();
+ }
+ //Move connector to front
+ var connector = this.getShrinkConnector();
+ if ($defined(connector)) {
+ connector.moveToFront();
+ }
+
+ //Move helpers to front
+ this._helpers.forEach(function(helper) {
+ helper.moveToFront();
+ });
+
+ }
+
+ },
+
+ getShapeType : function() {
+ var model = this.getModel();
+ var result = model.getShapeType();
+ if (!$defined(result)) {
+ result = this._defaultShapeType();
+ }
+ return result;
+ },
+
+ _removeInnerShape : function() {
+ var group = this.get2DElement();
+ var innerShape = this.getInnerShape();
+ group.removeChild(innerShape);
+ this._innerShape = null;
+ },
+
+ getInnerShape : function() {
+ if (!$defined(this._innerShape)) {
+ // Create inner box.
+ this._innerShape = this.buildShape(this.INNER_RECT_ATTRIBUTES);
+
+ // Update bgcolor ...
+ var bgColor = this.getBackgroundColor();
+ this._setBackgroundColor(bgColor, false);
+
+ // Update border color ...
+ var brColor = this.getBorderColor();
+ this._setBorderColor(brColor, false);
+
+ // Define the pointer ...
+ if (this.getType() != mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ this._innerShape.setCursor('move');
+ } else {
+ this._innerShape.setCursor('default');
+ }
+
+ }
+ return this._innerShape;
+ },
+
+
+ buildShape : function(attributes, type) {
+ var result;
+ if (!$defined(type)) {
+ type = this.getShapeType();
+ }
+
+ if (type == mindplot.model.NodeModel.SHAPE_TYPE_RECT) {
+ result = new web2d.Rect(0, attributes);
+ }
+ else if (type == mindplot.model.NodeModel.SHAPE_TYPE_ELIPSE) {
+ result = new web2d.Elipse(attributes);
+ }
+ else if (type == mindplot.model.NodeModel.SHAPE_TYPE_ROUNDED_RECT) {
+ result = new web2d.Rect(0.3, attributes);
+ }
+ else if (type == mindplot.model.NodeModel.SHAPE_TYPE_LINE) {
+ result = new web2d.Line({strokeColor:"#495879",strokeWidth:1, strokeOpacity:1});
+ result.setSize = function(width, height) {
+ this.size = {width:width, height:height};
+ result.setFrom(-1, height);
+ result.setTo(width + 1, height);
+
+ // Lines will have the same color of the default connection lines...
+ var stokeColor = mindplot.ConnectionLine.getStrokeColor();
+ result.setStroke(1, 'solid', stokeColor);
+ };
+
+ result.getSize = function() {
+ return this.size;
+ };
+
+ result.setPosition = function() {
+ };
+
+ var setStrokeFunction = result.setStroke;
+ result.setFill = function(color) {
+
+ };
+
+ result.setStroke = function(color) {
+
+ };
+ }
+ else {
+ $assert(false, "Unsupported figure type:" + type);
+ }
+
+ result.setPosition(0, 0);
+ return result;
+ },
+
+
+ setCursor : function(type) {
+ var innerShape = this.getInnerShape();
+ innerShape.setCursor(type);
+
+ var outerShape = this.getOuterShape();
+ outerShape.setCursor(type);
+
+ var textShape = this.getTextShape();
+ textShape.setCursor(type);
+ },
+
+ getOuterShape : function() {
+ if (!$defined(this._outerShape)) {
+ var rect = this.buildShape(mindplot.Topic.OUTER_SHAPE_ATTRIBUTES, mindplot.model.NodeModel.SHAPE_TYPE_ROUNDED_RECT);
+ rect.setPosition(-2, -3);
+ rect.setOpacity(0);
+ this._outerShape = rect;
+ }
+
+ return this._outerShape;
+ },
+
+ getTextShape : function() {
+ if (!$defined(this._text)) {
+ var model = this.getModel();
+ this._text = this._buildTextShape();
+
+ // Set Text ...
+ var text = this.getText();
+ this._setText(text, false);
+ }
+ return this._text;
+ },
+
+ getOrBuildIconGroup : function() {
+ if (!$defined(this._icon)) {
+ this._icon = this._buildIconGroup();
+ var group = this.get2DElement();
+ group.appendChild(this._icon.getNativeElement());
+ this._icon.moveToFront();
+ }
+ return this._icon;
+ },
+
+ getIconGroup : function() {
+ return this._icon;
+ },
+
+ _buildIconGroup : function(disableEventsListeners) {
+ var result = new mindplot.IconGroup(this);
+ var model = this.getModel();
+
+ //Icons
+ var icons = model.getIcons();
+ for (var i = 0; i < icons.length; i++) {
+ // Update model identifier ...
+ var iconModel = icons[i];
+ var icon = new mindplot.ImageIcon(iconModel, this, designer);
+ result.addIcon(icon);
+ }
+
+ //Links
+ var links = model.getLinks();
+ for (var i = 0; i < links.length; i++) {
+ this._hasLink = true;
+ this._link = new mindplot.LinkIcon(links[i], this, designer);
+ result.addIcon(this._link);
+ }
+
+ //Notes
+ var notes = model.getNotes();
+ for (var i = 0; i < notes.length; i++) {
+ this._hasNote = true;
+ this._note = new mindplot.Note(notes[i], this, designer);
+ result.addIcon(this._note);
+ }
+
+ return result;
+ },
+
+ addLink : function(url, designer) {
+ var iconGroup = this.getOrBuildIconGroup();
+ var model = this.getModel();
+ var linkModel = model.createLink(url);
+ model.addLink(linkModel);
+ this._link = new mindplot.LinkIcon(linkModel, this, designer);
+ iconGroup.addIcon(this._link);
+ this._hasLink = true;
+ },
+
+ addNote : function(text, designer) {
+ var iconGroup = this.getOrBuildIconGroup();
+ var model = this.getModel();
+ text = escape(text);
+ var noteModel = model.createNote(text)
+ model.addNote(noteModel);
+ this._note = new mindplot.Note(noteModel, this, designer);
+ iconGroup.addIcon(this._note);
+ this._hasNote = true;
+ },
+
+ addIcon : function(iconType, designer) {
+ var iconGroup = this.getOrBuildIconGroup();
+ var model = this.getModel();
+
+ // Update model ...
+ var iconModel = model.createIcon(iconType);
+ model.addIcon(iconModel);
+
+ var imageIcon = new mindplot.ImageIcon(iconModel, this, designer);
+ iconGroup.addIcon(imageIcon);
+
+ return imageIcon;
+ },
+
+ removeIcon : function(iconModel) {
+
+ //Removing the icon from MODEL
+ var model = this.getModel();
+ model._removeIcon(iconModel);
+
+ //Removing the icon from UI
+ var iconGroup = this.getIconGroup();
+ if ($defined(iconGroup)) {
+ var imgIcon = iconGroup.findIconFromModel(iconModel);
+ iconGroup.removeImageIcon(imgIcon);
+ if (iconGroup.getIcons().length == 0) {
+ this.get2DElement().removeChild(iconGroup.getNativeElement());
+ this._icon = null;
+ }
+ this.updateNode();
+ }
+ },
+
+ removeLink : function() {
+ var model = this.getModel();
+ var links = model.getLinks();
+ model._removeLink(links[0]);
+ var iconGroup = this.getIconGroup();
+ if ($defined(iconGroup)) {
+ iconGroup.removeIcon(mindplot.LinkIcon.IMAGE_URL);
+ if (iconGroup.getIcons().length == 0) {
+ this.get2DElement().removeChild(iconGroup.getNativeElement());
+ this._icon = null;
+ }
+ this.updateNode.delay(0, this);
+ }
+ this._link = null;
+ this._hasLink = false;
+ },
+
+ removeNote : function() {
+ var model = this.getModel();
+ var notes = model.getNotes();
+ model._removeNote(notes[0]);
+ var iconGroup = this.getIconGroup();
+ if ($defined(iconGroup)) {
+ iconGroup.removeIcon(mindplot.Note.IMAGE_URL);
+ if (iconGroup.getIcons().length == 0) {
+ this.get2DElement().removeChild(iconGroup.getNativeElement());
+ this._icon = null;
+ }
+ }
+ /*var elem = this;
+ var executor = function(editor)
+ {
+ return function()
+ {
+ elem.updateNode();
+ };
+ };
+
+ setTimeout(executor(this), 0);*/
+ core.Executor.instance.delay(this.updateNode, 0, this);
+ this._note = null;
+ this._hasNote = false;
+ },
+
+ addRelationship : function(relationship) {
+ this._relationships.push(relationship);
+ },
+
+ removeRelationship : function(relationship) {
+ this._relationships.erase(relationship);
+ },
+
+ getRelationships : function() {
+ return this._relationships;
+ },
+
+ _buildTextShape : function(disableEventsListeners) {
+ var result = new web2d.Text();
+ var font = {};
+
+ var family = this.getFontFamily();
+ var size = this.getFontSize();
+ var weight = this.getFontWeight();
+ var style = this.getFontStyle();
+ result.setFont(family, size, style, weight);
+
+ var color = this.getFontColor();
+ result.setColor(color);
+
+ if (!disableEventsListeners) {
+ // Propagate mouse events ...
+ var topic = this;
+ result.addEventListener('mousedown', function(event) {
+ var eventDispatcher = topic.getInnerShape()._dispatcherByEventType['mousedown'];
+ if ($defined(eventDispatcher)) {
+ eventDispatcher.eventListener(event);
+ }
+ });
+
+ if (this.getType() != mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ result.setCursor('move');
+ } else {
+ result.setCursor('default');
+ }
+ }
+
+ // Positionate node ...
+ this._offset = this.getOffset();
+ var iconOffset = this.getIconOffset();
+ result.setPosition(iconOffset + this._offset, this._offset / 2);
+ return result;
+ },
+
+ getIconOffset : function() {
+ var iconGroup = this.getIconGroup();
+ var size = 0;
+ if ($defined(iconGroup)) {
+ size = iconGroup.getSize().width;
+ }
+ return size;
+ },
+
+ getOffset : function(value, updateModel) {
+ var offset = 18;
+
+ if (mindplot.model.NodeModel.MAIN_TOPIC_TYPE == this.getType()) {
+ var parent = this.getModel().getParent();
+ if (parent && mindplot.model.NodeModel.MAIN_TOPIC_TYPE == parent.getType()) {
+ offset = 6;
+ }
+ else {
+ offset = 8;
+ }
+ }
+ return offset;
+ },
+
+ setFontFamily : function(value, updateModel) {
+ var textShape = this.getTextShape();
+ textShape.setFontFamily(value);
+ if ($defined(updateModel) && updateModel) {
+ var model = this.getModel();
+ model.setFontFamily(value);
+ }
+ /*var elem = this;
+ var executor = function(editor)
+ {
+ return function()
+ {
+ elem.updateNode(updateModel);
+ };
+ };
+
+ setTimeout(executor(this), 0);*/
+ core.Executor.instance.delay(this.updateNode, 0, this, [updateModel]);
+ },
+
+ setFontSize : function(value, updateModel) {
+ var textShape = this.getTextShape();
+ textShape.setSize(value);
+ if ($defined(updateModel) && updateModel) {
+ var model = this.getModel();
+ model.setFontSize(value);
+ }
+ /*var elem = this;
+ var executor = function(editor)
+ {
+ return function()
+ {
+ elem.updateNode(updateModel);
+ };
+ };
+
+ setTimeout(executor(this), 0);*/
+ core.Executor.instance.delay(this.updateNode, 0, this, [updateModel]);
+
+ },
+
+ setFontStyle : function(value, updateModel) {
+ var textShape = this.getTextShape();
+ textShape.setStyle(value);
+ if ($defined(updateModel) && updateModel) {
+ var model = this.getModel();
+ model.setFontStyle(value);
+ }
+ /*var elem = this;
+ var executor = function(editor)
+ {
+ return function()
+ {
+ elem.updateNode(updateModel);
+ };
+ };
+
+ setTimeout(executor(this), 0);*/
+ core.Executor.instance.delay(this.updateNode, 0, this, [updateModel]);
+ },
+
+ setFontWeight : function(value, updateModel) {
+ var textShape = this.getTextShape();
+ textShape.setWeight(value);
+ if ($defined(updateModel) && updateModel) {
+ var model = this.getModel();
+ model.setFontWeight(value);
+ }
+ },
+
+ getFontWeight : function() {
+ var model = this.getModel();
+ var result = model.getFontWeight();
+ if (!$defined(result)) {
+ var font = this._defaultFontStyle();
+ result = font.weight;
+ }
+ return result;
+ },
+
+ getFontFamily : function() {
+ var model = this.getModel();
+ var result = model.getFontFamily();
+ if (!$defined(result)) {
+ var font = this._defaultFontStyle();
+ result = font.font;
+ }
+ return result;
+ },
+
+ getFontColor : function() {
+ var model = this.getModel();
+ var result = model.getFontColor();
+ if (!$defined(result)) {
+ var font = this._defaultFontStyle();
+ result = font.color;
+ }
+ return result;
+ },
+
+ getFontStyle : function() {
+ var model = this.getModel();
+ var result = model.getFontStyle();
+ if (!$defined(result)) {
+ var font = this._defaultFontStyle();
+ result = font.style;
+ }
+ return result;
+ },
+
+ getFontSize : function() {
+ var model = this.getModel();
+ var result = model.getFontSize();
+ if (!$defined(result)) {
+ var font = this._defaultFontStyle();
+ result = font.size;
+ }
+ return result;
+ },
+
+ setFontColor : function(value, updateModel) {
+ var textShape = this.getTextShape();
+ textShape.setColor(value);
+ if ($defined(updateModel) && updateModel) {
+ var model = this.getModel();
+ model.setFontColor(value);
+ }
+ },
+
+ _setText : function(text, updateModel) {
+ var textShape = this.getTextShape();
+ textShape.setText(text);
+ /*var elem = this;
+ var executor = function(editor)
+ {
+ return function()
+ {
+ elem.updateNode(updateModel);
+ };
+ };
+
+ setTimeout(executor(this), 0);*/
+ core.Executor.instance.delay(this.updateNode, 0, this, [updateModel]);
+
+ if ($defined(updateModel) && updateModel) {
+ var model = this.getModel();
+ model.setText(text);
+ }
+ },
+
+ setText : function(text) {
+ this._setText(text, true);
+ },
+
+ getText : function() {
+ var model = this.getModel();
+ var result = model.getText();
+ if (!$defined(result)) {
+ result = this._defaultText();
+ }
+ return result;
+ },
+
+ setBackgroundColor : function(color) {
+ this._setBackgroundColor(color, true);
+ },
+
+ _setBackgroundColor : function(color, updateModel) {
+ var innerShape = this.getInnerShape();
+ innerShape.setFill(color);
+
+ var connector = this.getShrinkConnector();
+ connector.setFill(color);
+ if ($defined(updateModel) && updateModel) {
+ var model = this.getModel();
+ model.setBackgroundColor(color);
+ }
+ },
+
+ getBackgroundColor : function() {
+ var model = this.getModel();
+ var result = model.getBackgroundColor();
+ if (!$defined(result)) {
+ result = this._defaultBackgroundColor();
+ }
+ return result;
+ },
+
+ setBorderColor : function(color) {
+ this._setBorderColor(color, true);
+ },
+
+ _setBorderColor : function(color, updateModel) {
+ var innerShape = this.getInnerShape();
+ innerShape.setAttribute('strokeColor', color);
+
+ var connector = this.getShrinkConnector();
+ connector.setAttribute('strokeColor', color);
+
+
+ if ($defined(updateModel) && updateModel) {
+ var model = this.getModel();
+ model.setBorderColor(color);
+ }
+ },
+
+ getBorderColor : function() {
+ var model = this.getModel();
+ var result = model.getBorderColor();
+ if (!$defined(result)) {
+ result = this._defaultBorderColor();
+ }
+ return result;
+ },
+
+ _buildShape : function() {
+ var groupAttributes = {width: 100, height:100,coordSizeWidth:100,coordSizeHeight:100};
+ var group = new web2d.Group(groupAttributes);
+ group._peer._native.virtualRef = this;
+ this._set2DElement(group);
+
+ // Shape must be build based on the model width ...
+ var outerShape = this.getOuterShape();
+ var innerShape = this.getInnerShape();
+ var textShape = this.getTextShape();
+ var shrinkConnector = this.getShrinkConnector();
+
+ // Update figure size ...
+ var model = this.getModel();
+ var size = model.getSize();
+ this._setSize(size);
+
+ // Add to the group ...
+ group.appendChild(outerShape);
+ group.appendChild(innerShape);
+ group.appendChild(textShape);
+
+ if (model.getLinks().length != 0 || model.getNotes().length != 0 || model.getIcons().length != 0) {
+ iconGroup = this.getOrBuildIconGroup();
+ }
+
+ if (this.getType() != mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ shrinkConnector.addToWorkspace(group);
+ }
+
+ // Register listeners ...
+ this._registerDefaultListenersToElement(group, this);
+// this._registerDefaultListenersToElement(innerShape, this);
+// this._registerDefaultListenersToElement(textShape, this);
+
+ },
+
+ _registerDefaultListenersToElement : function(elem, topic) {
+ var mouseOver = function(event) {
+ if (topic.isMouseEventsEnabled()) {
+ topic.handleMouseOver(event);
+ }
+ };
+ elem.addEventListener('mouseover', mouseOver);
+
+ var outout = function(event) {
+ if (topic.isMouseEventsEnabled()) {
+ topic.handleMouseOut(event);
+ }
+ };
+ elem.addEventListener('mouseout', outout);
+
+ // Focus events ...
+ var mouseDown = function(event) {
+ topic.setOnFocus(true);
+ };
+ elem.addEventListener('mousedown', mouseDown);
+ },
+
+ areChildrenShrinked : function() {
+ var model = this.getModel();
+ return model.areChildrenShrinked();
+ },
+
+ isCollapsed : function() {
+ var model = this.getModel();
+ var result = false;
+
+ var current = this.getParent();
+ while (current && !result) {
+ result = current.areChildrenShrinked();
+ current = current.getParent();
+ }
+ return result;
+ },
+
+ setChildrenShrinked : function(value) {
+ // Update Model ...
+ var model = this.getModel();
+ model.setChildrenShrinked(value);
+
+ // Change render base on the state.
+ var shrinkConnector = this.getShrinkConnector();
+ shrinkConnector.changeRender(value);
+
+ // Hide children ...
+ core.Utils.setChildrenVisibilityAnimated(this, !value);
+ mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.NodeShrinkEvent, [this]);
+ },
+
+ getShrinkConnector : function() {
+ var result = this._connector;
+ if (this._connector == null) {
+ this._connector = new mindplot.ShirinkConnector(this);
+ this._connector.setVisibility(false);
+ result = this._connector;
+
+ }
+ return result;
+ },
+
+ handleMouseOver : function(event) {
+ var outerShape = this.getOuterShape();
+ outerShape.setOpacity(1);
+ mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.NodeMouseOverEvent, [this]);
+ },
+
+ handleMouseOut : function(event) {
+ var outerShape = this.getOuterShape();
+ if (!this.isOnFocus()) {
+ outerShape.setOpacity(0);
+ }
+ mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.NodeMouseOutEvent, [this]);
+ },
+
+ /**
+ * Point: references the center of the rect shape.!!!
+ */
+ setPosition : function(point) {
+ // Elements are positioned in the center.
+ // All topic element must be positioned based on the innerShape.
+ var size = this.getSize();
+
+ var cx = Math.round(point.x - (size.width / 2));
+ var cy = Math.round(point.y - (size.height / 2));
+
+ // Update visual position.
+ this._elem2d.setPosition(cx, cy);
+
+ // Update model's position ...
+ var model = this.getModel();
+ model.setPosition(point.x, point.y);
+
+ // Update connection lines ...
+ this._updateConnectionLines();
+
+ // Check object state.
+ this.invariant();
+ },
+
+ getOutgoingLine : function() {
+ return this._outgoingLine;
+ },
+
+ getIncomingLines : function() {
+ var result = [];
+ var children = this._getChildren();
+ for (var i = 0; i < children.length; i++) {
+ var node = children[i];
+ var line = node.getOutgoingLine();
+ if ($defined(line)) {
+ result.push(line);
+ }
+ }
+ return result;
+ },
+
+ getOutgoingConnectedTopic : function() {
+ var result = null;
+ var line = this.getOutgoingLine();
+ if ($defined(line)) {
+ result = line.getTargetTopic();
+ }
+ return result;
+ },
+
+
+ _updateConnectionLines : function() {
+ // Update this to parent line ...
+ var outgoingLine = this.getOutgoingLine();
+ if ($defined(outgoingLine)) {
+ outgoingLine.redraw();
+ }
+
+ // Update all the incoming lines ...
+ var incomingLines = this.getIncomingLines();
+ for (var i = 0; i < incomingLines.length; i++) {
+ incomingLines[i].redraw();
+ }
+
+ // Update relationship lines
+ for (var j = 0; j < this._relationships.length; j++) {
+ this._relationships[j].redraw();
+ }
+ },
+
+ setBranchVisibility : function(value) {
+ var current = this;
+ var parent = this;
+ while (parent != null && parent.getType() != mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ current = parent;
+ parent = current.getParent();
+ }
+ current.setVisibility(value);
+ },
+
+
+ setVisibility : function(value) {
+ this._setTopicVisibility(value);
+
+ // Hide all children...
+ this._setChildrenVisibility(value);
+
+ this._setRelationshipLinesVisibility(value);
+ },
+
+ moveToBack : function() {
+// this._helpers.forEach(function(helper, index){
+// helper.moveToBack();
+// });
+ // Update relationship lines
+ for (var j = 0; j < this._relationships.length; j++) {
+ this._relationships[j].moveToBack();
+ }
+ var connector = this.getShrinkConnector();
+ if ($defined(connector)) {
+ connector.moveToBack();
+ }
+
+ this.get2DElement().moveToBack();
+
+
+ },
+
+ moveToFront : function() {
+
+ this.get2DElement().moveToFront();
+ var connector = this.getShrinkConnector();
+ if ($defined(connector)) {
+ connector.moveToFront();
+ }
+ // Update relationship lines
+ for (var j = 0; j < this._relationships.length; j++) {
+ this._relationships[j].moveToFront();
+ }
+ },
+
+ isVisible : function() {
+ var elem = this.get2DElement();
+ return elem.isVisible();
+ },
+
+ _setRelationshipLinesVisibility : function(value) {
+ //var relationships = designer.findRelationShipsByTopicId(this.getId());
+ this._relationships.forEach(function(relationship, index) {
+ relationship.setVisibility(value);
+ });
+ },
+
+ _setTopicVisibility : function(value) {
+ var elem = this.get2DElement();
+ elem.setVisibility(value);
+
+ if (this.getIncomingLines().length > 0) {
+ var connector = this.getShrinkConnector();
+ connector.setVisibility(value);
+ }
+
+ var textShape = this.getTextShape();
+ textShape.setVisibility(value);
+
+ },
+
+ setOpacity : function(opacity) {
+ var elem = this.get2DElement();
+ elem.setOpacity(opacity);
+
+ this.getShrinkConnector().setOpacity(opacity);
+
+ var textShape = this.getTextShape();
+ textShape.setOpacity(opacity);
+ },
+
+ _setChildrenVisibility : function(isVisible) {
+
+ // Hide all children.
+ var children = this._getChildren();
+ var model = this.getModel();
+
+ isVisible = isVisible ? !model.areChildrenShrinked() : isVisible;
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i];
+ child.setVisibility(isVisible);
+
+ var outgoingLine = child.getOutgoingLine();
+ outgoingLine.setVisibility(isVisible);
+ }
+
+ },
+
+ invariant : function() {
+ var line = this._outgoingLine;
+ var model = this.getModel();
+ var isConnected = model.isConnected();
+
+ // Check consitency...
+ if ((isConnected && !line) || (!isConnected && line)) {
+ // $assert(false,'Illegal state exception.');
+ }
+ },
+
+ /**
+ * type:
+ * onfocus
+ */
+ addEventListener : function(type, listener) {
+ // Translate to web 2d events ...
+ if (type == 'onfocus') {
+ type = 'mousedown';
+ }
+
+ /* var textShape = this.getTextShape();
+ textShape.addEventListener(type, listener);
+
+ var outerShape = this.getOuterShape();
+ outerShape.addEventListener(type, listener);
+
+ var innerShape = this.getInnerShape();
+ innerShape.addEventListener(type, listener);*/
+ var shape = this.get2DElement();
+ shape.addEventListener(type, listener);
+ },
+
+ removeEventListener : function(type, listener) {
+ // Translate to web 2d events ...
+ if (type == 'onfocus') {
+ type = 'mousedown';
+ }
+ /*var textShape = this.getTextShape();
+ textShape.removeEventListener(type, listener);
+
+ var outerShape = this.getOuterShape();
+ outerShape.removeEventListener(type, listener);
+
+ var innerShape = this.getInnerShape();
+ innerShape.removeEventListener(type, listener);*/
+
+ var shape = this.get2DElement();
+ shape.removeEventListener(type, listener);
+ },
+
+
+ _setSize : function(size) {
+ $assert(size, "size can not be null");
+ $assert($defined(size.width), "size seem not to be a valid element");
+
+ mindplot.NodeGraph.prototype.setSize.call(this, size);
+
+ var outerShape = this.getOuterShape();
+ var innerShape = this.getInnerShape();
+ var connector = this.getShrinkConnector();
+
+ outerShape.setSize(size.width + 4, size.height + 6);
+ innerShape.setSize(size.width, size.height);
+ },
+
+ setSize : function(size, force, updatePosition) {
+ var oldSize = this.getSize();
+ if (oldSize.width != size.width || oldSize.height != size.height || force) {
+ this._setSize(size);
+
+ // Update the figure position(ej: central topic must be centered) and children position.
+ this._updatePositionOnChangeSize(oldSize, size, updatePosition);
+
+ mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.NodeResizeEvent, [this]);
+
+ }
+ },
+
+ _updatePositionOnChangeSize : function(oldSize, newSize, updatePosition) {
+ $assert(false, "this method must be overided");
+ },
+
+ disconnect : function(workspace) {
+ var outgoingLine = this.getOutgoingLine();
+ if ($defined(outgoingLine)) {
+ $assert(workspace, 'workspace can not be null');
+
+ this._outgoingLine = null;
+
+ // Disconnect nodes ...
+ var targetTopic = outgoingLine.getTargetTopic();
+ targetTopic._removeChild(this);
+
+ // Update model ...
+ var childModel = this.getModel();
+ childModel.disconnect();
+
+ this._parent = null;
+
+ // Remove graphical element from the workspace...
+ outgoingLine.removeFromWorkspace(workspace);
+
+ // Remove from workspace.
+ mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.NodeDisconnectEvent, [targetTopic, this]);
+
+ // Change text based on the current connection ...
+ var model = this.getModel();
+ if (!model.getText()) {
+ var text = this.getText();
+ this._setText(text, false);
+ }
+ if (!model.getFontSize()) {
+ var size = this.getFontSize();
+ this.setFontSize(size, false);
+ }
+
+ // Hide connection line?.
+ if (targetTopic._getChildren().length == 0) {
+ var connector = targetTopic.getShrinkConnector();
+ connector.setVisibility(false);
+ }
+
+ }
+ },
+
+ getOrder : function() {
+ var model = this.getModel();
+ return model.getOrder();
+ },
+
+ setOrder : function(value) {
+ var model = this.getModel();
+ model.setOrder(value);
+ },
+
+ connectTo : function(targetTopic, workspace, isVisible) {
+ $assert(!this._outgoingLine, 'Could not connect an already connected node');
+ $assert(targetTopic != this, 'Cilcular connection are not allowed');
+ $assert(targetTopic, 'Parent Graph can not be null');
+ $assert(workspace, 'Workspace can not be null');
+
+ // Connect Graphical Nodes ...
+ targetTopic._appendChild(this);
+ this._parent = targetTopic;
+
+// Update model ...
+ var targetModel = targetTopic.getModel();
+ var childModel = this.getModel();
+ childModel.connectTo(targetModel);
+
+// Update topic position based on the state ...
+ mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.NodeConnectEvent, [targetTopic, this]);
+
+ // Create a connection line ...
+ var outgoingLine = new mindplot.ConnectionLine(this, targetTopic);
+ if ($defined(isVisible))
+ outgoingLine.setVisibility(isVisible);
+ this._outgoingLine = outgoingLine;
+ workspace.appendChild(outgoingLine);
+
+ // Update figure is necessary.
+ this.updateTopicShape(targetTopic);
+
+ // Change text based on the current connection ...
+ var model = this.getModel();
+ if (!model.getText()) {
+ var text = this.getText();
+ this._setText(text, false);
+ }
+ if (!model.getFontSize()) {
+ var size = this.getFontSize();
+ this.setFontSize(size, false);
+ }
+ var textShape = this.getTextShape();
+
+ // Display connection node...
+ var connector = targetTopic.getShrinkConnector();
+ connector.setVisibility(true);
+
+ // Redraw line ...
+ outgoingLine.redraw();
+ },
+
+ _appendChild : function(child) {
+ var children = this._getChildren();
+ children.push(child);
+ },
+
+ _removeChild : function(child) {
+ var children = this._getChildren();
+ children.erase(child);
+ },
+
+ _getChildren : function() {
+ var result = this._children;
+ if (!$defined(result)) {
+ this._children = [];
+ result = this._children;
+ }
+ return result;
+ },
+
+ removeFromWorkspace : function(workspace) {
+ var elem2d = this.get2DElement();
+ workspace.removeChild(elem2d);
+ var line = this.getOutgoingLine();
+ if ($defined(line)) {
+ workspace.removeChild(line);
+ }
+ this._isInWorkspace = false;
+ },
+
+ addToWorkspace : function(workspace) {
+ var elem = this.get2DElement();
+ workspace.appendChild(elem);
+ this._isInWorkspace = true;
+ },
+
+ isInWorkspace : function() {
+ return this._isInWorkspace;
+ },
+
+ createDragNode : function() {
+ var dragNode = mindplot.NodeGraph.prototype.createDragNode.call(this);
+
+ // Is the node already connected ?
+ var targetTopic = this.getOutgoingConnectedTopic();
+ if ($defined(targetTopic)) {
+ dragNode.connectTo(targetTopic);
+ }
+ return dragNode;
+ },
+
+ updateNode : function(updatePosition) {
+ if (this.isInWorkspace()) {
+ var textShape = this.getTextShape();
+ var sizeWidth = textShape.getWidth();
+ var sizeHeight = textShape.getHeight();
+ var font = textShape.getFont();
+ var iconOffset = this.getIconOffset();
+ var height = sizeHeight + this._offset;
+ var width = sizeWidth + this._offset * 2 + iconOffset + 2;
+ var pos = this._offset / 2 - 1;
+ if (this.getShapeType() == mindplot.model.NodeModel.SHAPE_TYPE_ELIPSE) {
+ var factor = 0.25;
+ height = (width * factor < height ? height : width * factor);
+ pos = (height - sizeHeight + 3) / 2;
+ }
+
+ var newSize = {width:width,height:height};
+ this.setSize(newSize, false, updatePosition);
+
+ // Positionate node ...
+ textShape.setPosition(iconOffset + this._offset + 2, pos);
+ textShape.setTextSize(sizeWidth, sizeHeight);
+ var iconGroup = this.getIconGroup();
+ if ($defined(iconGroup))
+ iconGroup.updateIconGroupPosition();
+ }
+ },
+
+ INNER_RECT_ATTRIBUTES : {stroke:'0.5 solid'},
+
+ addHelper : function(helper) {
+ helper.addToGroup(this.get2DElement());
+ this._helpers.push(helper);
+ }
+});
+
+
+mindplot.Topic.CONNECTOR_WIDTH = 6;
+mindplot.Topic.OUTER_SHAPE_ATTRIBUTES = {fillColor:'#dbe2e6',stroke:'1 solid #77555a',x:0,y:0};
+
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.CentralTopic = new Class({
+
+ Extends:mindplot.Topic,
+ initialize: function(model) {
+ this.parent(model);
+ },
+
+ workoutIncomingConnectionPoint : function(sourcePosition) {
+ return this.getPosition();
+ },
+
+ getTopicType : function() {
+ return mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE;
+ },
+
+ setCursor : function(type) {
+ type = (type == 'move') ? 'default' : type;
+ mindplot.Topic.prototype.setCursor.call(this, type);
+ },
+
+ isConnectedToCentralTopic : function() {
+ return false;
+ },
+
+ createChildModel : function(prepositionate) {
+ // Create a new node ...
+ var model = this.getModel();
+ var mindmap = model.getMindmap();
+ var childModel = mindmap.createNode(mindplot.model.NodeModel.MAIN_TOPIC_TYPE);
+
+ if (prepositionate) {
+ if (!$defined(this.___siblingDirection)) {
+ this.___siblingDirection = 1;
+ }
+
+ // Position following taking into account this internal flag ...
+ if (this.___siblingDirection == 1) {
+
+ childModel.setPosition(150, 0);
+ } else {
+ childModel.setPosition(-150, 0);
+ }
+ this.___siblingDirection = -this.___siblingDirection;
+ }
+ // Create a new node ...
+ childModel.setOrder(0);
+
+ return childModel;
+ },
+
+ _defaultShapeType : function() {
+ return mindplot.model.NodeModel.SHAPE_TYPE_ROUNDED_RECT;
+ },
+
+
+ updateTopicShape : function() {
+
+ },
+
+ _updatePositionOnChangeSize : function(oldSize, newSize, updatePosition) {
+
+ // Center main topic ...
+ var zeroPoint = new core.Point(0, 0);
+ this.setPosition(zeroPoint);
+ },
+
+ _defaultText : function() {
+ return "Central Topic";
+ },
+
+ _defaultBackgroundColor : function() {
+ return "#f7f7f7";
+ },
+
+ _defaultBorderColor : function() {
+ return "#023BB9";
+ },
+
+ _defaultFontStyle : function() {
+ return {
+ font:"Verdana",
+ size: 10,
+ style:"normal",
+ weight:"bold",
+ color:"#023BB9"
+ };
+ }
+});/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.MainTopic = new Class({
+ Extends: mindplot.Topic,
+ initialize : function(model) {
+ this.parent(model);
+ },
+
+ INNER_RECT_ATTRIBUTES : {stroke:'0.5 solid #009900'},
+
+ createSiblingModel : function(positionate) {
+ var siblingModel = null;
+ var parentTopic = this.getOutgoingConnectedTopic();
+ if (parentTopic != null) {
+ // Create a new node ...
+ var model = this.getModel();
+ var mindmap = model.getMindmap();
+ siblingModel = mindmap.createNode(mindplot.model.NodeModel.MAIN_TOPIC_TYPE);
+
+ // Positionate following taking into account the sibling positon.
+ if (positionate && parentTopic.getType() == mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ var pos = this.getPosition();
+ siblingModel.setPosition(pos.x, pos.y);
+ }
+
+ // Create a new node ...
+ var order = this.getOrder() + 1;
+ siblingModel.setOrder(order);
+ }
+ return siblingModel;
+ },
+
+ createChildModel : function(prepositionate) {
+ // Create a new node ...
+ var model = this.getModel();
+ var mindmap = model.getMindmap();
+ var childModel = mindmap.createNode(mindplot.model.NodeModel.MAIN_TOPIC_TYPE);
+
+ // Get the hights model order position ...
+ var children = this._getChildren();
+ var order = -1;
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i];
+ if (child.getOrder() > order) {
+ order = child.getOrder();
+ }
+ }
+ // Create a new node ...
+ childModel.setOrder(order + 1);
+ return childModel;
+ },
+
+
+ _buildDragShape : function() {
+ var innerShape = this.buildShape(this.INNER_RECT_ATTRIBUTES);
+ var size = this.getSize();
+ innerShape.setSize(size.width, size.height);
+ innerShape.setPosition(0, 0);
+ innerShape.setOpacity(0.5);
+ innerShape.setCursor('default');
+ innerShape.setVisibility(true);
+
+ var brColor = this.getBorderColor();
+ innerShape.setAttribute("strokeColor", brColor);
+
+ var bgColor = this.getBackgroundColor();
+ innerShape.setAttribute("fillColor", bgColor);
+
+ // Create group ...
+ var groupAttributes = {width: 100, height:100,coordSizeWidth:100,coordSizeHeight:100};
+ var group = new web2d.Group(groupAttributes);
+ group.appendChild(innerShape);
+
+ // Add Text ...
+ var textShape = this._buildTextShape(true);
+ var text = this.getText();
+ textShape.setText(text);
+ textShape.setOpacity(0.5);
+ group.appendChild(textShape);
+
+ return group;
+ },
+
+
+ _defaultShapeType : function() {
+ return mindplot.model.NodeModel.SHAPE_TYPE_LINE;
+ },
+
+ updateTopicShape : function(targetTopic, workspace) {
+ // Change figure based on the connected topic ...
+ var model = this.getModel();
+ var shapeType = model.getShapeType();
+ if (targetTopic.getType() != mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ if (!$defined(shapeType)) {
+ // Get the real shape type ...
+ shapeType = this.getShapeType();
+ this._setShapeType(shapeType, false);
+ }
+ }
+ this._helpers.forEach(function(helper) {
+ helper.moveToFront();
+ });
+ },
+
+ disconnect : function(workspace) {
+ mindplot.Topic.prototype.disconnect.call(this, workspace);
+ var size = this.getSize();
+
+ var model = this.getModel();
+ var shapeType = model.getShapeType();
+ if (!$defined(shapeType)) {
+ // Change figure ...
+ shapeType = this.getShapeType();
+ this._setShapeType(mindplot.model.NodeModel.SHAPE_TYPE_ROUNDED_RECT, false);
+ }
+ var innerShape = this.getInnerShape();
+ innerShape.setVisibility(true);
+ },
+
+ getTopicType : function() {
+ return "MainTopic";
+ },
+
+ _updatePositionOnChangeSize : function(oldSize, newSize, updatePosition) {
+
+ if (updatePosition == false && this.getModel().getFinalPosition()) {
+ this.setPosition(this.getModel().getFinalPosition(), false);
+ }
+ else {
+ var xOffset = Math.round((newSize.width - oldSize.width) / 2);
+ var pos = this.getPosition();
+ if ($defined(pos)) {
+ if (pos.x > 0) {
+ pos.x = pos.x + xOffset;
+ } else {
+ pos.x = pos.x - xOffset;
+ }
+ this.setPosition(pos);
+ }
+ }
+ },
+
+ setPosition : function(point, fireEvent) {
+ mindplot.Topic.prototype.setPosition.call(this, point);
+
+ // Update board zero entry position...
+ if (fireEvent != false)
+ mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.NodeMoveEvent, [this]);
+ },
+
+ workoutIncomingConnectionPoint : function(sourcePosition) {
+ $assert(sourcePosition, 'sourcePoint can not be null');
+ var pos = this.getPosition();
+ var size = this.getSize();
+
+ var isAtRight = mindplot.util.Shape.isAtRight(sourcePosition, pos);
+ var result = mindplot.util.Shape.calculateRectConnectionPoint(pos, size, isAtRight);
+ if (this.getShapeType() == mindplot.model.NodeModel.SHAPE_TYPE_LINE) {
+ result.y = result.y + (this.getSize().height / 2);
+ }
+
+ // Move a little the position...
+ var offset = mindplot.Topic.CONNECTOR_WIDTH / 2;
+ if (this.getPosition().x > 0) {
+ result.x = result.x + offset;
+ } else {
+ result.x = result.x - offset;
+ }
+
+ result.x = Math.ceil(result.x);
+ result.y = Math.ceil(result.y);
+ return result;
+
+ },
+
+ workoutOutgoingConnectionPoint : function(targetPosition) {
+ $assert(targetPosition, 'targetPoint can not be null');
+ var pos = this.getPosition();
+ var size = this.getSize();
+
+ var isAtRight = mindplot.util.Shape.isAtRight(targetPosition, pos);
+ var result;
+ if (this.getShapeType() == mindplot.model.NodeModel.SHAPE_TYPE_LINE) {
+// if (!this.isConnectedToCentralTopic())
+// {
+ result = new core.Point();
+ if (!isAtRight) {
+ result.x = pos.x + (size.width / 2);
+ } else {
+ result.x = pos.x - (size.width / 2);
+ }
+ result.y = pos.y + (size.height / 2);
+ /*} else
+ {
+ // In this case, connetion line is not used as shape figure.
+ result = mindplot.util.Shape.calculateRectConnectionPoint(pos, size, isAtRight, true);
+ result.y = pos.y + (size.height / 2);
+ */
+ /*if(result.y>0){
+ result.y+=1;
+ }*/
+ /*
+
+ // Correction factor ...
+ if (!isAtRight)
+ {
+ result.x = result.x + 2;
+ } else
+ {
+ result.x = result.x - 2;
+ }
+
+ }*/
+ } else {
+ result = mindplot.util.Shape.calculateRectConnectionPoint(pos, size, isAtRight, true);
+ }
+ result.x = Math.ceil(result.x);
+ result.y = Math.ceil(result.y);
+ return result;
+ },
+
+
+ isConnectedToCentralTopic : function() {
+ var model = this.getModel();
+ var parent = model.getParent();
+
+ return parent && parent.getType() === mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE;
+ },
+
+ _defaultText : function() {
+ var targetTopic = this.getOutgoingConnectedTopic();
+ var result = "";
+ if ($defined(targetTopic)) {
+ if (targetTopic.getType() == mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ result = "Main Topic";
+ } else {
+ result = "Sub Topic";
+ }
+ } else {
+ result = "Isolated Topic";
+ }
+ return result;
+ },
+
+ _defaultFontStyle : function() {
+ var targetTopic = this.getOutgoingConnectedTopic();
+ var result;
+ if ($defined(targetTopic)) {
+ if (targetTopic.getType() == mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ result = {
+ font:"Arial",
+ size: 8,
+ style:"normal",
+ weight:"normal",
+ color:"#525c61"
+ };
+ } else {
+ result = {
+ font:"Arial",
+ size: 6,
+ style:"normal",
+ weight:"normal",
+ color:"#525c61"
+ };
+ }
+ } else {
+ result = {
+ font:"Verdana",
+ size: 8,
+ style:"normal",
+ weight:"normal",
+ color:"#525c61"
+ };
+ }
+ return result;
+ },
+
+ _defaultBackgroundColor : function() {
+ return "#E0E5EF";
+ },
+
+ _defaultBorderColor : function() {
+ return '#023BB9';
+ },
+ addSibling : function() {
+ var order = this.getOrder();
+ }
+});
+/*
+* Copyright [2011] [wisemapping]
+*
+* Licensed under WiseMapping Public License, Version 1.0 (the "License").
+* It is basically the Apache License, Version 2.0 (the "License") plus the
+* "powered by wisemapping" text requirement on every single page;
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the license at
+*
+* http://www.wisemapping.org/license
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+mindplot.DragTopic = function(dragShape, draggedNode)
+{
+ $assert(dragShape, 'Rect can not be null.');
+ $assert(draggedNode, 'draggedNode can not be null.');
+
+ this._elem2d = dragShape;
+ this._order = null;
+ this._draggedNode = draggedNode;
+ this._position = new core.Point();
+};
+
+mindplot.DragTopic.initialize = function(workspace)
+{
+ var pivot = mindplot.DragTopic.__getDragPivot();
+ workspace.appendChild(pivot);
+};
+
+mindplot.DragTopic.prototype.setOrder = function(order)
+{
+ this._order = order;
+};
+
+mindplot.DragTopic.prototype.setPosition = function(x, y)
+{
+ this._position.setValue(x, y);
+
+ // Elements are positioned in the center.
+ // All topic element must be positioned based on the innerShape.
+ var draggedNode = this._draggedNode;
+ var size = draggedNode.getSize();
+
+ var cx = Math.ceil(x - (size.width / 2));
+ var cy = Math.ceil(y - (size.height / 2));
+
+ // Update visual position.
+ this._elem2d.setPosition(cx, cy);
+};
+
+mindplot.DragTopic.prototype.getInnerShape = function()
+{
+ return this._elem2d;
+};
+
+mindplot.DragTopic.prototype.disconnect = function(workspace)
+{
+ // Clear connection line ...
+ var dragPivot = this._getDragPivot();
+ dragPivot.disconnect(workspace);
+};
+
+mindplot.DragTopic.prototype.canBeConnectedTo = function(targetTopic)
+{
+ $assert(targetTopic, 'parent can not be null');
+
+ var result = true;
+ if (!targetTopic.areChildrenShrinked() && !targetTopic.isCollapsed())
+ {
+ // Dragged node can not be connected to himself.
+ if (targetTopic == this._draggedNode)
+ {
+ result = false;
+ } else
+ {
+ var draggedNode = this.getDraggedTopic();
+ var topicPosition = this.getPosition();
+
+ var targetTopicModel = targetTopic.getModel();
+ var childTopicModel = draggedNode.getModel();
+
+ result = targetTopicModel.canBeConnected(childTopicModel, topicPosition, 18);
+ }
+ } else
+ {
+ result = false;
+ }
+ return result;
+};
+
+mindplot.DragTopic.prototype.connectTo = function(parent)
+{
+ $assert(parent, 'Parent connection node can not be null.');
+
+ var dragPivot = this._getDragPivot();
+ dragPivot.connectTo(parent);
+};
+
+mindplot.DragTopic.prototype.getDraggedTopic = function()
+{
+ return this._draggedNode;
+};
+
+
+mindplot.DragTopic.prototype.removeFromWorkspace = function(workspace)
+{
+ // Remove drag shadow.
+ workspace.removeChild(this._elem2d);
+
+ // Remove pivot shape. To improve performace it will not be removed. Only the visilility will be changed.
+ var dragPivot = this._getDragPivot();
+ dragPivot.setVisibility(false);
+};
+
+mindplot.DragTopic.prototype.addToWorkspace = function(workspace)
+{
+ workspace.appendChild(this._elem2d);
+ var dragPivot = this._getDragPivot();
+
+ dragPivot.addToWorkspace(workspace);
+ dragPivot.setVisibility(true);
+};
+
+mindplot.DragTopic.prototype._getDragPivot = function()
+{
+ return mindplot.DragTopic.__getDragPivot();
+};
+
+mindplot.DragTopic.__getDragPivot = function()
+{
+ var result = mindplot.DragTopic._dragPivot;
+ if (!$defined(result))
+ {
+ result = new mindplot.DragPivot();
+ mindplot.DragTopic._dragPivot = result;
+ }
+ return result;
+};
+
+
+mindplot.DragTopic.prototype.getPosition = function()
+{
+ return this._position;
+};
+
+mindplot.DragTopic.prototype.isDragTopic = function()
+{
+ return true;
+};
+
+mindplot.DragTopic.prototype.updateDraggedTopic = function(workspace)
+{
+ $assert(workspace, 'workspace can not be null');
+
+ var dragPivot = this._getDragPivot();
+ var draggedTopic = this.getDraggedTopic();
+
+ var isDragConnected = this.isConnected();
+ var actionRunner = mindplot.DesignerActionRunner.getInstance();
+ var topicId = draggedTopic.getId();
+ var command = new mindplot.commands.DragTopicCommand(topicId);
+
+ if (isDragConnected)
+ {
+
+ var targetTopic = this.getConnectedToTopic();
+ if (targetTopic.getType() == mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE)
+ {
+ // Update topic position ...
+ var dragPivotPosition = dragPivot.getPosition();
+
+ // Must position the dragged topic taking into account the current node size.
+ var pivotSize = dragPivot.getSize();
+ var draggedTopicSize = draggedTopic.getSize();
+ var xOffset = draggedTopicSize.width - pivotSize.width;
+ xOffset = Math.round(xOffset / 2);
+
+ if (dragPivotPosition.x > 0)
+ {
+ dragPivotPosition.x = parseInt(dragPivotPosition.x) + xOffset;
+ }
+ else
+ {
+ dragPivotPosition.x = parseInt(dragPivotPosition.x) - xOffset;
+ }
+ // Set new position ...
+ command.setPosition(dragPivotPosition);
+
+ } else
+ {
+ // Main topic connections can be positioned only with the order ...
+ command.setOrder(this._order);
+ }
+
+ // Set new parent topic ..
+ command.setParetTopic(targetTopic);
+ } else {
+
+ // If the node is not connected, positionate based on the original drag topic position.
+ var dragPosition = this.getPosition();
+ command = new mindplot.commands.DragTopicCommand(topicId, dragPosition);
+ command.setPosition(dragPosition);
+ }
+ actionRunner.execute(command);
+};
+
+mindplot.DragTopic.prototype.setBoardPosition = function(point)
+{
+ $assert(point, 'point can not be null');
+ var dragPivot = this._getDragPivot();
+ dragPivot.setPosition(point);
+};
+
+
+mindplot.DragTopic.prototype.getBoardPosition = function(point)
+{
+ $assert(point, 'point can not be null');
+ var dragPivot = this._getDragPivot();
+ return dragPivot.getPosition();
+};
+
+mindplot.DragTopic.prototype.getConnectedToTopic = function()
+{
+ var dragPivot = this._getDragPivot();
+ return dragPivot.getTargetTopic();
+};
+
+mindplot.DragTopic.prototype.isConnected = function()
+{
+ return this.getConnectedToTopic() != null;
+};
+
+mindplot.DragTopic.PIVOT_SIZE = {width:50,height:10};
+/*
+* Copyright [2011] [wisemapping]
+*
+* Licensed under WiseMapping Public License, Version 1.0 (the "License").
+* It is basically the Apache License, Version 2.0 (the "License") plus the
+* "powered by wisemapping" text requirement on every single page;
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the license at
+*
+* http://www.wisemapping.org/license
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+ */
+
+mindplot.DragManager = function(workspace)
+{
+ this._workspace = workspace;
+ this._listeners = {};
+};
+
+mindplot.DragManager.prototype.add = function(node)
+{
+ // Add behaviour ...
+ var workspace = this._workspace;
+ var screen = workspace.getScreenManager();
+ var dragManager = this;
+
+ var mouseDownListener = function(event)
+ {
+ if (workspace.isWorkspaceEventsEnabled())
+ {
+ // Disable double drag...
+ workspace.enableWorkspaceEvents(false);
+
+ // Set initial position.
+ var dragNode = node.createDragNode();
+ var mousePos = screen.getWorkspaceMousePosition(event);
+ dragNode.setPosition(mousePos.x, mousePos.y);
+
+ // Register mouse move listener ...
+ var mouseMoveListener = dragManager._buildMouseMoveListener(workspace, dragNode, dragManager);
+ screen.addEventListener('mousemove', mouseMoveListener);
+
+ // Register mouse up listeners ...
+ var mouseUpListener = dragManager._buildMouseUpListener(workspace, node, dragNode, dragManager);
+ screen.addEventListener('mouseup', mouseUpListener);
+
+ // Execute Listeners ..
+ var startDragListener = dragManager._listeners['startdragging'];
+ startDragListener(event, node);
+
+ // Change cursor.
+ window.document.body.style.cursor = 'move';
+ }
+ };
+ dragManager._mouseDownListener = mouseDownListener;
+
+ node.addEventListener('mousedown', mouseDownListener);
+};
+
+mindplot.DragManager.prototype.remove = function(node)
+{
+ var nodes = this._topics;
+ var contained = false;
+ var index = -1;
+ for (var i = 0; i < nodes.length; i++) {
+ if (nodes[i] == node) {
+ contained = true;
+ index = i;
+ }
+ }
+ if (contained)
+ {
+ elem = new Array();
+ }
+};
+
+mindplot.DragManager.prototype._buildMouseMoveListener = function(workspace, dragNode, dragManager)
+{
+ var screen = workspace.getScreenManager();
+ var result = function(event) {
+
+ if (!dragNode._isInTheWorkspace)
+ {
+ // Add shadow node to the workspace.
+ workspace.appendChild(dragNode);
+ dragNode._isInTheWorkspace = true;
+ }
+
+ var pos = screen.getWorkspaceMousePosition(event);
+ dragNode.setPosition(pos.x, pos.y);
+
+ // Call mouse move listeners ...
+ var dragListener = dragManager._listeners['dragging'];
+ if ($defined(dragListener))
+ {
+ dragListener(event, dragNode);
+ }
+
+ event.preventDefault();
+ }.bindWithEvent(this);
+ dragManager._mouseMoveListener = result;
+ return result;
+};
+
+mindplot.DragManager.prototype._buildMouseUpListener = function(workspace, node, dragNode, dragManager)
+{
+ var screen = workspace.getScreenManager();
+ var result = function(event) {
+
+ $assert(dragNode.isDragTopic, 'dragNode must be an DragTopic');
+
+ // Remove drag node from the workspace.
+ var hasBeenDragged = dragNode._isInTheWorkspace;
+ if (dragNode._isInTheWorkspace)
+ {
+ dragNode.removeFromWorkspace(workspace);
+ }
+
+ // Remove all the events.
+ screen.removeEventListener('mousemove', dragManager._mouseMoveListener);
+ screen.removeEventListener('mouseup', dragManager._mouseUpListener);
+
+ // Help GC
+ dragManager._mouseMoveListener = null;
+ dragManager._mouseUpListener = null;
+
+ // Execute Listeners only if the node has been moved.
+ var endDragListener = dragManager._listeners['enddragging'];
+ endDragListener(event, dragNode);
+
+ if (hasBeenDragged)
+ {
+ dragNode._isInTheWorkspace = false;
+ }
+
+ // Change the cursor to the default.
+ window.document.body.style.cursor = 'default';
+
+ workspace.enableWorkspaceEvents(true);
+
+ };
+ dragManager._mouseUpListener = result;
+ return result;
+};
+
+/**
+ * type:
+ * - startdragging.
+ * - dragging
+ * - enddragging
+ */
+mindplot.DragManager.prototype. addEventListener = function(type, listener)
+{
+ this._listeners[type] = listener;
+};
+
+mindplot.DragManager.DRAG_PRECISION_IN_SEG = 100;
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.DragPivot = new Class({
+ initialize:function() {
+ this._position = new core.Point();
+ this._size = mindplot.DragTopic.PIVOT_SIZE;
+ this._line = null;
+
+ this._straightLine = this._buildStraightLine();
+ this._curvedLine = this._buildCurvedLine();
+ this._dragPivot = this._buildRect();
+ this._connectRect = this._buildRect();
+ this._targetTopic = null;
+ },
+
+ getTargetTopic : function() {
+ return this._targetTopic;
+ },
+
+ _buildStraightLine : function() {
+ var line = new web2d.CurvedLine();
+ line.setStyle(web2d.CurvedLine.SIMPLE_LINE);
+ line.setStroke(1, 'solid', '#CC0033');
+ line.setOpacity(0.4);
+ line.setVisibility(false);
+ return line;
+ },
+
+ _buildCurvedLine : function() {
+ var line = new web2d.CurvedLine();
+ line.setStyle(web2d.CurvedLine.SIMPLE_LINE);
+ line.setStroke(1, 'solid', '#CC0033');
+ line.setOpacity(0.4);
+ line.setVisibility(false);
+ return line;
+ },
+
+ _redraw : function(pivotPosition) {
+ // Update line position.
+ $assert(this.getTargetTopic(), 'Illegal invocation. Target node can not be null');
+
+ var pivotRect = this._getPivotRect();
+ var currentPivotPosition = pivotRect.getPosition();
+
+ // Pivot position has not changed. In this case, position change is not required.
+ var targetTopic = this.getTargetTopic();
+ if (currentPivotPosition.x != pivotPosition.x || currentPivotPosition.y != pivotPosition.y) {
+ var position = this._position;
+ var fromPoint = targetTopic.workoutIncomingConnectionPoint(position);
+
+ // Calculate pivot connection point ...
+ var size = this._size;
+ var targetPosition = targetTopic.getPosition();
+ var line = this._line;
+
+ // Update Line position.
+ var isAtRight = mindplot.util.Shape.isAtRight(targetPosition, position);
+ var pivotPoint = mindplot.util.Shape.calculateRectConnectionPoint(position, size, isAtRight);
+ line.setFrom(pivotPoint.x, pivotPoint.y);
+
+ // Update rect position
+ pivotRect.setPosition(pivotPosition.x, pivotPosition.y);
+
+ // Display elements if it's required...
+ if (!pivotRect.isVisible()) {
+ // Make line visible only when the position has been already changed.
+ // This solve several strange effects ;)
+ var targetPoint = targetTopic.workoutIncomingConnectionPoint(pivotPoint);
+ line.setTo(targetPoint.x, targetPoint.y);
+
+ this.setVisibility(true);
+ }
+ }
+ },
+
+ setPosition : function(point) {
+ this._position = point;
+
+ // Update visual position.
+ var size = this.getSize();
+
+ var cx = point.x - (parseInt(size.width) / 2);
+ var cy = point.y - (parseInt(size.height) / 2);
+
+ // Update line ...
+ if (this.getTargetTopic()) {
+ var pivotPosition = {x:cx,y:cy};
+ this._redraw(pivotPosition);
+ }
+ },
+
+ getPosition : function() {
+ return this._position;
+ },
+
+ _buildRect : function() {
+ var size = this._size;
+ var rectAttributes = {fillColor:'#CC0033',opacity:0.4,width:size.width,height:size.height,strokeColor:'#FF9933'};
+ var rect = new web2d.Rect(0, rectAttributes);
+ rect.setVisibility(false);
+ return rect;
+ },
+
+ _buildConnectRect : function() {
+ var size = this._size;
+ var rectAttributes = {fillColor:'#CC0033',opacity:0.4,width:size.width,height:size.height,strokeColor:'#FF9933'};
+ var result = new web2d.Rect(0, rectAttributes);
+ return result;
+ },
+
+ _getPivotRect : function() {
+ return this._dragPivot;
+ },
+
+ getSize : function() {
+ var elem2d = this._getPivotRect();
+ return elem2d.getSize();
+ },
+
+ setVisibility : function(value) {
+ var pivotRect = this._getPivotRect();
+ pivotRect.setVisibility(value);
+
+ var connectRect = this._connectRect;
+ connectRect.setVisibility(value);
+ if ($defined(this._line)) {
+ this._line.setVisibility(value);
+ }
+ },
+
+ addToWorkspace : function(workspace) {
+ var pivotRect = this._getPivotRect();
+ workspace.appendChild(pivotRect);
+
+ var connectToRect = this._connectRect;
+ workspace.appendChild(connectToRect);
+
+ // Add a hidden straight line ...
+ var straighLine = this._straightLine;
+ straighLine.setVisibility(false);
+ workspace.appendChild(straighLine);
+ straighLine.moveToBack();
+
+ // Add a hidden curved line ...
+ var curvedLine = this._curvedLine;
+ curvedLine.setVisibility(false);
+ workspace.appendChild(curvedLine);
+ curvedLine.moveToBack();
+
+ // Add a connect rect ...
+ var connectRect = this._connectRect;
+ connectRect.setVisibility(false);
+ workspace.appendChild(connectRect);
+ connectRect.moveToBack();
+ },
+
+ removeFromWorkspace : function(workspace) {
+ var shape = this._getPivotRect();
+ workspace.removeChild(shape);
+
+ var connectToRect = this._connectRect;
+ workspace.removeChild(connectToRect);
+
+ if ($defined(this._straightLine)) {
+ workspace.removeChild(this._straightLine);
+ }
+
+ if ($defined(this._curvedLine)) {
+ workspace.removeChild(this._curvedLine);
+ }
+ },
+
+ connectTo : function(targetTopic) {
+ $assert(!this._outgoingLine, 'Could not connect an already connected node');
+ $assert(targetTopic != this, 'Cilcular connection are not allowed');
+ $assert(targetTopic, 'parent can not be null');
+
+ this._targetTopic = targetTopic;
+ if (targetTopic.getType() == mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ this._line = this._straightLine;
+ } else {
+ this._line = this._curvedLine;
+ }
+
+ // Connected to Rect ...
+ var connectRect = this._connectRect;
+ var targetSize = targetTopic.getSize();
+ var width = targetSize.width;
+ var height = targetSize.height;
+ connectRect.setSize(width, height);
+
+ var targetPosition = targetTopic.getPosition();
+ var cx = Math.ceil(targetPosition.x - (width / 2));
+ var cy = Math.ceil(targetPosition.y - (height / 2));
+ connectRect.setPosition(cx, cy);
+
+ // Change elements position ...
+ var pivotRect = this._getPivotRect();
+ pivotRect.moveToFront();
+
+ },
+
+ disconnect : function(workspace) {
+ $assert(workspace, 'workspace can not be null.');
+ $assert(this._targetTopic, 'There are not connected topic.');
+
+ this.setVisibility(false);
+ this._targetTopic = null;
+ this._line = null;
+ }
+});
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.Board = new Class({
+ initialize : function(defaultHeight, referencePoint) {
+ $assert(referencePoint, "referencePoint can not be null");
+ this._defaultWidth = defaultHeight;
+ this._entries = new mindplot.BidirectionalArray();
+ this._referencePoint = referencePoint;
+ },
+
+ getReferencePoint : function() {
+ return this._referencePoint;
+ },
+
+ _removeEntryByOrder : function(order, position) {
+ var board = this._getBoard(position);
+ var entry = board.lookupEntryByOrder(order);
+
+ $assert(!entry.isAvailable(), 'Entry must not be available in order to be removed.Entry Order:' + order);
+ entry.removeTopic();
+ board.update(entry);
+ },
+
+ removeTopicFromBoard : function(topic) {
+ var position = topic.getPosition();
+ var order = topic.getOrder();
+
+ this._removeEntryByOrder(order, position);
+ topic.setOrder(null);
+ },
+
+ positionateDragTopic :function(dragTopic) {
+ throw "this method must be overrided";
+ },
+
+ getHeight: function() {
+ var board = this._getBoard();
+ return board.getHeight();
+ }
+});
+
+/**
+ * ---------------------------------------
+ */
+mindplot.BidirectionalArray = new Class({
+
+ initialize: function() {
+ this._leftElem = [];
+ this._rightElem = [];
+ },
+
+ get :function(index, sign) {
+ $assert(index, 'Illegal argument, index must be passed.');
+ if ($defined(sign)) {
+ $assert(index >= 0, 'Illegal absIndex value');
+ index = index * sign;
+ }
+
+ var result = null;
+ if (index >= 0 && index < this._rightElem.length) {
+ result = this._rightElem[index];
+ } else if (index < 0 && Math.abs(index) < this._leftElem.length) {
+ result = this._leftElem[Math.abs(index)];
+ }
+ return result;
+ },
+
+ set : function(index, elem) {
+ $assert(index, 'Illegal index value');
+
+ var array = (index >= 0) ? this._rightElem : this._leftElem;
+ array[Math.abs(index)] = elem;
+ },
+
+ length : function(index) {
+ $assert(index, 'Illegal index value');
+ return (index >= 0) ? this._rightElem.length : this._leftElem.length;
+ },
+
+ upperLength : function() {
+ return this.length(1);
+ },
+
+ lowerLength : function() {
+ return this.length(-1);
+ },
+
+ inspect : function() {
+ var result = '{';
+ var lenght = this._leftElem.length;
+ for (var i = 0; i < lenght; i++) {
+ var entry = this._leftElem[lenght - i - 1];
+ if (entry != null) {
+ if (i != 0) {
+ result += ', ';
+ }
+ result += entry.inspect();
+ }
+ }
+
+ lenght = this._rightElem.length;
+ for (var i = 0; i < lenght; i++) {
+ var entry = this._rightElem[i];
+ if (entry != null) {
+ if (i != 0) {
+ result += ', ';
+ }
+ result += entry.inspect();
+ }
+ }
+ result += '}';
+
+ return result;
+
+ }
+});/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.CentralTopicBoard = new Class({
+ Extends: mindplot.Board,
+ initialize:function(centralTopic, layoutManager) {
+ var point = new core.Point(0, 0);
+ this._layoutManager = layoutManager;
+ this._rightBoard = new mindplot.VariableDistanceBoard(50, point);
+ this._leftBoard = new mindplot.VariableDistanceBoard(50, point);
+ this._centralTopic = centralTopic;
+ },
+
+ _getBoard : function(position) {
+ return (position.x >= 0) ? this._rightBoard : this._leftBoard;
+ },
+
+ positionateDragTopic : function(dragTopic) {
+ $assert(dragTopic != null, 'dragTopic can not be null');
+ $assert(dragTopic.isDragTopic, 'dragTopic must be DragTopic instance');
+
+ // This node is a main topic node. Position
+ var dragPos = dragTopic.getPosition();
+ var board = this._getBoard(dragPos);
+
+ // Look for entry ...
+ var entry = board.lookupEntryByPosition(dragPos);
+
+ // Calculate 'y' position base on the entry ...
+ var yCoord;
+ if (!entry.isAvailable() && entry.getTopic() != dragTopic.getDraggedTopic()) {
+ yCoord = entry.getLowerLimit();
+ } else {
+ yCoord = entry.workoutEntryYCenter();
+ }
+
+
+ // MainTopic can not be positioned over the drag topic ...
+ var centralTopic = this._centralTopic;
+ var centralTopicSize = centralTopic.getSize();
+ var halfWidth = (centralTopicSize.width / 2);
+ if (Math.abs(dragPos.x) < halfWidth + 60) {
+ var distance = halfWidth + 60;
+ dragPos.x = (dragPos.x > 0) ? distance : -distance;
+ }
+
+ // Update board position.
+ var pivotPos = new core.Point(dragPos.x, yCoord);
+ dragTopic.setBoardPosition(pivotPos);
+ },
+
+
+ addBranch : function(topic) {
+ // Update topic position ...
+ var position = topic.getPosition();
+
+ var order = topic.getOrder();
+ var board = this._getBoard(position);
+ var entry = null;
+ if (order != null) {
+ entry = board.lookupEntryByOrder(order);
+ } else {
+ entry = board.lookupEntryByPosition(position);
+ }
+
+ // If the entry is not available, I must swap the the entries...
+ if (!entry.isAvailable()) {
+ board.freeEntry(entry);
+ }
+
+ // Add it to the board ...
+ entry.setTopic(topic);
+ board.update(entry);
+ },
+
+ updateChildrenPosition : function(topic, xOffset, modifiedTopics) {
+ var board = this._rightBoard;
+ var oldReferencePosition = board.getReferencePoint();
+ var newReferencePosition = new core.Point(oldReferencePosition.x + xOffset, oldReferencePosition.y);
+ board.updateReferencePoint(newReferencePosition);
+
+ board = this._leftBoard;
+ oldReferencePosition = board.getReferencePoint();
+ newReferencePosition = new core.Point(oldReferencePosition.x - xOffset, oldReferencePosition.y);
+ board.updateReferencePoint(newReferencePosition);
+ },
+
+ repositionate : function() {
+ //@todo: implement ..
+ }
+});/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.MainTopicBoard = new Class({
+ Extends:mindplot.Board,
+ initialize:function(topic, layoutManager) {
+ this._layoutManager = layoutManager;
+ this._topic = topic;
+ this._board = null;
+ this._height = 0;
+ },
+
+
+ _getBoard: function() {
+ if (!$defined(this._board)) {
+ var topic = this._topic;
+ this._board = new mindplot.FixedDistanceBoard(mindplot.MainTopicBoard.DEFAULT_MAIN_TOPIC_HEIGHT, topic, this._layoutManager);
+ }
+ return this._board;
+ },
+
+ updateReferencePoint : function(position) {
+ this._board.updateReferencePoint(position);
+ },
+
+ updateChildrenPosition : function(topic) {
+ var board = this._getBoard();
+ board.updateReferencePoint();
+ },
+
+ positionateDragTopic : function(dragTopic) {
+ $assert(dragTopic != null, 'dragTopic can not be null');
+ $assert(dragTopic.isDragTopic, 'dragTopic must be DragTopic instance');
+
+ // This node is a main topic node. Position
+ var dragPos = dragTopic.getPosition();
+ var board = this._getBoard();
+
+ // Look for entry ...
+ var entry = board.lookupEntryByPosition(dragPos);
+
+ // Calculate 'y' position base on the entry ...
+ var yCoord;
+ if (!entry.isAvailable() && entry.getTopic() != dragTopic.getDraggedTopic()) {
+ yCoord = entry.getLowerLimit();
+ } else {
+ yCoord = entry.workoutEntryYCenter();
+ }
+
+ // Update board position.
+ var targetTopic = dragTopic.getConnectedToTopic();
+ var xCoord = this._workoutXBorderDistance(targetTopic);
+
+ // Add the size of the pivot to the distance ...
+ var halfPivotWidth = mindplot.DragTopic.PIVOT_SIZE.width / 2;
+ xCoord = xCoord + ((dragPos.x > 0) ? halfPivotWidth : -halfPivotWidth);
+
+ var pivotPos = new core.Point(xCoord, yCoord);
+ dragTopic.setBoardPosition(pivotPos);
+
+ var order = entry.getOrder();
+ dragTopic.setOrder(order);
+ }
+ ,
+
+ /**
+ * This x distance doesn't take into account the size of the shape.
+ */
+ _workoutXBorderDistance : function(topic) {
+ $assert(topic, 'topic can not be null');
+ var board = this._getBoard();
+ return board.workoutXBorderDistance(topic);
+ },
+
+ addBranch : function(topic) {
+ var order = topic.getOrder();
+ $assert(order, "Order must be defined");
+
+ // If the entry is not available, I must swap the the entries...
+ var board = this._getBoard();
+ var entry = board.lookupEntryByOrder(order);
+ if (!entry.isAvailable()) {
+ board.freeEntry(entry);
+ }
+
+ // Add the topic to the board ...
+ board.addTopic(order, topic);
+
+ // Repositionate all the parent topics ...
+ var currentTopic = this._topic;
+ if (currentTopic.getOutgoingConnectedTopic()) {
+ var parentTopic = currentTopic.getOutgoingConnectedTopic();
+ mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.NodeRepositionateEvent, [parentTopic]);
+ }
+ },
+
+ repositionate : function() {
+ var board = this._getBoard();
+ board.repositionate();
+ },
+
+ removeTopicFromBoard : function(topic) {
+ var board = this._getBoard();
+ board.removeTopic(topic);
+
+ // Repositionate all the parent topics ...
+ var parentTopic = this._topic;
+ if (parentTopic.getOutgoingConnectedTopic()) {
+ var connectedTopic = parentTopic.getOutgoingConnectedTopic();
+ mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.NodeRepositionateEvent, [connectedTopic]);
+ }
+ }
+});
+
+mindplot.MainTopicBoard.DEFAULT_MAIN_TOPIC_HEIGHT = 18;
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.ConnectionLine = new Class({
+ initialize:function(sourceNode, targetNode, lineType) {
+ $assert(targetNode, 'parentNode node can not be null');
+ $assert(sourceNode, 'childNode node can not be null');
+ $assert(sourceNode != targetNode, 'Cilcular connection');
+
+ this._targetTopic = targetNode;
+ this._sourceTopic = sourceNode;
+
+ var strokeColor = mindplot.ConnectionLine.getStrokeColor();
+ var line;
+ if (targetNode.getType() == mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ line = this._createLine(lineType, mindplot.ConnectionLine.CURVED);
+ // line = new web2d.Line();
+ if (line.getType() == "CurvedLine") {
+ var ctrlPoints = this._getCtrlPoints(sourceNode, targetNode);
+ line.setSrcControlPoint(ctrlPoints[0]);
+ line.setDestControlPoint(ctrlPoints[1]);
+ }
+ line.setStroke(1, 'solid', strokeColor);
+ } else {
+ line = this._createLine(lineType, mindplot.ConnectionLine.SIMPLE_CURVED);
+ if (line.getType() == "CurvedLine") {
+ var ctrlPoints = this._getCtrlPoints(sourceNode, targetNode);
+ line.setSrcControlPoint(ctrlPoints[0]);
+ line.setDestControlPoint(ctrlPoints[1]);
+ }
+ // line = new web2d.PolyLine();
+ line.setStroke(1, 'solid', strokeColor);
+ }
+
+ this._line2d = line;
+ },
+
+ _getCtrlPoints : function(sourceNode, targetNode) {
+ var srcPos = sourceNode.workoutOutgoingConnectionPoint(targetNode.getPosition());
+ var destPos = targetNode.workoutIncomingConnectionPoint(sourceNode.getPosition());
+ var deltaX = (srcPos.x - destPos.x) / 3;
+ return [new core.Point(deltaX, 0), new core.Point(-deltaX, 0)];
+ },
+
+ _createLine : function(lineType, defaultStyle) {
+ if (!$defined(lineType)) {
+ lineType = defaultStyle;
+ }
+ lineType = parseInt(lineType);
+ this._lineType = lineType;
+ var line = null;
+ switch (lineType) {
+ case mindplot.ConnectionLine.POLYLINE:
+ line = new web2d.PolyLine();
+ break;
+ case mindplot.ConnectionLine.CURVED:
+ line = new web2d.CurvedLine();
+ break;
+ case mindplot.ConnectionLine.SIMPLE_CURVED:
+ line = new web2d.CurvedLine();
+ line.setStyle(web2d.CurvedLine.SIMPLE_LINE);
+ break;
+ default:
+ line = new web2d.Line();
+ break;
+ }
+ return line;
+ },
+
+ setVisibility : function(value) {
+ this._line2d.setVisibility(value);
+ },
+
+ isVisible : function() {
+ return this._line2d.isVisible();
+ },
+
+ setOpacity : function(opacity) {
+ this._line2d.setOpacity(opacity);
+ },
+
+ redraw : function() {
+ var line2d = this._line2d;
+ var sourceTopic = this._sourceTopic;
+ var sourcePosition = sourceTopic.getPosition();
+
+ var targetTopic = this._targetTopic;
+ var targetPosition = targetTopic.getPosition();
+
+ var sPos,tPos;
+ sPos = sourceTopic.workoutOutgoingConnectionPoint(targetPosition, false);
+ tPos = targetTopic.workoutIncomingConnectionPoint(sourcePosition, false);
+
+ line2d.setFrom(tPos.x, tPos.y);
+ line2d.setTo(sPos.x, sPos.y);
+
+ if (line2d.getType() == "CurvedLine") {
+ var ctrlPoints = this._getCtrlPoints(this._sourceTopic, this._targetTopic);
+ line2d.setSrcControlPoint(ctrlPoints[0]);
+ line2d.setDestControlPoint(ctrlPoints[1]);
+ }
+// line2d.moveToBack();
+
+ // Add connector ...
+ this._positionateConnector(targetTopic);
+
+ },
+
+ _positionateConnector : function(targetTopic) {
+ var targetPosition = targetTopic.getPosition();
+ var offset = mindplot.Topic.CONNECTOR_WIDTH / 2;
+ var targetTopicSize = targetTopic.getSize();
+ var y;
+ if (targetTopic.getShapeType() == mindplot.model.NodeModel.SHAPE_TYPE_LINE) {
+ y = targetTopicSize.height;
+ } else {
+ y = targetTopicSize.height / 2;
+ }
+ y = y - offset;
+
+ var connector = targetTopic.getShrinkConnector();
+ if (Math.sign(targetPosition.x) > 0) {
+ var x = targetTopicSize.width;
+ connector.setPosition(x, y);
+ }
+ else {
+ var x = -mindplot.Topic.CONNECTOR_WIDTH;
+ connector.setPosition(x, y);
+ }
+ },
+
+ setStroke : function(color, style, opacity) {
+ var line2d = this._line2d;
+ this._line2d.setStroke(null, null, color, opacity);
+ },
+
+ addToWorkspace : function(workspace) {
+ workspace.appendChild(this._line2d);
+ this._line2d.moveToBack();
+ },
+
+ removeFromWorkspace : function(workspace) {
+ workspace.removeChild(this._line2d);
+ },
+
+ getTargetTopic : function() {
+ return this._targetTopic;
+ },
+
+ getSourceTopic : function() {
+ return this._sourceTopic;
+ },
+
+ getLineType : function() {
+ return this._lineType;
+ },
+
+ getLine : function() {
+ return this._line2d;
+ },
+
+ getModel : function() {
+ return this._model;
+ },
+
+ setModel : function(model) {
+ this._model = model;
+ },
+
+ getType : function() {
+ return "ConnectionLine";
+ },
+
+ getId : function() {
+ return this._model.getId();
+ },
+
+ moveToBack : function() {
+ this._line2d.moveToBack();
+ },
+
+ moveToFront : function() {
+ this._line2d.moveToFront();
+ }
+});
+
+mindplot.ConnectionLine.getStrokeColor = function() {
+ return '#495879';
+};
+
+mindplot.ConnectionLine.SIMPLE = 0;
+mindplot.ConnectionLine.POLYLINE = 1;
+mindplot.ConnectionLine.CURVED = 2;
+mindplot.ConnectionLine.SIMPLE_CURVED = 3;/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+mindplot.RelationshipLine = new Class({
+ Extends: mindplot.ConnectionLine,
+ initialize:function(sourceNode, targetNode, lineType) {
+ this.parent(sourceNode, targetNode, lineType);
+
+ this._line2d.setIsSrcControlPointCustom(false);
+ this._line2d.setIsDestControlPointCustom(false);
+ this._isOnfocus = false;
+ this._focusShape = this._createLine(this.getLineType(), mindplot.ConnectionLine.SIMPLE_CURVED);
+ this._focusShape.setStroke(2, "solid", "#3f96ff");
+ var ctrlPoints = this._line2d.getControlPoints();
+ this._focusShape.setSrcControlPoint(ctrlPoints[0]);
+ this._focusShape.setDestControlPoint(ctrlPoints[1]);
+ this._focusShape.setVisibility(false);
+ this._onFocus = false;
+ this._isInWorkspace = false;
+ this._controlPointsController = new mindplot.ControlPoint();
+
+ var strokeColor = mindplot.RelationshipLine.getStrokeColor();
+ this._startArrow = new web2d.Arrow();
+ this._endArrow = new web2d.Arrow();
+ this._startArrow.setStrokeColor(strokeColor);
+ this._startArrow.setStrokeWidth(2);
+ this._endArrow.setStrokeColor(strokeColor);
+ this._endArrow.setStrokeWidth(2);
+ this._line2d.setStroke(1, 'solid', strokeColor);
+
+ },
+
+ setStroke : function(color, style, opacity) {
+ // @Todo: How this is supported in mootools ?
+ mindplot.ConnectionLine.prototype.setStroke.call(this, color, style, opacity);
+ this._startArrow.setStrokeColor(color);
+ },
+
+ redraw : function() {
+ var line2d = this._line2d;
+ var sourceTopic = this._sourceTopic;
+ var sourcePosition = sourceTopic.getPosition();
+
+ var targetTopic = this._targetTopic;
+ var targetPosition = targetTopic.getPosition();
+
+ var sPos,tPos;
+ this._line2d.setStroke(2);
+ var ctrlPoints = this._line2d.getControlPoints();
+ if (!this._line2d.isDestControlPointCustom() && !this._line2d.isSrcControlPointCustom()) {
+ var defaultPoints = core.Utils.calculateDefaultControlPoints(sourcePosition, targetPosition);
+ ctrlPoints[0].x = defaultPoints[0].x;
+ ctrlPoints[0].y = defaultPoints[0].y;
+ ctrlPoints[1].x = defaultPoints[1].x;
+ ctrlPoints[1].y = defaultPoints[1].y;
+ }
+ var spoint = new core.Point();
+ spoint.x = parseInt(ctrlPoints[0].x) + parseInt(sourcePosition.x);
+ spoint.y = parseInt(ctrlPoints[0].y) + parseInt(sourcePosition.y);
+ var tpoint = new core.Point();
+ tpoint.x = parseInt(ctrlPoints[1].x) + parseInt(targetPosition.x);
+ tpoint.y = parseInt(ctrlPoints[1].y) + parseInt(targetPosition.y);
+ sPos = core.Utils.calculateRelationShipPointCoordinates(sourceTopic, spoint);
+ tPos = core.Utils.calculateRelationShipPointCoordinates(targetTopic, tpoint);
+
+ line2d.setFrom(sPos.x, sPos.y);
+ line2d.setTo(tPos.x, tPos.y);
+
+ line2d.moveToFront();
+
+ //Positionate Arrows
+ this._positionateArrows();
+
+ // Add connector ...
+ this._positionateConnector(targetTopic);
+
+ if (this.isOnFocus()) {
+ this._refreshSelectedShape();
+ }
+ this._focusShape.moveToBack();
+ this._controlPointsController.redraw();
+ },
+
+ _positionateArrows : function() {
+ this._endArrow.setVisibility(this.isVisible() && this._showEndArrow);
+ this._startArrow.setVisibility(this.isVisible() && this._showStartArrow);
+
+ var tpos = this._line2d.getTo();
+ this._endArrow.setFrom(tpos.x, tpos.y);
+ var spos = this._line2d.getFrom();
+ this._startArrow.setFrom(spos.x, spos.y);
+ this._endArrow.moveToBack();
+ this._startArrow.moveToBack();
+
+ if (this._line2d.getType() == "CurvedLine") {
+ var controlPoints = this._line2d.getControlPoints();
+ this._startArrow.setControlPoint(controlPoints[0]);
+ this._endArrow.setControlPoint(controlPoints[1]);
+ } else {
+ this._startArrow.setControlPoint(this._line2d.getTo());
+ this._endArrow.setControlPoint(this._line2d.getFrom());
+ }
+ },
+
+ addToWorkspace : function(workspace) {
+ workspace.appendChild(this._focusShape);
+ workspace.appendChild(this._controlPointsController);
+ this._controlPointControllerListener = this._initializeControlPointController.bindWithEvent(this, workspace);
+ this._line2d.addEventListener('click', this._controlPointControllerListener);
+ this._isInWorkspace = true;
+
+ workspace.appendChild(this._startArrow);
+ workspace.appendChild(this._endArrow);
+
+ mindplot.ConnectionLine.prototype.addToWorkspace.call(this, workspace);
+ },
+
+ _initializeControlPointController : function(event, workspace) {
+ this.setOnFocus(true);
+ },
+
+ removeFromWorkspace : function(workspace) {
+ workspace.removeChild(this._focusShape);
+ workspace.removeChild(this._controlPointsController);
+ this._line2d.removeEventListener('click', this._controlPointControllerListener);
+ this._isInWorkspace = false;
+ workspace.removeChild(this._startArrow);
+ workspace.removeChild(this._endArrow);
+
+ mindplot.ConnectionLine.prototype.removeFromWorkspace.call(this, workspace);
+ },
+
+ getType : function() {
+ return mindplot.RelationshipLine.type;
+ },
+
+ setOnFocus : function(focus) {
+ // Change focus shape
+ if (focus) {
+ this._refreshSelectedShape();
+ this._controlPointsController.setLine(this);
+ }
+ this._focusShape.setVisibility(focus);
+
+ this._controlPointsController.setVisibility(focus);
+ this._onFocus = focus;
+ },
+
+ _refreshSelectedShape : function () {
+ var sPos = this._line2d.getFrom();
+ var tPos = this._line2d.getTo();
+ var ctrlPoints = this._line2d.getControlPoints();
+ this._focusShape.setFrom(sPos.x, sPos.y);
+ this._focusShape.setTo(tPos.x, tPos.y);
+ var shapeCtrlPoints = this._focusShape.getControlPoints();
+ shapeCtrlPoints[0].x = ctrlPoints[0].x;
+ shapeCtrlPoints[0].y = ctrlPoints[0].y;
+ shapeCtrlPoints[1].x = ctrlPoints[1].x;
+ shapeCtrlPoints[1].y = ctrlPoints[1].y;
+ this._focusShape.updateLine();
+ //this._focusShape.setSrcControlPoint(ctrlPoints[0]);
+ //this._focusShape.setDestControlPoint(ctrlPoints[1]);
+ },
+
+ addEventListener : function(type, listener) {
+ // Translate to web 2d events ...
+ if (type == 'onfocus') {
+ type = 'mousedown';
+ }
+
+ var line = this._line2d;
+ line.addEventListener(type, listener);
+ },
+
+ isOnFocus : function() {
+ return this._onFocus;
+ },
+
+ isInWorkspace : function() {
+ return this._isInWorkspace;
+ },
+
+ setVisibility : function(value) {
+ mindplot.ConnectionLine.prototype.setVisibility.call(this, value);
+ this._endArrow.setVisibility(this._showEndArrow && value);
+ this._startArrow.setVisibility(this._showStartArrow && value);
+ },
+
+ setOpacity : function(opacity) {
+ mindplot.ConnectionLine.prototype.setOpacity.call(this, opacity);
+ if (this._showEndArrow)
+ this._endArrow.setOpacity(opacity);
+ if (this._showStartArrow)
+ this._startArrow.setOpacity(opacity);
+ },
+
+ setShowEndArrow : function(visible) {
+ this._showEndArrow = visible;
+ if (this._isInWorkspace)
+ this.redraw();
+ },
+
+ setShowStartArrow : function(visible) {
+ this._showStartArrow = visible;
+ if (this._isInWorkspace)
+ this.redraw();
+ },
+
+ isShowEndArrow : function() {
+ return this._showEndArrow;
+ },
+
+ isShowStartArrow : function() {
+ return this._showStartArrow;
+ },
+
+ setFrom : function(x, y) {
+ this._line2d.setFrom(x, y);
+ this._startArrow.setFrom(x, y);
+ },
+
+ setTo : function(x, y) {
+ this._line2d.setTo(x, y);
+ this._endArrow.setFrom(x, y);
+ },
+
+ setSrcControlPoint : function(control) {
+ this._line2d.setSrcControlPoint(control);
+ this._startArrow.setControlPoint(control);
+ },
+
+ setDestControlPoint : function(control) {
+ this._line2d.setDestControlPoint(control);
+ this._endArrow.setControlPoint(control);
+ },
+
+ getControlPoints : function() {
+ return this._line2d.getControlPoints();
+ },
+
+ isSrcControlPointCustom : function() {
+ return this._line2d.isSrcControlPointCustom();
+ },
+
+ isDestControlPointCustom : function() {
+ return this._line2d.isDestControlPointCustom();
+ },
+
+ setIsSrcControlPointCustom : function(isCustom) {
+ this._line2d.setIsSrcControlPointCustom(isCustom);
+ },
+
+ setIsDestControlPointCustom : function(isCustom) {
+ this._line2d.setIsDestControlPointCustom(isCustom);
+ }});
+
+
+mindplot.RelationshipLine.type = "RelationshipLine";
+mindplot.RelationshipLine.getStrokeColor = function() {
+ return '#9b74e6';
+}
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.DragTopicPositioner = new Class({
+ initialize:function(layoutManager) {
+ $assert(layoutManager, 'layoutManager can not be null');
+ this._layoutManager = layoutManager;
+ this._topics = layoutManager.getDesigner()._getTopics();
+ this._workspace = layoutManager.getDesigner().getWorkSpace();
+ },
+
+ positionateDragTopic : function(dragTopic) {
+ // Workout the real position of the element on the board.
+ var dragTopicPosition = dragTopic.getPosition();
+ var draggedTopic = dragTopic.getDraggedTopic();
+
+ // Topic can be connected ?
+ this._checkDragTopicConnection(dragTopic);
+
+ // Position topic in the board
+ if (dragTopic.isConnected()) {
+ var targetTopic = dragTopic.getConnectedToTopic();
+ var topicBoard = this._layoutManager.getTopicBoardForTopic(targetTopic);
+ topicBoard.positionateDragTopic(dragTopic);
+ }
+ },
+
+ _checkDragTopicConnection : function(dragTopic) {
+ var topics = this._topics;
+
+ // Must be disconnected from their current connection ?.
+ var mainTopicToMainTopicConnection = this._lookUpForMainTopicToMainTopicConnection(dragTopic);
+ var currentConnection = dragTopic.getConnectedToTopic();
+ if ($defined(currentConnection)) {
+ // MainTopic->MainTopicConnection.
+ if (currentConnection.getType() == mindplot.model.NodeModel.MAIN_TOPIC_TYPE) {
+ if (mainTopicToMainTopicConnection != currentConnection) {
+ dragTopic.disconnect(this._workspace);
+ }
+ }
+ else if (currentConnection.getType() == mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ // Distance if greater that the allowed.
+ var dragXPosition = dragTopic.getPosition().x;
+ var currentXPosition = currentConnection.getPosition().x;
+
+ if ($defined(mainTopicToMainTopicConnection)) {
+ // I have to change the current connection to a main topic.
+ dragTopic.disconnect(this._workspace);
+ } else
+ if (Math.abs(dragXPosition - currentXPosition) > mindplot.DragTopicPositioner.CENTRAL_TO_MAINTOPIC_MAX_HORIZONTAL_DISTANCE) {
+ dragTopic.disconnect(this._workspace);
+ }
+ }
+ }
+
+ // Finally, connect nodes ...
+ if (!dragTopic.isConnected()) {
+ var centalTopic = topics[0];
+ if ($defined(mainTopicToMainTopicConnection)) {
+ dragTopic.connectTo(mainTopicToMainTopicConnection);
+ } else if (Math.abs(dragTopic.getPosition().x - centalTopic.getPosition().x) <= mindplot.DragTopicPositioner.CENTRAL_TO_MAINTOPIC_MAX_HORIZONTAL_DISTANCE) {
+ dragTopic.connectTo(centalTopic);
+ }
+ }
+ },
+
+ _lookUpForMainTopicToMainTopicConnection : function(dragTopic) {
+ var topics = this._topics;
+ var result = null;
+ var clouserDistance = -1;
+ var draggedNode = dragTopic.getDraggedTopic();
+ var distance = null;
+
+ // Check MainTopic->MainTopic connection...
+ for (var i = 0; i < topics.length; i++) {
+ var targetTopic = topics[i];
+ var position = dragTopic.getPosition();
+ if (targetTopic.getType() != mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE && targetTopic != draggedNode) {
+ var canBeConnected = dragTopic.canBeConnectedTo(targetTopic);
+ if (canBeConnected) {
+ var targetPosition = targetTopic.getPosition();
+ var fix = position.y > targetPosition.y;
+ var gap = 0;
+ if (targetTopic._getChildren().length > 0) {
+ gap = Math.abs(targetPosition.y - targetTopic._getChildren()[0].getPosition().y)
+ }
+ var yDistance = Math.abs(position.y - fix * gap - targetPosition.y);
+ if (distance == null || yDistance < distance) {
+ result = targetTopic;
+ distance = yDistance;
+ }
+
+ }
+ }
+ }
+ return result;
+ }
+});
+
+mindplot.DragTopicPositioner.CENTRAL_TO_MAINTOPIC_MAX_HORIZONTAL_DISTANCE = 400;
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.TextEditor = new Class({
+ initialize:function(designer, actionRunner) {
+ this._designer = designer;
+ this._screenManager = designer.getWorkSpace().getScreenManager();
+ this._container = this._screenManager.getContainer();
+ this._actionRunner = actionRunner;
+ this._isVisible = false;
+
+ //Create editor ui
+ this._createUI();
+
+ this._addListeners();
+
+ },
+
+ _createUI:function() {
+ this._size = {width:500, height:100};
+ this._myOverlay = new Element('div').setStyles({position:"absolute", display: "none", zIndex: "8", top: 0, left:0, width:"500px", height:"100px"});
+ var inputContainer = new Element('div').setStyles({border:"none", overflow:"auto"}).inject(this._myOverlay);
+ this.inputText = new Element('input').setProperties({type:"text", tabindex:'-1', id:"inputText", value:""}).setStyles({border:"none", background:"transparent"}).inject(inputContainer);
+ var spanContainer = new Element('div').setStyle('visibility', "hidden").inject(this._myOverlay);
+ this._spanText = new Element('span').setProperties({id: "spanText", tabindex:"-1"}).setStyle('white-space', "nowrap").setStyle('nowrap', 'nowrap').inject(spanContainer);
+ this._myOverlay.inject(this._container);
+ },
+
+ _addListeners:function() {
+ var elem = this;
+ this.applyChanges = true;
+ this.inputText.onkeyup = function (evt) {
+ var event = new Event(evt);
+ var key = event.key;
+ switch (key) {
+ case 'esc':
+ elem.applyChanges = false;
+ case 'enter':
+ var executor = function(editor) {
+ return function() {
+ elem.lostFocus(true);
+ $(document.documentElement).fireEvent('focus');
+ };
+ };
+ setTimeout(executor(this), 3);
+
+ break;
+ default:
+ var span = $('spanText');
+ var input = $('inputText');
+ span.innerHTML = input.value;
+ var size = input.value.length + 1;
+ input.size = size;
+ if (span.offsetWidth > (parseInt(elem._myOverlay.style.width) - 100)) {
+ elem._myOverlay.style.width = (span.offsetWidth + 100) + "px";
+ }
+ break;
+ }
+ };
+ //Register onLostFocus/onBlur event
+ $(this.inputText).addEvent('blur', this.lostFocusEvent.bind(this));
+ $(this._myOverlay).addEvent('click', this.clickEvent.bindWithEvent(this));
+ $(this._myOverlay).addEvent('dblclick', this.clickEvent.bindWithEvent(this));
+ $(this._myOverlay).addEvent('mousedown', this.mouseDownEvent.bindWithEvent(this));
+
+ var elem = this;
+ var onComplete = function() {
+ this._myOverlay.setStyle('display', "none");
+ this._isVisible = false;
+ this.inputText.setStyle('opacity', 1);
+
+ this.setPosition(0, 0);
+ if (elem._currentNode != null) {
+ this._currentNode.getTextShape().setVisibility(true);
+ if (this.applyChanges) {
+ this._updateNode();
+ }
+ this.applyChanges = true;
+ this._currentNode = null;
+ }
+
+ setTimeout("$('ffoxWorkarroundInput').focus();", 0);
+ };
+ this.fx = new Fx.Tween(this.inputText, {property: 'opacity', duration: 10});
+ this.fx.addEvent('onComplete', onComplete.bind(this));
+ },
+
+ lostFocusEvent : function () {
+ this.fx.options.duration = 10;
+ this.fx.start(1, 0);
+ //myAnim.animate();
+ },
+
+ isVisible : function () {
+ return this._isVisible;
+ },
+
+ getFocusEvent: function (node) {
+ //console.log('focus event');
+ if (this.isVisible()) {
+ this.getFocusEvent.delay(10, this);
+ }
+ else {
+ //console.log('calling init');
+ this.init(node);
+ }
+ //console.log('focus event done');
+ },
+
+ setInitialText : function (text) {
+ this.initialText = text;
+ },
+
+ _updateNode : function () {
+
+ if ($defined(this._currentNode) && this._currentNode.getText() != this.getText()) {
+ var text = this.getText();
+ var topicId = this._currentNode.getId();
+
+ var commandFunc = function(topic, value) {
+ var result = topic.getText();
+ topic.setText(value);
+ return result;
+ };
+ var command = new mindplot.commands.GenericFunctionCommand(commandFunc, text, [topicId]);
+ this._actionRunner.execute(command);
+ }
+ },
+
+ listenEventOnNode : function(topic, eventName, stopPropagation) {
+ var elem = this;
+ topic.addEventListener(eventName, function (event) {
+ if (elem._designer.getWorkSpace().isWorkspaceEventsEnabled()) {
+ mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.NodeMouseOutEvent, [topic ]);
+ elem.lostFocus();
+ elem.getFocusEvent.attempt(topic, elem);
+
+ if (stopPropagation) {
+ if ($defined(event.stopPropagation)) {
+ event.stopPropagation(true);
+ } else {
+ event.cancelBubble = true;
+ }
+ }
+ }
+ });
+ },
+
+ init : function (nodeGraph) {
+ //console.log('init method');
+ nodeGraph.getTextShape().setVisibility(false);
+ this._currentNode = nodeGraph;
+
+ //set Editor Style
+ var nodeText = nodeGraph.getTextShape();
+ var text;
+ var selectText = true;
+ if (this.initialText && this.initialText != "") {
+ text = this.initialText;
+ this.initialText = null;
+ selectText = false;
+ }
+ else
+ text = nodeText.getText();
+
+ var font = nodeText.getFont();
+ font.size = nodeText.getHtmlFontSize();
+ font.color = nodeText.getColor();
+
+ this.setStyle(font);
+
+ //set editor's initial text
+ this.setText(text);
+
+ //set editor's initial size
+ var editor = this;
+ var executor = function(editor) {
+ return function() {
+ //console.log('setting editor in init thread');
+ var scale = web2d.peer.utils.TransformUtil.workoutScale(editor._currentNode.getTextShape()._peer);
+ var elemSize = editor._currentNode.getSize();
+ //var textSize = editor.getSize();
+ var pos = editor._screenManager.getWorkspaceElementPosition(editor._currentNode);
+
+ var textWidth = editor._currentNode.getTextShape().getWidth();
+ var textHeight = editor._currentNode.getTextShape().getHeight();
+ var iconGroup = editor._currentNode.getIconGroup();
+ var iconGroupSize;
+ if ($defined(iconGroup)) {
+ iconGroupSize = editor._currentNode.getIconGroup().getSize();
+ }
+ else {
+ iconGroupSize = {width:0, height:0};
+ }
+ var position = {x:0,y:0};
+ position.x = pos.x - ((textWidth * scale.width) / 2) + (((iconGroupSize.width) * scale.width) / 2);
+ var fixError = 1;
+ position.y = pos.y - ((textHeight * scale.height) / 2) - fixError;
+
+ editor.setEditorSize(elemSize.width, elemSize.height, scale);
+ //console.log('setting position:'+pos.x+';'+pos.y);
+ editor.setPosition(position.x, position.y, scale);
+ editor.showTextEditor(selectText);
+ //console.log('setting editor done');
+ };
+ };
+
+ setTimeout(executor(this), 10);
+ //console.log('init done');
+ },
+
+ setStyle : function (fontStyle) {
+ var inputField = $("inputText");
+ var spanField = $("spanText");
+ if (!$defined(fontStyle.font)) {
+ fontStyle.font = "Arial";
+ }
+ if (!$defined(fontStyle.style)) {
+ fontStyle.style = "normal";
+ }
+ if (!$defined(fontStyle.weight)) {
+ fontStyle.weight = "normal";
+ }
+ if (!$defined(fontStyle.size)) {
+ fontStyle.size = 12;
+ }
+ inputField.style.fontSize = fontStyle.size + "px";
+ inputField.style.fontFamily = fontStyle.font;
+ inputField.style.fontStyle = fontStyle.style;
+ inputField.style.fontWeight = fontStyle.weight;
+ inputField.style.color = fontStyle.color;
+ spanField.style.fontFamily = fontStyle.font;
+ spanField.style.fontStyle = fontStyle.style;
+ spanField.style.fontWeight = fontStyle.weight;
+ spanField.style.fontSize = fontStyle.size + "px";
+ },
+
+ setText : function(text) {
+ var inputField = $("inputText");
+ inputField.size = text.length + 1;
+ //this._myOverlay.cfg.setProperty("width", (inputField.size * parseInt(inputField.style.fontSize) + 100) + "px");
+ this._myOverlay.style.width = (inputField.size * parseInt(inputField.style.fontSize) + 100) + "px";
+ var spanField = $("spanText");
+ spanField.innerHTML = text;
+ inputField.value = text;
+ },
+
+ getText : function() {
+ return $('inputText').value;
+ },
+
+ setEditorSize : function (width, height, scale) {
+ //var scale = web2d.peer.utils.TransformUtil.workoutScale(this._currentNode.getTextShape()._peer);
+ this._size = {width:width * scale.width, height:height * scale.height};
+ //this._myOverlay.cfg.setProperty("width",this._size.width*2+"px");
+ this._myOverlay.style.width = this._size.width * 2 + "px";
+ //this._myOverlay.cfg.setProperty("height",this._size.height+"px");
+ this._myOverlay.style.height = this._size.height + "px";
+ },
+
+ getSize : function () {
+ return {width:$("spanText").offsetWidth,height:$("spanText").offsetHeight};
+ },
+
+ setPosition : function (x, y, scale) {
+ $(this._myOverlay).setStyles({top : y + "px", left: x + "px"});
+ //this._myOverlay.style.left = x + "px";
+ },
+
+ showTextEditor : function(selectText) {
+ //this._myOverlay.show();
+ //var myAnim = new YAHOO.util.Anim('inputText',{opacity: {to:1}}, 0.10, YAHOO.util.Easing.easeOut);
+ //$('inputText').style.opacity='1';
+ var elem = this;
+ //myAnim.onComplete.subscribe(function(){
+ //elem._myOverlay.show();
+ elem._myOverlay.setStyle('display', "block");
+ this._isVisible = true;
+ //elem.cfg.setProperty("visible", false);
+ //elem._myOverlay.cfg.setProperty("xy", [0, 0]);
+ //elem._myOverlay.cfg.setProperty("visible", true);
+ //select the text in the input
+ $('inputText').disabled = false;
+
+ if ($('inputText').createTextRange) //ie
+ {
+ var range = $('inputText').createTextRange();
+ var pos = $('inputText').value.length;
+ if (selectText) {
+ range.select();
+ range.move("character", pos);
+ }
+ else {
+ range.move("character", pos);
+ range.select();
+ }
+ }
+ else if (selectText) {
+ $('inputText').setSelectionRange(0, $('inputText').value.length);
+ }
+
+ var executor = function(editor) {
+ return function() {
+ try {
+ $('inputText').focus();
+ }
+ catch (e) {
+
+ }
+ };
+ };
+ setTimeout(executor(this), 0);
+ //});
+ //myAnim.animate();
+
+ },
+
+ lostFocus : function(bothBrowsers) {
+ if (this.isVisible()) {
+ //the editor is opened in another node. lets Finish it.
+ var fireOnThis = $('inputText');
+ fireOnThis.fireEvent('blur');
+ }
+ },
+ clickEvent : function(event) {
+ if (this.isVisible()) {
+ if ($defined(event.stopPropagation)) {
+ event.stopPropagation(true);
+ } else {
+ event.cancelBubble = true;
+ }
+ event.preventDefault();
+ }
+
+ },
+ mouseDownEvent : function(event) {
+ if (this.isVisible()) {
+ if ($defined(event.stopPropagation)) {
+ event.stopPropagation(true);
+ } else {
+ event.cancelBubble = true;
+ }
+ }
+ }
+
+});
+
+/*
+* Copyright [2011] [wisemapping]
+*
+* Licensed under WiseMapping Public License, Version 1.0 (the "License").
+* It is basically the Apache License, Version 2.0 (the "License") plus the
+* "powered by wisemapping" text requirement on every single page;
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the license at
+*
+* http://www.wisemapping.org/license
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+mindplot.RichTextEditor = mindplot.TextEditor.extend({
+ initialize:function(screenManager,actionRunner){
+ this.parent(screenManager, actionRunner);
+ },
+ _createUI:function(){
+ //Create editor ui
+ this._size = {width:440, height:200};
+ this._myOverlay = new Element('div').setStyles({position:"absolute", display: "none", zIndex: "8", top: "50%", left:"50%", marginLeft:"-200px", marginTop:"-90px", width:"400px", height:"180px"});
+ var inputContainer = new Element('div').setStyles({border:"none", overflow:"auto"}).inject(this._myOverlay);
+ this.inputText = new Element('textarea').setProperties({tabindex:'-1', id:"inputText2", value:""}).setStyles({width:"398px", height:"175px", border:"none", background:"transparent"}).inject(inputContainer);
+ this._myOverlay.inject(this._screenManager.getContainer());
+ this._editorNode = new web2d.Rect(0.3,mindplot.Topic.OUTER_SHAPE_ATTRIBUTES);
+ this._editorNode.setSize(50,20);
+ this._editorNode.setVisibility(false);
+ this._designer.getWorkSpace().appendChild(this._editorNode);
+ this._addListeners();
+ },
+ _addListeners:function(){
+
+ $(this._myOverlay).addEvent('click', function(event){
+ event.preventDefault();
+ event.stop();
+ }.bindWithEvent(this));
+ $(this._myOverlay).addEvent('dblclick', function(event){
+ event.preventDefault();
+ event.stop();
+ }.bindWithEvent(this));
+ },
+ getFocusEvent:function(node){
+ var screenSize = this._designer.getWorkSpace().getSize();
+ var coordOrigin = this._designer.getWorkSpace()._workspace.getCoordOrigin();
+ var middlePosition = {x:parseInt(screenSize.width)/2 + parseInt(coordOrigin.x), y:parseInt(screenSize.height)/2 + parseInt(coordOrigin.y)};
+
+ this._designer.getWorkSpace().enableWorkspaceEvents(false);
+ var position = node.getPosition().clone();
+ var size = node.getSize();
+ this._editorNode.setPosition(position.x-(size.width/2), position.y-(size.height/2));
+ position = this._editorNode.getPosition();
+ this._editorNode.setSize(size.width, size.height);
+ this._editorNode.moveToFront();
+ this._editorNode.setVisibility(true);
+ var scale = web2d.peer.utils.TransformUtil.workoutScale(node.getOuterShape());
+// scale.width=1;
+// scale.height = 1;
+ var steps = 10;
+ this._delta = {width:((this._size.width/scale.width)-size.width)/steps, height:((this._size.height/scale.height)-size.height)/steps};
+ var finx = (middlePosition.x-(((this._size.width)/2)/scale.width));
+ var finy = (middlePosition.y-((this._size.height/2)/scale.height));
+ var step = 10;
+ var d = {x:(position.x - finx)/step, y:(position.y - finy)/step};
+ var _animEffect = null;
+ var effect = function(){
+ if(step>=0){
+ var xStep= (position.x -finx)/step;
+ var yStep= (position.y -finy)/step;
+ var pos = {x:position.x - d.x*(10-step), y: position.y -d.y *(10-step)};
+
+ var size = this._editorNode.getSize();
+ this._editorNode.setSize(size.width + this._delta.width, size.height + this._delta.height);
+ this._editorNode.setPosition(pos.x, pos.y);
+ if(step>0)
+ this._editorNode.setOpacity(1-step/10);
+ step--;
+ }else{
+ $clear(_animEffect);
+ this._editorNode.setSize((this._size.width/scale.width), (this._size.height/scale.height));
+ this.init(node);
+ }
+ }.bind(this);
+ _animEffect = effect.periodical(10);
+ $(this.inputText).value = $defined(this.initialText)&& this.initialText!=""? this.initialText: node.getText();
+ this._editor = new nicEditor({iconsPath: '../images/nicEditorIcons.gif', buttonList : ['bold','italic','underline','removeformat','forecolor', 'fontSize', 'fontFamily', 'xhtml']}).panelInstance("inputText2");
+ },
+ init:function(node){
+ this._currentNode = node;
+ this.applyChanges = false;
+ $(this._myOverlay.setStyle('display','block'));
+ inst = this._editor.instanceById("inputText2");
+ inst.elm.focus();
+
+
+
+ //becarefull this._editor is not mootools!!
+ this._editor.addEvent('blur',function(event){
+ this._myOverlay.setStyle('display','none');
+ var text = this._text;
+ this._text = this._editor.instanceById("inputText2").getContent();
+ if(text!=this._text){
+ this.applyChanges = true;
+ }
+ console.log('bye');
+ this.lostFocusListener();
+ this._editor.removeInstance("inputText2");
+ this._editor.destruct();
+ this._editor = null;
+
+ }.bind(this));
+
+ this._editor.fireEvent();
+ $(this.inputText).focus();
+ },
+ getText:function(){
+ return this._text;
+ },
+ lostFocusListener:function(){
+ this._hideNode();
+ if (this._currentNode != null)
+ {
+ if(this.applyChanges)
+ {
+ this._updateNode();
+ }
+ this.applyChanges=true;
+ this._currentNode = null;
+ }
+ },
+ _hideNode:function(){
+ var _animEffect = null;
+ var step = 10;
+ var position = this._editorNode.getPosition();
+ var finx = this._currentNode.getPosition().x - this._currentNode.getSize().width/2;
+ var finy = this._currentNode.getPosition().y - this._currentNode.getSize().height/2;
+ var d = {x:(position.x - finx)/step, y:(position.y - finy)/step};
+ var effect = function(){
+ if(step>=0){
+ var pos = {x:position.x - d.x*(10-step), y: position.y - d.y*(10-step)};
+
+ var size = this._editorNode.getSize();
+ this._editorNode.setSize(size.width - this._delta.width, size.height - this._delta.height);
+ this._editorNode.setPosition(pos.x, pos.y);
+ this._editorNode.setOpacity(step/10);
+ step--;
+ }else{
+ $clear(_animEffect);
+ this._designer.getWorkSpace().enableWorkspaceEvents(true);
+ this._editorNode.setVisibility(false); }
+ }.bind(this);
+ _animEffect = effect.periodical(10);
+ }
+});
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+mindplot.TextEditorFactory = {};
+
+mindplot.TextEditorFactory.getTextEditorFromName = function(name) {
+ var editorClass = null;
+ if (name == "RichTextEditor") {
+ editorClass = mindplot.RichTextEditor;
+ } else {
+ editorClass = mindplot.TextEditor;
+ }
+ return editorClass;
+};/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.VariableDistanceBoard = new Class({
+ Extends: mindplot.Board,
+ initialize: function(defaultHeight, referencePoint) {
+ this.parent(defaultHeight, referencePoint);
+ var zeroEntryCoordinate = referencePoint.y;
+ var entry = this.createBoardEntry(zeroEntryCoordinate - (defaultHeight / 2), zeroEntryCoordinate + (defaultHeight / 2), 0);
+ this._entries.set(0, entry);
+ },
+
+ lookupEntryByOrder:function(order) {
+ var entries = this._entries;
+ var index = this._orderToIndex(order);
+
+ var result = entries.get(index);
+ if (!$defined(result)) {
+ // I've not found a entry. I have to create a new one.
+ var i = 1;
+ var zeroEntry = entries.get(0);
+ var distance = zeroEntry.getWidth() / 2;
+ var indexSign = Math.sign(index);
+ var absIndex = Math.abs(index);
+ while (i < absIndex) {
+ // Move to the next entry ...
+ var entry = entries.get(i, indexSign);
+ if (entry != null) {
+ distance += entry.getWidth();
+ } else {
+ distance += this._defaultWidth;
+ }
+ i++;
+ }
+
+ // Calculate limits ...
+ var upperLimit = -1;
+ var lowerLimit = -1;
+ var offset = zeroEntry.workoutEntryYCenter();
+ if (index >= 0) {
+ lowerLimit = offset + distance;
+ upperLimit = lowerLimit + this._defaultWidth;
+ } else {
+ upperLimit = offset - distance;
+ lowerLimit = upperLimit - this._defaultWidth;
+ }
+
+ result = this.createBoardEntry(lowerLimit, upperLimit, order);
+ }
+ return result;
+ },
+
+ createBoardEntry:function(lowerLimit, upperLimit, order) {
+ return new mindplot.BoardEntry(lowerLimit, upperLimit, order);
+ },
+
+ updateReferencePoint:function(position) {
+ var entries = this._entries;
+ var referencePoint = this._referencePoint;
+
+ // Update zero entry current position.
+ this._referencePoint = position.clone();
+ var yOffset = position.y - referencePoint.y;
+
+ var i = -entries.lowerLength();
+ for (; i <= entries.length(1); i++) {
+ var entry = entries.get(i);
+ if (entry != null) {
+ var upperLimit = entry.getUpperLimit() + yOffset;
+ var lowerLimit = entry.getLowerLimit() + yOffset;
+ entry.setUpperLimit(upperLimit);
+ entry.setLowerLimit(lowerLimit);
+
+ // Update topic position ...
+ if (!entry.isAvailable()) {
+ var topic = entry.getTopic();
+ var topicPosition = topic.getPosition();
+ topicPosition.y = topicPosition.y + yOffset;
+
+ // MainTopicToCentral must be positioned based on the referencePoint.
+ var xOffset = position.x - referencePoint.x;
+ topicPosition.x = topicPosition.x + xOffset;
+
+ topic.setPosition(topicPosition);
+ }
+ }
+ }
+ },
+
+ lookupEntryByPosition:function(pos) {
+ $assert(pos, 'position can not be null');
+ var entries = this._entries;
+ var zeroEntry = entries.get(0);
+ if (zeroEntry.isCoordinateIn(pos.y)) {
+ return zeroEntry;
+ }
+
+ // Is Upper or lower ?
+ var sign = -1;
+ if (pos.y >= zeroEntry.getUpperLimit()) {
+ sign = 1;
+ }
+
+ var i = 1;
+ var tempEntry = this.createBoardEntry();
+ var currentEntry = zeroEntry;
+ while (true) {
+ // Move to the next entry ...
+ var index = i * sign;
+ var entry = entries.get(index);
+ if ($defined(entry)) {
+ currentEntry = entry;
+ } else {
+ // Calculate boundaries...
+ var lowerLimit, upperLimit;
+ if (sign > 0) {
+ lowerLimit = currentEntry.getUpperLimit();
+ upperLimit = lowerLimit + this._defaultWidth;
+ }
+ else {
+ upperLimit = currentEntry.getLowerLimit();
+ lowerLimit = upperLimit - this._defaultWidth;
+ }
+
+ // Update current entry.
+ currentEntry = tempEntry;
+ currentEntry.setLowerLimit(lowerLimit);
+ currentEntry.setUpperLimit(upperLimit);
+
+ var order = this._indexToOrder(index);
+ currentEntry.setOrder(order);
+ }
+
+ // Have I found the item?
+ if (currentEntry.isCoordinateIn(pos.y)) {
+ break;
+ }
+ i++;
+ }
+ return currentEntry;
+ },
+
+ update:function(entry) {
+ $assert(entry, 'Entry can not be null');
+ var order = entry.getOrder();
+ var index = this._orderToIndex(order);
+
+ this._entries.set(index, entry);
+
+ },
+ freeEntry:function(entry) {
+ var order = entry.getOrder();
+ var entries = this._entries;
+
+ var index = this._orderToIndex(order);
+ var indexSign = Math.sign(index);
+
+ var currentTopic = entry.getTopic();
+ var i = Math.abs(index) + 1;
+ while (currentTopic) {
+ var e = entries.get(i, indexSign);
+ if ($defined(currentTopic) && !$defined(e)) {
+ var entryOrder = this._indexToOrder(i * indexSign);
+ e = this.lookupEntryByOrder(entryOrder);
+ }
+
+ // Move the topic to the next entry ...
+ var topic = null;
+ if ($defined(e)) {
+ topic = e.getTopic();
+ if ($defined(currentTopic)) {
+ e.setTopic(currentTopic);
+ }
+ this.update(e);
+ }
+ currentTopic = topic;
+ i++;
+ }
+
+ // Clear the entry topic ...
+ entry.setTopic(null);
+ },
+
+ _orderToIndex:function(order) {
+ var index = Math.round(order / 2);
+ return ((order % 2) == 0) ? index : -index;
+ },
+
+ _indexToOrder:function(index) {
+ var order = Math.abs(index) * 2;
+ return (index >= 0) ? order : order - 1;
+ },
+
+ inspect:function() {
+ return this._entries.inspect();
+ }
+
+});/*
+* Copyright [2011] [wisemapping]
+*
+* Licensed under WiseMapping Public License, Version 1.0 (the "License").
+* It is basically the Apache License, Version 2.0 (the "License") plus the
+* "powered by wisemapping" text requirement on every single page;
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the license at
+*
+* http://www.wisemapping.org/license
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+mindplot.util.Shape =
+{
+ isAtRight: function(sourcePoint, targetPoint)
+ {
+ $assert(sourcePoint, "Source can not be null");
+ $assert(targetPoint, "Target can not be null");
+ return sourcePoint.x < targetPoint.x;
+ },
+ workoutDistance: function(sourceNode, targetNode)
+ {
+ var sPos = sourceNode.getPosition();
+ var tPos = targetNode.getPosition();
+
+ var x = tPos.x - sPos.x;
+ var y = tPos.y - sPos.y;
+
+ var hip = y * y + x * x;
+ return hip;
+ },
+ calculateRectConnectionPoint: function(rectCenterPoint, rectSize, isAtRight)
+ {
+ $assert(rectCenterPoint, 'rectCenterPoint can not be null');
+ $assert(rectSize, 'rectSize can not be null');
+ $assert(isAtRight, 'isRight can not be null');
+
+ // Node is placed at the right ?
+ var result = new core.Point();
+
+ // This is used fix a minor difference ...z
+ var correctionHardcode = 2;
+ if (isAtRight)
+ {
+ result.setValue(rectCenterPoint.x - (rectSize.width / 2) + correctionHardcode, rectCenterPoint.y);
+ } else
+ {
+ result.setValue(parseFloat(rectCenterPoint.x) + (rectSize.width / 2) - correctionHardcode, rectCenterPoint.y);
+ }
+
+ return result;
+ },
+ _getRectShapeOffset : function(sourceTopic, targetTopic)
+ {
+
+ var tPos = targetTopic.getPosition();
+ var sPos = sourceTopic.getPosition();
+
+ var tSize = targetTopic.getSize();
+
+ var x = sPos.x - tPos.x;
+ var y = sPos.y - tPos.y;
+
+ var gradient = 0;
+ if ($defined(x))
+ {
+ gradient = y / x;
+ }
+
+ var area = this._getSector(gradient, x, y);
+ var xOff = -1;
+ var yOff = -1;
+ if (area == 1 || area == 3)
+ {
+ xOff = tSize.width / 2;
+ yOff = xOff * gradient;
+
+ xOff = xOff * ((x < 0) ? -1 : 1);
+ yOff = yOff * ((x < 0) ? -1 : 1);
+
+
+ } else
+ {
+ yOff = tSize.height / 2;
+ xOff = yOff / gradient;
+
+ yOff = yOff * ((y < 0) ? -1 : 1);
+ xOff = xOff * ((y < 0) ? -1 : 1);
+ }
+
+
+ // Controll boundaries.
+ if (Math.abs(xOff) > tSize.width / 2)
+ {
+ xOff = ((tSize.width / 2) * Math.sign(xOff));
+ }
+
+ if (Math.abs(yOff) > tSize.height / 2)
+ {
+ yOff = ((tSize.height / 2) * Math.sign(yOff));
+ }
+
+ return {x:xOff,y:yOff};
+ },
+
+/**
+ * Sector are numered following the clockwise direction.
+ */
+ _getSector : function(gradient, x, y)
+ {
+ var result;
+ if (gradient < 0.5 && gradient > -0.5)
+ {
+ // Sector 1 and 3
+ if (x >= 0)
+ {
+ result = 1;
+ } else
+ {
+ result = 3;
+ }
+
+ } else
+ {
+ // Sector 2 and 4
+ if (y <= 0)
+ {
+ result = 4;
+ } else
+ {
+ result = 2;
+ }
+ }
+
+ return result;
+ }
+};
+
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.FixedDistanceBoard = new Class({
+ Extends:mindplot.Board,
+ initialize:function(defaultHeight, topic, layoutManager) {
+ this._topic = topic;
+ this._layoutManager = layoutManager;
+ var reference = topic.getPosition();
+ this.parent(defaultHeight, reference);
+ this._height = defaultHeight;
+ this._entries = [];
+ },
+
+ getHeight : function() {
+ return this._height;
+ },
+
+ lookupEntryByOrder : function(order) {
+ var result = null;
+ var entries = this._entries;
+ if (order < entries.length) {
+ result = entries[order];
+ }
+
+ if (result == null) {
+ var defaultHeight = this._defaultWidth;
+ var reference = this.getReferencePoint();
+ if (entries.length == 0) {
+ var yReference = reference.y;
+ result = this.createBoardEntry(yReference - (defaultHeight / 2), yReference + (defaultHeight / 2), 0);
+ } else {
+ var entriesLenght = entries.length;
+ var lastEntry = entries[entriesLenght - 1];
+ var lowerLimit = lastEntry.getUpperLimit();
+ var upperLimit = lowerLimit + defaultHeight;
+ result = this.createBoardEntry(lowerLimit, upperLimit, entriesLenght + 1);
+ }
+ }
+ return result;
+ },
+
+ createBoardEntry : function(lowerLimit, upperLimit, order) {
+ var result = new mindplot.BoardEntry(lowerLimit, upperLimit, order);
+ var xPos = this.workoutXBorderDistance();
+ result.setXPosition(xPos);
+ return result;
+ },
+
+ updateReferencePoint : function() {
+ var entries = this._entries;
+ var parentTopic = this.getTopic();
+ var parentPosition = parentTopic.workoutIncomingConnectionPoint(parentTopic.getPosition());
+ var referencePoint = this.getReferencePoint();
+ var yOffset = parentPosition.y - referencePoint.y;
+
+ for (var i = 0; i < entries.length; i++) {
+ var entry = entries[i];
+
+ if ($defined(entry)) {
+ var upperLimit = entry.getUpperLimit() + yOffset;
+ var lowerLimit = entry.getLowerLimit() + yOffset;
+ entry.setUpperLimit(upperLimit);
+ entry.setLowerLimit(lowerLimit);
+
+ // Fix x position ...
+ var xPos = this.workoutXBorderDistance();
+ entry.setXPosition(xPos);
+ entry.update();
+ }
+ }
+ this._referencePoint = parentPosition.clone();
+
+ },
+
+ /**
+ * This x distance doesn't take into account the size of the shape.
+ */
+ workoutXBorderDistance : function() {
+ var topic = this.getTopic();
+
+ var topicPosition = topic.getPosition();
+ var topicSize = topic.getSize();
+ var halfTargetWidth = topicSize.width / 2;
+ var result;
+ if (topicPosition.x >= 0) {
+ // It's at right.
+ result = topicPosition.x + halfTargetWidth + mindplot.FixedDistanceBoard.MAIN_TOPIC_TO_MAIN_TOPIC_DISTANCE;
+ } else {
+ result = topicPosition.x - (halfTargetWidth + mindplot.FixedDistanceBoard.MAIN_TOPIC_TO_MAIN_TOPIC_DISTANCE);
+ }
+ return result;
+ },
+
+ getTopic : function() {
+ return this._topic;
+ },
+
+ freeEntry : function(entry) {
+ var newEntries = [];
+ var entries = this._entries;
+ var order = 0;
+ for (var i = 0; i < entries.length; i++) {
+ var e = entries[i];
+ if (e == entry) {
+ order++;
+ }
+ newEntries[order] = e;
+ order++;
+ }
+ this._entries = newEntries;
+ },
+
+ repositionate : function() {
+ // Workout width and update topic height.
+ var entries = this._entries;
+ var height = 0;
+ var model = this._topic.getModel();
+ if (entries.length >= 1 && !model.areChildrenShrinked()) {
+ for (var i = 0; i < entries.length; i++) {
+ var e = entries[i];
+ if (e && e.getTopic()) {
+ var topic = e.getTopic();
+ var topicBoard = this._layoutManager.getTopicBoardForTopic(topic);
+ var topicBoardHeight = topicBoard.getHeight();
+
+
+ height += topicBoardHeight + mindplot.FixedDistanceBoard.INTER_TOPIC_DISTANCE;
+ }
+ }
+ }
+ else {
+ var topic = this._topic;
+ height = topic.getSize().height + mindplot.FixedDistanceBoard.INTER_TOPIC_DISTANCE;
+ }
+
+ var oldHeight = this._height;
+ this._height = height;
+
+ // I must update all the parent nodes first...
+ if (oldHeight != this._height) {
+ var topic = this._topic;
+ var parentTopic = topic.getParent();
+ if (parentTopic != null) {
+ var board = this._layoutManager.getTopicBoardForTopic(parentTopic);
+ board.repositionate();
+ }
+ }
+
+
+ // @todo: Esto hace backtraking. Hay que cambiar la implementacion del set position de
+ // forma tal que no se mande a hacer el update de todos los hijos.
+
+ // Workout center the new topic center...
+ var refence = this.getReferencePoint();
+ var lowerLimit;
+ if (entries.length > 0) {
+ var l = 0;
+ for (l = 0; l < entries.length; l++) {
+ if ($defined(entries[l]))
+ break;
+ }
+ var topic = entries[l].getTopic();
+ var firstNodeHeight = topic.getSize().height;
+ lowerLimit = refence.y - (height / 2) - (firstNodeHeight / 2) + 1;
+ }
+
+ var upperLimit = null;
+
+ // Start moving all the elements ...
+ var newEntries = [];
+ var order = 0;
+ for (var i = 0; i < entries.length; i++) {
+ var e = entries[i];
+ if (e && e.getTopic()) {
+
+ var currentTopic = e.getTopic();
+ e.setLowerLimit(lowerLimit);
+
+ // Update entry ...
+ var topicBoard = this._layoutManager.getTopicBoardForTopic(currentTopic);
+ var topicBoardHeight = topicBoard.getHeight();
+
+ upperLimit = lowerLimit + topicBoardHeight + mindplot.FixedDistanceBoard.INTER_TOPIC_DISTANCE;
+ e.setUpperLimit(upperLimit);
+ lowerLimit = upperLimit;
+
+ e.setOrder(order);
+ currentTopic.setOrder(order);
+
+ e.update();
+ newEntries[order] = e;
+ order++;
+ }
+ }
+ this._entries = newEntries;
+ },
+
+ removeTopic : function(topic) {
+ var order = topic.getOrder();
+ var entry = this.lookupEntryByOrder(order);
+ $assert(!entry.isAvailable(), "Illegal state");
+
+ entry.setTopic(null);
+ topic.setOrder(null);
+ this._entries.erase(entry);
+
+ // Repositionate all elements ...
+ this.repositionate();
+ },
+
+ addTopic : function(order, topic) {
+
+ // If the entry is not available, I must swap the the entries...
+ var entry = this.lookupEntryByOrder(order);
+ if (!entry.isAvailable()) {
+ this.freeEntry(entry);
+ // Create a dummy entry ...
+ // Puaj, do something with this...
+ entry = this.createBoardEntry(-1, 0, order);
+ this._entries[order] = entry;
+ }
+ this._entries[order] = entry;
+
+ // Add to the board ...
+ entry.setTopic(topic, false);
+
+ // Repositionate all elements ...
+ this.repositionate();
+ },
+
+ lookupEntryByPosition : function(pos) {
+ $assert(pos, 'position can not be null');
+
+ var entries = this._entries;
+ var result = null;
+ for (var i = 0; i < entries.length; i++) {
+ var entry = entries[i];
+ if (pos.y < entry.getUpperLimit() && pos.y >= entry.getLowerLimit()) {
+ result = entry;
+ }
+ }
+
+ if (result == null) {
+ var defaultHeight = this._defaultWidth;
+ if (entries.length == 0) {
+ var reference = this.getReferencePoint();
+ var yReference = reference.y;
+ result = this.createBoardEntry(yReference - (defaultHeight / 2), yReference + (defaultHeight / 2), 0);
+ } else {
+ var firstEntry = entries[0];
+ if (pos.y < firstEntry.getLowerLimit()) {
+ var upperLimit = firstEntry.getLowerLimit();
+ var lowerLimit = upperLimit - defaultHeight;
+ result = this.createBoardEntry(lowerLimit, upperLimit, 0);
+ } else {
+ var entriesLenght = entries.length;
+ var lastEntry = entries[entriesLenght - 1];
+ var lowerLimit = lastEntry.getUpperLimit();
+ var upperLimit = lowerLimit + defaultHeight;
+ result = this.createBoardEntry(lowerLimit, upperLimit, entriesLenght);
+ }
+ }
+ }
+
+ return result;
+ }
+})
+ ;
+mindplot.FixedDistanceBoard.INTER_TOPIC_DISTANCE = 6;
+mindplot.FixedDistanceBoard.MAIN_TOPIC_TO_MAIN_TOPIC_DISTANCE = 60;
+
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.BoardEntry = new Class({
+ initialize:function(lowerLimit, upperLimit, order) {
+ if ($defined(lowerLimit) && $defined(upperLimit)) {
+ $assert(lowerLimit < upperLimit, 'lowerLimit can not be greater that upperLimit');
+ }
+ this._upperLimit = upperLimit;
+ this._lowerLimit = lowerLimit;
+ this._order = order;
+ this._topic = null;
+ this._xPos = null;
+ },
+
+
+ getUpperLimit : function() {
+ return this._upperLimit;
+ },
+
+ setXPosition : function(xPosition) {
+ this._xPos = xPosition;
+ },
+
+ workoutEntryYCenter : function() {
+ return this._lowerLimit + ((this._upperLimit - this._lowerLimit) / 2);
+ },
+
+ setUpperLimit : function(value) {
+ $assert(value, "upper limit can not be null");
+ $assert(!isNaN(value), "illegal value");
+ this._upperLimit = value;
+ },
+
+ isCoordinateIn : function(coord) {
+ return this._lowerLimit <= coord && coord < this._upperLimit;
+ },
+
+ getLowerLimit : function() {
+ return this._lowerLimit;
+ },
+
+ setLowerLimit : function(value) {
+ $assert(value, "upper limit can not be null");
+ $assert(!isNaN(value), "illegal value");
+ this._lowerLimit = value;
+ },
+
+ setOrder : function(value) {
+ this._order = value;
+ },
+
+ getWidth : function() {
+ return Math.abs(this._upperLimit - this._lowerLimit);
+ },
+
+
+ getTopic : function() {
+ return this._topic;
+ },
+
+
+ removeTopic : function() {
+ $assert(!this.isAvailable(), "Entry doesn't have a topic.");
+ var topic = this.getTopic();
+ this.setTopic(null);
+ topic.setOrder(null);
+ },
+
+
+ update : function() {
+ var topic = this.getTopic();
+ this.setTopic(topic);
+ },
+
+ setTopic : function(topic, updatePosition) {
+ if (!$defined(updatePosition) || ($defined(updatePosition) && !updatePosition)) {
+ updatePosition = true;
+ }
+
+ this._topic = topic;
+ if ($defined(topic)) {
+ // Fixed positioning. Only for main topic ...
+ var position = null;
+ var topicPosition = topic.getPosition();
+
+ // Must update position base on the border limits?
+ if ($defined(this._xPos)) {
+ position = new core.Point();
+
+ // Update x position ...
+ var topicSize = topic.getSize();
+ var halfTopicWidh = parseInt(topicSize.width / 2);
+ halfTopicWidh = (this._xPos > 0) ? halfTopicWidh : -halfTopicWidh;
+ position.x = this._xPos + halfTopicWidh;
+ position.y = this.workoutEntryYCenter();
+ } else {
+
+ // Central topic
+ this._height = topic.getSize().height;
+ var xPos = topicPosition.x;
+ var yPos = this.workoutEntryYCenter();
+ position = new core.Point(xPos, yPos);
+ }
+
+ // @todo: No esta de mas...
+ topic.setPosition(position);
+ topic.setOrder(this._order);
+ }
+ else {
+ this._height = this._defaultWidth;
+ }
+ },
+
+ isAvailable : function() {
+ return !$defined(this._topic);
+ },
+
+ getOrder : function() {
+ return this._order;
+ },
+
+ inspect : function() {
+ return '(order: ' + this._order + ', lowerLimit:' + this._lowerLimit + ', upperLimit: ' + this._upperLimit + ', available:' + this.isAvailable() + ')';
+ }
+});/*
+* Copyright [2011] [wisemapping]
+*
+* Licensed under WiseMapping Public License, Version 1.0 (the "License").
+* It is basically the Apache License, Version 2.0 (the "License") plus the
+* "powered by wisemapping" text requirement on every single page;
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the license at
+*
+* http://www.wisemapping.org/license
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+mindplot.ModelCodeName ={};
+
+mindplot.ModelCodeName.BETA = "beta";
+mindplot.ModelCodeName.PELA = "pela";
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.XMLMindmapSerializer_Pela = new Class({
+
+ toXML : function(mindmap) {
+ $assert(mindmap, "Can not save a null mindmap");
+
+ var document = core.Utils.createDocument();
+
+ // Store map attributes ...
+ var mapElem = document.createElement("map");
+ var name = mindmap.getId();
+ if ($defined(name)) {
+ mapElem.setAttribute('name', name);
+ }
+ var version = mindmap.getVersion();
+ if ($defined(version)) {
+ mapElem.setAttribute('version', version);
+ }
+
+ document.appendChild(mapElem);
+
+ // Create branches ...
+ var topics = mindmap.getBranches();
+ for (var i = 0; i < topics.length; i++) {
+ var topic = topics[i];
+ var topicDom = this._topicToXML(document, topic);
+ mapElem.appendChild(topicDom);
+ }
+
+ // Create Relationships
+ var relationships = mindmap.getRelationships();
+ if (relationships.length > 0) {
+// var relationshipDom=document.createElement("relationships");
+// mapElem.appendChild(relationshipDom);
+ for (var j = 0; j < relationships.length; j++) {
+ var relationDom = this._relationshipToXML(document, relationships[j]);
+ mapElem.appendChild(relationDom);
+ }
+ }
+
+ return document;
+ },
+
+ _topicToXML : function(document, topic) {
+ var parentTopic = document.createElement("topic");
+
+ // Set topic attributes...
+ if (topic.getType() == mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ parentTopic.setAttribute("central", true);
+ } else {
+ var parent = topic.getParent();
+// if (parent == null || parent.getType() == mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE)
+// {
+ var pos = topic.getPosition();
+ parentTopic.setAttribute("position", pos.x + ',' + pos.y);
+// } else
+// {
+ var order = topic.getOrder();
+ parentTopic.setAttribute("order", order);
+// }
+ }
+
+ var text = topic.getText();
+ if ($defined(text)) {
+ parentTopic.setAttribute('text', text);
+ }
+
+ var shape = topic.getShapeType();
+ if ($defined(shape)) {
+ parentTopic.setAttribute('shape', shape);
+ }
+
+ if (topic.areChildrenShrinked()) {
+ parentTopic.setAttribute('shrink', true);
+ }
+
+ // Font properties ...
+ var id = topic.getId();
+ parentTopic.setAttribute('id', id);
+
+ var font = "";
+
+ var fontFamily = topic.getFontFamily();
+ font += (fontFamily ? fontFamily : '') + ';';
+
+ var fontSize = topic.getFontSize();
+ font += (fontSize ? fontSize : '') + ';';
+
+ var fontColor = topic.getFontColor();
+ font += (fontColor ? fontColor : '') + ';';
+
+ var fontWeight = topic.getFontWeight();
+ font += (fontWeight ? fontWeight : '') + ';';
+
+ var fontStyle = topic.getFontStyle();
+ font += (fontStyle ? fontStyle : '') + ';';
+
+ if ($defined(fontFamily) || $defined(fontSize) || $defined(fontColor)
+ || $defined(fontWeight) || $defined(fontStyle)) {
+ parentTopic.setAttribute('fontStyle', font);
+ }
+
+ var bgColor = topic.getBackgroundColor();
+ if ($defined(bgColor)) {
+ parentTopic.setAttribute('bgColor', bgColor);
+ }
+
+ var brColor = topic.getBorderColor();
+ if ($defined(brColor)) {
+ parentTopic.setAttribute('brColor', brColor);
+ }
+
+ //ICONS
+ var icons = topic.getIcons();
+ for (var i = 0; i < icons.length; i++) {
+ var icon = icons[i];
+ var iconDom = this._iconToXML(document, icon);
+ parentTopic.appendChild(iconDom);
+ }
+
+ //LINKS
+ var links = topic.getLinks();
+ for (var i = 0; i < links.length; i++) {
+ var link = links[i];
+ var linkDom = this._linkToXML(document, link);
+ parentTopic.appendChild(linkDom);
+ }
+
+ var notes = topic.getNotes();
+ for (var i = 0; i < notes.length; i++) {
+ var note = notes[i];
+ var noteDom = this._noteToXML(document, note);
+ parentTopic.appendChild(noteDom);
+ }
+
+ //CHILDREN TOPICS
+ var childTopics = topic.getChildren();
+ for (var i = 0; i < childTopics.length; i++) {
+ var childTopic = childTopics[i];
+ var childDom = this._topicToXML(document, childTopic);
+ parentTopic.appendChild(childDom);
+
+ }
+
+ return parentTopic;
+ },
+
+ _iconToXML : function(document, icon) {
+ var iconDom = document.createElement("icon");
+ iconDom.setAttribute('id', icon.getIconType());
+ return iconDom;
+ },
+
+ _linkToXML : function(document, link) {
+ var linkDom = document.createElement("link");
+ linkDom.setAttribute('url', link.getUrl());
+ return linkDom;
+ },
+
+ _noteToXML : function(document, note) {
+ var noteDom = document.createElement("note");
+ noteDom.setAttribute('text', note.getText());
+ return noteDom;
+ },
+
+ _relationshipToXML : function(document, relationship) {
+ var relationDom = document.createElement("relationship");
+ relationDom.setAttribute("srcTopicId", relationship.getFromNode());
+ relationDom.setAttribute("destTopicId", relationship.getToNode());
+ var lineType = relationship.getLineType();
+ relationDom.setAttribute("lineType", lineType);
+ if (lineType == mindplot.ConnectionLine.CURVED || lineType == mindplot.ConnectionLine.SIMPLE_CURVED) {
+ if ($defined(relationship.getSrcCtrlPoint())) {
+ var srcPoint = relationship.getSrcCtrlPoint();
+ relationDom.setAttribute("srcCtrlPoint", srcPoint.x + "," + srcPoint.y);
+ }
+ if ($defined(relationship.getDestCtrlPoint())) {
+ var destPoint = relationship.getDestCtrlPoint();
+ relationDom.setAttribute("destCtrlPoint", destPoint.x + "," + destPoint.y);
+ }
+ }
+ relationDom.setAttribute("endArrow", relationship.getEndArrow());
+ relationDom.setAttribute("startArrow", relationship.getStartArrow());
+ return relationDom;
+ },
+
+ loadFromDom : function(dom) {
+ $assert(dom, "Dom can not be null");
+ var rootElem = dom.documentElement;
+
+ // Is a wisemap?.
+ $assert(rootElem.tagName == mindplot.XMLMindmapSerializer_Pela.MAP_ROOT_NODE, "This seem not to be a map document.");
+
+ this._idsMap = new Hash();
+ // Start the loading process ...
+ var mindmap = new mindplot.model.Mindmap();
+
+ var version = rootElem.getAttribute("version");
+ mindmap.setVersion(version);
+
+ var children = rootElem.childNodes;
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i];
+ if (child.nodeType == 1) {
+ switch (child.tagName) {
+ case "topic":
+ var topic = this._deserializeNode(child, mindmap);
+ mindmap.addBranch(topic);
+ break;
+ case "relationship":
+ var relationship = this._deserializeRelationship(child, mindmap);
+ if (relationship != null)
+ mindmap.addRelationship(relationship);
+ break;
+ }
+ }
+ }
+ this._idsMap = null;
+ return mindmap;
+ },
+
+ _deserializeNode : function(domElem, mindmap) {
+ var type = (domElem.getAttribute('central') != null) ? mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE : mindplot.model.NodeModel.MAIN_TOPIC_TYPE;
+ // Load attributes...
+ var id = domElem.getAttribute('id');
+ if ($defined(id)) {
+ id = parseInt(id);
+ }
+
+ if (this._idsMap.has(id)) {
+ id = null;
+ } else {
+ this._idsMap.set(id, domElem);
+ }
+
+ var topic = mindmap.createNode(type, id);
+
+ var text = domElem.getAttribute('text');
+ if ($defined(text)) {
+ topic.setText(text);
+ }
+
+ var order = domElem.getAttribute('order');
+ if ($defined(order)) {
+ topic.setOrder(parseInt(order));
+ }
+
+ var shape = domElem.getAttribute('shape');
+ if ($defined(shape)) {
+ topic.setShapeType(shape);
+ }
+
+ var isShrink = domElem.getAttribute('shrink');
+ if ($defined(isShrink)) {
+ topic.setChildrenShrinked(isShrink);
+ }
+
+ var fontStyle = domElem.getAttribute('fontStyle');
+ if ($defined(fontStyle)) {
+ var font = fontStyle.split(';');
+
+ if (font[0]) {
+ topic.setFontFamily(font[0]);
+ }
+
+ if (font[1]) {
+ topic.setFontSize(font[1]);
+ }
+
+ if (font[2]) {
+ topic.setFontColor(font[2]);
+ }
+
+ if (font[3]) {
+ topic.setFontWeight(font[3]);
+ }
+
+ if (font[4]) {
+ topic.setFontStyle(font[4]);
+ }
+ }
+
+ var bgColor = domElem.getAttribute('bgColor');
+ if ($defined(bgColor)) {
+ topic.setBackgroundColor(bgColor);
+ }
+
+ var borderColor = domElem.getAttribute('brColor');
+ if ($defined(borderColor)) {
+ topic.setBorderColor(borderColor);
+ }
+
+ var position = domElem.getAttribute('position');
+ if ($defined(position)) {
+ var pos = position.split(',');
+ topic.setPosition(pos[0], pos[1]);
+ topic.setFinalPosition(pos[0], pos[1]);
+ }
+
+ //Creating icons and children nodes
+ var children = domElem.childNodes;
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i];
+ if (child.nodeType == 1) {
+ $assert(child.tagName == "topic" || child.tagName == "icon" || child.tagName == "link" || child.tagName == "note", 'Illegal node type:' + child.tagName);
+ if (child.tagName == "topic") {
+ var childTopic = this._deserializeNode(child, mindmap);
+ childTopic.connectTo(topic);
+ } else if (child.tagName == "icon") {
+ var icon = this._deserializeIcon(child, topic);
+ topic.addIcon(icon);
+ } else if (child.tagName == "link") {
+ var link = this._deserializeLink(child, topic);
+ topic.addLink(link);
+ } else if (child.tagName == "note") {
+ var note = this._deserializeNote(child, topic);
+ topic.addNote(note);
+ }
+ }
+ }
+ ;
+ return topic;
+ },
+
+ _deserializeIcon : function(domElem, topic) {
+ return topic.createIcon(domElem.getAttribute("id"));
+ },
+
+ _deserializeLink : function(domElem, topic) {
+ return topic.createLink(domElem.getAttribute("url"));
+ },
+
+ _deserializeNote : function(domElem, topic) {
+ return topic.createNote(domElem.getAttribute("text"));
+ },
+
+ _deserializeRelationship : function(domElement, mindmap) {
+ var srcId = domElement.getAttribute("srcTopicId");
+ var destId = domElement.getAttribute("destTopicId");
+ var lineType = domElement.getAttribute("lineType");
+ var srcCtrlPoint = domElement.getAttribute("srcCtrlPoint");
+ var destCtrlPoint = domElement.getAttribute("destCtrlPoint");
+ var endArrow = domElement.getAttribute("endArrow");
+ var startArrow = domElement.getAttribute("startArrow");
+ //If for some reason a relationship lines has source and dest nodes the same, don't import it.
+ if (srcId == destId) {
+ return null;
+ }
+ var model = mindmap.createRelationship(srcId, destId);
+ model.setLineType(lineType);
+ if ($defined(srcCtrlPoint) && srcCtrlPoint != "") {
+ model.setSrcCtrlPoint(core.Point.fromString(srcCtrlPoint));
+ }
+ if ($defined(destCtrlPoint) && destCtrlPoint != "") {
+ model.setDestCtrlPoint(core.Point.fromString(destCtrlPoint));
+ }
+ model.setEndArrow(endArrow == "true");
+ model.setStartArrow(startArrow == "true");
+ return model;
+ }
+});
+
+mindplot.XMLMindmapSerializer_Pela.MAP_ROOT_NODE = 'map';/* Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+mindplot.XMLMindmapSerializer_Beta = new Class({
+
+ toXML : function(mindmap) {
+ $assert(mindmap, "Can not save a null mindmap");
+
+ var document = core.Utils.createDocument();
+
+ // Store map attributes ...
+ var mapElem = document.createElement("map");
+ var name = mindmap.getId();
+ if ($defined(name)) {
+ mapElem.setAttribute('name', name);
+ }
+ document.appendChild(mapElem);
+
+ // Create branches ...
+ var topics = mindmap.getBranches();
+ for (var i = 0; i < topics.length; i++) {
+ var topic = topics[i];
+ var topicDom = this._topicToXML(document, topic);
+ mapElem.appendChild(topicDom);
+ }
+
+ return document;
+ },
+
+ _topicToXML : function(document, topic) {
+ var parentTopic = document.createElement("topic");
+
+ // Set topic attributes...
+ if (topic.getType() == mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ parentTopic.setAttribute("central", true);
+ } else {
+ var parent = topic.getParent();
+ if (parent == null || parent.getType() == mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE) {
+ var pos = topic.getPosition();
+ parentTopic.setAttribute("position", pos.x + ',' + pos.y);
+ } else {
+ var order = topic.getOrder();
+ parentTopic.setAttribute("order", order);
+ }
+ }
+
+ var text = topic.getText();
+ if ($defined(text)) {
+ parentTopic.setAttribute('text', text);
+ }
+
+ var shape = topic.getShapeType();
+ if ($defined(shape)) {
+ parentTopic.setAttribute('shape', shape);
+ }
+
+ if (topic.areChildrenShrinked()) {
+ parentTopic.setAttribute('shrink', true);
+ }
+
+ // Font properties ...
+ var font = "";
+
+ var fontFamily = topic.getFontFamily();
+ font += (fontFamily ? fontFamily : '') + ';';
+
+ var fontSize = topic.getFontSize();
+ font += (fontSize ? fontSize : '') + ';';
+
+ var fontColor = topic.getFontColor();
+ font += (fontColor ? fontColor : '') + ';';
+
+ var fontWeight = topic.getFontWeight();
+ font += (fontWeight ? fontWeight : '') + ';';
+
+ var fontStyle = topic.getFontStyle();
+ font += (fontStyle ? fontStyle : '') + ';';
+
+ if ($defined(fontFamily) || $defined(fontSize) || $defined(fontColor)
+ || $defined(fontWeight) || $defined(fontStyle)) {
+ parentTopic.setAttribute('fontStyle', font);
+ }
+
+ var bgColor = topic.getBackgroundColor();
+ if ($defined(bgColor)) {
+ parentTopic.setAttribute('bgColor', bgColor);
+ }
+
+ var brColor = topic.getBorderColor();
+ if ($defined(brColor)) {
+ parentTopic.setAttribute('brColor', brColor);
+ }
+
+ //ICONS
+ var icons = topic.getIcons();
+ for (var i = 0; i < icons.length; i++) {
+ var icon = icons[i];
+ var iconDom = this._iconToXML(document, icon);
+ parentTopic.appendChild(iconDom);
+ }
+
+ //LINKS
+ var links = topic.getLinks();
+ for (var i = 0; i < links.length; i++) {
+ var link = links[i];
+ var linkDom = this._linkToXML(document, link);
+ parentTopic.appendChild(linkDom);
+ }
+
+ var notes = topic.getNotes();
+ for (var i = 0; i < notes.length; i++) {
+ var note = notes[i];
+ var noteDom = this._noteToXML(document, note);
+ parentTopic.appendChild(noteDom);
+ }
+
+ //CHILDREN TOPICS
+ var childTopics = topic.getChildren();
+ for (var i = 0; i < childTopics.length; i++) {
+ var childTopic = childTopics[i];
+ var childDom = this._topicToXML(document, childTopic);
+ parentTopic.appendChild(childDom);
+
+ }
+
+ return parentTopic;
+ },
+
+ _iconToXML : function(document, icon) {
+ var iconDom = document.createElement("icon");
+ iconDom.setAttribute('id', icon.getIconType());
+ return iconDom;
+ },
+
+ _linkToXML : function(document, link) {
+ var linkDom = document.createElement("link");
+ linkDom.setAttribute('url', link.getUrl());
+ return linkDom;
+ },
+
+ _noteToXML : function(document, note) {
+ var noteDom = document.createElement("note");
+ noteDom.setAttribute('text', note.getText());
+ return noteDom;
+ },
+
+ loadFromDom : function(dom) {
+ $assert(dom, "Dom can not be null");
+ var rootElem = dom.documentElement;
+
+ // Is a wisemap?.
+ $assert(rootElem.tagName == mindplot.XMLMindmapSerializer_Beta.MAP_ROOT_NODE, "This seem not to be a map document.");
+
+ // Start the loading process ...
+ var mindmap = new mindplot.model.Mindmap();
+
+ var children = rootElem.childNodes;
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i];
+ if (child.nodeType == 1) {
+ var topic = this._deserializeNode(child, mindmap);
+ mindmap.addBranch(topic);
+ }
+ }
+ return mindmap;
+ },
+
+ _deserializeNode : function(domElem, mindmap) {
+ var type = (domElem.getAttribute('central') != null) ? mindplot.model.NodeModel.CENTRAL_TOPIC_TYPE : mindplot.model.NodeModel.MAIN_TOPIC_TYPE;
+ var topic = mindmap.createNode(type);
+
+ // Load attributes...
+ var text = domElem.getAttribute('text');
+ if ($defined(text)) {
+ topic.setText(text);
+ }
+
+ var order = domElem.getAttribute('order');
+ if ($defined(order)) {
+ topic.setOrder(order);
+ }
+
+ var shape = domElem.getAttribute('shape');
+ if ($defined(shape)) {
+ topic.setShapeType(shape);
+ }
+
+ var isShrink = domElem.getAttribute('shrink');
+ if ($defined(isShrink)) {
+ topic.setChildrenShrinked(isShrink);
+ }
+
+ var fontStyle = domElem.getAttribute('fontStyle');
+ if ($defined(fontStyle)) {
+ var font = fontStyle.split(';');
+
+ if (font[0]) {
+ topic.setFontFamily(font[0]);
+ }
+
+ if (font[1]) {
+ topic.setFontSize(font[1]);
+ }
+
+ if (font[2]) {
+ topic.setFontColor(font[2]);
+ }
+
+ if (font[3]) {
+ topic.setFontWeight(font[3]);
+ }
+
+ if (font[4]) {
+ topic.setFontStyle(font[4]);
+ }
+ }
+
+ var bgColor = domElem.getAttribute('bgColor');
+ if ($defined(bgColor)) {
+ topic.setBackgroundColor(bgColor);
+ }
+
+ var borderColor = domElem.getAttribute('brColor');
+ if ($defined(borderColor)) {
+ topic.setBorderColor(borderColor);
+ }
+
+ var position = domElem.getAttribute('position');
+ if ($defined(position)) {
+ var pos = position.split(',');
+ topic.setPosition(pos[0], pos[1]);
+ }
+
+ //Creating icons and children nodes
+ var children = domElem.childNodes;
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i];
+ if (child.nodeType == 1) {
+ $assert(child.tagName == "topic" || child.tagName == "icon" || child.tagName == "link" || child.tagName == "note", 'Illegal node type:' + child.tagName);
+ if (child.tagName == "topic") {
+ var childTopic = this._deserializeNode(child, mindmap);
+ childTopic.connectTo(topic);
+ } else if (child.tagName == "icon") {
+ var icon = this._deserializeIcon(child, topic);
+ topic.addIcon(icon);
+ } else if (child.tagName == "link") {
+ var link = this._deserializeLink(child, topic);
+ topic.addLink(link);
+ } else if (child.tagName == "note") {
+ var note = this._deserializeNote(child, topic);
+ topic.addNote(note);
+ }
+ }
+ }
+
+ return topic;
+ },
+
+ _deserializeIcon : function(domElem, topic) {
+ return topic.createIcon(domElem.getAttribute("id"));
+ },
+
+ _deserializeLink : function(domElem, topic) {
+ return topic.createLink(domElem.getAttribute("url"));
+ },
+
+ _deserializeNote : function(domElem, topic) {
+ return topic.createNote(domElem.getAttribute("text"));
+ }});
+
+mindplot.XMLMindmapSerializer_Beta.MAP_ROOT_NODE = 'map';/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+mindplot.Beta2PelaMigrator = new Class({
+ initialize : function(betaSerializer) {
+ this._betaSerializer = betaSerializer;
+ this._pelaSerializer = new mindplot.XMLMindmapSerializer_Pela();
+ },
+
+ toXML : function(mindmap) {
+ return this._pelaSerializer.toXML(mindmap);
+ },
+
+ loadFromDom : function(dom) {
+ var mindmap = this._betaSerializer.loadFromDom(dom);
+ mindmap.setVersion(mindplot.ModelCodeName.PELA);
+ return mindmap;
+ }
+});
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+mindplot.XMLMindmapSerializerFactory = {};
+
+mindplot.XMLMindmapSerializerFactory.getSerializerFromMindmap = function(mindmap) {
+ return mindplot.XMLMindmapSerializerFactory.getSerializer(mindmap.getVersion());
+};
+
+mindplot.XMLMindmapSerializerFactory.getSerializerFromDocument = function(domDocument) {
+ var rootElem = domDocument.documentElement;
+ return mindplot.XMLMindmapSerializerFactory.getSerializer(rootElem.getAttribute("version"))
+};
+
+
+mindplot.XMLMindmapSerializerFactory.getSerializer = function(version) {
+ if (!$defined(version)) {
+ version = mindplot.ModelCodeName.BETA;
+ }
+ var codeNames = mindplot.XMLMindmapSerializerFactory._codeNames;
+ var found = false;
+ var serializer = null;
+ for (var i = 0; i < codeNames.length; i++) {
+ if (!found) {
+ found = codeNames[i].codeName == version;
+ if (found)
+ serializer = new (codeNames[i].serializer)();
+ } else {
+ var migrator = codeNames[i].migrator;
+ serializer = new migrator(serializer);
+ }
+ }
+
+ return serializer;
+};
+
+mindplot.XMLMindmapSerializerFactory._codeNames =
+ [
+ {
+ codeName:mindplot.ModelCodeName.BETA,
+ serializer: mindplot.XMLMindmapSerializer_Beta,
+ migrator:function() {//todo:error
+ }
+ },
+ {
+ codeName:mindplot.ModelCodeName.PELA,
+ serializer:mindplot.XMLMindmapSerializer_Pela,
+ migrator:mindplot.Beta2PelaMigrator
+ }
+ ];/*
+* Copyright [2011] [wisemapping]
+*
+* Licensed under WiseMapping Public License, Version 1.0 (the "License").
+* It is basically the Apache License, Version 2.0 (the "License") plus the
+* "powered by wisemapping" text requirement on every single page;
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the license at
+*
+* http://www.wisemapping.org/license
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+mindplot.PersistanceManager = {};
+
+mindplot.PersistanceManager.save = function(mindmap, editorProperties, onSavedHandler,saveHistory)
+{
+ $assert(mindmap, "mindmap can not be null");
+ $assert(editorProperties, "editorProperties can not be null");
+
+ var mapId = mindmap.getId();
+
+ var serializer = mindplot.XMLMindmapSerializerFactory.getSerializerFromMindmap(mindmap);
+ var xmlMap = serializer.toXML(mindmap);
+ var xmlMapStr = core.Utils.innerXML(xmlMap);
+
+ var pref = JSON.toString(editorProperties);
+ window.MapEditorService.saveMap(mapId, xmlMapStr, pref,saveHistory,
+ {
+ callback:function(response) {
+
+ if (response.msgCode != "OK")
+ {
+ monitor.logError("Save could not be completed. Please,try again in a couple of minutes.");
+ wLogger.error(response.msgDetails);
+ } else
+ {
+ // Execute on success handler ...
+ if ($defined(onSavedHandler))
+ {
+ onSavedHandler();
+ }
+ }
+ },
+ errorHandler:function(message) {
+ var monitor = core.Monitor.getInstance();
+ monitor.logError("Save could not be completed. Please,try again in a couple of minutes.");
+ wLogger.error(message);
+ },
+ verb:"POST",
+ async: false
+ });
+
+};
+
+mindplot.PersistanceManager.load = function(mapId)
+{
+ $assert(mapId, "mapId can not be null");
+
+ var result = {r:null};
+ window.MapEditorService.loadMap(mapId, {
+ callback:function(response) {
+
+ if (response.msgCode == "OK")
+ {
+ // Explorer Hack with local files ...
+ var xmlContent = response.content;
+ var domDocument = core.Utils.createDocumentFromText(xmlContent);
+ var serializer = mindplot.XMLMindmapSerializerFactory.getSerializerFromDocument(domDocument);
+ var mindmap = serializer.loadFromDom(domDocument);
+ mindmap.setId(mapId);
+
+ result.r = mindmap;
+ } else
+ {
+ // Handle error message ...
+ var msg = response.msgDetails;
+ var monitor = core.Monitor.getInstance();
+ monitor.logFatal("We're sorry, an error has occurred and we can't load your map. Please try again in a few minutes.");
+ wLogger.error(msg);
+ }
+ },
+ verb:"GET",
+ async: false,
+ errorHandler:function(msg) {
+ var monitor = core.Monitor.getInstance();
+ monitor.logFatal("We're sorry, an error has occurred and we can't load your map. Please try again in a few minutes.");
+ wLogger.error(msg);
+ }
+ });
+
+ return result.r;
+};
+
+
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.EditorProperties = new Class({
+ initialize:function() {
+ this._zoom = 0;
+ this._position = 0;
+ },
+
+ setZoom : function(zoom) {
+ this._zoom = zoom;
+ },
+
+ getZoom : function() {
+ return this._zoom;
+ },
+
+ asProperties : function() {
+ return "zoom=" + this._zoom + "\n";
+ }
+});
+
+
+
+
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.IconGroup = new Class({
+ initialize : function(topic) {
+ var offset = topic.getOffset();
+
+ this.options = {
+ width:0,
+ height:0,
+ x:offset.x / 2,
+ y:offset.y,
+ icons:[],
+ topic:topic,
+ nativeElem:new web2d.Group({width: 2, height:2,x: offset, y:offset, coordSizeWidth:1,coordSizeHeight:1})
+ };
+ this.updateIconGroupPosition();
+ this.registerListeners();
+ },
+
+ setPosition : function(x, y) {
+ this.options.x = x;
+ this.options.y = y;
+ this.options.nativeElem.setPosition(x, y);
+ },
+
+ getPosition : function() {
+ return {x:this.options.x, y:this.options.y};
+ },
+
+ setSize : function(width, height) {
+ this.options.width = width;
+ this.options.height = height;
+ this.options.nativeElem.setSize(width, height);
+ this.options.nativeElem.setCoordSize(width, height);
+ },
+
+ getSize : function() {
+ return {width:this.options.width, height:this.options.height};
+ },
+
+ addIcon : function(icon) {
+ icon.setGroup(this);
+ var newIcon = icon.getImage();
+ var nativeElem = this.options.nativeElem;
+ var iconSize = newIcon.getSize();
+ var size = nativeElem.getSize();
+ newIcon.setPosition(size.width, 0);
+ this.options.icons.extend([icon]);
+
+ nativeElem.appendChild(newIcon);
+
+ size.width = size.width + iconSize.width;
+ if (iconSize.height > size.height) {
+ size.height = iconSize.height;
+ }
+
+ nativeElem.setCoordSize(size.width, size.height);
+ nativeElem.setSize(size.width, size.height);
+ this.options.width = size.width;
+ this.options.height = size.height;
+ },
+
+ getIcons : function() {
+ return this.options.icons;
+ },
+
+ removeIcon : function(url) {
+ this._removeIcon(this.getIcon(url));
+ },
+
+ removeImageIcon : function(icon) {
+
+ var imgIcon = this.getImageIcon(icon);
+ this._removeIcon(imgIcon);
+ },
+
+ getIcon : function(url) {
+ var result = null;
+ this.options.icons.each(function(el, index) {
+ var nativeImage = el.getImage();
+ if (nativeImage.getHref() == url) {
+ result = el;
+ }
+ }, this);
+ return result;
+ },
+
+ getImageIcon : function(icon) {
+ var result = null;
+ this.options.icons.each(function(el, index) {
+ if (result == null && $defined(el.getModel().isIconModel) && el.getId() == icon.getId() && el.getUiId() == icon.getUiId()) {
+ result = el;
+ }
+ }, this);
+ return result;
+ },
+
+ findIconFromModel : function(iconModel) {
+ var result = null;
+ this.options.icons.each(function(el, index) {
+ var elModel = el.getModel();
+ if (result == null && $defined(elModel.isIconModel) && elModel.getId() == iconModel.getId()) {
+ result = el;
+ }
+ }, this);
+
+ if (result == null) {
+ throw "Icon can no be found.";
+ }
+
+ return result;
+ },
+
+ _removeIcon : function(icon) {
+ var nativeImage = icon.getImage();
+ this.options.icons.erase(icon);
+ var iconSize = nativeImage.getSize();
+ var size = this.options.nativeElem.getSize();
+ var position = nativeImage.getPosition();
+ var childs = this.options.nativeElem.removeChild(nativeImage);
+ this.options.icons.each(function(icon, index) {
+ var img = icon.getImage();
+ var pos = img.getPosition();
+ if (pos.x > position.x) {
+ img.setPosition(pos.x - iconSize.width, 0);
+ }
+ }.bind(this));
+ size.width = size.width - iconSize.width;
+ this.setSize(size.width, size.height);
+ },
+
+ getNativeElement : function() {
+ return this.options.nativeElem;
+ },
+
+ moveToFront : function() {
+ this.options.nativeElem.moveToFront();
+ },
+
+ registerListeners : function() {
+ this.options.nativeElem.addEventListener('click', function(event) {
+ // Avoid node creation ...
+ if ($defined(event.stopPropagation)) {
+ event.stopPropagation(true);
+ } else {
+ event.cancelBubble = true;
+ }
+
+ });
+ this.options.nativeElem.addEventListener('dblclick', function(event) {
+ // Avoid node creation ...
+ if ($defined(event.stopPropagation)) {
+ event.stopPropagation(true);
+ } else {
+ event.cancelBubble = true;
+ }
+
+ });
+ },
+
+ getTopic : function() {
+ return this.options.topic;
+ },
+
+ updateIconGroupPosition : function() {
+ var offsets = this._calculateOffsets();
+ this.setPosition(offsets.x, offsets.y);
+ },
+
+ _calculateOffsets : function() {
+ var offset = this.options.topic.getOffset();
+ var text = this.options.topic.getTextShape();
+ var sizeHeight = text.getHtmlFontSize();
+ var yOffset = offset;
+ var shape = this.options.topic.getShapeType();
+ yOffset = text.getPosition().y + (sizeHeight - 18) / 2 + 1;
+ return {x:offset, y:yOffset};
+ }
+});/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.BubbleTip = new Class({
+ initialize : function(divContainer) {
+ this.options = {
+ panel:null,
+ container:null,
+ divContainer:divContainer,
+ content:null,
+ onShowComplete:Class.empty,
+ onHideComplete:Class.empty,
+ width:null,
+ height:null,
+ form:null
+ };
+ if ($defined(this.options.form))
+ this.scanElements(this.options.form);
+ this.buildBubble();
+ this._isMouseOver = false;
+ this._open = false;
+ },
+ scanElements : function(form) {
+ $$($(form).getElements('a')).each(function(el) {
+ if (el.href && el.hasClass('bubble') && !el.onclick) {
+ el.addEvent('mouseover', this.click.bindWithEvent(this, el));
+ }
+ }, this);
+ },
+ buildBubble : function() {
+ var opts = this.options;
+
+ var panel = new Element('div').addClass('bubbleContainer');
+ if ($defined(opts.height))
+ panel.setStyle('height', opts.height);
+ if ($defined(opts.width))
+ panel.setStyle('width', opts.width);
+
+ this.center = new Element('div').addClass('bubblePart').addClass('bubbleCenterBlue');
+ this.center.inject(panel);
+ if (!$defined(opts.divContainer)) {
+ opts.divContainer = document.body;
+ }
+ panel.injectTop(opts.divContainer);
+ opts.panel = $(panel);
+ opts.panel.setStyle('opacity', 0);
+ opts.panel.addEvent('mouseover', function() {
+ this._isMouseOver = true;
+ }.bind(this));
+ opts.panel.addEvent('mouseleave', function(event) {
+ this.close(event);
+ }.bindWithEvent(this));//this.close.bindWithEvent(this)
+
+ },
+ click : function(event, el) {
+ return this.open(event, el);
+ },
+ open : function(event, content, source) {
+ this._isMouseOver = true;
+ this._evt = new Event(event);
+ this.doOpen.delay(500, this, [content,source]);
+ },
+ doOpen : function(content, source) {
+ if ($defined(this._isMouseOver) && !$defined(this._open) && !$defined(this._opening)) {
+ this._opening = true;
+ var container = new Element('div');
+ $(content).inject(container);
+ this.options.content = content;
+ this.options.container = container;
+ $(this.options.container).inject(this.center);
+ this.init(this._evt, source);
+ $(this.options.panel).effect('opacity', {duration:500, onComplete:function() {
+ this._open = true;
+ this._opening = false;
+ }.bind(this)}).start(0, 100);
+ }
+ },
+ updatePosition : function(event) {
+ this._evt = new Event(event);
+ },
+ close : function(event) {
+ this._isMouseOver = false;
+ this.doClose.delay(50, this, new Event(event));
+ },
+ doClose : function(event) {
+
+ if (!$defined(this._isMouseOver) && $defined(this._opening))
+ this.doClose.delay(500, this, this._evt);
+
+ if (!$defined(this._isMouseOver) && $defined(this._open)) {
+ this.forceClose();
+ }
+ },
+ forceClose : function() {
+ this.options.panel.effect('opacity', {duration:100, onComplete:function() {
+ this._open = false;
+ $(this.options.panel).setStyles({left:0,top:0});
+ $(this.options.container).remove();
+ }.bind(this)}).start(100, 0);
+ },
+ init : function(event, source) {
+ var opts = this.options;
+ var coordinates = $(opts.panel).getCoordinates();
+ var panelHeight = coordinates.height; //not total height, but close enough
+ var panelWidth = coordinates.width; //not total height, but close enough
+
+ var offset = designer.getWorkSpace().getScreenManager().getWorkspaceIconPosition(source);
+
+ var containerCoords = $(opts.divContainer).getCoordinates();
+ var screenWidth = containerCoords.width;
+ var screenHeight = containerCoords.height;
+
+ var width = $(this.center).getCoordinates().width;
+
+ var invert = !(offset.y > panelHeight); //hint goes on the bottom
+ var invertX = (screenWidth - offset.x > panelWidth); // hint goes on the right
+ $(this.options.panel).remove();
+ this.buildBubble();
+ $(this.options.container).inject(this.center);
+
+ var height = $(this.center).getCoordinates().height;
+ $(opts.panel).setStyles({width:width,height:height});
+ this.moveTopic(offset, $(opts.panel).getCoordinates().height, $(opts.panel).getCoordinates().width, invert, invertX);
+ },
+ moveTopic : function(offset, panelHeight, panelWidth, invert, invertX) {
+ var f = 1, fX = 1;
+ if ($defined(invert))
+ f = 0;
+ if ($defined(invertX))
+ fX = 0;
+ var opts = this.options;
+ $(opts.panel).setStyles({left:offset.x - (panelWidth * fX), top:offset.y - (panelHeight * f)});
+ }
+
+});
+
+mindplot.BubbleTip.getInstance = function(divContainer) {
+ var result = mindplot.BubbleTip.instance;
+ if (!$defined(result)) {
+ mindplot.BubbleTip.instance = new mindplot.BubbleTip(divContainer);
+ result = mindplot.BubbleTip.instance;
+ }
+ return result;
+}
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.Tip = new Class({
+ initialize:function(divContainer) {
+ this.options = {
+ panel:null,
+ container:null,
+ divContainer:divContainer,
+ content:null,
+ onShowComplete:Class.empty,
+ onHideComplete:Class.empty,
+ width:null,
+ height:null,
+ form:null
+ };
+ this.buildTip();
+ this._isMouseOver = false;
+ this._open = false;
+ },
+
+ buildTip : function() {
+ var opts = this.options;
+ var panel = new Element('div').addClass('bubbleContainer');
+ if ($defined(opts.height))
+ panel.setStyle('height', opts.height);
+ if ($defined(opts.width))
+ panel.setStyle('width', opts.width);
+ if (!$defined(opts.divContainer)) {
+ opts.divContainer = document.body;
+ }
+ panel.injectTop(opts.divContainer);
+ opts.panel = $(panel);
+ opts.panel.setStyle('opacity', 0);
+ opts.panel.addEvent('mouseover', function() {
+ this._isMouseOver = true;
+ }.bind(this));
+ opts.panel.addEvent('mouseleave', function(event) {
+ this.close(event);
+ }.bindWithEvent(this));//this.close.bindWithEvent(this)
+
+ },
+
+ click : function(event, el) {
+ return this.open(event, el);
+ },
+
+ open : function(event, content, source) {
+ this._isMouseOver = true;
+ this._evt = new Event(event);
+ this.doOpen.delay(500, this, [content,source]);
+ },
+
+ doOpen : function(content, source) {
+ if ($defined(this._isMouseOver) && !$defined(this._open) && !$defined(this._opening)) {
+ this._opening = true;
+ var container = new Element('div');
+ $(content).inject(container);
+ this.options.content = content;
+ this.options.container = container;
+ $(this.options.container).inject(this.options.panel);
+ this.init(this._evt, source);
+ $(this.options.panel).effect('opacity', {duration:500, onComplete:function() {
+ this._open = true;
+ this._opening = false;
+ }.bind(this)}).start(0, 100);
+ }
+ },
+
+ updatePosition : function(event) {
+ this._evt = new Event(event);
+ },
+
+ close : function(event) {
+ this._isMouseOver = false;
+ this.doClose.delay(50, this, new Event(event));
+ },
+
+ doClose : function(event) {
+
+ if (!$defined(this._isMouseOver) && $defined(this._opening))
+ this.doClose.delay(500, this, this._evt);
+
+ if (!$defined(this._isMouseOver) && $defined(this._open)) {
+ this.forceClose();
+ }
+ },
+
+ forceClose : function() {
+ this.options.panel.effect('opacity', {duration:100, onComplete:function() {
+ this._open = false;
+ $(this.options.panel).setStyles({left:0,top:0});
+ $(this.options.container).dispose();
+ }.bind(this)}).start(100, 0);
+ },
+
+ init : function(event, source) {
+ var opts = this.options;
+ var coordinates = $(opts.panel).getCoordinates();
+ var width = coordinates.width; //not total width, but close enough
+ var height = coordinates.height; //not total height, but close enough
+
+ var offset = designer.getWorkSpace().getScreenManager().getWorkspaceIconPosition(source);
+
+ var containerCoords = $(opts.divContainer).getCoordinates();
+ var screenWidth = containerCoords.width;
+ var screenHeight = containerCoords.height;
+
+ $(this.options.panel).dispose();
+ this.buildTip();
+ $(this.options.container).inject(this.options.panel);
+ this.moveTopic(offset, $(opts.panel).getCoordinates().height);
+ },
+
+ moveTopic : function(offset, panelHeight) {
+ var opts = this.options;
+ var width = $(opts.panel).getCoordinates().width;
+ $(opts.panel).setStyles({left:offset.x - (width / 2), top:offset.y - (panelHeight * 2) + 35});
+ }
+
+});
+
+mindplot.Tip.getInstance = function(divContainer) {
+ var result = mindplot.Tip.instance;
+ if (!$defined(result)) {
+ mindplot.Tip.instance = new mindplot.Tip(divContainer);
+ result = mindplot.Tip.instance;
+ }
+ return result;
+}/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.Icon = new Class({
+ initialize:function(url) {
+ $assert(url, 'topic can not be null');
+ this._image = new web2d.Image();
+ this._image.setHref(url);
+ this._image.setSize(12, 12);
+ },
+
+ getImage : function() {
+ return this._image;
+ },
+
+ setGroup : function(group) {
+ this._group = group;
+ },
+
+ getGroup : function() {
+ return this._group;
+ },
+
+ getSize : function() {
+ return this._image.getSize();
+ }
+});
+
+
+/*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.LinkIcon = new Class({
+
+ Extends:mindplot.Icon,
+ initialize:function(urlModel, topic, designer) {
+ $assert(urlModel, "urlModel can not be null");
+ $assert(designer, "designer can not be null");
+ $assert(topic, "topic can not be null");
+
+ this.parent(mindplot.LinkIcon.IMAGE_URL);
+
+ var divContainer = designer.getWorkSpace().getScreenManager().getContainer();
+ var bubbleTip = mindplot.BubbleTip.getInstance(divContainer);
+
+ this._linkModel = urlModel;
+ this._topic = topic;
+ this._designer = designer;
+ var image = this.getImage();
+ var imgContainer = new Element('div').setStyles({textAlign:'center', cursor:'pointer'});
+ this._img = new Element('img');
+ var url = urlModel.getUrl();
+ this._img.src = 'http://open.thumbshots.org/image.pxf?url=' + url;
+
+ if (url.indexOf('http:') == -1) {
+ url = 'http://' + url;
+ }
+ this._img.alt = url;
+ this._url = url;
+ var openWindow = function() {
+ var wOpen;
+ var sOptions;
+
+ sOptions = 'status=yes,menubar=yes,scrollbars=yes,resizable=yes,toolbar=yes';
+ sOptions = sOptions + ',width=' + (screen.availWidth - 10).toString();
+ sOptions = sOptions + ',height=' + (screen.availHeight - 122).toString();
+ sOptions = sOptions + ',screenX=0,screenY=0,left=0,top=0';
+ var url = this._img.alt;
+ wOpen = window.open(url, "link", "width=100px, height=100px");
+ wOpen.focus();
+ wOpen.moveTo(0, 0);
+ wOpen.resizeTo(screen.availWidth, screen.availHeight);
+ };
+
+ this._img.addEvent('click', openWindow.bindWithEvent(this));
+ this._img.inject(imgContainer);
+
+ var attribution = new Element('div').setStyles({fontSize:10, textAlign:"center"});
+ attribution.innerHTML = "About Thumbshots thumbnails";
+
+ var container = new Element('div');
+ var element = new Element('div').setStyles({borderBottom:'1px solid #e5e5e5'});
+
+ var title = new Element('div').setStyles({fontSize:12, textAlign:'center'});
+ this._link = new Element('span');
+ this._link.href = url;
+ this._link.innerHTML = url;
+ this._link.setStyle("text-decoration", "underline");
+ this._link.setStyle("cursor", "pointer");
+ this._link.inject(title);
+ this._link.addEvent('click', openWindow.bindWithEvent(this));
+ title.inject(element);
+
+ imgContainer.inject(element);
+ attribution.inject(element);
+ element.inject(container);
+
+ if (!$defined(designer._viewMode) || ($defined(designer._viewMode) && !designer._viewMode)) {
+ var buttonContainer = new Element('div').setStyles({paddingTop:5, textAlign:'center'});
+ var editBtn = new Element('input', {type:'button', 'class':'btn-primary', value:'Edit'}).addClass('button').inject(buttonContainer);
+ var removeBtn = new Element('input', {type:'button', value:'Remove','class':'btn-primary'}).addClass('button').inject(buttonContainer);
+
+ editBtn.setStyle("margin-right", "3px");
+ removeBtn.setStyle("margin-left", "3px");
+
+ removeBtn.addEvent('click', function(event) {
+ var command = new mindplot.commands.RemoveLinkFromTopicCommand(this._topic.getId());
+ designer._actionRunner.execute(command);
+ bubbleTip.forceClose();
+ }.bindWithEvent(this));
+
+ var okButtonId = 'okLinkButtonId';
+ editBtn.addEvent('click', function(event) {
+ var topic = this._topic;
+ var designer = this._designer;
+ var link = this;
+ var okFunction = function(e) {
+ var result = false;
+ var url = urlInput.value;
+ if ("" != url.trim()) {
+ link._img.src = 'http://open.thumbshots.org/image.pxf?url=' + url;
+ link._img.alt = url;
+ link._link.href = url;
+ link._link.innerHTML = url;
+ this._linkModel.setUrl(url);
+ result = true;
+ }
+ return result;
+ };
+ var msg = new Element('div');
+ var urlText = new Element('div').inject(msg);
+ urlText.innerHTML = "URL:";
+
+ var formElem = new Element('form', {'action': 'none', 'id':'linkFormId'});
+ var urlInput = new Element('input', {'type': 'text', 'size':30,'value':url});
+ urlInput.inject(formElem);
+ formElem.inject(msg);
+
+ formElem.addEvent('submit', function(e) {
+ $(okButtonId).fireEvent('click', e);
+ e = new Event(e);
+ e.stop();
+ });
+
+
+ var dialog = mindplot.LinkIcon.buildDialog(designer, okFunction, okButtonId);
+ dialog.adopt(msg).show();
+
+ }.bindWithEvent(this));
+ buttonContainer.inject(container);
+ }
+
+ var linkIcon = this;
+ image.addEventListener('mouseover', function(event) {
+ bubbleTip.open(event, container, linkIcon);
+ });
+ image.addEventListener('mousemove', function(event) {
+ bubbleTip.updatePosition(event);
+ });
+ image.addEventListener('mouseout', function(event) {
+ bubbleTip.close(event);
+ });
+ },
+
+ getUrl : function() {
+ return this._url;
+ },
+
+ getModel : function() {
+ return this._linkModel;
+ }
+});
+
+mindplot.LinkIcon.buildDialog = function(designer, okFunction, okButtonId) {
+ var windoo = new Windoo({
+ title: 'Write link URL',
+ theme: Windoo.Themes.wise,
+ modal:true,
+ buttons:{'menu':false, 'close':false, 'minimize':false, 'roll':false, 'maximize':false},
+ destroyOnClose:true,
+ height:130
+ });
+
+ var cancel = new Element('input', {'type': 'button', 'class':'btn-primary', 'value': 'Cancel'}).setStyle('margin-right', "5px");
+ cancel.setStyle('margin-left', "5px");
+ cancel.addEvent('click', function(event) {
+ $(document).addEvent('keydown', designer.keyEventHandler.bindWithEvent(designer));
+ windoo.close();
+ }.bindWithEvent(this));
+
+ var ok = new Element('input', {'type': 'button', 'class':'btn-primary','value': 'Ok','id':okButtonId}).setStyle('marginRight', 10);
+ ok.addEvent('click', function(event) {
+ var couldBeUpdated = okFunction.attempt();
+ if (couldBeUpdated) {
+ $(document).addEvent('keydown', designer.keyEventHandler.bindWithEvent(designer));
+ windoo.close();
+ }
+ }.bindWithEvent(this));
+
+ var panel = new Element('div', {'styles': {'padding-top': 10, 'text-align': 'right'}}).adopt(ok, cancel);
+
+ windoo.addPanel(panel);
+ $(document).removeEvents('keydown');
+ return windoo;
+};
+
+mindplot.LinkIcon.IMAGE_URL = "../images/world_link.png";
+
+ /*
+ * Copyright [2011] [wisemapping]
+ *
+ * Licensed under WiseMapping Public License, Version 1.0 (the "License").
+ * It is basically the Apache License, Version 2.0 (the "License") plus the
+ * "powered by wisemapping" text requirement on every single page;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the license at
+ *
+ * http://www.wisemapping.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+mindplot.Note = new Class({
+ Extends: mindplot.Icon,
+ initialize : function(textModel, topic, designer) {
+ var divContainer = designer.getWorkSpace().getScreenManager().getContainer();
+ var bubbleTip = mindplot.BubbleTip.getInstance(divContainer);
+ mindplot.Icon.call(this, mindplot.Note.IMAGE_URL);
+ this._noteModel = textModel;
+ this._topic = topic;
+ this._designer = designer;
+ var image = this.getImage();
+ var imgContainer = new Element('div').setStyles({textAlign:'center'});
+ this._textElem = new Element('div').setStyles({'max-height':100,'max-width':300, 'overflow':'auto'});
+ var text = unescape(textModel.getText());
+ text = text.replace(/\n/ig, "
");
+ text = text.replace(/");
+ text = text.replace(/