diff --git a/demos/demo-cloning/index.tsx b/demos/demo-cloning/index.tsx index 87cb069..dca5d4d 100644 --- a/demos/demo-cloning/index.tsx +++ b/demos/demo-cloning/index.tsx @@ -8,14 +8,12 @@ import { NodeModel, DefaultPortModel, DiagramWidget, - DefaultNodeInstanceFactory, - DefaultPortInstanceFactory, - LinkInstanceFactory, BaseModel } from "../../src/main"; import * as _ from "lodash"; import * as React from "react"; import {DemoWorkspaceWidget} from "../.helpers/DemoWorkspaceWidget"; +import {DefaultPortFactory} from "../../src/defaults/DefaultPortFactory"; /** * Tests cloning @@ -66,8 +64,7 @@ class CloneSelected extends React.Component { export default () => { //1) setup the diagram engine var engine = new DiagramEngine(); - engine.registerNodeFactory(new DefaultNodeFactory()); - engine.registerLinkFactory(new DefaultLinkFactory()); + engine.installDefaultFactories(); //2) setup the diagram model var model = new DiagramModel(); @@ -97,11 +94,6 @@ export default () => { //5) load model into engine engine.setDiagramModel(model); - //we need this to help the system know what models to create form the JSON - engine.registerInstanceFactory(new DefaultNodeInstanceFactory()); - engine.registerInstanceFactory(new DefaultPortInstanceFactory()); - engine.registerInstanceFactory(new LinkInstanceFactory()); - //6) render the diagram! return ; }; diff --git a/demos/demo-custom-link1/index.tsx b/demos/demo-custom-link1/index.tsx index 267ae47..d018907 100644 --- a/demos/demo-custom-link1/index.tsx +++ b/demos/demo-custom-link1/index.tsx @@ -13,15 +13,14 @@ import { } from "../../src/main"; import { action } from "@storybook/addon-actions"; import * as React from "react"; -import { LinkWidgetFactory } from "../../src/WidgetFactories"; +import {LinkFactory} from "../../src/AbstractFactory"; export class AdvancedLinkModel extends LinkModel { size: number; color: string; constructor() { - super(); - this.linkType = "advanced"; + super("advanced"); this.color = "green"; this.size = 6; } @@ -39,7 +38,12 @@ export class AdvancedPortModel extends DefaultPortModel { } } -export class AdvancedLinkWidgetFactory extends LinkWidgetFactory { +export class AdvancedLinkWidgetFactory extends LinkFactory { + + getNewInstance(initialConfig?: any): AdvancedLinkModel { + return new AdvancedLinkModel(); + } + constructor() { super("advanced"); } @@ -62,9 +66,8 @@ export class AdvancedLinkWidgetFactory extends LinkWidgetFactory { export default () => { //1) setup the diagram engine var engine = new DiagramEngine(); - engine.registerNodeFactory(new DefaultNodeFactory()); + engine.installDefaultFactories(); engine.registerLinkFactory(new AdvancedLinkWidgetFactory()); - engine.registerLinkFactory(new DefaultLinkFactory()); var node1 = new DefaultNodeModel("Source", "rgb(0,192,255)"); var port1 = node1.addPort(new AdvancedPortModel(false, "out-1", "Out thick")); diff --git a/demos/demo-custom-node1/DiamondInstanceFactories.ts b/demos/demo-custom-node1/DiamondInstanceFactories.ts deleted file mode 100644 index 4d4b487..0000000 --- a/demos/demo-custom-node1/DiamondInstanceFactories.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as SRD from "../../src/main"; -import { DiamondNodeModel } from "./DiamondNodeModel"; -import { DiamondPortModel } from "./DiamondPortModel"; - -export class DiamondNodeFactory extends SRD.AbstractInstanceFactory { - constructor() { - super("DiamondNodeModel"); - } - - getInstance() { - return new DiamondNodeModel(); - } -} - -export class DiamondPortFactory extends SRD.AbstractInstanceFactory { - constructor() { - super("DiamondPortModel"); - } - - getInstance() { - return new DiamondPortModel(); - } -} diff --git a/demos/demo-custom-node1/DiamondWidgetFactory.ts b/demos/demo-custom-node1/DiamondNodeFactory.ts similarity index 63% rename from demos/demo-custom-node1/DiamondWidgetFactory.ts rename to demos/demo-custom-node1/DiamondNodeFactory.ts index e08faa3..c159064 100644 --- a/demos/demo-custom-node1/DiamondWidgetFactory.ts +++ b/demos/demo-custom-node1/DiamondNodeFactory.ts @@ -1,7 +1,9 @@ import * as SRD from "../../src/main"; import { DiamonNodeWidgetFactory } from "./DiamondNodeWidget"; +import {DiamondNodeModel} from "./DiamondNodeModel"; + +export class DiamondNodeFactory extends SRD.NodeFactory { -export class DiamondWidgetFactory extends SRD.NodeWidgetFactory { constructor() { super("diamond"); } @@ -9,4 +11,8 @@ export class DiamondWidgetFactory extends SRD.NodeWidgetFactory { generateReactWidget(diagramEngine: SRD.DiagramEngine, node: SRD.NodeModel): JSX.Element { return DiamonNodeWidgetFactory({ node: node }); } + + getNewInstance() { + return new DiamondNodeModel(); + } } diff --git a/demos/demo-custom-node1/index.tsx b/demos/demo-custom-node1/index.tsx index 6d222c8..efccc1d 100644 --- a/demos/demo-custom-node1/index.tsx +++ b/demos/demo-custom-node1/index.tsx @@ -10,7 +10,9 @@ import { } from "../../src/main"; import * as React from "react"; import { DiamondNodeModel } from "./DiamondNodeModel"; -import { DiamondWidgetFactory } from "./DiamondWidgetFactory"; +import { DiamondNodeFactory} from "./DiamondNodeFactory"; +import {SimplePortFactory} from "../../src/AbstractFactory"; +import {DiamondPortModel} from "./DiamondPortModel"; /** * @Author Dylan Vorster @@ -18,9 +20,9 @@ import { DiamondWidgetFactory } from "./DiamondWidgetFactory"; export default () => { //1) setup the diagram engine var engine = new DiagramEngine(); - engine.registerNodeFactory(new DefaultNodeFactory()); - engine.registerLinkFactory(new DefaultLinkFactory()); - engine.registerNodeFactory(new DiamondWidgetFactory()); + engine.installDefaultFactories(); + engine.registerPortFactory(new SimplePortFactory('diamond', (config) => new DiamondPortModel())); + engine.registerNodeFactory(new DiamondNodeFactory()); //2) setup the diagram model var model = new DiagramModel(); diff --git a/demos/demo-dagre/index.tsx b/demos/demo-dagre/index.tsx index 59ca8b6..1b3a39f 100644 --- a/demos/demo-dagre/index.tsx +++ b/demos/demo-dagre/index.tsx @@ -7,9 +7,6 @@ import { LinkModel, DefaultPortModel, DiagramWidget, - DefaultNodeInstanceFactory, - DefaultPortInstanceFactory, - LinkInstanceFactory } from "../../src/main"; import { distributeElements } from "./dagre-utils"; import * as React from "react"; @@ -73,8 +70,7 @@ function getDistributedModel(engine, model) { export default () => { //1) setup the diagram engine let engine = new DiagramEngine(); - engine.registerNodeFactory(new DefaultNodeFactory()); - engine.registerLinkFactory(new DefaultLinkFactory()); + engine.installDefaultFactories(); //2) setup the diagram model let model = new DiagramModel(); @@ -113,10 +109,6 @@ export default () => { model.addLink(link); }); //5) load model into engine - //we need this to help the system know what models to create form the JSON - engine.registerInstanceFactory(new DefaultNodeInstanceFactory()); - engine.registerInstanceFactory(new DefaultPortInstanceFactory()); - engine.registerInstanceFactory(new LinkInstanceFactory()); let model2 = getDistributedModel(engine, model); engine.setDiagramModel(model2); diff --git a/demos/demo-drag-and-drop/Application.ts b/demos/demo-drag-and-drop/Application.ts index 8141b5e..0c051d5 100644 --- a/demos/demo-drag-and-drop/Application.ts +++ b/demos/demo-drag-and-drop/Application.ts @@ -8,9 +8,7 @@ export class Application { constructor() { this.diagramEngine = new SRD.DiagramEngine(); - - this.diagramEngine.registerNodeFactory(new SRD.DefaultNodeFactory()); - this.diagramEngine.registerLinkFactory(new SRD.DefaultLinkFactory()); + this.diagramEngine.installDefaultFactories(); this.newModel(); } diff --git a/demos/demo-grid/index.tsx b/demos/demo-grid/index.tsx index 3140c92..4b4b484 100644 --- a/demos/demo-grid/index.tsx +++ b/demos/demo-grid/index.tsx @@ -16,8 +16,7 @@ import * as React from "react"; export default () => { //1) setup the diagram engine var engine = new DiagramEngine(); - engine.registerNodeFactory(new DefaultNodeFactory()); - engine.registerLinkFactory(new DefaultLinkFactory()); + engine.installDefaultFactories(); //2) setup the diagram model var model = new DiagramModel(); diff --git a/demos/demo-limit-points/index.tsx b/demos/demo-limit-points/index.tsx index 8b40719..08484fa 100644 --- a/demos/demo-limit-points/index.tsx +++ b/demos/demo-limit-points/index.tsx @@ -8,8 +8,7 @@ import { DiagramEngine, DiagramModel, DefaultNodeModel, LinkModel, DiagramWidget export default () => { // setup the diagram engine var engine = new DiagramEngine(); - engine.registerNodeFactory(new SRD.DefaultNodeFactory()); - engine.registerLinkFactory(new SRD.DefaultLinkFactory()); + engine.installDefaultFactories(); var model = new DiagramModel(); diff --git a/demos/demo-listeners/index.tsx b/demos/demo-listeners/index.tsx index ff87916..017bf08 100644 --- a/demos/demo-listeners/index.tsx +++ b/demos/demo-listeners/index.tsx @@ -9,8 +9,7 @@ import { DiagramEngine, DiagramModel, DefaultNodeModel, LinkModel, DiagramWidget export default () => { // setup the diagram engine var engine = new DiagramEngine(); - engine.registerNodeFactory(new SRD.DefaultNodeFactory()); - engine.registerLinkFactory(new SRD.DefaultLinkFactory()); + engine.installDefaultFactories(); var model = new DiagramModel(); diff --git a/demos/demo-locks/index.tsx b/demos/demo-locks/index.tsx index 6504485..23599dc 100644 --- a/demos/demo-locks/index.tsx +++ b/demos/demo-locks/index.tsx @@ -11,8 +11,7 @@ import { DiagramEngine, DiagramModel, DefaultNodeModel, LinkModel, PointModel, D export default () => { //1) setup the diagram engine var engine = new DiagramEngine(); - engine.registerNodeFactory(new SRD.DefaultNodeFactory()); - engine.registerLinkFactory(new SRD.DefaultLinkFactory()); + engine.installDefaultFactories(); var model = new DiagramModel(); diff --git a/demos/demo-mutate-graph/index.tsx b/demos/demo-mutate-graph/index.tsx index 914431f..959d396 100644 --- a/demos/demo-mutate-graph/index.tsx +++ b/demos/demo-mutate-graph/index.tsx @@ -7,9 +7,6 @@ import { LinkModel, DefaultPortModel, DiagramWidget, - DefaultNodeInstanceFactory, - DefaultPortInstanceFactory, - LinkInstanceFactory } from "../../src/main"; import * as React from "react"; import {DemoWorkspaceWidget} from "../.helpers/DemoWorkspaceWidget"; @@ -63,8 +60,7 @@ class NodeDelayedPosition extends React.Component { export default () => { //1) setup the diagram engine var engine = new DiagramEngine(); - engine.registerNodeFactory(new DefaultNodeFactory()); - engine.registerLinkFactory(new DefaultLinkFactory()); + engine.installDefaultFactories(); //2) setup the diagram model var model = new DiagramModel(); @@ -94,11 +90,6 @@ export default () => { //5) load model into engine engine.setDiagramModel(model); - //we need this to help the system know what models to create form the JSON - engine.registerInstanceFactory(new DefaultNodeInstanceFactory()); - engine.registerInstanceFactory(new DefaultPortInstanceFactory()); - engine.registerInstanceFactory(new LinkInstanceFactory()); - //6) render the diagram! return ; }; diff --git a/demos/demo-performance/index.tsx b/demos/demo-performance/index.tsx index 90bed87..a652f9d 100644 --- a/demos/demo-performance/index.tsx +++ b/demos/demo-performance/index.tsx @@ -1,7 +1,5 @@ import { DiagramEngine, - DefaultNodeFactory, - DefaultLinkFactory, DiagramModel, DefaultNodeModel, LinkModel, @@ -20,8 +18,7 @@ import * as React from "react"; export default () => { //1) setup the diagram engine var engine = new DiagramEngine(); - engine.registerNodeFactory(new DefaultNodeFactory()); - engine.registerLinkFactory(new DefaultLinkFactory()); + engine.installDefaultFactories(); function generateNodes(model: DiagramModel, offsetX: number, offsetY: number) { //3-A) create a default node diff --git a/demos/demo-serializing/index.tsx b/demos/demo-serializing/index.tsx index 922ad16..09694d9 100644 --- a/demos/demo-serializing/index.tsx +++ b/demos/demo-serializing/index.tsx @@ -7,9 +7,6 @@ import { LinkModel, DefaultPortModel, DiagramWidget, - DefaultNodeInstanceFactory, - DefaultPortInstanceFactory, - LinkInstanceFactory } from "../../src/main"; import * as React from "react"; import {DemoWorkspaceWidget} from "../.helpers/DemoWorkspaceWidget"; @@ -19,8 +16,7 @@ var beautify = require("json-beautify"); export default () => { //1) setup the diagram engine var engine = new DiagramEngine(); - engine.registerNodeFactory(new DefaultNodeFactory()); - engine.registerLinkFactory(new DefaultLinkFactory()); + engine.installDefaultFactories(); //2) setup the diagram model var model = new DiagramModel(); @@ -56,12 +52,6 @@ export default () => { //!------------- DESERIALIZING ---------------- - //we need this to help the system know what models to create form the JSON - engine.registerInstanceFactory(new DefaultNodeInstanceFactory()); - engine.registerInstanceFactory(new DefaultPortInstanceFactory()); - engine.registerInstanceFactory(new LinkInstanceFactory()); - - //deserialize the model var model2 = new DiagramModel(); model2.deSerializeDiagram(JSON.parse(str), engine); engine.setDiagramModel(model2); diff --git a/demos/demo-simple/index.tsx b/demos/demo-simple/index.tsx index 4ed0887..3bb0a02 100644 --- a/demos/demo-simple/index.tsx +++ b/demos/demo-simple/index.tsx @@ -1,7 +1,5 @@ import { DiagramEngine, - DefaultNodeFactory, - DefaultLinkFactory, DiagramModel, DefaultNodeModel, LinkModel, @@ -13,8 +11,7 @@ import * as React from "react"; export default () => { //1) setup the diagram engine var engine = new DiagramEngine(); - engine.registerNodeFactory(new DefaultNodeFactory()); - engine.registerLinkFactory(new DefaultLinkFactory()); + engine.installDefaultFactories(); //2) setup the diagram model var model = new DiagramModel(); diff --git a/demos/demo-zoom-to-fit/index.tsx b/demos/demo-zoom-to-fit/index.tsx index 1d1bb54..37959c9 100644 --- a/demos/demo-zoom-to-fit/index.tsx +++ b/demos/demo-zoom-to-fit/index.tsx @@ -20,8 +20,7 @@ import {DemoWorkspaceWidget} from "../.helpers/DemoWorkspaceWidget"; export default () => { //1) setup the diagram engine var engine = new DiagramEngine(); - engine.registerNodeFactory(new DefaultNodeFactory()); - engine.registerLinkFactory(new DefaultLinkFactory()); + engine.installDefaultFactories(); function generateNodes(model: DiagramModel, offsetX: number, offsetY: number) { //3-A) create a default node diff --git a/src/AbstractFactory.ts b/src/AbstractFactory.ts new file mode 100644 index 0000000..ef9f6a3 --- /dev/null +++ b/src/AbstractFactory.ts @@ -0,0 +1,51 @@ +import {BaseModel} from "./models/BaseModel"; +import {NodeModel} from "./models/NodeModel"; +import {LinkModel} from "./models/LinkModel"; +import {DiagramEngine} from "./DiagramEngine"; +import {PortModel} from "./models/PortModel"; + +export abstract class AbstractFactory{ + + type: string; + + constructor(name: string) { + this.type = name; + } + + getType(): string { + return this.type; + } + + abstract getNewInstance(initialConfig?: any): T + +} + +export abstract class NodeFactory extends AbstractFactory{ + + abstract generateReactWidget(diagramEngine: DiagramEngine, node: T): JSX.Element; + +} + +export abstract class LinkFactory extends AbstractFactory{ + + abstract generateReactWidget(diagramEngine: DiagramEngine, link: T): JSX.Element; +} + +export abstract class PortFactory extends AbstractFactory{ + +} + +export class SimplePortFactory extends PortFactory{ + + cb: (initialConfig?: any) => PortModel; + + constructor(type: string, cb: (initialConfig?: any) => PortModel){ + super(type); + this.cb = cb; + } + + getNewInstance(initialConfig?: any): PortModel { + return this.cb(initialConfig); + } + +} diff --git a/src/AbstractInstanceFactory.ts b/src/AbstractInstanceFactory.ts deleted file mode 100644 index c8153c9..0000000 --- a/src/AbstractInstanceFactory.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { BaseEntity, BaseListener } from "./BaseEntity"; -/** - * @author Dylan Vorster - */ -export abstract class AbstractInstanceFactory> { - className: string; - - constructor(className: string) { - this.className = className; - } - - getName() { - return this.className; - } - - abstract getInstance(initialConfig?: any): T; -} diff --git a/src/DiagramEngine.ts b/src/DiagramEngine.ts index 5719a56..2f608a1 100644 --- a/src/DiagramEngine.ts +++ b/src/DiagramEngine.ts @@ -1,17 +1,21 @@ -import { NodeWidgetFactory, LinkWidgetFactory } from "./WidgetFactories"; import { BaseEntity, BaseListener } from "./BaseEntity"; import { DiagramModel } from "./models/DiagramModel"; -import { AbstractInstanceFactory } from "./AbstractInstanceFactory"; import * as _ from "lodash"; import { BaseModel, BaseModelListener } from "./models/BaseModel"; import { NodeModel } from "./models/NodeModel"; import { PointModel } from "./models/PointModel"; import { PortModel } from "./models/PortModel"; import { LinkModel } from "./models/LinkModel"; +import {LinkFactory, NodeFactory, PortFactory} from "./AbstractFactory"; +import {DefaultLinkFactory, DefaultNodeFactory} from "./main"; +import {DefaultPortFactory} from "./defaults/DefaultPortFactory"; /** * @author Dylan Vorster */ export interface DiagramEngineListener extends BaseListener { + + portFactoriesUpdated?(): void; + nodeFactoriesUpdated?(): void; linkFactoriesUpdated?(): void; @@ -23,11 +27,10 @@ export interface DiagramEngineListener extends BaseListener { * Passed as a parameter to the DiagramWidget */ export class DiagramEngine extends BaseEntity { - nodeFactories: { [s: string]: NodeWidgetFactory }; - linkFactories: { [s: string]: LinkWidgetFactory }; - instanceFactories: { - [s: string]: AbstractInstanceFactory>; - }; + + nodeFactories: { [s: string]: NodeFactory }; + linkFactories: { [s: string]: LinkFactory }; + portFactories: { [s: string]: PortFactory }; diagramModel: DiagramModel; canvas: Element; @@ -41,12 +44,18 @@ export class DiagramEngine extends BaseEntity { this.diagramModel = new DiagramModel(); this.nodeFactories = {}; this.linkFactories = {}; - this.instanceFactories = {}; + this.portFactories = {}; this.canvas = null; this.paintableWidgets = null; this.linksThatHaveInitiallyRendered = {}; } + installDefaultFactories(){ + this.registerNodeFactory(new DefaultNodeFactory()); + this.registerLinkFactory(new DefaultLinkFactory()); + this.registerPortFactory(new DefaultPortFactory()); + } + repaintCanvas() { this.iterateListeners(listener => { listener.repaintCanvas && listener.repaintCanvas(); @@ -131,23 +140,24 @@ export class DiagramEngine extends BaseEntity { return this.diagramModel; } - getNodeFactories(): { [s: string]: NodeWidgetFactory } { + getNodeFactories(): { [s: string]: NodeFactory } { return this.nodeFactories; } - getLinkFactories(): { [s: string]: LinkWidgetFactory } { + getLinkFactories(): { [s: string]: LinkFactory } { return this.linkFactories; } - getInstanceFactory(className: string): AbstractInstanceFactory> { - return this.instanceFactories[className]; + registerPortFactory(factory: PortFactory) { + this.portFactories[factory.getType()] = factory; + this.iterateListeners(listener => { + if (listener.portFactoriesUpdated) { + listener.portFactoriesUpdated(); + } + }); } - registerInstanceFactory(factory: AbstractInstanceFactory>) { - this.instanceFactories[factory.getName()] = factory; - } - - registerNodeFactory(factory: NodeWidgetFactory) { + registerNodeFactory(factory: NodeFactory) { this.nodeFactories[factory.getType()] = factory; this.iterateListeners(listener => { if (listener.nodeFactoriesUpdated) { @@ -156,7 +166,7 @@ export class DiagramEngine extends BaseEntity { }); } - registerLinkFactory(factory: LinkWidgetFactory) { + registerLinkFactory(factory: LinkFactory) { this.linkFactories[factory.getType()] = factory; this.iterateListeners(listener => { if (listener.linkFactoriesUpdated) { @@ -165,22 +175,38 @@ export class DiagramEngine extends BaseEntity { }); } - getFactoryForNode(node: NodeModel): NodeWidgetFactory | null { - if (this.nodeFactories[node.getType()]) { - return this.nodeFactories[node.getType()]; + getPortFactory(type: string): PortFactory{ + if (this.portFactories[type]) { + return this.portFactories[type]; } - console.log("cannot find widget factory for node of type: [" + node.getType() + "]"); + console.log("cannot find factory for port of type: [" + type + "]"); return null; } - getFactoryForLink(link: LinkModel): LinkWidgetFactory | null { - if (this.linkFactories[link.getType()]) { - return this.linkFactories[link.getType()]; + getNodeFactory(type: string): NodeFactory{ + if (this.nodeFactories[type]) { + return this.nodeFactories[type]; } - console.log("cannot find widget factory for link of type: [" + link.getType() + "]"); + console.log("cannot find factory for node of type: [" + type + "]"); return null; } + getLinkFactory(type: string): LinkFactory{ + if (this.linkFactories[type]) { + return this.linkFactories[type]; + } + console.log("cannot find factory for link of type: [" + type + "]"); + return null; + } + + getFactoryForNode(node: NodeModel): NodeFactory | null { + return this.getNodeFactory(node.getType()); + } + + getFactoryForLink(link: LinkModel): LinkFactory | null { + return this.getLinkFactory(link.getType()); + } + generateWidgetForLink(link: LinkModel): JSX.Element | null { var linkFactory = this.getFactoryForLink(link); if (!linkFactory) { diff --git a/src/LinkInstanceFactory.ts b/src/LinkInstanceFactory.ts deleted file mode 100644 index d84c825..0000000 --- a/src/LinkInstanceFactory.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { AbstractInstanceFactory } from "./AbstractInstanceFactory"; -import { LinkModel } from "./models/LinkModel"; -/** - * @author Dylan Vorster - */ -export class LinkInstanceFactory extends AbstractInstanceFactory { - constructor() { - super("LinkModel"); - } - - getInstance() { - return new LinkModel(); - } -} diff --git a/src/WidgetFactories.ts b/src/WidgetFactories.ts deleted file mode 100644 index c67eff8..0000000 --- a/src/WidgetFactories.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { DiagramEngine } from "./DiagramEngine"; -import { NodeModel } from "./models/NodeModel"; -import { LinkModel } from "./models/LinkModel"; -/** - * @author Dylan Vorster - */ -export abstract class WidgetFactory { - type: string; - - constructor(name: string) { - this.type = name; - } - - getType(): string { - return this.type; - } -} - -export abstract class NodeWidgetFactory extends WidgetFactory { - abstract generateReactWidget(diagramEngine: DiagramEngine, node: NodeModel): JSX.Element; -} - -export abstract class LinkWidgetFactory extends WidgetFactory { - abstract generateReactWidget(diagramEngine: DiagramEngine, link: LinkModel): JSX.Element; -} diff --git a/src/defaults/DefaultLinkFactory.ts b/src/defaults/DefaultLinkFactory.ts index 2ac08f5..8ff1064 100644 --- a/src/defaults/DefaultLinkFactory.ts +++ b/src/defaults/DefaultLinkFactory.ts @@ -1,12 +1,13 @@ -import { LinkWidgetFactory } from "../WidgetFactories"; import * as React from "react"; import { DefaultLinkWidget } from "./DefaultLinkWidget"; import { DiagramEngine } from "../DiagramEngine"; import { LinkModel } from "../models/LinkModel"; +import {LinkFactory} from "../AbstractFactory"; /** * @author Dylan Vorster */ -export class DefaultLinkFactory extends LinkWidgetFactory { +export class DefaultLinkFactory extends LinkFactory { + constructor() { super("default"); } @@ -17,4 +18,8 @@ export class DefaultLinkFactory extends LinkWidgetFactory { diagramEngine: diagramEngine }); } + + getNewInstance(initialConfig?: any): LinkModel { + return new LinkModel(); + } } diff --git a/src/defaults/DefaultNodeFactory.ts b/src/defaults/DefaultNodeFactory.ts index 665dadb..7f8564b 100644 --- a/src/defaults/DefaultNodeFactory.ts +++ b/src/defaults/DefaultNodeFactory.ts @@ -1,12 +1,13 @@ -import { NodeWidgetFactory } from "../WidgetFactories"; import { DefaultNodeModel } from "./DefaultNodeModel"; import * as React from "react"; import { DefaultNodeWidget } from "./DefaultNodeWidget"; import { DiagramEngine } from "../DiagramEngine"; +import {NodeFactory} from "../AbstractFactory"; /** * @author Dylan Vorster */ -export class DefaultNodeFactory extends NodeWidgetFactory { +export class DefaultNodeFactory extends NodeFactory { + constructor() { super("default"); } @@ -17,4 +18,8 @@ export class DefaultNodeFactory extends NodeWidgetFactory { diagramEngine: diagramEngine }); } + + getNewInstance(initialConfig?: any): DefaultNodeModel { + return new DefaultNodeModel(); + } } diff --git a/src/defaults/DefaultNodeModel.ts b/src/defaults/DefaultNodeModel.ts index e758de8..ca60ccf 100644 --- a/src/defaults/DefaultNodeModel.ts +++ b/src/defaults/DefaultNodeModel.ts @@ -1,19 +1,8 @@ import { DefaultPortModel } from "./DefaultPortModel"; import * as _ from "lodash"; -import { AbstractInstanceFactory } from "../AbstractInstanceFactory"; import { NodeModel } from "../models/NodeModel"; -export class DefaultNodeInstanceFactory extends AbstractInstanceFactory { - constructor() { - super("DefaultNodeModel"); - } - - getInstance() { - return new DefaultNodeModel(); - } -} - /** * @author Dylan Vorster */ diff --git a/src/defaults/DefaultPortFactory.tsx b/src/defaults/DefaultPortFactory.tsx new file mode 100644 index 0000000..beb70ba --- /dev/null +++ b/src/defaults/DefaultPortFactory.tsx @@ -0,0 +1,13 @@ +import {DefaultPortModel} from "./DefaultPortModel"; +import {PortFactory} from "../AbstractFactory"; + +export class DefaultPortFactory extends PortFactory { + + constructor() { + super("default"); + } + + getNewInstance(initialConfig?: any): DefaultPortModel { + return new DefaultPortModel(true, "unknown"); + } +} diff --git a/src/defaults/DefaultPortModel.ts b/src/defaults/DefaultPortModel.ts index fd6fb75..de2723c 100644 --- a/src/defaults/DefaultPortModel.ts +++ b/src/defaults/DefaultPortModel.ts @@ -1,17 +1,6 @@ import * as _ from "lodash"; -import { AbstractInstanceFactory } from "../AbstractInstanceFactory"; import { PortModel } from "../models/PortModel"; -export class DefaultPortInstanceFactory extends AbstractInstanceFactory { - constructor() { - super("DefaultPortModel"); - } - - getInstance() { - return new DefaultPortModel(true, "unknown"); - } -} - /** * @author Dylan Vorster */ @@ -20,7 +9,7 @@ export class DefaultPortModel extends PortModel { label: string; constructor(isInput: boolean, name: string, label: string = null, id?: string) { - super(name, id); + super(name, "default", id); this.in = isInput; this.label = label || name; } diff --git a/src/main.ts b/src/main.ts index 1a6b151..141ff81 100644 --- a/src/main.ts +++ b/src/main.ts @@ -11,15 +11,13 @@ export * from "./defaults/DefaultNodeModel"; export * from "./defaults/DefaultPortModel"; export * from "./defaults/DefaultPortLabelWidget"; -export * from "./WidgetFactories"; +export * from "./AbstractFactory"; export * from "./Toolkit"; export * from "./DiagramEngine"; export * from "./models/DiagramModel"; export * from "./BaseEntity"; export * from "./CanvasActions"; -export * from "./AbstractInstanceFactory"; -export * from "./LinkInstanceFactory"; export * from "./models/BaseModel"; export * from "./models/DiagramModel"; diff --git a/src/models/BaseModel.ts b/src/models/BaseModel.ts index 906e96d..429115a 100644 --- a/src/models/BaseModel.ts +++ b/src/models/BaseModel.ts @@ -12,13 +12,14 @@ export interface BaseModelListener extends BaseListener { * @author Dylan Vorster */ export class BaseModel extends BaseEntity { - selected: boolean; - class: string; - constructor(id?: string) { + type: string; + selected: boolean; + + constructor(type?: string, id?: string) { super(id); + this.type = type; this.selected = false; - this.class = this.constructor.name; } public getSelectedEntities(): BaseModel[] { @@ -30,16 +31,21 @@ export class BaseModel extends public deSerialize(ob) { super.deSerialize(ob); + this.type = ob.type; this.selected = ob.selected; } public serialize() { return _.merge(super.serialize(), { - _class: this.class, + type: this.type, selected: this.selected }); } + public getType(): string{ + return this.type; + } + public getID(): string { return this.id; } diff --git a/src/models/DiagramModel.ts b/src/models/DiagramModel.ts index 7aad373..a0cc0e7 100644 --- a/src/models/DiagramModel.ts +++ b/src/models/DiagramModel.ts @@ -74,11 +74,11 @@ export class DiagramModel extends BaseEntity { //deserialize nodes _.forEach(object.nodes, (node: any) => { - let nodeOb = diagramEngine.getInstanceFactory(node._class).getInstance(node) as NodeModel; + let nodeOb = diagramEngine.getNodeFactory(node.type).getNewInstance(node); nodeOb.deSerialize(node); //deserialize ports _.forEach(node.ports, (port: any) => { - let portOb = diagramEngine.getInstanceFactory(port._class).getInstance() as PortModel; + let portOb = diagramEngine.getPortFactory(port.type).getNewInstance(); portOb.deSerialize(port); nodeOb.addPort(portOb); }); @@ -87,7 +87,7 @@ export class DiagramModel extends BaseEntity { }); _.forEach(object.links, (link: any) => { - let linkOb = diagramEngine.getInstanceFactory(link._class).getInstance() as LinkModel; + let linkOb = diagramEngine.getLinkFactory(link.type).getNewInstance(); linkOb.deSerialize(link); if (link.target) { diff --git a/src/models/LinkModel.ts b/src/models/LinkModel.ts index 11de12b..ead86f4 100644 --- a/src/models/LinkModel.ts +++ b/src/models/LinkModel.ts @@ -11,15 +11,13 @@ export interface LinkModelListener extends BaseModelListener { } export class LinkModel extends BaseModel { - linkType: string; sourcePort: PortModel | null; targetPort: PortModel | null; points: PointModel[]; extras: {}; - constructor() { - super(); - this.linkType = "default"; + constructor(linkType: string = "default", id?: string) { + super(linkType, id); this.points = [new PointModel(this, { x: 0, y: 0 }), new PointModel(this, { x: 0, y: 0 })]; this.extras = {}; this.sourcePort = null; @@ -28,7 +26,6 @@ export class LinkModel extends BaseModel { deSerialize(ob) { super.deSerialize(ob); - this.linkType = ob.type; this.extras = ob.extras; this.points = _.map(ob.points, (point: { x; y }) => { var p = new PointModel(this, { x: point.x, y: point.y }); @@ -39,7 +36,6 @@ export class LinkModel extends BaseModel { serialize() { return _.merge(super.serialize(), { - type: this.linkType, source: this.sourcePort ? this.sourcePort.getParent().id : null, sourcePort: this.sourcePort ? this.sourcePort.id : null, target: this.targetPort ? this.targetPort.getParent().id : null, @@ -172,8 +168,4 @@ export class LinkModel extends BaseModel { pointModel.link = this; this.points.splice(index, 0, pointModel); } - - getType(): string { - return this.linkType; - } } diff --git a/src/models/NodeModel.ts b/src/models/NodeModel.ts index 35f407b..4a4359c 100644 --- a/src/models/NodeModel.ts +++ b/src/models/NodeModel.ts @@ -3,15 +3,13 @@ import { PortModel } from "./PortModel"; import * as _ from "lodash"; export class NodeModel extends BaseModel { - nodeType: string; x: number; y: number; extras: {}; ports: { [s: string]: PortModel }; constructor(nodeType: string = "default", id?: string) { - super(id); - this.nodeType = nodeType; + super(nodeType, id); this.x = 0; this.y = 0; this.extras = {}; @@ -52,7 +50,6 @@ export class NodeModel extends BaseModel { deSerialize(ob) { super.deSerialize(ob); - this.nodeType = ob.type; this.x = ob.x; this.y = ob.y; this.extras = ob.extras; @@ -60,7 +57,6 @@ export class NodeModel extends BaseModel { serialize() { return _.merge(super.serialize(), { - type: this.nodeType, x: this.x, y: this.y, extras: this.extras, @@ -117,8 +113,4 @@ export class NodeModel extends BaseModel { this.ports[port.name] = port; return port; } - - getType(): string { - return this.nodeType; - } } diff --git a/src/models/PortModel.ts b/src/models/PortModel.ts index 1792c38..7af8d3b 100644 --- a/src/models/PortModel.ts +++ b/src/models/PortModel.ts @@ -8,6 +8,13 @@ export class PortModel extends BaseModel { parentNode: NodeModel; links: { [id: string]: LinkModel }; + constructor(name: string, type?: string, id?: string) { + super(type, id); + this.name = name; + this.links = {}; + this.parentNode = null; + } + deSerialize(ob) { super.deSerialize(ob); this.name = ob.name; @@ -28,13 +35,6 @@ export class PortModel extends BaseModel { clone.parentNode = this.parentNode.clone(lookupTable); } - constructor(name: string, id?: string) { - super(id); - this.name = name; - this.links = {}; - this.parentNode = null; - } - getName(): string { return this.name; }