Migration to EE6 of web2d and mindplot

This commit is contained in:
Paulo Gustavo Veiga 2021-12-04 15:39:20 -08:00
parent a8a843353b
commit 17b22ca211
113 changed files with 4509 additions and 4829 deletions

View File

@ -17,48 +17,49 @@
*/ */
import Icon from './Icon'; import Icon from './Icon';
const ActionIcon = new Class({ class ActionIcon extends Icon {
Extends: Icon,
initialize(topic, url) { constructor(topic, url) {
this.parent(url); super(url);
this._node = topic; this._node = topic;
}, }
getNode() { getNode() {
return this._node; return this._node;
}, }
setPosition(x, y) { setPosition(x, y) {
const size = this.getSize(); const size = this.getSize();
this.getImage().setPosition(x - size.width / 2, y - size.height / 2); this.getImage().setPosition(x - size.width / 2, y - size.height / 2);
}, }
addEvent(event, fn) { addEvent(event, fn) {
this.getImage().addEvent(event, fn); this.getImage().addEvent(event, fn);
}, }
addToGroup(group) { addToGroup(group) {
group.append(this.getImage()); group.append(this.getImage());
}, }
setVisibility(visible) { setVisibility(visible) {
this.getImage().setVisibility(visible); this.getImage().setVisibility(visible);
}, }
isVisible() { isVisible() {
return this.getImage().isVisible(); return this.getImage().isVisible();
}, }
setCursor(cursor) { setCursor(cursor) {
return this.getImage().setCursor(cursor); return this.getImage().setCursor(cursor);
}, }
moveToBack(cursor) { moveToBack(cursor) {
return this.getImage().moveToBack(cursor); return this.getImage().moveToBack(cursor);
}, }
moveToFront(cursor) { moveToFront(cursor) {
return this.getImage().moveToFront(cursor); return this.getImage().moveToFront(cursor);
}, }
}); }
export default ActionIcon; export default ActionIcon;

View File

