219 lines
7.1 KiB
JavaScript

function GraphDrawer(listener)
{
this.graph = null;
this.canvasInfo = null;
this.handler = null;
this.listener = listener;
}
GraphDrawer.prototype._RedrawGraph = function(context, graph, canvasInfo, handler, backgroundPosition, backgroundStyle,
forceVertexCommon, forceVertexSelected, forceEdgeCommon, forceEdgeSelected)
{
this.graph = graph;
this.canvasInfo = canvasInfo;
this.handler = handler;
var backgroundDrawer = new BaseBackgroundDrawer(context);
backgroundDrawer.Draw(
backgroundStyle,
Math.max(this.canvasInfo.width, this.GetRealWidth()),
Math.max(this.canvasInfo.height, this.GetRealHeight()),
backgroundPosition,
this.canvasInfo.Scale);
this.UpdateEdgesCurrentStyle(forceEdgeCommon, forceEdgeSelected);
this.UpdateNodesCurrentStyle(forceVertexCommon, forceVertexSelected);
this.RedrawEdges(context);
this.RedrawNodes(context);
}
GraphDrawer.prototype.UpdateEdgesCurrentStyle = function(ForceCommonStyle, ForceSelectedStyle)
{
for (i = 0; i < this.graph.edges.length; i ++)
{
this.UpdateEdgeCurrentStyle(this.graph.edges[i], ForceCommonStyle, ForceSelectedStyle);
}
}
GraphDrawer.prototype.UpdateNodesCurrentStyle = function(ForceCommonStyle, ForceSelectedStyle)
{
var force = ForceCommonStyle !== undefined || ForceSelectedStyle !== undefined;
var commonStyle = (ForceCommonStyle === undefined) ? this.vertexCommonStyle : ForceCommonStyle;
var selectedStyle = (ForceSelectedStyle === undefined) ? this.vertexSelectedVertexStyles : ForceSelectedStyle;
for (i = 0; i < this.graph.vertices.length; i ++)
{
var selectedGroup = this.handler.GetSelectedGroup(this.graph.vertices[i]);
var selected = false;
if (selectedGroup > 0)
{
selectedGroup = (selectedGroup - 1) % selectedStyle.length;
selected = true;
}
var currentStyle = null;
if (this.graph.vertices[i].hasOwnStyleFor((selected ? 1 : 0) + selectedGroup) && !force)
currentStyle = this.graph.vertices[i].getStyleFor((selected ? 1 : 0) + selectedGroup);
else
currentStyle = selected ? selectedStyle[selectedGroup] : commonStyle;
this.graph.vertices[i].currentStyle = currentStyle;
}
}
GraphDrawer.prototype.UpdateEdgeCurrentStyle = function(edge, ForceCommonStyle, ForceSelectedStyle)
{
var commonStyle = (ForceCommonStyle === undefined) ? this.edgeCommonStyle : ForceCommonStyle;
var selectedStyle = (ForceSelectedStyle === undefined) ? this.edgeSelectedStyles : ForceSelectedStyle;
var selectedGroup = this.handler.GetSelectedGroup(edge);
var selected = false;
if (selectedGroup > 0)
{
selectedGroup = (selectedGroup - 1) % selectedStyle.length;
selected = true;
}
var currentStyle = null;
if (edge.hasOwnStyleFor((selected ? 1 : 0) + selectedGroup))
currentStyle = edge.getStyleFor((selected ? 1 : 0) + selectedGroup);
else
currentStyle = selected ? selectedStyle[selectedGroup] : commonStyle;
edge.currentStyle = currentStyle;
}
GraphDrawer.prototype.RedrawEdges = function(context)
{
for (i = 0; i < this.graph.edges.length; i ++)
{
this.RedrawEdge(context, this.graph.edges[i]);
}
}
GraphDrawer.prototype.RedrawEdge = function(context, edge)
{
var curvedArcDrawer = new CurvedArcDrawer(context, edge.model)
var arcDrawer = this.GetBaseArcDrawer(context, edge);
this._RedrawEdge(edge, arcDrawer);
}
GraphDrawer.prototype._RedrawEdge = function(edge, arcDrawer, commonStyle, selectedStyles)
{
this._RedrawEdgeWithStyle(edge, edge.currentStyle, arcDrawer, commonStyle, selectedStyles);
}
GraphDrawer.prototype._RedrawEdgeWithStyle = function(edge, style, arcDrawer, commonStyle, selectedStyles)
{
arcDrawer.Draw(edge, style.GetStyle({}, edge));
}
GraphDrawer.prototype.RedrawNodes = function(context)
{
var graphDrawer = new BaseVertexDrawer(context);
for (i = 0; i < this.graph.vertices.length; i ++)
{
graphDrawer.Draw(this.graph.vertices[i], this.graph.vertices[i].currentStyle.GetStyle({}, this.graph.vertices[i]));
}
}
GraphDrawer.prototype.redrawGraphTimer = function()
{
if (this.isTimerRender)
{
var context = this._redrawGraphInWindow();
// Render path
if (this.renderPath.length > 1)
{
context.save();
context.scale(this.canvasInfo.Scale, this.canvasInfo.Scale);
context.translate(this.canvasInfo.position.x, this.canvasInfo.position.y);
var movePixelStep = 16;
var currentLength = 0;
var i = 0
for (i = 0; i < this.renderPath.length - 1; i++)
{
var edge = null;
if (this.renderPathWithEdges)
{
edge = this.graph.FindEdgeById(this.renderPath[i + 1]);
i++;
}
else if (this.renderMinPath)
{
edge = this.graph.FindEdgeMin(this.renderPath[i], this.renderPath[i + 1]);
}
else
{
edge = this.graph.FindEdge(this.renderPath[i], this.renderPath[i + 1]);
}
currentLength += edge.GetPixelLength();
if (currentLength > this.renderPathCounter)
{
currentLength -= edge.GetPixelLength();
break;
}
}
if (i >= this.renderPath.length - 1)
{
i = 0;
if (this.renderPathWithEdges)
i = 1;
this.renderPathCounter = 0;
currentLength = 0;
this.renderPathLoops += 1;
}
var edge = null;
var currentVertexId = this.renderPath[i];
if (this.renderPathWithEdges)
{
edge = this.graph.FindEdgeById(this.renderPath[i]);
currentVertexId = this.renderPath[i - 1];
}
else if (this.renderMinPath)
{
edge = this.graph.FindEdgeMin(this.renderPath[i], this.renderPath[i + 1]);
}
else
{
edge = this.graph.FindEdge(this.renderPath[i], this.renderPath[i + 1]);
}
var progress = (this.renderPathCounter - currentLength) / edge.GetPixelLength();
this.RedrawEdgeProgress(context, edge, edge.vertex1.id == currentVertexId ? progress : 1.0 - progress);
this.renderPathCounter += movePixelStep;
context.restore();
}
}
if (this.renderPathLoops >= 5)
{
this.stopRenderTimer();
}
}
GraphDrawer.prototype.GetRealWidth = function ()
{
return this.canvasInfo.width / this.canvasInfo.Scale;
}
GraphDrawer.prototype.GetRealHeight = function ()
{
return this.canvasInfo.height / this.canvasInfo.Scale;
}