/*
* Copyright (C) 2017 TypeFox and others.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*/
/** @jsx svg */
import { svg } from 'snabbdom-jsx';
import { RenderingContext, RectangularNodeView, IView, PolylineEdgeView, SEdge, Point, toDegrees, SLabelView} from "sprotty/lib";
import { VNode } from "snabbdom/vnode";
import { Icon, ClassNode, EdgeWithMultiplicty, Link } from './model';
export class ClassNodeView extends RectangularNodeView {
render(node: ClassNode, context: RenderingContext): VNode {
return
{context.renderChildren(node)}
;
}
}
export class LinkView extends SLabelView {
render(element: Link, context: RenderingContext): VNode {
return {element.text}
}
}
export class IconView implements IView {
render(element: Icon, context: RenderingContext): VNode {
const radius = this.getRadius();
return
{context.renderChildren(element)}
;
}
getRadius() {
return 16;
}
}
export class ArrowEdgeView extends PolylineEdgeView {
protected renderAdditionals(edge: SEdge, segments: Point[], context: RenderingContext): VNode[] {
const p1 = segments[segments.length - 2];
const p2 = segments[segments.length - 1];
return [
,
]
}
static readonly TARGET_CORRECTION = Math.sqrt(1 * 1 + 2.5 * 2.5)
protected getTargetAnchorCorrection(edge: SEdge): number {
return ArrowEdgeView.TARGET_CORRECTION
}
}
export class InheritanceEdgeView extends ArrowEdgeView {
protected renderAdditionals(edge: SEdge, segments: Point[], context: RenderingContext): VNode[] {
const p1 = segments[segments.length - 2];
const p2 = segments[segments.length - 1];
return [
,
]
}
static readonly TARGET_CORRECTION = Math.sqrt(1 * 1 + 2.5 * 2.5)
protected getTargetAnchorCorrection(edge: SEdge): number {
return ArrowEdgeView.TARGET_CORRECTION
}
}
abstract class DiamondEdgeView extends PolylineEdgeView {
protected renderAdditionals(edge: EdgeWithMultiplicty, segments: Point[], context: RenderingContext): VNode[] {
const p1 = segments[0]
const p2 = segments[1]
const r = 6;
const rhombStr = "M 0,0 l" + r + "," + (r / 2) + " l" + r + ",-" + (r / 2) + " l-" + r + ",-" + (r / 2) + " l-" + r + "," + (r / 2) + " Z";
const firstEdgeAngle = angle(p1, p2);
const pn = segments[segments.length - 1];
const pn_1 = segments[segments.length - 2];
const lastEdgeAngle = angle(pn_1, pn);
return [
,
{edge.multiplicitySource},
{edge.multiplicityTarget}
]
}
static readonly SOURCE_CORRECTION = Math.sqrt(1 * 1 + 2 * 2)
protected getSourceAnchorCorrection(edge: SEdge): number {
return CompositionEdgeView.SOURCE_CORRECTION
}
protected isComposition(): boolean {
return false;
}
protected isAggregation(): boolean {
return false;
}
}
export class CompositionEdgeView extends DiamondEdgeView {
protected isComposition(): boolean {
return true;
}
}
export class AggregationEdgeView extends DiamondEdgeView {
protected isAggregation(): boolean {
return true;
}
}
export function angle(x0: Point, x1: Point): number {
return toDegrees(Math.atan2(x1.y - x0.y, x1.x - x0.x))
}