wisemapping-open-source/web2d/src/main/javascript/peer/svg/ArrowPeer.js

99 lines
3.0 KiB
JavaScript

/*
* Copyright [2011] [wisemapping]
*
* Licensed under 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.
*/
web2d.peer.svg.ArrowPeer = function()
{
var svgElement = window.document.createElementNS(this.svgNamespace, 'path');
web2d.peer.svg.ElementPeer.call(this, svgElement);
this._style={};
this._controlPoint=new core.Point();
this._fromPoint = new core.Point();
};
objects.extend(web2d.peer.svg.ArrowPeer, web2d.peer.svg.ElementPeer);
web2d.peer.svg.ArrowPeer.prototype.setFrom = function(x,y)
{
this._fromPoint.x = x;
this._fromPoint.y = y;
this._redraw();
};
web2d.peer.svg.ArrowPeer.prototype.setControlPoint = function (point)
{
this._controlPoint = point;
this._redraw();
};
web2d.peer.svg.ArrowPeer.prototype.setStrokeColor = function (color)
{
this.setStroke(null,null,color, null);
};
web2d.peer.svg.ArrowPeer.prototype.setStrokeWidth = function(width)
{
this.setStroke(width);
};
web2d.peer.svg.ArrowPeer.prototype.setDashed = function(isDashed, length, spacing){
if(core.Utils.isDefined(isDashed) && isDashed && core.Utils.isDefined(length) && core.Utils.isDefined(spacing)){
this._native.setAttribute("stroke-dasharray",length+","+spacing);
} else {
this._native.setAttribute("stroke-dasharray","");
}
};
web2d.peer.svg.ArrowPeer.prototype._updateStyle = function()
{
var style = "";
for(var key in this._style){
style+=key+":"+this._style[key]+" ";
}
this._native.setAttribute("style",style);
};
web2d.peer.svg.ArrowPeer.prototype._redraw = function()
{
var x,y, xp, yp;
if(this._controlPoint.y == 0)
this._controlPoint.y=1;
var y0 = this._controlPoint.y;
var x0 = this._controlPoint.x;
var x2=x0+y0;
var y2 = y0-x0;
var x3 = x0-y0;
var y3 = y0+x0;
var m = y2/x2;
var mp = y3/x3;
var l = 6;
var pow = Math.pow;
x = (x2==0?0:Math.sqrt(pow(l,2)/(1+pow(m,2))));
x *=Math.sign(x2);
y = (x2==0?l*Math.sign(y2):m*x);
xp = (x3==0?0:Math.sqrt(pow(l,2)/(1+pow(mp,2))));
xp *=Math.sign(x3);
yp = (x3==0?l*Math.sign(y3):mp*xp);
var path = "M"+this._fromPoint.x+","+this._fromPoint.y+" "
+"L"+(x+this._fromPoint.x)+","+(y+this._fromPoint.y)
+"M"+this._fromPoint.x+","+this._fromPoint.y+" "
+"L"+(xp+this._fromPoint.x)+","+(yp+this._fromPoint.y)
;
this._native.setAttribute("d",path);
};