@ -15,67 +15,57 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import web2d from '@wisemapping/web2d'; import * as web2d from '@wisemapping/web2d';
import Topic from './Topic'; import Topic from './Topic';
import Shape from './util/Shape'; import Shape from './util/Shape';
const CentralTopic = new Class( class CentralTopic extends Topic {
/** @lends CentralTopic */ { constructor(model, options) {
Extends: Topic, super(model, options);
/** }
* @extends mindplot.Topic
* @constructs
* @param model
* @param options
*/
initialize(model, options) {
this.parent(model, options);
},
_registerEvents() { _registerEvents() {
this.parent(); super._registerEvents();
// This disable the drag of the central topic. // This disable the drag of the central topic.
// But solves the problem of deselecting the nodes when the screen is clicked. // But solves the problem of deselecting the nodes when the screen is clicked.
this.addEvent('mousedown', (event) => { this.addEvent('mousedown', (event) => {
event.stopPropagation(); event.stopPropagation();
}); });
}, }
/** */ /** */
workoutIncomingConnectionPoint() { workoutIncomingConnectionPoint() {
return this.getPosition(); return this.getPosition();
}, }
/** */ /** */
setCursor(type) { setCursor(type) {
type = type == 'move' ? 'default' : type; super.setCursor(type === 'move' ? 'default' : type);
this.parent(type); }
},
/** */ /** */
updateTopicShape() {}, updateTopicShape() {}
_updatePositionOnChangeSize() { _updatePositionOnChangeSize() {
// Center main topic ... // Center main topic ...
const zeroPoint = new web2d.Point(0, 0); const zeroPoint = new web2d.Point(0, 0);
this.setPosition(zeroPoint); this.setPosition(zeroPoint);
}, }
/** */ /** */
getShrinkConnector() { getShrinkConnector() {
return null; return null;
}, }
/** */ /** */
workoutOutgoingConnectionPoint(targetPosition) { workoutOutgoingConnectionPoint(targetPosition) {
$assert(targetPosition, 'targetPoint can not be null'); $assert(targetPosition, 'targetPoint can not be null');
const pos = this.getPosition(); const pos = this.getPosition();
const isAtRight = Shape.isAtRight(targetPosition, pos); const isAtRight = Shape.isAtRight(targetPosition, pos);
const size = this.getSize(); const size = this.getSize();
return Shape.calculateRectConnectionPoint(pos, size, !isAtRight); return Shape.calculateRectConnectionPoint(pos, size, !isAtRight);
}, }
}, }
);
export default CentralTopic; export default CentralTopic;

View File

@ -17,21 +17,21 @@
*/ */
import { $defined } from '@wisemapping/core-js'; import { $defined } from '@wisemapping/core-js';
const Command = new Class(/** @lends mindplot.Command */{ class Command {
/** /**
* @classdesc The command base class for handling do/undo mindmap operations * @classdesc The command base class for handling do/undo mindmap operations
* @constructs * @constructs
*/ */
initialize() { constructor() {
this._id = Command._nextUUID(); this._id = Command._nextUUID();
}, }
/** /**
* @abstract * @abstract
*/ */
execute(commandContext) { execute(commandContext) {
throw 'execute must be implemented.'; throw 'execute must be implemented.';
}, }
/** /**
* Triggered by the undo button - reverses the executed command * Triggered by the undo button - reverses the executed command
@ -39,7 +39,7 @@ const Command = new Class(/** @lends mindplot.Command */{
*/ */
undoExecute(commandContext) { undoExecute(commandContext) {
throw 'undo must be implemented.'; throw 'undo must be implemented.';
}, }
/** /**
* Returns the unique id of this command * Returns the unique id of this command
@ -47,13 +47,13 @@ const Command = new Class(/** @lends mindplot.Command */{
*/ */
getId() { getId() {
return this._id; return this._id;
}, }
}); }
Command._nextUUID = function () { Command._nextUUID = function () {
if (!$defined(Command._uuid)) { if (!$defined(Command._uuid)) {
Command._uuid = 1; Command._uuid = 1;
} }
Command._uuid += 1; Command._uuid += 1;
return Command._uuid; return Command._uuid;

View File

@ -16,13 +16,13 @@
* limitations under the License. * limitations under the License.
*/ */
import { $assert, $defined } from '@wisemapping/core-js'; import { $assert, $defined } from '@wisemapping/core-js';
import web2d from '@wisemapping/web2d'; import * as web2d from '@wisemapping/web2d';
import INodeModel, { TopicShape } from './model/INodeModel'; import INodeModel, { TopicShape } from './model/INodeModel';
import TopicConfig from './TopicConfig'; import TopicConfig from './TopicConfig';
const ConnectionLine = new Class({ class ConnectionLine {
initialize(sourceNode, targetNode, lineType) { constructor(sourceNode, targetNode, lineType) {
$assert(targetNode, 'parentNode node can not be null'); $assert(targetNode, 'parentNode node can not be null');
$assert(sourceNode, 'childNode node can not be null'); $assert(sourceNode, 'childNode node can not be null');
$assert(sourceNode !== targetNode, 'Circular connection'); $assert(sourceNode !== targetNode, 'Circular connection');
@ -47,14 +47,14 @@ const ConnectionLine = new Class({
line.setFill(strokeColor, 1); line.setFill(strokeColor, 1);
this._line2d = line; this._line2d = line;
}, }
_getCtrlPoints(sourceNode, targetNode) { _getCtrlPoints(sourceNode, targetNode) {
const srcPos = sourceNode.workoutOutgoingConnectionPoint(targetNode.getPosition()); const srcPos = sourceNode.workoutOutgoingConnectionPoint(targetNode.getPosition());
const destPos = targetNode.workoutIncomingConnectionPoint(sourceNode.getPosition()); const destPos = targetNode.workoutIncomingConnectionPoint(sourceNode.getPosition());
const deltaX = (srcPos.x - destPos.x) / 3; const deltaX = (srcPos.x - destPos.x) / 3;
return [new web2d.Point(deltaX, 0), new web2d.Point(-deltaX, 0)]; return [new web2d.Point(deltaX, 0), new web2d.Point(-deltaX, 0)];
}, }
_createLine(lineType, defaultStyle) { _createLine(lineType, defaultStyle) {
if (!$defined(lineType)) { if (!$defined(lineType)) {
@ -79,19 +79,19 @@ const ConnectionLine = new Class({
break; break;
} }
return line; return line;
}, }
setVisibility(value) { setVisibility(value) {
this._line2d.setVisibility(value); this._line2d.setVisibility(value);
}, }
isVisible() { isVisible() {
return this._line2d.isVisible(); return this._line2d.isVisible();
}, }
setOpacity(opacity) { setOpacity(opacity) {
this._line2d.setOpacity(opacity); this._line2d.setOpacity(opacity);
}, }
redraw() { redraw() {
const line2d = this._line2d; const line2d = this._line2d;
@ -117,7 +117,7 @@ const ConnectionLine = new Class({
// Add connector ... // Add connector ...
this._positionateConnector(targetTopic); this._positionateConnector(targetTopic);
}, }
_positionateConnector(targetTopic) { _positionateConnector(targetTopic) {
const targetPosition = targetTopic.getPosition(); const targetPosition = targetTopic.getPosition();
@ -142,61 +142,61 @@ const ConnectionLine = new Class({
} }
connector.setPosition(x, y); connector.setPosition(x, y);
} }
}, }
setStroke(color, style, opacity) { setStroke(color, style, opacity) {
this._line2d.setStroke(null, null, color, opacity); this._line2d.setStroke(null, null, color, opacity);
}, }
addToWorkspace(workspace) { addToWorkspace(workspace) {
workspace.append(this._line2d); workspace.append(this._line2d);
this._line2d.moveToBack(); this._line2d.moveToBack();
}, }
removeFromWorkspace(workspace) { removeFromWorkspace(workspace) {
workspace.removeChild(this._line2d); workspace.removeChild(this._line2d);
}, }
getTargetTopic() { getTargetTopic() {
return this._targetTopic; return this._targetTopic;
}, }
getSourceTopic() { getSourceTopic() {
return this._sourceTopic; return this._sourceTopic;
}, }
getLineType() { getLineType() {
return this._lineType; return this._lineType;
}, }
getLine() { getLine() {
return this._line2d; return this._line2d;
}, }
getModel() { getModel() {
return this._model; return this._model;
}, }
setModel(model) { setModel(model) {
this._model = model; this._model = model;
}, }
getType() { getType() {
return 'ConnectionLine'; return 'ConnectionLine';
}, }
getId() { getId() {
return this._model.getId(); return this._model.getId();
}, }
moveToBack() { moveToBack() {
this._line2d.moveToBack(); this._line2d.moveToBack();
}, }
moveToFront() { moveToFront() {
this._line2d.moveToFront(); this._line2d.moveToFront();
}, }
}); }
ConnectionLine.getStrokeColor = () => '#495879'; ConnectionLine.getStrokeColor = () => '#495879';

View File

@ -15,14 +15,14 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import web2d from '@wisemapping/web2d'; import * as web2d from '@wisemapping/web2d';
import { $defined } from '@wisemapping/core-js'; import { $defined } from '@wisemapping/core-js';
import Shape from './util/Shape'; import Shape from './util/Shape';
import ActionDispatcher from './ActionDispatcher'; import ActionDispatcher from './ActionDispatcher';
const ControlPoint = new Class({ class ControlPoint {
initialize() { constructor() {
const control1 = new web2d.Elipse({ const control1 = new web2d.Elipse({
width: 6, width: 6,
height: 6, height: 6,
@ -68,7 +68,7 @@ const ControlPoint = new Class({
this._controlPointsController[1].addEvent('dblclick', (event) => { this._controlPointsController[1].addEvent('dblclick', (event) => {
me._mouseClick(event); me._mouseClick(event);
}); });
}, }
setLine(line) { setLine(line) {
if ($defined(this._line)) { if ($defined(this._line)) {
@ -82,11 +82,11 @@ const ControlPoint = new Class({
this._orignalCtrlPoint[1] = this._controls[1].clone(); this._orignalCtrlPoint[1] = this._controls[1].clone();
this._endPoint[0] = this._line.getLine().getFrom().clone(); this._endPoint[0] = this._line.getLine().getFrom().clone();
this._endPoint[1] = this._line.getLine().getTo().clone(); this._endPoint[1] = this._line.getLine().getTo().clone();
}, }
redraw() { redraw() {
if ($defined(this._line)) this._createControlPoint(); if ($defined(this._line)) this._createControlPoint();
}, }
_createControlPoint() { _createControlPoint() {
this._controls = this._line.getLine().getControlPoints(); this._controls = this._line.getLine().getControlPoints();
@ -110,9 +110,9 @@ const ControlPoint = new Class({
this._controls[ControlPoint.TO].x + pos.x, this._controls[ControlPoint.TO].x + pos.x,
this._controls[ControlPoint.TO].y + pos.y - 3, this._controls[ControlPoint.TO].y + pos.y - 3,
); );
}, }
_removeLine() {}, _removeLine() {}
_mouseDown(event, point, me) { _mouseDown(event, point, me) {
if (!this._isBinded) { if (!this._isBinded) {
@ -130,7 +130,7 @@ const ControlPoint = new Class({
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
return false; return false;
}, }
_mouseMoveEvent(event, point) { _mouseMoveEvent(event, point) {
const screen = this._workspace.getScreenManager(); const screen = this._workspace.getScreenManager();
@ -153,7 +153,7 @@ const ControlPoint = new Class({
this._controlLines[point].setFrom(cords.x, cords.y); this._controlLines[point].setFrom(cords.x, cords.y);
this._controlLines[point].setTo(pos.x - 2, pos.y); this._controlLines[point].setTo(pos.x - 2, pos.y);
this._line.getLine().updateLine(point); this._line.getLine().updateLine(point);
}, }
_mouseUp(event, point) { _mouseUp(event, point) {
this._workspace.getScreenManager().removeEvent('mousemove', this._mouseMoveFunction); this._workspace.getScreenManager().removeEvent('mousemove', this._mouseMoveFunction);
@ -162,13 +162,13 @@ const ControlPoint = new Class({
const actionDispatcher = ActionDispatcher.getInstance(); const actionDispatcher = ActionDispatcher.getInstance();
actionDispatcher.moveControlPoint(this, point); actionDispatcher.moveControlPoint(this, point);
this._isBinded = false; this._isBinded = false;
}, }
_mouseClick(event) { _mouseClick(event) {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
return false; return false;
}, }
setVisibility(visible) { setVisibility(visible) {
if (visible) { if (visible) {
@ -181,7 +181,7 @@ const ControlPoint = new Class({
this._controlPointsController[1].setVisibility(visible); this._controlPointsController[1].setVisibility(visible);
this._controlLines[0].setVisibility(visible); this._controlLines[0].setVisibility(visible);
this._controlLines[1].setVisibility(visible); this._controlLines[1].setVisibility(visible);
}, }
addToWorkspace(workspace) { addToWorkspace(workspace) {
this._workspace = workspace; this._workspace = workspace;
@ -189,7 +189,7 @@ const ControlPoint = new Class({
workspace.append(this._controlPointsController[1]); workspace.append(this._controlPointsController[1]);
workspace.append(this._controlLines[0]); workspace.append(this._controlLines[0]);
workspace.append(this._controlLines[1]); workspace.append(this._controlLines[1]);
}, }
removeFromWorkspace(workspace) { removeFromWorkspace(workspace) {
this._workspace = null; this._workspace = null;
@ -197,20 +197,20 @@ const ControlPoint = new Class({
workspace.removeChild(this._controlPointsController[1]); workspace.removeChild(this._controlPointsController[1]);
workspace.removeChild(this._controlLines[0]); workspace.removeChild(this._controlLines[0]);
workspace.removeChild(this._controlLines[1]); workspace.removeChild(this._controlLines[1]);
}, }
getControlPoint(index) { getControlPoint(index) {
return this._controls[index]; return this._controls[index];
}, }
getOriginalEndPoint(index) { getOriginalEndPoint(index) {
return this._endPoint[index]; return this._endPoint[index];
}, }
getOriginalCtrlPoint(index) { getOriginalCtrlPoint(index) {
return this._orignalCtrlPoint[index]; return this._orignalCtrlPoint[index];
}, }
}); }
ControlPoint.FROM = 0; ControlPoint.FROM = 0;
ControlPoint.TO = 1; ControlPoint.TO = 1;

View File

@ -18,13 +18,12 @@
import { $assert } from '@wisemapping/core-js'; import { $assert } from '@wisemapping/core-js';
import Keyboard from './Keyboard'; import Keyboard from './Keyboard';
const DesignerKeyboard = new Class({ class DesignerKeyboard extends Keyboard {
Extends: Keyboard, constructor(designer) {
super(designer);
initialize(designer) {
$assert(designer, 'designer can not be null'); $assert(designer, 'designer can not be null');
this._registerEvents(designer); this._registerEvents(designer);
}, }
_registerEvents(designer) { _registerEvents(designer) {
// Try with the keyboard .. // Try with the keyboard ..
@ -264,7 +263,7 @@ const DesignerKeyboard = new Class({
} }
} }
}); });
}, }
_goToBrother(designer, node, direction) { _goToBrother(designer, node, direction) {
const parent = node.getParent(); const parent = node.getParent();
@ -277,10 +276,10 @@ const DesignerKeyboard = new Class({
let dist = null; let dist = null;
for (let i = 0; i < brothers.length; i++) { for (let i = 0; i < brothers.length; i++) {
const sameSide = (x * brothers[i].getPosition().x) >= 0; const sameSide = (x * brothers[i].getPosition().x) >= 0;
if (brothers[i] != node && sameSide) { if (brothers[i] !== node && sameSide) {
const brother = brothers[i]; const brother = brothers[i];
const brotherY = brother.getPosition().y; const brotherY = brother.getPosition().y;
if (direction == 'DOWN' && brotherY > y) { if (direction === 'DOWN' && brotherY > y) {
let distancia = y - brotherY; let distancia = y - brotherY;
if (distancia < 0) { if (distancia < 0) {
distancia *= (-1); distancia *= (-1);
@ -289,7 +288,7 @@ const DesignerKeyboard = new Class({
dist = distancia; dist = distancia;
target = brothers[i]; target = brothers[i];
} }
} else if (direction == 'UP' && brotherY < y) { } else if (direction === 'UP' && brotherY < y) {
let distance = y - brotherY; let distance = y - brotherY;
if (distance < 0) { if (distance < 0) {
distance *= (-1); distance *= (-1);
@ -303,7 +302,7 @@ const DesignerKeyboard = new Class({
} }
this._goToNode(designer, target); this._goToNode(designer, target);
} }
}, }
_goToSideChild(designer, node, side) { _goToSideChild(designer, node, side) {
const children = node.getChildren(); const children = node.getChildren();
@ -313,13 +312,13 @@ const DesignerKeyboard = new Class({
for (let i = 0; i < children.length; i++) { for (let i = 0; i < children.length; i++) {
const child = children[i]; const child = children[i];
const childY = child.getPosition().y; const childY = child.getPosition().y;
if (side == 'LEFT' && child.getPosition().x < 0) { if (side === 'LEFT' && child.getPosition().x < 0) {
if (top == null || childY < top) { if (top == null || childY < top) {
target = child; target = child;
top = childY; top = childY;
} }
} }
if (side == 'RIGHT' && child.getPosition().x > 0) { if (side === 'RIGHT' && child.getPosition().x > 0) {
if (top == null || childY < top) { if (top == null || childY < top) {
target = child; target = child;
top = childY; top = childY;
@ -329,14 +328,14 @@ const DesignerKeyboard = new Class({
this._goToNode(designer, target); this._goToNode(designer, target);
} }
}, }
_goToParent(designer, node) { _goToParent(designer, node) {
const parent = node.getParent(); const parent = node.getParent();
if (parent) { if (parent) {
this._goToNode(designer, parent); this._goToNode(designer, parent);
} }
}, }
_goToChild(designer, node) { _goToChild(designer, node) {
const children = node.getChildren(); const children = node.getChildren();
@ -352,7 +351,7 @@ const DesignerKeyboard = new Class({
} }
this._goToNode(designer, target); this._goToNode(designer, target);
} }
}, }
_goToNode(designer, node) { _goToNode(designer, node) {
// First deselect all the nodes ... // First deselect all the nodes ...
@ -360,9 +359,8 @@ const DesignerKeyboard = new Class({
// Give focus to the selected node.... // Give focus to the selected node....
node.setOnFocus(true); node.setOnFocus(true);
}, }
}
});
DesignerKeyboard.specialKeys = { DesignerKeyboard.specialKeys = {
8: 'backspace', 8: 'backspace',

View File

@ -17,12 +17,12 @@
*/ */
import { $assert } from '@wisemapping/core-js'; import { $assert } from '@wisemapping/core-js';
const DesignerUndoManager = new Class({ class DesignerUndoManager {
initialize(fireChange) { constructor() {
this._undoQueue = []; this._undoQueue = [];
this._redoQueue = []; this._redoQueue = [];
this._baseId = 0; this._baseId = 0;
}, }
enqueue(command) { enqueue(command) {
$assert(command, 'Command can not be null'); $assert(command, 'Command can not be null');
@ -37,7 +37,7 @@ const DesignerUndoManager = new Class({
this._undoQueue.push(command); this._undoQueue.push(command);
} }
this._redoQueue = []; this._redoQueue = [];
}, }
execUndo(commandContext) { execUndo(commandContext) {
if (this._undoQueue.length > 0) { if (this._undoQueue.length > 0) {
@ -46,7 +46,7 @@ const DesignerUndoManager = new Class({
command.undoExecute(commandContext); command.undoExecute(commandContext);
} }
}, }
execRedo(commandContext) { execRedo(commandContext) {
if (this._redoQueue.length > 0) { if (this._redoQueue.length > 0) {
@ -54,11 +54,11 @@ const DesignerUndoManager = new Class({
this._undoQueue.push(command); this._undoQueue.push(command);
command.execute(commandContext); command.execute(commandContext);
} }
}, }
buildEvent() { buildEvent() {
return { undoSteps: this._undoQueue.length, redoSteps: this._redoQueue.length }; return { undoSteps: this._undoQueue.length, redoSteps: this._redoQueue.length };
}, }
markAsChangeBase() { markAsChangeBase() {
const undoLength = this._undoQueue.length; const undoLength = this._undoQueue.length;
@ -68,7 +68,7 @@ const DesignerUndoManager = new Class({
} else { } else {
this._baseId = 0; this._baseId = 0;
} }
}, }
hasBeenChanged() { hasBeenChanged() {
let result = true; let result = true;
@ -80,7 +80,7 @@ const DesignerUndoManager = new Class({
result = (this._baseId != command.getId()); result = (this._baseId != command.getId());
} }
return result; return result;
}, }
}); }
export default DesignerUndoManager; export default DesignerUndoManager;

View File

@ -16,15 +16,16 @@
* limitations under the License. * limitations under the License.
*/ */
import { $assert } from '@wisemapping/core-js'; import { $assert } from '@wisemapping/core-js';
const DragConnector = new Class({
initialize(designerModel, workspace) { class DragConnector {
constructor(designerModel, workspace) {
$assert(designerModel, 'designerModel can not be null'); $assert(designerModel, 'designerModel can not be null');
$assert(workspace, 'workspace can not be null'); $assert(workspace, 'workspace can not be null');
// this._layoutManager = layoutManager; // this._layoutManager = layoutManager;
this._designerModel = designerModel; this._designerModel = designerModel;
this._workspace = workspace; this._workspace = workspace;
}, }
checkConnection(dragTopic) { checkConnection(dragTopic) {
const topics = this._designerModel.getTopics(); const topics = this._designerModel.getTopics();
@ -41,7 +42,7 @@ const DragConnector = new Class({
if (!dragTopic.isConnected() && candidates.length > 0) { if (!dragTopic.isConnected() && candidates.length > 0) {
dragTopic.connectTo(candidates[0]); dragTopic.connectTo(candidates[0]);
} }
}, }
_searchConnectionCandidates(dragTopic) { _searchConnectionCandidates(dragTopic) {
let topics = this._designerModel.getTopics(); let topics = this._designerModel.getTopics();
@ -92,18 +93,18 @@ const DragConnector = new Class({
return me._proximityWeight(av, a, sPos, currentConnection) - me._proximityWeight(bv, b, sPos, currentConnection); return me._proximityWeight(av, a, sPos, currentConnection) - me._proximityWeight(bv, b, sPos, currentConnection);
}); });
return topics; return topics;
}, }
_proximityWeight(isAligned, target, sPos, currentConnection) { _proximityWeight(isAligned, target, sPos, currentConnection) {
const tPos = target.getPosition(); const tPos = target.getPosition();
return (isAligned ? 0 : 200) + Math.abs(tPos.x - sPos.x) + Math.abs(tPos.y - sPos.y) + (currentConnection == target ? 0 : 100); return (isAligned ? 0 : 200) + Math.abs(tPos.x - sPos.x) + Math.abs(tPos.y - sPos.y) + (currentConnection == target ? 0 : 100);
}, }
_isVerticallyAligned(targetSize, targetPosition, sourcePosition) { _isVerticallyAligned(targetSize, targetPosition, sourcePosition) {
return Math.abs(sourcePosition.y - targetPosition.y) < targetSize.height / 2; return Math.abs(sourcePosition.y - targetPosition.y) < targetSize.height / 2;
}, }
}); }
DragConnector.MAX_VERTICAL_CONNECTION_TOLERANCE = 80; DragConnector.MAX_VERTICAL_CONNECTION_TOLERANCE = 80;

View File

@ -18,15 +18,15 @@
import { $assert, $defined } from '@wisemapping/core-js'; import { $assert, $defined } from '@wisemapping/core-js';
import DragTopic from './DragTopic'; import DragTopic from './DragTopic';
const DragManager = new Class({ class DragManager {
initialize(workspace, eventDispatcher) { constructor(workspace, eventDispatcher) {
this._workspace = workspace; this._workspace = workspace;
this._designerModel = workspace; this._designerModel = workspace;
this._listeners = {}; this._listeners = {};
this._isDragInProcess = false; this._isDragInProcess = false;
this._eventDispatcher = eventDispatcher; this._eventDispatcher = eventDispatcher;
DragTopic.init(this._workspace); DragTopic.init(this._workspace);
}, }
add(node) { add(node) {
// Add behaviour ... // Add behaviour ...
@ -34,7 +34,7 @@ const DragManager = new Class({
const screen = workspace.getScreenManager(); const screen = workspace.getScreenManager();
const dragManager = this; const dragManager = this;
const me = this; const me = this;
const mouseDownListener = function (event) { const mouseDownListener = function mouseDownListener(event) {
if (workspace.isWorkspaceEventsEnabled()) { if (workspace.isWorkspaceEventsEnabled()) {
// Disable double drag... // Disable double drag...
workspace.enableWorkspaceEvents(false); workspace.enableWorkspaceEvents(false);
@ -56,7 +56,7 @@ const DragManager = new Class({
} }
}; };
node.addEvent('mousedown', mouseDownListener); node.addEvent('mousedown', mouseDownListener);
}, }
remove(node) { remove(node) {
const nodes = this._topics; const nodes = this._topics;
@ -68,7 +68,7 @@ const DragManager = new Class({
index = i; index = i;
} }
} }
}, }
_buildMouseMoveListener(workspace, dragNode, dragManager) { _buildMouseMoveListener(workspace, dragNode, dragManager) {
const screen = workspace.getScreenManager(); const screen = workspace.getScreenManager();
@ -98,7 +98,7 @@ const DragManager = new Class({
}; };
dragManager._mouseMoveListener = result; dragManager._mouseMoveListener = result;
return result; return result;
}, }
_buildMouseUpListener(workspace, node, dragNode, dragManager) { _buildMouseUpListener(workspace, node, dragNode, dragManager) {
const screen = workspace.getScreenManager(); const screen = workspace.getScreenManager();
@ -131,7 +131,7 @@ const DragManager = new Class({
}; };
dragManager._mouseUpListener = result; dragManager._mouseUpListener = result;
return result; return result;
}, }
/** /**
* type: * type:
@ -141,7 +141,7 @@ const DragManager = new Class({
*/ */
addEvent(type, listener) { addEvent(type, listener) {
this._listeners[type] = listener; this._listeners[type] = listener;
}, }
}); }
export default DragManager; export default DragManager;

View File

@ -16,14 +16,14 @@
* limitations under the License. * limitations under the License.
*/ */
import { $assert, $defined } from '@wisemapping/core-js'; import { $assert, $defined } from '@wisemapping/core-js';
import web2d from '@wisemapping/web2d'; import * as web2d from '@wisemapping/web2d';
import DragTopicConfig from './DragTopicConfig'; import DragTopicConfig from './DragTopicConfig';
import Shape from './util/Shape'; import Shape from './util/Shape';
import INodeModel from './model/INodeModel'; import INodeModel from './model/INodeModel';
const DragPivot = new Class({ class DragPivot {
initialize() { constructor() {
this._position = new web2d.Point(); this._position = new web2d.Point();
this._size = DragTopicConfig.PIVOT_SIZE; this._size = DragTopicConfig.PIVOT_SIZE;
@ -33,15 +33,15 @@ const DragPivot = new Class({
this._connectRect = this._buildRect(); this._connectRect = this._buildRect();
this._targetTopic = null; this._targetTopic = null;
this._isVisible = false; this._isVisible = false;
}, }
isVisible() { isVisible() {
return this._isVisible; return this._isVisible;
}, }
getTargetTopic() { getTargetTopic() {
return this._targetTopic; return this._targetTopic;
}, }
_buildStraightLine() { _buildStraightLine() {
const line = new web2d.CurvedLine(); const line = new web2d.CurvedLine();
@ -50,7 +50,7 @@ const DragPivot = new Class({
line.setOpacity(0.4); line.setOpacity(0.4);
line.setVisibility(false); line.setVisibility(false);
return line; return line;
}, }
_buildCurvedLine() { _buildCurvedLine() {
const line = new web2d.CurvedLine(); const line = new web2d.CurvedLine();
@ -59,7 +59,7 @@ const DragPivot = new Class({
line.setOpacity(0.4); line.setOpacity(0.4);
line.setVisibility(false); line.setVisibility(false);
return line; return line;
}, }
_redrawLine() { _redrawLine() {
// Update line position. // Update line position.
@ -90,16 +90,16 @@ const DragPivot = new Class({
// This solve several strange effects ;) // This solve several strange effects ;)
const targetPoint = targetTopic.workoutIncomingConnectionPoint(pivotPoint); const targetPoint = targetTopic.workoutIncomingConnectionPoint(pivotPoint);
line.setTo(targetPoint.x, targetPoint.y); line.setTo(targetPoint.x, targetPoint.y);
}, }
setPosition(point) { setPosition(point) {
this._position = point; this._position = point;
this._redrawLine(); this._redrawLine();
}, }
getPosition() { getPosition() {
return this._position; return this._position;
}, }
_buildRect() { _buildRect() {
const size = this._size; const size = this._size;
@ -113,16 +113,16 @@ const DragPivot = new Class({
const rect = new web2d.Rect(0, rectAttributes); const rect = new web2d.Rect(0, rectAttributes);
rect.setVisibility(false); rect.setVisibility(false);
return rect; return rect;
}, }
_getPivotRect() { _getPivotRect() {
return this._dragPivot; return this._dragPivot;
}, }
getSize() { getSize() {
const elem2d = this._getPivotRect(); const elem2d = this._getPivotRect();
return elem2d.getSize(); return elem2d.getSize();
}, }
setVisibility(value) { setVisibility(value) {
if (this.isVisible() != value) { if (this.isVisible() != value) {
@ -138,7 +138,7 @@ const DragPivot = new Class({
} }
this._isVisible = value; this._isVisible = value;
} }
}, }
// If the node is connected, validate that there is a line connecting both... // If the node is connected, validate that there is a line connecting both...
_getConnectionLine() { _getConnectionLine() {
@ -152,7 +152,7 @@ const DragPivot = new Class({
} }
} }
return result; return result;
}, }
addToWorkspace(workspace) { addToWorkspace(workspace) {
const pivotRect = this._getPivotRect(); const pivotRect = this._getPivotRect();
@ -178,7 +178,7 @@ const DragPivot = new Class({
connectRect.setVisibility(false); connectRect.setVisibility(false);
workspace.append(connectRect); workspace.append(connectRect);
connectRect.moveToBack(); connectRect.moveToBack();
}, }
removeFromWorkspace(workspace) { removeFromWorkspace(workspace) {
const shape = this._getPivotRect(); const shape = this._getPivotRect();
@ -194,7 +194,7 @@ const DragPivot = new Class({
if ($defined(this._curvedLine)) { if ($defined(this._curvedLine)) {
workspace.removeChild(this._curvedLine); workspace.removeChild(this._curvedLine);
} }
}, }
connectTo(targetTopic, position) { connectTo(targetTopic, position) {
$assert(!this._outgoingLine, 'Could not connect an already connected node'); $assert(!this._outgoingLine, 'Could not connect an already connected node');
@ -226,7 +226,7 @@ const DragPivot = new Class({
pivotRect.setPosition(position.x, position.y); pivotRect.setPosition(position.x, position.y);
this._redrawLine(); this._redrawLine();
}, }
disconnect(workspace) { disconnect(workspace) {
$assert(workspace, 'workspace can not be null.'); $assert(workspace, 'workspace can not be null.');
@ -234,7 +234,7 @@ const DragPivot = new Class({
this.setVisibility(false); this.setVisibility(false);
this._targetTopic = null; this._targetTopic = null;
}, }
}); }
export default DragPivot; export default DragPivot;

View File

@ -16,13 +16,13 @@
* limitations under the License. * limitations under the License.
*/ */
import { $assert, $defined } from '@wisemapping/core-js'; import { $assert, $defined } from '@wisemapping/core-js';
import web2d from '@wisemapping/web2d'; import * as web2d from '@wisemapping/web2d';
import ActionDispatcher from './ActionDispatcher'; import ActionDispatcher from './ActionDispatcher';
import DragPivot from './DragPivot'; import DragPivot from './DragPivot';
const DragTopic = new Class({ class DragTopic {
initialize(dragShape, draggedNode, layoutManger) { constructor(dragShape, draggedNode, layoutManger) {
$assert(dragShape, 'Rect can not be null.'); $assert(dragShape, 'Rect can not be null.');
$assert(draggedNode, 'draggedNode can not be null.'); $assert(draggedNode, 'draggedNode can not be null.');
$assert(layoutManger, 'layoutManger can not be null.'); $assert(layoutManger, 'layoutManger can not be null.');
@ -34,11 +34,11 @@ const DragTopic = new Class({
this._position = new web2d.Point(); this._position = new web2d.Point();
this._isInWorkspace = false; this._isInWorkspace = false;
this._isFreeLayoutEnabled = false; this._isFreeLayoutEnabled = false;
}, }
setOrder(order) { setOrder(order) {
this._order = order; this._order = order;
}, }
setPosition(x, y) { setPosition(x, y) {
// Update drag shadow position .... // Update drag shadow position ....
@ -78,7 +78,7 @@ const DragTopic = new Class({
this.setOrder(predict.order); this.setOrder(predict.order);
} }
} }
}, }
updateFreeLayout(event) { updateFreeLayout(event) {
const isFreeEnabled = (event.metaKey && Browser.Platform.mac) || (event.ctrlKey && !Browser.Platform.mac); const isFreeEnabled = (event.metaKey && Browser.Platform.mac) || (event.ctrlKey && !Browser.Platform.mac);
@ -87,27 +87,27 @@ const DragTopic = new Class({
dragPivot.setVisibility(!isFreeEnabled); dragPivot.setVisibility(!isFreeEnabled);
this._isFreeLayoutEnabled = isFreeEnabled; this._isFreeLayoutEnabled = isFreeEnabled;
} }
}, }
setVisibility(value) { setVisibility(value) {
const dragPivot = this._getDragPivot(); const dragPivot = this._getDragPivot();
dragPivot.setVisibility(value); dragPivot.setVisibility(value);
}, }
isVisible() { isVisible() {
const dragPivot = this._getDragPivot(); const dragPivot = this._getDragPivot();
return dragPivot.isVisible(); return dragPivot.isVisible();
}, }
getInnerShape() { getInnerShape() {
return this._elem2d; return this._elem2d;
}, }
disconnect(workspace) { disconnect(workspace) {
// Clear connection line ... // Clear connection line ...
const dragPivot = this._getDragPivot(); const dragPivot = this._getDragPivot();
dragPivot.disconnect(workspace); dragPivot.disconnect(workspace);
}, }
connectTo(parent) { connectTo(parent) {
$assert(parent, 'Parent connection node can not be null.'); $assert(parent, 'Parent connection node can not be null.');
@ -126,11 +126,11 @@ const DragTopic = new Class({
dragPivot.setVisibility(true); dragPivot.setVisibility(true);
this.setOrder(predict.order); this.setOrder(predict.order);
}, }
getDraggedTopic() { getDraggedTopic() {
return this._draggedNode; return this._draggedNode;
}, }
removeFromWorkspace(workspace) { removeFromWorkspace(workspace) {
if (this._isInWorkspace) { if (this._isInWorkspace) {
@ -143,11 +143,11 @@ const DragTopic = new Class({
this._isInWorkspace = false; this._isInWorkspace = false;
} }
}, }
isInWorkspace() { isInWorkspace() {
return this._isInWorkspace; return this._isInWorkspace;
}, }
addToWorkspace(workspace) { addToWorkspace(workspace) {
if (!this._isInWorkspace) { if (!this._isInWorkspace) {
@ -156,19 +156,19 @@ const DragTopic = new Class({
dragPivot.addToWorkspace(workspace); dragPivot.addToWorkspace(workspace);
this._isInWorkspace = true; this._isInWorkspace = true;
} }
}, }
_getDragPivot() { _getDragPivot() {
return DragTopic.__getDragPivot(); return DragTopic.__getDragPivot();
}, }
getPosition() { getPosition() {
return this._position; return this._position;
}, }
isDragTopic() { isDragTopic() {
return true; return true;
}, }
applyChanges(workspace) { applyChanges(workspace) {
$assert(workspace, 'workspace can not be null'); $assert(workspace, 'workspace can not be null');
@ -193,23 +193,23 @@ const DragTopic = new Class({
} else { } else {
actionDispatcher.moveTopic(topicId, position); actionDispatcher.moveTopic(topicId, position);
} }
}, }
getConnectedToTopic() { getConnectedToTopic() {
const dragPivot = this._getDragPivot(); const dragPivot = this._getDragPivot();
return dragPivot.getTargetTopic(); return dragPivot.getTargetTopic();
}, }
isConnected() { isConnected() {
return this.getConnectedToTopic() != null; return this.getConnectedToTopic() != null;
}, }
isFreeLayoutOn() { isFreeLayoutOn() {
// return this._isFreeLayoutEnabled; // return this._isFreeLayoutEnabled;
// Disable free layout ... // Disable free layout ...
return false; return false;
}, }
}); }
DragTopic.init = function (workspace) { DragTopic.init = function (workspace) {
$assert(workspace, 'workspace can not be null'); $assert(workspace, 'workspace can not be null');

View File

@ -16,23 +16,23 @@
* limitations under the License. * limitations under the License.
*/ */
const EditorProperties = new Class({ class EditorProperties {
initialize() { constructor() {
this._zoom = 0; this._zoom = 0;
this._position = 0; this._position = 0;
}, }
setZoom(zoom) { setZoom(zoom) {
this._zoom = zoom; this._zoom = zoom;
}, }
getZoom() { getZoom() {
return this._zoom; return this._zoom;
}, }
asProperties() { asProperties() {
return `zoom=${this._zoom}\n`; return `zoom=${this._zoom}\n`;
}, }
}); }
export default EditorProperties; export default EditorProperties;

View File

@ -16,44 +16,45 @@
* limitations under the License. * limitations under the License.
*/ */
import { $assert } from "@wisemapping/core-js"; import { $assert } from "@wisemapping/core-js";
import web2d from '@wisemapping/web2d'; import * as web2d from '@wisemapping/web2d';
const Icon = new Class({ class Icon {
initialize(url) { constructor(url) {
$assert(url, 'topic can not be null'); $assert(url, 'topic can not be null');
this._image = new web2d.Image(); this._image = new web2d.Image();
this._image.setHref(url); this._image.setHref(url);
this._image.setSize(Icon.SIZE, Icon.SIZE); this._image.setSize(Icon.SIZE, Icon.SIZE);
}, }
getImage() { getImage() {
return this._image; return this._image;
}, }
setGroup(group) { setGroup(group) {
this._group = group; this._group = group;
}, }
getGroup() { getGroup() {
return this._group; return this._group;
}, }
getSize() { getSize() {
return this._image.getSize(); return this._image.getSize();
}, }
getPosition() { getPosition() {
return this._image.getPosition(); return this._image.getPosition();
}, }
addEvent(type, fnc) { addEvent(type, fnc) {
this._image.addEvent(type, fnc); this._image.addEvent(type, fnc);
}, }
// eslint-disable-next-line class-methods-use-this
remove() { remove() {
throw new Error('Unsupported operation'); throw new Error('Unsupported operation');
}, }
}); }
Icon.SIZE = 90; Icon.SIZE = 90;

View File

@ -16,7 +16,7 @@
* limitations under the License. * limitations under the License.
*/ */
import { $assert, $defined } from '@wisemapping/core-js'; import { $assert, $defined } from '@wisemapping/core-js';
import web2d from '@wisemapping/web2d'; import * as web2d from '@wisemapping/web2d';
import Icon from './Icon'; import Icon from './Icon';

View File

@ -15,23 +15,22 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import { $assert } from "@wisemapping/core-js"; import { $assert } from '@wisemapping/core-js';
import Icon from './Icon'; import Icon from './Icon';
import ActionDispatcher from './ActionDispatcher'; import ActionDispatcher from './ActionDispatcher';
const ImageIcon = new Class({ class ImageIcon extends Icon {
Extends: Icon, constructor(topic, iconModel, readOnly) {
initialize(topic, iconModel, readOnly) {
$assert(iconModel, 'iconModel can not be null'); $assert(iconModel, 'iconModel can not be null');
$assert(topic, 'topic can not be null'); $assert(topic, 'topic can not be null');
this._topicId = topic.getId();
this._featureModel = iconModel;
// Build graph image representation ... // Build graph image representation ...
const iconType = iconModel.getIconType(); const iconType = iconModel.getIconType();
const imgUrl = this._getImageUrl(iconType); const imgUrl = ImageIcon._getImageUrl(iconType);
this.parent(imgUrl); super(imgUrl);
this._topicId = topic.getId();
this._featureModel = iconModel;
if (!readOnly) { if (!readOnly) {
// Icon // Icon
@ -39,33 +38,33 @@ const ImageIcon = new Class({
const me = this; const me = this;
image.addEvent('click', () => { image.addEvent('click', () => {
const iconType = iconModel.getIconType(); const iconType = iconModel.getIconType();
const newIconType = me._getNextFamilyIconId(iconType); const newIconType = ImageIcon._getNextFamilyIconId(iconType);
iconModel.setIconType(newIconType); iconModel.setIconType(newIconType);
const imgUrl = me._getImageUrl(newIconType); const imgUrl = ImageIcon._getImageUrl(newIconType);
me._image.setHref(imgUrl); me._image.setHref(imgUrl);
}); });
this._image.setCursor('pointer'); this._image.setCursor('pointer');
} }
}, }
_getImageUrl(iconId) { static _getImageUrl(iconId) {
return `icons/${iconId}.png`; return `icons/${iconId}.png`;
}, }
getModel() { getModel() {
return this._featureModel; return this._featureModel;
}, }
_getNextFamilyIconId(iconId) { static _getNextFamilyIconId(iconId) {
const familyIcons = this._getFamilyIcons(iconId); const familyIcons = ImageIcon._getFamilyIcons(iconId);
$assert(familyIcons != null, 'Family Icon not found!'); $assert(familyIcons != null, 'Family Icon not found!');
let result = null; let result = null;
for (let i = 0; i < familyIcons.length && result == null; i++) { for (let i = 0; i < familyIcons.length && result == null; i++) {
if (familyIcons[i] == iconId) { if (familyIcons[i] === iconId) {
// Is last one? // Is last one?
if (i == (familyIcons.length - 1)) { if (i === (familyIcons.length - 1)) {
result = familyIcons[0]; result = familyIcons[0];
} else { } else {
result = familyIcons[i + 1]; result = familyIcons[i + 1];
@ -75,32 +74,32 @@ const ImageIcon = new Class({
} }
return result; return result;
}, }
_getFamilyIcons(iconId) { static _getFamilyIcons(iconId) {
$assert(iconId != null, 'id must not be null'); $assert(iconId != null, 'id must not be null');
$assert(iconId.indexOf('_') != -1, "Invalid icon id (it must contain '_')"); $assert(iconId.indexOf('_') !== -1, "Invalid icon id (it must contain '_')");
let result = null; let result = null;
for (let i = 0; i < ImageIcon.prototype.ICON_FAMILIES.length; i++) { for (let i = 0; i < ImageIcon.prototype.ICON_FAMILIES.length; i++) {
const family = ImageIcon.prototype.ICON_FAMILIES[i]; const family = ImageIcon.prototype.ICON_FAMILIES[i];
const iconFamilyId = iconId.substr(0, iconId.indexOf('_')); const iconFamilyId = iconId.substr(0, iconId.indexOf('_'));
if (family.id == iconFamilyId) { if (family.id === iconFamilyId) {
result = family.icons; result = family.icons;
break; break;
} }
} }
return result; return result;
}, }
remove() { remove() {
const actionDispatcher = ActionDispatcher.getInstance(); const actionDispatcher = ActionDispatcher.getInstance();
const featureId = this._featureModel.getId(); const featureId = this._featureModel.getId();
const topicId = this._topicId; const topicId = this._topicId;
actionDispatcher.removeFeatureFromTopic(topicId, featureId); actionDispatcher.removeFeatureFromTopic(topicId, featureId);
}, }
}); }
ImageIcon.prototype.ICON_FAMILIES = [ ImageIcon.prototype.ICON_FAMILIES = [
{ id: 'face', icons: ['face_plain', 'face_sad', 'face_crying', 'face_smile', 'face_surprise', 'face_wink'] }, { id: 'face', icons: ['face_plain', 'face_sad', 'face_crying', 'face_smile', 'face_surprise', 'face_wink'] },

View File

@ -20,20 +20,18 @@ import $ from '@libraries/jquery-2.1.0';
import Icon from './Icon'; import Icon from './Icon';
import LinkIconTooltip from './widget/LinkIconTooltip'; import LinkIconTooltip from './widget/LinkIconTooltip';
const LinkIcon = new Class({ class LinkIcon extends Icon {
constructor(topic, linkModel, readOnly) {
Extends: Icon,
initialize(topic, linkModel, readOnly) {
$assert(topic, 'topic can not be null'); $assert(topic, 'topic can not be null');
$assert(linkModel, 'linkModel can not be null'); $assert(linkModel, 'linkModel can not be null');
this.parent(LinkIcon.IMAGE_URL); super(LinkIcon.IMAGE_URL);
this._linksModel = linkModel; this._linksModel = linkModel;
this._topic = topic; this._topic = topic;
this._readOnly = readOnly; this._readOnly = readOnly;
this._registerEvents(); this._registerEvents();
}, }
_registerEvents() { _registerEvents() {
this._image.setCursor('pointer'); this._image.setCursor('pointer');
@ -61,12 +59,12 @@ const LinkIcon = new Class({
$(this.getImage().peer._native).mouseenter(() => { $(this.getImage().peer._native).mouseenter(() => {
me._tip.show(); me._tip.show();
}); });
}, }
getModel() { getModel() {
return this._linksModel; return this._linksModel;
}, }
}); }
LinkIcon.IMAGE_URL = 'images/links.png'; LinkIcon.IMAGE_URL = 'images/links.png';
export default LinkIcon; export default LinkIcon;

View File

@ -18,21 +18,20 @@
import $ from '@libraries/jquery-2.1.0'; import $ from '@libraries/jquery-2.1.0';
import PersistenceManager from './PersistenceManager'; import PersistenceManager from './PersistenceManager';
const LocalStorageManager = new Class({ class LocalStorageManager extends PersistenceManager {
Extends: PersistenceManager, constructor(documentUrl, forceLoad) {
initialize(documentUrl, forceLoad) { super();
this.parent();
this.documentUrl = documentUrl; this.documentUrl = documentUrl;
this.forceLoad = forceLoad; this.forceLoad = forceLoad;
}, }
saveMapXml(mapId, mapXml, pref, saveHistory, events) { saveMapXml(mapId, mapXml, pref, saveHistory, events) {
localStorage.setItem(`${mapId}-xml`, mapXml); localStorage.setItem(`${mapId}-xml`, mapXml);
}, }
discardChanges(mapId) { discardChanges(mapId) {
localStorage.removeItem(`${mapId}-xml`); localStorage.removeItem(`${mapId}-xml`);
}, }
loadMapDom(mapId) { loadMapDom(mapId) {
let xml = localStorage.getItem(`${mapId}-xml`); let xml = localStorage.getItem(`${mapId}-xml`);
@ -54,11 +53,11 @@ const LocalStorageManager = new Class({
} }
return jQuery.parseXML(xml); return jQuery.parseXML(xml);
}, }
unlockMap(mindmap) { unlockMap(mindmap) {
// Ignore, no implementation required ... // Ignore, no implementation required ...
}, }
}); }
export default LocalStorageManager; export default LocalStorageManager;

View File

@ -16,148 +16,144 @@
* limitations under the License. * limitations under the License.
*/ */
import { $assert, $defined } from '@wisemapping/core-js'; import { $assert, $defined } from '@wisemapping/core-js';
import web2d from '@wisemapping/web2d'; import * as web2d from '@wisemapping/web2d';
import Topic from './Topic'; import Topic from './Topic';
import { TopicShape } from './model/INodeModel'; import { TopicShape } from './model/INodeModel';
import Shape from './util/Shape'; import Shape from './util/Shape';
const MainTopic = new Class( class MainTopic extends Topic {
/** @lends MainTopic */ { /**
Extends: Topic,
/**
* @extends mindplot.Topic * @extends mindplot.Topic
* @constructs * @constructs
* @param model * @param model
* @param options * @param options
*/ */
initialize(model, options) { constructor(model, options) {
this.parent(model, options); super(model, options);
}, this.INNER_RECT_ATTRIBUTES = { stroke: '0.5 solid #009900' };
}
INNER_RECT_ATTRIBUTES: { stroke: '0.5 solid #009900' }, _buildDragShape() {
const innerShape = this._buildShape(this.INNER_RECT_ATTRIBUTES, this.getShapeType());
const size = this.getSize();
innerShape.setSize(size.width, size.height);
innerShape.setPosition(0, 0);
innerShape.setOpacity(0.5);
innerShape.setCursor('default');
innerShape.setVisibility(true);
_buildDragShape() { const brColor = this.getBorderColor();
const innerShape = this._buildShape(this.INNER_RECT_ATTRIBUTES, this.getShapeType()); innerShape.setAttribute('strokeColor', brColor);
const size = this.getSize();
innerShape.setSize(size.width, size.height);
innerShape.setPosition(0, 0);
innerShape.setOpacity(0.5);
innerShape.setCursor('default');
innerShape.setVisibility(true);
const brColor = this.getBorderColor(); const bgColor = this.getBackgroundColor();
innerShape.setAttribute('strokeColor', brColor); innerShape.setAttribute('fillColor', bgColor);
const bgColor = this.getBackgroundColor(); // Create group ...
innerShape.setAttribute('fillColor', bgColor); const groupAttributes = {
width: 100,
height: 100,
coordSizeWidth: 100,
coordSizeHeight: 100,
};
const group = new web2d.Group(groupAttributes);
group.append(innerShape);
// Create group ... // Add Text ...
const groupAttributes = { if (this.getShapeType() !== TopicShape.IMAGE) {
width: 100, const textShape = this._buildTextShape(true);
height: 100, const text = this.getText();
coordSizeWidth: 100, textShape.setText(text);
coordSizeHeight: 100, textShape.setOpacity(0.5);
}; group.append(textShape);
const group = new web2d.Group(groupAttributes); }
group.append(innerShape); return group;
}
// Add Text ... /** */
if (this.getShapeType() !== TopicShape.IMAGE) { updateTopicShape(targetTopic, workspace) {
const textShape = this._buildTextShape(true); // Change figure based on the connected topic ...
const text = this.getText(); const model = this.getModel();
textShape.setText(text); let shapeType = model.getShapeType();
textShape.setOpacity(0.5); if (!targetTopic.isCentralTopic()) {
group.append(textShape);
}
return group;
},
/** */
updateTopicShape(targetTopic, workspace) {
// Change figure based on the connected topic ...
const model = this.getModel();
let shapeType = model.getShapeType();
if (!targetTopic.isCentralTopic()) {
if (!$defined(shapeType)) {
// Get the real shape type ...
shapeType = this.getShapeType();
this._setShapeType(shapeType, false);
}
}
},
/** */
disconnect(workspace) {
this.parent(workspace);
const size = this.getSize();
const model = this.getModel();
let shapeType = model.getShapeType();
if (!$defined(shapeType)) { if (!$defined(shapeType)) {
// Change figure ... // Get the real shape type ...
shapeType = this.getShapeType(); shapeType = this.getShapeType();
this._setShapeType(TopicShape.ROUNDED_RECT, false); this._setShapeType(shapeType, false);
} }
const innerShape = this.getInnerShape(); }
innerShape.setVisibility(true); }
},
_updatePositionOnChangeSize(oldSize, newSize) { /** */
const xOffset = Math.round((newSize.width - oldSize.width) / 2); disconnect(workspace) {
const pos = this.getPosition(); this.parent(workspace);
if ($defined(pos)) { const size = this.getSize();
if (pos.x > 0) {
pos.x += xOffset;
} else {
pos.x -= xOffset;
}
this.setPosition(pos);
}
},
/** */ const model = this.getModel();
workoutIncomingConnectionPoint(sourcePosition) { let shapeType = model.getShapeType();
return Shape.workoutIncomingConnectionPoint(this, sourcePosition); if (!$defined(shapeType)) {
}, // Change figure ...
shapeType = this.getShapeType();
this._setShapeType(TopicShape.ROUNDED_RECT, false);
}
const innerShape = this.getInnerShape();
innerShape.setVisibility(true);
}
/** */ _updatePositionOnChangeSize(oldSize, newSize) {
workoutOutgoingConnectionPoint(targetPosition) { const xOffset = Math.round((newSize.width - oldSize.width) / 2);
$assert(targetPosition, 'targetPoint can not be null'); const pos = this.getPosition();
const pos = this.getPosition(); if ($defined(pos)) {
const isAtRight = Shape.isAtRight(targetPosition, pos); if (pos.x > 0) {
const size = this.getSize(); pos.x += xOffset;
let result;
if (this.getShapeType() === TopicShape.LINE) {
result = new web2d.Point();
const groupPosition = this._elem2d.getPosition();
const innerShareSize = this.getInnerShape().getSize();
if (innerShareSize) {
const magicCorrectionNumber = 0.3;
if (!isAtRight) {
result.x = groupPosition.x + innerShareSize.width - magicCorrectionNumber;
} else {
result.x = groupPosition.x + magicCorrectionNumber;
}
result.y = groupPosition.y + innerShareSize.height;
} else {
// Hack: When the size has not being defined. This is because the node has not being added.
// Try to do our best ...
if (!isAtRight) {
result.x = pos.x + size.width / 2;
} else {
result.x = pos.x - size.width / 2;
}
result.y = pos.y + size.height / 2;
}
} else { } else {
result = Shape.calculateRectConnectionPoint(pos, size, isAtRight, true); pos.x -= xOffset;
} }
return result; this.setPosition(pos);
}, }
}, }
);
/** */
workoutIncomingConnectionPoint(sourcePosition) {
return Shape.workoutIncomingConnectionPoint(this, sourcePosition);
}
/** */
workoutOutgoingConnectionPoint(targetPosition) {
$assert(targetPosition, 'targetPoint can not be null');
const pos = this.getPosition();
const isAtRight = Shape.isAtRight(targetPosition, pos);
const size = this.getSize();
let result;
if (this.getShapeType() === TopicShape.LINE) {
result = new web2d.Point();
const groupPosition = this._elem2d.getPosition();
const innerShareSize = this.getInnerShape().getSize();
if (innerShareSize) {
const magicCorrectionNumber = 0.3;
if (!isAtRight) {
result.x = groupPosition.x + innerShareSize.width - magicCorrectionNumber;
} else {
result.x = groupPosition.x + magicCorrectionNumber;
}
result.y = groupPosition.y + innerShareSize.height;
} else {
// Hack: When the size has not being defined. This is because the node has not being added.
// Try to do our best ...
if (!isAtRight) {
result.x = pos.x + size.width / 2;
} else {
result.x = pos.x - size.width / 2;
}
result.y = pos.y + size.height / 2;
}
} else {
result = Shape.calculateRectConnectionPoint(pos, size, isAtRight, true);
}
return result;
}
}
export default MainTopic; export default MainTopic;

View File

@ -18,12 +18,12 @@
import Events from './Events'; import Events from './Events';
import ActionDispatcher from './ActionDispatcher'; import ActionDispatcher from './ActionDispatcher';
const MultilineTextEditor = new Class({ class MultilineTextEditor extends Events {
Extends: Events, constructor() {
initialize() { super();
this._topic = null; this._topic = null;
this._timeoutId = -1; this._timeoutId = -1;
}, }
_buildEditor() { _buildEditor() {
const result = $('<div></div>') const result = $('<div></div>')
@ -46,7 +46,7 @@ const MultilineTextEditor = new Class({
result.append(textareaElem); result.append(textareaElem);
return result; return result;
}, }
_registerEvents(containerElem) { _registerEvents(containerElem) {
const textareaElem = this._getTextareaElem(); const textareaElem = this._getTextareaElem();
@ -120,7 +120,7 @@ const MultilineTextEditor = new Class({
containerElem.on('mousedown', (event) => { containerElem.on('mousedown', (event) => {
event.stopPropagation(); event.stopPropagation();
}); });
}, }
_adjustEditorSize() { _adjustEditorSize() {
if (this.isVisible()) { if (this.isVisible()) {
@ -140,11 +140,11 @@ const MultilineTextEditor = new Class({
height: textElem.height(), height: textElem.height(),
}); });
} }
}, }
isVisible() { isVisible() {
return $defined(this._containerElem) && this._containerElem.css('display') == 'block'; return $defined(this._containerElem) && this._containerElem.css('display') == 'block';
}, }
_updateModel() { _updateModel() {
if (this._topic.getText() != this._getText()) { if (this._topic.getText() != this._getText()) {
@ -154,7 +154,7 @@ const MultilineTextEditor = new Class({
const actionDispatcher = ActionDispatcher.getInstance(); const actionDispatcher = ActionDispatcher.getInstance();
actionDispatcher.changeTextToTopic([topicId], text); actionDispatcher.changeTextToTopic([topicId], text);
} }
}, }
show(topic, text) { show(topic, text) {
// Close a previous node editor if it's opened ... // Close a previous node editor if it's opened ...
@ -172,7 +172,7 @@ const MultilineTextEditor = new Class({
this._registerEvents(containerElem); this._registerEvents(containerElem);
this._showEditor(text); this._showEditor(text);
} }
}, }
_showEditor(defaultText) { _showEditor(defaultText) {
const topic = this._topic; const topic = this._topic;
@ -208,7 +208,7 @@ const MultilineTextEditor = new Class({
}; };
this._timeoutId = displayFunc.delay(10); this._timeoutId = displayFunc.delay(10);
}, }
_setStyle(fontStyle) { _setStyle(fontStyle) {
const inputField = this._getTextareaElem(); const inputField = this._getTextareaElem();
@ -233,21 +233,21 @@ const MultilineTextEditor = new Class({
}; };
inputField.css(style); inputField.css(style);
this._containerElem.css(style); this._containerElem.css(style);
}, }
_setText(text) { _setText(text) {
const textareaElem = this._getTextareaElem(); const textareaElem = this._getTextareaElem();
textareaElem.val(text); textareaElem.val(text);
this._adjustEditorSize(); this._adjustEditorSize();
}, }
_getText() { _getText() {
return this._getTextareaElem().val(); return this._getTextareaElem().val();
}, }
_getTextareaElem() { _getTextareaElem() {
return this._containerElem.find('textarea'); return this._containerElem.find('textarea');
}, }
_positionCursor(textareaElem, selectText) { _positionCursor(textareaElem, selectText) {
textareaElem.focus(); textareaElem.focus();
@ -277,7 +277,7 @@ const MultilineTextEditor = new Class({
textareaElem.focus(); textareaElem.focus();
} }
} }
}, }
close(update) { close(update) {
if (this.isVisible() && this._topic) { if (this.isVisible() && this._topic) {
@ -297,7 +297,7 @@ const MultilineTextEditor = new Class({
this._timeoutId = -1; this._timeoutId = -1;
} }
this._topic = null; this._topic = null;
}, }
}); }
export default MultilineTextEditor; export default MultilineTextEditor;

View File

@ -19,172 +19,170 @@ import { $assert } from '@wisemapping/core-js';
import TopicConfig from './TopicConfig'; import TopicConfig from './TopicConfig';
import DragTopic from './DragTopic'; import DragTopic from './DragTopic';
const NodeGraph = new Class( class NodeGraph {
/** @lends NodeGraph */ { /**
/** * @constructs
* @constructs * @param {mindplot.model.NodeModel} nodeModel
* @param {mindplot.model.NodeModel} nodeModel * @param {Object<Number, String, Boolean>} options
* @param {Object<Number, String, Boolean>} options * @throws will throw an error if nodeModel is null or undefined
* @throws will throw an error if nodeModel is null or undefined */
*/ constructor(nodeModel, options) {
initialize(nodeModel, options) { $assert(nodeModel, 'model can not be null');
$assert(nodeModel, 'model can not be null');
this._options = options; this._options = options;
this._mouseEvents = true; this._mouseEvents = true;
this.setModel(nodeModel); this.setModel(nodeModel);
this._onFocus = false; this._onFocus = false;
this._size = { width: 50, height: 20 }; this._size = { width: 50, height: 20 };
}, }
/** @return true if option is set to read-only */ /** @return true if option is set to read-only */
isReadOnly() { isReadOnly() {
return this._options.readOnly; return this._options.readOnly;
}, }
/** @return model type */ /** @return model type */
getType() { getType() {
const model = this.getModel(); const model = this.getModel();
return model.getType(); return model.getType();
}, }
/** /**
* @param {String} id * @param {String} id
* @throws will throw an error if the topic id is not a number * @throws will throw an error if the topic id is not a number
*/ */
setId(id) { setId(id) {
$assert(typeof topic.getId() === 'number', `id is not a number:${id}`); $assert(typeof topic.getId() === 'number', `id is not a number:${id}`);
this.getModel().setId(id); this.getModel().setId(id);
}, }
_set2DElement(elem2d) { _set2DElement(elem2d) {
this._elem2d = elem2d; this._elem2d = elem2d;
}, }
/** /**
* @return 2D element * @return 2D element
* @throws will throw an error if the element is null or undefined within node graph * @throws will throw an error if the element is null or undefined within node graph
*/ */
get2DElement() { get2DElement() {
$assert(this._elem2d, 'NodeGraph has not been initialized properly'); $assert(this._elem2d, 'NodeGraph has not been initialized properly');
return this._elem2d; return this._elem2d;
}, }
/** @abstract */ /** @abstract */
setPosition(point, fireEvent) { setPosition(point, fireEvent) {
throw new Error('Unsupported operation'); throw new Error('Unsupported operation');
}, }
/** */ /** */
addEvent(type, listener) { addEvent(type, listener) {
const elem = this.get2DElement(); const elem = this.get2DElement();
elem.addEvent(type, listener); elem.addEvent(type, listener);
}, }
/** */ /** */
removeEvent(type, listener) { removeEvent(type, listener) {
const elem = this.get2DElement(); const elem = this.get2DElement();
elem.removeEvent(type, listener); elem.removeEvent(type, listener);
}, }
/** */ /** */
fireEvent(type, event) { fireEvent(type, event) {
const elem = this.get2DElement(); const elem = this.get2DElement();
elem.trigger(type, event); elem.trigger(type, event);
}, }
/** */ /** */
setMouseEventsEnabled(isEnabled) { setMouseEventsEnabled(isEnabled) {
this._mouseEvents = isEnabled; this._mouseEvents = isEnabled;
}, }
/** */ /** */
isMouseEventsEnabled() { isMouseEventsEnabled() {
return this._mouseEvents; return this._mouseEvents;
}, }
/** @return {Object<Number>} size */ /** @return {Object<Number>} size */
getSize() { getSize() {
return this._size; return this._size;
}, }
/** @param {Object<Number>} size */ /** @param {Object<Number>} size */
setSize(size) { setSize(size) {
this._size.width = parseInt(size.width, 10); this._size.width = parseInt(size.width, 10);
this._size.height = parseInt(size.height, 10); this._size.height = parseInt(size.height, 10);
}, }
/** /**
* @return {mindplot.model.NodeModel} the node model * @return {mindplot.model.NodeModel} the node model
*/ */
getModel() { getModel() {
$assert(this._model, 'Model has not been initialized yet'); $assert(this._model, 'Model has not been initialized yet');
return this._model; return this._model;
}, }
/** /**
* @param {mindplot.NodeModel} model the node model * @param {mindplot.NodeModel} model the node model
* @throws will throw an error if model is null or undefined * @throws will throw an error if model is null or undefined
*/ */
setModel(model) { setModel(model) {
$assert(model, 'Model can not be null'); $assert(model, 'Model can not be null');
this._model = model; this._model = model;
}, }
/** */ /** */
getId() { getId() {
return this._model.getId(); return this._model.getId();
}, }
/** */ /** */
setOnFocus(focus) { setOnFocus(focus) {
if (this._onFocus !== focus) { if (this._onFocus !== focus) {
this._onFocus = focus; this._onFocus = focus;
const outerShape = this.getOuterShape(); const outerShape = this.getOuterShape();
if (focus) { if (focus) {
outerShape.setFill(TopicConfig.OUTER_SHAPE_ATTRIBUTES_FOCUS.fillColor); outerShape.setFill(TopicConfig.OUTER_SHAPE_ATTRIBUTES_FOCUS.fillColor);
outerShape.setOpacity(1); outerShape.setOpacity(1);
} else { } else {
outerShape.setFill(TopicConfig.OUTER_SHAPE_ATTRIBUTES.fillColor); outerShape.setFill(TopicConfig.OUTER_SHAPE_ATTRIBUTES.fillColor);
outerShape.setOpacity(0); outerShape.setOpacity(0);
}
this.setCursor('move');
// In any case, always try to hide the editor ...
this.closeEditors();
// Fire event ...
this.fireEvent(focus ? 'ontfocus' : 'ontblur', this);
} }
}, this.setCursor('move');
/** @return {Boolean} true if the node graph is on focus */ // In any case, always try to hide the editor ...
isOnFocus() { this.closeEditors();
return this._onFocus;
},
/** */ // Fire event ...
dispose(workspace) { this.fireEvent(focus ? 'ontfocus' : 'ontblur', this);
this.setOnFocus(false); }
workspace.removeChild(this); }
},
/** */ /** @return {Boolean} true if the node graph is on focus */
createDragNode(layoutManager) { isOnFocus() {
const dragShape = this._buildDragShape(); return this._onFocus;
return new DragTopic(dragShape, this, layoutManager); }
},
_buildDragShape() { /** */
$assert(false, '_buildDragShape must be implemented by all nodes.'); dispose(workspace) {
}, this.setOnFocus(false);
workspace.removeChild(this);
}
/** */ /** */
getPosition() { createDragNode(layoutManager) {
const model = this.getModel(); const dragShape = this._buildDragShape();
return model.getPosition(); return new DragTopic(dragShape, this, layoutManager);
}, }
},
); _buildDragShape() {
$assert(false, '_buildDragShape must be implemented by all nodes.');
}
/** */
getPosition() {
const model = this.getModel();
return model.getPosition();
}
}
export default NodeGraph; export default NodeGraph;

View File

@ -20,18 +20,17 @@ import $ from '@libraries/jquery-2.1.0';
import Icon from './Icon'; import Icon from './Icon';
import FloatingTip from './widget/FloatingTip'; import FloatingTip from './widget/FloatingTip';
const NoteIcon = new Class({ class NoteIcon extends Icon {
Extends: Icon, constructor(topic, noteModel, readOnly) {
initialize(topic, noteModel, readOnly) {
$assert(topic, 'topic can not be null'); $assert(topic, 'topic can not be null');
this.parent(NoteIcon.IMAGE_URL); super(NoteIcon.IMAGE_URL);
this._linksModel = noteModel; this._linksModel = noteModel;
this._topic = topic; this._topic = topic;
this._readOnly = readOnly; this._readOnly = readOnly;
this._registerEvents(); this._registerEvents();
}, }
_registerEvents() { _registerEvents() {
this._image.setCursor('pointer'); this._image.setCursor('pointer');
@ -55,7 +54,7 @@ const NoteIcon = new Class({
placement: 'bottom', placement: 'bottom',
destroyOnExit: true, destroyOnExit: true,
}); });
}, }
_buildTooltipContent() { _buildTooltipContent() {
if ($('body').find('#textPopoverNote').length === 1) { if ($('body').find('#textPopoverNote').length === 1) {
@ -72,12 +71,12 @@ const NoteIcon = new Class({
result.append(text); result.append(text);
return result; return result;
} }
}, }
getModel() { getModel() {
return this._linksModel; return this._linksModel;
}, }
}); }
NoteIcon.IMAGE_URL = 'images/notes.png'; NoteIcon.IMAGE_URL = 'images/notes.png';

View File

@ -1,4 +1,4 @@
const Options = new Class({ class Options {
setOptions() { setOptions() {
const options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments)); const options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments));
@ -10,8 +10,8 @@ const Options = new Class({
} }
} }
return this; return this;
}, }
}); }
export default Options; export default Options;

View File

@ -18,8 +18,7 @@
import { $assert, innerXML } from '@wisemapping/core-js'; import { $assert, innerXML } from '@wisemapping/core-js';
import XMLSerializerFactory from './persistence/XMLSerializerFactory'; import XMLSerializerFactory from './persistence/XMLSerializerFactory';
const PersistenceManager = new Class({ class PersistenceManager {
initialize() { },
save(mindmap, editorProperties, saveHistory, events, sync) { save(mindmap, editorProperties, saveHistory, events, sync) {
$assert(mindmap, 'mindmap can not be null'); $assert(mindmap, 'mindmap can not be null');
@ -39,30 +38,30 @@ const PersistenceManager = new Class({
console.log(e); console.log(e);
events.onError(this._buildError()); events.onError(this._buildError());
} }
}, }
load(mapId) { load(mapId) {
$assert(mapId, 'mapId can not be null'); $assert(mapId, 'mapId can not be null');
const domDocument = this.loadMapDom(mapId); const domDocument = this.loadMapDom(mapId);
return PersistenceManager.loadFromDom(mapId, domDocument); return PersistenceManager.loadFromDom(mapId, domDocument);
}, }
discardChanges(mapId) { discardChanges(mapId) {
throw new Error('Method must be implemented'); throw new Error('Method must be implemented');
}, }
loadMapDom(mapId) { loadMapDom(mapId) {
throw new Error('Method must be implemented'); throw new Error('Method must be implemented');
}, }
saveMapXml(mapId, mapXml, pref, saveHistory, events, sync) { saveMapXml(mapId, mapXml, pref, saveHistory, events, sync) {
throw new Error('Method must be implemented'); throw new Error('Method must be implemented');
}, }
unlockMap(mindmap) { unlockMap(mindmap) {
throw new Error('Method must be implemented'); throw new Error('Method must be implemented');
}, }
}); }
PersistenceManager.init = function (instance) { PersistenceManager.init = function (instance) {
PersistenceManager._instance = instance; PersistenceManager._instance = instance;

View File

@ -15,7 +15,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import web2d from '@wisemapping/web2d'; import * as web2d from '@wisemapping/web2d';
import { $assert, $defined } from '@wisemapping/core-js'; import { $assert, $defined } from '@wisemapping/core-js';
import ConnectionLine from './ConnectionLine'; import ConnectionLine from './ConnectionLine';
@ -25,14 +25,12 @@ import INodeModel from './model/INodeModel';
import Shape from './util/Shape'; import Shape from './util/Shape';
const Relationship = new Class({ class Relationship extends ConnectionLine {
Extends: ConnectionLine, constructor(sourceNode, targetNode, model) {
initialize(sourceNode, targetNode, model) {
$assert(sourceNode, 'sourceNode can not be null'); $assert(sourceNode, 'sourceNode can not be null');
$assert(targetNode, 'targetNode can not be null'); $assert(targetNode, 'targetNode can not be null');
this.parent(sourceNode, targetNode, model.getLineType()); super(sourceNode, targetNode, model.getLineType());
this.setModel(model); this.setModel(model);
const strokeColor = Relationship.getStrokeColor(); const strokeColor = Relationship.getStrokeColor();
@ -74,12 +72,12 @@ const Relationship = new Class({
const destPoint = model.getDestCtrlPoint().clone(); const destPoint = model.getDestCtrlPoint().clone();
this.setDestControlPoint(destPoint); this.setDestControlPoint(destPoint);
} }
}, }
setStroke(color, style, opacity) { setStroke(color, style, opacity) {
this.parent(color, style, opacity); this.parent(color, style, opacity);
this._startArrow.setStrokeColor(color); this._startArrow.setStrokeColor(color);
}, }
redraw() { redraw() {
const line2d = this._line2d; const line2d = this._line2d;
@ -134,7 +132,7 @@ const Relationship = new Class({
} }
this._focusShape.moveToBack(); this._focusShape.moveToBack();
this._controlPointsController.redraw(); this._controlPointsController.redraw();
}, }
_positionArrows() { _positionArrows() {
const tpos = this._line2d.getTo(); const tpos = this._line2d.getTo();
@ -165,7 +163,7 @@ const Relationship = new Class({
this._endArrow.setVisibility(this.isVisible()); this._endArrow.setVisibility(this.isVisible());
} }
this._startArrow.setVisibility(this.isVisible() && this._showStartArrow); this._startArrow.setVisibility(this.isVisible() && this._showStartArrow);
}, }
addToWorkspace(workspace) { addToWorkspace(workspace) {
workspace.append(this._focusShape); workspace.append(this._focusShape);
@ -181,11 +179,11 @@ const Relationship = new Class({
this.parent(workspace); this.parent(workspace);
this._positionArrows(); this._positionArrows();
this.redraw(); this.redraw();
}, }
_initializeControlPointController() { _initializeControlPointController() {
this.setOnFocus(true); this.setOnFocus(true);
}, }
removeFromWorkspace(workspace) { removeFromWorkspace(workspace) {
workspace.removeChild(this._focusShape); workspace.removeChild(this._focusShape);
@ -196,11 +194,11 @@ const Relationship = new Class({
if (this._endArrow) workspace.removeChild(this._endArrow); if (this._endArrow) workspace.removeChild(this._endArrow);
this.parent(workspace); this.parent(workspace);
}, }
getType() { getType() {
return Relationship.type; return Relationship.type;
}, }
setOnFocus(focus) { setOnFocus(focus) {
// Change focus shape // Change focus shape
@ -215,7 +213,7 @@ const Relationship = new Class({
this._onFocus = focus; this._onFocus = focus;
this.fireEvent(focus ? 'ontfocus' : 'ontblur', this); this.fireEvent(focus ? 'ontfocus' : 'ontblur', this);
} }
}, }
_refreshShape() { _refreshShape() {
const sPos = this._line2d.getFrom(); const sPos = this._line2d.getFrom();
@ -229,7 +227,7 @@ const Relationship = new Class({
shapeCtrlPoints[1].x = ctrlPoints[1].x; shapeCtrlPoints[1].x = ctrlPoints[1].x;
shapeCtrlPoints[1].y = ctrlPoints[1].y; shapeCtrlPoints[1].y = ctrlPoints[1].y;
this._focusShape.updateLine(); this._focusShape.updateLine();
}, }
addEvent(type, listener) { addEvent(type, listener) {
// Translate to web 2d events ... // Translate to web 2d events ...
@ -239,37 +237,37 @@ const Relationship = new Class({
const line = this._line2d; const line = this._line2d;
line.addEvent(type, listener); line.addEvent(type, listener);
}, }
isOnFocus() { isOnFocus() {
return this._onFocus; return this._onFocus;
}, }
isInWorkspace() { isInWorkspace() {
return this._isInWorkspace; return this._isInWorkspace;
}, }
setVisibility(value) { setVisibility(value) {
this.parent(value); this.parent(value);
if (this._showEndArrow) this._endArrow.setVisibility(this._showEndArrow); if (this._showEndArrow) this._endArrow.setVisibility(this._showEndArrow);
this._startArrow.setVisibility(this._showStartArrow && value); this._startArrow.setVisibility(this._showStartArrow && value);
}, }
setOpacity(opacity) { setOpacity(opacity) {
this.parent(opacity); this.parent(opacity);
if (this._showEndArrow) this._endArrow.setOpacity(opacity); if (this._showEndArrow) this._endArrow.setOpacity(opacity);
if (this._showStartArrow) this._startArrow.setOpacity(opacity); if (this._showStartArrow) this._startArrow.setOpacity(opacity);
}, }
setShowEndArrow(visible) { setShowEndArrow(visible) {
this._showEndArrow = visible; this._showEndArrow = visible;
if (this._isInWorkspace) this.redraw(); if (this._isInWorkspace) this.redraw();
}, }
setShowStartArrow(visible) { setShowStartArrow(visible) {
this._showStartArrow = visible; this._showStartArrow = visible;
if (this._isInWorkspace) this.redraw(); if (this._isInWorkspace) this.redraw();
}, }
setFrom(x, y) { setFrom(x, y) {
$assert($defined(x), 'x must be defined'); $assert($defined(x), 'x must be defined');
@ -277,7 +275,7 @@ const Relationship = new Class({
this._line2d.setFrom(x, y); this._line2d.setFrom(x, y);
this._startArrow.setFrom(x, y); this._startArrow.setFrom(x, y);
}, }
setTo(x, y) { setTo(x, y) {
$assert($defined(x), 'x must be defined'); $assert($defined(x), 'x must be defined');
@ -285,47 +283,47 @@ const Relationship = new Class({
this._line2d.setTo(x, y); this._line2d.setTo(x, y);
if (this._endArrow) this._endArrow.setFrom(x, y); if (this._endArrow) this._endArrow.setFrom(x, y);
}, }
setSrcControlPoint(control) { setSrcControlPoint(control) {
this._line2d.setSrcControlPoint(control); this._line2d.setSrcControlPoint(control);
this._startArrow.setControlPoint(control); this._startArrow.setControlPoint(control);
}, }
setDestControlPoint(control) { setDestControlPoint(control) {
this._line2d.setDestControlPoint(control); this._line2d.setDestControlPoint(control);
if (this._showEndArrow) this._endArrow.setControlPoint(control); if (this._showEndArrow) this._endArrow.setControlPoint(control);
}, }
getControlPoints() { getControlPoints() {
return this._line2d.getControlPoints(); return this._line2d.getControlPoints();
}, }
isSrcControlPointCustom() { isSrcControlPointCustom() {
return this._line2d.isSrcControlPointCustom(); return this._line2d.isSrcControlPointCustom();
}, }
isDestControlPointCustom() { isDestControlPointCustom() {
return this._line2d.isDestControlPointCustom(); return this._line2d.isDestControlPointCustom();
}, }
setIsSrcControlPointCustom(isCustom) { setIsSrcControlPointCustom(isCustom) {
this._line2d.setIsSrcControlPointCustom(isCustom); this._line2d.setIsSrcControlPointCustom(isCustom);
}, }
setIsDestControlPointCustom(isCustom) { setIsDestControlPointCustom(isCustom) {
this._line2d.setIsDestControlPointCustom(isCustom); this._line2d.setIsDestControlPointCustom(isCustom);
}, }
getId() { getId() {
return this._model.getId(); return this._model.getId();
}, }
fireEvent(type, event) { fireEvent(type, event) {
const elem = this._line2d; const elem = this._line2d;
elem.trigger(type, event); elem.trigger(type, event);
}, }
}); }
Relationship.getStrokeColor = function getStrokeColor() { Relationship.getStrokeColor = function getStrokeColor() {
return '#9b74e6'; return '#9b74e6';

View File

@ -15,14 +15,14 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import web2d from '@wisemapping/web2d'; import * as web2d from '@wisemapping/web2d';
import { $assert } from '@wisemapping/core-js'; import { $assert } from '@wisemapping/core-js';
import Relationship from './Relationship'; import Relationship from './Relationship';
import INodeModel from './model/INodeModel'; import INodeModel from './model/INodeModel';
import Shape from './util/Shape'; import Shape from './util/Shape';
const RelationshipPivot = new Class({ class RelationshipPivot {
initialize(workspace, designer) { constructor(workspace, designer) {
$assert(workspace, 'workspace can not be null'); $assert(workspace, 'workspace can not be null');
$assert(designer, 'designer can not be null'); $assert(designer, 'designer can not be null');
this._workspace = workspace; this._workspace = workspace;
@ -32,7 +32,7 @@ const RelationshipPivot = new Class({
this._mouseMoveEvent = this._mouseMove.bind(this); this._mouseMoveEvent = this._mouseMove.bind(this);
this._onClickEvent = this._cleanOnMouseClick.bind(this); this._onClickEvent = this._cleanOnMouseClick.bind(this);
this._onTopicClick = this._connectOnFocus.bind(this); this._onTopicClick = this._connectOnFocus.bind(this);
}, }
start(sourceTopic, targetPos) { start(sourceTopic, targetPos) {
$assert(sourceTopic, 'sourceTopic can not be null'); $assert(sourceTopic, 'sourceTopic can not be null');
@ -74,7 +74,7 @@ const RelationshipPivot = new Class({
topic.addEvent('ontfocus', this._onTopicClick); topic.addEvent('ontfocus', this._onTopicClick);
}); });
} }
}, }
dispose() { dispose() {
const workspace = this._workspace; const workspace = this._workspace;
@ -98,7 +98,7 @@ const RelationshipPivot = new Class({
this._pivot = null; this._pivot = null;
this._startArrow = null; this._startArrow = null;
} }
}, }
_mouseMove(event) { _mouseMove(event) {
const screen = this._workspace.getScreenManager(); const screen = this._workspace.getScreenManager();
@ -120,13 +120,13 @@ const RelationshipPivot = new Class({
event.stopPropagation(); event.stopPropagation();
return false; return false;
}, }
_cleanOnMouseClick(event) { _cleanOnMouseClick(event) {
// The user clicks on a desktop on in other element that is not a node. // The user clicks on a desktop on in other element that is not a node.
this.dispose(); this.dispose();
event.stopPropagation(); event.stopPropagation();
}, }
_calculateFromPosition(toPosition) { _calculateFromPosition(toPosition) {
// Calculate origin position ... // Calculate origin position ...
@ -140,7 +140,7 @@ const RelationshipPivot = new Class({
spoint.x = parseInt(controlPoint[0].x, 10) + parseInt(sourcePosition.x, 10); spoint.x = parseInt(controlPoint[0].x, 10) + parseInt(sourcePosition.x, 10);
spoint.y = parseInt(controlPoint[0].y, 10) + parseInt(sourcePosition.y, 10); spoint.y = parseInt(controlPoint[0].y, 10) + parseInt(sourcePosition.y, 10);
return Shape.calculateRelationShipPointCoordinates(this._sourceTopic, spoint); return Shape.calculateRelationShipPointCoordinates(this._sourceTopic, spoint);
}, }
_connectOnFocus(event, targetTopic) { _connectOnFocus(event, targetTopic) {
const sourceTopic = this._sourceTopic; const sourceTopic = this._sourceTopic;
@ -152,11 +152,11 @@ const RelationshipPivot = new Class({
this._designer._actionDispatcher.addRelationship(relModel); this._designer._actionDispatcher.addRelationship(relModel);
} }
this.dispose(); this.dispose();
}, }
_isActive() { _isActive() {
return this._pivot != null; return this._pivot != null;
}, }
}); }
export default RelationshipPivot; export default RelationshipPivot;

View File

@ -18,9 +18,8 @@
import { $assert } from '@wisemapping/core-js'; import { $assert } from '@wisemapping/core-js';
import PersistenceManager from './PersistenceManager'; import PersistenceManager from './PersistenceManager';
const RESTPersistenceManager = new Class({ class RESTPersistenceManager extends PersistenceManager{
Extends: PersistenceManager, constructor(options) {
initialize(options) {
this.parent(); this.parent();
$assert(options.documentUrl, 'documentUrl can not be null'); $assert(options.documentUrl, 'documentUrl can not be null');
$assert(options.revertUrl, 'revertUrl can not be null'); $assert(options.revertUrl, 'revertUrl can not be null');
@ -33,7 +32,7 @@ const RESTPersistenceManager = new Class({
this.lockUrl = options.lockUrl; this.lockUrl = options.lockUrl;
this.timestamp = options.timestamp; this.timestamp = options.timestamp;
this.session = options.session; this.session = options.session;
}, }
saveMapXml(mapId, mapXml, pref, saveHistory, events, sync) { saveMapXml(mapId, mapXml, pref, saveHistory, events, sync) {
const data = { const data = {
@ -53,7 +52,7 @@ const RESTPersistenceManager = new Class({
persistence.clearTimeout = setTimeout(() => { persistence.clearTimeout = setTimeout(() => {
persistence.clearTimeout = null; persistence.clearTimeout = null;
persistence.onSave = false; persistence.onSave = false;
}, 10000); } 10000);
$.ajax({ $.ajax({
url: `${this.documentUrl.replace('{id}', mapId)}?${query}`, url: `${this.documentUrl.replace('{id}', mapId)}?${query}`,
@ -66,17 +65,17 @@ const RESTPersistenceManager = new Class({
success(data, textStatus, jqXHRresponseText) { success(data, textStatus, jqXHRresponseText) {
persistence.timestamp = data; persistence.timestamp = data;
events.onSuccess(); events.onSuccess();
}, }
error(jqXHR, textStatus, errorThrown) { error(jqXHR, textStatus, errorThrown) {
events.onError(persistence._buildError()); events.onError(persistence._buildError());
}, }
complete() { complete() {
// Clear event timeout ... // Clear event timeout ...
if (persistence.clearTimeout) { if (persistence.clearTimeout) {
clearTimeout(persistence.clearTimeout); clearTimeout(persistence.clearTimeout);
} }
persistence.onSave = false; persistence.onSave = false;
}, }
fail(xhr, textStatus) { fail(xhr, textStatus) {
const { responseText } = xhr; const { responseText } = xhr;
let userMsg = { severity: 'SEVERE', message: $msg('SAVE_COULD_NOT_BE_COMPLETED') }; let userMsg = { severity: 'SEVERE', message: $msg('SAVE_COULD_NOT_BE_COMPLETED') };
@ -96,19 +95,19 @@ const RESTPersistenceManager = new Class({
} }
events.onError(userMsg); events.onError(userMsg);
persistence.onSave = false; persistence.onSave = false;
}, }
}); });
} }
}, }
discardChanges(mapId) { discardChanges(mapId) {
$.ajax({ $.ajax({
url: this.revertUrl.replace('{id}', mapId), url: this.revertUrl.replace('{id}', mapId),
async: false, async: false,
method: 'post', method: 'post',
headers: { 'Content-Type': 'application/json; charset=utf-8', Accept: 'application/json' }, headers: { 'Content-Type': 'application/json; charset=utf-8', Accept: 'application/json' }
}); });
}, }
unlockMap(mindmap) { unlockMap(mindmap) {
const mapId = mindmap.getId(); const mapId = mindmap.getId();
@ -116,10 +115,10 @@ const RESTPersistenceManager = new Class({
url: this.lockUrl.replace('{id}', mapId), url: this.lockUrl.replace('{id}', mapId),
async: false, async: false,
method: 'put', method: 'put',
headers: { 'Content-Type': 'text/plain' }, headers: { 'Content-Type': 'text/plain' }
data: 'false', data: 'false',
}); });
}, }
_buildError(jsonSeverResponse) { _buildError(jsonSeverResponse) {
let message = jsonSeverResponse ? jsonSeverResponse.globalErrors[0] : null; let message = jsonSeverResponse ? jsonSeverResponse.globalErrors[0] : null;
@ -133,7 +132,7 @@ const RESTPersistenceManager = new Class({
severity = 'INFO'; severity = 'INFO';
} }
return { severity, message }; return { severity, message };
}, }
loadMapDom(mapId) { loadMapDom(mapId) {
// Let's try to open one from the local directory ... // Let's try to open one from the local directory ...
@ -142,10 +141,10 @@ const RESTPersistenceManager = new Class({
url: `${this.documentUrl.replace('{id}', mapId)}/xml`, url: `${this.documentUrl.replace('{id}', mapId)}/xml`,
method: 'get', method: 'get',
async: false, async: false,
headers: { 'Content-Type': 'text/plain', Accept: 'application/xml' }, headers: { 'Content-Type': 'text/plain', Accept: 'application/xml' }
success(responseText) { success(responseText) {
xml = responseText; xml = responseText;
}, }
}); });
// If I could not load it from a file, hard code one. // If I could not load it from a file, hard code one.
@ -154,7 +153,7 @@ const RESTPersistenceManager = new Class({
} }
return xml; return xml;
}, }
}); }
export default RESTPersistenceManager; export default RESTPersistenceManager;

View File

@ -16,7 +16,7 @@
* limitations under the License. * limitations under the License.
*/ */
import { $assert } from '@wisemapping/core-js'; import { $assert } from '@wisemapping/core-js';
import web2d from '@wisemapping/web2d'; import * as web2d from '@wisemapping/web2d';
class ScreenManager { class ScreenManager {
constructor(divElement) { constructor(divElement) {

View File

@ -15,13 +15,13 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import web2d from '@wisemapping/web2d'; import * as web2d from '@wisemapping/web2d';
import TopicConfig from './TopicConfig'; import TopicConfig from './TopicConfig';
import ActionDispatcher from './ActionDispatcher'; import ActionDispatcher from './ActionDispatcher';
const ShirinkConnector = new Class({ class ShirinkConnector {
initialize(topic) { constructor(topic) {
const ellipse = new web2d.Elipse(TopicConfig.INNER_RECT_ATTRIBUTES); const ellipse = new web2d.Elipse(TopicConfig.INNER_RECT_ATTRIBUTES);
this._ellipse = ellipse; this._ellipse = ellipse;
ellipse.setFill('rgb(62,118,179)'); ellipse.setFill('rgb(62,118,179)');
@ -61,7 +61,7 @@ const ShirinkConnector = new Class({
this._fillColor = '#f7f7f7'; this._fillColor = '#f7f7f7';
const model = topic.getModel(); const model = topic.getModel();
this.changeRender(model.areChildrenShrunken()); this.changeRender(model.areChildrenShrunken());
}, }
changeRender(isShrink) { changeRender(isShrink) {
const elipse = this._ellipse; const elipse = this._ellipse;
@ -70,40 +70,40 @@ const ShirinkConnector = new Class({
} else { } else {
elipse.setStroke('1', 'solid'); elipse.setStroke('1', 'solid');
} }
}, }
setVisibility(value) { setVisibility(value) {
this._ellipse.setVisibility(value); this._ellipse.setVisibility(value);
}, }
setOpacity(opacity) { setOpacity(opacity) {
this._ellipse.setOpacity(opacity); this._ellipse.setOpacity(opacity);
}, }
setFill(color) { setFill(color) {
this._fillColor = color; this._fillColor = color;
this._ellipse.setFill(color); this._ellipse.setFill(color);
}, }
setAttribute(name, value) { setAttribute(name, value) {
this._ellipse.setAttribute(name, value); this._ellipse.setAttribute(name, value);
}, }
addToWorkspace(group) { addToWorkspace(group) {
group.append(this._ellipse); group.append(this._ellipse);
}, }
setPosition(x, y) { setPosition(x, y) {
this._ellipse.setPosition(x, y); this._ellipse.setPosition(x, y);
}, }
moveToBack() { moveToBack() {
this._ellipse.moveToBack(); this._ellipse.moveToBack();
}, }
moveToFront() { moveToFront() {
this._ellipse.moveToFront(); this._ellipse.moveToFront();
}, }
}); }
export default ShirinkConnector; export default ShirinkConnector;

View File

@ -13,14 +13,14 @@
* limitations under the License. * limitations under the License.
*/ */
import { $defined } from '@wisemapping/core-js'; import { $defined } from '@wisemapping/core-js';
import web2d from '@wisemapping/web2d'; import * as web2d from '@wisemapping/web2d';
import ActionDispatcher from './ActionDispatcher'; import ActionDispatcher from './ActionDispatcher';
// FIXME: Not used! // FIXME: Not used!
const TextEditor = new Class({ class TextEditor {
initialize(topic) { constructor(topic) {
this._topic = topic; this._topic = topic;
}, }
_buildEditor() { _buildEditor() {
this._size = { width: 500, height: 100 }; this._size = { width: 500, height: 100 };
@ -61,7 +61,7 @@ const TextEditor = new Class({
spanElem.inject(spanContainer); spanElem.inject(spanContainer);
return result; return result;
}, }
_registerEvents(divElem) { _registerEvents(divElem) {
const inputElem = this._getTextareaElem(); const inputElem = this._getTextareaElem();
@ -99,11 +99,11 @@ const TextEditor = new Class({
divElem.addEvent('mousedown', (event) => { divElem.addEvent('mousedown', (event) => {
event.stopPropagation(); event.stopPropagation();
}); });
}, }
isVisible() { isVisible() {
return $defined(this._containerElem) && this._containerElem.getStyle('display') === 'block'; return $defined(this._containerElem) && this._containerElem.getStyle('display') === 'block';
}, }
_updateModel() { _updateModel() {
if (this._topic.getText() !== this._getText()) { if (this._topic.getText() !== this._getText()) {
@ -113,7 +113,7 @@ const TextEditor = new Class({
const actionDispatcher = ActionDispatcher.getInstance(); const actionDispatcher = ActionDispatcher.getInstance();
actionDispatcher.changeTextToTopic([topicId], text); actionDispatcher.changeTextToTopic([topicId], text);
} }
}, }
show(text) { show(text) {
if (!this.isVisible()) { if (!this.isVisible()) {
@ -125,7 +125,7 @@ const TextEditor = new Class({
this._registerEvents(editorElem); this._registerEvents(editorElem);
this._showEditor(text); this._showEditor(text);
} }
}, }
_showEditor(defaultText) { _showEditor(defaultText) {
const topic = this._topic; const topic = this._topic;
@ -163,7 +163,7 @@ const TextEditor = new Class({
}; };
displayFunc.delay(10); displayFunc.delay(10);
}, }
_setStyle(fontStyle) { _setStyle(fontStyle) {
const inputField = this._getTextareaElem(); const inputField = this._getTextareaElem();
@ -189,7 +189,7 @@ const TextEditor = new Class({
spanField.style.fontStyle = fontStyle.style; spanField.style.fontStyle = fontStyle.style;
spanField.style.fontWeight = fontStyle.weight; spanField.style.fontWeight = fontStyle.weight;
spanField.style.fontSize = `${fontStyle.size}px`; spanField.style.fontSize = `${fontStyle.size}px`;
}, }
_setText(text) { _setText(text) {
const inputField = this._getTextareaElem(); const inputField = this._getTextareaElem();
@ -200,19 +200,19 @@ const TextEditor = new Class({
const spanField = this._getSpanElem(); const spanField = this._getSpanElem();
spanField.innerHTML = text; spanField.innerHTML = text;
inputField.value = text; inputField.value = text;
}, }
_getText() { _getText() {
return this._getTextareaElem().value; return this._getTextareaElem().value;
}, }
_getTextareaElem() { _getTextareaElem() {
return this._containerElem.getElement('input'); return this._containerElem.getElement('input');
}, }
_getSpanElem() { _getSpanElem() {
return this._containerElem.getElement('span'); return this._containerElem.getElement('span');
}, }
_setEditorSize(width, height) { _setEditorSize(width, height) {
const textShape = this._topic.getTextShape(); const textShape = this._topic.getTextShape();
@ -220,7 +220,7 @@ const TextEditor = new Class({
this._size = { width: width * scale.width, height: height * scale.height }; this._size = { width: width * scale.width, height: height * scale.height };
this._containerElem.style.width = `${this._size.width * 2}px`; this._containerElem.style.width = `${this._size.width * 2}px`;
this._containerElem.style.height = `${this._size.height}px`; this._containerElem.style.height = `${this._size.height}px`;
}, }
_positionCursor(inputElem, selectText) { _positionCursor(inputElem, selectText) {
// Select text if it's required ... // Select text if it's required ...
@ -238,7 +238,7 @@ const TextEditor = new Class({
} else if (!selectText) { } else if (!selectText) {
inputElem.setSelectionRange(0, inputElem.value.length); inputElem.setSelectionRange(0, inputElem.value.length);
} }
}, }
close(update) { close(update) {
if (this.isVisible()) { if (this.isVisible()) {
@ -254,7 +254,7 @@ const TextEditor = new Class({
this._containerElem.dispose(); this._containerElem.dispose();
this._containerElem = null; this._containerElem = null;
} }
}, }
}); }
export default TextEditor; export default TextEditor;

File diff suppressed because it is too large Load Diff

View File

@ -25,25 +25,25 @@ const TopicEvent = {
CLICK: 'clicknode', CLICK: 'clicknode',
}; };
const TopicEventDispatcher = new Class({ class TopicEventDispatcher extends Events {
Extends: Events, constructor(readOnly)
{
initialize(readOnly) { super();
this._readOnly = readOnly; this._readOnly = readOnly;
this._activeEditor = null; this._activeEditor = null;
this._multilineEditor = new MultilineTextEditor(); this._multilineEditor = new MultilineTextEditor();
}, }
close(update) { close(update) {
if (this.isVisible()) { if (this.isVisible()) {
this._activeEditor.close(update); this._activeEditor.close(update);
this._activeEditor = null; this._activeEditor = null;
} }
}, }
show(topic, options) { show(topic, options) {
this.process(TopicEvent.EDIT, topic, options); this.process(TopicEvent.EDIT, topic, options);
}, }
process(eventType, topic, options) { process(eventType, topic, options) {
$assert(eventType, 'eventType can not be null'); $assert(eventType, 'eventType can not be null');
@ -57,20 +57,20 @@ const TopicEventDispatcher = new Class({
const model = topic.getModel(); const model = topic.getModel();
if ( if (
model.getShapeType() !== TopicShape.IMAGE model.getShapeType() !== TopicShape.IMAGE
&& !this._readOnly && !this._readOnly
&& eventType === TopicEvent.EDIT && eventType === TopicEvent.EDIT
) { ) {
this._multilineEditor.show(topic, options ? options.text : null); this._multilineEditor.show(topic, options ? options.text : null);
this._activeEditor = this._multilineEditor; this._activeEditor = this._multilineEditor;
} else { } else {
this.fireEvent(eventType, { model, readOnly: this._readOnly }); this.fireEvent(eventType, { model, readOnly: this._readOnly });
} }
}, }
isVisible() { isVisible() {
return this._activeEditor != null && this._activeEditor.isVisible(); return this._activeEditor != null && this._activeEditor.isVisible();
}, }
}); }
TopicEventDispatcher._instance = null; TopicEventDispatcher._instance = null;

View File

@ -18,53 +18,53 @@
import { $assert, $defined } from '@wisemapping/core-js'; import { $assert, $defined } from '@wisemapping/core-js';
import { TopicShape } from './model/INodeModel'; import { TopicShape } from './model/INodeModel';
const TopicStyle = new Class({}); class TopicStyle {
static _getStyles(topic) {
$assert(topic, 'topic can not be null');
TopicStyle._getStyles = function _getStyles(topic) { let result;
$assert(topic, 'topic can not be null'); if (topic.isCentralTopic()) {
result = TopicStyle.STYLES.CENTRAL_TOPIC;
let result;
if (topic.isCentralTopic()) {
result = TopicStyle.STYLES.CENTRAL_TOPIC;
} else {
const targetTopic = topic.getOutgoingConnectedTopic();
if ($defined(targetTopic)) {
if (targetTopic.isCentralTopic()) {
result = TopicStyle.STYLES.MAIN_TOPIC;
} else {
result = TopicStyle.STYLES.SUB_TOPIC;
}
} else { } else {
result = TopicStyle.STYLES.ISOLATED_TOPIC; const targetTopic = topic.getOutgoingConnectedTopic();
if ($defined(targetTopic)) {
if (targetTopic.isCentralTopic()) {
result = TopicStyle.STYLES.MAIN_TOPIC;
} else {
result = TopicStyle.STYLES.SUB_TOPIC;
}
} else {
result = TopicStyle.STYLES.ISOLATED_TOPIC;
}
} }
return result;
} }
return result;
};
TopicStyle.defaultText = function defaultText(topic) { static defaultText(topic) {
const { msgKey } = this._getStyles(topic); const { msgKey } = this._getStyles(topic);
return $msg(msgKey); return $msg(msgKey);
}; }
TopicStyle.defaultFontStyle = function defaultFontStyle(topic) { static defaultFontStyle(topic) {
return this._getStyles(topic).fontStyle; return this._getStyles(topic).fontStyle;
}; }
TopicStyle.defaultBackgroundColor = function defaultBackgroundColor(topic) { static defaultBackgroundColor(topic) {
return this._getStyles(topic).backgroundColor; return this._getStyles(topic).backgroundColor;
}; }
TopicStyle.defaultBorderColor = function defaultBorderColor(topic) { static defaultBorderColor(topic) {
return this._getStyles(topic).borderColor; return this._getStyles(topic).borderColor;
}; }
TopicStyle.getInnerPadding = function getInnerPadding(topic) { static getInnerPadding(topic) {
return this._getStyles(topic).innerPadding; return this._getStyles(topic).innerPadding;
}; }
TopicStyle.defaultShapeType = function defaultShapeType(topic) { static defaultShapeType(topic) {
return this._getStyles(topic).shapeType; return this._getStyles(topic).shapeType;
}; }
}
TopicStyle.STYLES = { TopicStyle.STYLES = {
CENTRAL_TOPIC: { CENTRAL_TOPIC: {

View File

@ -16,7 +16,7 @@
* limitations under the License. * limitations under the License.
*/ */
import { $assert, $defined } from '@wisemapping/core-js'; import { $assert, $defined } from '@wisemapping/core-js';
import web2d from '@wisemapping/web2d'; import * as web2d from '@wisemapping/web2d';
class Workspace { class Workspace {
constructor(screenManager, zoom) { constructor(screenManager, zoom) {

View File

@ -17,10 +17,8 @@
*/ */
import Command from '../Command'; import Command from '../Command';
const AddFeatureToTopicCommand = new Class( class AddFeatureToTopicCommand extends Command {
/** @lends AddFeatureToTopicCommand */ { /*
Extends: Command,
/*
* @classdesc This command class handles do/undo of adding features to topics, e.g. an * @classdesc This command class handles do/undo of adding features to topics, e.g. an
* icon or a note. For a reference of existing features, refer to {@link mindplot.TopicFeature} * icon or a note. For a reference of existing features, refer to {@link mindplot.TopicFeature}
* @constructs * @constructs
@ -30,41 +28,40 @@ const AddFeatureToTopicCommand = new Class(
* @extends mindplot.Command * @extends mindplot.Command
* @see mindplot.model.FeatureModel and subclasses * @see mindplot.model.FeatureModel and subclasses
*/ */
initialize(topicId, featureType, attributes) { constructor(topicId, featureType, attributes) {
$assert($defined(topicId), 'topicId can not be null'); $assert($defined(topicId), 'topicId can not be null');
$assert(featureType, 'featureType can not be null'); $assert(featureType, 'featureType can not be null');
$assert(attributes, 'attributes can not be null'); $assert(attributes, 'attributes can not be null');
this.parent(); super();
this._topicId = topicId; this._topicId = topicId;
this._featureType = featureType; this._featureType = featureType;
this._attributes = attributes; this._attributes = attributes;
this._featureModel = null; this._featureModel = null;
}, }
/** /**
* Overrides abstract parent method * Overrides abstract parent method
*/ */
execute(commandContext) { execute(commandContext) {
const topic = commandContext.findTopics(this._topicId)[0]; const topic = commandContext.findTopics(this._topicId)[0];
// Feature must be created only one time. // Feature must be created only one time.
if (!this._featureModel) { if (!this._featureModel) {
const model = topic.getModel(); const model = topic.getModel();
this._featureModel = model.createFeature(this._featureType, this._attributes); this._featureModel = model.createFeature(this._featureType, this._attributes);
} }
topic.addFeature(this._featureModel); topic.addFeature(this._featureModel);
}, }
/** /**
* Overrides abstract parent method * Overrides abstract parent method
* @see {@link mindplot.Command.undoExecute} * @see {@link mindplot.Command.undoExecute}
*/ */
undoExecute(commandContext) { undoExecute(commandContext) {
const topic = commandContext.findTopics(this._topicId)[0]; const topic = commandContext.findTopics(this._topicId)[0];
topic.removeFeature(this._featureModel); topic.removeFeature(this._featureModel);
}, }
}, }
);
export default AddFeatureToTopicCommand; export default AddFeatureToTopicCommand;

View File

@ -17,20 +17,19 @@
*/ */
import Command from '../Command'; import Command from '../Command';
const AddRelationshipCommand = new Class(/** @lends AddRelationshipCommand */{ class AddRelationshipCommand extends Command {
Extends: Command,
/** /**
* @classdesc This command class handles do/undo of adding a relationship to a topic. * @classdesc This command class handles do/undo of adding a relationship to a topic.
* @constructs * @constructs
* @param {XMLDOM} model * @param {XMLDOM} model
* @extends mindplot.Command * @extends mindplot.Command
*/ */
initialize(model) { constructor(model) {
$assert(model, 'Relationship model can not be null'); $assert(model, 'Relationship model can not be null');
this.parent(); super();
this._model = model; this._model = model;
}, }
/** /**
* Overrides abstract parent method * Overrides abstract parent method
@ -38,7 +37,7 @@ const AddRelationshipCommand = new Class(/** @lends AddRelationshipCommand */{
execute(commandContext) { execute(commandContext) {
const relationship = commandContext.addRelationship(this._model); const relationship = commandContext.addRelationship(this._model);
relationship.setOnFocus(true); relationship.setOnFocus(true);
}, }
/** /**
* Overrides abstract parent method * Overrides abstract parent method
@ -47,7 +46,7 @@ const AddRelationshipCommand = new Class(/** @lends AddRelationshipCommand */{
undoExecute(commandContext) { undoExecute(commandContext) {
const rel = commandContext.findRelationships(this._model.getId()); const rel = commandContext.findRelationships(this._model.getId());
commandContext.deleteRelationship(rel[0]); commandContext.deleteRelationship(rel[0]);
}, }
}); }
export default AddRelationshipCommand; export default AddRelationshipCommand;

View File

@ -17,81 +17,75 @@
*/ */
import Command from '../Command'; import Command from '../Command';
const AddTopicCommand = new Class( class AddTopicCommand extends Command {
/** @lends AddTopicCommand */ { /**
Extends: Command, * @classdesc This command class handles do/undo of adding one or multiple topics to
/** * the mindmap.
* @classdesc This command class handles do/undo of adding one or multiple topics to * @constructs
* the mindmap. * @param {Array<mindplot.model.NodeModel>} models one or multiple models
* @constructs * @param {Array<String>} parentTopicsId ids of the parent topics to add the children to, or null
* @param {Array<mindplot.model.NodeModel>} models one or multiple models * when attaching a dragged node or a node/branch from clipboard
* @param {Array<String>} parentTopicsId ids of the parent topics to add the children to, or null * @extends mindplot.Command
* when attaching a dragged node or a node/branch from clipboard */
* @extends mindplot.Command constructor(models, parentTopicsId) {
*/ $assert(models, 'models can not be null');
initialize(models, parentTopicsId) { $assert(parentTopicsId == null || parentTopicsId.length == models.length, 'parents and models must have the same size');
$assert(models, 'models can not be null');
$assert(
parentTopicsId == null || parentTopicsId.length == models.length,
'parents and models must have the same size',
);
this.parent(); super();
this._models = models; this._models = models;
this._parentsIds = parentTopicsId; this._parentsIds = parentTopicsId;
}, }
/** /**
* Overrides abstract parent method * Overrides abstract parent method
*/ */
execute(commandContext) { execute(commandContext) {
const me = this; const me = this;
_.each(this._models, (model, index) => { _.each(this._models, (model, index) => {
// Add a new topic ... // Add a new topic ...
const topic = commandContext.createTopic(model); const topic = commandContext.createTopic(model);
// Connect to topic ... // Connect to topic ...
if (me._parentsIds) { if (me._parentsIds) {
const parentId = me._parentsIds[index]; const parentId = me._parentsIds[index];
if ($defined(parentId)) { if ($defined(parentId)) {
const parentTopic = commandContext.findTopics(parentId)[0]; const parentTopic = commandContext.findTopics(parentId)[0];
commandContext.connect(topic, parentTopic); commandContext.connect(topic, parentTopic);
}
} else {
commandContext.addTopic(topic);
} }
} else {
commandContext.addTopic(topic);
}
// Select just created node ... // Select just created node ...
const designer = commandContext._designer; const designer = commandContext._designer;
designer.onObjectFocusEvent(topic); designer.onObjectFocusEvent(topic);
topic.setOnFocus(true); topic.setOnFocus(true);
// Render node ... // Render node ...
topic.setVisibility(true); topic.setVisibility(true);
}); });
}, }
/** /**
* Overrides abstract parent method * Overrides abstract parent method
* @see {@link mindplot.Command.undoExecute} * @see {@link mindplot.Command.undoExecute}
*/ */
undoExecute(commandContext) { undoExecute(commandContext) {
// Delete disconnected the nodes. Create a copy of the topics ... // Delete disconnected the nodes. Create a copy of the topics ...
const clonedModel = []; const clonedModel = [];
_.each(this._models, (model) => { _.each(this._models, (model) => {
clonedModel.push(model.clone()); clonedModel.push(model.clone());
}); });
// Finally, remove the nodes ... // Finally, remove the nodes ...
_.each(this._models, (model) => { _.each(this._models, (model) => {
const topicId = model.getId(); const topicId = model.getId();
const topic = commandContext.findTopics(topicId)[0]; const topic = commandContext.findTopics(topicId)[0];
commandContext.deleteTopic(topic); commandContext.deleteTopic(topic);
}); });
this._models = clonedModel; this._models = clonedModel;
}, }
}, }
);
export default AddTopicCommand; export default AddTopicCommand;

View File

@ -17,8 +17,7 @@
*/ */
import Command from '../Command'; import Command from '../Command';
const ChangeFeatureToTopicCommand = new Class(/** @lends ChangeFeatureToTopicCommand */{ class ChangeFeatureToTopicCommand extends Command {
Extends: Command,
/** /**
* @extends mindplot.Command * @extends mindplot.Command
* @constructs * @constructs
@ -29,16 +28,16 @@ const ChangeFeatureToTopicCommand = new Class(/** @lends ChangeFeatureToTopicCom
* @throws will throw an error if featureId is null or undefined * @throws will throw an error if featureId is null or undefined
* @throws will throw an error if attributes is null or undefined * @throws will throw an error if attributes is null or undefined
*/ */
initialize(topicId, featureId, attributes) { constructor(topicId, featureId, attributes) {
$assert($defined(topicId), 'topicId can not be null'); $assert($defined(topicId), 'topicId can not be null');
$assert($defined(featureId), 'featureId can not be null'); $assert($defined(featureId), 'featureId can not be null');
$assert($defined(attributes), 'attributes can not be null'); $assert($defined(attributes), 'attributes can not be null');
this.parent(); super();
this._topicId = topicId; this._topicId = topicId;
this._featureId = featureId; this._featureId = featureId;
this._attributes = attributes; this._attributes = attributes;
}, }
/** /**
* Overrides abstract parent method * Overrides abstract parent method
@ -50,7 +49,7 @@ const ChangeFeatureToTopicCommand = new Class(/** @lends ChangeFeatureToTopicCom
const oldAttributes = feature.getAttributes(); const oldAttributes = feature.getAttributes();
feature.setAttributes(this._attributes); feature.setAttributes(this._attributes);
this._attributes = oldAttributes; this._attributes = oldAttributes;
}, }
/** /**
* Overrides abstract parent method * Overrides abstract parent method
@ -58,7 +57,7 @@ const ChangeFeatureToTopicCommand = new Class(/** @lends ChangeFeatureToTopicCom
*/ */
undoExecute(commandContext) { undoExecute(commandContext) {
this.execute(commandContext); this.execute(commandContext);
}, }
}); }
export default ChangeFeatureToTopicCommand; export default ChangeFeatureToTopicCommand;

View File

@ -17,8 +17,7 @@
*/ */
import Command from '../Command'; import Command from '../Command';
const DeleteCommand = new Class(/** @lends mindplot.commands.DeleteCommand */{ class DeleteCommand extends Command {
Extends: Command,
/** /**
* @classdesc This command class handles do/undo of deleting a topic. * @classdesc This command class handles do/undo of deleting a topic.
* @constructs * @constructs
@ -26,16 +25,16 @@ const DeleteCommand = new Class(/** @lends mindplot.commands.DeleteCommand */{
* @param {Array<String>} relIds ids of the relationships connected to the topics * @param {Array<String>} relIds ids of the relationships connected to the topics
* @extends mindplot.Command * @extends mindplot.Command
*/ */
initialize(topicIds, relIds) { constructor(topicIds, relIds) {
$assert($defined(relIds), 'topicIds can not be null'); $assert($defined(relIds), 'topicIds can not be null');
this.parent(); super();
this._relIds = relIds; this._relIds = relIds;
this._topicIds = topicIds; this._topicIds = topicIds;
this._deletedTopicModels = []; this._deletedTopicModels = [];
this._deletedRelModel = []; this._deletedRelModel = [];
this._parentTopicIds = []; this._parentTopicIds = [];
}, }
/** /**
* Overrides abstract parent method * Overrides abstract parent method
@ -81,7 +80,7 @@ const DeleteCommand = new Class(/** @lends mindplot.commands.DeleteCommand */{
commandContext.deleteRelationship(rel); commandContext.deleteRelationship(rel);
}, this); }, this);
} }
}, }
/** /**
* Overrides abstract parent method * Overrides abstract parent method
@ -125,7 +124,7 @@ const DeleteCommand = new Class(/** @lends mindplot.commands.DeleteCommand */{
this._deletedTopicModels = []; this._deletedTopicModels = [];
this._parentTopicIds = []; this._parentTopicIds = [];
this._deletedRelModel = []; this._deletedRelModel = [];
}, }
_filterChildren(topicIds, commandContext) { _filterChildren(topicIds, commandContext) {
const topics = commandContext.findTopics(topicIds); const topics = commandContext.findTopics(topicIds);
@ -148,7 +147,7 @@ const DeleteCommand = new Class(/** @lends mindplot.commands.DeleteCommand */{
}); });
return result; return result;
}, }
_collectInDepthRelationships(topic) { _collectInDepthRelationships(topic) {
let result = []; let result = [];
@ -172,8 +171,8 @@ const DeleteCommand = new Class(/** @lends mindplot.commands.DeleteCommand */{
result = ret; result = ret;
} }
return result; return result;
}, }
}); }
export default DeleteCommand; export default DeleteCommand;

View File

@ -17,8 +17,7 @@
*/ */
import Command from '../Command'; import Command from '../Command';
const DragTopicCommand = new Class(/** @lends DragTopicCommand */{ class DragTopicCommand extends Command {
Extends: Command,
/** /**
* @classdesc This command class handles do/undo of dragging a topic to a new position. * @classdesc This command class handles do/undo of dragging a topic to a new position.
* @constructs * @constructs
@ -28,7 +27,7 @@ const DragTopicCommand = new Class(/** @lends DragTopicCommand */{
* @param {mindplot.Topic} parentTopic the topic to be made the dragged topic's new parent * @param {mindplot.Topic} parentTopic the topic to be made the dragged topic's new parent
* @extends mindplot.Command * @extends mindplot.Command
*/ */
initialize(topicId, position, order, parentTopic) { constructor(topicId, position, order, parentTopic) {
$assert(topicId, 'topicId must be defined'); $assert(topicId, 'topicId must be defined');
this._topicsId = topicId; this._topicsId = topicId;
@ -37,7 +36,7 @@ const DragTopicCommand = new Class(/** @lends DragTopicCommand */{
this.parent(); this.parent();
this._position = position; this._position = position;
this._order = order; this._order = order;
}, }
/** /**
* Overrides abstract parent method * Overrides abstract parent method
@ -85,7 +84,7 @@ const DragTopicCommand = new Class(/** @lends DragTopicCommand */{
// Store for undo ... // Store for undo ...
this._order = origOrder; this._order = origOrder;
this._position = origPosition; this._position = origPosition;
}, }
/** /**
* Overrides abstract parent method * Overrides abstract parent method
@ -93,7 +92,7 @@ const DragTopicCommand = new Class(/** @lends DragTopicCommand */{
*/ */
undoExecute(commandContext) { undoExecute(commandContext) {
this.execute(commandContext); this.execute(commandContext);
}, }
}); }
export default DragTopicCommand; export default DragTopicCommand;

View File

@ -19,8 +19,7 @@ import { $defined, $assert } from '@wisemapping/core-js';
import _ from '@libraries/underscore-min'; import _ from '@libraries/underscore-min';
import Command from '../Command'; import Command from '../Command';
const GenericFunctionCommand = new Class(/** @lends GenericFunctionCommand */{ class GenericFunctionCommand extends Command {
Extends: Command,
/** /**
* @classdesc This command handles do/undo of different actions, e.g. moving topics to * @classdesc This command handles do/undo of different actions, e.g. moving topics to
* a different position, changing text or font,... (for full reference check the * a different position, changing text or font,... (for full reference check the
@ -32,16 +31,16 @@ const GenericFunctionCommand = new Class(/** @lends GenericFunctionCommand */{
* e.g. color, font family or text * e.g. color, font family or text
* @extends mindplot.Command * @extends mindplot.Command
*/ */
initialize(commandFunc, topicsIds, value) { constructor(commandFunc, topicsIds, value) {
$assert(commandFunc, 'commandFunc must be defined'); $assert(commandFunc, 'commandFunc must be defined');
$assert($defined(topicsIds), 'topicsIds must be defined'); $assert($defined(topicsIds), 'topicsIds must be defined');
this.parent(); super();
this._value = value; this._value = value;
this._topicsId = topicsIds; this._topicsId = topicsIds;
this._commandFunc = commandFunc; this._commandFunc = commandFunc;
this._oldValues = []; this._oldValues = [];
}, }
/** /**
* Overrides abstract parent method * Overrides abstract parent method
@ -72,7 +71,7 @@ const GenericFunctionCommand = new Class(/** @lends GenericFunctionCommand */{
} else { } else {
throw 'Command can not be applied two times in a row.'; throw 'Command can not be applied two times in a row.';
} }
}, }
/** /**
* Overrides abstract parent method * Overrides abstract parent method
@ -91,7 +90,7 @@ const GenericFunctionCommand = new Class(/** @lends GenericFunctionCommand */{
} else { } else {
throw new Error('undo can not be applied.'); throw new Error('undo can not be applied.');
} }
}, }
}); }
export default GenericFunctionCommand; export default GenericFunctionCommand;

View File

@ -17,10 +17,8 @@
*/ */
import Command from '../Command'; import Command from '../Command';
const MoveControlPointCommand = new Class( class MoveControlPointCommand extends Command {
/** @lends MoveControlPointCommand */ { /**
Extends: Command,
/**
* @classdesc This command handles do/undo of changing the control points of a relationship * @classdesc This command handles do/undo of changing the control points of a relationship
* arrow. These are the two points that appear when the relationship is on focus. They * arrow. These are the two points that appear when the relationship is on focus. They
* influence how the arrow is drawn (not the source or the destination topic nor the arrow * influence how the arrow is drawn (not the source or the destination topic nor the arrow
@ -31,94 +29,93 @@ const MoveControlPointCommand = new Class(
* @param ctrlPointController {ControlPoint} * @param ctrlPointController {ControlPoint}
* @param point {Number} 0 for the destination control point, 1 for the source control point * @param point {Number} 0 for the destination control point, 1 for the source control point
*/ */
initialize(ctrlPointController, point) { constructor(ctrlPointController, point) {
$assert(ctrlPointController, 'line can not be null'); $assert(ctrlPointController, 'line can not be null');
$assert($defined(point), 'point can not be null'); $assert($defined(point), 'point can not be null');
this.parent(); super();
this._ctrlPointControler = ctrlPointController; this._ctrlPointControler = ctrlPointController;
this._line = ctrlPointController._line; this._line = ctrlPointController._line;
this._controlPoint = this._ctrlPointControler.getControlPoint(point).clone(); this._controlPoint = this._ctrlPointControler.getControlPoint(point).clone();
this._oldControlPoint = this._ctrlPointControler.getOriginalCtrlPoint(point).clone(); this._oldControlPoint = this._ctrlPointControler.getOriginalCtrlPoint(point).clone();
this._originalEndPoint = this._ctrlPointControler.getOriginalEndPoint(point).clone(); this._originalEndPoint = this._ctrlPointControler.getOriginalEndPoint(point).clone();
switch (point) { switch (point) {
case 0: case 0:
this._wasCustom = this._line.getLine().isSrcControlPointCustom(); this._wasCustom = this._line.getLine().isSrcControlPointCustom();
this._endPoint = this._line.getLine().getFrom().clone(); this._endPoint = this._line.getLine().getFrom().clone();
break; break;
case 1: case 1:
this._wasCustom = this._line.getLine().isDestControlPointCustom(); this._wasCustom = this._line.getLine().isDestControlPointCustom();
this._endPoint = this._line.getLine().getTo().clone(); this._endPoint = this._line.getLine().getTo().clone();
break; break;
default: default:
break; break;
} }
this._point = point; this._point = point;
}, }
/** /**
* Overrides abstract parent method * Overrides abstract parent method
*/ */
execute() { execute() {
const model = this._line.getModel(); const model = this._line.getModel();
switch (this._point) { switch (this._point) {
case 0: case 0:
model.setSrcCtrlPoint(this._controlPoint.clone()); model.setSrcCtrlPoint(this._controlPoint.clone());
this._line.setFrom(this._endPoint.x, this._endPoint.y); this._line.setFrom(this._endPoint.x, this._endPoint.y);
this._line.setIsSrcControlPointCustom(true); this._line.setIsSrcControlPointCustom(true);
this._line.setSrcControlPoint(this._controlPoint.clone()); this._line.setSrcControlPoint(this._controlPoint.clone());
break; break;
case 1: case 1:
model.setDestCtrlPoint(this._controlPoint.clone()); model.setDestCtrlPoint(this._controlPoint.clone());
this._wasCustom = this._line.getLine().isDestControlPointCustom(); this._wasCustom = this._line.getLine().isDestControlPointCustom();
this._line.setTo(this._endPoint.x, this._endPoint.y); this._line.setTo(this._endPoint.x, this._endPoint.y);
this._line.setIsDestControlPointCustom(true); this._line.setIsDestControlPointCustom(true);
this._line.setDestControlPoint(this._controlPoint.clone()); this._line.setDestControlPoint(this._controlPoint.clone());
break; break;
default: default:
break; break;
} }
if (this._line.isOnFocus()) { if (this._line.isOnFocus()) {
this._line._refreshShape(); this._line._refreshShape();
this._ctrlPointControler.setLine(this._line); this._ctrlPointControler.setLine(this._line);
} }
this._line.getLine().updateLine(this._point); this._line.getLine().updateLine(this._point);
}, }
/** /**
* Overrides abstract parent method * Overrides abstract parent method
* @see {@link mindplot.Command.undoExecute} * @see {@link mindplot.Command.undoExecute}
*/ */
undoExecute() { undoExecute() {
const line = this._line; const line = this._line;
const model = line.getModel(); const model = line.getModel();
switch (this._point) { switch (this._point) {
case 0: case 0:
if ($defined(this._oldControlPoint)) { if ($defined(this._oldControlPoint)) {
line.setFrom(this._originalEndPoint.x, this._originalEndPoint.y); line.setFrom(this._originalEndPoint.x, this._originalEndPoint.y);
model.setSrcCtrlPoint(this._oldControlPoint.clone()); model.setSrcCtrlPoint(this._oldControlPoint.clone());
line.setSrcControlPoint(this._oldControlPoint.clone()); line.setSrcControlPoint(this._oldControlPoint.clone());
line.setIsSrcControlPointCustom(this._wasCustom); line.setIsSrcControlPointCustom(this._wasCustom);
} }
break; break;
case 1: case 1:
if ($defined(this._oldControlPoint)) { if ($defined(this._oldControlPoint)) {
line.setTo(this._originalEndPoint.x, this._originalEndPoint.y); line.setTo(this._originalEndPoint.x, this._originalEndPoint.y);
model.setDestCtrlPoint(this._oldControlPoint.clone()); model.setDestCtrlPoint(this._oldControlPoint.clone());
line.setDestControlPoint(this._oldControlPoint.clone()); line.setDestControlPoint(this._oldControlPoint.clone());
line.setIsDestControlPointCustom(this._wasCustom); line.setIsDestControlPointCustom(this._wasCustom);
} }
break; break;
default: default:
break; break;
} }
this._line.getLine().updateLine(this._point); this._line.getLine().updateLine(this._point);
if (this._line.isOnFocus()) { if (this._line.isOnFocus()) {
this._ctrlPointControler.setLine(line); this._ctrlPointControler.setLine(line);
line._refreshShape(); line._refreshShape();
} }
}, }
}, }
);
export default MoveControlPointCommand; export default MoveControlPointCommand;

View File

@ -17,8 +17,7 @@
*/ */
import Command from '../Command'; import Command from '../Command';
const RemoveFeatureFromTopicCommand = new Class(/** @lends RemoveFeatureFromTopicCommand */{ class RemoveFeatureFromTopicCommand extends Command {
Extends: Command,
/** /**
* @classdesc This command handles do/undo of removing a feature from a topic, e.g. an icon or * @classdesc This command handles do/undo of removing a feature from a topic, e.g. an icon or
* a note. For a reference of existing features, refer to {@link mindplot.TopicFeature}. * a note. For a reference of existing features, refer to {@link mindplot.TopicFeature}.
@ -27,15 +26,15 @@ const RemoveFeatureFromTopicCommand = new Class(/** @lends RemoveFeatureFromTopi
* @param {String} featureId id of the feature to remove * @param {String} featureId id of the feature to remove
* @extends mindplot.Command * @extends mindplot.Command
*/ */
initialize(topicId, featureId) { constructor(topicId, featureId) {
$assert($defined(topicId), 'topicId can not be null'); $assert($defined(topicId), 'topicId can not be null');
$assert(featureId, 'iconModel can not be null'); $assert(featureId, 'iconModel can not be null');
this.parent(); super();
this._topicId = topicId; this._topicId = topicId;
this._featureId = featureId; this._featureId = featureId;
this._oldFeature = null; this._oldFeature = null;
}, }
/** /**
* Overrides abstract parent method * Overrides abstract parent method
@ -45,7 +44,7 @@ const RemoveFeatureFromTopicCommand = new Class(/** @lends RemoveFeatureFromTopi
const feature = topic.findFeatureById(this._featureId); const feature = topic.findFeatureById(this._featureId);
topic.removeFeature(feature); topic.removeFeature(feature);
this._oldFeature = feature; this._oldFeature = feature;
}, }
/** /**
* Overrides abstract parent method * Overrides abstract parent method
@ -55,7 +54,7 @@ const RemoveFeatureFromTopicCommand = new Class(/** @lends RemoveFeatureFromTopi
const topic = commandContext.findTopics(this._topicId)[0]; const topic = commandContext.findTopics(this._topicId)[0];
topic.addFeature(this._oldFeature); topic.addFeature(this._oldFeature);
this._oldFeature = null; this._oldFeature = null;
}, }
}); }
export default RemoveFeatureFromTopicCommand; export default RemoveFeatureFromTopicCommand;

View File

@ -1,21 +0,0 @@
import addFeatureToTopicCommand from './AddFeatureToTopicCommand';
import addRelationshipCommand from './AddRelationshipCommand';
import addTopicCommand from './AddTopicCommand';
import changeFeatureToTopicCommand from './ChangeFeatureToTopicCommand';
import deleteCommand from './DeleteCommand';
import dragTopicCommand from './DragTopicCommand';
import genericFunctionCommand from './GenericFunctionCommand';
import moveControlPointCommand from './MoveControlPointCommand';
import removeFeatureFromTopicCommand from './RemoveFeatureFromTopicCommand';
export default {
AddFeatureToTopicCommand: addFeatureToTopicCommand,
AddRelationshipCommand: addRelationshipCommand,
AddTopicCommand: addTopicCommand,
ChangeFeatureToTopicCommand: changeFeatureToTopicCommand,
DeleteCommand: deleteCommand,
DragTopicCommand: dragTopicCommand,
GenericFunctionCommand: genericFunctionCommand,
MoveControlPointCommand: moveControlPointCommand,
RemoveFeatureFromTopicCommand: removeFeatureFromTopicCommand,
};

View File

@ -21,10 +21,10 @@ import Node from './Node';
import SymmetricSorter from './SymmetricSorter'; import SymmetricSorter from './SymmetricSorter';
import BalancedSorter from './BalancedSorter'; import BalancedSorter from './BalancedSorter';
const OriginalLayout = new Class({ class OriginalLayout {
initialize(treeSet) { constructor(treeSet) {
this._treeSet = treeSet; this._treeSet = treeSet;
}, }
/** */ /** */
createNode(id, size, position, type) { createNode(id, size, position, type) {
@ -35,7 +35,7 @@ const OriginalLayout = new Class({
const strategy = type === 'root' ? OriginalLayout.BALANCED_SORTER : OriginalLayout.SYMMETRIC_SORTER; const strategy = type === 'root' ? OriginalLayout.BALANCED_SORTER : OriginalLayout.SYMMETRIC_SORTER;
return new Node(id, size, position, strategy); return new Node(id, size, position, strategy);
}, }
/** */ /** */
connectNode(parentId, childId, order) { connectNode(parentId, childId, order) {
@ -51,7 +51,7 @@ const OriginalLayout = new Class({
// Fire a basic validation ... // Fire a basic validation ...
sorter.verify(this._treeSet, parent); sorter.verify(this._treeSet, parent);
}, }
/** */ /** */
disconnectNode(nodeId) { disconnectNode(nodeId) {
@ -72,7 +72,7 @@ const OriginalLayout = new Class({
// Fire a basic validation ... // Fire a basic validation ...
parent.getSorter().verify(this._treeSet, parent); parent.getSorter().verify(this._treeSet, parent);
}, }
/** */ /** */
layout() { layout() {
@ -91,7 +91,7 @@ const OriginalLayout = new Class({
}, },
this, this,
); );
}, }
_layoutChildren(node, heightById) { _layoutChildren(node, heightById) {
const nodeId = node.getId(); const nodeId = node.getId();
@ -154,7 +154,7 @@ const OriginalLayout = new Class({
}, },
this, this,
); );
}, }
_calculateAlignOffset(node, child, heightById) { _calculateAlignOffset(node, child, heightById) {
if (child.isFree()) { if (child.isFree()) {
@ -191,14 +191,14 @@ const OriginalLayout = new Class({
} }
return offset; return offset;
}, }
_branchIsTaller(node, heightById) { _branchIsTaller(node, heightById) {
return ( return (
heightById[node.getId()] heightById[node.getId()]
> node.getSize().height + node.getSorter()._getVerticalPadding() * 2 > node.getSize().height + node.getSorter()._getVerticalPadding() * 2
); );
}, }
_fixOverlapping(node, heightById) { _fixOverlapping(node, heightById) {
const children = this._treeSet.getChildren(node); const children = this._treeSet.getChildren(node);
@ -214,7 +214,7 @@ const OriginalLayout = new Class({
}, },
this, this,
); );
}, }
_shiftBranches(node, heightById) { _shiftBranches(node, heightById) {
const shiftedBranches = [node]; const shiftedBranches = [node];
@ -254,7 +254,7 @@ const OriginalLayout = new Class({
}, },
this, this,
); );
}, }
_branchesOverlap(branchA, branchB, heightById) { _branchesOverlap(branchA, branchB, heightById) {
// a branch doesn't really overlap with itself // a branch doesn't really overlap with itself
@ -268,9 +268,8 @@ const OriginalLayout = new Class({
const bottomB = branchB.getPosition().y + heightById[branchB.getId()] / 2; const bottomB = branchB.getPosition().y + heightById[branchB.getId()] / 2;
return !(topA >= bottomB || bottomA <= topB); return !(topA >= bottomB || bottomA <= topB);
}, }
}, }
);
/** /**
* @type {mindplot.layout.SymmetricSorter} * @type {mindplot.layout.SymmetricSorter}

View File

@ -1,23 +1,26 @@
import Options from '../../Options'; import Options from '../../Options';
const BootstrapDialog = new Class({ import $ from '@libraries/jquery-2.1.0';
Implements: Options,
options: { class BootstrapDialog extends Options {
cancelButton: false,
closeButton: false, constructor(title, options) {
acceptButton: true, super();
removeButton: false, this.options = {
errorMessage: false, cancelButton: false,
onEventData: {}, closeButton: false,
}, acceptButton: true,
removeButton: false,
errorMessage: false,
onEventData: {},
};
initialize(title, options) {
this.setOptions(options); this.setOptions(options);
this.options.onEventData.dialog = this; this.options.onEventData.dialog = this;
this._native = $('<div class="modal fade" tabindex="-1"></div>').append('<div class="modal-dialog"></div>'); this._native = $('<div class="modal fade" tabindex="-1"></div>').append('<div class="modal-dialog"></div>');
const content = $('<div class="modal-content"></div>'); const content = $('<div class="modal-content"></div>');
const header = this._buildHeader(title); const header = this._buildHeader(title);
if (header) { if (header) {
content.append(header); content.append(header);
} }
@ -37,7 +40,7 @@ const BootstrapDialog = new Class({
$(this).remove(); $(this).remove();
}); });
this._native.on('shown.bs.modal', this.onDialogShown); this._native.on('shown.bs.modal', this.onDialogShown);
}, }
_buildFooter() { _buildFooter() {
let footer = null; let footer = null;
@ -58,7 +61,7 @@ const BootstrapDialog = new Class({
footer.append(`<button type="button" class="btn btn-secondary" data-dismiss="modal">${$msg('CANCEL')}</button>`); footer.append(`<button type="button" class="btn btn-secondary" data-dismiss="modal">${$msg('CANCEL')}</button>`);
} }
return footer; return footer;
}, }
_buildHeader(title) { _buildHeader(title) {
let header = null; let header = null;
@ -74,42 +77,42 @@ const BootstrapDialog = new Class({
header.append(`<h2 class="modal-title">${title}</h2>`); header.append(`<h2 class="modal-title">${title}</h2>`);
} }
return header; return header;
}, }
onAcceptClick(event) { onAcceptClick(event) {
throw 'Unsupported operation'; throw 'Unsupported operation';
}, }
onDialogShown() {}, onDialogShown() {}
onRemoveClick(event) { onRemoveClick(event) {
throw 'Unsupported operation'; throw 'Unsupported operation';
}, }
show() { show() {
this._native.modal(); this._native.modal();
}, }
setContent(content) { setContent(content) {
const modalBody = this._native.find('.modal-body'); const modalBody = this._native.find('.modal-body');
modalBody.append(content); modalBody.append(content);
}, }
css(options) { css(options) {
this._native.find('.modal-dialog').css(options); this._native.find('.modal-dialog').css(options);
}, }
close() { close() {
this._native.modal('hide'); this._native.modal('hide');
}, }
alertError(message) { alertError(message) {
this._native.find('.alert-danger').text(message); this._native.find('.alert-danger').text(message);
this._native.find('.alert-danger').show(); this._native.find('.alert-danger').show();
}, }
cleanError() { cleanError() {
this._native.find('.alert-danger').hide(); this._native.find('.alert-danger').hide();
}, }
}); }
export default BootstrapDialog; export default BootstrapDialog;

View File

@ -1,11 +1,8 @@
import BootstrapDialog from './BootstrapDialog'; import BootstrapDialog from './BootstrapDialog';
BootstrapDialog.Request = new Class({ class BootstrapDialogRequest extends BootstrapDialog {
constructor(url, title, options) {
Extends: BootstrapDialog, super(title, options);
initialize(url, title, options) {
this.parent(title, options);
this.requestOptions = {}; this.requestOptions = {};
this.requestOptions.cache = false; this.requestOptions.cache = false;
const me = this; const me = this;
@ -39,12 +36,13 @@ BootstrapDialog.Request = new Class({
}); });
me.show(); me.show();
}); });
}, }
onDialogShown() { onDialogShown() {
if (typeof (onDialogShown) === 'function') { if (typeof (onDialogShown) === 'function') {
onDialogShown(); onDialogShown();
} }
}, }
}
}); export default BootstrapDialogRequest;

View File

@ -18,15 +18,15 @@
import ModelCodeName from './ModelCodeName'; import ModelCodeName from './ModelCodeName';
import XMLSerializer_Pela from './XMLSerializer_Pela'; import XMLSerializer_Pela from './XMLSerializer_Pela';
const Beta2PelaMigrator = new Class({ class Beta2PelaMigrator {
initialize(betaSerializer) { constructor(betaSerializer) {
this._betaSerializer = betaSerializer; this._betaSerializer = betaSerializer;
this._pelaSerializer = new XMLSerializer_Pela(); this._pelaSerializer = new XMLSerializer_Pela();
}, }
toXML(mindmap) { toXML(mindmap) {
return this._pelaSerializer.toXML(mindmap); return this._pelaSerializer.toXML(mindmap);
}, }
loadFromDom(dom, mapId) { loadFromDom(dom, mapId) {
$assert($defined(mapId), 'mapId can not be null'); $assert($defined(mapId), 'mapId can not be null');
@ -41,7 +41,7 @@ const Beta2PelaMigrator = new Class({
}); });
return mindmap; return mindmap;
}, }
_fixPosition(parentModel) { _fixPosition(parentModel) {
const parentPos = parentModel.getPosition(); const parentPos = parentModel.getPosition();
@ -53,7 +53,7 @@ const Beta2PelaMigrator = new Class({
} }
me._fixPosition(child); me._fixPosition(child);
}); });
}, }
}); }
export default Beta2PelaMigrator; export default Beta2PelaMigrator;

View File

@ -18,15 +18,15 @@
import XMLSerializer_Tango from './XMLSerializer_Tango'; import XMLSerializer_Tango from './XMLSerializer_Tango';
import ModelCodeName from './ModelCodeName'; import ModelCodeName from './ModelCodeName';
const Pela2TangoMigrator = new Class({ class Pela2TangoMigrator {
initialize(pelaSerializer) { constructor(pelaSerializer) {
this._pelaSerializer = pelaSerializer; this._pelaSerializer = pelaSerializer;
this._tangoSerializer = new XMLSerializer_Tango(); this._tangoSerializer = new XMLSerializer_Tango();
}, }
toXML(mindmap) { toXML(mindmap) {
return this._tangoSerializer.toXML(mindmap); return this._tangoSerializer.toXML(mindmap);
}, }
loadFromDom(dom, mapId) { loadFromDom(dom, mapId) {
$assert($defined(mapId), 'mapId can not be null'); $assert($defined(mapId), 'mapId can not be null');
@ -35,7 +35,7 @@ const Pela2TangoMigrator = new Class({
this._fixOrder(mindmap); this._fixOrder(mindmap);
this._fixPosition(mindmap); this._fixPosition(mindmap);
return mindmap; return mindmap;
}, }
_fixOrder(mindmap) { _fixOrder(mindmap) {
// First level node policies has been changed. // First level node policies has been changed.
@ -62,7 +62,7 @@ const Pela2TangoMigrator = new Class({
for (i = 0; i < leftNodes.length; i++) { for (i = 0; i < leftNodes.length; i++) {
leftNodes[i].setOrder(i * 2 + 1); leftNodes[i].setOrder(i * 2 + 1);
} }
}, }
_fixPosition(mindmap) { _fixPosition(mindmap) {
// Position was not required in previous versions. Try to synthesize one . // Position was not required in previous versions. Try to synthesize one .
@ -73,7 +73,7 @@ const Pela2TangoMigrator = new Class({
const position = child.getPosition(); const position = child.getPosition();
this._fixNodePosition(child, position); this._fixNodePosition(child, position);
} }
}, }
_fixNodePosition(node, parentPosition) { _fixNodePosition(node, parentPosition) {
// Position was not required in previous versions. Try to synthesize one . // Position was not required in previous versions. Try to synthesize one .
let position = node.getPosition(); let position = node.getPosition();
@ -86,7 +86,7 @@ const Pela2TangoMigrator = new Class({
const child = children[i]; const child = children[i];
this._fixNodePosition(child, position); this._fixNodePosition(child, position);
} }
}, }
}); }
export default Pela2TangoMigrator; export default Pela2TangoMigrator;

View File

@ -20,7 +20,7 @@ import Mindmap from '../model/Mindmap';
import INodeModel from '../model/INodeModel'; import INodeModel from '../model/INodeModel';
import TopicFeature from '../TopicFeature'; import TopicFeature from '../TopicFeature';
const XMLSerializer_Beta = new Class({ class XMLSerializer_Beta {
toXML(mindmap) { toXML(mindmap) {
$assert(mindmap, 'Can not save a null mindmap'); $assert(mindmap, 'Can not save a null mindmap');
@ -43,7 +43,7 @@ const XMLSerializer_Beta = new Class({
} }
return document; return document;
}, }
_topicToXML(document, topic) { _topicToXML(document, topic) {
const parentTopic = document.createElement('topic'); const parentTopic = document.createElement('topic');
@ -55,7 +55,7 @@ const XMLSerializer_Beta = new Class({
const parent = topic.getParent(); const parent = topic.getParent();
if (parent == null || parent.getType() === INodeModel.CENTRAL_TOPIC_TYPE) { if (parent == null || parent.getType() === INodeModel.CENTRAL_TOPIC_TYPE) {
const pos = topic.getPosition(); const pos = topic.getPosition();
parentTopic.setAttribute('position', `${pos.x},${pos.y}`); parentTopic.setAttribute('position', `${pos.x}${pos.y}`);
} else { } else {
const order = topic.getOrder(); const order = topic.getOrder();
parentTopic.setAttribute('order', order); parentTopic.setAttribute('order', order);
@ -147,25 +147,25 @@ const XMLSerializer_Beta = new Class({
} }
return parentTopic; return parentTopic;
}, }
_iconToXML(document, icon) { _iconToXML(document, icon) {
const iconDom = document.createElement('icon'); const iconDom = document.createElement('icon');
iconDom.setAttribute('id', icon.getIconType()); iconDom.setAttribute('id', icon.getIconType());
return iconDom; return iconDom;
}, }
_linkToXML(document, link) { _linkToXML(document, link) {
const linkDom = document.createElement('link'); const linkDom = document.createElement('link');
linkDom.setAttribute('url', link.getUrl()); linkDom.setAttribute('url', link.getUrl());
return linkDom; return linkDom;
}, }
_noteToXML(document, note) { _noteToXML(document, note) {
const noteDom = document.createElement('note'); const noteDom = document.createElement('note');
noteDom.setAttribute('text', note.getText()); noteDom.setAttribute('text', note.getText());
return noteDom; return noteDom;
}, }
loadFromDom(dom, mapId) { loadFromDom(dom, mapId) {
$assert(dom, 'Dom can not be null'); $assert(dom, 'Dom can not be null');
@ -181,8 +181,8 @@ const XMLSerializer_Beta = new Class({
// Is a wisemap?. // Is a wisemap?.
$assert( $assert(
documentElement.tagName === XMLSerializer_Beta.MAP_ROOT_NODE, documentElement.tagName === XMLSerializer_Beta.MAP_ROOT_NODE,
`This seem not to be a map document. Root Tag: '${documentElement.tagName},',HTML:${dom.innerHTML `This seem not to be a map document. Root Tag: '${documentElement.tagName}',HTML:${dom.innerHTML
},XML:${innerXML(dom)}`, }XML:${innerXML(dom)}`,
); );
// Start the loading process ... // Start the loading process ...
@ -200,7 +200,7 @@ const XMLSerializer_Beta = new Class({
} }
mindmap.setId(mapId); mindmap.setId(mapId);
return mindmap; return mindmap;
}, }
_deserializeNode(domElem, mindmap) { _deserializeNode(domElem, mindmap) {
const type = domElem.getAttribute('central') != null const type = domElem.getAttribute('central') != null
@ -299,23 +299,23 @@ const XMLSerializer_Beta = new Class({
} }
return topic; return topic;
}, }
_deserializeIcon(domElem) { _deserializeIcon(domElem) {
let icon = domElem.getAttribute('id'); let icon = domElem.getAttribute('id');
icon = icon.replace('images/', 'icons/legacy/'); icon = icon.replace('images/', 'icons/legacy/');
return TopicFeature.createModel(TopicFeature.Icon.id, { id: icon }); return TopicFeature.createModel(TopicFeature.Icon.id, { id: icon });
}, }
_deserializeLink(domElem) { _deserializeLink(domElem) {
return TopicFeature.createModel(TopicFeature.Link.id, { url: domElem.getAttribute('url') }); return TopicFeature.createModel(TopicFeature.Link.id, { url: domElem.getAttribute('url') });
}, }
_deserializeNote(domElem) { _deserializeNote(domElem) {
const text = domElem.getAttribute('text'); const text = domElem.getAttribute('text');
return TopicFeature.createModel(TopicFeature.Note.id, { text: text == null ? ' ' : text }); return TopicFeature.createModel(TopicFeature.Note.id, { text: text == null ? ' ' : text });
}, }
}); }
XMLSerializer_Beta.MAP_ROOT_NODE = 'map'; XMLSerializer_Beta.MAP_ROOT_NODE = 'map';

View File

@ -16,7 +16,7 @@
* limitations under the License. * limitations under the License.
*/ */
import { $assert, $defined, createDocument } from '@wisemapping/core-js'; import { $assert, $defined, createDocument } from '@wisemapping/core-js';
import web2d from '@wisemapping/web2d'; import * as web2d from '@wisemapping/web2d';
import Mindmap from '../model/Mindmap'; import Mindmap from '../model/Mindmap';
import INodeModel, { TopicShape } from '../model/INodeModel'; import INodeModel, { TopicShape } from '../model/INodeModel';
import TopicFeature from '../TopicFeature'; import TopicFeature from '../TopicFeature';
@ -26,492 +26,485 @@ import ConnectionLine from '../ConnectionLine';
* @class * @class
*/ */
// eslint-disable-next-line camelcase // eslint-disable-next-line camelcase
const XMLSerializer_Pela = new Class( class XMLSerializer_Pela {
/** @lends XMLSerializer_Pela */ { toXML(mindmap) {
/** $assert(mindmap, 'Can not save a null mindmap');
* @param mindmap
* @throws will throw an error if mindmap is null or undefined
* @return the created XML document (using the cross-browser implementation in core)
*/
toXML(mindmap) {
$assert(mindmap, 'Can not save a null mindmap');
const document = createDocument(); const document = createDocument();
// Store map attributes ... // Store map attributes ...
const mapElem = document.createElement('map'); const mapElem = document.createElement('map');
const name = mindmap.getId(); const name = mindmap.getId();
if ($defined(name)) { if ($defined(name)) {
mapElem.setAttribute('name', this.rmXmlInv(name)); mapElem.setAttribute('name', this.rmXmlInv(name));
}
const version = mindmap.getVersion();
if ($defined(version)) {
mapElem.setAttribute('version', version);
}
document.appendChild(mapElem);
// Create branches ...
const topics = mindmap.getBranches();
for (let i = 0; i < topics.length; i++) {
const topic = topics[i];
const topicDom = this._topicToXML(document, topic);
mapElem.appendChild(topicDom);
}
// Create Relationships
const relationships = mindmap.getRelationships();
if (relationships.length > 0) {
for (let j = 0; j < relationships.length; j++) {
const relationship = relationships[j];
if (
mindmap.findNodeById(relationship.getFromNode()) !== null
&& mindmap.findNodeById(relationship.getToNode()) !== null
) {
// Isolated relationships are not persisted ....
const relationDom = this._relationshipToXML(document, relationship);
mapElem.appendChild(relationDom);
}
} }
const version = mindmap.getVersion(); }
if ($defined(version)) {
mapElem.setAttribute('version', version); return document;
}
_topicToXML(document, topic) {
const parentTopic = document.createElement('topic');
// Set topic attributes...
if (topic.getType() === INodeModel.CENTRAL_TOPIC_TYPE) {
parentTopic.setAttribute('central', 'true');
} else {
const pos = topic.getPosition();
parentTopic.setAttribute('position', `${pos.x}${pos.y}`);
const order = topic.getOrder();
if (typeof order === 'number' && Number.isFinite(order)) { parentTopic.setAttribute('order', order); }
}
const text = topic.getText();
if ($defined(text)) {
this._noteTextToXML(document, parentTopic, text);
}
const shape = topic.getShapeType();
if ($defined(shape)) {
parentTopic.setAttribute('shape', shape);
if (shape === TopicShape.IMAGE) {
parentTopic.setAttribute(
'image',
`${topic.getImageSize().width}${topic.getImageSize().height
}:${topic.getImageUrl()}`,
);
} }
}
document.appendChild(mapElem); if (topic.areChildrenShrunken() && topic.getType() !== INodeModel.CENTRAL_TOPIC_TYPE) {
parentTopic.setAttribute('shrink', 'true');
}
// Create branches ... // Font properties ...
const topics = mindmap.getBranches(); const id = topic.getId();
for (let i = 0; i < topics.length; i++) { parentTopic.setAttribute('id', id);
const topic = topics[i];
const topicDom = this._topicToXML(document, topic); let font = '';
mapElem.appendChild(topicDom);
const fontFamily = topic.getFontFamily();
font += `${fontFamily || ''};`;
const fontSize = topic.getFontSize();
font += `${fontSize || ''};`;
const fontColor = topic.getFontColor();
font += `${fontColor || ''};`;
const fontWeight = topic.getFontWeight();
font += `${fontWeight || ''};`;
const fontStyle = topic.getFontStyle();
font += `${fontStyle || ''};`;
if (
$defined(fontFamily)
|| $defined(fontSize)
|| $defined(fontColor)
|| $defined(fontWeight)
|| $defined(fontStyle)
) {
parentTopic.setAttribute('fontStyle', font);
}
const bgColor = topic.getBackgroundColor();
if ($defined(bgColor)) {
parentTopic.setAttribute('bgColor', bgColor);
}
const brColor = topic.getBorderColor();
if ($defined(brColor)) {
parentTopic.setAttribute('brColor', brColor);
}
const metadata = topic.getMetadata();
if ($defined(metadata)) {
parentTopic.setAttribute('metadata', metadata);
}
// Serialize features ...
const features = topic.getFeatures();
for (let i = 0; i < features.length; i++) {
const feature = features[i];
const featureType = feature.getType();
const featureDom = document.createElement(featureType);
const attributes = feature.getAttributes();
for (const key in attributes) {
const value = attributes[key];
if (key === 'text') {
const cdata = document.createCDATASection(this.rmXmlInv(value));
featureDom.appendChild(cdata);
} else {
featureDom.setAttribute(key, this.rmXmlInv(value));
}
} }
parentTopic.appendChild(featureDom);
}
// Create Relationships // CHILDREN TOPICS
const relationships = mindmap.getRelationships(); const childTopics = topic.getChildren();
if (relationships.length > 0) { for (let j = 0; j < childTopics.length; j++) {
for (let j = 0; j < relationships.length; j++) { const childTopic = childTopics[j];
const relationship = relationships[j]; const childDom = this._topicToXML(document, childTopic);
if ( parentTopic.appendChild(childDom);
mindmap.findNodeById(relationship.getFromNode()) !== null }
&& mindmap.findNodeById(relationship.getToNode()) !== null return parentTopic;
) { }
// Isolated relationships are not persisted ....
const relationDom = this._relationshipToXML(document, relationship); _noteTextToXML(document, elem, text) {
mapElem.appendChild(relationDom); if (text.indexOf('\n') === -1) {
elem.setAttribute('text', this.rmXmlInv(text));
} else {
const textDom = document.createElement('text');
const cdata = document.createCDATASection(this.rmXmlInv(text));
textDom.appendChild(cdata);
elem.appendChild(textDom);
}
}
_relationshipToXML(document, relationship) {
const result = document.createElement('relationship');
result.setAttribute('srcTopicId', relationship.getFromNode());
result.setAttribute('destTopicId', relationship.getToNode());
const lineType = relationship.getLineType();
result.setAttribute('lineType', lineType);
if (lineType === ConnectionLine.CURVED || lineType === ConnectionLine.SIMPLE_CURVED) {
if ($defined(relationship.getSrcCtrlPoint())) {
const srcPoint = relationship.getSrcCtrlPoint();
result.setAttribute(
'srcCtrlPoint',
`${Math.round(srcPoint.x)}${Math.round(srcPoint.y)}`,
);
}
if ($defined(relationship.getDestCtrlPoint())) {
const destPoint = relationship.getDestCtrlPoint();
result.setAttribute(
'destCtrlPoint',
`${Math.round(destPoint.x)}${Math.round(destPoint.y)}`,
);
}
}
result.setAttribute('endArrow', relationship.getEndArrow());
result.setAttribute('startArrow', relationship.getStartArrow());
return result;
}
/**
* @param dom
* @param mapId
* @throws will throw an error if dom is null or undefined
* @throws will throw an error if mapId is null or undefined
* @throws will throw an error if the document element is not consistent with a wisemap's root
* element
*/
loadFromDom(dom, mapId) {
$assert(dom, 'dom can not be null');
$assert(mapId, 'mapId can not be null');
const rootElem = dom.documentElement;
// Is a wisemap?.
$assert(
rootElem.tagName === XMLSerializer_Pela.MAP_ROOT_NODE,
'This seem not to be a map document.',
);
this._idsMap = {};
// Start the loading process ...
const version = rootElem.getAttribute('version');
const mindmap = new Mindmap(mapId, version);
const children = rootElem.childNodes;
for (let i = 0; i < children.length; i++) {
const child = children[i];
if (child.nodeType === 1) {
switch (child.tagName) {
case 'topic': {
const topic = this._deserializeNode(child, mindmap);
mindmap.addBranch(topic);
break;
} }
} case 'relationship': {
} const relationship = this._deserializeRelationship(child, mindmap);
if (relationship != null) {
return document; mindmap.addRelationship(relationship);
},
_topicToXML(document, topic) {
const parentTopic = document.createElement('topic');
// Set topic attributes...
if (topic.getType() === INodeModel.CENTRAL_TOPIC_TYPE) {
parentTopic.setAttribute('central', 'true');
} else {
const pos = topic.getPosition();
parentTopic.setAttribute('position', `${pos.x},${pos.y}`);
const order = topic.getOrder();
if (typeof order === 'number' && Number.isFinite(order)) { parentTopic.setAttribute('order', order); }
}
const text = topic.getText();
if ($defined(text)) {
this._noteTextToXML(document, parentTopic, text);
}
const shape = topic.getShapeType();
if ($defined(shape)) {
parentTopic.setAttribute('shape', shape);
if (shape === TopicShape.IMAGE) {
parentTopic.setAttribute(
'image',
`${topic.getImageSize().width},${topic.getImageSize().height
}:${topic.getImageUrl()}`,
);
}
}
if (topic.areChildrenShrunken() && topic.getType() !== INodeModel.CENTRAL_TOPIC_TYPE) {
parentTopic.setAttribute('shrink', 'true');
}
// Font properties ...
const id = topic.getId();
parentTopic.setAttribute('id', id);
let font = '';
const fontFamily = topic.getFontFamily();
font += `${fontFamily || ''};`;
const fontSize = topic.getFontSize();
font += `${fontSize || ''};`;
const fontColor = topic.getFontColor();
font += `${fontColor || ''};`;
const fontWeight = topic.getFontWeight();
font += `${fontWeight || ''};`;
const fontStyle = topic.getFontStyle();
font += `${fontStyle || ''};`;
if (
$defined(fontFamily)
|| $defined(fontSize)
|| $defined(fontColor)
|| $defined(fontWeight)
|| $defined(fontStyle)
) {
parentTopic.setAttribute('fontStyle', font);
}
const bgColor = topic.getBackgroundColor();
if ($defined(bgColor)) {
parentTopic.setAttribute('bgColor', bgColor);
}
const brColor = topic.getBorderColor();
if ($defined(brColor)) {
parentTopic.setAttribute('brColor', brColor);
}
const metadata = topic.getMetadata();
if ($defined(metadata)) {
parentTopic.setAttribute('metadata', metadata);
}
// Serialize features ...
const features = topic.getFeatures();
for (let i = 0; i < features.length; i++) {
const feature = features[i];
const featureType = feature.getType();
const featureDom = document.createElement(featureType);
const attributes = feature.getAttributes();
for (const key in attributes) {
const value = attributes[key];
if (key === 'text') {
const cdata = document.createCDATASection(this.rmXmlInv(value));
featureDom.appendChild(cdata);
} else {
featureDom.setAttribute(key, this.rmXmlInv(value));
}
}
parentTopic.appendChild(featureDom);
}
// CHILDREN TOPICS
const childTopics = topic.getChildren();
for (let j = 0; j < childTopics.length; j++) {
const childTopic = childTopics[j];
const childDom = this._topicToXML(document, childTopic);
parentTopic.appendChild(childDom);
}
return parentTopic;
},
_noteTextToXML(document, elem, text) {
if (text.indexOf('\n') === -1) {
elem.setAttribute('text', this.rmXmlInv(text));
} else {
const textDom = document.createElement('text');
const cdata = document.createCDATASection(this.rmXmlInv(text));
textDom.appendChild(cdata);
elem.appendChild(textDom);
}
},
_relationshipToXML(document, relationship) {
const result = document.createElement('relationship');
result.setAttribute('srcTopicId', relationship.getFromNode());
result.setAttribute('destTopicId', relationship.getToNode());
const lineType = relationship.getLineType();
result.setAttribute('lineType', lineType);
if (lineType === ConnectionLine.CURVED || lineType === ConnectionLine.SIMPLE_CURVED) {
if ($defined(relationship.getSrcCtrlPoint())) {
const srcPoint = relationship.getSrcCtrlPoint();
result.setAttribute(
'srcCtrlPoint',
`${Math.round(srcPoint.x)},${Math.round(srcPoint.y)}`,
);
}
if ($defined(relationship.getDestCtrlPoint())) {
const destPoint = relationship.getDestCtrlPoint();
result.setAttribute(
'destCtrlPoint',
`${Math.round(destPoint.x)},${Math.round(destPoint.y)}`,
);
}
}
result.setAttribute('endArrow', relationship.getEndArrow());
result.setAttribute('startArrow', relationship.getStartArrow());
return result;
},
/**
* @param dom
* @param mapId
* @throws will throw an error if dom is null or undefined
* @throws will throw an error if mapId is null or undefined
* @throws will throw an error if the document element is not consistent with a wisemap's root
* element
*/
loadFromDom(dom, mapId) {
$assert(dom, 'dom can not be null');
$assert(mapId, 'mapId can not be null');
const rootElem = dom.documentElement;
// Is a wisemap?.
$assert(
rootElem.tagName === XMLSerializer_Pela.MAP_ROOT_NODE,
'This seem not to be a map document.',
);
this._idsMap = {};
// Start the loading process ...
const version = rootElem.getAttribute('version');
const mindmap = new Mindmap(mapId, version);
const children = rootElem.childNodes;
for (let i = 0; i < children.length; i++) {
const child = children[i];
if (child.nodeType === 1) {
switch (child.tagName) {
case 'topic': {
const topic = this._deserializeNode(child, mindmap);
mindmap.addBranch(topic);
break;
} }
case 'relationship': { break;
const relationship = this._deserializeRelationship(child, mindmap);
if (relationship != null) {
mindmap.addRelationship(relationship);
}
break;
}
default:
break;
} }
default:
break;
} }
} }
this._idsMap = null; }
mindmap.setId(mapId); this._idsMap = null;
return mindmap; mindmap.setId(mapId);
}, return mindmap;
}
_deserializeNode(domElem, mindmap) { _deserializeNode(domElem, mindmap) {
const type = domElem.getAttribute('central') != null const type = domElem.getAttribute('central') != null
? INodeModel.CENTRAL_TOPIC_TYPE ? INodeModel.CENTRAL_TOPIC_TYPE
: INodeModel.MAIN_TOPIC_TYPE; : INodeModel.MAIN_TOPIC_TYPE;
// Load attributes... // Load attributes...
let id = domElem.getAttribute('id'); let id = domElem.getAttribute('id');
if ($defined(id)) { if ($defined(id)) {
id = parseInt(id, 10); id = parseInt(id, 10);
}
if (this._idsMap[id]) {
id = null;
} else {
this._idsMap[id] = domElem;
}
const topic = mindmap.createNode(type, id);
// Set text property is it;s defined...
const text = domElem.getAttribute('text');
if ($defined(text) && text) {
topic.setText(text);
}
const fontStyle = domElem.getAttribute('fontStyle');
if ($defined(fontStyle) && fontStyle) {
const font = fontStyle.split(';');
if (font[0]) {
topic.setFontFamily(font[0]);
} }
if (this._idsMap[id]) { if (font[1]) {
id = null; topic.setFontSize(font[1]);
} else {
this._idsMap[id] = domElem;
} }
const topic = mindmap.createNode(type, id); if (font[2]) {
topic.setFontColor(font[2]);
// Set text property is it;s defined...
const text = domElem.getAttribute('text');
if ($defined(text) && text) {
topic.setText(text);
} }
const fontStyle = domElem.getAttribute('fontStyle'); if (font[3]) {
if ($defined(fontStyle) && fontStyle) { topic.setFontWeight(font[3]);
const font = fontStyle.split(';'); }
if (font[0]) { if (font[4]) {
topic.setFontFamily(font[0]); topic.setFontStyle(font[4]);
} }
}
if (font[1]) { const shape = domElem.getAttribute('shape');
topic.setFontSize(font[1]); if ($defined(shape)) {
} topic.setShapeType(shape);
if (font[2]) { if (shape === TopicShape.IMAGE) {
topic.setFontColor(font[2]); const image = domElem.getAttribute('image');
} const size = image.substring(0, image.indexOf(':'));
const url = image.substring(image.indexOf(':') + 1, image.length);
topic.setImageUrl(url);
if (font[3]) { const split = size.split(',');
topic.setFontWeight(font[3]); topic.setImageSize(split[0], split[1]);
} }
}
if (font[4]) { const bgColor = domElem.getAttribute('bgColor');
topic.setFontStyle(font[4]); if ($defined(bgColor)) {
topic.setBackgroundColor(bgColor);
}
const borderColor = domElem.getAttribute('brColor');
if ($defined(borderColor)) {
topic.setBorderColor(borderColor);
}
const order = domElem.getAttribute('order');
if ($defined(order) && order !== 'NaN') {
// Hack for broken maps ...
topic.setOrder(parseInt(order, 10));
}
const isShrink = domElem.getAttribute('shrink');
// Hack: Some production maps has been stored with the central topic collapsed. This is a bug.
if ($defined(isShrink) && type !== INodeModel.CENTRAL_TOPIC_TYPE) {
topic.setChildrenShrunken(isShrink);
}
const position = domElem.getAttribute('position');
if ($defined(position)) {
const pos = position.split(',');
topic.setPosition(pos[0], pos[1]);
}
const metadata = domElem.getAttribute('metadata');
if ($defined(metadata)) {
topic.setMetadata(metadata);
}
// Creating icons and children nodes
const children = domElem.childNodes;
for (let i = 0; i < children.length; i++) {
const child = children[i];
if (child.nodeType === Node.ELEMENT_NODE) {
if (child.tagName === 'topic') {
const childTopic = this._deserializeNode(child, mindmap);
childTopic.connectTo(topic);
} else if (TopicFeature.isSupported(child.tagName)) {
// Load attributes ...
const namedNodeMap = child.attributes;
const attributes = {};
for (let j = 0; j < namedNodeMap.length; j++) {
const attribute = namedNodeMap.item(j);
attributes[attribute.name] = attribute.value;
}
// Has text node ?.
const textAttr = this._deserializeTextAttr(child);
if (textAttr) {
attributes.text = textAttr;
}
// Create a new element ....
const featureType = child.tagName;
const feature = TopicFeature.createModel(featureType, attributes);
topic.addFeature(feature);
} else if (child.tagName === 'text') {
const nodeText = this._deserializeNodeText(child);
topic.setText(nodeText);
} }
} }
}
return topic;
}
const shape = domElem.getAttribute('shape'); _deserializeTextAttr(domElem) {
if ($defined(shape)) { let value = domElem.getAttribute('text');
topic.setShapeType(shape); if (!$defined(value)) {
if (shape === TopicShape.IMAGE) {
const image = domElem.getAttribute('image');
const size = image.substring(0, image.indexOf(':'));
const url = image.substring(image.indexOf(':') + 1, image.length);
topic.setImageUrl(url);
const split = size.split(',');
topic.setImageSize(split[0], split[1]);
}
}
const bgColor = domElem.getAttribute('bgColor');
if ($defined(bgColor)) {
topic.setBackgroundColor(bgColor);
}
const borderColor = domElem.getAttribute('brColor');
if ($defined(borderColor)) {
topic.setBorderColor(borderColor);
}
const order = domElem.getAttribute('order');
if ($defined(order) && order !== 'NaN') {
// Hack for broken maps ...
topic.setOrder(parseInt(order, 10));
}
const isShrink = domElem.getAttribute('shrink');
// Hack: Some production maps has been stored with the central topic collapsed. This is a bug.
if ($defined(isShrink) && type !== INodeModel.CENTRAL_TOPIC_TYPE) {
topic.setChildrenShrunken(isShrink);
}
const position = domElem.getAttribute('position');
if ($defined(position)) {
const pos = position.split(',');
topic.setPosition(pos[0], pos[1]);
}
const metadata = domElem.getAttribute('metadata');
if ($defined(metadata)) {
topic.setMetadata(metadata);
}
// Creating icons and children nodes
const children = domElem.childNodes; const children = domElem.childNodes;
for (let i = 0; i < children.length; i++) {
const child = children[i];
if (child.nodeType === Node.ELEMENT_NODE) {
if (child.tagName === 'topic') {
const childTopic = this._deserializeNode(child, mindmap);
childTopic.connectTo(topic);
} else if (TopicFeature.isSupported(child.tagName)) {
// Load attributes ...
const namedNodeMap = child.attributes;
const attributes = {};
for (let j = 0; j < namedNodeMap.length; j++) {
const attribute = namedNodeMap.item(j);
attributes[attribute.name] = attribute.value;
}
// Has text node ?.
const textAttr = this._deserializeTextAttr(child);
if (textAttr) {
attributes.text = textAttr;
}
// Create a new element ....
const featureType = child.tagName;
const feature = TopicFeature.createModel(featureType, attributes);
topic.addFeature(feature);
} else if (child.tagName === 'text') {
const nodeText = this._deserializeNodeText(child);
topic.setText(nodeText);
}
}
}
return topic;
},
_deserializeTextAttr(domElem) {
let value = domElem.getAttribute('text');
if (!$defined(value)) {
const children = domElem.childNodes;
for (let i = 0; i < children.length; i++) {
const child = children[i];
if (child.nodeType === Node.CDATA_SECTION_NODE) {
value = child.nodeValue;
}
}
} else {
// Notes must be decoded ...
value = unescape(value);
// Hack for empty nodes ...
if (value === '') {
value = ' ';
}
}
return value;
},
_deserializeNodeText(domElem) {
const children = domElem.childNodes;
let value = null;
for (let i = 0; i < children.length; i++) { for (let i = 0; i < children.length; i++) {
const child = children[i]; const child = children[i];
if (child.nodeType === Node.CDATA_SECTION_NODE) { if (child.nodeType === Node.CDATA_SECTION_NODE) {
value = child.nodeValue; value = child.nodeValue;
} }
} }
return value; } else {
}, // Notes must be decoded ...
value = unescape(value);
_deserializeRelationship(domElement, mindmap) { // Hack for empty nodes ...
const srcId = domElement.getAttribute('srcTopicId'); if (value === '') {
const destId = domElement.getAttribute('destTopicId'); value = ' ';
const lineType = domElement.getAttribute('lineType'); }
const srcCtrlPoint = domElement.getAttribute('srcCtrlPoint'); }
const destCtrlPoint = domElement.getAttribute('destCtrlPoint');
// If for some reason a relationship lines has source and dest nodes the same, don't import it. return value;
if (srcId === destId) { }
return null;
}
// Is the connections points valid ?. If it's not, do not load the relationship ...
if (mindmap.findNodeById(srcId) == null || mindmap.findNodeById(destId) == null) {
return null;
}
const model = mindmap.createRelationship(srcId, destId); _deserializeNodeText(domElem) {
model.setLineType(lineType); const children = domElem.childNodes;
if ($defined(srcCtrlPoint) && srcCtrlPoint !== '') { let value = null;
model.setSrcCtrlPoint(web2d.Point.fromString(srcCtrlPoint)); for (let i = 0; i < children.length; i++) {
const child = children[i];
if (child.nodeType === Node.CDATA_SECTION_NODE) {
value = child.nodeValue;
} }
if ($defined(destCtrlPoint) && destCtrlPoint !== '') { }
model.setDestCtrlPoint(web2d.Point.fromString(destCtrlPoint)); return value;
} }
model.setEndArrow('false');
model.setStartArrow('true');
return model;
},
/** _deserializeRelationship(domElement, mindmap) {
* This method ensures that the output String has only const srcId = domElement.getAttribute('srcTopicId');
* valid XML unicode characters as specified by the const destId = domElement.getAttribute('destTopicId');
* XML 1.0 standard. For reference, please see const lineType = domElement.getAttribute('lineType');
* <a href="http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char">the const srcCtrlPoint = domElement.getAttribute('srcCtrlPoint');
* standard</a>. This method will return an empty const destCtrlPoint = domElement.getAttribute('destCtrlPoint');
* String if the input is null or empty.
*
* @param in The String whose non-valid characters we want to remove.
* @return The in String, stripped of non-valid characters.
*/
rmXmlInv(str) {
if (str == null || str === undefined) return null;
let result = ''; // If for some reason a relationship lines has source and dest nodes the same, don't import it.
for (let i = 0; i < str.length; i++) { if (srcId === destId) {
const c = str.charCodeAt(i); return null;
if ( }
c === 0x9 // Is the connections points valid ?. If it's not, do not load the relationship ...
|| c === 0xa if (mindmap.findNodeById(srcId) == null || mindmap.findNodeById(destId) == null) {
|| c === 0xd return null;
|| (c >= 0x20 && c <= 0xd7ff) }
|| (c >= 0xe000 && c <= 0xfffd)
|| (c >= 0x10000 && c <= 0x10ffff) const model = mindmap.createRelationship(srcId, destId);
) { model.setLineType(lineType);
result += str.charAt(i); if ($defined(srcCtrlPoint) && srcCtrlPoint !== '') {
} model.setSrcCtrlPoint(web2d.Point.fromString(srcCtrlPoint));
}
if ($defined(destCtrlPoint) && destCtrlPoint !== '') {
model.setDestCtrlPoint(web2d.Point.fromString(destCtrlPoint));
}
model.setEndArrow('false');
model.setStartArrow('true');
return model;
}
/**
* This method ensures that the output String has only
* valid XML unicode characters as specified by the
* XML 1.0 standard. For reference, please see
* <a href="http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char">the
* standard</a>. This method will return an empty
* String if the input is null or empty.
*
* @param in The String whose non-valid characters we want to remove.
* @return The in String, stripped of non-valid characters.
*/
rmXmlInv(str) {
if (str == null || str === undefined) return null;
let result = '';
for (let i = 0; i < str.length; i++) {
const c = str.charCodeAt(i);
if (
c === 0x9
|| c === 0xa
|| c === 0xd
|| (c >= 0x20 && c <= 0xd7ff)
|| (c >= 0xe000 && c <= 0xfffd)
|| (c >= 0x10000 && c <= 0x10ffff)
) {
result += str.charAt(i);
} }
return result; }
}, return result;
}, }
); }
/** /**
* a wisemap's root element tag name * a wisemap's root element tag name

View File

@ -23,8 +23,7 @@ import XMLSerializer_Pela from './XMLSerializer_Pela';
* @class * @class
* @extends mindplot.persistence.XMLSerializer_Pela * @extends mindplot.persistence.XMLSerializer_Pela
*/ */
const XMLSerializer_Tango = new Class({ class XMLSerializer_Tango extends XMLSerializer_Pela{
Extends: XMLSerializer_Pela, };
});
export default XMLSerializer_Tango; export default XMLSerializer_Tango;

View File

@ -15,7 +15,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import web2d from '@wisemapping/web2d'; import * as web2d from '@wisemapping/web2d';
import { $assert, $defined } from '@wisemapping/core-js'; import { $assert, $defined } from '@wisemapping/core-js';
import { TopicShape } from '../model/INodeModel'; import { TopicShape } from '../model/INodeModel';
import TopicConfig from '../TopicConfig'; import TopicConfig from '../TopicConfig';

View File

@ -18,9 +18,9 @@
import { $assert } from "@wisemapping/core-js"; import { $assert } from "@wisemapping/core-js";
import PersistenceManager from '../PersistenceManager'; import PersistenceManager from '../PersistenceManager';
const IMenu = new Class({ class IMenu {
initialize(designer, containerId, mapId) { constructor(designer, containerId, mapId) {
$assert(designer, 'designer can not be null'); $assert(designer, 'designer can not be null');
$assert(containerId, 'containerId can not be null'); $assert(containerId, 'containerId can not be null');
@ -34,13 +34,13 @@ const IMenu = new Class({
this._designer.addEvent('modelUpdate', () => { this._designer.addEvent('modelUpdate', () => {
me.setRequireChange(true); me.setRequireChange(true);
}); });
}, }
clear() { clear() {
_.each(this._toolbarElems, (item) => { _.each(this._toolbarElems, (item) => {
item.hide(); item.hide();
}); });
}, }
discardChanges(designer) { discardChanges(designer) {
// Avoid autosave before leaving the page .... // Avoid autosave before leaving the page ....
@ -56,13 +56,13 @@ const IMenu = new Class({
// Reload the page ... // Reload the page ...
window.location.reload(); window.location.reload();
}, }
unlockMap(designer) { unlockMap(designer) {
const mindmap = designer.getMindmap(); const mindmap = designer.getMindmap();
const persistenceManager = PersistenceManager.getInstance(); const persistenceManager = PersistenceManager.getInstance();
persistenceManager.unlockMap(mindmap); persistenceManager.unlockMap(mindmap);
}, }
save(saveElem, designer, saveHistory, sync) { save(saveElem, designer, saveHistory, sync) {
// Load map content ... // Load map content ...
@ -86,7 +86,6 @@ const IMenu = new Class({
} }
menu.setRequireChange(false); menu.setRequireChange(false);
}, },
onError(error) { onError(error) {
if (saveHistory) { if (saveHistory) {
saveElem.css('cursor', 'pointer'); saveElem.css('cursor', 'pointer');
@ -97,17 +96,17 @@ const IMenu = new Class({
$notifyModal(error.message); $notifyModal(error.message);
} }
} }
}, }
}, sync); }, sync);
}, }
isSaveRequired() { isSaveRequired() {
return this._mindmapUpdated; return this._mindmapUpdated;
}, }
setRequireChange(value) { setRequireChange(value) {
this._mindmapUpdated = value; this._mindmapUpdated = value;
}, }
}); }
export default IMenu; export default IMenu;

View File

@ -44,7 +44,7 @@ class IconPanel extends ToolbarPaneItem {
const iconId = familyIcons[j]; const iconId = familyIcons[j];
const img = $('<img>') const img = $('<img>')
.attr('id', iconId) .attr('id', iconId)
.attr('src', ImageIcon.prototype._getImageUrl(iconId)) .attr('src', ImageIcon._getImageUrl(iconId))
.attr('class', 'panelIcon'); .attr('class', 'panelIcon');
familyContent.append(img); familyContent.append(img);

View File

@ -19,7 +19,7 @@ import $ from '@libraries/jquery-2.1.0';
import _ from '@libraries/underscore-min'; import _ from '@libraries/underscore-min';
import { $defined } from '@wisemapping/core-js'; import { $defined } from '@wisemapping/core-js';
import BootstrapDialog from '../libraries/bootstrap/BootstrapDialog'; import BootstrapDialogRequest from "../libraries/bootstrap/BootstrapDialogRequest";
import IMenu from './IMenu'; import IMenu from './IMenu';
import FontFamilyPanel from './FontFamilyPanel'; import FontFamilyPanel from './FontFamilyPanel';
import FontSizePanel from './FontSizePanel'; import FontSizePanel from './FontSizePanel';
@ -215,7 +215,7 @@ class Menu extends IMenu {
} }
this._addButton('export', false, false, () => { this._addButton('export', false, false, () => {
BootstrapDialog.Request.active = new BootstrapDialog.Request(`c/maps/${mapId}/exportf`, $msg('EXPORT'), { BootstrapDialogRequest.active = new BootstrapDialogRequest(`c/maps/${mapId}/exportf`, $msg('EXPORT'), {
cancelButton: true, cancelButton: true,
closeButton: true, closeButton: true,
}); });
@ -347,7 +347,7 @@ class Menu extends IMenu {
const shareElem = $('#shareIt'); const shareElem = $('#shareIt');
if (shareElem) { if (shareElem) {
this._addButton('shareIt', false, false, () => { this._addButton('shareIt', false, false, () => {
BootstrapDialog.Request.active = new BootstrapDialog.Request(`c/maps/${mapId}/sharef`, $msg('COLLABORATE'), { BootstrapDialogRequest.active = new BootstrapDialogRequest(`c/maps/${mapId}/sharef`, $msg('COLLABORATE'), {
closeButton: true, closeButton: true,
cancelButton: true, cancelButton: true,
}); });
@ -359,7 +359,7 @@ class Menu extends IMenu {
const publishElem = $('#publishIt'); const publishElem = $('#publishIt');
if (publishElem) { if (publishElem) {
this._addButton('publishIt', false, false, () => { this._addButton('publishIt', false, false, () => {
BootstrapDialog.Request.active = new BootstrapDialog.Request(`c/maps/${mapId}/publishf`, $msg('PUBLISH'), { BootstrapDialogRequest.active = new BootstrapDialogRequest(`c/maps/${mapId}/publishf`, $msg('PUBLISH'), {
closeButton: true, closeButton: true,
cancelButton: true, cancelButton: true,
}); });
@ -371,7 +371,7 @@ class Menu extends IMenu {
const historyElem = $('#history'); const historyElem = $('#history');
if (historyElem) { if (historyElem) {
this._addButton('history', false, false, () => { this._addButton('history', false, false, () => {
BootstrapDialog.Request.active = new BootstrapDialog.Request(`c/maps/${mapId}/historyf`, $msg('HISTORY'), { BootstrapDialogRequest.active = new BootstrapDialogRequest(`c/maps/${mapId}/historyf`, $msg('HISTORY'), {
closeButton: true, closeButton: true,
cancelButton: true, cancelButton: true,
}); });
@ -386,7 +386,7 @@ class Menu extends IMenu {
const keyboardShortcut = $('#keyboardShortcuts'); const keyboardShortcut = $('#keyboardShortcuts');
if (keyboardShortcut) { if (keyboardShortcut) {
keyboardShortcut.bind('click', (event) => { keyboardShortcut.bind('click', (event) => {
BootstrapDialog.Request.active = new BootstrapDialog.Request('c/keyboard', $msg('SHORTCUTS'), { BootstrapDialogRequest.active = new BootstrapDialogRequest('c/keyboard', $msg('SHORTCUTS'), {
closeButton: true, closeButton: true,
cancelButton: true, cancelButton: true,
}); });

View File

@ -15,9 +15,7 @@
* limitations under the License. * limitations under the License.
*/ */
const ModalDialogNotifier = new Class({ class ModalDialogNotifier {
initialize() {},
// FIXME: replace by alert() // FIXME: replace by alert()
show(message, title) { show(message, title) {
$assert(message, 'message can not be null'); $assert(message, 'message can not be null');

View File

@ -18,23 +18,21 @@
import jQuery from '@libraries/jquery-2.1.0'; import jQuery from '@libraries/jquery-2.1.0';
import BootstrapDialog from '../libraries/bootstrap/BootstrapDialog'; import BootstrapDialog from '../libraries/bootstrap/BootstrapDialog';
const NoteEditor = new Class({ class NoteEditor extends BootstrapDialog{
Extends: BootstrapDialog, constructor(model) {
initialize(model) {
$assert(model, 'model can not be null'); $assert(model, 'model can not be null');
this._model = model; this._model = model;
this.parent($msg('Note'), { super($msg('Note'), {
cancelButton: true, cancelButton: true,
closeButton: true, closeButton: true,
acceptButton: true, acceptButton: true,
removeButton: typeof model.getValue() !== 'undefined', removeButton: typeof model.getValue() !== 'undefined',
onEventData: { model: this._model }, onEventData: { model: this._model }
}); });
this.css({ margin: '150px auto' }); this.css({ margin: '150px auto' });
const panel = this._buildPanel(model); const panel = this._buildPanel(model);
this.setContent(panel); this.setContent(panel);
}, }
_buildPanel(model) { _buildPanel(model) {
const result = $('<div></div>').css('padding-top', '5px'); const result = $('<div></div>').css('padding-top', '5px');
@ -66,11 +64,11 @@ const NoteEditor = new Class({
result.append(form); result.append(form);
return result; return result;
}, }
onAcceptClick(event) { onAcceptClick(event) {
event.data.dialog._submitForm(event.data.model); event.data.dialog._submitForm(event.data.model);
}, }
_submitForm(model) { _submitForm(model) {
const textarea = this._native.find('textarea'); const textarea = this._native.find('textarea');
@ -78,16 +76,16 @@ const NoteEditor = new Class({
model.setValue(textarea.val()); model.setValue(textarea.val());
} }
this.close(); this.close();
}, }
onDialogShown() { onDialogShown() {
$(this).find('textarea').focus(); $(this).find('textarea').focus();
}, }
onRemoveClick(event) { onRemoveClick(event) {
event.data.model.setValue(null); event.data.model.setValue(null);
event.data.dialog.close(); event.data.dialog.close();
}, }
}); }
export default NoteEditor; export default NoteEditor;

View File

@ -1,47 +0,0 @@
BootstrapDialog.Request = new Class({
Extends: BootstrapDialog,
initialize: function (url, title, options) {
this.parent(title, options);
this.requestOptions = {};
this.requestOptions.cache = false;
var me = this;
this.requestOptions.fail = function (xhr) {
// Intercept form requests ...
console.log("Failure:");
console.log(xhr);
};
this.requestOptions.success = function () {
// Intercept form requests ...
var forms = me._native.find('form');
_.each(forms, function (form) {
$(form).on('submit', function (event) {
// Intercept form ...
me.requestOptions.url = form.action;
me.requestOptions.method = form.method ? form.method : 'post';
$.ajax(me.requestOptions);
event.stopPropagation();
return false;
});
});
};
this._native.find('.modal-body').load(url, function () {
me.acceptButton.unbind('click').click(function () {
submitDialogForm();
});
me._native.on('hidden.bs.modal', function () {
$(this).remove();
});
me.show();
});
},
onDialogShown: function () {
if (typeof (onDialogShown) == "function") {
onDialogShown();
}
}
});

View File

@ -1,111 +0,0 @@
var BootstrapDialog = new Class({
Implements: Options,
options: {
cancelButton: false,
closeButton: false,
acceptButton: true,
removeButton:false,
errorMessage: false,
onEventData:{}
},
initialize: function (title, options) {
this.setOptions(options);
this.options.onEventData.dialog = this;
this._native = $('<div class="modal fade" tabindex="-1"></div>').append('<div class="modal-dialog"></div>');
var content = $('<div class="modal-content"></div>');
var header = this._buildHeader(title);
if (header) {
content.append(header);
}
var body = $('<div class="modal-body"></div>');
if(this.options.errorMessage){
var error = $('<div class="alert alert-danger"></div>');
error.hide();
body.append(error);
}
content.append(body);
var footer = this._buildFooter();
if (footer) {
content.append(footer);
}
this._native.find(".modal-dialog").append(content);
this._native.on('hidden.bs.modal', function() {
$(this).remove();
});
this._native.on('shown.bs.modal', this.onDialogShown);
},
_buildFooter: function() {
var footer = null;
if (this.options.acceptButton || this.options.removeButton || this.options.cancelButton) {
footer = $('<div class="modal-footer" style="paddingTop:5;textAlign:center">');
}
if (this.options.acceptButton) {
this.acceptButton = $('<button type="button" class="btn btn-primary" id="acceptBtn" data-dismiss="modal">'+ $msg('ACCEPT') + '</button>');
footer.append(this.acceptButton);
this.acceptButton.unbind('click').on("click",this.options.onEventData, this.onAcceptClick)
}
if (this.options.removeButton) {
this.removeButton = $('<button type="button" class="btn btn-secondary" id="removeBtn" data-dismiss="modal">'+ $msg('REMOVE') +'</button>');
footer.append(this.removeButton);
this.removeButton.on('click', this.options.onEventData, this.onRemoveClick);
}
if (this.options.cancelButton) {
footer.append('<button type="button" class="btn btn-secondary" data-dismiss="modal">'+ $msg('CANCEL') +'</button>');
}
return footer;
},
_buildHeader: function(title) {
var header = null;
if (this.options.closeButton || title) {
header = $('<div class="modal-header"></div>');
}
if (this.options.closeButton) {
header.append(
'<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>'
);
}
if (title) {
header.append('<h2 class="modal-title">' + title + '</h2>');
}
return header;
},
onAcceptClick: function(event) {
throw "Unsupported operation";
},
onDialogShown: function() {},
onRemoveClick: function(event) {
throw "Unsupported operation";
},
show: function () {
this._native.modal();
},
setContent: function(content) {
var modalBody = this._native.find('.modal-body');
modalBody.append(content);
},
css: function(options){
this._native.find('.modal-dialog').css(options);
},
close: function() {
this._native.modal('hide');
},
alertError: function(message){
this._native.find('.alert-danger').text(message);
this._native.find('.alert-danger').show();
},
cleanError: function(){
this._native.find('.alert-danger').hide();
}
});

View File

@ -1,14 +1,12 @@
const TestClass = new Class({ class TestClass extends Events{
Extends: mindplot.Events,
getEvents() { getEvents() {
return this.$events; return this.$events;
}, }
removeEvents() { removeEvents() {
this.$events = {}; this.$events = {};
}, }
}); }
// Test class and variables // Test class and variables
const expectedChangeFn1 = function () { return 'change1'; }; const expectedChangeFn1 = function () { return 'change1'; };

View File

@ -1,6 +1,6 @@
TestSuite = new Class({ class TestSuite {
}); }
TestSuite.NODE_SIZE = { width: 80, height: 30 }; TestSuite.NODE_SIZE = { width: 80, height: 30 };
TestSuite.ROOT_NODE_SIZE = { width: 120, height: 40 }; TestSuite.ROOT_NODE_SIZE = { width: 120, height: 40 };

View File

@ -43,14 +43,7 @@ module.exports = {
resolve: { resolve: {
alias: { alias: {
'@libraries': path.resolve(__dirname, '../../libraries/'), '@libraries': path.resolve(__dirname, '../../libraries/'),
'@commands': path.resolve(__dirname, './src/components/commands/'),
'@layout': path.resolve(__dirname, './src/components/layout/'),
'@libs': path.resolve(__dirname, './src/components/libraries/'),
'@model': path.resolve(__dirname, './src/components/model'),
'@persistence': path.resolve(__dirname, './src/components/persistence/'),
'@util': path.resolve(__dirname, './src/components/util/'),
'@widget': path.resolve(__dirname, './src/components/widget/'),
'@components': path.resolve(__dirname, './src/components/'),
}, },
extensions: ['.js', '.json'], extensions: ['.js', '.json'],
}, },

View File

@ -3,10 +3,7 @@
"baseUrl": ".", "baseUrl": ".",
"module": "commonjs", "module": "commonjs",
"paths": { "paths": {
"@libraries/*": ["../../libraries/*"], "@libraries/*": ["../../libraries/*"]
"@svg/*": ["./src/components/peer/svg/*"],
"@utils/*": ["./src/components/peer/utils/*"],
"@components/*": ["./src/components/*"]
} }
}, },
"exclude": ["node_modules"] "exclude": ["node_modules"]

View File

@ -19,15 +19,16 @@
import { $defined } from '@wisemapping/core-js'; import { $defined } from '@wisemapping/core-js';
class ElementClass { class ElementClass {
constructor(peer, attributes, htmlContainer) { constructor(peer, attributes, delayInit) {
this._htmlContainer = htmlContainer;
this.peer = peer; this.peer = peer;
if (peer == null) { if (peer == null) {
throw new Error('Element peer can not be null'); throw new Error('Element peer can not be null');
} }
if ($defined(attributes)) { if (!delayInit) {
this._initialize(attributes); if ($defined(attributes)) {
this._initialize(attributes);
}
} }
} }

View File

@ -16,14 +16,13 @@
* limitations under the License. * limitations under the License.
*/ */
import $ from '@libraries/jquery-2.1.0'; import $ from '@libraries/jquery-2.1.0';
import { $defined, $assert } from '@wisemapping/core-js'; import { $defined } from '@wisemapping/core-js';
import ElementClass from '@components/ElementClass'; import ElementClass from './ElementClass';
import Toolkit from './Toolkit'; import Toolkit from './Toolkit';
class Workspace extends ElementClass { class Workspace extends ElementClass {
constructor(attributes) { constructor(attributes) {
const htmlContainer = Workspace._createDivContainer(); const htmlContainer = Workspace._createDivContainer();
const peer = Toolkit.createWorkspace(htmlContainer); const peer = Toolkit.createWorkspace(htmlContainer);
const defaultAttributes = { const defaultAttributes = {
width: '200px', width: '200px',
@ -38,7 +37,9 @@ class Workspace extends ElementClass {
defaultAttributes[key] = attributes[key]; defaultAttributes[key] = attributes[key];
} }
} }
super(peer, defaultAttributes, htmlContainer); super(peer, defaultAttributes, true);
this._htmlContainer = htmlContainer;
this._initialize(defaultAttributes);
htmlContainer.append(this.peer._native); htmlContainer.append(this.peer._native);
} }
@ -78,8 +79,8 @@ class Workspace extends ElementClass {
*/ */
static _createDivContainer() { static _createDivContainer() {
const container = window.document.createElement('div'); const container = window.document.createElement('div');
container.id = 'workspaceContainer'; // container.id = 'workspaceContainer';
// container.style.overflow = "hidden"; // container.style.overflow = 'hidden';
container.style.position = 'relative'; container.style.position = 'relative';
container.style.top = '0px'; container.style.top = '0px';
container.style.left = '0px'; container.style.left = '0px';

View File

@ -17,20 +17,20 @@
*/ */
import Font from './Font'; import Font from './Font';
const ArialFont = new Class({ class ArialFont extends Font {
Extends: Font, constructor() {
initialize() { super();
this.parent(); this._fontFamily = 'arial';
this._fontFamily = 'Arial'; }
},
getFontFamily() { getFontFamily() {
return this._fontFamily; return this._fontFamily;
}, }
// eslint-disable-next-line class-methods-use-this
getFont() { getFont() {
return Font.ARIAL; return Font.ARIAL;
}, }
}); }
export default ArialFont; export default ArialFont;

View File

@ -20,34 +20,33 @@ import { $defined } from '@wisemapping/core-js';
import ElementPeer from './ElementPeer'; import ElementPeer from './ElementPeer';
import Point from '../../Point'; import Point from '../../Point';
const ArrowPeer = new Class({ class ArrowPeer extends ElementPeer {
Extends: ElementPeer, constructor() {
initialize() { const svgElement = window.document.createElementNS(ElementPeer.svgNamespace, 'path');
const svgElement = window.document.createElementNS(this.svgNamespace, 'path'); super(svgElement);
this.parent(svgElement);
this._style = {}; this._style = {};
this._controlPoint = new Point(); this._controlPoint = new Point();
this._fromPoint = new Point(); this._fromPoint = new Point();
}, }
setFrom(x, y) { setFrom(x, y) {
this._fromPoint.x = x; this._fromPoint.x = x;
this._fromPoint.y = y; this._fromPoint.y = y;
this._redraw(); this._redraw();
}, }
setControlPoint(point) { setControlPoint(point) {
this._controlPoint = point; this._controlPoint = point;
this._redraw(); this._redraw();
}, }
setStrokeColor(color) { setStrokeColor(color) {
this.setStroke(null, null, color, null); this.setStroke(null, null, color, null);
}, }
setStrokeWidth(width) { setStrokeWidth(width) {
this.setStroke(width); this.setStroke(width);
}, }
setDashed(isDashed, length, spacing) { setDashed(isDashed, length, spacing) {
if ( if (
@ -56,11 +55,11 @@ const ArrowPeer = new Class({
&& $defined(length) && $defined(length)
&& $defined(spacing) && $defined(spacing)
) { ) {
this._native.setAttribute('stroke-dasharray', `${length},${spacing}`); this._native.setAttribute('stroke-dasharray', `${length}${spacing}`);
} else { } else {
this._native.setAttribute('stroke-dasharray', ''); this._native.setAttribute('stroke-dasharray', '');
} }
}, }
_updateStyle() { _updateStyle() {
let style = ''; let style = '';
@ -70,7 +69,7 @@ const ArrowPeer = new Class({
} }
} }
this._native.setAttribute('style', style); this._native.setAttribute('style', style);
}, }
_redraw() { _redraw() {
let x; let x;
@ -110,7 +109,7 @@ const ArrowPeer = new Class({
+ `L${xp + this._fromPoint.x},${yp + this._fromPoint.y}`; + `L${xp + this._fromPoint.x},${yp + this._fromPoint.y}`;
this._native.setAttribute('d', path); this._native.setAttribute('d', path);
} }
}, }
}); }
export default ArrowPeer; export default ArrowPeer;

View File

@ -19,11 +19,10 @@ import { $defined } from '@wisemapping/core-js';
import ElementPeer from './ElementPeer'; import ElementPeer from './ElementPeer';
import Point from '../../Point'; import Point from '../../Point';
const CurvedLinePeer = new Class({ class CurvedLinePeer extends ElementPeer {
Extends: ElementPeer, constructor() {
initialize() { const svgElement = window.document.createElementNS(ElementPeer.svgNamespace, 'path');
const svgElement = window.document.createElementNS(this.svgNamespace, 'path'); super(svgElement);
this.parent(svgElement);
this._style = { fill: '#495879' }; this._style = { fill: '#495879' };
this._updateStyle(); this._updateStyle();
this._customControlPoint_1 = false; this._customControlPoint_1 = false;
@ -31,7 +30,7 @@ const CurvedLinePeer = new Class({
this._control1 = new Point(); this._control1 = new Point();
this._control2 = new Point(); this._control2 = new Point();
this._lineStyle = true; this._lineStyle = true;
}, }
setSrcControlPoint(control) { setSrcControlPoint(control) {
this._customControlPoint_1 = true; this._customControlPoint_1 = true;
@ -42,7 +41,7 @@ const CurvedLinePeer = new Class({
this._control1.y = parseInt(this._control1.y, 10); this._control1.y = parseInt(this._control1.y, 10);
} }
if (change) this._updatePath(); if (change) this._updatePath();
}, }
setDestControlPoint(control) { setDestControlPoint(control) {
this._customControlPoint_2 = true; this._customControlPoint_2 = true;
@ -53,64 +52,64 @@ const CurvedLinePeer = new Class({
this._control2.y = parseInt(this._control2.y, 10); this._control2.y = parseInt(this._control2.y, 10);
} }
if (change) this._updatePath(); if (change) this._updatePath();
}, }
isSrcControlPointCustom() { isSrcControlPointCustom() {
return this._customControlPoint_1; return this._customControlPoint_1;
}, }
isDestControlPointCustom() { isDestControlPointCustom() {
return this._customControlPoint_2; return this._customControlPoint_2;
}, }
setIsSrcControlPointCustom(isCustom) { setIsSrcControlPointCustom(isCustom) {
this._customControlPoint_1 = isCustom; this._customControlPoint_1 = isCustom;
}, }
setIsDestControlPointCustom(isCustom) { setIsDestControlPointCustom(isCustom) {
this._customControlPoint_2 = isCustom; this._customControlPoint_2 = isCustom;
}, }
getControlPoints() { getControlPoints() {
return [this._control1, this._control2]; return [this._control1, this._control2];
}, }
setFrom(x1, y1) { setFrom(x1, y1) {
const change = this._x1 !== parseInt(x1, 10) || this._y1 !== parseInt(y1, 10); const change = this._x1 !== parseInt(x1, 10) || this._y1 !== parseInt(y1, 10);
this._x1 = parseInt(x1, 10); this._x1 = parseInt(x1, 10);
this._y1 = parseInt(y1, 10); this._y1 = parseInt(y1, 10);
if (change) this._updatePath(); if (change) this._updatePath();
}, }
setTo(x2, y2) { setTo(x2, y2) {
const change = this._x2 !== parseInt(x2, 10) || this._y2 !== parseInt(y2, 10); const change = this._x2 !== parseInt(x2, 10) || this._y2 !== parseInt(y2, 10);
this._x2 = parseInt(x2, 10); this._x2 = parseInt(x2, 10);
this._y2 = parseInt(y2, 10); this._y2 = parseInt(y2, 10);
if (change) this._updatePath(); if (change) this._updatePath();
}, }
getFrom() { getFrom() {
return new Point(this._x1, this._y1); return new Point(this._x1, this._y1);
}, }
getTo() { getTo() {
return new Point(this._x2, this._y2); return new Point(this._x2, this._y2);
}, }
setStrokeWidth(width) { setStrokeWidth(width) {
this._style['stroke-width'] = width; this._style['stroke-width'] = width;
this._updateStyle(); this._updateStyle();
}, }
setColor(color) { setColor(color) {
this._style.stroke = color; this._style.stroke = color;
this._style.fill = color; this._style.fill = color;
this._updateStyle(); this._updateStyle();
}, }
updateLine(avoidControlPointFix) { updateLine(avoidControlPointFix) {
this._updatePath(avoidControlPointFix); this._updatePath(avoidControlPointFix);
}, }
setLineStyle(style) { setLineStyle(style) {
this._lineStyle = style; this._lineStyle = style;
@ -122,29 +121,29 @@ const CurvedLinePeer = new Class({
} }
this._updateStyle(); this._updateStyle();
this.updateLine(); this.updateLine();
}, }
getLineStyle() { getLineStyle() {
return this._lineStyle; return this._lineStyle;
}, }
setShowEndArrow(visible) { setShowEndArrow(visible) {
this._showEndArrow = visible; this._showEndArrow = visible;
this.updateLine(); this.updateLine();
}, }
isShowEndArrow() { isShowEndArrow() {
return this._showEndArrow; return this._showEndArrow;
}, }
setShowStartArrow(visible) { setShowStartArrow(visible) {
this._showStartArrow = visible; this._showStartArrow = visible;
this.updateLine(); this.updateLine();
}, }
isShowStartArrow() { isShowStartArrow() {
return this._showStartArrow; return this._showStartArrow;
}, }
_updatePath(avoidControlPointFix) { _updatePath(avoidControlPointFix) {
if ( if (
@ -163,7 +162,7 @@ const CurvedLinePeer = new Class({
}`; }`;
this._native.setAttribute('d', path); this._native.setAttribute('d', path);
} }
}, }
_updateStyle() { _updateStyle() {
let style = ''; let style = '';
@ -173,10 +172,10 @@ const CurvedLinePeer = new Class({
} }
} }
this._native.setAttribute('style', style); this._native.setAttribute('style', style);
}, }
// TODO: deduplicate this method, extracted from mindplot/src/components/util/Shape.js to avoid circular ref // TODO: deduplicate this method, extracted from mindplot/src/components/util/Shape.js to avoid circular ref
_calculateDefaultControlPoints(srcPos, tarPos) { static _calculateDefaultControlPoints(srcPos, tarPos) {
const y = srcPos.y - tarPos.y; const y = srcPos.y - tarPos.y;
const x = srcPos.x - tarPos.x; const x = srcPos.x - tarPos.x;
const div = Math.abs(x) > 0.1 ? x : 0.1; // Prevent division by 0. const div = Math.abs(x) > 0.1 ? x : 0.1; // Prevent division by 0.
@ -197,11 +196,11 @@ const CurvedLinePeer = new Class({
new Point(-srcPos.x + x1, -srcPos.y + y1), new Point(-srcPos.x + x1, -srcPos.y + y1),
new Point(-tarPos.x + x2, -tarPos.y + y2), new Point(-tarPos.x + x2, -tarPos.y + y2),
]; ];
}, }
_calculateAutoControlPoints(avoidControlPointFix) { _calculateAutoControlPoints(avoidControlPointFix) {
// Both points available, calculate real points // Both points available, calculate real points
const defaultpoints = this._calculateDefaultControlPoints( const defaultpoints = CurvedLinePeer._calculateDefaultControlPoints(
new Point(this._x1, this._y1), new Point(this._x1, this._y1),
new Point(this._x2, this._y2), new Point(this._x2, this._y2),
); );
@ -219,7 +218,7 @@ const CurvedLinePeer = new Class({
this._control2.x = defaultpoints[1].x; this._control2.x = defaultpoints[1].x;
this._control2.y = defaultpoints[1].y; this._control2.y = defaultpoints[1].y;
} }
}, }
setDashed(length, spacing) { setDashed(length, spacing) {
if ($defined(length) && $defined(spacing)) { if ($defined(length) && $defined(spacing)) {
@ -227,7 +226,7 @@ const CurvedLinePeer = new Class({
} else { } else {
this._native.setAttribute('stroke-dasharray', ''); this._native.setAttribute('stroke-dasharray', '');
} }
}, }
}); }
export default CurvedLinePeer; export default CurvedLinePeer;

View File

@ -20,8 +20,8 @@ import { $assert, $defined } from '@wisemapping/core-js';
import EventUtils from '../utils/EventUtils'; import EventUtils from '../utils/EventUtils';
import TransformUtil from '../utils/TransformUtils'; import TransformUtil from '../utils/TransformUtils';
const ElementPeer = new Class({ class ElementPeer {
initialize(svgElement) { constructor(svgElement) {
this._native = svgElement; this._native = svgElement;
if (!this._native.addEvent) { if (!this._native.addEvent) {
// Hack bug: https://bugzilla.mozilla.org/show_bug.cgi?id=740811 // Hack bug: https://bugzilla.mozilla.org/show_bug.cgi?id=740811
@ -35,11 +35,11 @@ const ElementPeer = new Class({
this._size = { width: 1, height: 1 }; this._size = { width: 1, height: 1 };
this._changeListeners = {}; this._changeListeners = {};
// http://support.adobe.com/devsup/devsup.nsf/docs/50493.htm // http://support.adobe.com/devsup/devsup.nsf/docs/50493.htm
}, }
setChildren(children) { setChildren(children) {
this._children = children; this._children = children;
}, }
getChildren() { getChildren() {
let result = this._children; let result = this._children;
@ -48,28 +48,28 @@ const ElementPeer = new Class({
this._children = result; this._children = result;
} }
return result; return result;
}, }
getParent() { getParent() {
return this._parent; return this._parent;
}, }
setParent(parent) { setParent(parent) {
this._parent = parent; this._parent = parent;
}, }
append(elementPeer) { append(elementPeer) {
// Store parent and child relationship. // Store parent and child relationship.
elementPeer.setParent(this); elementPeer.setParent(this);
const children = this.getChildren(); const children = this.getChildren();
children.include(elementPeer); children.push(elementPeer);
// Append element as a child. // Append element as a child.
this._native.appendChild(elementPeer._native); this._native.appendChild(elementPeer._native);
// Broadcast events ... // Broadcast events ...
EventUtils.broadcastChangeEvent(this, 'strokeStyle'); EventUtils.broadcastChangeEvent(this, 'strokeStyle');
}, }
removeChild(elementPeer) { removeChild(elementPeer) {
// Store parent and child relationship. // Store parent and child relationship.
@ -87,7 +87,7 @@ const ElementPeer = new Class({
// Append element as a child. // Append element as a child.
this._native.removeChild(elementPeer._native); this._native.removeChild(elementPeer._native);
}, }
/** /**
* http://www.w3.org/TR/DOM-Level-3-Events/events.html * http://www.w3.org/TR/DOM-Level-3-Events/events.html
@ -95,19 +95,19 @@ const ElementPeer = new Class({
*/ */
addEvent(type, listener) { addEvent(type, listener) {
$(this._native).bind(type, listener); $(this._native).bind(type, listener);
}, }
trigger(type, event) { trigger(type, event) {
$(this._native).trigger(type, event); $(this._native).trigger(type, event);
}, }
cloneEvents(from) { cloneEvents(from) {
this._native.cloneEvents(from); this._native.cloneEvents(from);
}, }
removeEvent(type, listener) { removeEvent(type, listener) {
$(this._native).unbind(type, listener); $(this._native).unbind(type, listener);
}, }
setSize(width, height) { setSize(width, height) {
if ($defined(width) && this._size.width !== parseInt(width, 10)) { if ($defined(width) && this._size.width !== parseInt(width, 10)) {
@ -121,11 +121,11 @@ const ElementPeer = new Class({
} }
EventUtils.broadcastChangeEvent(this, 'strokeStyle'); EventUtils.broadcastChangeEvent(this, 'strokeStyle');
}, }
getSize() { getSize() {
return { width: this._size.width, height: this._size.height }; return { width: this._size.width, height: this._size.height };
}, }
setFill(color, opacity) { setFill(color, opacity) {
if ($defined(color)) { if ($defined(color)) {
@ -134,13 +134,13 @@ const ElementPeer = new Class({
if ($defined(opacity)) { if ($defined(opacity)) {
this._native.setAttribute('fill-opacity', opacity); this._native.setAttribute('fill-opacity', opacity);
} }
}, }
getFill() { getFill() {
const color = this._native.getAttribute('fill'); const color = this._native.getAttribute('fill');
const opacity = this._native.getAttribute('fill-opacity'); const opacity = this._native.getAttribute('fill-opacity');
return { color, opacity: Number(opacity) }; return { color, opacity: Number(opacity) };
}, }
getStroke() { getStroke() {
const vmlStroke = this._native; const vmlStroke = this._native;
@ -154,7 +154,7 @@ const ElementPeer = new Class({
opacity, opacity,
width, width,
}; };
}, }
setStroke(width, style, color, opacity) { setStroke(width, style, color, opacity) {
if ($defined(width)) { if ($defined(width)) {
@ -165,7 +165,7 @@ const ElementPeer = new Class({
} }
if ($defined(style)) { if ($defined(style)) {
// Scale the dash array in order to be equal to VML. In VML, stroke style doesn't scale. // Scale the dash array in order to be equal to VML. In VML, stroke style doesn't scale.
const dashArrayPoints = this.__stokeStyleToStrokDasharray[style]; const dashArrayPoints = ElementPeer.stokeStyleToStrokDasharray()[style];
const scale = 1 / TransformUtil.workoutScale(this).width; const scale = 1 / TransformUtil.workoutScale(this).width;
let strokeWidth = this._native.getAttribute('stroke-width'); let strokeWidth = this._native.getAttribute('stroke-width');
@ -187,19 +187,19 @@ const ElementPeer = new Class({
if ($defined(opacity)) { if ($defined(opacity)) {
this._native.setAttribute('stroke-opacity', opacity); this._native.setAttribute('stroke-opacity', opacity);
} }
}, }
/* /*
* style='visibility: visible' * style='visibility: visible'
*/ */
setVisibility(isVisible) { setVisibility(isVisible) {
this._native.setAttribute('visibility', isVisible ? 'visible' : 'hidden'); this._native.setAttribute('visibility', isVisible ? 'visible' : 'hidden');
}, }
isVisible() { isVisible() {
const visibility = this._native.getAttribute('visibility'); const visibility = this._native.getAttribute('visibility');
return !(visibility === 'hidden'); return !(visibility === 'hidden');
}, }
updateStrokeStyle() { updateStrokeStyle() {
const strokeStyle = this._stokeStyle; const strokeStyle = this._stokeStyle;
@ -208,7 +208,7 @@ const ElementPeer = new Class({
this.setStroke(null, strokeStyle); this.setStroke(null, strokeStyle);
} }
} }
}, }
attachChangeEventListener(type, listener) { attachChangeEventListener(type, listener) {
const listeners = this.getChangeEventListeners(type); const listeners = this.getChangeEventListeners(type);
@ -216,7 +216,7 @@ const ElementPeer = new Class({
throw new Error('Listener can not be null'); throw new Error('Listener can not be null');
} }
listeners.push(listener); listeners.push(listener);
}, }
getChangeEventListeners(type) { getChangeEventListeners(type) {
let listeners = this._changeListeners[type]; let listeners = this._changeListeners[type];
@ -225,35 +225,38 @@ const ElementPeer = new Class({
this._changeListeners[type] = listeners; this._changeListeners[type] = listeners;
} }
return listeners; return listeners;
}, }
/** /**
* Move element to the front * Move element to the front
*/ */
moveToFront() { moveToFront() {
this._native.parentNode.appendChild(this._native); this._native.parentNode.appendChild(this._native);
}, }
/** /**
* Move element to the back * Move element to the back
*/ */
moveToBack() { moveToBack() {
this._native.parentNode.insertBefore(this._native, this._native.parentNode.firstChild); this._native.parentNode.insertBefore(this._native, this._native.parentNode.firstChild);
}, }
setCursor(type) { setCursor(type) {
this._native.style.cursor = type; this._native.style.cursor = type;
}, }
});
ElementPeer.prototype.svgNamespace = 'http://www.w3.org/2000/svg'; static stokeStyleToStrokDasharray() {
ElementPeer.prototype.linkNamespace = 'http://www.w3.org/1999/xlink'; return {
ElementPeer.prototype.__stokeStyleToStrokDasharray = { solid: [],
solid: [], dot: [1, 3],
dot: [1, 3], dash: [4, 3],
dash: [4, 3], longdash: [10, 2],
longdash: [10, 2], dashdot: [5, 3, 1, 3],
dashdot: [5, 3, 1, 3], };
}; }
}
ElementPeer.svgNamespace = 'http://www.w3.org/2000/svg';
ElementPeer.linkNamespace = 'http://www.w3.org/1999/xlink';
export default ElementPeer; export default ElementPeer;

View File

@ -18,17 +18,16 @@
import { $defined } from '@wisemapping/core-js'; import { $defined } from '@wisemapping/core-js';
import ElementPeer from './ElementPeer'; import ElementPeer from './ElementPeer';
const ElipsePeer = new Class({ class ElipsePeer extends ElementPeer {
Extends: ElementPeer, constructor() {
initialize() { const svgElement = window.document.createElementNS(ElementPeer.svgNamespace, 'ellipse');
const svgElement = window.document.createElementNS(this.svgNamespace, 'ellipse'); super(svgElement);
this.parent(svgElement);
this.attachChangeEventListener('strokeStyle', ElementPeer.prototype.updateStrokeStyle); this.attachChangeEventListener('strokeStyle', ElementPeer.prototype.updateStrokeStyle);
this._position = { x: 0, y: 0 }; this._position = { x: 0, y: 0 };
}, }
setSize(width, height) { setSize(width, height) {
this.parent(width, height); super.setSize(width, height);
if ($defined(width)) { if ($defined(width)) {
this._native.setAttribute('rx', width / 2); this._native.setAttribute('rx', width / 2);
} }
@ -39,7 +38,7 @@ const ElipsePeer = new Class({
const pos = this.getPosition(); const pos = this.getPosition();
this.setPosition(pos.x, pos.y); this.setPosition(pos.x, pos.y);
}, }
setPosition(pcx, pcy) { setPosition(pcx, pcy) {
const size = this.getSize(); const size = this.getSize();
@ -54,11 +53,11 @@ const ElipsePeer = new Class({
if ($defined(cy)) { if ($defined(cy)) {
this._native.setAttribute('cy', cy); this._native.setAttribute('cy', cy);
} }
}, }
getPosition() { getPosition() {
return this._position; return this._position;
}, }
}); }
export default ElipsePeer; export default ElipsePeer;

View File

@ -17,12 +17,12 @@
*/ */
import { $defined } from '@wisemapping/core-js'; import { $defined } from '@wisemapping/core-js';
const Font = new Class({ class Font {
initialize() { constructor() {
this._size = 10; this._size = 10;
this._style = 'normal'; this._style = 'normal';
this._weight = 'normal'; this._weight = 'normal';
}, }
init(args) { init(args) {
if ($defined(args.size)) { if ($defined(args.size)) {
@ -34,7 +34,7 @@ const Font = new Class({
if ($defined(args.weight)) { if ($defined(args.weight)) {
this._weight = args.weight; this._weight = args.weight;
} }
}, }
getHtmlSize(scale) { getHtmlSize(scale) {
let result = 0; let result = 0;
@ -50,35 +50,35 @@ const Font = new Class({
} }
return result; return result;
}, }
getGraphSize() { getGraphSize() {
return (this._size * 43) / 32; return (this._size * 43) / 32;
}, }
getSize() { getSize() {
return parseInt(this._size, 10); return parseInt(this._size, 10);
}, }
getStyle() { getStyle() {
return this._style; return this._style;
}, }
getWeight() { getWeight() {
return this._weight; return this._weight;
}, }
setSize(size) { setSize(size) {
this._size = size; this._size = size;
}, }
setStyle(style) { setStyle(style) {
this._style = style; this._style = style;
}, }
setWeight(weight) { setWeight(weight) {
this._weight = weight; this._weight = weight;
}, }
getWidthMargin() { getWidthMargin() {
let result = 0; let result = 0;
@ -86,7 +86,7 @@ const Font = new Class({
result = 4; result = 4;
} }
return result; return result;
}, }
}); }
export default Font; export default Font;

View File

@ -19,17 +19,16 @@ import { $defined } from '@wisemapping/core-js';
import ElementPeer from './ElementPeer'; import ElementPeer from './ElementPeer';
import EventUtils from '../utils/EventUtils'; import EventUtils from '../utils/EventUtils';
const GroupPeer = new Class({ class GroupPeer extends ElementPeer {
Extends: ElementPeer, constructor() {
initialize() { const svgElement = window.document.createElementNS(ElementPeer.svgNamespace, 'g');
const svgElement = window.document.createElementNS(this.svgNamespace, 'g'); super(svgElement);
this.parent(svgElement);
this._native.setAttribute('preserveAspectRatio', 'none'); this._native.setAttribute('preserveAspectRatio', 'none');
this._coordSize = { width: 1, height: 1 }; this._coordSize = { width: 1, height: 1 };
this._native.setAttribute('focusable', 'true'); this._native.setAttribute('focusable', 'true');
this._position = { x: 0, y: 0 }; this._position = { x: 0, y: 0 };
this._coordOrigin = { x: 0, y: 0 }; this._coordOrigin = { x: 0, y: 0 };
}, }
setCoordSize(width, height) { setCoordSize(width, height) {
const change = this._coordSize.width !== width || this._coordSize.height !== height; const change = this._coordSize.width !== width || this._coordSize.height !== height;
@ -40,11 +39,11 @@ const GroupPeer = new Class({
this.updateTransform(); this.updateTransform();
} }
EventUtils.broadcastChangeEvent(this, 'strokeStyle'); EventUtils.broadcastChangeEvent(this, 'strokeStyle');
}, }
getCoordSize() { getCoordSize() {
return { width: this._coordSize.width, height: this._coordSize.height }; return { width: this._coordSize.width, height: this._coordSize.height };
}, }
/** /**
* http://www.w3.org/TR/SVG/coords.html#TransformAttribute * http://www.w3.org/TR/SVG/coords.html#TransformAttribute
@ -93,11 +92,11 @@ const GroupPeer = new Class({
sy = Number.isNaN(sy) ? 0 : sy; sy = Number.isNaN(sy) ? 0 : sy;
this._native.setAttribute('transform', `translate(${cx},${cy}) scale(${sx},${sy})`); this._native.setAttribute('transform', `translate(${cx},${cy}) scale(${sx},${sy})`);
}, }
setOpacity(value) { setOpacity(value) {
this._native.setAttribute('opacity', value); this._native.setAttribute('opacity', value);
}, }
setCoordOrigin(x, y) { setCoordOrigin(x, y) {
const change = x !== this._coordOrigin.x || y !== this._coordOrigin.y; const change = x !== this._coordOrigin.x || y !== this._coordOrigin.y;
@ -111,15 +110,15 @@ const GroupPeer = new Class({
if (change) { if (change) {
this.updateTransform(); this.updateTransform();
} }
}, }
setSize(width, height) { setSize(width, height) {
const change = width !== this._size.width || height !== this._size.height; const change = width !== this._size.width || height !== this._size.height;
this.parent(width, height); super.setSize(width, height);
if (change) { if (change) {
this.updateTransform(); this.updateTransform();
} }
}, }
setPosition(x, y) { setPosition(x, y) {
const change = x !== this._position.x || y !== this._position.y; const change = x !== this._position.x || y !== this._position.y;
@ -133,20 +132,20 @@ const GroupPeer = new Class({
if (change) { if (change) {
this.updateTransform(); this.updateTransform();
} }
}, }
getPosition() { getPosition() {
return { x: this._position.x, y: this._position.y }; return { x: this._position.x, y: this._position.y };
}, }
append(child) { append(child) {
this.parent(child); super.append(child);
EventUtils.broadcastChangeEvent(child, 'onChangeCoordSize'); EventUtils.broadcastChangeEvent(child, 'onChangeCoordSize');
}, }
getCoordOrigin() { getCoordOrigin() {
return { x: this._coordOrigin.x, y: this._coordOrigin.y }; return { x: this._coordOrigin.x, y: this._coordOrigin.y };
}, }
}); }
export default GroupPeer; export default GroupPeer;

View File

@ -17,34 +17,33 @@
*/ */
import ElementPeer from './ElementPeer'; import ElementPeer from './ElementPeer';
const ImagePeer = new Class({ class ImagePeer extends ElementPeer {
Extends: ElementPeer, constructor() {
initialize() { const svgElement = window.document.createElementNS(ElementPeer.svgNamespace, 'image');
const svgElement = window.document.createElementNS(this.svgNamespace, 'image'); super(svgElement);
this.parent(svgElement);
this._position = { x: 0, y: 0 }; this._position = { x: 0, y: 0 };
this._href = ''; this._href = '';
this._native.setAttribute('preserveAspectRatio', 'none'); this._native.setAttribute('preserveAspectRatio', 'none');
}, }
setPosition(x, y) { setPosition(x, y) {
this._position = { x, y }; this._position = { x, y };
this._native.setAttribute('y', y); this._native.setAttribute('y', y);
this._native.setAttribute('x', x); this._native.setAttribute('x', x);
}, }
getPosition() { getPosition() {
return this._position; return this._position;
}, }
setHref(url) { setHref(url) {
this._native.setAttributeNS(this.linkNamespace, 'href', url); this._native.setAttributeNS(ElementPeer.linkNamespace, 'href', url);
this._href = url; this._href = url;
}, }
getHref() { getHref() {
return this._href; return this._href;
}, }
}); }
export default ImagePeer; export default ImagePeer;

View File

@ -19,39 +19,39 @@ import { $defined } from '@wisemapping/core-js';
import ElementPeer from './ElementPeer'; import ElementPeer from './ElementPeer';
import Point from '../../Point'; import Point from '../../Point';
const LinePeer = new Class({ class LinePeer extends ElementPeer {
Extends: ElementPeer, constructor() {
initialize() { const svgElement = window.document.createElementNS(ElementPeer.svgNamespace, 'line');
const svgElement = window.document.createElementNS(this.svgNamespace, 'line'); super(svgElement);
this.parent(svgElement);
this.attachChangeEventListener('strokeStyle', ElementPeer.prototype.updateStrokeStyle); this.attachChangeEventListener('strokeStyle', ElementPeer.prototype.updateStrokeStyle);
}, }
setFrom(x1, y1) { setFrom(x1, y1) {
this._x1 = x1; this._x1 = x1;
this._y1 = y1; this._y1 = y1;
this._native.setAttribute('x1', x1); this._native.setAttribute('x1', x1);
this._native.setAttribute('y1', y1); this._native.setAttribute('y1', y1);
}, }
setTo(x2, y2) { setTo(x2, y2) {
this._x2 = x2; this._x2 = x2;
this._y2 = y2; this._y2 = y2;
this._native.setAttribute('x2', x2); this._native.setAttribute('x2', x2);
this._native.setAttribute('y2', y2); this._native.setAttribute('y2', y2);
}, }
getFrom() { getFrom() {
return new Point(this._x1, this._y1); return new Point(this._x1, this._y1);
}, }
getTo() { getTo() {
return new Point(this._x2, this._y2); return new Point(this._x2, this._y2);
}, }
/* /*
* http://www.zvon.org/HowTo/Output/howto_jj_svg_27.html?at=marker-end * http://www.zvon.org/HowTo/Output/howto_jj_svg_27.html?at=marker-end
*/ */
// eslint-disable-next-line class-methods-use-this
setArrowStyle(startStyle, endStyle) { setArrowStyle(startStyle, endStyle) {
if ($defined(startStyle)) { if ($defined(startStyle)) {
// Todo: This must be implemented ... // Todo: This must be implemented ...
@ -60,7 +60,7 @@ const LinePeer = new Class({
if ($defined(endStyle)) { if ($defined(endStyle)) {
// Todo: This must be implemented ... // Todo: This must be implemented ...
} }
}, }
}); }
export default LinePeer; export default LinePeer;

View File

@ -19,43 +19,42 @@ import { $defined } from '@wisemapping/core-js';
import * as PolyLineUtils from '../utils/PolyLineUtils'; import * as PolyLineUtils from '../utils/PolyLineUtils';
import ElementPeer from './ElementPeer'; import ElementPeer from './ElementPeer';
const PolyLinePeer = new Class({ class PolyLinePeer extends ElementPeer {
Extends: ElementPeer, constructor() {
initialize() { const svgElement = window.document.createElementNS(ElementPeer.svgNamespace, 'polyline');
const svgElement = window.document.createElementNS(this.svgNamespace, 'polyline'); super(svgElement);
this.parent(svgElement);
this.setFill('none'); this.setFill('none');
this.breakDistance = 10; this.breakDistance = 10;
}, }
setFrom(x1, y1) { setFrom(x1, y1) {
this._x1 = x1; this._x1 = x1;
this._y1 = y1; this._y1 = y1;
this._updatePath(); this._updatePath();
}, }
setTo(x2, y2) { setTo(x2, y2) {
this._x2 = x2; this._x2 = x2;
this._y2 = y2; this._y2 = y2;
this._updatePath(); this._updatePath();
}, }
setStrokeWidth(width) { setStrokeWidth(width) {
this._native.setAttribute('stroke-width', width); this._native.setAttribute('stroke-width', width);
}, }
setColor(color) { setColor(color) {
this._native.setAttribute('stroke', color); this._native.setAttribute('stroke', color);
}, }
setStyle(style) { setStyle(style) {
this._style = style; this._style = style;
this._updatePath(); this._updatePath();
}, }
getStyle() { getStyle() {
return this._style; return this._style;
}, }
_updatePath() { _updatePath() {
if (this._style === 'Curved') { if (this._style === 'Curved') {
@ -65,7 +64,7 @@ const PolyLinePeer = new Class({
} else { } else {
this._updateCurvePath(); this._updateCurvePath();
} }
}, }
_updateStraightPath() { _updateStraightPath() {
if ( if (
@ -84,7 +83,7 @@ const PolyLinePeer = new Class({
); );
this._native.setAttribute('points', path); this._native.setAttribute('points', path);
} }
}, }
_updateMiddleCurvePath() { _updateMiddleCurvePath() {
const x1 = this._x1; const x1 = this._x1;
@ -112,7 +111,7 @@ const PolyLinePeer = new Class({
} ${middlex}, ${y2 - 10 * signy} ${middlex + 10 * signx}, ${y2} ${x2}, ${y2}`; } ${middlex}, ${y2 - 10 * signy} ${middlex + 10 * signx}, ${y2} ${x2}, ${y2}`;
this._native.setAttribute('points', path); this._native.setAttribute('points', path);
} }
}, }
_updateCurvePath() { _updateCurvePath() {
if ( if (
@ -131,7 +130,7 @@ const PolyLinePeer = new Class({
); );
this._native.setAttribute('points', path); this._native.setAttribute('points', path);
} }
}, }
}); }
export default PolyLinePeer; export default PolyLinePeer;

View File

@ -21,14 +21,13 @@ import ElementPeer from './ElementPeer';
/** /**
* http://www.w3.org/TR/SVG/shapes.html#RectElement * http://www.w3.org/TR/SVG/shapes.html#RectElement
*/ */
const RectPeer = new Class({ class RectPeer extends ElementPeer {
Extends: ElementPeer, constructor(arc) {
initialize(arc) { const svgElement = window.document.createElementNS(ElementPeer.svgNamespace, 'rect');
const svgElement = window.document.createElementNS(this.svgNamespace, 'rect'); super(svgElement);
this.parent(svgElement);
this._arc = arc; this._arc = arc;
this.attachChangeEventListener('strokeStyle', ElementPeer.prototype.updateStrokeStyle); this.attachChangeEventListener('strokeStyle', ElementPeer.prototype.updateStrokeStyle);
}, }
setPosition(x, y) { setPosition(x, y) {
if ($defined(x)) { if ($defined(x)) {
@ -37,17 +36,16 @@ const RectPeer = new Class({
if ($defined(y)) { if ($defined(y)) {
this._native.setAttribute('y', parseInt(y, 10)); this._native.setAttribute('y', parseInt(y, 10));
} }
}, }
getPosition() { getPosition() {
const x = this._native.getAttribute('x'); const x = this._native.getAttribute('x');
const y = this._native.getAttribute('y'); const y = this._native.getAttribute('y');
return { x: parseInt(x, 10), y: parseInt(y, 10) }; return { x: parseInt(x, 10), y: parseInt(y, 10) };
}, }
setSize(width, height) { setSize(width, height) {
this.parent(width, height); super.setSize(width, height);
const min = width < height ? width : height; const min = width < height ? width : height;
if ($defined(this._arc)) { if ($defined(this._arc)) {
// Transform percentages to SVG format. // Transform percentages to SVG format.
@ -55,7 +53,7 @@ const RectPeer = new Class({
this._native.setAttribute('rx', arc); this._native.setAttribute('rx', arc);
this._native.setAttribute('ry', arc); this._native.setAttribute('ry', arc);
} }
}, }
}); }
export default RectPeer; export default RectPeer;

View File

@ -17,20 +17,20 @@
*/ */
import Font from './Font'; import Font from './Font';
const TahomaFont = new Class({ class TahomaFont extends Font {
Extends: Font, constructor() {
initialize() { super();
this.parent();
this._fontFamily = 'tahoma'; this._fontFamily = 'tahoma';
}, }
getFontFamily() { getFontFamily() {
return this._fontFamily; return this._fontFamily;
}, }
// eslint-disable-next-line class-methods-use-this
getFont() { getFont() {
return Font.TAHOMA; return Font.TAHOMA;
}, }
}); }
export default TahomaFont; export default TahomaFont;

View File

@ -19,27 +19,26 @@ import { $defined } from '@wisemapping/core-js';
import $ from '@libraries/jquery-2.1.0'; import $ from '@libraries/jquery-2.1.0';
import ElementPeer from './ElementPeer'; import ElementPeer from './ElementPeer';
const TextPeer = new Class({ class TextPeer extends ElementPeer {
Extends: ElementPeer, constructor(Font) {
initialize(Font) { const svgElement = window.document.createElementNS(ElementPeer.svgNamespace, 'text');
super(svgElement);
this.Font = Font; this.Font = Font;
const svgElement = window.document.createElementNS(this.svgNamespace, 'text');
this.parent(svgElement);
this._position = { x: 0, y: 0 }; this._position = { x: 0, y: 0 };
this._font = new Font('Arial', this); this._font = new Font('Arial', this);
}, }
append(element) { append(element) {
this._native.appendChild(element._native); this._native.appendChild(element._native);
}, }
setTextAlignment(align) { setTextAlignment(align) {
this._textAlign = align; this._textAlign = align;
}, }
getTextAlignment() { getTextAlignment() {
return $defined(this._textAlign) ? this._textAlign : 'left'; return $defined(this._textAlign) ? this._textAlign : 'left';
}, }
setText(text) { setText(text) {
// Remove all previous nodes ... // Remove all previous nodes ...
@ -61,11 +60,11 @@ const TextPeer = new Class({
me._native.appendChild(tspan); me._native.appendChild(tspan);
}); });
} }
}, }
getText() { getText() {
return this._text; return this._text;
}, }
setPosition(x, y) { setPosition(x, y) {
this._position = { x, y }; this._position = { x, y };
@ -74,15 +73,15 @@ const TextPeer = new Class({
// tspan must be positioned manually. // tspan must be positioned manually.
$(this._native).children('tspan').attr('x', x); $(this._native).children('tspan').attr('x', x);
}, }
getPosition() { getPosition() {
return this._position; return this._position;
}, }
getNativePosition() { getNativePosition() {
return $(this._native).position(); return $(this._native).position();
}, }
setFont(font, size, style, weight) { setFont(font, size, style, weight) {
if ($defined(font)) { if ($defined(font)) {
@ -98,41 +97,41 @@ const TextPeer = new Class({
this._font.setSize(size); this._font.setSize(size);
} }
this._updateFontStyle(); this._updateFontStyle();
}, }
_updateFontStyle() { _updateFontStyle() {
this._native.setAttribute('font-family', this._font.getFontFamily()); this._native.setAttribute('font-family', this._font.getFontFamily());
this._native.setAttribute('font-size', this._font.getGraphSize()); this._native.setAttribute('font-size', this._font.getGraphSize());
this._native.setAttribute('font-style', this._font.getStyle()); this._native.setAttribute('font-style', this._font.getStyle());
this._native.setAttribute('font-weight', this._font.getWeight()); this._native.setAttribute('font-weight', this._font.getWeight());
}, }
setColor(color) { setColor(color) {
this._native.setAttribute('fill', color); this._native.setAttribute('fill', color);
}, }
getColor() { getColor() {
return this._native.getAttribute('fill'); return this._native.getAttribute('fill');
}, }
setTextSize(size) { setTextSize(size) {
this._font.setSize(size); this._font.setSize(size);
this._updateFontStyle(); this._updateFontStyle();
}, }
setContentSize(width, height) { setContentSize(width, height) {
this._native.xTextSize = `${width.toFixed(1)},${height.toFixed(1)}`; this._native.xTextSize = `${width.toFixed(1)},${height.toFixed(1)}`;
}, }
setStyle(style) { setStyle(style) {
this._font.setStyle(style); this._font.setStyle(style);
this._updateFontStyle(); this._updateFontStyle();
}, }
setWeight(weight) { setWeight(weight) {
this._font.setWeight(weight); this._font.setWeight(weight);
this._updateFontStyle(); this._updateFontStyle();
}, }
setFontFamily(family) { setFontFamily(family) {
const oldFont = this._font; const oldFont = this._font;
@ -141,7 +140,7 @@ const TextPeer = new Class({
this._font.setStyle(oldFont.getStyle()); this._font.setStyle(oldFont.getStyle());
this._font.setWeight(oldFont.getWeight()); this._font.setWeight(oldFont.getWeight());
this._updateFontStyle(); this._updateFontStyle();
}, }
getFont() { getFont() {
return { return {
@ -150,12 +149,12 @@ const TextPeer = new Class({
style: this._font.getStyle(), style: this._font.getStyle(),
weight: this._font.getWeight(), weight: this._font.getWeight(),
}; };
}, }
setSize(size) { setSize(size) {
this._font.setSize(size); this._font.setSize(size);
this._updateFontStyle(); this._updateFontStyle();
}, }
getWidth() { getWidth() {
let computedWidth; let computedWidth;
@ -170,13 +169,14 @@ const TextPeer = new Class({
computedWidth = bbox.width; computedWidth = bbox.width;
} }
} catch (e) { } catch (e) {
console.error(e);
computedWidth = 10; computedWidth = 10;
} }
let width = parseInt(computedWidth, 10); let width = parseInt(computedWidth, 10);
width += this._font.getWidthMargin(); width += this._font.getWidthMargin();
return width; return width;
}, }
getHeight() { getHeight() {
// Firefox hack for this // Firefox hack for this
@ -188,11 +188,11 @@ const TextPeer = new Class({
computedHeight = 10; computedHeight = 10;
} }
return parseInt(computedHeight, 10); return parseInt(computedHeight, 10);
}, }
getHtmlFontSize() { getHtmlFontSize() {
return this._font.getHtmlSize(); return this._font.getHtmlSize();
}, }
}); }
export default TextPeer; export default TextPeer;

View File

@ -17,20 +17,20 @@
*/ */
import Font from './Font'; import Font from './Font';
const TimesFont = new Class({ class TimesFont extends Font {
Extends: Font, constructor() {
initialize() { super();
this.parent();
this._fontFamily = 'times'; this._fontFamily = 'times';
}, }
getFontFamily() { getFontFamily() {
return this._fontFamily; return this._fontFamily;
}, }
// eslint-disable-next-line class-methods-use-this
getFont() { getFont() {
return Font.TIMES; return Font.TIMES;
}, }
}); }
export default TimesFont; export default TimesFont;

View File

@ -17,20 +17,20 @@
*/ */
import Font from './Font'; import Font from './Font';
const VerdanaFont = new Class({ class VerdanaFont extends Font {
Extends: Font, constructor() {
initialize() { super();
this.parent();
this._fontFamily = 'verdana'; this._fontFamily = 'verdana';
}, }
getFontFamily() { getFontFamily() {
return this._fontFamily; return this._fontFamily;
}, }
// eslint-disable-next-line class-methods-use-this
getFont() { getFont() {
return Font.VERDANA; return Font.VERDANA;
}, }
}); }
export default VerdanaFont; export default VerdanaFont;

View File

@ -19,16 +19,15 @@ import { $defined } from '@wisemapping/core-js';
import ElementPeer from './ElementPeer'; import ElementPeer from './ElementPeer';
import EventUtils from '../utils/EventUtils'; import EventUtils from '../utils/EventUtils';
const WorkspacePeer = new Class({ class WorkspacePeer extends ElementPeer {
Extends: ElementPeer, constructor(element) {
initialize(element) { const svgElement = window.document.createElementNS(ElementPeer.svgNamespace, 'svg');
super(svgElement);
this._element = element; this._element = element;
const svgElement = window.document.createElementNS(this.svgNamespace, 'svg');
this.parent(svgElement);
this._native.setAttribute('focusable', 'true'); this._native.setAttribute('focusable', 'true');
this._native.setAttribute('id', 'workspace'); // this._native.setAttribute('id', 'workspace');
this._native.setAttribute('preserveAspectRatio', 'none'); this._native.setAttribute('preserveAspectRatio', 'none');
}, }
/** /**
* http://www.w3.org/TR/SVG/coords.html 7.7 The viewBox attribute * http://www.w3.org/TR/SVG/coords.html 7.7 The viewBox attribute
@ -67,7 +66,7 @@ const WorkspacePeer = new Class({
this._native.setAttribute('viewBox', coords.join(' ')); this._native.setAttribute('viewBox', coords.join(' '));
this._native.setAttribute('preserveAspectRatio', 'none'); this._native.setAttribute('preserveAspectRatio', 'none');
EventUtils.broadcastChangeEvent(this, 'strokeStyle'); EventUtils.broadcastChangeEvent(this, 'strokeStyle');
}, }
getCoordSize() { getCoordSize() {
const viewBox = this._native.getAttribute('viewBox'); const viewBox = this._native.getAttribute('viewBox');
@ -76,7 +75,7 @@ const WorkspacePeer = new Class({
coords = viewBox.split(/ /); coords = viewBox.split(/ /);
} }
return { width: coords[2], height: coords[3] }; return { width: coords[2], height: coords[3] };
}, }
setCoordOrigin(x, y) { setCoordOrigin(x, y) {
const viewBox = this._native.getAttribute('viewBox'); const viewBox = this._native.getAttribute('viewBox');
@ -96,12 +95,12 @@ const WorkspacePeer = new Class({
} }
this._native.setAttribute('viewBox', coords.join(' ')); this._native.setAttribute('viewBox', coords.join(' '));
}, }
append(child) { append(child) {
this.parent(child); super.append(child);
EventUtils.broadcastChangeEvent(child, 'onChangeCoordSize'); EventUtils.broadcastChangeEvent(child, 'onChangeCoordSize');
}, }
getCoordOrigin() { getCoordOrigin() {
const viewBox = this._native.getAttribute('viewBox'); const viewBox = this._native.getAttribute('viewBox');
@ -112,11 +111,12 @@ const WorkspacePeer = new Class({
const x = parseFloat(coords[0]); const x = parseFloat(coords[0]);
const y = parseFloat(coords[1]); const y = parseFloat(coords[1]);
return { x, y }; return { x, y };
}, }
// eslint-disable-next-line class-methods-use-this
getPosition() { getPosition() {
return { x: 0, y: 0 }; return { x: 0, y: 0 };
}, }
}); }
export default WorkspacePeer; export default WorkspacePeer;

View File

@ -1,3 +1,20 @@
/*
* Copyright [2021] [wisemapping]
*
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
* It is basically the Apache License, Version 2.0 (the "License") plus the
* "powered by wisemapping" text requirement on every single page;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the license at
*
* http://www.wisemapping.org/license
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export const buildCurvedPath = (dist, x1, y1, x2, y2) => { export const buildCurvedPath = (dist, x1, y1, x2, y2) => {
let signx = 1; let signx = 1;
let signy = 1; let signy = 1;

View File

@ -0,0 +1,47 @@
/*
* Copyright [2021] [wisemapping]
*
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
* It is basically the Apache License, Version 2.0 (the "License") plus the
* "powered by wisemapping" text requirement on every single page;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the license at
*
* http://www.wisemapping.org/license
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Workspace from './components/Workspace';
import Toolkit from './components/Toolkit';
import Elipse from './components/Elipse';
import Line from './components/Line';
import PolyLine from './components/PolyLine';
import CurvedLine from './components/CurvedLine';
import Arrow from './components/Arrow';
import Group from './components/Group';
import Rect from './components/Rect';
import Text from './components/Text';
import Font from './components/Font';
import Point from './components/Point';
import Image from './components/Image';
export {
Arrow,
CurvedLine,
Elipse,
Font,
Group,
Image,
Line,
Point,
PolyLine,
Rect,
Text,
Toolkit,
Workspace,
};

View File

@ -1,41 +0,0 @@
import '@libraries/mootools-core-1.4.5';
// Utils
import eventUtils from '@utils/EventUtils';
import transformUtils from '@utils/TransformUtils';
// Import Components
import workspace from '@components/Workspace';
import toolkit from '@components/Toolkit';
import elipse from '@components/Elipse';
import line from '@components/Line';
import polyLine from '@components/PolyLine';
import curvedLine from '@components/CurvedLine';
import arrow from '@components/Arrow';
import group from '@components/Group';
import rect from '@components/Rect';
import text from '@components/Text';
import font from '@components/Font';
import point from '@components/Point';
import image from '@components/Image';
export default {
// Utils
EventUtils: eventUtils,
TransformUtils: transformUtils,
// Components
Arrow: arrow,
CurvedLine: curvedLine,
Elipse: elipse,
Font: font,
Group: group,
Image: image,
Line: line,
Point: point,
PolyLine: polyLine,
Rect: rect,
Text: text,
Toolkit: toolkit,
Workspace: workspace,
};

View File

@ -0,0 +1,63 @@
/*
* Copyright [2021] [wisemapping]
*
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
* It is basically the Apache License, Version 2.0 (the "License") plus the
* "powered by wisemapping" text requirement on every single page;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the license at
*
* http://www.wisemapping.org/license
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import $ from '@libraries/jquery-2.1.0';
class Grid {
constructor(parent, colums, rows) {
const cellSize = '10px';
this._parent = parent;
this._container = Grid._createContainer();
const tbody = $(this._container.firstChild.firstChild);
for (let i = 0; i < rows; i++) {
const trElement = $('<tr></tr>');
for (let j = 0; j < colums; j++) {
const tdElement = $('<td></td>');
tdElement.css({
width: cellSize,
height: cellSize,
borderWidth: '1px',
borderStyle: 'dashed',
borderColor: 'lightsteelblue',
});
trElement.append(tdElement);
}
tbody.append(trElement);
}
}
setPosition(x, y) {
this._container.style.left = x;
this._container.style.top = y;
}
render() {
$(this._parent).append(this._container);
}
static _createContainer() {
const result = window.document.createElement('div');
result.style.tableLayout = 'fixed';
result.style.borderCollapse = 'collapse';
result.style.emptyCells = 'show';
result.style.position = 'absolute';
result.innerHTML = '<table style="table-layout:fixed;border-collapse:collapse;empty-cells:show;"><tbody id="tableBody"></tbody></table>';
return result;
}
}
export default Grid ;

View File

@ -9,46 +9,10 @@
border: 1px solid black; border: 1px solid black;
} }
</style> </style>
<script type="text/javascript">
web2d = {
peer: {}
};
web2d.peer =
{
svg: {}
};
web2d.peer.utils = {};
</script>
<script type="text/javascript">
function initialize() {
web2d.Toolkit.init();
var overflowWorkspace = new web2d.Workspace({ fillColor: 'green' });
overflowWorkspace.setSize("200px", "200px");
var arrow = new web2d.Arrow();
arrow.setFrom(50, 50);
arrow.setControlPoint(new web2d.Point(-50, 0));
overflowWorkspace.append(arrow);
var arrow2 = new web2d.Arrow();
arrow2.setFrom(100, 50);
arrow2.setControlPoint(new web2d.Point(50, 50));
overflowWorkspace.append(arrow2);
overflowWorkspace.addItAsChildTo($('#overflowExample').first());
}
</script>
</head> </head>
<body onload="initialize();"> <body>
<h1>PolyLines Render Tests </h1> <h1>PolyLines Render Tests </h1>
<table> <table>
<colgroup style="width:80%;"> <colgroup style="width:80%;">
<col style="width:30%" /> <col style="width:30%" />
@ -63,15 +27,6 @@
</td> </td>
</tr> </tr>
<tr>
<td>
This is how multiple childs will look in each style line
</td>
<td>
<div id="multipleLineExample" />
</td>
</tr>
</table> </table>
</body> </body>

View File

@ -0,0 +1,22 @@
import $ from '@libraries/jquery-2.1.0';
import {
Toolkit, Workspace, Arrow, Point,
} from '../../src';
Toolkit.init();
const overflowWorkspace = new Workspace({ fillColor: 'green' });
overflowWorkspace.setSize('200px', '200px');
const arrow = new Arrow();
arrow.setFrom(50, 50);
arrow.setControlPoint(new Point(-50, 0));
overflowWorkspace.append(arrow);
const arrow2 = new Arrow();
arrow2.setFrom(100, 50);
arrow2.setControlPoint(new Point(50, 50));
overflowWorkspace.append(arrow2);
overflowWorkspace.addItAsChildTo($('#overflowExample').first());

View File

@ -1,8 +0,0 @@
import Grid from './utils';
import web2d from '../../src/web2d';
import $ from '@libraries/jquery-2.1.0';
global.Grid = Grid;
global.web2d = web2d;
global.$ = $;

View File

@ -9,47 +9,9 @@
border: 1px solid black; border: 1px solid black;
} }
</style> </style>
<script type="text/javascript">
web2d = {
peer: {}
};
web2d.peer =
{
svg: {}
};
web2d.peer.utils = {};
</script>
<script type="text/javascript">
function initialize() {
web2d.Toolkit.init();
var overflowWorkspace = new web2d.Workspace({ fillColor: 'green' });
overflowWorkspace.setSize("400px", "400px");
var line1 = new web2d.CurvedLine();
line1.setStyle(web2d.CurvedLine.SIMPLE_LINE);
line1.setFrom(200, 200);
line1.setTo(100, 100);
line1.setSrcControlPoint(new web2d.Point(-100, 0));
line1.setDestControlPoint(new web2d.Point(100, 0));
overflowWorkspace.append(line1);
var line2 = new web2d.CurvedLine();
line2.setStyle(web2d.CurvedLine.NICE_LINE);
line2.setFrom(0, 0);
line2.setTo(150, 90);
line2.setSrcControlPoint(new web2d.Point(100, 0));
line2.setDestControlPoint(new web2d.Point(-100, 0));
overflowWorkspace.append(line2);
overflowWorkspace.addItAsChildTo($('#overflowExample').first());
}
</script>
</head> </head>
<body onload="initialize();"> <body>
<h1>PolyLines Render Tests </h1> <h1>PolyLines Render Tests </h1>
@ -67,15 +29,6 @@
</td> </td>
</tr> </tr>
<tr>
<td>
This is how multiple childs will look in each style line
</td>
<td>
<div id="multipleLineExample" />
</td>
</tr>
</table> </table>
</body> </body>

View File

@ -0,0 +1,26 @@
import $ from '@libraries/jquery-2.1.0';
import {
Toolkit, Workspace, CurvedLine, Point,
} from '../../src';
Toolkit.init();
const overflowWorkspace = new Workspace({ fillColor: 'green' });
overflowWorkspace.setSize('400px', '400px');
const line1 = new CurvedLine();
line1.setStyle(CurvedLine.SIMPLE_LINE);
line1.setFrom(200, 200);
line1.setTo(100, 100);
line1.setSrcControlPoint(new Point(-100, 0));
line1.setDestControlPoint(new Point(100, 0));
overflowWorkspace.append(line1);
const line2 = new CurvedLine();
line2.setStyle(CurvedLine.NICE_LINE);
line2.setFrom(0, 0);
line2.setTo(150, 90);
line2.setSrcControlPoint(new Point(100, 0));
line2.setDestControlPoint(new Point(-100, 0));
overflowWorkspace.append(line2);
overflowWorkspace.addItAsChildTo($('#overflowExample').first());

View File

@ -1,5 +1,4 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
@ -8,136 +7,14 @@
td { td {
border: 1px solid black; border: 1px solid black;
} }
</style>
<script type="text/javascript">
web2d = {
peer: {}
};
web2d.peer =
{
svg: {}
};
web2d.peer.utils = {};
</script>
<style type="text/css">
.eventForm { .eventForm {
float: left; float: left;
margin: 10px; margin: 10px;
} }
</style> </style>
<script type="text/javascript">
function EventLogger(type, element) {
this._enable = false;
this._element = element;
this._type = type;
this._listener = function logger(event) {
var oldColor = element.getAttribute('fillColor');
element.setFill("yellow");
alert("Event on:" + element.getType() + ", Type:" + type);
element.setFill(oldColor);
};
}
EventLogger.prototype.changeState = function () {
this._enable = !this._enable;
if (this._enable) {
this._element.addEvent(this._type, this._listener);
} else {
this._element.removeEvent(this._type, this._listener);
}
return this._enable;
};
function MultipleEventHandler(type, element) {
this._listeners = [];
this._type = type;
this._element = element;
}
MultipleEventHandler.prototype.registerOneListener = function () {
var count = this._listeners.length;
var listener = function (event) {
alert("Listener #:" + count);
};
this._listeners.push(listener);
this._element.addEvent(this._type, listener);
}
MultipleEventHandler.prototype.listenerCount = function () {
return this._listeners.length;
}
MultipleEventHandler.prototype.unRegisterOneListener = function () {
if (this._listeners.length > 0) {
var listener = this._listeners.pop();
this._element.removeEvent(this._type, listener);
}
}
function initialize() {
web2d.Toolkit.init();
// Workspace with CoordOrigin(100,100);
var workspace = new web2d.Workspace();
workspace.setSize("150px", "150px");
workspace.setCoordSize(150, 150);
var bigElipse = new web2d.Elipse();
bigElipse.setSize(100, 100);
bigElipse.setPosition(75, 75);
workspace.append(bigElipse);
var smallElipse = new web2d.Elipse();
smallElipse.setSize(50, 50);
smallElipse.setPosition(75, 75);
smallElipse.setFill('red')
workspace.append(smallElipse);
wClickEventLogger = new EventLogger('click', workspace);
wMouseoverEventLogger = new EventLogger('mouseover', workspace);
wMouseoutEventLogger = new EventLogger('mouseout', workspace);
wMousemoveEventLogger = new EventLogger('mousemove', workspace);
wDblCickEventLogger = new EventLogger('dblclick', workspace);
esClickEventLogger = new EventLogger('click', smallElipse);
esMouseoverEventLogger = new EventLogger('mouseover', smallElipse);
esMouseoutEventLogger = new EventLogger('mouseout', smallElipse);
esMousemoveEventLogger = new EventLogger('mousemove', smallElipse);
esDblCickEventLogger = new EventLogger('dblclick', smallElipse);
ebClickEventLogger = new EventLogger('click', bigElipse);
ebMouseoverEventLogger = new EventLogger('mouseover', bigElipse);
ebMouseoutEventLogger = new EventLogger('mouseout', bigElipse);
ebousemoveEventLogger = new EventLogger('mousemove', bigElipse);
ebblCickEventLogger = new EventLogger('dblclick', bigElipse);
workspace.addItAsChildTo($('#workspaceContainer').first());
var mEventWorkspace = new web2d.Workspace();
mEventWorkspace.setSize("150px", "150px");
mEventWorkspace.setCoordSize(150, 150);
var elipse = new web2d.Elipse();
elipse.setSize(100, 100);
elipse.setPosition(75, 75);
elipse.setFill('blue')
mEventWorkspace.append(elipse);
mEventWorkspace.addItAsChildTo($('#workspaceMultipleEvents').first());
multipleHandler = new MultipleEventHandler('click', elipse);
}
</script>
</head> </head>
<body onload="initialize();"> <body>
<h1>Elements Event Handling</h1> <h1>Elements Event Handling</h1>
<table> <table>

View File

@ -0,0 +1,107 @@
/* eslint-disable no-alert */
import $ from '@libraries/jquery-2.1.0';
import {
Toolkit, Workspace, Elipse,
} from '../../src';
global.$ = $;
function EventLogger(type, element) {
this._enable = false;
this._element = element;
this._type = type;
this._listener = function logger() {
const oldColor = element.getAttribute('fillColor');
element.setFill('yellow');
alert(`Event on:${element.getType()}, Type:${type}`);
element.setFill(oldColor);
};
}
EventLogger.prototype.changeState = function changeState() {
this._enable = !this._enable;
if (this._enable) {
this._element.addEvent(this._type, this._listener);
} else {
this._element.removeEvent(this._type, this._listener);
}
return this._enable;
};
function MultipleEventHandler(type, element) {
this._listeners = [];
this._type = type;
this._element = element;
}
MultipleEventHandler.prototype.registerOneListener = function registerOneListener() {
const count = this._listeners.length;
const listener = () => {
alert(`Listener #:${count}`);
};
this._listeners.push(listener);
this._element.addEvent(this._type, listener);
};
MultipleEventHandler.prototype.listenerCount = function listenerCount() {
return this._listeners.length;
};
MultipleEventHandler.prototype.unRegisterOneListener = function unRegisterOneListener() {
if (this._listeners.length > 0) {
const listener = this._listeners.pop();
this._element.removeEvent(this._type, listener);
}
};
Toolkit.init();
// Workspace with CoordOrigin(100,100);
const workspace = new Workspace();
workspace.setSize('150px', '150px');
workspace.setCoordSize(150, 150);
const bigElipse = new Elipse();
bigElipse.setSize(100, 100);
bigElipse.setPosition(75, 75);
workspace.append(bigElipse);
const smallElipse = new Elipse();
smallElipse.setSize(50, 50);
smallElipse.setPosition(75, 75);
smallElipse.setFill('red');
workspace.append(smallElipse);
global.wClickEventLogger = new EventLogger('click', workspace);
global.wMouseoverEventLogger = new EventLogger('mouseover', workspace);
global.wMouseoutEventLogger = new EventLogger('mouseout', workspace);
global.wMousemoveEventLogger = new EventLogger('mousemove', workspace);
global.wDblCickEventLogger = new EventLogger('dblclick', workspace);
global.esClickEventLogger = new EventLogger('click', smallElipse);
global.esMouseoverEventLogger = new EventLogger('mouseover', smallElipse);
global.esMouseoutEventLogger = new EventLogger('mouseout', smallElipse);
global.esMousemoveEventLogger = new EventLogger('mousemove', smallElipse);
global.esDblCickEventLogger = new EventLogger('dblclick', smallElipse);
global.ebClickEventLogger = new EventLogger('click', bigElipse);
global.ebMouseoverEventLogger = new EventLogger('mouseover', bigElipse);
global.ebMouseoutEventLogger = new EventLogger('mouseout', bigElipse);
global.ebousemoveEventLogger = new EventLogger('mousemove', bigElipse);
global.ebblCickEventLogger = new EventLogger('dblclick', bigElipse);
workspace.addItAsChildTo($('#workspaceContainer').first());
const mEventWorkspace = new Workspace();
mEventWorkspace.setSize('150px', '150px');
mEventWorkspace.setCoordSize(150, 150);
const elipse = new Elipse();
elipse.setSize(100, 100);
elipse.setPosition(75, 75);
elipse.setFill('blue');
mEventWorkspace.append(elipse);
mEventWorkspace.addItAsChildTo($('#workspaceMultipleEvents').first());
global.multipleHandler = new MultipleEventHandler('click', elipse);

View File

@ -1,7 +1,5 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<style> <style>
th, th,
@ -9,78 +7,9 @@
border: 1px solid black; border: 1px solid black;
} }
</style> </style>
<script type="text/javascript">
web2d = {
peer: {}
};
web2d.peer =
{
svg: {}
};
web2d.peer.utils = {};
</script>
<script type="text/javascript">
function multiline(text, family, elemId) {
var overflowWorkspace = new web2d.Workspace();
overflowWorkspace.setSize('200px', '240px');
overflowWorkspace.setCoordSize('200', '240');
overflowWorkspace.setCoordOrigin(0, 0);
[6, 8, 10, 15].forEach(function (size, i) {
var wText = new web2d.Text();
overflowWorkspace.append(wText);
wText.setText(text);
wText.setFont(family, size, 'bold');
wText.setPosition(30, 50 * i);
wText.setColor('red');
});
overflowWorkspace.addItAsChildTo($("#" + elemId));
}
function alignments(text, family, elemId) {
var overflowWorkspace = new web2d.Workspace();
overflowWorkspace.setSize('260px', '240px');
overflowWorkspace.setCoordSize('260', '240');
overflowWorkspace.setCoordOrigin(0, 0);
['center', 'left', 'right'].forEach(function (align, i) {
var wText = new web2d.Text();
overflowWorkspace.append(wText);
wText.setText(text);
wText.setFont(family, 8, 'bold');
wText.setPosition(30, 80 * i);
wText.setColor('red');
wText.setTextAlignment(align);
});
overflowWorkspace.addItAsChildTo($("#" + elemId));
}
function initialize() {
web2d.Toolkit.init();
// Multine tests ...
['Arial', 'Tahoma', 'Verdana', 'Times'].forEach(function (family, i) {
multiline('This multine text.\nLine 1 :)\nLine2', family, 'multi' + i);
});
// Multine tests and alingments .. ...
['Arial', 'Tahoma', 'Verdana', 'Times'].forEach(function (family, i) {
alignments('This multine text.\nThis is the long line just because :)\nShort line', family, 'amulti' + i);
})
}
</script>
</head> </head>
<body>
<body onload="initialize();">
<h1>Web2d Fonts Tests</h1> <h1>Web2d Fonts Tests</h1>
<table> <table>
<colgroup> <colgroup>
<col style="width:30%" /> <col style="width:30%" />

View File

@ -0,0 +1,57 @@
import $ from '@libraries/jquery-2.1.0';
import {
Toolkit, Workspace, Text,
} from '../../src';
global.$ = $;
function multiline(text, family, elemId) {
const workspace = new Workspace();
workspace.setSize('200px', '240px');
workspace.setCoordSize('200', '240');
workspace.setCoordOrigin(0, 0);
[6, 8, 10, 15].forEach((size, i) => {
const wText = new Text();
workspace.append(wText);
wText.setText(text);
wText.setFont(family, size, 'bold');
wText.setPosition(30, 50 * i);
wText.setColor('blue');
});
workspace.addItAsChildTo($(`#${elemId}`));
}
function alignments(text, family, elemId) {
const overflowWorkspace = new Workspace();
overflowWorkspace.setSize('260px', '240px');
overflowWorkspace.setCoordSize('260', '240');
overflowWorkspace.setCoordOrigin(0, 0);
['center', 'left', 'right'].forEach((align, i) => {
const wText = new Text();
overflowWorkspace.append(wText);
wText.setText(text);
wText.setFont(family, 8, 'bold');
wText.setPosition(30, 80 * i);
wText.setColor('green');
wText.setTextAlignment(align);
});
overflowWorkspace.addItAsChildTo($(`#${elemId}`));
}
Toolkit.init();
// Multine tests ...
['Arial', 'Tahoma', 'Verdana', 'Times'].forEach((family, i) => {
multiline('This multine text.\nLine 1 :)\nLine2', family, `multi${i}`);
});
// Multine tests and alingments .. ...
['Arial', 'Tahoma', 'Verdana', 'Times'].forEach((family, i) => {
alignments('This multine text.\nThis is the long line just because :)\nShort line', family, `amulti${i}`);
});

View File

@ -9,338 +9,11 @@
border: 1px solid black; border: 1px solid black;
} }
</style> </style>
<script type="text/javascript">
web2d = {
peer: {}
};
web2d.peer =
{
svg: {}
};
web2d.peer.utils = {};
</script>
<script type="text/javascript">
function initialize() {
web2d.Toolkit.init();
var basicTest = function () {
var workspace = new web2d.Workspace();
workspace.setSize("150px", "150px");
workspace.setCoordSize(100, 100);
var group = new web2d.Group();
group.setSize(50, 50);
group.setPosition(25, 50);
group.setCoordSize(200, 200);
group.setCoordOrigin(0, 0);
workspace.append(group);
var elipse = new web2d.Elipse();
elipse.setSize(200, 200);
elipse.setPosition(100, 100);
group.append(elipse);
var line = new web2d.Line();
line.setFrom(0, 0);
line.setTo(200, 200);
line.setStroke("blue");
group.append(line);
line = new web2d.Line();
line.setFrom(200, 0);
line.setTo(0, 200);
line.setStroke("blue");
group.append(line);
workspace.addItAsChildTo($('#groupBasicContainer'));
var xDir = 1;
var yDir = 1;
var executer = function () {
var y = group.getPosition().y + yDir;
var x = group.getPosition().x + xDir;
if (x < 0) {
xDir = 1;
} else if (x > 50) {
xDir = -1;
}
if (y < 0) {
yDir = 1;
} else if (y > 50) {
yDir = -1;
}
// Logger.logMsg("Moving group x,y:"+ x + "," + y);
group.setPosition(x, y);
};
//executer.periodical(100);
};
basicTest();
var eventTest = function () {
var workspace = new web2d.Workspace();
workspace.setSize("150px", "150px");
workspace.setCoordSize(100, 100);
var groupAttributes = { width: 50, height: 50, x: 25, y: 50, coordSize: '200 200', coordOrigin: '0 0' };
var group = new web2d.Group(groupAttributes);
workspace.append(group);
var elipseLeft = new web2d.Elipse();
elipseLeft.setSize(200, 200)
elipseLeft.setPosition(200, 0)
group.append(elipseLeft);
var elipseRight = new web2d.Elipse();
elipseRight.setSize(200, 200)
elipseRight.setPosition(0, 0)
group.append(elipseRight);
var listener = function (e) {
alert("Click event on:" + this.getType())
};
group.addEvent("click", listener);
elipseLeft.addEvent("click", listener);
elipseRight.addEvent("click", listener);
workspace.addItAsChildTo($('#groupEventsContainer'));
}
eventTest();
var eventTest = function () {
var workspace = new web2d.Workspace();
workspace.setSize("150px", "150px");
workspace.setCoordSize(200, 200);
var groupOuter = new web2d.Group();
groupOuter.setSize(50, 50)
groupOuter.setPosition(25, 25);
groupOuter.setCoordSize(100, 100);
groupOuter.setCoordOrigin(0, 0)
workspace.append(groupOuter);
var elipseOuter = new web2d.Elipse();
elipseOuter.setSize(200, 200);
elipseOuter.setPosition(100, 100);
elipseOuter.setFill("red");
groupOuter.append(elipseOuter);
var line = new web2d.Line();
line.setFrom(0, 0);
line.setTo(200, 200);
line.setStroke("red");
groupOuter.append(line);
var line = new web2d.Line();
line.setFrom(200, 0);
line.setTo(0, 200);
line.setStroke("red");
groupOuter.append(line);
var groupInner = new web2d.Group();
groupInner.setSize(50, 50);
groupInner.setPosition(25, 25);
groupInner.setCoordSize(100, 100);
groupInner.setCoordOrigin(0, 0);
groupOuter.append(groupInner);
var elipse = new web2d.Elipse();
elipse.setSize(200, 200);
elipse.setPosition(100, 100);
groupInner.append(elipse);
var line = new web2d.Line();
line.setFrom(0, 0);
line.setTo(200, 200);
line.setStroke("blue");
groupInner.append(line);
var line = new web2d.Line();
line.setFrom(200, 0);
line.setTo(0, 200);
line.setStroke("blue");
groupInner.append(line);
workspace.addItAsChildTo($('#groupNestedContainer'));
};
eventTest();
var workspaceCoordSizeSample = function () {
function groupSampleBuilder(width, height) {
// Group with CoordSize(50,50);
var workspace = new web2d.Workspace();
workspace.setSize("100px", "100px");
workspace.setCoordSize(100, 100);
elipseOuter = new web2d.Elipse();
elipseOuter.setPosition(50, 50);
elipseOuter.setSize(50, 50);
workspace.append(elipseOuter);
var group = new web2d.Group();
group.setSize(50, 50);
group.setCoordSize(width, height);
group.setPosition(25, 25);
workspace.append(group);
elipseInner = new web2d.Elipse();
elipseInner.setPosition(50, 50);
elipseInner.setSize(50, 50);
elipseInner.setFill("red");
group.append(elipseInner);
return workspace;
}
var sample100x100 = groupSampleBuilder(100, 100);
sample100x100.addItAsChildTo($("#coordsizeExample100x100"));
var sample100x200 = groupSampleBuilder(100, 200);
sample100x200.addItAsChildTo($("#coordsizeExample100x200"));
var sample200x100 = groupSampleBuilder(200, 100);
sample200x100.addItAsChildTo($("#coordsizeExample200x100"));
};
workspaceCoordSizeSample();
var workspaceCoordOriginSample = function () {
function groupSampleBuilder(x, y) {
var workspace = new web2d.Workspace();
workspace.setSize("100px", "100px");
workspace.setCoordSize(100, 100);
elipseOuter = new web2d.Elipse();
elipseOuter.setPosition(50, 50);
elipseOuter.setSize(50, 50);
workspace.append(elipseOuter);
var group = new web2d.Group();
group.setSize(50, 50);
group.setCoordSize(100, 100);
group.setCoordOrigin(x, y);
group.setPosition(25, 25);
workspace.append(group);
elipseInner = new web2d.Elipse();
elipseInner.setPosition(50, 50);
elipseInner.setSize(50, 50);
elipseInner.setFill("red");
group.append(elipseInner);
return workspace;
}
;
var sample0x0 = groupSampleBuilder(0, 0);
sample0x0.addItAsChildTo($("#coordOriginExample0x0"));
var sample100x200 = groupSampleBuilder(0, 50);
sample100x200.addItAsChildTo($("#coordOriginExample0x50"));
var sample200x100 = groupSampleBuilder(50, 0);
sample200x100.addItAsChildTo($("#coordOriginExample50x0"));
}
workspaceCoordOriginSample();
var groupVisibilitySample = function () {
var workspace = new web2d.Workspace();
workspace.setSize("100px", "100px");
workspace.setCoordSize(100, 100);
var group = new web2d.Group();
group.setSize(100, 100);
group.setPosition(0, 0);
group.setCoordSize(100, 100);
group.addEvent("mouseover", function () {
alert("Mouse Over Group");
});
workspace.append(group);
elipseOuter = new web2d.Elipse();
elipseOuter.setPosition(50, 50);
elipseOuter.setSize(50, 50);
group.addEvent("mouseover", function () {
alert("Mouse Over elipseOuter");
});
group.append(elipseOuter);
elipseInner = new web2d.Elipse();
elipseInner.setPosition(50, 50);
elipseInner.setSize(25, 25);
elipseInner.setFill("red");
group.append(elipseInner);
var isVisible = true;
var executer = function () {
isVisible = !isVisible;
group.setVisibility(isVisible);
};
//executer.periodical(100);
workspace.addItAsChildTo($('#visibilityExample'));
}
groupVisibilitySample();
var groupVisibilitySample = function () {
var workspace = new web2d.Workspace();
workspace.setSize("100px", "100px");
workspace.setCoordSize(100, 100);
var group = new web2d.Group();
group.setSize(100, 100);
group.setPosition(0, 0);
group.setCoordSize(100, 100);
workspace.append(group);
elipseOuter = new web2d.Elipse();
elipseOuter.setPosition(50, 50);
elipseOuter.setSize(50, 50);
group.append(elipseOuter);
elipseInner = new web2d.Elipse();
elipseInner.setPosition(50, 50);
elipseInner.setSize(25, 25);
elipseInner.setFill("red");
group.append(elipseInner);
var width = 10;
var height = 10;
var executer = function () {
width = (width + 10) % 100;
height = (height + 10) % 100;
group.setCoordSize(width, height);
};
//executer.periodical(100);
workspace.addItAsChildTo($('#scaleStrokeExample'));
}
groupVisibilitySample();
}
</script>
</head> </head>
<body onload="initialize();"> <body>
<h1>Group Render Tests</h1>
<h1>Group Render Tests.</h1>
<table> <table>
<colgroup style="width:80%;"> <colgroup style="width:80%;">
<col style="width:50%" /> <col style="width:50%" />

View File

@ -0,0 +1,304 @@
/* eslint-disable no-alert */
import $ from '@libraries/jquery-2.1.0';
import {
Toolkit, Workspace, Line, Group, Elipse,
} from '../../src';
global.$ = $;
Toolkit.init();
const basicTest = () => {
const workspace = new Workspace();
workspace.setSize('150px', '150px');
workspace.setCoordSize(100, 100);
const group = new Group();
group.setSize(50, 50);
group.setPosition(25, 50);
group.setCoordSize(200, 200);
group.setCoordOrigin(0, 0);
workspace.append(group);
const elipse = new Elipse();
elipse.setSize(200, 200);
elipse.setPosition(100, 100);
group.append(elipse);
let line = new Line();
line.setFrom(0, 0);
line.setTo(200, 200);
line.setStroke('blue');
group.append(line);
line = new Line();
line.setFrom(200, 0);
line.setTo(0, 200);
line.setStroke('blue');
group.append(line);
workspace.addItAsChildTo($('#groupBasicContainer'));
let xDir = 1;
let yDir = 1;
const executer = function () {
const y = group.getPosition().y + yDir;
const x = group.getPosition().x + xDir;
if (x < 0) {
xDir = 1;
} else if (x > 50) {
xDir = -1;
}
if (y < 0) {
yDir = 1;
} else if (y > 50) {
yDir = -1;
}
// Logger.logMsg("Moving group x,y:"+ x + "," + y);
group.setPosition(x, y);
};
// executer.periodical(100);
};
basicTest();
const eventTest = () => {
const workspace = new Workspace();
workspace.setSize('150px', '150px');
workspace.setCoordSize(100, 100);
const groupAttributes = {
width: 50, height: 50, x: 25, y: 50, coordSize: '200 200', coordOrigin: '0 0',
};
const group = new Group(groupAttributes);
workspace.append(group);
const elipseLeft = new Elipse();
elipseLeft.setSize(200, 200);
elipseLeft.setPosition(200, 0);
group.append(elipseLeft);
const elipseRight = new Elipse();
elipseRight.setSize(200, 200);
elipseRight.setPosition(0, 0);
group.append(elipseRight);
const listener = function listener() {
alert(`Click event on:${this.getType()}`);
};
group.addEvent('click', listener);
elipseLeft.addEvent('click', listener);
elipseRight.addEvent('click', listener);
workspace.addItAsChildTo($('#groupEventsContainer'));
};
eventTest();
const eventTest2 = () => {
const workspace = new Workspace();
workspace.setSize('150px', '150px');
workspace.setCoordSize(200, 200);
const groupOuter = new Group();
groupOuter.setSize(50, 50);
groupOuter.setPosition(25, 25);
groupOuter.setCoordSize(100, 100);
groupOuter.setCoordOrigin(0, 0);
workspace.append(groupOuter);
const elipseOuter = new Elipse();
elipseOuter.setSize(200, 200);
elipseOuter.setPosition(100, 100);
elipseOuter.setFill('red');
groupOuter.append(elipseOuter);
let line = new Line();
line.setFrom(0, 0);
line.setTo(200, 200);
line.setStroke('red');
groupOuter.append(line);
line = new Line();
line.setFrom(200, 0);
line.setTo(0, 200);
line.setStroke('red');
groupOuter.append(line);
const groupInner = new Group();
groupInner.setSize(50, 50);
groupInner.setPosition(25, 25);
groupInner.setCoordSize(100, 100);
groupInner.setCoordOrigin(0, 0);
groupOuter.append(groupInner);
const elipse = new Elipse();
elipse.setSize(200, 200);
elipse.setPosition(100, 100);
groupInner.append(elipse);
line = new Line();
line.setFrom(0, 0);
line.setTo(200, 200);
line.setStroke('blue');
groupInner.append(line);
line = new Line();
line.setFrom(200, 0);
line.setTo(0, 200);
line.setStroke('blue');
groupInner.append(line);
workspace.addItAsChildTo($('#groupNestedContainer'));
};
eventTest2();
const workspaceCoordSizeSample = () => {
function groupSampleBuilder(width, height) {
// Group with CoordSize(50,50);
const workspace = new Workspace();
workspace.setSize('100px', '100px');
workspace.setCoordSize(100, 100);
const elipseOuter = new Elipse();
elipseOuter.setPosition(50, 50);
elipseOuter.setSize(50, 50);
workspace.append(elipseOuter);
const group = new Group();
group.setSize(50, 50);
group.setCoordSize(width, height);
group.setPosition(25, 25);
workspace.append(group);
const elipseInner = new Elipse();
elipseInner.setPosition(50, 50);
elipseInner.setSize(50, 50);
elipseInner.setFill('red');
group.append(elipseInner);
return workspace;
}
const sample100x100 = groupSampleBuilder(100, 100);
sample100x100.addItAsChildTo($('#coordsizeExample100x100'));
const sample100x200 = groupSampleBuilder(100, 200);
sample100x200.addItAsChildTo($('#coordsizeExample100x200'));
const sample200x100 = groupSampleBuilder(200, 100);
sample200x100.addItAsChildTo($('#coordsizeExample200x100'));
};
workspaceCoordSizeSample();
const workspaceCoordOriginSample = () => {
function groupSampleBuilder(x, y) {
const workspace = new Workspace();
workspace.setSize('100px', '100px');
workspace.setCoordSize(100, 100);
const elipseOuter = new Elipse();
elipseOuter.setPosition(50, 50);
elipseOuter.setSize(50, 50);
workspace.append(elipseOuter);
const group = new Group();
group.setSize(50, 50);
group.setCoordSize(100, 100);
group.setCoordOrigin(x, y);
group.setPosition(25, 25);
workspace.append(group);
const elipseInner = new Elipse();
elipseInner.setPosition(50, 50);
elipseInner.setSize(50, 50);
elipseInner.setFill('red');
group.append(elipseInner);
return workspace;
}
const sample0x0 = groupSampleBuilder(0, 0);
sample0x0.addItAsChildTo($('#coordOriginExample0x0'));
const sample100x200 = groupSampleBuilder(0, 50);
sample100x200.addItAsChildTo($('#coordOriginExample0x50'));
const sample200x100 = groupSampleBuilder(50, 0);
sample200x100.addItAsChildTo($('#coordOriginExample50x0'));
};
workspaceCoordOriginSample();
const groupVisibilitySample = () => {
const workspace = new Workspace();
workspace.setSize('100px', '100px');
workspace.setCoordSize(100, 100);
const group = new Group();
group.setSize(100, 100);
group.setPosition(0, 0);
group.setCoordSize(100, 100);
group.addEvent('mouseover', () => {
alert('Mouse Over Group');
});
workspace.append(group);
const elipseOuter = new Elipse();
elipseOuter.setPosition(50, 50);
elipseOuter.setSize(50, 50);
group.addEvent('mouseover', () => {
alert('Mouse Over elipseOuter');
});
group.append(elipseOuter);
const elipseInner = new Elipse();
elipseInner.setPosition(50, 50);
elipseInner.setSize(25, 25);
elipseInner.setFill('red');
group.append(elipseInner);
let isVisible = true;
const executer = function () {
isVisible = !isVisible;
group.setVisibility(isVisible);
};
// executer.periodical(100);
workspace.addItAsChildTo($('#visibilityExample'));
};
groupVisibilitySample();
const groupVisibilitySample2 = () => {
const workspace = new Workspace();
workspace.setSize('100px', '100px');
workspace.setCoordSize(100, 100);
const group = new Group();
group.setSize(100, 100);
group.setPosition(0, 0);
group.setCoordSize(100, 100);
workspace.append(group);
const elipseOuter = new Elipse();
elipseOuter.setPosition(50, 50);
elipseOuter.setSize(50, 50);
group.append(elipseOuter);
const elipseInner = new Elipse();
elipseInner.setPosition(50, 50);
elipseInner.setSize(25, 25);
elipseInner.setFill('red');
group.append(elipseInner);
let width = 10;
let height = 10;
const executer = function () {
width = (width + 10) % 100;
height = (height + 10) % 100;
group.setCoordSize(width, height);
};
// executer.periodical(100);
workspace.addItAsChildTo($('#scaleStrokeExample'));
};
groupVisibilitySample2();

View File

@ -4,12 +4,13 @@
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Testing</title> <title>WiseMapping Web2D Playground</title>
</head> </head>
<body> <body>
<div> <div>
<h1>Testing</h1> <h1>WiseMapping Web2D Playground</h1>
<h2>This is a list of the different Web2D components supported:</h2>
<ul> <ul>
<li><a href="/arrow.html">Arrow</a></li> <li><a href="/arrow.html">Arrow</a></li>
<li><a href="/curvedLine.html">Curved Line</a></li> <li><a href="/curvedLine.html">Curved Line</a></li>

View File

@ -9,84 +9,9 @@
border: 1px solid black; border: 1px solid black;
} }
</style> </style>
<script type="text/javascript">
web2d = {
peer: {}
};
web2d.peer =
{
svg: {}
};
web2d.peer.utils = {};
</script>
<script type="text/javascript">
function initialize() {
web2d.Toolkit.init();
var workspaceAttributes = { width: '700px', height: '100px', coordSize: '350 50', fillColor: '#ffffcc' };
var strokeWidthWorkspace = new web2d.Workspace(workspaceAttributes);
var rect = new web2d.Rect();
rect.setSize(10, 10);
rect.setStroke(0);
rect.setPosition(250, 5);
strokeWidthWorkspace.append(rect);
for (var i = 0; i <= 10; i++) {
var line = new web2d.Line();
line.setFrom(5 + (i * 25), 5);
line.setTo(5 + (i * 25), 45);
line.setAttribute('strokeWidth', i + 1);
strokeWidthWorkspace.append(line);
}
strokeWidthWorkspace.append(rect);
strokeWidthWorkspace.addItAsChildTo($('#strokeWidthSample'));
var strokeOpacityWorkspace = new web2d.Workspace(workspaceAttributes);
for (var i = 0; i < 10; i++) {
var line = new web2d.Line();
line.setFrom(15 + (i * 25), 5);
line.setTo(3 + (i * 25), 45);
line.setAttribute('strokeWidth', 2);
line.setAttribute('strokeOpacity', 1 / (i + 1));
line.setAttribute('strokeColor', 'red');
strokeOpacityWorkspace.append(line);
}
strokeOpacityWorkspace.addItAsChildTo($('#strokeOpacitySample'));
var strokeStyleWorkspace = new web2d.Workspace(workspaceAttributes);
var styles = ['solid', 'dot', 'dash', 'dashdot', 'longdash'];
for (var i = 0; i < styles.length; i++) {
var line = new web2d.Line();
line.setFrom(25 + (i * 30), 5);
line.setTo(13 + (i * 30), 45);
line.setAttribute('strokeWidth', 2);
line.setAttribute('strokeColor', 'red');
line.setAttribute('strokeStyle', styles[i]);
strokeStyleWorkspace.append(line);
}
strokeStyleWorkspace.addItAsChildTo($('#strokeStyleSample'));
var strokeArrowWorkspace = new web2d.Workspace(workspaceAttributes);
var styles = ['none ', 'block ', 'classic', 'diamond ', 'oval', 'open', 'chevron', 'doublechevron'];
for (var i = 0; i < styles.length; i++) {
var line = new web2d.Line();
line.setFrom(25 + (i * 30), 5);
line.setTo(13 + (i * 30), 45);
line.setAttribute('strokeWidth', 2);
line.setAttribute('strokeColor', 'red');
line.setArrowStyle(styles[i]);
strokeArrowWorkspace.append(line);
}
strokeArrowWorkspace.addItAsChildTo($('#strokeArrowSample'));
}
</script>
</head> </head>
<body onload="initialize();"> <body>
<h1>Lines Render Tests </h1> <h1>Lines Render Tests </h1>

View File

@ -0,0 +1,67 @@
import $ from '@libraries/jquery-2.1.0';
import {
Toolkit, Workspace, Line, Rect,
} from '../../src';
global.$ = $;
Toolkit.init();
const workspaceAttributes = {
width: '700px', height: '100px', coordSize: '350 50', fillColor: '#ffffcc',
};
const strokeWidthWorkspace = new Workspace(workspaceAttributes);
const rect = new Rect();
rect.setSize(10, 10);
rect.setStroke(0);
rect.setPosition(250, 5);
strokeWidthWorkspace.append(rect);
for (let i = 0; i <= 10; i++) {
const line = new Line();
line.setFrom(5 + (i * 25), 5);
line.setTo(5 + (i * 25), 45);
line.setAttribute('strokeWidth', i + 1);
strokeWidthWorkspace.append(line);
}
strokeWidthWorkspace.append(rect);
strokeWidthWorkspace.addItAsChildTo($('#strokeWidthSample'));
const strokeOpacityWorkspace = new Workspace(workspaceAttributes);
for (let i = 0; i < 10; i++) {
const line = new Line();
line.setFrom(15 + (i * 25), 5);
line.setTo(3 + (i * 25), 45);
line.setAttribute('strokeWidth', 2);
line.setAttribute('strokeOpacity', 1 / (i + 1));
line.setAttribute('strokeColor', 'red');
strokeOpacityWorkspace.append(line);
}
strokeOpacityWorkspace.addItAsChildTo($('#strokeOpacitySample'));
const strokeStyleWorkspace = new Workspace(workspaceAttributes);
const styles = ['solid', 'dot', 'dash', 'dashdot', 'longdash'];
for (let i = 0; i < styles.length; i++) {
const line = new Line();
line.setFrom(25 + (i * 30), 5);
line.setTo(13 + (i * 30), 45);
line.setAttribute('strokeWidth', 2);
line.setAttribute('strokeColor', 'red');
line.setAttribute('strokeStyle', styles[i]);
strokeStyleWorkspace.append(line);
}
strokeStyleWorkspace.addItAsChildTo($('#strokeStyleSample'));
const strokeArrowWorkspace = new Workspace(workspaceAttributes);
const styles2 = ['none ', 'block ', 'classic', 'diamond ', 'oval', 'open', 'chevron', 'doublechevron'];
for (let i = 0; i < styles.length; i++) {
const line = new Line();
line.setFrom(25 + (i * 30), 5);
line.setTo(13 + (i * 30), 45);
line.setAttribute('strokeWidth', 2);
line.setAttribute('strokeColor', 'red');
line.setArrowStyle(styles2[i]);
strokeArrowWorkspace.append(line);
}
strokeArrowWorkspace.addItAsChildTo($('#strokeArrowSample'));

View File

@ -9,159 +9,9 @@
border: 1px solid black; border: 1px solid black;
} }
</style> </style>
<script type="text/javascript">
web2d = {
peer: {}
};
web2d.peer =
{
svg: {}
};
web2d.peer.utils = {};
</script>
<script type="text/javascript">
function initialize() {
web2d.Toolkit.init();
var overflowWorkspace = new web2d.Workspace({ fillColor: 'green' });
overflowWorkspace.setSize("100px", "100px");
var line = new web2d.PolyLine();
line.setTo(165, 165);
line.setFrom(95, 95);
line.setStyle("Straight");
line.setStroke('10');
overflowWorkspace.append(line);
// line.setTo(165, 165);
// line.setFrom(95, 95);
// line.setTo(165, 165);
// line.setFrom(95, 95);
// line.setTo(165, 165);
// line.setFrom(95, 95);
// line.setTo(165, 165);
// line.setTo(165, 165);
// line.setFrom(95, 95);
// line.setTo(165, 165);
// line.setFrom(95, 95);
// line.setTo(165, 165);
// line.setFrom(95, 95);
// line.setTo(165, 165);
// line.setTo(165, 165);
// line.setFrom(95, 95);
// line.setTo(165, 165);
// line.setFrom(95, 95);
// line.setTo(165, 165);
// line.setFrom(95, 95);
// line.setTo(165, 165);
// line.setTo(165, 165);
// line.setFrom(95, 95);
// line.setTo(165, 165);
// line.setFrom(95, 95);
// line.setTo(165, 165);
// line.setFrom(95, 95);
// line.setTo(165, 165);
// line.setTo(165, 165);
// line.setFrom(95, 95);
// line.setTo(165, 165);
// line.setFrom(95, 95);
// line.setTo(165, -1653.0000000000000000000001);
// line.setFrom(95, 952);
// line.setTo(165, 1651);
//
//
// var line = new web2d.PolyLine();
// line.setFrom(95, 90);
// line.setTo(160, 20);
// overflowWorkspace.append(line);
//
// var line = new web2d.PolyLine();
// line.setStyle("Straight");
// line.setFrom(90, -90);
// line.setTo(20, 20);
// overflowWorkspace.append(line);
//
// var line = new web2d.PolyLine();
// line.setFrom(95, 95);
// line.setTo(165, 165);
// line.setStroke(1, 'solid', 'red');
// overflowWorkspace.append(line);
//
// // Reference ...
// var refLine = new web2d.Line();
// refLine.setFrom(95, 0);
// refLine.setTo(95, 200);
// refLine.setStroke(1, 'solid', 'red');
// overflowWorkspace.append(refLine);
//
// var refLine = new web2d.Line();
// refLine.setFrom(165, 0);
// refLine.setTo(165, 200);
// refLine.setStroke(1, 'solid', 'red');
// overflowWorkspace.append(refLine);
//
overflowWorkspace.addItAsChildTo($('#overflowExample'));
var overflowWorkspace = new web2d.Workspace();
overflowWorkspace.setSize("100px", "100px");
var line1 = new web2d.PolyLine();
line1.setFrom(95, 95);
line1.setTo(165, 165);
line1.setStyle("Curved");
overflowWorkspace.append(line1);
var line1 = new web2d.PolyLine();
line1.setFrom(95, 95);
line1.setTo(165, 135);
line1.setStyle("Curved");
overflowWorkspace.append(line1);
var line1 = new web2d.PolyLine();
line1.setFrom(95, 90);
line1.setTo(160, 20);
line1.setStyle("Straight");
overflowWorkspace.append(line1);
var line1 = new web2d.PolyLine();
line1.setFrom(95, 90);
line1.setTo(160, 50);
line1.setStyle("Straight");
overflowWorkspace.append(line1);
var line1 = new web2d.PolyLine();
line1.setFrom(90, 90);
line1.setTo(20, 20);
overflowWorkspace.append(line1);
var line1 = new web2d.PolyLine();
line1.setFrom(90, 90);
line1.setTo(20, 50);
overflowWorkspace.append(line1);
var line1 = new web2d.PolyLine();
line1.setFrom(90, 95);
line1.setTo(20, 165);
overflowWorkspace.append(line1);
var line1 = new web2d.PolyLine();
line1.setFrom(90, 95);
line1.setTo(20, 135);
overflowWorkspace.append(line1);
overflowWorkspace.addItAsChildTo($('#multipleLineExample'));
}
</script>
</head> </head>
<body onload="initialize();"> <body>
<h1>PolyLines Render Tests </h1> <h1>PolyLines Render Tests </h1>
<table> <table>

Some files were not shown because too many files have changed in this diff Show More