devexpress-diagram
Version:
DevExpress Diagram Control
50 lines (44 loc) • 2.47 kB
text/typescript
import { SvgPrimitive } from "./Primitives/Primitive";
import { TextFloodFilterPrimitive } from "./Primitives/TextFilterPrimitive";
import { Size } from "@devexpress/utils/lib/geometry/size";
import { UnitConverter } from "@devexpress/utils/lib/class/unit-converter";
import { DOMManipulator } from "./DOMManipulator";
export const PAGE_BG_TEXTFLOOR_FILTER_ID = "page-text-flood";
export class CanvasManagerBase {
actualZoom: number;
protected dom: DOMManipulator;
private elements: {[key: string]: SVGElement} = {};
constructor(actualZoom: number, dom: DOMManipulator) {
this.actualZoom = actualZoom;
this.dom = dom;
}
protected createAndChangePrimitivesElements(primitives: SvgPrimitive<SVGElement>[], parent: SVGElement) {
primitives.forEach(primitive => {
this.createAndChangePrimitiveElement(primitive, parent);
});
}
protected createPrimitiveElement<TEl extends SVGElement, TPrim extends SvgPrimitive<TEl>>(primitive: TPrim, parent: SVGElement, sibling?: SVGElement): TEl {
return this.dom.createElement(primitive, parent, sibling);
}
protected createAndChangePrimitiveElement(primitive: SvgPrimitive<SVGElement>, parent: SVGElement, sibling?: SVGElement): SVGElement {
const element = this.createPrimitiveElement(primitive, parent, sibling);
this.dom.changeByPrimitive(element, primitive);
return element;
}
protected changePrimitiveElement(primitive: SvgPrimitive<SVGElement>, element: SVGElement) {
this.dom.changeByPrimitive(element, primitive);
}
protected getOrCreateElement<TEl extends SVGElement, TPrim extends SvgPrimitive<TEl>>(key: string, primitive: TPrim, parent: SVGElement, sibling?: SVGElement): TEl {
const element = (key && this.elements[key]) || (this.elements[key] = this.createPrimitiveElement(primitive, parent, sibling));
this.changePrimitiveElement(primitive, element);
return <TEl>element;
}
protected createTextFloodFilter(key: string, parent: SVGElement, pageColor: number) {
this.getOrCreateElement(key, new TextFloodFilterPrimitive(PAGE_BG_TEXTFLOOR_FILTER_ID, pageColor), parent);
}
getAbsoluteSize(modelSize: Size): Size {
return modelSize
.clone().applyConverter(UnitConverter.twipsToPixelsF)
.clone().multiply(this.actualZoom, this.actualZoom);
}
}