mirror of
https://github.com/projectstorm/react-diagrams.git
synced 2025-08-18 19:20:42 +08:00
complete refactor
This commit is contained in:
@ -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<any, any> {
|
||||
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 <CloneSelected engine={engine} model={model} />;
|
||||
};
|
||||
|
@ -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<AdvancedLinkModel> {
|
||||
|
||||
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"));
|
||||
|
@ -1,23 +0,0 @@
|
||||
import * as SRD from "../../src/main";
|
||||
import { DiamondNodeModel } from "./DiamondNodeModel";
|
||||
import { DiamondPortModel } from "./DiamondPortModel";
|
||||
|
||||
export class DiamondNodeFactory extends SRD.AbstractInstanceFactory<DiamondNodeModel> {
|
||||
constructor() {
|
||||
super("DiamondNodeModel");
|
||||
}
|
||||
|
||||
getInstance() {
|
||||
return new DiamondNodeModel();
|
||||
}
|
||||
}
|
||||
|
||||
export class DiamondPortFactory extends SRD.AbstractInstanceFactory<DiamondPortModel> {
|
||||
constructor() {
|
||||
super("DiamondPortModel");
|
||||
}
|
||||
|
||||
getInstance() {
|
||||
return new DiamondPortModel();
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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();
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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<any, any> {
|
||||
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 <NodeDelayedPosition engine={engine} model={model} />;
|
||||
};
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
51
src/AbstractFactory.ts
Normal file
51
src/AbstractFactory.ts
Normal file
@ -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<T extends BaseModel>{
|
||||
|
||||
type: string;
|
||||
|
||||
constructor(name: string) {
|
||||
this.type = name;
|
||||
}
|
||||
|
||||
getType(): string {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
abstract getNewInstance(initialConfig?: any): T
|
||||
|
||||
}
|
||||
|
||||
export abstract class NodeFactory<T extends NodeModel = NodeModel> extends AbstractFactory<T>{
|
||||
|
||||
abstract generateReactWidget(diagramEngine: DiagramEngine, node: T): JSX.Element;
|
||||
|
||||
}
|
||||
|
||||
export abstract class LinkFactory<T extends LinkModel = LinkModel> extends AbstractFactory<T>{
|
||||
|
||||
abstract generateReactWidget(diagramEngine: DiagramEngine, link: T): JSX.Element;
|
||||
}
|
||||
|
||||
export abstract class PortFactory<T extends PortModel = PortModel> extends AbstractFactory<T>{
|
||||
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
import { BaseEntity, BaseListener } from "./BaseEntity";
|
||||
/**
|
||||
* @author Dylan Vorster
|
||||
*/
|
||||
export abstract class AbstractInstanceFactory<T extends BaseEntity<BaseListener>> {
|
||||
className: string;
|
||||
|
||||
constructor(className: string) {
|
||||
this.className = className;
|
||||
}
|
||||
|
||||
getName() {
|
||||
return this.className;
|
||||
}
|
||||
|
||||
abstract getInstance(initialConfig?: any): T;
|
||||
}
|
@ -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<DiagramEngineListener> {
|
||||
nodeFactories: { [s: string]: NodeWidgetFactory };
|
||||
linkFactories: { [s: string]: LinkWidgetFactory };
|
||||
instanceFactories: {
|
||||
[s: string]: AbstractInstanceFactory<BaseEntity<BaseListener>>;
|
||||
};
|
||||
|
||||
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<DiagramEngineListener> {
|
||||
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<DiagramEngineListener> {
|
||||
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<BaseEntity<BaseListener>> {
|
||||
return this.instanceFactories[className];
|
||||
registerPortFactory(factory: PortFactory) {
|
||||
this.portFactories[factory.getType()] = factory;
|
||||
this.iterateListeners(listener => {
|
||||
if (listener.portFactoriesUpdated) {
|
||||
listener.portFactoriesUpdated();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
registerInstanceFactory(factory: AbstractInstanceFactory<BaseEntity<BaseListener>>) {
|
||||
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<DiagramEngineListener> {
|
||||
});
|
||||
}
|
||||
|
||||
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<DiagramEngineListener> {
|
||||
});
|
||||
}
|
||||
|
||||
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) {
|
||||
|
@ -1,14 +0,0 @@
|
||||
import { AbstractInstanceFactory } from "./AbstractInstanceFactory";
|
||||
import { LinkModel } from "./models/LinkModel";
|
||||
/**
|
||||
* @author Dylan Vorster
|
||||
*/
|
||||
export class LinkInstanceFactory extends AbstractInstanceFactory<LinkModel> {
|
||||
constructor() {
|
||||
super("LinkModel");
|
||||
}
|
||||
|
||||
getInstance() {
|
||||
return new LinkModel();
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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<DefaultNodeModel> {
|
||||
|
||||
constructor() {
|
||||
super("default");
|
||||
}
|
||||
@ -17,4 +18,8 @@ export class DefaultNodeFactory extends NodeWidgetFactory {
|
||||
diagramEngine: diagramEngine
|
||||
});
|
||||
}
|
||||
|
||||
getNewInstance(initialConfig?: any): DefaultNodeModel {
|
||||
return new DefaultNodeModel();
|
||||
}
|
||||
}
|
||||
|
@ -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<DefaultNodeModel> {
|
||||
constructor() {
|
||||
super("DefaultNodeModel");
|
||||
}
|
||||
|
||||
getInstance() {
|
||||
return new DefaultNodeModel();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @author Dylan Vorster
|
||||
*/
|
||||
|
13
src/defaults/DefaultPortFactory.tsx
Normal file
13
src/defaults/DefaultPortFactory.tsx
Normal file
@ -0,0 +1,13 @@
|
||||
import {DefaultPortModel} from "./DefaultPortModel";
|
||||
import {PortFactory} from "../AbstractFactory";
|
||||
|
||||
export class DefaultPortFactory extends PortFactory<DefaultPortModel> {
|
||||
|
||||
constructor() {
|
||||
super("default");
|
||||
}
|
||||
|
||||
getNewInstance(initialConfig?: any): DefaultPortModel {
|
||||
return new DefaultPortModel(true, "unknown");
|
||||
}
|
||||
}
|
@ -1,17 +1,6 @@
|
||||
import * as _ from "lodash";
|
||||
import { AbstractInstanceFactory } from "../AbstractInstanceFactory";
|
||||
import { PortModel } from "../models/PortModel";
|
||||
|
||||
export class DefaultPortInstanceFactory extends AbstractInstanceFactory<DefaultPortModel> {
|
||||
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;
|
||||
}
|
||||
|
@ -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";
|
||||
|
@ -12,13 +12,14 @@ export interface BaseModelListener extends BaseListener {
|
||||
* @author Dylan Vorster
|
||||
*/
|
||||
export class BaseModel<T extends BaseModelListener = BaseModelListener> extends BaseEntity<BaseModelListener> {
|
||||
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<T>[] {
|
||||
@ -30,16 +31,21 @@ export class BaseModel<T extends BaseModelListener = BaseModelListener> 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;
|
||||
}
|
||||
|
@ -74,11 +74,11 @@ export class DiagramModel extends BaseEntity<DiagramListener> {
|
||||
|
||||
//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<DiagramListener> {
|
||||
});
|
||||
|
||||
_.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) {
|
||||
|
@ -11,15 +11,13 @@ export interface LinkModelListener extends BaseModelListener {
|
||||
}
|
||||
|
||||
export class LinkModel extends BaseModel<LinkModelListener> {
|
||||
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<LinkModelListener> {
|
||||
|
||||
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<LinkModelListener> {
|
||||
|
||||
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<LinkModelListener> {
|
||||
pointModel.link = this;
|
||||
this.points.splice(index, 0, pointModel);
|
||||
}
|
||||
|
||||
getType(): string {
|
||||
return this.linkType;
|
||||
}
|
||||
}
|
||||
|
@ -3,15 +3,13 @@ import { PortModel } from "./PortModel";
|
||||
import * as _ from "lodash";
|
||||
|
||||
export class NodeModel extends BaseModel<BaseModelListener> {
|
||||
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<BaseModelListener> {
|
||||
|
||||
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<BaseModelListener> {
|
||||
|
||||
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<BaseModelListener> {
|
||||
this.ports[port.name] = port;
|
||||
return port;
|
||||
}
|
||||
|
||||
getType(): string {
|
||||
return this.nodeType;
|
||||
}
|
||||
}
|
||||
|
@ -8,6 +8,13 @@ export class PortModel extends BaseModel<BaseModelListener> {
|
||||
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<BaseModelListener> {
|
||||
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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user