mirror of
https://bitbucket.org/wisemapping/wisemapping-frontend.git
synced 2024-11-26 08:04:56 +01:00
Enable eslit for mindplot
This commit is contained in:
parent
b25fe345ae
commit
9457ca6047
11
packages/mindplot/.eslintrc.json
Normal file
11
packages/mindplot/.eslintrc.json
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"env": {
|
||||||
|
"browser": true,
|
||||||
|
"commonjs": true
|
||||||
|
},
|
||||||
|
"extends": [
|
||||||
|
"airbnb-base"
|
||||||
|
],
|
||||||
|
"plugins": ["only-warn"],
|
||||||
|
"rules": {}
|
||||||
|
}
|
@ -17,95 +17,95 @@
|
|||||||
*/
|
*/
|
||||||
const Events = require('./Events').default;
|
const Events = require('./Events').default;
|
||||||
|
|
||||||
//noinspection JSUnusedLocalSymbols
|
// noinspection JSUnusedLocalSymbols
|
||||||
const ActionDispatcher = new Class({
|
const ActionDispatcher = new Class({
|
||||||
Implements:[Events],
|
Implements: [Events],
|
||||||
initialize: function(commandContext) {
|
initialize(commandContext) {
|
||||||
$assert(commandContext, "commandContext can not be null");
|
$assert(commandContext, 'commandContext can not be null');
|
||||||
},
|
},
|
||||||
|
|
||||||
addRelationship: function(model, mindmap) {
|
addRelationship(model, mindmap) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
},
|
},
|
||||||
|
|
||||||
addTopics: function(models, parentTopicId) {
|
addTopics(models, parentTopicId) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
},
|
},
|
||||||
|
|
||||||
deleteEntities: function(topicsIds, relIds) {
|
deleteEntities(topicsIds, relIds) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
},
|
},
|
||||||
|
|
||||||
dragTopic: function(topicId, position, order, parentTopic) {
|
dragTopic(topicId, position, order, parentTopic) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
},
|
},
|
||||||
|
|
||||||
moveTopic: function(topicId, position) {
|
moveTopic(topicId, position) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
},
|
},
|
||||||
|
|
||||||
moveControlPoint: function(ctrlPoint, point) {
|
moveControlPoint(ctrlPoint, point) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
},
|
},
|
||||||
|
|
||||||
changeFontFamilyToTopic: function(topicIds, fontFamily) {
|
changeFontFamilyToTopic(topicIds, fontFamily) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
},
|
},
|
||||||
|
|
||||||
changeFontStyleToTopic: function(topicsIds) {
|
changeFontStyleToTopic(topicsIds) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
},
|
},
|
||||||
|
|
||||||
changeFontColorToTopic: function(topicsIds, color) {
|
changeFontColorToTopic(topicsIds, color) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
},
|
},
|
||||||
|
|
||||||
changeFontSizeToTopic : function(topicsIds, size) {
|
changeFontSizeToTopic(topicsIds, size) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
},
|
},
|
||||||
|
|
||||||
changeBackgroundColorToTopic: function(topicsIds, color) {
|
changeBackgroundColorToTopic(topicsIds, color) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
},
|
},
|
||||||
|
|
||||||
changeBorderColorToTopic: function(topicsIds, color) {
|
changeBorderColorToTopic(topicsIds, color) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
},
|
},
|
||||||
|
|
||||||
changeShapeTypeToTopic : function(topicsIds, shapeType) {
|
changeShapeTypeToTopic(topicsIds, shapeType) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
},
|
},
|
||||||
|
|
||||||
changeFontWeightToTopic : function(topicsIds) {
|
changeFontWeightToTopic(topicsIds) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
},
|
},
|
||||||
|
|
||||||
changeTextToTopic : function(topicsIds, text) {
|
changeTextToTopic(topicsIds, text) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
},
|
},
|
||||||
|
|
||||||
shrinkBranch : function(topicsIds, collapse) {
|
shrinkBranch(topicsIds, collapse) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
},
|
},
|
||||||
|
|
||||||
addFeatureToTopic : function(topicId, type, attributes) {
|
addFeatureToTopic(topicId, type, attributes) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
},
|
},
|
||||||
|
|
||||||
changeFeatureToTopic : function(topicId, featureId, attributes) {
|
changeFeatureToTopic(topicId, featureId, attributes) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
},
|
},
|
||||||
|
|
||||||
removeFeatureFromTopic : function(topicId, featureId) {
|
removeFeatureFromTopic(topicId, featureId) {
|
||||||
throw "method must be implemented.";
|
throw 'method must be implemented.';
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
ActionDispatcher.setInstance = function(dispatcher) {
|
ActionDispatcher.setInstance = function (dispatcher) {
|
||||||
ActionDispatcher._instance = dispatcher;
|
ActionDispatcher._instance = dispatcher;
|
||||||
};
|
};
|
||||||
|
|
||||||
ActionDispatcher.getInstance = function() {
|
ActionDispatcher.getInstance = function () {
|
||||||
return ActionDispatcher._instance;
|
return ActionDispatcher._instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -18,47 +18,47 @@
|
|||||||
const Icon = require('./Icon').default;
|
const Icon = require('./Icon').default;
|
||||||
|
|
||||||
const ActionIcon = new Class({
|
const ActionIcon = new Class({
|
||||||
Extends:Icon,
|
Extends: Icon,
|
||||||
initialize: function(topic, url) {
|
initialize(topic, url) {
|
||||||
this.parent(url);
|
this.parent(url);
|
||||||
this._node = topic;
|
this._node = topic;
|
||||||
},
|
},
|
||||||
getNode:function() {
|
getNode() {
|
||||||
return this._node;
|
return this._node;
|
||||||
},
|
},
|
||||||
|
|
||||||
setPosition:function(x, y) {
|
setPosition(x, y) {
|
||||||
var 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:function(event, fn) {
|
addEvent(event, fn) {
|
||||||
this.getImage().addEvent(event, fn);
|
this.getImage().addEvent(event, fn);
|
||||||
},
|
},
|
||||||
|
|
||||||
addToGroup:function(group) {
|
addToGroup(group) {
|
||||||
group.append(this.getImage());
|
group.append(this.getImage());
|
||||||
},
|
},
|
||||||
|
|
||||||
setVisibility:function(visible) {
|
setVisibility(visible) {
|
||||||
this.getImage().setVisibility(visible);
|
this.getImage().setVisibility(visible);
|
||||||
},
|
},
|
||||||
|
|
||||||
isVisible:function() {
|
isVisible() {
|
||||||
return this.getImage().isVisible();
|
return this.getImage().isVisible();
|
||||||
},
|
},
|
||||||
|
|
||||||
setCursor:function(cursor) {
|
setCursor(cursor) {
|
||||||
return this.getImage().setCursor(cursor);
|
return this.getImage().setCursor(cursor);
|
||||||
},
|
},
|
||||||
|
|
||||||
moveToBack:function(cursor) {
|
moveToBack(cursor) {
|
||||||
return this.getImage().moveToBack(cursor);
|
return this.getImage().moveToBack(cursor);
|
||||||
},
|
},
|
||||||
|
|
||||||
moveToFront:function(cursor) {
|
moveToFront(cursor) {
|
||||||
return this.getImage().moveToFront(cursor);
|
return this.getImage().moveToFront(cursor);
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default ActionIcon;
|
export default ActionIcon;
|
||||||
|
@ -16,12 +16,13 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
const Core = require('@wismapping/core-js');
|
const Core = require('@wismapping/core-js');
|
||||||
|
|
||||||
const core = Core();
|
const core = Core();
|
||||||
const Topic = require('./Topic').default;
|
const Topic = require('./Topic').default;
|
||||||
const Shape = require('./util/Shape').default;
|
const Shape = require('./util/Shape').default;
|
||||||
|
|
||||||
const CentralTopic = new Class(
|
const CentralTopic = new Class(
|
||||||
/** @lends CentralTopic*/ {
|
/** @lends CentralTopic */ {
|
||||||
Extends: Topic,
|
Extends: Topic,
|
||||||
/**
|
/**
|
||||||
* @extends mindplot.Topic
|
* @extends mindplot.Topic
|
||||||
@ -29,53 +30,53 @@ const CentralTopic = new Class(
|
|||||||
* @param model
|
* @param model
|
||||||
* @param options
|
* @param options
|
||||||
*/
|
*/
|
||||||
initialize: function (model, options) {
|
initialize(model, options) {
|
||||||
this.parent(model, options);
|
this.parent(model, options);
|
||||||
},
|
},
|
||||||
|
|
||||||
_registerEvents: function () {
|
_registerEvents() {
|
||||||
this.parent();
|
this.parent();
|
||||||
|
|
||||||
// This disable the drag of the central topic. But solves the problem of deselecting the nodes when the screen is clicked.
|
// This disable the drag of the central topic. But solves the problem of deselecting the nodes when the screen is clicked.
|
||||||
this.addEvent('mousedown', function (event) {
|
this.addEvent('mousedown', (event) => {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
workoutIncomingConnectionPoint: function () {
|
workoutIncomingConnectionPoint() {
|
||||||
return this.getPosition();
|
return this.getPosition();
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setCursor: function (type) {
|
setCursor(type) {
|
||||||
type = type == 'move' ? 'default' : type;
|
type = type == 'move' ? 'default' : type;
|
||||||
this.parent(type);
|
this.parent(type);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
updateTopicShape: function () {},
|
updateTopicShape() {},
|
||||||
|
|
||||||
_updatePositionOnChangeSize: function () {
|
_updatePositionOnChangeSize() {
|
||||||
// Center main topic ...
|
// Center main topic ...
|
||||||
var zeroPoint = new core.Point(0, 0);
|
const zeroPoint = new core.Point(0, 0);
|
||||||
this.setPosition(zeroPoint);
|
this.setPosition(zeroPoint);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getShrinkConnector: function () {
|
getShrinkConnector() {
|
||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
workoutOutgoingConnectionPoint: function (targetPosition) {
|
workoutOutgoingConnectionPoint(targetPosition) {
|
||||||
$assert(targetPosition, 'targetPoint can not be null');
|
$assert(targetPosition, 'targetPoint can not be null');
|
||||||
var pos = this.getPosition();
|
const pos = this.getPosition();
|
||||||
var isAtRight = Shape.isAtRight(targetPosition, pos);
|
const isAtRight = Shape.isAtRight(targetPosition, pos);
|
||||||
var 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;
|
||||||
|
@ -21,46 +21,40 @@ const Command = new Class(/** @lends mindplot.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: function()
|
initialize() {
|
||||||
{
|
|
||||||
this._id = Command._nextUUID();
|
this._id = Command._nextUUID();
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @abstract
|
* @abstract
|
||||||
*/
|
*/
|
||||||
execute: function(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
|
||||||
* @abstract
|
* @abstract
|
||||||
*/
|
*/
|
||||||
undoExecute: function(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
|
||||||
* @returns {Number} command id
|
* @returns {Number} command id
|
||||||
*/
|
*/
|
||||||
getId:function()
|
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 = Command._uuid + 1;
|
Command._uuid += 1;
|
||||||
return Command._uuid;
|
return Command._uuid;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -16,8 +16,10 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
const Core = require('@wismapping/core-js');
|
const Core = require('@wismapping/core-js');
|
||||||
|
|
||||||
const core = Core();
|
const core = Core();
|
||||||
const web2D = require('@wismapping/web2d');
|
const web2D = require('@wismapping/web2d');
|
||||||
|
|
||||||
const web2d = web2D();
|
const web2d = web2D();
|
||||||
|
|
||||||
const INodeModel = require('./model/INodeModel').default;
|
const INodeModel = require('./model/INodeModel').default;
|
||||||
@ -25,7 +27,7 @@ const { TopicShape } = require('./model/INodeModel');
|
|||||||
const Topic = require('./Topic').default;
|
const Topic = require('./Topic').default;
|
||||||
|
|
||||||
const ConnectionLine = new Class({
|
const ConnectionLine = new Class({
|
||||||
initialize: function (sourceNode, targetNode, lineType) {
|
initialize(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');
|
||||||
@ -33,8 +35,8 @@ const ConnectionLine = new Class({
|
|||||||
this._targetTopic = targetNode;
|
this._targetTopic = targetNode;
|
||||||
this._sourceTopic = sourceNode;
|
this._sourceTopic = sourceNode;
|
||||||
|
|
||||||
var line;
|
let line;
|
||||||
var ctrlPoints = this._getCtrlPoints(sourceNode, targetNode);
|
const ctrlPoints = this._getCtrlPoints(sourceNode, targetNode);
|
||||||
if (targetNode.getType() == INodeModel.CENTRAL_TOPIC_TYPE) {
|
if (targetNode.getType() == INodeModel.CENTRAL_TOPIC_TYPE) {
|
||||||
line = this._createLine(lineType, ConnectionLine.CURVED);
|
line = this._createLine(lineType, ConnectionLine.CURVED);
|
||||||
line.setSrcControlPoint(ctrlPoints[0]);
|
line.setSrcControlPoint(ctrlPoints[0]);
|
||||||
@ -45,27 +47,27 @@ const ConnectionLine = new Class({
|
|||||||
line.setDestControlPoint(ctrlPoints[1]);
|
line.setDestControlPoint(ctrlPoints[1]);
|
||||||
}
|
}
|
||||||
// Set line styles ...
|
// Set line styles ...
|
||||||
var strokeColor = ConnectionLine.getStrokeColor();
|
const strokeColor = ConnectionLine.getStrokeColor();
|
||||||
line.setStroke(1, 'solid', strokeColor, 1);
|
line.setStroke(1, 'solid', strokeColor, 1);
|
||||||
line.setFill(strokeColor, 1);
|
line.setFill(strokeColor, 1);
|
||||||
|
|
||||||
this._line2d = line;
|
this._line2d = line;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getCtrlPoints: function (sourceNode, targetNode) {
|
_getCtrlPoints(sourceNode, targetNode) {
|
||||||
var srcPos = sourceNode.workoutOutgoingConnectionPoint(targetNode.getPosition());
|
const srcPos = sourceNode.workoutOutgoingConnectionPoint(targetNode.getPosition());
|
||||||
var destPos = targetNode.workoutIncomingConnectionPoint(sourceNode.getPosition());
|
const destPos = targetNode.workoutIncomingConnectionPoint(sourceNode.getPosition());
|
||||||
var deltaX = (srcPos.x - destPos.x) / 3;
|
const deltaX = (srcPos.x - destPos.x) / 3;
|
||||||
return [new core.Point(deltaX, 0), new core.Point(-deltaX, 0)];
|
return [new core.Point(deltaX, 0), new core.Point(-deltaX, 0)];
|
||||||
},
|
},
|
||||||
|
|
||||||
_createLine: function (lineType, defaultStyle) {
|
_createLine(lineType, defaultStyle) {
|
||||||
if (!$defined(lineType)) {
|
if (!$defined(lineType)) {
|
||||||
lineType = defaultStyle;
|
lineType = defaultStyle;
|
||||||
}
|
}
|
||||||
lineType = parseInt(lineType);
|
lineType = parseInt(lineType);
|
||||||
this._lineType = lineType;
|
this._lineType = lineType;
|
||||||
var line = null;
|
let line = null;
|
||||||
switch (lineType) {
|
switch (lineType) {
|
||||||
case ConnectionLine.POLYLINE:
|
case ConnectionLine.POLYLINE:
|
||||||
line = new web2d.PolyLine();
|
line = new web2d.PolyLine();
|
||||||
@ -84,27 +86,28 @@ const ConnectionLine = new Class({
|
|||||||
return line;
|
return line;
|
||||||
},
|
},
|
||||||
|
|
||||||
setVisibility: function (value) {
|
setVisibility(value) {
|
||||||
this._line2d.setVisibility(value);
|
this._line2d.setVisibility(value);
|
||||||
},
|
},
|
||||||
|
|
||||||
isVisible: function () {
|
isVisible() {
|
||||||
return this._line2d.isVisible();
|
return this._line2d.isVisible();
|
||||||
},
|
},
|
||||||
|
|
||||||
setOpacity: function (opacity) {
|
setOpacity(opacity) {
|
||||||
this._line2d.setOpacity(opacity);
|
this._line2d.setOpacity(opacity);
|
||||||
},
|
},
|
||||||
|
|
||||||
redraw: function () {
|
redraw() {
|
||||||
var line2d = this._line2d;
|
const line2d = this._line2d;
|
||||||
var sourceTopic = this._sourceTopic;
|
const sourceTopic = this._sourceTopic;
|
||||||
var sourcePosition = sourceTopic.getPosition();
|
const sourcePosition = sourceTopic.getPosition();
|
||||||
|
|
||||||
var targetTopic = this._targetTopic;
|
const targetTopic = this._targetTopic;
|
||||||
var targetPosition = targetTopic.getPosition();
|
const targetPosition = targetTopic.getPosition();
|
||||||
|
|
||||||
var sPos, tPos;
|
let sPos; let
|
||||||
|
tPos;
|
||||||
sPos = sourceTopic.workoutOutgoingConnectionPoint(targetPosition);
|
sPos = sourceTopic.workoutOutgoingConnectionPoint(targetPosition);
|
||||||
tPos = targetTopic.workoutIncomingConnectionPoint(sourcePosition);
|
tPos = targetTopic.workoutIncomingConnectionPoint(sourcePosition);
|
||||||
|
|
||||||
@ -112,7 +115,7 @@ const ConnectionLine = new Class({
|
|||||||
line2d.setTo(sPos.x, sPos.y);
|
line2d.setTo(sPos.x, sPos.y);
|
||||||
|
|
||||||
if (line2d.getType() == 'CurvedLine') {
|
if (line2d.getType() == 'CurvedLine') {
|
||||||
var ctrlPoints = this._getCtrlPoints(this._sourceTopic, this._targetTopic);
|
const ctrlPoints = this._getCtrlPoints(this._sourceTopic, this._targetTopic);
|
||||||
line2d.setSrcControlPoint(ctrlPoints[0]);
|
line2d.setSrcControlPoint(ctrlPoints[0]);
|
||||||
line2d.setDestControlPoint(ctrlPoints[1]);
|
line2d.setDestControlPoint(ctrlPoints[1]);
|
||||||
}
|
}
|
||||||
@ -121,19 +124,20 @@ const ConnectionLine = new Class({
|
|||||||
this._positionateConnector(targetTopic);
|
this._positionateConnector(targetTopic);
|
||||||
},
|
},
|
||||||
|
|
||||||
_positionateConnector: function (targetTopic) {
|
_positionateConnector(targetTopic) {
|
||||||
var targetPosition = targetTopic.getPosition();
|
const targetPosition = targetTopic.getPosition();
|
||||||
var offset = Topic.CONNECTOR_WIDTH / 2;
|
const offset = Topic.CONNECTOR_WIDTH / 2;
|
||||||
var targetTopicSize = targetTopic.getSize();
|
const targetTopicSize = targetTopic.getSize();
|
||||||
var y, x;
|
let y; let
|
||||||
|
x;
|
||||||
if (targetTopic.getShapeType() == TopicShape.LINE) {
|
if (targetTopic.getShapeType() == TopicShape.LINE) {
|
||||||
y = targetTopicSize.height;
|
y = targetTopicSize.height;
|
||||||
} else {
|
} else {
|
||||||
y = targetTopicSize.height / 2;
|
y = targetTopicSize.height / 2;
|
||||||
}
|
}
|
||||||
y = y - offset;
|
y -= offset;
|
||||||
|
|
||||||
var connector = targetTopic.getShrinkConnector();
|
const connector = targetTopic.getShrinkConnector();
|
||||||
if ($defined(connector)) {
|
if ($defined(connector)) {
|
||||||
if (Math.sign(targetPosition.x) > 0) {
|
if (Math.sign(targetPosition.x) > 0) {
|
||||||
x = targetTopicSize.width;
|
x = targetTopicSize.width;
|
||||||
@ -145,56 +149,56 @@ const ConnectionLine = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
setStroke: function (color, style, opacity) {
|
setStroke(color, style, opacity) {
|
||||||
this._line2d.setStroke(null, null, color, opacity);
|
this._line2d.setStroke(null, null, color, opacity);
|
||||||
},
|
},
|
||||||
|
|
||||||
addToWorkspace: function (workspace) {
|
addToWorkspace(workspace) {
|
||||||
workspace.append(this._line2d);
|
workspace.append(this._line2d);
|
||||||
this._line2d.moveToBack();
|
this._line2d.moveToBack();
|
||||||
},
|
},
|
||||||
|
|
||||||
removeFromWorkspace: function (workspace) {
|
removeFromWorkspace(workspace) {
|
||||||
workspace.removeChild(this._line2d);
|
workspace.removeChild(this._line2d);
|
||||||
},
|
},
|
||||||
|
|
||||||
getTargetTopic: function () {
|
getTargetTopic() {
|
||||||
return this._targetTopic;
|
return this._targetTopic;
|
||||||
},
|
},
|
||||||
|
|
||||||
getSourceTopic: function () {
|
getSourceTopic() {
|
||||||
return this._sourceTopic;
|
return this._sourceTopic;
|
||||||
},
|
},
|
||||||
|
|
||||||
getLineType: function () {
|
getLineType() {
|
||||||
return this._lineType;
|
return this._lineType;
|
||||||
},
|
},
|
||||||
|
|
||||||
getLine: function () {
|
getLine() {
|
||||||
return this._line2d;
|
return this._line2d;
|
||||||
},
|
},
|
||||||
|
|
||||||
getModel: function () {
|
getModel() {
|
||||||
return this._model;
|
return this._model;
|
||||||
},
|
},
|
||||||
|
|
||||||
setModel: function (model) {
|
setModel(model) {
|
||||||
this._model = model;
|
this._model = model;
|
||||||
},
|
},
|
||||||
|
|
||||||
getType: function () {
|
getType() {
|
||||||
return 'ConnectionLine';
|
return 'ConnectionLine';
|
||||||
},
|
},
|
||||||
|
|
||||||
getId: function () {
|
getId() {
|
||||||
return this._model.getId();
|
return this._model.getId();
|
||||||
},
|
},
|
||||||
|
|
||||||
moveToBack: function () {
|
moveToBack() {
|
||||||
this._line2d.moveToBack();
|
this._line2d.moveToBack();
|
||||||
},
|
},
|
||||||
|
|
||||||
moveToFront: function () {
|
moveToFront() {
|
||||||
this._line2d.moveToFront();
|
this._line2d.moveToFront();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -15,62 +15,64 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const Core = require('@wismapping/core-js')
|
const Core = require('@wismapping/core-js');
|
||||||
|
|
||||||
const core = Core();
|
const core = Core();
|
||||||
const web2D = require('@wismapping/web2d')
|
const web2D = require('@wismapping/web2d');
|
||||||
|
|
||||||
const web2d = web2D();
|
const web2d = web2D();
|
||||||
|
|
||||||
const Shape = require('./util/Shape').default
|
const Shape = require('./util/Shape').default;
|
||||||
const ActionDispatcher = require('./ActionDispatcher').default;
|
const ActionDispatcher = require('./ActionDispatcher').default;
|
||||||
|
|
||||||
const ControlPoint = new Class({
|
const ControlPoint = new Class({
|
||||||
initialize: function () {
|
initialize() {
|
||||||
var control1 = new web2d.Elipse({
|
const control1 = new web2d.Elipse({
|
||||||
width: 6,
|
width: 6,
|
||||||
height: 6,
|
height: 6,
|
||||||
stroke: '1 solid #6589de',
|
stroke: '1 solid #6589de',
|
||||||
fillColor: 'gray',
|
fillColor: 'gray',
|
||||||
visibility: false
|
visibility: false,
|
||||||
});
|
});
|
||||||
control1.setCursor('pointer');
|
control1.setCursor('pointer');
|
||||||
|
|
||||||
var control2 = new web2d.Elipse({
|
const control2 = new web2d.Elipse({
|
||||||
width: 6,
|
width: 6,
|
||||||
height: 6,
|
height: 6,
|
||||||
stroke: '1 solid #6589de',
|
stroke: '1 solid #6589de',
|
||||||
fillColor: 'gray',
|
fillColor: 'gray',
|
||||||
visibility: false
|
visibility: false,
|
||||||
});
|
});
|
||||||
control2.setCursor('pointer');
|
control2.setCursor('pointer');
|
||||||
|
|
||||||
this._controlPointsController = [control1, control2];
|
this._controlPointsController = [control1, control2];
|
||||||
this._controlLines = [new web2d.Line({strokeColor: "#6589de", strokeWidth: 1, opacity: 0.3}),
|
this._controlLines = [new web2d.Line({ strokeColor: '#6589de', strokeWidth: 1, opacity: 0.3 }),
|
||||||
new web2d.Line({strokeColor: "#6589de", strokeWidth: 1, opacity: 0.3})];
|
new web2d.Line({ strokeColor: '#6589de', strokeWidth: 1, opacity: 0.3 })];
|
||||||
|
|
||||||
this._isBinded = false;
|
this._isBinded = false;
|
||||||
var me = this;
|
const me = this;
|
||||||
this._controlPointsController[0].addEvent('mousedown', function (event) {
|
this._controlPointsController[0].addEvent('mousedown', (event) => {
|
||||||
(me._mouseDown)(event, ControlPoint.FROM, me);
|
(me._mouseDown)(event, ControlPoint.FROM, me);
|
||||||
});
|
});
|
||||||
this._controlPointsController[0].addEvent('click', function (event) {
|
this._controlPointsController[0].addEvent('click', (event) => {
|
||||||
(me._mouseClick)(event);
|
(me._mouseClick)(event);
|
||||||
});
|
});
|
||||||
this._controlPointsController[0].addEvent('dblclick', function (event) {
|
this._controlPointsController[0].addEvent('dblclick', (event) => {
|
||||||
(me._mouseClick)(event);
|
(me._mouseClick)(event);
|
||||||
});
|
});
|
||||||
|
|
||||||
this._controlPointsController[1].addEvent('mousedown', function (event) {
|
this._controlPointsController[1].addEvent('mousedown', (event) => {
|
||||||
(me._mouseDown)(event, ControlPoint.TO, me);
|
(me._mouseDown)(event, ControlPoint.TO, me);
|
||||||
});
|
});
|
||||||
this._controlPointsController[1].addEvent('click', function (event) {
|
this._controlPointsController[1].addEvent('click', (event) => {
|
||||||
(me._mouseClick)(event);
|
(me._mouseClick)(event);
|
||||||
});
|
});
|
||||||
this._controlPointsController[1].addEvent('dblclick', function (event) {
|
this._controlPointsController[1].addEvent('dblclick', (event) => {
|
||||||
(me._mouseClick)(event);
|
(me._mouseClick)(event);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
setLine: function (line) {
|
setLine(line) {
|
||||||
if ($defined(this._line)) {
|
if ($defined(this._line)) {
|
||||||
this._removeLine();
|
this._removeLine();
|
||||||
}
|
}
|
||||||
@ -84,14 +86,13 @@ const ControlPoint = new Class({
|
|||||||
this._endPoint[1] = this._line.getLine().getTo().clone();
|
this._endPoint[1] = this._line.getLine().getTo().clone();
|
||||||
},
|
},
|
||||||
|
|
||||||
redraw: function () {
|
redraw() {
|
||||||
if ($defined(this._line))
|
if ($defined(this._line)) this._createControlPoint();
|
||||||
this._createControlPoint();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_createControlPoint: function () {
|
_createControlPoint() {
|
||||||
this._controls = this._line.getLine().getControlPoints();
|
this._controls = this._line.getLine().getControlPoints();
|
||||||
var pos = this._line.getLine().getFrom();
|
let pos = this._line.getLine().getFrom();
|
||||||
this._controlPointsController[0].setPosition(this._controls[ControlPoint.FROM].x + pos.x, this._controls[ControlPoint.FROM].y + pos.y - 3);
|
this._controlPointsController[0].setPosition(this._controls[ControlPoint.FROM].x + pos.x, this._controls[ControlPoint.FROM].y + pos.y - 3);
|
||||||
this._controlLines[0].setFrom(pos.x, pos.y);
|
this._controlLines[0].setFrom(pos.x, pos.y);
|
||||||
this._controlLines[0].setTo(this._controls[ControlPoint.FROM].x + pos.x + 3, this._controls[ControlPoint.FROM].y + pos.y);
|
this._controlLines[0].setTo(this._controls[ControlPoint.FROM].x + pos.x + 3, this._controls[ControlPoint.FROM].y + pos.y);
|
||||||
@ -99,14 +100,13 @@ const ControlPoint = new Class({
|
|||||||
this._controlLines[1].setFrom(pos.x, pos.y);
|
this._controlLines[1].setFrom(pos.x, pos.y);
|
||||||
this._controlLines[1].setTo(this._controls[ControlPoint.TO].x + pos.x + 3, this._controls[ControlPoint.TO].y + pos.y);
|
this._controlLines[1].setTo(this._controls[ControlPoint.TO].x + pos.x + 3, this._controls[ControlPoint.TO].y + pos.y);
|
||||||
this._controlPointsController[1].setPosition(this._controls[ControlPoint.TO].x + pos.x, this._controls[ControlPoint.TO].y + pos.y - 3);
|
this._controlPointsController[1].setPosition(this._controls[ControlPoint.TO].x + pos.x, this._controls[ControlPoint.TO].y + pos.y - 3);
|
||||||
|
},
|
||||||
|
|
||||||
|
_removeLine() {
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_removeLine: function () {
|
_mouseDown(event, point, me) {
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
_mouseDown: function (event, point, me) {
|
|
||||||
if (!this._isBinded) {
|
if (!this._isBinded) {
|
||||||
this._isBinded = true;
|
this._isBinded = true;
|
||||||
this._mouseMoveFunction = function (event) {
|
this._mouseMoveFunction = function (event) {
|
||||||
@ -124,11 +124,11 @@ const ControlPoint = new Class({
|
|||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
_mouseMoveEvent: function (event, point) {
|
_mouseMoveEvent(event, point) {
|
||||||
var screen = this._workspace.getScreenManager();
|
const screen = this._workspace.getScreenManager();
|
||||||
var pos = screen.getWorkspaceMousePosition(event);
|
const pos = screen.getWorkspaceMousePosition(event);
|
||||||
|
|
||||||
var cords;
|
let cords;
|
||||||
if (point == 0) {
|
if (point == 0) {
|
||||||
cords = Shape.calculateRelationShipPointCoordinates(this._line.getSourceTopic(), pos);
|
cords = Shape.calculateRelationShipPointCoordinates(this._line.getSourceTopic(), pos);
|
||||||
this._line.setFrom(cords.x, cords.y);
|
this._line.setFrom(cords.x, cords.y);
|
||||||
@ -145,25 +145,24 @@ 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: function (event, point) {
|
_mouseUp(event, point) {
|
||||||
this._workspace.getScreenManager().removeEvent('mousemove', this._mouseMoveFunction);
|
this._workspace.getScreenManager().removeEvent('mousemove', this._mouseMoveFunction);
|
||||||
this._workspace.getScreenManager().removeEvent('mouseup', this._mouseUpFunction);
|
this._workspace.getScreenManager().removeEvent('mouseup', this._mouseUpFunction);
|
||||||
|
|
||||||
var actionDispatcher = ActionDispatcher.getInstance();
|
const actionDispatcher = ActionDispatcher.getInstance();
|
||||||
actionDispatcher.moveControlPoint(this, point);
|
actionDispatcher.moveControlPoint(this, point);
|
||||||
this._isBinded = false;
|
this._isBinded = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
_mouseClick: function (event) {
|
_mouseClick(event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
setVisibility: function (visible) {
|
setVisibility(visible) {
|
||||||
if (visible) {
|
if (visible) {
|
||||||
this._controlLines[0].moveToFront();
|
this._controlLines[0].moveToFront();
|
||||||
this._controlLines[1].moveToFront();
|
this._controlLines[1].moveToFront();
|
||||||
@ -176,7 +175,7 @@ const ControlPoint = new Class({
|
|||||||
this._controlLines[1].setVisibility(visible);
|
this._controlLines[1].setVisibility(visible);
|
||||||
},
|
},
|
||||||
|
|
||||||
addToWorkspace: function (workspace) {
|
addToWorkspace(workspace) {
|
||||||
this._workspace = workspace;
|
this._workspace = workspace;
|
||||||
workspace.append(this._controlPointsController[0]);
|
workspace.append(this._controlPointsController[0]);
|
||||||
workspace.append(this._controlPointsController[1]);
|
workspace.append(this._controlPointsController[1]);
|
||||||
@ -184,7 +183,7 @@ const ControlPoint = new Class({
|
|||||||
workspace.append(this._controlLines[1]);
|
workspace.append(this._controlLines[1]);
|
||||||
},
|
},
|
||||||
|
|
||||||
removeFromWorkspace: function (workspace) {
|
removeFromWorkspace(workspace) {
|
||||||
this._workspace = null;
|
this._workspace = null;
|
||||||
workspace.removeChild(this._controlPointsController[0]);
|
workspace.removeChild(this._controlPointsController[0]);
|
||||||
workspace.removeChild(this._controlPointsController[1]);
|
workspace.removeChild(this._controlPointsController[1]);
|
||||||
@ -192,17 +191,17 @@ const ControlPoint = new Class({
|
|||||||
workspace.removeChild(this._controlLines[1]);
|
workspace.removeChild(this._controlLines[1]);
|
||||||
},
|
},
|
||||||
|
|
||||||
getControlPoint: function (index) {
|
getControlPoint(index) {
|
||||||
return this._controls[index];
|
return this._controls[index];
|
||||||
},
|
},
|
||||||
|
|
||||||
getOriginalEndPoint: function (index) {
|
getOriginalEndPoint(index) {
|
||||||
return this._endPoint[index];
|
return this._endPoint[index];
|
||||||
},
|
},
|
||||||
|
|
||||||
getOriginalCtrlPoint: function (index) {
|
getOriginalCtrlPoint(index) {
|
||||||
return this._orignalCtrlPoint[index];
|
return this._orignalCtrlPoint[index];
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
ControlPoint.FROM = 0;
|
ControlPoint.FROM = 0;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -19,40 +19,38 @@ const DesignerUndoManager = require('./DesignerUndoManager').default;
|
|||||||
const EventBus = require('./layout/EventBus').default;
|
const EventBus = require('./layout/EventBus').default;
|
||||||
|
|
||||||
const DesignerActionRunner = new Class({
|
const DesignerActionRunner = new Class({
|
||||||
initialize: function (commandContext, notifier) {
|
initialize(commandContext, notifier) {
|
||||||
$assert(commandContext, "commandContext can not be null");
|
$assert(commandContext, 'commandContext can not be null');
|
||||||
|
|
||||||
this._undoManager = new DesignerUndoManager();
|
this._undoManager = new DesignerUndoManager();
|
||||||
this._context = commandContext;
|
this._context = commandContext;
|
||||||
this._notifier = notifier;
|
this._notifier = notifier;
|
||||||
},
|
},
|
||||||
|
|
||||||
execute: function (command) {
|
execute(command) {
|
||||||
$assert(command, "command can not be null");
|
$assert(command, 'command can not be null');
|
||||||
command.execute(this._context);
|
command.execute(this._context);
|
||||||
this._undoManager.enqueue(command);
|
this._undoManager.enqueue(command);
|
||||||
this.fireChangeEvent();
|
this.fireChangeEvent();
|
||||||
EventBus.instance.fireEvent(EventBus.events.DoLayout);
|
EventBus.instance.fireEvent(EventBus.events.DoLayout);
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
undo: function () {
|
undo() {
|
||||||
this._undoManager.execUndo(this._context);
|
this._undoManager.execUndo(this._context);
|
||||||
this.fireChangeEvent();
|
this.fireChangeEvent();
|
||||||
EventBus.instance.fireEvent(EventBus.events.DoLayout);
|
EventBus.instance.fireEvent(EventBus.events.DoLayout);
|
||||||
},
|
},
|
||||||
|
|
||||||
redo: function () {
|
redo() {
|
||||||
this._undoManager.execRedo(this._context);
|
this._undoManager.execRedo(this._context);
|
||||||
this.fireChangeEvent();
|
this.fireChangeEvent();
|
||||||
EventBus.instance.fireEvent(EventBus.events.DoLayout);
|
EventBus.instance.fireEvent(EventBus.events.DoLayout);
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
fireChangeEvent: function () {
|
fireChangeEvent() {
|
||||||
var event = this._undoManager.buildEvent();
|
const event = this._undoManager.buildEvent();
|
||||||
this._notifier.fireEvent("modelUpdate", event);
|
this._notifier.fireEvent('modelUpdate', event);
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default DesignerActionRunner;
|
export default DesignerActionRunner;
|
||||||
|
@ -19,243 +19,234 @@ const Keyboard = require('./Keyboard').default;
|
|||||||
|
|
||||||
const DesignerKeyboard = new Class({
|
const DesignerKeyboard = new Class({
|
||||||
Extends: Keyboard,
|
Extends: Keyboard,
|
||||||
Static:{
|
Static: {
|
||||||
register:function (designer) {
|
register(designer) {
|
||||||
this._instance = new DesignerKeyboard(designer);
|
this._instance = new DesignerKeyboard(designer);
|
||||||
},
|
},
|
||||||
|
|
||||||
getInstance:function () {
|
getInstance() {
|
||||||
return this._instance;
|
return this._instance;
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
initialize:function (designer) {
|
initialize(designer) {
|
||||||
$assert(designer, "designer can not be null");
|
$assert(designer, 'designer can not be null');
|
||||||
this._registerEvents(designer);
|
this._registerEvents(designer);
|
||||||
},
|
},
|
||||||
|
|
||||||
_registerEvents:function (designer) {
|
_registerEvents(designer) {
|
||||||
|
|
||||||
// Try with the keyboard ..
|
// Try with the keyboard ..
|
||||||
var model = designer.getModel();
|
const model = designer.getModel();
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['backspace'], function (event) {
|
['backspace'], (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
designer.deleteSelectedEntities();
|
designer.deleteSelectedEntities();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['space'], function() {
|
['space'], () => {
|
||||||
designer.shrinkSelectedBranch();
|
designer.shrinkSelectedBranch();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['f2'],function(event) {
|
['f2'], (event) => {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
var node = model.selectedTopic();
|
const node = model.selectedTopic();
|
||||||
if (node) {
|
if (node) {
|
||||||
node.showTextEditor();
|
node.showTextEditor();
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['del'], function(event) {
|
['del'], (event) => {
|
||||||
designer.deleteSelectedEntities();
|
designer.deleteSelectedEntities();
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['enter'], function() {
|
['enter'], () => {
|
||||||
designer.createSiblingForSelectedNode();
|
designer.createSiblingForSelectedNode();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['insert'], function(event) {
|
['insert'], (event) => {
|
||||||
designer.createChildForSelectedNode();
|
designer.createChildForSelectedNode();
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['tab'], function(event) {
|
['tab'], (event) => {
|
||||||
designer.createChildForSelectedNode();
|
designer.createChildForSelectedNode();
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['meta+enter'], function(event) {
|
['meta+enter'], (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
designer.createChildForSelectedNode();
|
designer.createChildForSelectedNode();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['ctrl+z', 'meta+z'], function(event) {
|
['ctrl+z', 'meta+z'], (event) => {
|
||||||
event.preventDefault(event);
|
event.preventDefault(event);
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
designer.undo();
|
designer.undo();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['ctrl+c', 'meta+c'], function (event) {
|
['ctrl+c', 'meta+c'], (event) => {
|
||||||
event.preventDefault(event);
|
event.preventDefault(event);
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
designer.copyToClipboard();
|
designer.copyToClipboard();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['ctrl+v', 'meta+v'], function (event) {
|
['ctrl+v', 'meta+v'], (event) => {
|
||||||
event.preventDefault(event);
|
event.preventDefault(event);
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
designer.pasteClipboard();
|
designer.pasteClipboard();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['ctrl+shift+z', 'meta+shift+z', 'ctrl+y', 'meta+y'], function (event) {
|
['ctrl+shift+z', 'meta+shift+z', 'ctrl+y', 'meta+y'], (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
designer.redo();
|
designer.redo();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['ctrl+a', 'meta+a'], function (event) {
|
['ctrl+a', 'meta+a'], (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
designer.selectAll();
|
designer.selectAll();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['ctrl+b', 'meta+b'], function (event) {
|
['ctrl+b', 'meta+b'], (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
designer.changeFontWeight();
|
designer.changeFontWeight();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['ctrl+s', 'meta+s'], function (event) {
|
['ctrl+s', 'meta+s'], (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
$(document).find('#save').trigger('click');
|
$(document).find('#save').trigger('click');
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['ctrl+i', 'meta+i'], function (event) {
|
['ctrl+i', 'meta+i'], (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
designer.changeFontStyle();
|
designer.changeFontStyle();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['ctrl+shift+a', 'meta+shift+a'], function (event) {
|
['ctrl+shift+a', 'meta+shift+a'], (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
designer.deselectAll();
|
designer.deselectAll();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['meta+=', 'ctrl+='], function (event) {
|
['meta+=', 'ctrl+='], (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
designer.zoomIn();
|
designer.zoomIn();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
['meta+-', 'ctrl+-'], function (event) {
|
['meta+-', 'ctrl+-'], (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
designer.zoomOut();
|
designer.zoomOut();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
var me = this;
|
const me = this;
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
'right', function (event) {
|
'right', (event) => {
|
||||||
var node = model.selectedTopic();
|
const node = model.selectedTopic();
|
||||||
if (node) {
|
if (node) {
|
||||||
if (node.isCentralTopic()) {
|
if (node.isCentralTopic()) {
|
||||||
me._goToSideChild(designer, node, 'RIGHT');
|
me._goToSideChild(designer, node, 'RIGHT');
|
||||||
}
|
} else if (node.getPosition().x < 0) {
|
||||||
else {
|
|
||||||
if (node.getPosition().x < 0) {
|
|
||||||
me._goToParent(designer, node);
|
me._goToParent(designer, node);
|
||||||
}
|
} else if (!node.areChildrenShrunken()) {
|
||||||
else if (!node.areChildrenShrunken()) {
|
|
||||||
me._goToChild(designer, node);
|
me._goToChild(designer, node);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
var centralTopic = model.getCentralTopic();
|
const centralTopic = model.getCentralTopic();
|
||||||
me._goToNode(designer, centralTopic);
|
me._goToNode(designer, centralTopic);
|
||||||
}
|
}
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
'left', function (event) {
|
'left', (event) => {
|
||||||
var node = model.selectedTopic();
|
const node = model.selectedTopic();
|
||||||
if (node) {
|
if (node) {
|
||||||
if (node.isCentralTopic()) {
|
if (node.isCentralTopic()) {
|
||||||
me._goToSideChild(designer, node, 'LEFT');
|
me._goToSideChild(designer, node, 'LEFT');
|
||||||
}
|
} else if (node.getPosition().x > 0) {
|
||||||
else {
|
|
||||||
if (node.getPosition().x > 0) {
|
|
||||||
me._goToParent(designer, node);
|
me._goToParent(designer, node);
|
||||||
}
|
} else if (!node.areChildrenShrunken()) {
|
||||||
else if (!node.areChildrenShrunken()) {
|
|
||||||
me._goToChild(designer, node);
|
me._goToChild(designer, node);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
var centralTopic = model.getCentralTopic();
|
const centralTopic = model.getCentralTopic();
|
||||||
me._goToNode(designer, centralTopic);
|
me._goToNode(designer, centralTopic);
|
||||||
}
|
}
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
'up', function (event) {
|
'up', (event) => {
|
||||||
var node = model.selectedTopic();
|
const node = model.selectedTopic();
|
||||||
if (node) {
|
if (node) {
|
||||||
if (!node.isCentralTopic()) {
|
if (!node.isCentralTopic()) {
|
||||||
me._goToBrother(designer, node, 'UP');
|
me._goToBrother(designer, node, 'UP');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var centralTopic = model.getCentralTopic();
|
const centralTopic = model.getCentralTopic();
|
||||||
me._goToNode(designer, centralTopic);
|
me._goToNode(designer, centralTopic);
|
||||||
}
|
}
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
this.addShortcut(
|
this.addShortcut(
|
||||||
'down', function (event) {
|
'down', (event) => {
|
||||||
var node = model.selectedTopic();
|
const node = model.selectedTopic();
|
||||||
if (node) {
|
if (node) {
|
||||||
if (!node.isCentralTopic()) {
|
if (!node.isCentralTopic()) {
|
||||||
me._goToBrother(designer, node, 'DOWN');
|
me._goToBrother(designer, node, 'DOWN');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var centralTopic = model.getCentralTopic();
|
const centralTopic = model.getCentralTopic();
|
||||||
me._goToNode(designer, centralTopic);
|
me._goToNode(designer, centralTopic);
|
||||||
}
|
}
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
var excludes = ['esc', 'escape', 'f1', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11', 'f12'];
|
const excludes = ['esc', 'escape', 'f1', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11', 'f12'];
|
||||||
|
|
||||||
$(document).on('keypress', function (event) {
|
$(document).on('keypress', (event) => {
|
||||||
var keyCode;
|
let keyCode;
|
||||||
// Firefox doesn't skip special keys for keypress event...
|
// Firefox doesn't skip special keys for keypress event...
|
||||||
if (event.key && excludes.contains(event.key.toLowerCase())) {
|
if (event.key && excludes.contains(event.key.toLowerCase())) {
|
||||||
return;
|
return;
|
||||||
@ -267,13 +258,12 @@ const DesignerKeyboard = new Class({
|
|||||||
keyCode = event.keyCode;
|
keyCode = event.keyCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
var specialKey = jQuery.hotkeys.specialKeys[keyCode];
|
const specialKey = jQuery.hotkeys.specialKeys[keyCode];
|
||||||
if (["enter", "capslock"].indexOf(specialKey) == -1 && !jQuery.hotkeys.shiftNums[keyCode]) {
|
if (['enter', 'capslock'].indexOf(specialKey) == -1 && !jQuery.hotkeys.shiftNums[keyCode]) {
|
||||||
var nodes = designer.getModel().filterSelectedTopics();
|
const nodes = designer.getModel().filterSelectedTopics();
|
||||||
if (nodes.length > 0) {
|
if (nodes.length > 0) {
|
||||||
|
|
||||||
// If a modifier is press, the key selected must be ignored.
|
// If a modifier is press, the key selected must be ignored.
|
||||||
var pressKey = String.fromCharCode(keyCode);
|
const pressKey = String.fromCharCode(keyCode);
|
||||||
if (event.ctrlKey || event.altKey || event.metaKey) {
|
if (event.ctrlKey || event.altKey || event.metaKey) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -281,39 +271,36 @@ const DesignerKeyboard = new Class({
|
|||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_goToBrother:function (designer, node, direction) {
|
_goToBrother(designer, node, direction) {
|
||||||
var parent = node.getParent();
|
const parent = node.getParent();
|
||||||
if (parent) {
|
if (parent) {
|
||||||
var brothers = parent.getChildren();
|
const brothers = parent.getChildren();
|
||||||
|
|
||||||
var target = node;
|
let target = node;
|
||||||
var y = node.getPosition().y;
|
const { y } = node.getPosition();
|
||||||
var x = node.getPosition().x;
|
const { x } = node.getPosition();
|
||||||
var dist = null;
|
let dist = null;
|
||||||
for (var i = 0; i < brothers.length; i++) {
|
for (let i = 0; i < brothers.length; i++) {
|
||||||
var 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) {
|
||||||
var brother = brothers[i];
|
const brother = brothers[i];
|
||||||
var brotherY = brother.getPosition().y;
|
const brotherY = brother.getPosition().y;
|
||||||
if (direction == "DOWN" && brotherY > y) {
|
if (direction == 'DOWN' && brotherY > y) {
|
||||||
var distancia = y - brotherY;
|
let distancia = y - brotherY;
|
||||||
if (distancia < 0) {
|
if (distancia < 0) {
|
||||||
distancia = distancia * (-1);
|
distancia *= (-1);
|
||||||
}
|
}
|
||||||
if (dist == null || dist > distancia) {
|
if (dist == null || dist > distancia) {
|
||||||
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;
|
||||||
var distance = y - brotherY;
|
|
||||||
if (distance < 0) {
|
if (distance < 0) {
|
||||||
distance = distance * (-1);
|
distance *= (-1);
|
||||||
}
|
}
|
||||||
if (dist == null || dist > distance) {
|
if (dist == null || dist > distance) {
|
||||||
dist = distance;
|
dist = distance;
|
||||||
@ -326,15 +313,14 @@ const DesignerKeyboard = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_goToSideChild(designer, node, side) {
|
||||||
_goToSideChild:function (designer, node, side) {
|
const children = node.getChildren();
|
||||||
var children = node.getChildren();
|
|
||||||
if (children.length > 0) {
|
if (children.length > 0) {
|
||||||
var target = children[0];
|
let target = children[0];
|
||||||
var top = null;
|
let top = null;
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
var child = children[i];
|
const child = children[i];
|
||||||
var 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;
|
||||||
@ -353,20 +339,20 @@ const DesignerKeyboard = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_goToParent:function (designer, node) {
|
_goToParent(designer, node) {
|
||||||
var parent = node.getParent();
|
const parent = node.getParent();
|
||||||
if (parent) {
|
if (parent) {
|
||||||
this._goToNode(designer, parent);
|
this._goToNode(designer, parent);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_goToChild:function (designer, node) {
|
_goToChild(designer, node) {
|
||||||
var children = node.getChildren();
|
const children = node.getChildren();
|
||||||
if (children.length > 0) {
|
if (children.length > 0) {
|
||||||
var target = children[0];
|
let target = children[0];
|
||||||
var top = target.getPosition().y;
|
let top = target.getPosition().y;
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
var child = children[i];
|
const child = children[i];
|
||||||
if (child.getPosition().y < top) {
|
if (child.getPosition().y < top) {
|
||||||
top = child.getPosition().y;
|
top = child.getPosition().y;
|
||||||
target = child;
|
target = child;
|
||||||
@ -376,25 +362,72 @@ const DesignerKeyboard = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_goToNode:function (designer, node) {
|
_goToNode(designer, node) {
|
||||||
// First deselect all the nodes ...
|
// First deselect all the nodes ...
|
||||||
designer.deselectAll();
|
designer.deselectAll();
|
||||||
|
|
||||||
// Give focus to the selected node....
|
// Give focus to the selected node....
|
||||||
node.setOnFocus(true);
|
node.setOnFocus(true);
|
||||||
}
|
},
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
DesignerKeyboard.specialKeys = {
|
DesignerKeyboard.specialKeys = {
|
||||||
8: "backspace", 9: "tab", 10: "return", 13: "enter", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause",
|
8: 'backspace',
|
||||||
20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home",
|
9: 'tab',
|
||||||
37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del",
|
10: 'return',
|
||||||
96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7",
|
13: 'enter',
|
||||||
104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/",
|
16: 'shift',
|
||||||
112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8",
|
17: 'ctrl',
|
||||||
120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 186: ";", 191: "/",
|
18: 'alt',
|
||||||
220: "\\", 222: "'", 224: "meta"
|
19: 'pause',
|
||||||
|
20: 'capslock',
|
||||||
|
27: 'esc',
|
||||||
|
32: 'space',
|
||||||
|
33: 'pageup',
|
||||||
|
34: 'pagedown',
|
||||||
|
35: 'end',
|
||||||
|
36: 'home',
|
||||||
|
37: 'left',
|
||||||
|
38: 'up',
|
||||||
|
39: 'right',
|
||||||
|
40: 'down',
|
||||||
|
45: 'insert',
|
||||||
|
46: 'del',
|
||||||
|
96: '0',
|
||||||
|
97: '1',
|
||||||
|
98: '2',
|
||||||
|
99: '3',
|
||||||
|
100: '4',
|
||||||
|
101: '5',
|
||||||
|
102: '6',
|
||||||
|
103: '7',
|
||||||
|
104: '8',
|
||||||
|
105: '9',
|
||||||
|
106: '*',
|
||||||
|
107: '+',
|
||||||
|
109: '-',
|
||||||
|
110: '.',
|
||||||
|
111: '/',
|
||||||
|
112: 'f1',
|
||||||
|
113: 'f2',
|
||||||
|
114: 'f3',
|
||||||
|
115: 'f4',
|
||||||
|
116: 'f5',
|
||||||
|
117: 'f6',
|
||||||
|
118: 'f7',
|
||||||
|
119: 'f8',
|
||||||
|
120: 'f9',
|
||||||
|
121: 'f10',
|
||||||
|
122: 'f11',
|
||||||
|
123: 'f12',
|
||||||
|
144: 'numlock',
|
||||||
|
145: 'scroll',
|
||||||
|
186: ';',
|
||||||
|
191: '/',
|
||||||
|
220: '\\',
|
||||||
|
222: "'",
|
||||||
|
224: 'meta',
|
||||||
};
|
};
|
||||||
|
|
||||||
export default DesignerKeyboard;
|
export default DesignerKeyboard;
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
const Events = require('./Events').default;
|
const Events = require('./Events').default;
|
||||||
|
|
||||||
const DesignerModel = new Class(/** @lends DesignerModel */{
|
const DesignerModel = new Class(/** @lends DesignerModel */{
|
||||||
Implements:[Events],
|
Implements: [Events],
|
||||||
/**
|
/**
|
||||||
* @implements {mindplot.Events}
|
* @implements {mindplot.Events}
|
||||||
* @constructs
|
* @constructs
|
||||||
@ -29,42 +29,42 @@ const DesignerModel = new Class(/** @lends DesignerModel */{
|
|||||||
* @see {@link ConfigParameters.md}
|
* @see {@link ConfigParameters.md}
|
||||||
* @see {@link editor.html}
|
* @see {@link editor.html}
|
||||||
*/
|
*/
|
||||||
initialize:function (options) {
|
initialize(options) {
|
||||||
this._zoom = options.zoom;
|
this._zoom = options.zoom;
|
||||||
this._topics = [];
|
this._topics = [];
|
||||||
this._relationships = [];
|
this._relationships = [];
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @return {Number} zoom between 0.3 (largest text) and 1.9 */
|
/** @return {Number} zoom between 0.3 (largest text) and 1.9 */
|
||||||
getZoom:function () {
|
getZoom() {
|
||||||
return this._zoom;
|
return this._zoom;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @param {Number} zoom number between 0.3 and 1.9 to set the zoom to */
|
/** @param {Number} zoom number between 0.3 and 1.9 to set the zoom to */
|
||||||
setZoom:function (zoom) {
|
setZoom(zoom) {
|
||||||
this._zoom = zoom;
|
this._zoom = zoom;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @return {@link mindplot.Topic[]} all topics */
|
/** @return {@link mindplot.Topic[]} all topics */
|
||||||
getTopics:function () {
|
getTopics() {
|
||||||
return this._topics;
|
return this._topics;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @return {mindplot.Relationship[]} all relationships */
|
/** @return {mindplot.Relationship[]} all relationships */
|
||||||
getRelationships:function () {
|
getRelationships() {
|
||||||
return this._relationships;
|
return this._relationships;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @return {mindplot.CentralTopic} the central topic */
|
/** @return {mindplot.CentralTopic} the central topic */
|
||||||
getCentralTopic:function () {
|
getCentralTopic() {
|
||||||
var topics = this.getTopics();
|
const topics = this.getTopics();
|
||||||
return topics[0];
|
return topics[0];
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @return {mindplot.Topic[]} selected topics */
|
/** @return {mindplot.Topic[]} selected topics */
|
||||||
filterSelectedTopics:function () {
|
filterSelectedTopics() {
|
||||||
var result = [];
|
const result = [];
|
||||||
for (var i = 0; i < this._topics.length; i++) {
|
for (let i = 0; i < this._topics.length; i++) {
|
||||||
if (this._topics[i].isOnFocus()) {
|
if (this._topics[i].isOnFocus()) {
|
||||||
result.push(this._topics[i]);
|
result.push(this._topics[i]);
|
||||||
}
|
}
|
||||||
@ -75,9 +75,9 @@ const DesignerModel = new Class(/** @lends DesignerModel */{
|
|||||||
/**
|
/**
|
||||||
* @return {mindplot.Relationship[]} selected relationships
|
* @return {mindplot.Relationship[]} selected relationships
|
||||||
*/
|
*/
|
||||||
filterSelectedRelationships:function () {
|
filterSelectedRelationships() {
|
||||||
var result = [];
|
const result = [];
|
||||||
for (var i = 0; i < this._relationships.length; i++) {
|
for (let i = 0; i < this._relationships.length; i++) {
|
||||||
if (this._relationships[i].isOnFocus()) {
|
if (this._relationships[i].isOnFocus()) {
|
||||||
result.push(this._relationships[i]);
|
result.push(this._relationships[i]);
|
||||||
}
|
}
|
||||||
@ -88,8 +88,8 @@ const DesignerModel = new Class(/** @lends DesignerModel */{
|
|||||||
/**
|
/**
|
||||||
* @return {Array.<mindplot.Relationship, mindplot.Topic>} all topics and relationships
|
* @return {Array.<mindplot.Relationship, mindplot.Topic>} all topics and relationships
|
||||||
*/
|
*/
|
||||||
getEntities:function () {
|
getEntities() {
|
||||||
var result = [].append(this._topics);
|
const result = [].append(this._topics);
|
||||||
result.append(this._relationships);
|
result.append(this._relationships);
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
@ -98,8 +98,8 @@ const DesignerModel = new Class(/** @lends DesignerModel */{
|
|||||||
* removes occurrences of the given topic from the topic array
|
* removes occurrences of the given topic from the topic array
|
||||||
* @param {mindplot.Topic} topic the topic to remove
|
* @param {mindplot.Topic} topic the topic to remove
|
||||||
*/
|
*/
|
||||||
removeTopic:function (topic) {
|
removeTopic(topic) {
|
||||||
$assert(topic, "topic can not be null");
|
$assert(topic, 'topic can not be null');
|
||||||
this._topics.erase(topic);
|
this._topics.erase(topic);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -107,8 +107,8 @@ const DesignerModel = new Class(/** @lends DesignerModel */{
|
|||||||
* removes occurrences of the given relationship from the relationship array
|
* removes occurrences of the given relationship from the relationship array
|
||||||
* @param {mindplot.Relationship} rel the relationship to remove
|
* @param {mindplot.Relationship} rel the relationship to remove
|
||||||
*/
|
*/
|
||||||
removeRelationship:function (rel) {
|
removeRelationship(rel) {
|
||||||
$assert(rel, "rel can not be null");
|
$assert(rel, 'rel can not be null');
|
||||||
this._relationships.erase(rel);
|
this._relationships.erase(rel);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -118,9 +118,9 @@ const DesignerModel = new Class(/** @lends DesignerModel */{
|
|||||||
* @throws will throw an error if topic is null or undefined
|
* @throws will throw an error if topic is null or undefined
|
||||||
* @throws will throw an error if the topic's id is not a number
|
* @throws will throw an error if the topic's id is not a number
|
||||||
*/
|
*/
|
||||||
addTopic:function (topic) {
|
addTopic(topic) {
|
||||||
$assert(topic, "topic can not be null");
|
$assert(topic, 'topic can not be null');
|
||||||
$assert(typeof topic.getId() == "number", "id is not a number:" + topic.getId());
|
$assert(typeof topic.getId() === 'number', `id is not a number:${topic.getId()}`);
|
||||||
this._topics.push(topic);
|
this._topics.push(topic);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -129,8 +129,8 @@ const DesignerModel = new Class(/** @lends DesignerModel */{
|
|||||||
* @param {mindplot.Relationship} rel the relationship to add
|
* @param {mindplot.Relationship} rel the relationship to add
|
||||||
* @throws will throw an error if rel is null or undefined
|
* @throws will throw an error if rel is null or undefined
|
||||||
*/
|
*/
|
||||||
addRelationship:function (rel) {
|
addRelationship(rel) {
|
||||||
$assert(rel, "rel can not be null");
|
$assert(rel, 'rel can not be null');
|
||||||
this._relationships.push(rel);
|
this._relationships.push(rel);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -139,14 +139,13 @@ const DesignerModel = new Class(/** @lends DesignerModel */{
|
|||||||
* @param {String=} errorMsg an error message to display if the validation fails
|
* @param {String=} errorMsg an error message to display if the validation fails
|
||||||
* @return {String} returns an array of the selected (and, if applicable, valid) topics' ids
|
* @return {String} returns an array of the selected (and, if applicable, valid) topics' ids
|
||||||
*/
|
*/
|
||||||
filterTopicsIds:function (validate, errorMsg) {
|
filterTopicsIds(validate, errorMsg) {
|
||||||
var result = [];
|
const result = [];
|
||||||
var topics = this.filterSelectedTopics();
|
const topics = this.filterSelectedTopics();
|
||||||
|
|
||||||
|
let isValid = true;
|
||||||
var isValid = true;
|
for (let i = 0; i < topics.length; i++) {
|
||||||
for (var i = 0; i < topics.length; i++) {
|
const selectedNode = topics[i];
|
||||||
var selectedNode = topics[i];
|
|
||||||
if ($defined(validate)) {
|
if ($defined(validate)) {
|
||||||
isValid = validate(selectedNode);
|
isValid = validate(selectedNode);
|
||||||
}
|
}
|
||||||
@ -165,8 +164,8 @@ const DesignerModel = new Class(/** @lends DesignerModel */{
|
|||||||
* @return {mindplot.Topic} the first selected topic if one or more are found by the
|
* @return {mindplot.Topic} the first selected topic if one or more are found by the
|
||||||
* filterSelectedTopics function, null otherwise
|
* filterSelectedTopics function, null otherwise
|
||||||
*/
|
*/
|
||||||
selectedTopic:function () {
|
selectedTopic() {
|
||||||
var topics = this.filterSelectedTopics();
|
const topics = this.filterSelectedTopics();
|
||||||
return (topics.length > 0) ? topics[0] : null;
|
return (topics.length > 0) ? topics[0] : null;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -174,18 +173,17 @@ const DesignerModel = new Class(/** @lends DesignerModel */{
|
|||||||
* @param {String} id the id of the topic to be retrieved
|
* @param {String} id the id of the topic to be retrieved
|
||||||
* @return {mindplot.Topic} the topic with the respective id
|
* @return {mindplot.Topic} the topic with the respective id
|
||||||
*/
|
*/
|
||||||
findTopicById:function (id) {
|
findTopicById(id) {
|
||||||
var result = null;
|
let result = null;
|
||||||
for (var i = 0; i < this._topics.length; i++) {
|
for (let i = 0; i < this._topics.length; i++) {
|
||||||
var topic = this._topics[i];
|
const topic = this._topics[i];
|
||||||
if (topic.getId() == id) {
|
if (topic.getId() == id) {
|
||||||
result = topic;
|
result = topic;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
},
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export default DesignerModel;
|
export default DesignerModel;
|
||||||
|
@ -17,18 +17,18 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const DesignerUndoManager = new Class({
|
const DesignerUndoManager = new Class({
|
||||||
initialize: function(fireChange) {
|
initialize(fireChange) {
|
||||||
this._undoQueue = [];
|
this._undoQueue = [];
|
||||||
this._redoQueue = [];
|
this._redoQueue = [];
|
||||||
this._baseId = 0;
|
this._baseId = 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
enqueue:function(command) {
|
enqueue(command) {
|
||||||
$assert(command, "Command can not be null");
|
$assert(command, 'Command can not be null');
|
||||||
var length = this._undoQueue.length;
|
const { length } = this._undoQueue;
|
||||||
if (command.discardDuplicated && length > 0) {
|
if (command.discardDuplicated && length > 0) {
|
||||||
// Skip duplicated events ...
|
// Skip duplicated events ...
|
||||||
var lastItem = this._undoQueue[length - 1];
|
const lastItem = this._undoQueue[length - 1];
|
||||||
if (lastItem.discardDuplicated != command.discardDuplicated) {
|
if (lastItem.discardDuplicated != command.discardDuplicated) {
|
||||||
this._undoQueue.push(command);
|
this._undoQueue.push(command);
|
||||||
}
|
}
|
||||||
@ -38,48 +38,48 @@ const DesignerUndoManager = new Class({
|
|||||||
this._redoQueue = [];
|
this._redoQueue = [];
|
||||||
},
|
},
|
||||||
|
|
||||||
execUndo: function(commandContext) {
|
execUndo(commandContext) {
|
||||||
if (this._undoQueue.length > 0) {
|
if (this._undoQueue.length > 0) {
|
||||||
var command = this._undoQueue.pop();
|
const command = this._undoQueue.pop();
|
||||||
this._redoQueue.push(command);
|
this._redoQueue.push(command);
|
||||||
|
|
||||||
command.undoExecute(commandContext);
|
command.undoExecute(commandContext);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
execRedo: function(commandContext) {
|
execRedo(commandContext) {
|
||||||
if (this._redoQueue.length > 0) {
|
if (this._redoQueue.length > 0) {
|
||||||
var command = this._redoQueue.pop();
|
const command = this._redoQueue.pop();
|
||||||
this._undoQueue.push(command);
|
this._undoQueue.push(command);
|
||||||
command.execute(commandContext);
|
command.execute(commandContext);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
buildEvent: function() {
|
buildEvent() {
|
||||||
return {undoSteps: this._undoQueue.length, redoSteps:this._redoQueue.length};
|
return { undoSteps: this._undoQueue.length, redoSteps: this._redoQueue.length };
|
||||||
},
|
},
|
||||||
|
|
||||||
markAsChangeBase: function() {
|
markAsChangeBase() {
|
||||||
var undoLength = this._undoQueue.length;
|
const undoLength = this._undoQueue.length;
|
||||||
if (undoLength > 0) {
|
if (undoLength > 0) {
|
||||||
var command = this._undoQueue[undoLength - 1];
|
const command = this._undoQueue[undoLength - 1];
|
||||||
this._baseId = command.getId();
|
this._baseId = command.getId();
|
||||||
} else {
|
} else {
|
||||||
this._baseId = 0;
|
this._baseId = 0;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
hasBeenChanged: function() {
|
hasBeenChanged() {
|
||||||
var result = true;
|
let result = true;
|
||||||
var undoLength= this._undoQueue.length;
|
const undoLength = this._undoQueue.length;
|
||||||
if (undoLength == 0 && this._baseId == 0) {
|
if (undoLength == 0 && this._baseId == 0) {
|
||||||
result = false;
|
result = false;
|
||||||
} else if (undoLength > 0) {
|
} else if (undoLength > 0) {
|
||||||
var command = this._undoQueue[undoLength - 1];
|
const command = this._undoQueue[undoLength - 1];
|
||||||
result = (this._baseId != command.getId());
|
result = (this._baseId != command.getId());
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default DesignerUndoManager;
|
export default DesignerUndoManager;
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const DragConnector = new Class({
|
const DragConnector = new Class({
|
||||||
initialize:function (designerModel, workspace) {
|
initialize(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');
|
||||||
|
|
||||||
@ -26,13 +26,12 @@ const DragConnector = new Class({
|
|||||||
this._workspace = workspace;
|
this._workspace = workspace;
|
||||||
},
|
},
|
||||||
|
|
||||||
checkConnection:function (dragTopic) {
|
checkConnection(dragTopic) {
|
||||||
var topics = this._designerModel.getTopics();
|
const topics = this._designerModel.getTopics();
|
||||||
|
|
||||||
// Must be disconnected from their current connection ?.
|
// Must be disconnected from their current connection ?.
|
||||||
var candidates = this._searchConnectionCandidates(dragTopic);
|
const candidates = this._searchConnectionCandidates(dragTopic);
|
||||||
var currentConnection = dragTopic.getConnectedToTopic();
|
const currentConnection = dragTopic.getConnectedToTopic();
|
||||||
|
|
||||||
|
|
||||||
if (currentConnection && (candidates.length == 0 || candidates[0] != currentConnection)) {
|
if (currentConnection && (candidates.length == 0 || candidates[0] != currentConnection)) {
|
||||||
dragTopic.disconnect(this._workspace);
|
dragTopic.disconnect(this._workspace);
|
||||||
@ -44,22 +43,22 @@ const DragConnector = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_searchConnectionCandidates:function (dragTopic) {
|
_searchConnectionCandidates(dragTopic) {
|
||||||
var topics = this._designerModel.getTopics();
|
let topics = this._designerModel.getTopics();
|
||||||
var draggedNode = dragTopic.getDraggedTopic();
|
const draggedNode = dragTopic.getDraggedTopic();
|
||||||
|
|
||||||
// Drag node connects to the border ...
|
// Drag node connects to the border ...
|
||||||
var dragTopicWidth = dragTopic.getSize ? dragTopic.getSize().width : 0; // Hack...
|
const dragTopicWidth = dragTopic.getSize ? dragTopic.getSize().width : 0; // Hack...
|
||||||
var xMouseGap = dragTopic.getPosition().x > 0 ? 0 : dragTopicWidth;
|
const xMouseGap = dragTopic.getPosition().x > 0 ? 0 : dragTopicWidth;
|
||||||
var sPos = {x:dragTopic.getPosition().x - xMouseGap, y:dragTopic.getPosition().y};
|
const sPos = { x: dragTopic.getPosition().x - xMouseGap, y: dragTopic.getPosition().y };
|
||||||
|
|
||||||
// Perform a initial filter to discard topics:
|
// Perform a initial filter to discard topics:
|
||||||
// - Exclude dragged topic
|
// - Exclude dragged topic
|
||||||
// - Exclude dragTopic pivot
|
// - Exclude dragTopic pivot
|
||||||
// - Nodes that are collapsed
|
// - Nodes that are collapsed
|
||||||
// - It's not part of the branch dragged itself
|
// - It's not part of the branch dragged itself
|
||||||
topics = topics.filter(function (topic) {
|
topics = topics.filter((topic) => {
|
||||||
var result = draggedNode != topic;
|
let result = draggedNode != topic;
|
||||||
result = result && topic != draggedNode;
|
result = result && topic != draggedNode;
|
||||||
result = result && !topic.areChildrenShrunken() && !topic.isCollapsed();
|
result = result && !topic.areChildrenShrunken() && !topic.isCollapsed();
|
||||||
result = result && !draggedNode.isChildTopic(topic);
|
result = result && !draggedNode.isChildTopic(topic);
|
||||||
@ -69,13 +68,12 @@ const DragConnector = new Class({
|
|||||||
// Filter all the nodes that are outside the vertical boundary:
|
// Filter all the nodes that are outside the vertical boundary:
|
||||||
// * The node is to out of the x scope
|
// * The node is to out of the x scope
|
||||||
// * The x distance greater the vertical tolerated distance
|
// * The x distance greater the vertical tolerated distance
|
||||||
topics = topics.filter(function (topic) {
|
topics = topics.filter((topic) => {
|
||||||
var tpos = topic.getPosition();
|
const tpos = topic.getPosition();
|
||||||
// Center topic has different alignment than the rest of the nodes. That's why i need to divide it by two...
|
// Center topic has different alignment than the rest of the nodes. That's why i need to divide it by two...
|
||||||
var txborder = tpos.x + (topic.getSize().width / 2) * Math.sign(sPos.x);
|
const txborder = tpos.x + (topic.getSize().width / 2) * Math.sign(sPos.x);
|
||||||
var distance = (sPos.x - txborder) * Math.sign(sPos.x);
|
const distance = (sPos.x - txborder) * Math.sign(sPos.x);
|
||||||
return distance > 0 && (distance < DragConnector.MAX_VERTICAL_CONNECTION_TOLERANCE);
|
return distance > 0 && (distance < DragConnector.MAX_VERTICAL_CONNECTION_TOLERANCE);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Assign a priority based on the distance:
|
// Assign a priority based on the distance:
|
||||||
@ -83,33 +81,30 @@ const DragConnector = new Class({
|
|||||||
// - Vertical distance
|
// - Vertical distance
|
||||||
// - Horizontal proximity
|
// - Horizontal proximity
|
||||||
// - It's already connected.
|
// - It's already connected.
|
||||||
var currentConnection = dragTopic.getConnectedToTopic();
|
const currentConnection = dragTopic.getConnectedToTopic();
|
||||||
var me = this;
|
const me = this;
|
||||||
topics = topics.sort(function (a, b) {
|
topics = topics.sort((a, b) => {
|
||||||
var aPos = a.getPosition();
|
const aPos = a.getPosition();
|
||||||
var bPos = b.getPosition();
|
const bPos = b.getPosition();
|
||||||
|
|
||||||
var av = me._isVerticallyAligned(a.getSize(), aPos, sPos);
|
const av = me._isVerticallyAligned(a.getSize(), aPos, sPos);
|
||||||
var bv = me._isVerticallyAligned(b.getSize(), bPos, sPos);
|
const bv = me._isVerticallyAligned(b.getSize(), bPos, sPos);
|
||||||
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:function (isAligned, target, sPos, currentConnection) {
|
_proximityWeight(isAligned, target, sPos, currentConnection) {
|
||||||
var 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:function (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;
|
||||||
|
|
||||||
export default DragConnector
|
export default DragConnector;
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
const DragTopic = require('./DragTopic').default;
|
const DragTopic = require('./DragTopic').default;
|
||||||
|
|
||||||
const DragManager = new Class({
|
const DragManager = new Class({
|
||||||
initialize:function(workspace, eventDispatcher) {
|
initialize(workspace, eventDispatcher) {
|
||||||
this._workspace = workspace;
|
this._workspace = workspace;
|
||||||
this._designerModel = workspace;
|
this._designerModel = workspace;
|
||||||
this._listeners = {};
|
this._listeners = {};
|
||||||
@ -27,27 +27,27 @@ const DragManager = new Class({
|
|||||||
DragTopic.init(this._workspace);
|
DragTopic.init(this._workspace);
|
||||||
},
|
},
|
||||||
|
|
||||||
add : function(node) {
|
add(node) {
|
||||||
// Add behaviour ...
|
// Add behaviour ...
|
||||||
var workspace = this._workspace;
|
const workspace = this._workspace;
|
||||||
var screen = workspace.getScreenManager();
|
const screen = workspace.getScreenManager();
|
||||||
var dragManager = this;
|
const dragManager = this;
|
||||||
var me = this;
|
const me = this;
|
||||||
var mouseDownListener = function(event) {
|
const mouseDownListener = function (event) {
|
||||||
if (workspace.isWorkspaceEventsEnabled()) {
|
if (workspace.isWorkspaceEventsEnabled()) {
|
||||||
// Disable double drag...
|
// Disable double drag...
|
||||||
workspace.enableWorkspaceEvents(false);
|
workspace.enableWorkspaceEvents(false);
|
||||||
|
|
||||||
// Set initial position.
|
// Set initial position.
|
||||||
var layoutManager = me._eventDispatcher.getLayoutManager();
|
const layoutManager = me._eventDispatcher.getLayoutManager();
|
||||||
var dragNode = node.createDragNode(layoutManager);
|
const dragNode = node.createDragNode(layoutManager);
|
||||||
|
|
||||||
// Register mouse move listener ...
|
// Register mouse move listener ...
|
||||||
var mouseMoveListener = dragManager._buildMouseMoveListener(workspace, dragNode, dragManager);
|
const mouseMoveListener = dragManager._buildMouseMoveListener(workspace, dragNode, dragManager);
|
||||||
screen.addEvent('mousemove', mouseMoveListener);
|
screen.addEvent('mousemove', mouseMoveListener);
|
||||||
|
|
||||||
// Register mouse up listeners ...
|
// Register mouse up listeners ...
|
||||||
var mouseUpListener = dragManager._buildMouseUpListener(workspace, node, dragNode, dragManager);
|
const mouseUpListener = dragManager._buildMouseUpListener(workspace, node, dragNode, dragManager);
|
||||||
screen.addEvent('mouseup', mouseUpListener);
|
screen.addEvent('mouseup', mouseUpListener);
|
||||||
|
|
||||||
// Change cursor.
|
// Change cursor.
|
||||||
@ -57,11 +57,11 @@ const DragManager = new Class({
|
|||||||
node.addEvent('mousedown', mouseDownListener);
|
node.addEvent('mousedown', mouseDownListener);
|
||||||
},
|
},
|
||||||
|
|
||||||
remove : function(node) {
|
remove(node) {
|
||||||
var nodes = this._topics;
|
const nodes = this._topics;
|
||||||
var contained = false;
|
let contained = false;
|
||||||
var index = -1;
|
let index = -1;
|
||||||
for (var i = 0; i < nodes.length; i++) {
|
for (let i = 0; i < nodes.length; i++) {
|
||||||
if (nodes[i] == node) {
|
if (nodes[i] == node) {
|
||||||
contained = true;
|
contained = true;
|
||||||
index = i;
|
index = i;
|
||||||
@ -69,14 +69,13 @@ const DragManager = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_buildMouseMoveListener : function(workspace, dragNode, dragManager) {
|
_buildMouseMoveListener(workspace, dragNode, dragManager) {
|
||||||
var screen = workspace.getScreenManager();
|
const screen = workspace.getScreenManager();
|
||||||
var me = this;
|
const me = this;
|
||||||
var result = function(event) {
|
const result = function (event) {
|
||||||
|
|
||||||
if (!me._isDragInProcess) {
|
if (!me._isDragInProcess) {
|
||||||
// Execute Listeners ..
|
// Execute Listeners ..
|
||||||
var startDragListener = dragManager._listeners['startdragging'];
|
const startDragListener = dragManager._listeners.startdragging;
|
||||||
startDragListener(event, dragNode);
|
startDragListener(event, dragNode);
|
||||||
|
|
||||||
// Add shadow node to the workspace.
|
// Add shadow node to the workspace.
|
||||||
@ -85,26 +84,25 @@ const DragManager = new Class({
|
|||||||
me._isDragInProcess = true;
|
me._isDragInProcess = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var pos = screen.getWorkspaceMousePosition(event);
|
const pos = screen.getWorkspaceMousePosition(event);
|
||||||
dragNode.setPosition(pos.x, pos.y);
|
dragNode.setPosition(pos.x, pos.y);
|
||||||
|
|
||||||
// Call mouse move listeners ...
|
// Call mouse move listeners ...
|
||||||
var dragListener = dragManager._listeners['dragging'];
|
const dragListener = dragManager._listeners.dragging;
|
||||||
if ($defined(dragListener)) {
|
if ($defined(dragListener)) {
|
||||||
dragListener(event, dragNode);
|
dragListener(event, dragNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|
||||||
};
|
};
|
||||||
dragManager._mouseMoveListener = result;
|
dragManager._mouseMoveListener = result;
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
_buildMouseUpListener : function(workspace, node, dragNode, dragManager) {
|
_buildMouseUpListener(workspace, node, dragNode, dragManager) {
|
||||||
var screen = workspace.getScreenManager();
|
const screen = workspace.getScreenManager();
|
||||||
var me = this;
|
const me = this;
|
||||||
var result = function(event) {
|
const result = function (event) {
|
||||||
$assert(dragNode.isDragTopic, 'dragNode must be an DragTopic');
|
$assert(dragNode.isDragTopic, 'dragNode must be an DragTopic');
|
||||||
|
|
||||||
// Remove all the events.
|
// Remove all the events.
|
||||||
@ -120,9 +118,8 @@ const DragManager = new Class({
|
|||||||
window.document.body.style.cursor = 'default';
|
window.document.body.style.cursor = 'default';
|
||||||
|
|
||||||
if (me._isDragInProcess) {
|
if (me._isDragInProcess) {
|
||||||
|
|
||||||
// Execute Listeners only if the node has been moved.
|
// Execute Listeners only if the node has been moved.
|
||||||
var endDragListener = dragManager._listeners['enddragging'];
|
const endDragListener = dragManager._listeners.enddragging;
|
||||||
endDragListener(event, dragNode);
|
endDragListener(event, dragNode);
|
||||||
|
|
||||||
// Remove drag node from the workspace.
|
// Remove drag node from the workspace.
|
||||||
@ -130,8 +127,6 @@ const DragManager = new Class({
|
|||||||
|
|
||||||
me._isDragInProcess = false;
|
me._isDragInProcess = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
dragManager._mouseUpListener = result;
|
dragManager._mouseUpListener = result;
|
||||||
return result;
|
return result;
|
||||||
@ -143,9 +138,9 @@ const DragManager = new Class({
|
|||||||
* - dragging
|
* - dragging
|
||||||
* - enddragging
|
* - enddragging
|
||||||
*/
|
*/
|
||||||
addEvent : function(type, listener) {
|
addEvent(type, listener) {
|
||||||
this._listeners[type] = listener;
|
this._listeners[type] = listener;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default DragManager;
|
export default DragManager;
|
||||||
|
@ -15,9 +15,11 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const Core = require('@wismapping/core-js')
|
const Core = require('@wismapping/core-js');
|
||||||
|
|
||||||
const core = Core();
|
const core = Core();
|
||||||
const web2D = require('@wismapping/web2d')
|
const web2D = require('@wismapping/web2d');
|
||||||
|
|
||||||
const web2d = web2D();
|
const web2d = web2D();
|
||||||
|
|
||||||
const DragTopic = require('./DragTopic').default;
|
const DragTopic = require('./DragTopic').default;
|
||||||
@ -25,7 +27,7 @@ const Shape = require('./util/Shape').default;
|
|||||||
const INodeModel = require('./model/INodeModel').default;
|
const INodeModel = require('./model/INodeModel').default;
|
||||||
|
|
||||||
const DragPivot = new Class({
|
const DragPivot = new Class({
|
||||||
initialize:function() {
|
initialize() {
|
||||||
this._position = new core.Point();
|
this._position = new core.Point();
|
||||||
this._size = DragTopic.PIVOT_SIZE;
|
this._size = DragTopic.PIVOT_SIZE;
|
||||||
|
|
||||||
@ -37,16 +39,16 @@ const DragPivot = new Class({
|
|||||||
this._isVisible = false;
|
this._isVisible = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
isVisible:function() {
|
isVisible() {
|
||||||
return this._isVisible;
|
return this._isVisible;
|
||||||
},
|
},
|
||||||
|
|
||||||
getTargetTopic : function() {
|
getTargetTopic() {
|
||||||
return this._targetTopic;
|
return this._targetTopic;
|
||||||
},
|
},
|
||||||
|
|
||||||
_buildStraightLine : function() {
|
_buildStraightLine() {
|
||||||
var line = new web2d.CurvedLine();
|
const line = new web2d.CurvedLine();
|
||||||
line.setStyle(web2d.CurvedLine.SIMPLE_LINE);
|
line.setStyle(web2d.CurvedLine.SIMPLE_LINE);
|
||||||
line.setStroke(1, 'solid', '#CC0033');
|
line.setStroke(1, 'solid', '#CC0033');
|
||||||
line.setOpacity(0.4);
|
line.setOpacity(0.4);
|
||||||
@ -54,8 +56,8 @@ const DragPivot = new Class({
|
|||||||
return line;
|
return line;
|
||||||
},
|
},
|
||||||
|
|
||||||
_buildCurvedLine : function() {
|
_buildCurvedLine() {
|
||||||
var line = new web2d.CurvedLine();
|
const line = new web2d.CurvedLine();
|
||||||
line.setStyle(web2d.CurvedLine.SIMPLE_LINE);
|
line.setStyle(web2d.CurvedLine.SIMPLE_LINE);
|
||||||
line.setStroke(1, 'solid', '#CC0033');
|
line.setStroke(1, 'solid', '#CC0033');
|
||||||
line.setOpacity(0.4);
|
line.setOpacity(0.4);
|
||||||
@ -63,74 +65,74 @@ const DragPivot = new Class({
|
|||||||
return line;
|
return line;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_redrawLine() {
|
||||||
_redrawLine : function() {
|
|
||||||
// Update line position.
|
// Update line position.
|
||||||
$assert(this.getTargetTopic(), 'Illegal invocation. Target node can not be null');
|
$assert(this.getTargetTopic(), 'Illegal invocation. Target node can not be null');
|
||||||
|
|
||||||
var pivotRect = this._getPivotRect();
|
const pivotRect = this._getPivotRect();
|
||||||
|
|
||||||
// Pivot position has not changed. In this case, position change is not required.
|
// Pivot position has not changed. In this case, position change is not required.
|
||||||
var targetTopic = this.getTargetTopic();
|
const targetTopic = this.getTargetTopic();
|
||||||
var position = this._position;
|
const position = this._position;
|
||||||
|
|
||||||
// Calculate pivot connection point ...
|
// Calculate pivot connection point ...
|
||||||
var size = this._size;
|
const size = this._size;
|
||||||
var targetPosition = targetTopic.getPosition();
|
const targetPosition = targetTopic.getPosition();
|
||||||
var line = this._getConnectionLine();
|
const line = this._getConnectionLine();
|
||||||
|
|
||||||
// Update Line position.
|
// Update Line position.
|
||||||
var isAtRight = Shape.isAtRight(targetPosition, position);
|
const isAtRight = Shape.isAtRight(targetPosition, position);
|
||||||
var pivotPoint = Shape.calculateRectConnectionPoint(position, size, isAtRight);
|
const pivotPoint = Shape.calculateRectConnectionPoint(position, size, isAtRight);
|
||||||
line.setFrom(pivotPoint.x, pivotPoint.y);
|
line.setFrom(pivotPoint.x, pivotPoint.y);
|
||||||
|
|
||||||
// Update rect position
|
// Update rect position
|
||||||
var cx = position.x - (parseInt(size.width) / 2);
|
const cx = position.x - (parseInt(size.width) / 2);
|
||||||
var cy = position.y - (parseInt(size.height) / 2);
|
const cy = position.y - (parseInt(size.height) / 2);
|
||||||
pivotRect.setPosition(cx, cy);
|
pivotRect.setPosition(cx, cy);
|
||||||
|
|
||||||
// Make line visible only when the position has been already changed.
|
// Make line visible only when the position has been already changed.
|
||||||
// This solve several strange effects ;)
|
// This solve several strange effects ;)
|
||||||
var targetPoint = targetTopic.workoutIncomingConnectionPoint(pivotPoint);
|
const targetPoint = targetTopic.workoutIncomingConnectionPoint(pivotPoint);
|
||||||
line.setTo(targetPoint.x, targetPoint.y);
|
line.setTo(targetPoint.x, targetPoint.y);
|
||||||
},
|
},
|
||||||
|
|
||||||
setPosition : function(point) {
|
setPosition(point) {
|
||||||
this._position = point;
|
this._position = point;
|
||||||
this._redrawLine();
|
this._redrawLine();
|
||||||
},
|
},
|
||||||
|
|
||||||
getPosition : function() {
|
getPosition() {
|
||||||
return this._position;
|
return this._position;
|
||||||
},
|
},
|
||||||
|
|
||||||
_buildRect : function() {
|
_buildRect() {
|
||||||
var size = this._size;
|
const size = this._size;
|
||||||
var rectAttributes = {fillColor:'#CC0033',opacity:0.4,width:size.width,height:size.height,strokeColor:'#FF9933'};
|
const rectAttributes = {
|
||||||
var rect = new web2d.Rect(0, rectAttributes);
|
fillColor: '#CC0033', opacity: 0.4, width: size.width, height: size.height, strokeColor: '#FF9933',
|
||||||
|
};
|
||||||
|
const rect = new web2d.Rect(0, rectAttributes);
|
||||||
rect.setVisibility(false);
|
rect.setVisibility(false);
|
||||||
return rect;
|
return rect;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getPivotRect : function() {
|
_getPivotRect() {
|
||||||
return this._dragPivot;
|
return this._dragPivot;
|
||||||
},
|
},
|
||||||
|
|
||||||
getSize : function() {
|
getSize() {
|
||||||
var elem2d = this._getPivotRect();
|
const elem2d = this._getPivotRect();
|
||||||
return elem2d.getSize();
|
return elem2d.getSize();
|
||||||
},
|
},
|
||||||
|
|
||||||
setVisibility : function(value) {
|
setVisibility(value) {
|
||||||
if (this.isVisible() != value) {
|
if (this.isVisible() != value) {
|
||||||
|
const pivotRect = this._getPivotRect();
|
||||||
var pivotRect = this._getPivotRect();
|
|
||||||
pivotRect.setVisibility(value);
|
pivotRect.setVisibility(value);
|
||||||
|
|
||||||
var connectRect = this._connectRect;
|
const connectRect = this._connectRect;
|
||||||
connectRect.setVisibility(value);
|
connectRect.setVisibility(value);
|
||||||
|
|
||||||
var line = this._getConnectionLine();
|
const line = this._getConnectionLine();
|
||||||
if (line) {
|
if (line) {
|
||||||
line.setVisibility(value);
|
line.setVisibility(value);
|
||||||
}
|
}
|
||||||
@ -139,9 +141,9 @@ const DragPivot = new Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
// 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 : function() {
|
_getConnectionLine() {
|
||||||
var result = null;
|
let result = null;
|
||||||
var parentTopic = this._targetTopic;
|
const parentTopic = this._targetTopic;
|
||||||
if (parentTopic) {
|
if (parentTopic) {
|
||||||
if (parentTopic.getType() == INodeModel.CENTRAL_TOPIC_TYPE) {
|
if (parentTopic.getType() == INodeModel.CENTRAL_TOPIC_TYPE) {
|
||||||
result = this._straightLine;
|
result = this._straightLine;
|
||||||
@ -152,37 +154,37 @@ const DragPivot = new Class({
|
|||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
addToWorkspace : function(workspace) {
|
addToWorkspace(workspace) {
|
||||||
var pivotRect = this._getPivotRect();
|
const pivotRect = this._getPivotRect();
|
||||||
workspace.append(pivotRect);
|
workspace.append(pivotRect);
|
||||||
|
|
||||||
var connectToRect = this._connectRect;
|
const connectToRect = this._connectRect;
|
||||||
workspace.append(connectToRect);
|
workspace.append(connectToRect);
|
||||||
|
|
||||||
// Add a hidden straight line ...
|
// Add a hidden straight line ...
|
||||||
var straighLine = this._straightLine;
|
const straighLine = this._straightLine;
|
||||||
straighLine.setVisibility(false);
|
straighLine.setVisibility(false);
|
||||||
workspace.append(straighLine);
|
workspace.append(straighLine);
|
||||||
straighLine.moveToBack();
|
straighLine.moveToBack();
|
||||||
|
|
||||||
// Add a hidden curved line ...
|
// Add a hidden curved line ...
|
||||||
var curvedLine = this._curvedLine;
|
const curvedLine = this._curvedLine;
|
||||||
curvedLine.setVisibility(false);
|
curvedLine.setVisibility(false);
|
||||||
workspace.append(curvedLine);
|
workspace.append(curvedLine);
|
||||||
curvedLine.moveToBack();
|
curvedLine.moveToBack();
|
||||||
|
|
||||||
// Add a connect rect ...
|
// Add a connect rect ...
|
||||||
var connectRect = this._connectRect;
|
const connectRect = this._connectRect;
|
||||||
connectRect.setVisibility(false);
|
connectRect.setVisibility(false);
|
||||||
workspace.append(connectRect);
|
workspace.append(connectRect);
|
||||||
connectRect.moveToBack();
|
connectRect.moveToBack();
|
||||||
},
|
},
|
||||||
|
|
||||||
removeFromWorkspace : function(workspace) {
|
removeFromWorkspace(workspace) {
|
||||||
var shape = this._getPivotRect();
|
const shape = this._getPivotRect();
|
||||||
workspace.removeChild(shape);
|
workspace.removeChild(shape);
|
||||||
|
|
||||||
var connectToRect = this._connectRect;
|
const connectToRect = this._connectRect;
|
||||||
workspace.removeChild(connectToRect);
|
workspace.removeChild(connectToRect);
|
||||||
|
|
||||||
if ($defined(this._straightLine)) {
|
if ($defined(this._straightLine)) {
|
||||||
@ -194,7 +196,7 @@ const DragPivot = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
connectTo : function(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');
|
||||||
$assert(targetTopic != this, 'Circular connection are not allowed');
|
$assert(targetTopic != this, 'Circular connection are not allowed');
|
||||||
$assert(position, 'position can not be null');
|
$assert(position, 'position can not be null');
|
||||||
@ -204,35 +206,35 @@ const DragPivot = new Class({
|
|||||||
this._targetTopic = targetTopic;
|
this._targetTopic = targetTopic;
|
||||||
|
|
||||||
// Connected to Rect ...
|
// Connected to Rect ...
|
||||||
var connectRect = this._connectRect;
|
const connectRect = this._connectRect;
|
||||||
var targetSize = targetTopic.getSize();
|
const targetSize = targetTopic.getSize();
|
||||||
|
|
||||||
// Add 4 pixel in order to keep create a rect bigger than the topic.
|
// Add 4 pixel in order to keep create a rect bigger than the topic.
|
||||||
var width = targetSize.width + 4;
|
const width = targetSize.width + 4;
|
||||||
var height = targetSize.height + 4;
|
const height = targetSize.height + 4;
|
||||||
|
|
||||||
connectRect.setSize(width, height);
|
connectRect.setSize(width, height);
|
||||||
|
|
||||||
var targetPosition = targetTopic.getPosition();
|
const targetPosition = targetTopic.getPosition();
|
||||||
var cx = Math.ceil(targetPosition.x - (width / 2));
|
const cx = Math.ceil(targetPosition.x - (width / 2));
|
||||||
var cy = Math.ceil(targetPosition.y - (height / 2));
|
const cy = Math.ceil(targetPosition.y - (height / 2));
|
||||||
connectRect.setPosition(cx, cy);
|
connectRect.setPosition(cx, cy);
|
||||||
|
|
||||||
// Change elements position ...
|
// Change elements position ...
|
||||||
var pivotRect = this._getPivotRect();
|
const pivotRect = this._getPivotRect();
|
||||||
pivotRect.moveToFront();
|
pivotRect.moveToFront();
|
||||||
pivotRect.setPosition(position.x, position.y);
|
pivotRect.setPosition(position.x, position.y);
|
||||||
|
|
||||||
this._redrawLine();
|
this._redrawLine();
|
||||||
},
|
},
|
||||||
|
|
||||||
disconnect : function(workspace) {
|
disconnect(workspace) {
|
||||||
$assert(workspace, 'workspace can not be null.');
|
$assert(workspace, 'workspace can not be null.');
|
||||||
$assert(this._targetTopic, 'There are not connected topic.');
|
$assert(this._targetTopic, 'There are not connected topic.');
|
||||||
|
|
||||||
this.setVisibility(false);
|
this.setVisibility(false);
|
||||||
this._targetTopic = null;
|
this._targetTopic = null;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default DragPivot;
|
export default DragPivot;
|
||||||
|
@ -15,14 +15,15 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const Core = require('@wismapping/core-js')
|
const Core = require('@wismapping/core-js');
|
||||||
|
|
||||||
const core = Core();
|
const core = Core();
|
||||||
|
|
||||||
const ActionDispatcher = require('./ActionDispatcher').default
|
const ActionDispatcher = require('./ActionDispatcher').default;
|
||||||
const DragPivot = require('./DragPivot').default;
|
const DragPivot = require('./DragPivot').default;
|
||||||
|
|
||||||
const DragTopic = new Class({
|
const DragTopic = new Class({
|
||||||
initialize:function (dragShape, draggedNode, layoutManger) {
|
initialize(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.');
|
||||||
@ -36,142 +37,141 @@ const DragTopic = new Class({
|
|||||||
this._isFreeLayoutEnabled = false;
|
this._isFreeLayoutEnabled = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
setOrder:function (order) {
|
setOrder(order) {
|
||||||
this._order = order;
|
this._order = order;
|
||||||
},
|
},
|
||||||
|
|
||||||
setPosition:function (x, y) {
|
setPosition(x, y) {
|
||||||
// Update drag shadow position ....
|
// Update drag shadow position ....
|
||||||
var position = {x:x, y:y};
|
let position = { x, y };
|
||||||
if (this.isFreeLayoutOn() && this.isConnected()) {
|
if (this.isFreeLayoutOn() && this.isConnected()) {
|
||||||
var _layoutManager = this._layoutManager;
|
const { _layoutManager } = this;
|
||||||
var par = this.getConnectedToTopic();
|
const par = this.getConnectedToTopic();
|
||||||
position = _layoutManager.predict(par.getId(), this._draggedNode.getId(), position, true).position;
|
position = _layoutManager.predict(par.getId(), this._draggedNode.getId(), position, true).position;
|
||||||
}
|
}
|
||||||
this._position.setValue(position.x, position.y);
|
this._position.setValue(position.x, position.y);
|
||||||
|
|
||||||
// Elements are positioned in the center.
|
// Elements are positioned in the center.
|
||||||
// All topic element must be positioned based on the innerShape.
|
// All topic element must be positioned based on the innerShape.
|
||||||
var draggedNode = this._draggedNode;
|
const draggedNode = this._draggedNode;
|
||||||
var size = draggedNode.getSize();
|
const size = draggedNode.getSize();
|
||||||
var cx = position.x - (position.x > 0 ? 0 : size.width);
|
const cx = position.x - (position.x > 0 ? 0 : size.width);
|
||||||
var cy = Math.ceil(position.y - (size.height / 2));
|
const cy = Math.ceil(position.y - (size.height / 2));
|
||||||
this._elem2d.setPosition(cx, cy);
|
this._elem2d.setPosition(cx, cy);
|
||||||
|
|
||||||
// In case is not free, pivot must be draw ...
|
// In case is not free, pivot must be draw ...
|
||||||
if (this.isConnected() && !this.isFreeLayoutOn()) {
|
if (this.isConnected() && !this.isFreeLayoutOn()) {
|
||||||
var parent = this.getConnectedToTopic();
|
const parent = this.getConnectedToTopic();
|
||||||
var predict = this._layoutManager.predict(parent.getId(), this._draggedNode.getId(), this.getPosition());
|
const predict = this._layoutManager.predict(parent.getId(), this._draggedNode.getId(), this.getPosition());
|
||||||
if (this._order != predict.order) {
|
if (this._order != predict.order) {
|
||||||
var dragPivot = this._getDragPivot();
|
const dragPivot = this._getDragPivot();
|
||||||
var pivotPosition = predict.position;
|
const pivotPosition = predict.position;
|
||||||
dragPivot.connectTo(parent, pivotPosition);
|
dragPivot.connectTo(parent, pivotPosition);
|
||||||
this.setOrder(predict.order);
|
this.setOrder(predict.order);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
updateFreeLayout:function (event) {
|
updateFreeLayout(event) {
|
||||||
var isFreeEnabled = (event.metaKey && Browser.Platform.mac) || (event.ctrlKey && !Browser.Platform.mac);
|
const isFreeEnabled = (event.metaKey && Browser.Platform.mac) || (event.ctrlKey && !Browser.Platform.mac);
|
||||||
if (this.isFreeLayoutOn() != isFreeEnabled) {
|
if (this.isFreeLayoutOn() != isFreeEnabled) {
|
||||||
var dragPivot = this._getDragPivot();
|
const dragPivot = this._getDragPivot();
|
||||||
dragPivot.setVisibility(!isFreeEnabled);
|
dragPivot.setVisibility(!isFreeEnabled);
|
||||||
this._isFreeLayoutEnabled = isFreeEnabled;
|
this._isFreeLayoutEnabled = isFreeEnabled;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
setVisibility:function (value) {
|
setVisibility(value) {
|
||||||
var dragPivot = this._getDragPivot();
|
const dragPivot = this._getDragPivot();
|
||||||
dragPivot.setVisibility(value);
|
dragPivot.setVisibility(value);
|
||||||
},
|
},
|
||||||
|
|
||||||
isVisible:function () {
|
isVisible() {
|
||||||
var dragPivot = this._getDragPivot();
|
const dragPivot = this._getDragPivot();
|
||||||
return dragPivot.isVisible();
|
return dragPivot.isVisible();
|
||||||
},
|
},
|
||||||
|
|
||||||
getInnerShape:function () {
|
getInnerShape() {
|
||||||
return this._elem2d;
|
return this._elem2d;
|
||||||
},
|
},
|
||||||
|
|
||||||
disconnect:function (workspace) {
|
disconnect(workspace) {
|
||||||
// Clear connection line ...
|
// Clear connection line ...
|
||||||
var dragPivot = this._getDragPivot();
|
const dragPivot = this._getDragPivot();
|
||||||
dragPivot.disconnect(workspace);
|
dragPivot.disconnect(workspace);
|
||||||
},
|
},
|
||||||
|
|
||||||
connectTo:function (parent) {
|
connectTo(parent) {
|
||||||
$assert(parent, 'Parent connection node can not be null.');
|
$assert(parent, 'Parent connection node can not be null.');
|
||||||
|
|
||||||
// Where it should be connected ?
|
// Where it should be connected ?
|
||||||
var predict = designer._eventBussDispatcher._layoutManager.predict(parent.getId(), this._draggedNode.getId(), this.getPosition());
|
const predict = designer._eventBussDispatcher._layoutManager.predict(parent.getId(), this._draggedNode.getId(), this.getPosition());
|
||||||
|
|
||||||
// Connect pivot ...
|
// Connect pivot ...
|
||||||
var dragPivot = this._getDragPivot();
|
const dragPivot = this._getDragPivot();
|
||||||
var position = predict.position;
|
const { position } = predict;
|
||||||
dragPivot.connectTo(parent, position);
|
dragPivot.connectTo(parent, position);
|
||||||
dragPivot.setVisibility(true);
|
dragPivot.setVisibility(true);
|
||||||
|
|
||||||
this.setOrder(predict.order);
|
this.setOrder(predict.order);
|
||||||
},
|
},
|
||||||
|
|
||||||
getDraggedTopic:function () {
|
getDraggedTopic() {
|
||||||
return this._draggedNode;
|
return this._draggedNode;
|
||||||
},
|
},
|
||||||
|
|
||||||
removeFromWorkspace:function (workspace) {
|
removeFromWorkspace(workspace) {
|
||||||
if (this._isInWorkspace) {
|
if (this._isInWorkspace) {
|
||||||
// Remove drag shadow.
|
// Remove drag shadow.
|
||||||
workspace.removeChild(this._elem2d);
|
workspace.removeChild(this._elem2d);
|
||||||
|
|
||||||
// Remove pivot shape. To improve performance it will not be removed. Only the visibility will be changed.
|
// Remove pivot shape. To improve performance it will not be removed. Only the visibility will be changed.
|
||||||
var dragPivot = this._getDragPivot();
|
const dragPivot = this._getDragPivot();
|
||||||
dragPivot.setVisibility(false);
|
dragPivot.setVisibility(false);
|
||||||
|
|
||||||
this._isInWorkspace = false;
|
this._isInWorkspace = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
isInWorkspace:function () {
|
isInWorkspace() {
|
||||||
return this._isInWorkspace;
|
return this._isInWorkspace;
|
||||||
},
|
},
|
||||||
|
|
||||||
addToWorkspace:function (workspace) {
|
addToWorkspace(workspace) {
|
||||||
if (!this._isInWorkspace) {
|
if (!this._isInWorkspace) {
|
||||||
workspace.append(this._elem2d);
|
workspace.append(this._elem2d);
|
||||||
var dragPivot = this._getDragPivot();
|
const dragPivot = this._getDragPivot();
|
||||||
dragPivot.addToWorkspace(workspace);
|
dragPivot.addToWorkspace(workspace);
|
||||||
this._isInWorkspace = true;
|
this._isInWorkspace = true;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_getDragPivot:function () {
|
_getDragPivot() {
|
||||||
return DragTopic.__getDragPivot();
|
return DragTopic.__getDragPivot();
|
||||||
},
|
},
|
||||||
|
|
||||||
getPosition:function () {
|
getPosition() {
|
||||||
return this._position;
|
return this._position;
|
||||||
},
|
},
|
||||||
|
|
||||||
isDragTopic:function () {
|
isDragTopic() {
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
applyChanges:function (workspace) {
|
applyChanges(workspace) {
|
||||||
$assert(workspace, 'workspace can not be null');
|
$assert(workspace, 'workspace can not be null');
|
||||||
|
|
||||||
|
const actionDispatcher = ActionDispatcher.getInstance();
|
||||||
var actionDispatcher = ActionDispatcher.getInstance();
|
const draggedTopic = this.getDraggedTopic();
|
||||||
var draggedTopic = this.getDraggedTopic();
|
const topicId = draggedTopic.getId();
|
||||||
var topicId = draggedTopic.getId();
|
const position = this.getPosition();
|
||||||
var position = this.getPosition();
|
|
||||||
|
|
||||||
if (!this.isFreeLayoutOn()) {
|
if (!this.isFreeLayoutOn()) {
|
||||||
var order = null;
|
let order = null;
|
||||||
var parent = null;
|
let parent = null;
|
||||||
var isDragConnected = this.isConnected();
|
const isDragConnected = this.isConnected();
|
||||||
if (isDragConnected) {
|
if (isDragConnected) {
|
||||||
var targetTopic = this.getConnectedToTopic();
|
const targetTopic = this.getConnectedToTopic();
|
||||||
order = this._order;
|
order = this._order;
|
||||||
parent = targetTopic;
|
parent = targetTopic;
|
||||||
}
|
}
|
||||||
@ -183,34 +183,33 @@ const DragTopic = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
getConnectedToTopic:function () {
|
getConnectedToTopic() {
|
||||||
var dragPivot = this._getDragPivot();
|
const dragPivot = this._getDragPivot();
|
||||||
return dragPivot.getTargetTopic();
|
return dragPivot.getTargetTopic();
|
||||||
},
|
},
|
||||||
|
|
||||||
isConnected:function () {
|
isConnected() {
|
||||||
return this.getConnectedToTopic() != null;
|
return this.getConnectedToTopic() != null;
|
||||||
},
|
},
|
||||||
|
|
||||||
isFreeLayoutOn:function () {
|
isFreeLayoutOn() {
|
||||||
// return this._isFreeLayoutEnabled;
|
// return this._isFreeLayoutEnabled;
|
||||||
// Disable free layout ...
|
// Disable free layout ...
|
||||||
return false;
|
return false;
|
||||||
}
|
},
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
DragTopic.PIVOT_SIZE = {width:50, height:6};
|
DragTopic.PIVOT_SIZE = { width: 50, height: 6 };
|
||||||
|
|
||||||
DragTopic.init = function (workspace) {
|
DragTopic.init = function (workspace) {
|
||||||
|
$assert(workspace, 'workspace can not be null');
|
||||||
$assert(workspace, "workspace can not be null");
|
const pivot = DragTopic.__getDragPivot();
|
||||||
var pivot = DragTopic.__getDragPivot();
|
|
||||||
workspace.append(pivot);
|
workspace.append(pivot);
|
||||||
};
|
};
|
||||||
|
|
||||||
DragTopic.__getDragPivot = function () {
|
DragTopic.__getDragPivot = function () {
|
||||||
var result = DragTopic._dragPivot;
|
let result = DragTopic._dragPivot;
|
||||||
if (!$defined(result)) {
|
if (!$defined(result)) {
|
||||||
result = new DragPivot();
|
result = new DragPivot();
|
||||||
DragTopic._dragPivot = result;
|
DragTopic._dragPivot = result;
|
||||||
|
@ -16,11 +16,10 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const EditorOptions =
|
const EditorOptions = {
|
||||||
{
|
LayoutManager: 'OriginalLayout',
|
||||||
LayoutManager:"OriginalLayout",
|
// LayoutManager:"FreeMindLayout",
|
||||||
// LayoutManager:"FreeMindLayout",
|
textEditor: 'TextEditor',
|
||||||
textEditor:"TextEditor"
|
|
||||||
// textEditor:"RichTextEditor"
|
// textEditor:"RichTextEditor"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -17,22 +17,22 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const EditorProperties = new Class({
|
const EditorProperties = new Class({
|
||||||
initialize: function () {
|
initialize() {
|
||||||
this._zoom = 0;
|
this._zoom = 0;
|
||||||
this._position = 0;
|
this._position = 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
setZoom: function (zoom) {
|
setZoom(zoom) {
|
||||||
this._zoom = zoom;
|
this._zoom = zoom;
|
||||||
},
|
},
|
||||||
|
|
||||||
getZoom: function () {
|
getZoom() {
|
||||||
return this._zoom;
|
return this._zoom;
|
||||||
},
|
},
|
||||||
|
|
||||||
asProperties: function () {
|
asProperties() {
|
||||||
return "zoom=" + this._zoom + "\n";
|
return `zoom=${this._zoom}\n`;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default EditorProperties;
|
export default EditorProperties;
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
const Events = new Class({
|
const Events = new Class({
|
||||||
$events: {},
|
$events: {},
|
||||||
|
|
||||||
_removeOn: function (string) {
|
_removeOn(string) {
|
||||||
return string.replace(/^on([A-Z])/, function (full, first) {
|
return string.replace(/^on([A-Z])/, (full, first) => first.toLowerCase());
|
||||||
return first.toLowerCase();
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
addEvent: function (type, fn, internal) {
|
addEvent(type, fn, internal) {
|
||||||
type = this._removeOn(type);
|
type = this._removeOn(type);
|
||||||
|
|
||||||
this.$events[type] = (this.$events[type] || []).include(fn);
|
this.$events[type] = (this.$events[type] || []).include(fn);
|
||||||
@ -15,9 +13,9 @@ const Events = new Class({
|
|||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
fireEvent: function (type, args, delay) {
|
fireEvent(type, args, delay) {
|
||||||
type = this._removeOn(type);
|
type = this._removeOn(type);
|
||||||
var events = this.$events[type];
|
const events = this.$events[type];
|
||||||
if (!events) return this;
|
if (!events) return this;
|
||||||
args = Array.isArray(args) ? args : [args];
|
args = Array.isArray(args) ? args : [args];
|
||||||
_.each(
|
_.each(
|
||||||
@ -26,16 +24,16 @@ const Events = new Class({
|
|||||||
if (delay) fn.delay(delay, this, args);
|
if (delay) fn.delay(delay, this, args);
|
||||||
else fn.apply(this, args);
|
else fn.apply(this, args);
|
||||||
},
|
},
|
||||||
this
|
this,
|
||||||
);
|
);
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
removeEvent: function (type, fn) {
|
removeEvent(type, fn) {
|
||||||
type = this._removeOn(type);
|
type = this._removeOn(type);
|
||||||
var events = this.$events[type];
|
const events = this.$events[type];
|
||||||
if (events && !fn.internal) {
|
if (events && !fn.internal) {
|
||||||
var index = events.indexOf(fn);
|
const index = events.indexOf(fn);
|
||||||
if (index != -1) events.splice(index, 1);
|
if (index != -1) events.splice(index, 1);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
|
@ -15,44 +15,45 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const web2D = require('@wismapping/web2d')
|
const web2D = require('@wismapping/web2d');
|
||||||
const web2d = web2D()
|
|
||||||
|
const web2d = web2D();
|
||||||
|
|
||||||
const Icon = new Class({
|
const Icon = new Class({
|
||||||
initialize: function (url) {
|
initialize(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: function () {
|
getImage() {
|
||||||
return this._image;
|
return this._image;
|
||||||
},
|
},
|
||||||
|
|
||||||
setGroup: function (group) {
|
setGroup(group) {
|
||||||
this._group = group;
|
this._group = group;
|
||||||
},
|
},
|
||||||
|
|
||||||
getGroup: function () {
|
getGroup() {
|
||||||
return this._group;
|
return this._group;
|
||||||
},
|
},
|
||||||
|
|
||||||
getSize: function () {
|
getSize() {
|
||||||
return this._image.getSize();
|
return this._image.getSize();
|
||||||
},
|
},
|
||||||
|
|
||||||
getPosition: function () {
|
getPosition() {
|
||||||
return this._image.getPosition();
|
return this._image.getPosition();
|
||||||
},
|
},
|
||||||
|
|
||||||
addEvent: function (type, fnc) {
|
addEvent(type, fnc) {
|
||||||
this._image.addEvent(type, fnc);
|
this._image.addEvent(type, fnc);
|
||||||
},
|
},
|
||||||
|
|
||||||
remove: function () {
|
remove() {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Icon.SIZE = 90;
|
Icon.SIZE = 90;
|
||||||
|
@ -15,11 +15,12 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const web2D = require('@wismapping/web2d')
|
const web2D = require('@wismapping/web2d');
|
||||||
|
|
||||||
const web2d = web2D();
|
const web2d = web2D();
|
||||||
const Icon = require('./Icon');
|
const Icon = require('./Icon');
|
||||||
|
|
||||||
const IconGroup = new Class(/**@lends IconGroup */{
|
const IconGroup = new Class(/** @lends IconGroup */{
|
||||||
/**
|
/**
|
||||||
* @constructs
|
* @constructs
|
||||||
* @param topicId
|
* @param topicId
|
||||||
@ -27,9 +28,9 @@ const IconGroup = new Class(/**@lends IconGroup */{
|
|||||||
* @throws will throw an error if topicId is null or undefined
|
* @throws will throw an error if topicId is null or undefined
|
||||||
* @throws will throw an error if iconSize is null or undefined
|
* @throws will throw an error if iconSize is null or undefined
|
||||||
*/
|
*/
|
||||||
initialize: function (topicId, iconSize) {
|
initialize(topicId, iconSize) {
|
||||||
$assert($defined(topicId), "topicId can not be null");
|
$assert($defined(topicId), 'topicId can not be null');
|
||||||
$assert($defined(iconSize), "iconSize can not be null");
|
$assert($defined(iconSize), 'iconSize can not be null');
|
||||||
|
|
||||||
this._icons = [];
|
this._icons = [];
|
||||||
this._group = new web2d.Group({
|
this._group = new web2d.Group({
|
||||||
@ -38,38 +39,37 @@ const IconGroup = new Class(/**@lends IconGroup */{
|
|||||||
x: 0,
|
x: 0,
|
||||||
y: 0,
|
y: 0,
|
||||||
coordSizeWidth: 0,
|
coordSizeWidth: 0,
|
||||||
coordSizeHeight: 100
|
coordSizeHeight: 100,
|
||||||
});
|
});
|
||||||
this._removeTip = new IconGroup.RemoveTip(this._group, topicId);
|
this._removeTip = new IconGroup.RemoveTip(this._group, topicId);
|
||||||
this.seIconSize(iconSize, iconSize);
|
this.seIconSize(iconSize, iconSize);
|
||||||
|
|
||||||
this._registerListeners();
|
this._registerListeners();
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setPosition: function (x, y) {
|
setPosition(x, y) {
|
||||||
this._group.setPosition(x, y);
|
this._group.setPosition(x, y);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getPosition: function () {
|
getPosition() {
|
||||||
return this._group.getPosition();
|
return this._group.getPosition();
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getNativeElement: function () {
|
getNativeElement() {
|
||||||
return this._group;
|
return this._group;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getSize: function () {
|
getSize() {
|
||||||
return this._group.getSize();
|
return this._group.getSize();
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
seIconSize: function (width, height) {
|
seIconSize(width, height) {
|
||||||
this._iconSize = {width: width, height: height};
|
this._iconSize = { width, height };
|
||||||
this._resize(this._icons.length);
|
this._resize(this._icons.length);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -78,8 +78,8 @@ const IconGroup = new Class(/**@lends IconGroup */{
|
|||||||
* @param {Boolean} remove
|
* @param {Boolean} remove
|
||||||
* @throws will throw an error if icon is not defined
|
* @throws will throw an error if icon is not defined
|
||||||
*/
|
*/
|
||||||
addIcon: function (icon, remove) {
|
addIcon(icon, remove) {
|
||||||
$defined(icon, "icon is not defined");
|
$defined(icon, 'icon is not defined');
|
||||||
|
|
||||||
icon.setGroup(this);
|
icon.setGroup(this);
|
||||||
this._icons.push(icon);
|
this._icons.push(icon);
|
||||||
@ -88,7 +88,7 @@ const IconGroup = new Class(/**@lends IconGroup */{
|
|||||||
this._resize(this._icons.length);
|
this._resize(this._icons.length);
|
||||||
this._positionIcon(icon, this._icons.length - 1);
|
this._positionIcon(icon, this._icons.length - 1);
|
||||||
|
|
||||||
var imageShape = icon.getImage();
|
const imageShape = icon.getImage();
|
||||||
this._group.append(imageShape);
|
this._group.append(imageShape);
|
||||||
|
|
||||||
// Register event for the group ..
|
// Register event for the group ..
|
||||||
@ -97,75 +97,72 @@ const IconGroup = new Class(/**@lends IconGroup */{
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_findIconFromModel: function (iconModel) {
|
_findIconFromModel(iconModel) {
|
||||||
var result = null;
|
let result = null;
|
||||||
_.each(this._icons, function (icon) {
|
_.each(this._icons, (icon) => {
|
||||||
var elModel = icon.getModel();
|
const elModel = icon.getModel();
|
||||||
if (elModel.getId() == iconModel.getId()) {
|
if (elModel.getId() == iconModel.getId()) {
|
||||||
result = icon;
|
result = icon;
|
||||||
}
|
}
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
throw new Error("Icon can no be found:" + iconModel.getId() + ", Icons:" + this._icons);
|
throw new Error(`Icon can no be found:${iconModel.getId()}, Icons:${this._icons}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
removeIconByModel: function (featureModel) {
|
removeIconByModel(featureModel) {
|
||||||
$assert(featureModel, "featureModel can not be null");
|
$assert(featureModel, 'featureModel can not be null');
|
||||||
|
|
||||||
var icon = this._findIconFromModel(featureModel);
|
const icon = this._findIconFromModel(featureModel);
|
||||||
this._removeIcon(icon);
|
this._removeIcon(icon);
|
||||||
},
|
},
|
||||||
|
|
||||||
_removeIcon: function (icon) {
|
_removeIcon(icon) {
|
||||||
$assert(icon, "icon can not be null");
|
$assert(icon, 'icon can not be null');
|
||||||
|
|
||||||
this._removeTip.close(0);
|
this._removeTip.close(0);
|
||||||
this._group.removeChild(icon.getImage());
|
this._group.removeChild(icon.getImage());
|
||||||
|
|
||||||
this._icons.erase(icon);
|
this._icons.erase(icon);
|
||||||
this._resize(this._icons.length);
|
this._resize(this._icons.length);
|
||||||
var me = this;
|
const me = this;
|
||||||
// Add all again ...
|
// Add all again ...
|
||||||
_.each(this._icons, function (elem, i) {
|
_.each(this._icons, (elem, i) => {
|
||||||
me._positionIcon(elem, i);
|
me._positionIcon(elem, i);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
moveToFront: function () {
|
moveToFront() {
|
||||||
this._group.moveToFront();
|
this._group.moveToFront();
|
||||||
},
|
},
|
||||||
|
|
||||||
_registerListeners: function () {
|
_registerListeners() {
|
||||||
this._group.addEvent('click', function (event) {
|
this._group.addEvent('click', (event) => {
|
||||||
// Avoid node creation ...
|
// Avoid node creation ...
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
this._group.addEvent('dblclick', function (event) {
|
this._group.addEvent('dblclick', (event) => {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
_resize: function (iconsLength) {
|
_resize(iconsLength) {
|
||||||
this._group.setSize(iconsLength * this._iconSize.width, this._iconSize.height);
|
this._group.setSize(iconsLength * this._iconSize.width, this._iconSize.height);
|
||||||
|
|
||||||
var iconSize = Icon.SIZE + (IconGroup.ICON_PADDING * 2);
|
const iconSize = Icon.SIZE + (IconGroup.ICON_PADDING * 2);
|
||||||
this._group.setCoordSize(iconsLength * iconSize, iconSize);
|
this._group.setCoordSize(iconsLength * iconSize, iconSize);
|
||||||
},
|
},
|
||||||
|
|
||||||
_positionIcon: function (icon, order) {
|
_positionIcon(icon, order) {
|
||||||
|
const iconSize = Icon.SIZE + (IconGroup.ICON_PADDING * 2);
|
||||||
var iconSize = Icon.SIZE + (IconGroup.ICON_PADDING * 2);
|
|
||||||
icon.getImage().setPosition(iconSize * order + IconGroup.ICON_PADDING, IconGroup.ICON_PADDING);
|
icon.getImage().setPosition(iconSize * order + IconGroup.ICON_PADDING, IconGroup.ICON_PADDING);
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -181,18 +178,17 @@ IconGroup.RemoveTip = new Class(/** @lends IconGroup.RemoveTip */{
|
|||||||
* @constructs
|
* @constructs
|
||||||
* @param container
|
* @param container
|
||||||
*/
|
*/
|
||||||
initialize: function (container) {
|
initialize(container) {
|
||||||
$assert(container, "group can not be null");
|
$assert(container, 'group can not be null');
|
||||||
this._fadeElem = container;
|
this._fadeElem = container;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param topicId
|
* @param topicId
|
||||||
* @param icon
|
* @param icon
|
||||||
* @throws will throw an error if icon is null or undefined
|
* @throws will throw an error if icon is null or undefined
|
||||||
*/
|
*/
|
||||||
show: function (topicId, icon) {
|
show(topicId, icon) {
|
||||||
$assert(icon, 'icon can not be null');
|
$assert(icon, 'icon can not be null');
|
||||||
|
|
||||||
// Nothing to do ...
|
// Nothing to do ...
|
||||||
@ -203,21 +199,21 @@ IconGroup.RemoveTip = new Class(/** @lends IconGroup.RemoveTip */{
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Now, let move the position the icon...
|
// Now, let move the position the icon...
|
||||||
var pos = icon.getPosition();
|
const pos = icon.getPosition();
|
||||||
|
|
||||||
// Register events ...
|
// Register events ...
|
||||||
var widget = this._buildWeb2d();
|
const widget = this._buildWeb2d();
|
||||||
widget.addEvent('click', function () {
|
widget.addEvent('click', () => {
|
||||||
icon.remove();
|
icon.remove();
|
||||||
});
|
});
|
||||||
|
|
||||||
var me = this;
|
const me = this;
|
||||||
|
|
||||||
widget.addEvent('mouseover', function () {
|
widget.addEvent('mouseover', () => {
|
||||||
me.show(topicId, icon);
|
me.show(topicId, icon);
|
||||||
});
|
});
|
||||||
|
|
||||||
widget.addEvent('mouseout', function () {
|
widget.addEvent('mouseout', () => {
|
||||||
me.hide();
|
me.hide();
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -227,31 +223,29 @@ IconGroup.RemoveTip = new Class(/** @lends IconGroup.RemoveTip */{
|
|||||||
// Setup current element ...
|
// Setup current element ...
|
||||||
this._activeIcon = icon;
|
this._activeIcon = icon;
|
||||||
this._widget = widget;
|
this._widget = widget;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
clearTimeout(this._closeTimeoutId);
|
clearTimeout(this._closeTimeoutId);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
hide: function () {
|
hide() {
|
||||||
this.close(200);
|
this.close(200);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param delay
|
* @param delay
|
||||||
*/
|
*/
|
||||||
close: function (delay) {
|
close(delay) {
|
||||||
|
|
||||||
// This is not ok, trying to close the same dialog twice ?
|
// This is not ok, trying to close the same dialog twice ?
|
||||||
if (this._closeTimeoutId) {
|
if (this._closeTimeoutId) {
|
||||||
clearTimeout(this._closeTimeoutId)
|
clearTimeout(this._closeTimeoutId);
|
||||||
}
|
}
|
||||||
|
|
||||||
var me = this;
|
const me = this;
|
||||||
if (this._activeIcon) {
|
if (this._activeIcon) {
|
||||||
var widget = this._widget;
|
const widget = this._widget;
|
||||||
var close = function () {
|
const close = function () {
|
||||||
me._activeIcon = null;
|
me._activeIcon = null;
|
||||||
me._fadeElem.removeChild(widget);
|
me._fadeElem.removeChild(widget);
|
||||||
me._widget = null;
|
me._widget = null;
|
||||||
@ -260,59 +254,58 @@ IconGroup.RemoveTip = new Class(/** @lends IconGroup.RemoveTip */{
|
|||||||
|
|
||||||
if (!$defined(delay) || delay == 0) {
|
if (!$defined(delay) || delay == 0) {
|
||||||
close();
|
close();
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
this._closeTimeoutId = close.delay(delay);
|
this._closeTimeoutId = close.delay(delay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_buildWeb2d: function () {
|
_buildWeb2d() {
|
||||||
var result = new web2d.Group({
|
const result = new web2d.Group({
|
||||||
width: 10,
|
width: 10,
|
||||||
height: 10,
|
height: 10,
|
||||||
x: 0,
|
x: 0,
|
||||||
y: 0,
|
y: 0,
|
||||||
coordSizeWidth: 10,
|
coordSizeWidth: 10,
|
||||||
coordSizeHeight: 10
|
coordSizeHeight: 10,
|
||||||
});
|
});
|
||||||
|
|
||||||
var outerRect = new web2d.Rect(0, {
|
const outerRect = new web2d.Rect(0, {
|
||||||
x: 0,
|
x: 0,
|
||||||
y: 0,
|
y: 0,
|
||||||
width: 10,
|
width: 10,
|
||||||
height: 10,
|
height: 10,
|
||||||
stroke: '0',
|
stroke: '0',
|
||||||
fillColor: 'black'
|
fillColor: 'black',
|
||||||
});
|
});
|
||||||
result.append(outerRect);
|
result.append(outerRect);
|
||||||
outerRect.setCursor('pointer');
|
outerRect.setCursor('pointer');
|
||||||
|
|
||||||
var innerRect = new web2d.Rect(0, {
|
const innerRect = new web2d.Rect(0, {
|
||||||
x: 1,
|
x: 1,
|
||||||
y: 1,
|
y: 1,
|
||||||
width: 8,
|
width: 8,
|
||||||
height: 8,
|
height: 8,
|
||||||
stroke: '1 solid white',
|
stroke: '1 solid white',
|
||||||
fillColor: 'gray'
|
fillColor: 'gray',
|
||||||
});
|
});
|
||||||
result.append(innerRect);
|
result.append(innerRect);
|
||||||
|
|
||||||
var line = new web2d.Line({stroke: '1 solid white'});
|
const line = new web2d.Line({ stroke: '1 solid white' });
|
||||||
line.setFrom(1, 1);
|
line.setFrom(1, 1);
|
||||||
line.setTo(9, 9);
|
line.setTo(9, 9);
|
||||||
result.append(line);
|
result.append(line);
|
||||||
|
|
||||||
var line2 = new web2d.Line({stroke: '1 solid white'});
|
const line2 = new web2d.Line({ stroke: '1 solid white' });
|
||||||
line2.setFrom(1, 9);
|
line2.setFrom(1, 9);
|
||||||
line2.setTo(9, 1);
|
line2.setTo(9, 1);
|
||||||
result.append(line2);
|
result.append(line2);
|
||||||
|
|
||||||
// Some events ...
|
// Some events ...
|
||||||
result.addEvent('mouseover', function () {
|
result.addEvent('mouseover', () => {
|
||||||
innerRect.setFill('#CC0033');
|
innerRect.setFill('#CC0033');
|
||||||
});
|
});
|
||||||
result.addEvent('mouseout', function () {
|
result.addEvent('mouseout', () => {
|
||||||
innerRect.setFill('gray');
|
innerRect.setFill('gray');
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -324,21 +317,20 @@ IconGroup.RemoveTip = new Class(/** @lends IconGroup.RemoveTip */{
|
|||||||
* @param topicId
|
* @param topicId
|
||||||
* @param icon
|
* @param icon
|
||||||
*/
|
*/
|
||||||
decorate: function (topicId, icon) {
|
decorate(topicId, icon) {
|
||||||
|
const me = this;
|
||||||
var me = this;
|
|
||||||
|
|
||||||
if (!icon.__remove) {
|
if (!icon.__remove) {
|
||||||
icon.addEvent('mouseover', function () {
|
icon.addEvent('mouseover', () => {
|
||||||
me.show(topicId, icon);
|
me.show(topicId, icon);
|
||||||
});
|
});
|
||||||
|
|
||||||
icon.addEvent('mouseout', function () {
|
icon.addEvent('mouseout', () => {
|
||||||
me.hide();
|
me.hide();
|
||||||
});
|
});
|
||||||
icon.__remove = true;
|
icon.__remove = true;
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ const ActionDispatcher = require('./ActionDispatcher').default;
|
|||||||
|
|
||||||
const ImageIcon = new Class({
|
const ImageIcon = new Class({
|
||||||
Extends: Icon,
|
Extends: Icon,
|
||||||
initialize: function (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');
|
||||||
|
|
||||||
@ -28,46 +28,42 @@ const ImageIcon = new Class({
|
|||||||
this._featureModel = iconModel;
|
this._featureModel = iconModel;
|
||||||
|
|
||||||
// Build graph image representation ...
|
// Build graph image representation ...
|
||||||
var iconType = iconModel.getIconType();
|
const iconType = iconModel.getIconType();
|
||||||
var imgUrl = this._getImageUrl(iconType);
|
const imgUrl = this._getImageUrl(iconType);
|
||||||
this.parent(imgUrl);
|
this.parent(imgUrl);
|
||||||
|
|
||||||
if (!readOnly) {
|
if (!readOnly) {
|
||||||
|
// Icon
|
||||||
//Icon
|
const image = this.getImage();
|
||||||
var image = this.getImage();
|
const me = this;
|
||||||
var me = this;
|
image.addEvent('click', () => {
|
||||||
image.addEvent('click', function () {
|
const iconType = iconModel.getIconType();
|
||||||
|
const newIconType = me._getNextFamilyIconId(iconType);
|
||||||
var iconType = iconModel.getIconType();
|
|
||||||
var newIconType = me._getNextFamilyIconId(iconType);
|
|
||||||
iconModel.setIconType(newIconType);
|
iconModel.setIconType(newIconType);
|
||||||
|
|
||||||
var imgUrl = me._getImageUrl(newIconType);
|
const imgUrl = me._getImageUrl(newIconType);
|
||||||
me._image.setHref(imgUrl);
|
me._image.setHref(imgUrl);
|
||||||
|
|
||||||
});
|
});
|
||||||
this._image.setCursor('pointer');
|
this._image.setCursor('pointer');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_getImageUrl: function (iconId) {
|
_getImageUrl(iconId) {
|
||||||
return "icons/" + iconId + ".png";
|
return `icons/${iconId}.png`;
|
||||||
},
|
},
|
||||||
|
|
||||||
getModel: function () {
|
getModel() {
|
||||||
return this._featureModel;
|
return this._featureModel;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getNextFamilyIconId: function (iconId) {
|
_getNextFamilyIconId(iconId) {
|
||||||
|
const familyIcons = this._getFamilyIcons(iconId);
|
||||||
|
$assert(familyIcons != null, 'Family Icon not found!');
|
||||||
|
|
||||||
var familyIcons = this._getFamilyIcons(iconId);
|
let result = null;
|
||||||
$assert(familyIcons != null, "Family Icon not found!");
|
for (let i = 0; i < familyIcons.length && result == null; i++) {
|
||||||
|
|
||||||
var result = null;
|
|
||||||
for (var 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 {
|
||||||
@ -80,14 +76,14 @@ const ImageIcon = new Class({
|
|||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getFamilyIcons: function (iconId) {
|
_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 '_')");
|
||||||
|
|
||||||
var result = null;
|
let result = null;
|
||||||
for (var i = 0; i < ImageIcon.prototype.ICON_FAMILIES.length; i++) {
|
for (let i = 0; i < ImageIcon.prototype.ICON_FAMILIES.length; i++) {
|
||||||
var family = ImageIcon.prototype.ICON_FAMILIES[i];
|
const family = ImageIcon.prototype.ICON_FAMILIES[i];
|
||||||
var 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;
|
||||||
@ -97,70 +93,70 @@ const ImageIcon = new Class({
|
|||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
remove: function () {
|
remove() {
|
||||||
var actionDispatcher = ActionDispatcher.getInstance();
|
const actionDispatcher = ActionDispatcher.getInstance();
|
||||||
var featureId = this._featureModel.getId();
|
const featureId = this._featureModel.getId();
|
||||||
var 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'] },
|
||||||
{"id": "funy", "icons": ["funy_angel", "funy_devilish", "funy_glasses", "funy_grin", "funy_kiss", "funy_monkey"]},
|
{ id: 'funy', icons: ['funy_angel', 'funy_devilish', 'funy_glasses', 'funy_grin', 'funy_kiss', 'funy_monkey'] },
|
||||||
{"id": "conn", "icons": ["conn_connect", "conn_disconnect"]},
|
{ id: 'conn', icons: ['conn_connect', 'conn_disconnect'] },
|
||||||
{
|
{
|
||||||
"id": "sport",
|
id: 'sport',
|
||||||
"icons": ["sport_basketball", "sport_football", "sport_golf", "sport_raquet", "sport_shuttlecock", "sport_soccer", "sport_tennis"]
|
icons: ['sport_basketball', 'sport_football', 'sport_golf', 'sport_raquet', 'sport_shuttlecock', 'sport_soccer', 'sport_tennis'],
|
||||||
},
|
},
|
||||||
{"id": "bulb", "icons": ["bulb_light_on", "bulb_light_off"]},
|
{ id: 'bulb', icons: ['bulb_light_on', 'bulb_light_off'] },
|
||||||
{"id": "thumb", "icons": ["thumb_thumb_up", "thumb_thumb_down"]},
|
{ id: 'thumb', icons: ['thumb_thumb_up', 'thumb_thumb_down'] },
|
||||||
{"id": "tick", "icons": ["tick_tick", "tick_cross"]},
|
{ id: 'tick', icons: ['tick_tick', 'tick_cross'] },
|
||||||
{
|
{
|
||||||
"id": "onoff",
|
id: 'onoff',
|
||||||
"icons": ["onoff_clock", "onoff_clock_red", "onoff_add", "onoff_delete", "onoff_status_offline", "onoff_status_online"]
|
icons: ['onoff_clock', 'onoff_clock_red', 'onoff_add', 'onoff_delete', 'onoff_status_offline', 'onoff_status_online'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "money",
|
id: 'money',
|
||||||
"icons": ["money_money", "money_dollar", "money_euro", "money_pound", "money_yen", "money_coins", "money_ruby"]
|
icons: ['money_money', 'money_dollar', 'money_euro', 'money_pound', 'money_yen', 'money_coins', 'money_ruby'],
|
||||||
},
|
},
|
||||||
{"id": "time", "icons": ["time_calendar", "time_clock", "time_hourglass"]},
|
{ id: 'time', icons: ['time_calendar', 'time_clock', 'time_hourglass'] },
|
||||||
{
|
{
|
||||||
"id": "number",
|
id: 'number',
|
||||||
"icons": ["number_1", "number_2", "number_3", "number_4", "number_5", "number_6", "number_7", "number_8", "number_9"]
|
icons: ['number_1', 'number_2', 'number_3', 'number_4', 'number_5', 'number_6', 'number_7', 'number_8', 'number_9'],
|
||||||
},
|
},
|
||||||
{"id": "chart", "icons": ["chart_bar", "chart_line", "chart_curve", "chart_pie", "chart_organisation"]},
|
{ id: 'chart', icons: ['chart_bar', 'chart_line', 'chart_curve', 'chart_pie', 'chart_organisation'] },
|
||||||
{"id": "sign", "icons": ["sign_warning", "sign_info", "sign_stop", "sign_help", "sign_cancel"]},
|
{ id: 'sign', icons: ['sign_warning', 'sign_info', 'sign_stop', 'sign_help', 'sign_cancel'] },
|
||||||
{
|
{
|
||||||
"id": "hard",
|
id: 'hard',
|
||||||
"icons": ["hard_cd", "hard_computer", "hard_controller", "hard_driver_disk", "hard_ipod", "hard_keyboard", "hard_mouse", "hard_printer"]
|
icons: ['hard_cd', 'hard_computer', 'hard_controller', 'hard_driver_disk', 'hard_ipod', 'hard_keyboard', 'hard_mouse', 'hard_printer'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "soft",
|
id: 'soft',
|
||||||
"icons": ["soft_bug", "soft_cursor", "soft_database_table", "soft_database", "soft_feed", "soft_folder_explore", "soft_rss", "soft_penguin"]
|
icons: ['soft_bug', 'soft_cursor', 'soft_database_table', 'soft_database', 'soft_feed', 'soft_folder_explore', 'soft_rss', 'soft_penguin'],
|
||||||
},
|
},
|
||||||
{"id": "arrow", "icons": ["arrow_up", "arrow_down", "arrow_left", "arrow_right"]},
|
{ id: 'arrow', icons: ['arrow_up', 'arrow_down', 'arrow_left', 'arrow_right'] },
|
||||||
{
|
{
|
||||||
"id": "arrowc",
|
id: 'arrowc',
|
||||||
"icons": ["arrowc_rotate_anticlockwise", "arrowc_rotate_clockwise", "arrowc_turn_left", "arrowc_turn_right"]
|
icons: ['arrowc_rotate_anticlockwise', 'arrowc_rotate_clockwise', 'arrowc_turn_left', 'arrowc_turn_right'],
|
||||||
},
|
},
|
||||||
{"id": "people", "icons": ["people_group", "people_male1", "people_male2", "people_female1", "people_female2"]},
|
{ id: 'people', icons: ['people_group', 'people_male1', 'people_male2', 'people_female1', 'people_female2'] },
|
||||||
{"id": "mail", "icons": ["mail_envelop", "mail_mailbox", "mail_edit", "mail_list"]},
|
{ id: 'mail', icons: ['mail_envelop', 'mail_mailbox', 'mail_edit', 'mail_list'] },
|
||||||
{"id": "flag", "icons": ["flag_blue", "flag_green", "flag_orange", "flag_pink", "flag_purple", "flag_yellow"]},
|
{ id: 'flag', icons: ['flag_blue', 'flag_green', 'flag_orange', 'flag_pink', 'flag_purple', 'flag_yellow'] },
|
||||||
{
|
{
|
||||||
"id": "bullet",
|
id: 'bullet',
|
||||||
"icons": ["bullet_black", "bullet_blue", "bullet_green", "bullet_orange", "bullet_red", "bullet_pink", "bullet_purple"]
|
icons: ['bullet_black', 'bullet_blue', 'bullet_green', 'bullet_orange', 'bullet_red', 'bullet_pink', 'bullet_purple'],
|
||||||
},
|
},
|
||||||
{"id": "tag", "icons": ["tag_blue", "tag_green", "tag_orange", "tag_red", "tag_pink", "tag_yellow"]},
|
{ id: 'tag', icons: ['tag_blue', 'tag_green', 'tag_orange', 'tag_red', 'tag_pink', 'tag_yellow'] },
|
||||||
{
|
{
|
||||||
"id": "object",
|
id: 'object',
|
||||||
"icons": ["object_bell", "object_clanbomber", "object_key", "object_pencil", "object_phone", "object_magnifier", "object_clip", "object_music", "object_star", "object_wizard", "object_house", "object_cake", "object_camera", "object_palette", "object_rainbow"]
|
icons: ['object_bell', 'object_clanbomber', 'object_key', 'object_pencil', 'object_phone', 'object_magnifier', 'object_clip', 'object_music', 'object_star', 'object_wizard', 'object_house', 'object_cake', 'object_camera', 'object_palette', 'object_rainbow'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "weather",
|
id: 'weather',
|
||||||
"icons": ["weather_clear-night", "weather_clear", "weather_few-clouds-night", "weather_few-clouds", "weather_overcast", "weather_severe-alert", "weather_showers-scattered", "weather_showers", "weather_snow", "weather_storm"]
|
icons: ['weather_clear-night', 'weather_clear', 'weather_few-clouds-night', 'weather_few-clouds', 'weather_overcast', 'weather_severe-alert', 'weather_showers-scattered', 'weather_showers', 'weather_snow', 'weather_storm'],
|
||||||
},
|
},
|
||||||
{"id": "task", "icons": ["task_0", "task_25", "task_50", "task_75", "task_100"]}
|
{ id: 'task', icons: ['task_0', 'task_25', 'task_50', 'task_75', 'task_100'] },
|
||||||
];
|
];
|
||||||
|
|
||||||
export default ImageIcon;
|
export default ImageIcon;
|
||||||
|
@ -18,17 +18,17 @@
|
|||||||
|
|
||||||
const Keyboard = new Class({
|
const Keyboard = new Class({
|
||||||
|
|
||||||
initialize: function () {
|
initialize() {
|
||||||
},
|
},
|
||||||
|
|
||||||
addShortcut: function (shortcuts, callback) {
|
addShortcut(shortcuts, callback) {
|
||||||
if (!$.isArray(shortcuts)) {
|
if (!$.isArray(shortcuts)) {
|
||||||
shortcuts = [shortcuts];
|
shortcuts = [shortcuts];
|
||||||
}
|
}
|
||||||
_.each(shortcuts, function (shortcut) {
|
_.each(shortcuts, (shortcut) => {
|
||||||
$(document).bind('keydown', shortcut, callback);
|
$(document).bind('keydown', shortcut, callback);
|
||||||
});
|
});
|
||||||
}
|
},
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ const LinkIconTooltip = require('./widget/LinkIconTooltip').default;
|
|||||||
const LinkIcon = new Class({
|
const LinkIcon = new Class({
|
||||||
|
|
||||||
Extends: Icon,
|
Extends: Icon,
|
||||||
initialize: function (topic, linkModel, readOnly) {
|
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');
|
||||||
|
|
||||||
@ -33,40 +33,38 @@ const LinkIcon = new Class({
|
|||||||
this._registerEvents();
|
this._registerEvents();
|
||||||
},
|
},
|
||||||
|
|
||||||
_registerEvents: function () {
|
_registerEvents() {
|
||||||
this._image.setCursor('pointer');
|
this._image.setCursor('pointer');
|
||||||
this._tip = new LinkIconTooltip(this);
|
this._tip = new LinkIconTooltip(this);
|
||||||
|
|
||||||
var me = this;
|
const me = this;
|
||||||
if (!this._readOnly) {
|
if (!this._readOnly) {
|
||||||
// Add on click event to open the editor ...
|
// Add on click event to open the editor ...
|
||||||
this.addEvent('click', function (event) {
|
this.addEvent('click', (event) => {
|
||||||
me._tip.hide();
|
me._tip.hide();
|
||||||
me._topic.showLinkEditor();
|
me._topic.showLinkEditor();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
});
|
});
|
||||||
//FIXME: we shouldn't have timeout of that..
|
// FIXME: we shouldn't have timeout of that..
|
||||||
this.addEvent("mouseleave", function (event) {
|
this.addEvent('mouseleave', (event) => {
|
||||||
window.setTimeout(function () {
|
window.setTimeout(() => {
|
||||||
if (!$("#linkPopover:hover").length) {
|
if (!$('#linkPopover:hover').length) {
|
||||||
me._tip.hide();
|
me._tip.hide();
|
||||||
}
|
}
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
}, 100)
|
}, 100);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
$(this.getImage()._peer._native).mouseenter(function () {
|
$(this.getImage()._peer._native).mouseenter(() => {
|
||||||
me._tip.show();
|
me._tip.show();
|
||||||
})
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
getModel: function () {
|
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;
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,46 +19,45 @@ const PersistenceManager = require('./PersistenceManager').default;
|
|||||||
|
|
||||||
const LocalStorageManager = new Class({
|
const LocalStorageManager = new Class({
|
||||||
Extends: PersistenceManager,
|
Extends: PersistenceManager,
|
||||||
initialize: function (documentUrl, forceLoad) {
|
initialize(documentUrl, forceLoad) {
|
||||||
this.parent();
|
this.parent();
|
||||||
this.documentUrl = documentUrl;
|
this.documentUrl = documentUrl;
|
||||||
this.forceLoad = forceLoad;
|
this.forceLoad = forceLoad;
|
||||||
},
|
},
|
||||||
|
|
||||||
saveMapXml: function (mapId, mapXml, pref, saveHistory, events) {
|
saveMapXml(mapId, mapXml, pref, saveHistory, events) {
|
||||||
localStorage.setItem(mapId + "-xml", mapXml);
|
localStorage.setItem(`${mapId}-xml`, mapXml);
|
||||||
},
|
},
|
||||||
|
|
||||||
discardChanges: function (mapId) {
|
discardChanges(mapId) {
|
||||||
localStorage.removeItem(mapId + "-xml");
|
localStorage.removeItem(`${mapId}-xml`);
|
||||||
},
|
},
|
||||||
|
|
||||||
loadMapDom: function (mapId) {
|
loadMapDom(mapId) {
|
||||||
var xml = localStorage.getItem(mapId + "-xml");
|
let xml = localStorage.getItem(`${mapId}-xml`);
|
||||||
if (xml == null || this.forceLoad) {
|
if (xml == null || this.forceLoad) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: this.documentUrl.replace("{id}", mapId),
|
url: this.documentUrl.replace('{id}', mapId),
|
||||||
headers: {"Content-Type": "text/plain", "Accept": "application/xml"},
|
headers: { 'Content-Type': 'text/plain', Accept: 'application/xml' },
|
||||||
type: 'get',
|
type: 'get',
|
||||||
dataType: "text",
|
dataType: 'text',
|
||||||
async: false,
|
async: false,
|
||||||
success: function (response) {
|
success(response) {
|
||||||
xml = response;
|
xml = response;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
// If I could not load it from a file, hard code one.
|
// If I could not load it from a file, hard code one.
|
||||||
if (xml == null) {
|
if (xml == null) {
|
||||||
throw new Error("Map could not be loaded");
|
throw new Error('Map could not be loaded');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return jQuery.parseXML(xml);
|
return jQuery.parseXML(xml);
|
||||||
},
|
},
|
||||||
|
|
||||||
unlockMap: function (mindmap) {
|
unlockMap(mindmap) {
|
||||||
// Ignore, no implementation required ...
|
// Ignore, no implementation required ...
|
||||||
}
|
},
|
||||||
}
|
});
|
||||||
);
|
|
||||||
|
|
||||||
export default LocalStorageManager;
|
export default LocalStorageManager;
|
||||||
|
@ -15,9 +15,11 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const Core = require('@wismapping/core-js')
|
const Core = require('@wismapping/core-js');
|
||||||
|
|
||||||
const core = Core();
|
const core = Core();
|
||||||
const web2D = require('@wismapping/web2d');
|
const web2D = require('@wismapping/web2d');
|
||||||
|
|
||||||
const web2d = web2D();
|
const web2d = web2D();
|
||||||
|
|
||||||
const Topic = require('./Topic').default;
|
const Topic = require('./Topic').default;
|
||||||
@ -32,41 +34,41 @@ const MainTopic = new Class(/** @lends MainTopic */ {
|
|||||||
* @param model
|
* @param model
|
||||||
* @param options
|
* @param options
|
||||||
*/
|
*/
|
||||||
initialize: function (model, options) {
|
initialize(model, options) {
|
||||||
this.parent(model, options);
|
this.parent(model, options);
|
||||||
},
|
},
|
||||||
|
|
||||||
INNER_RECT_ATTRIBUTES: { stroke: '0.5 solid #009900' },
|
INNER_RECT_ATTRIBUTES: { stroke: '0.5 solid #009900' },
|
||||||
|
|
||||||
_buildDragShape: function () {
|
_buildDragShape() {
|
||||||
var innerShape = this._buildShape(this.INNER_RECT_ATTRIBUTES, this.getShapeType());
|
const innerShape = this._buildShape(this.INNER_RECT_ATTRIBUTES, this.getShapeType());
|
||||||
var size = this.getSize();
|
const size = this.getSize();
|
||||||
innerShape.setSize(size.width, size.height);
|
innerShape.setSize(size.width, size.height);
|
||||||
innerShape.setPosition(0, 0);
|
innerShape.setPosition(0, 0);
|
||||||
innerShape.setOpacity(0.5);
|
innerShape.setOpacity(0.5);
|
||||||
innerShape.setCursor('default');
|
innerShape.setCursor('default');
|
||||||
innerShape.setVisibility(true);
|
innerShape.setVisibility(true);
|
||||||
|
|
||||||
var brColor = this.getBorderColor();
|
const brColor = this.getBorderColor();
|
||||||
innerShape.setAttribute('strokeColor', brColor);
|
innerShape.setAttribute('strokeColor', brColor);
|
||||||
|
|
||||||
var bgColor = this.getBackgroundColor();
|
const bgColor = this.getBackgroundColor();
|
||||||
innerShape.setAttribute('fillColor', bgColor);
|
innerShape.setAttribute('fillColor', bgColor);
|
||||||
|
|
||||||
// Create group ...
|
// Create group ...
|
||||||
var groupAttributes = {
|
const groupAttributes = {
|
||||||
width: 100,
|
width: 100,
|
||||||
height: 100,
|
height: 100,
|
||||||
coordSizeWidth: 100,
|
coordSizeWidth: 100,
|
||||||
coordSizeHeight: 100,
|
coordSizeHeight: 100,
|
||||||
};
|
};
|
||||||
var group = new web2d.Group(groupAttributes);
|
const group = new web2d.Group(groupAttributes);
|
||||||
group.append(innerShape);
|
group.append(innerShape);
|
||||||
|
|
||||||
// Add Text ...
|
// Add Text ...
|
||||||
if (this.getShapeType() != TopicShape.IMAGE) {
|
if (this.getShapeType() != TopicShape.IMAGE) {
|
||||||
var textShape = this._buildTextShape(true);
|
const textShape = this._buildTextShape(true);
|
||||||
var text = this.getText();
|
const text = this.getText();
|
||||||
textShape.setText(text);
|
textShape.setText(text);
|
||||||
textShape.setOpacity(0.5);
|
textShape.setOpacity(0.5);
|
||||||
group.append(textShape);
|
group.append(textShape);
|
||||||
@ -75,10 +77,10 @@ const MainTopic = new Class(/** @lends MainTopic */ {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
updateTopicShape: function (targetTopic, workspace) {
|
updateTopicShape(targetTopic, workspace) {
|
||||||
// Change figure based on the connected topic ...
|
// Change figure based on the connected topic ...
|
||||||
var model = this.getModel();
|
const model = this.getModel();
|
||||||
var shapeType = model.getShapeType();
|
let shapeType = model.getShapeType();
|
||||||
if (!targetTopic.isCentralTopic()) {
|
if (!targetTopic.isCentralTopic()) {
|
||||||
if (!$defined(shapeType)) {
|
if (!$defined(shapeType)) {
|
||||||
// Get the real shape type ...
|
// Get the real shape type ...
|
||||||
@ -89,54 +91,54 @@ const MainTopic = new Class(/** @lends MainTopic */ {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
disconnect: function (workspace) {
|
disconnect(workspace) {
|
||||||
this.parent(workspace);
|
this.parent(workspace);
|
||||||
var size = this.getSize();
|
const size = this.getSize();
|
||||||
|
|
||||||
var model = this.getModel();
|
const model = this.getModel();
|
||||||
var shapeType = model.getShapeType();
|
let shapeType = model.getShapeType();
|
||||||
if (!$defined(shapeType)) {
|
if (!$defined(shapeType)) {
|
||||||
// Change figure ...
|
// Change figure ...
|
||||||
shapeType = this.getShapeType();
|
shapeType = this.getShapeType();
|
||||||
this._setShapeType(TopicShape.ROUNDED_RECT, false);
|
this._setShapeType(TopicShape.ROUNDED_RECT, false);
|
||||||
}
|
}
|
||||||
var innerShape = this.getInnerShape();
|
const innerShape = this.getInnerShape();
|
||||||
innerShape.setVisibility(true);
|
innerShape.setVisibility(true);
|
||||||
},
|
},
|
||||||
|
|
||||||
_updatePositionOnChangeSize: function (oldSize, newSize) {
|
_updatePositionOnChangeSize(oldSize, newSize) {
|
||||||
var xOffset = Math.round((newSize.width - oldSize.width) / 2);
|
const xOffset = Math.round((newSize.width - oldSize.width) / 2);
|
||||||
var pos = this.getPosition();
|
const pos = this.getPosition();
|
||||||
if ($defined(pos)) {
|
if ($defined(pos)) {
|
||||||
if (pos.x > 0) {
|
if (pos.x > 0) {
|
||||||
pos.x = pos.x + xOffset;
|
pos.x += xOffset;
|
||||||
} else {
|
} else {
|
||||||
pos.x = pos.x - xOffset;
|
pos.x -= xOffset;
|
||||||
}
|
}
|
||||||
this.setPosition(pos);
|
this.setPosition(pos);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
workoutIncomingConnectionPoint: function (sourcePosition) {
|
workoutIncomingConnectionPoint(sourcePosition) {
|
||||||
return Shape.workoutIncomingConnectionPoint(this, sourcePosition);
|
return Shape.workoutIncomingConnectionPoint(this, sourcePosition);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
workoutOutgoingConnectionPoint: function (targetPosition) {
|
workoutOutgoingConnectionPoint(targetPosition) {
|
||||||
$assert(targetPosition, 'targetPoint can not be null');
|
$assert(targetPosition, 'targetPoint can not be null');
|
||||||
var pos = this.getPosition();
|
const pos = this.getPosition();
|
||||||
var isAtRight = Shape.isAtRight(targetPosition, pos);
|
const isAtRight = Shape.isAtRight(targetPosition, pos);
|
||||||
var size = this.getSize();
|
const size = this.getSize();
|
||||||
|
|
||||||
var result;
|
let result;
|
||||||
if (this.getShapeType() == TopicShape.LINE) {
|
if (this.getShapeType() == TopicShape.LINE) {
|
||||||
result = new core.Point();
|
result = new core.Point();
|
||||||
var groupPosition = this._elem2d.getPosition();
|
const groupPosition = this._elem2d.getPosition();
|
||||||
var innerShareSize = this.getInnerShape().getSize();
|
const innerShareSize = this.getInnerShape().getSize();
|
||||||
|
|
||||||
if (innerShareSize) {
|
if (innerShareSize) {
|
||||||
var magicCorrectionNumber = 0.3;
|
const magicCorrectionNumber = 0.3;
|
||||||
if (!isAtRight) {
|
if (!isAtRight) {
|
||||||
result.x = groupPosition.x + innerShareSize.width - magicCorrectionNumber;
|
result.x = groupPosition.x + innerShareSize.width - magicCorrectionNumber;
|
||||||
} else {
|
} else {
|
||||||
@ -158,12 +160,11 @@ const MainTopic = new Class(/** @lends MainTopic */ {
|
|||||||
pos,
|
pos,
|
||||||
size,
|
size,
|
||||||
isAtRight,
|
isAtRight,
|
||||||
true
|
true,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
}
|
});
|
||||||
);
|
|
||||||
|
|
||||||
export default MainTopic;
|
export default MainTopic;
|
||||||
|
@ -18,9 +18,9 @@
|
|||||||
|
|
||||||
const Messages = new Class({
|
const Messages = new Class({
|
||||||
Static: {
|
Static: {
|
||||||
init: function (locale) {
|
init(locale) {
|
||||||
locale = $defined(locale) ? locale : 'en';
|
locale = $defined(locale) ? locale : 'en';
|
||||||
var bundle = Messages.BUNDLES[locale];
|
let bundle = Messages.BUNDLES[locale];
|
||||||
if (bundle == null && locale.indexOf('_') != -1) {
|
if (bundle == null && locale.indexOf('_') != -1) {
|
||||||
// Try to locate without the specialization ...
|
// Try to locate without the specialization ...
|
||||||
locale = locale.substring(0, locale.indexOf('_'));
|
locale = locale.substring(0, locale.indexOf('_'));
|
||||||
@ -36,8 +36,8 @@ global.$msg = function (key) {
|
|||||||
Messages.init('en');
|
Messages.init('en');
|
||||||
}
|
}
|
||||||
|
|
||||||
var msg = Messages.__bundle[key];
|
const msg = Messages.__bundle[key];
|
||||||
return msg ? msg : key;
|
return msg || key;
|
||||||
};
|
};
|
||||||
|
|
||||||
Messages.BUNDLES = {};
|
Messages.BUNDLES = {};
|
||||||
|
@ -20,39 +20,37 @@ const ActionDispatcher = require('./ActionDispatcher').default;
|
|||||||
|
|
||||||
const MultilineTextEditor = new Class({
|
const MultilineTextEditor = new Class({
|
||||||
Extends: Events,
|
Extends: Events,
|
||||||
initialize: function () {
|
initialize() {
|
||||||
this._topic = null;
|
this._topic = null;
|
||||||
this._timeoutId = -1;
|
this._timeoutId = -1;
|
||||||
},
|
},
|
||||||
|
|
||||||
_buildEditor: function () {
|
_buildEditor() {
|
||||||
|
const result = $('<div></div>')
|
||||||
var result = $('<div></div>')
|
|
||||||
.attr('id', 'textContainer')
|
.attr('id', 'textContainer')
|
||||||
.css({
|
.css({
|
||||||
display: "none",
|
display: 'none',
|
||||||
zIndex: "8",
|
zIndex: '8',
|
||||||
overflow: "hidden",
|
overflow: 'hidden',
|
||||||
border: "0 none"
|
border: '0 none',
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const textareaElem = $('<textarea tabindex="-1" value="" wrap="off" ></textarea>')
|
||||||
var textareaElem = $('<textarea tabindex="-1" value="" wrap="off" ></textarea>')
|
|
||||||
.css({
|
.css({
|
||||||
border: "1px gray dashed",
|
border: '1px gray dashed',
|
||||||
background: "rgba(98, 135, 167, .3)",
|
background: 'rgba(98, 135, 167, .3)',
|
||||||
outline: '0 none',
|
outline: '0 none',
|
||||||
resize: 'none',
|
resize: 'none',
|
||||||
overflow: "hidden"
|
overflow: 'hidden',
|
||||||
});
|
});
|
||||||
|
|
||||||
result.append(textareaElem);
|
result.append(textareaElem);
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
_registerEvents: function (containerElem) {
|
_registerEvents(containerElem) {
|
||||||
var textareaElem = this._getTextareaElem();
|
const textareaElem = this._getTextareaElem();
|
||||||
var me = this;
|
const me = this;
|
||||||
textareaElem.on('keydown', function (event) {
|
textareaElem.on('keydown', function (event) {
|
||||||
switch (jQuery.hotkeys.specialKeys[event.keyCode]) {
|
switch (jQuery.hotkeys.specialKeys[event.keyCode]) {
|
||||||
case 'esc':
|
case 'esc':
|
||||||
@ -60,33 +58,30 @@ const MultilineTextEditor = new Class({
|
|||||||
break;
|
break;
|
||||||
case 'enter':
|
case 'enter':
|
||||||
if (event.metaKey || event.ctrlKey) {
|
if (event.metaKey || event.ctrlKey) {
|
||||||
|
|
||||||
// Add return ...
|
// Add return ...
|
||||||
var text = textareaElem.val();
|
const text = textareaElem.val();
|
||||||
var cursorPosition = text.length;
|
let cursorPosition = text.length;
|
||||||
if (textareaElem.selectionStart) {
|
if (textareaElem.selectionStart) {
|
||||||
cursorPosition = textareaElem.selectionStart;
|
cursorPosition = textareaElem.selectionStart;
|
||||||
}
|
}
|
||||||
|
|
||||||
var head = text.substring(0, cursorPosition);
|
const head = text.substring(0, cursorPosition);
|
||||||
var tail = "";
|
let tail = '';
|
||||||
if (cursorPosition < text.length) {
|
if (cursorPosition < text.length) {
|
||||||
tail = text.substring(cursorPosition, text.length);
|
tail = text.substring(cursorPosition, text.length);
|
||||||
}
|
}
|
||||||
textareaElem.val(head + "\n" + tail);
|
textareaElem.val(`${head}\n${tail}`);
|
||||||
|
|
||||||
// Position cursor ...
|
// Position cursor ...
|
||||||
if (textareaElem[0].setSelectionRange) {
|
if (textareaElem[0].setSelectionRange) {
|
||||||
textareaElem.focus();
|
textareaElem.focus();
|
||||||
textareaElem[0].setSelectionRange(cursorPosition + 1, cursorPosition + 1);
|
textareaElem[0].setSelectionRange(cursorPosition + 1, cursorPosition + 1);
|
||||||
} else if (textareaElem.createTextRange) {
|
} else if (textareaElem.createTextRange) {
|
||||||
var range = textareaElem.createTextRange();
|
const range = textareaElem.createTextRange();
|
||||||
range.moveStart('character', cursorPosition + 1);
|
range.moveStart('character', cursorPosition + 1);
|
||||||
range.select();
|
range.select();
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
}
|
|
||||||
else {
|
|
||||||
me.close(true);
|
me.close(true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -96,7 +91,7 @@ const MultilineTextEditor = new Class({
|
|||||||
var end = $(this).get(0).selectionEnd;
|
var end = $(this).get(0).selectionEnd;
|
||||||
|
|
||||||
// set textarea value to: text before caret + tab + text after caret
|
// set textarea value to: text before caret + tab + text after caret
|
||||||
$(this).val($(this).val().substring(0, start) + "\t" + $(this).val().substring(end));
|
$(this).val(`${$(this).val().substring(0, start)}\t${$(this).val().substring(end)}`);
|
||||||
|
|
||||||
// put caret at right position again
|
// put caret at right position again
|
||||||
$(this).get(0).selectionStart = $(this).get(0).selectionEnd = start + 1;
|
$(this).get(0).selectionStart = $(this).get(0).selectionEnd = start + 1;
|
||||||
@ -105,66 +100,63 @@ const MultilineTextEditor = new Class({
|
|||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
});
|
});
|
||||||
|
|
||||||
textareaElem.on('keypress', function (event) {
|
textareaElem.on('keypress', (event) => {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
});
|
});
|
||||||
|
|
||||||
textareaElem.on('keyup', function (event) {
|
textareaElem.on('keyup', (event) => {
|
||||||
var text = me._getTextareaElem().val();
|
const text = me._getTextareaElem().val();
|
||||||
me.fireEvent('input', [event, text]);
|
me.fireEvent('input', [event, text]);
|
||||||
me._adjustEditorSize();
|
me._adjustEditorSize();
|
||||||
});
|
});
|
||||||
|
|
||||||
// If the user clicks on the input, all event must be ignored ...
|
// If the user clicks on the input, all event must be ignored ...
|
||||||
containerElem.on('click', function (event) {
|
containerElem.on('click', (event) => {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
});
|
});
|
||||||
containerElem.on('dblclick', function (event) {
|
containerElem.on('dblclick', (event) => {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
});
|
});
|
||||||
containerElem.on('mousedown', function (event) {
|
containerElem.on('mousedown', (event) => {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
_adjustEditorSize: function () {
|
_adjustEditorSize() {
|
||||||
|
|
||||||
if (this.isVisible()) {
|
if (this.isVisible()) {
|
||||||
var textElem = this._getTextareaElem();
|
const textElem = this._getTextareaElem();
|
||||||
|
|
||||||
var lines = textElem.val().split('\n');
|
const lines = textElem.val().split('\n');
|
||||||
var maxLineLength = 1;
|
let maxLineLength = 1;
|
||||||
_.each(lines, function (line) {
|
_.each(lines, (line) => {
|
||||||
if (maxLineLength < line.length)
|
if (maxLineLength < line.length) maxLineLength = line.length;
|
||||||
maxLineLength = line.length;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
textElem.attr('cols', maxLineLength);
|
textElem.attr('cols', maxLineLength);
|
||||||
textElem.attr('rows', lines.length);
|
textElem.attr('rows', lines.length);
|
||||||
|
|
||||||
this._containerElem.css({
|
this._containerElem.css({
|
||||||
width: (maxLineLength + 3) + 'em',
|
width: `${maxLineLength + 3}em`,
|
||||||
height: textElem.height()
|
height: textElem.height(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
isVisible: function () {
|
isVisible() {
|
||||||
return $defined(this._containerElem) && this._containerElem.css('display') == 'block';
|
return $defined(this._containerElem) && this._containerElem.css('display') == 'block';
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateModel: function () {
|
_updateModel() {
|
||||||
|
|
||||||
if (this._topic.getText() != this._getText()) {
|
if (this._topic.getText() != this._getText()) {
|
||||||
var text = this._getText();
|
const text = this._getText();
|
||||||
var topicId = this._topic.getId();
|
const topicId = this._topic.getId();
|
||||||
|
|
||||||
var actionDispatcher = ActionDispatcher.getInstance();
|
const actionDispatcher = ActionDispatcher.getInstance();
|
||||||
actionDispatcher.changeTextToTopic([topicId], text);
|
actionDispatcher.changeTextToTopic([topicId], text);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
show: function (topic, text) {
|
show(topic, text) {
|
||||||
// Close a previous node editor if it's opened ...
|
// Close a previous node editor if it's opened ...
|
||||||
if (this._topic) {
|
if (this._topic) {
|
||||||
this.close(false);
|
this.close(false);
|
||||||
@ -172,8 +164,8 @@ const MultilineTextEditor = new Class({
|
|||||||
|
|
||||||
this._topic = topic;
|
this._topic = topic;
|
||||||
if (!this.isVisible()) {
|
if (!this.isVisible()) {
|
||||||
//Create editor ui
|
// Create editor ui
|
||||||
var containerElem = this._buildEditor();
|
const containerElem = this._buildEditor();
|
||||||
$('body').append(containerElem);
|
$('body').append(containerElem);
|
||||||
|
|
||||||
this._containerElem = containerElem;
|
this._containerElem = containerElem;
|
||||||
@ -182,102 +174,98 @@ const MultilineTextEditor = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_showEditor: function (defaultText) {
|
_showEditor(defaultText) {
|
||||||
|
const topic = this._topic;
|
||||||
var topic = this._topic;
|
|
||||||
|
|
||||||
// Hide topic text ...
|
// Hide topic text ...
|
||||||
topic.getTextShape().setVisibility(false);
|
topic.getTextShape().setVisibility(false);
|
||||||
|
|
||||||
// Set Editor Style
|
// Set Editor Style
|
||||||
var nodeText = topic.getTextShape();
|
const nodeText = topic.getTextShape();
|
||||||
var font = nodeText.getFont();
|
const font = nodeText.getFont();
|
||||||
font.size = nodeText.getHtmlFontSize();
|
font.size = nodeText.getHtmlFontSize();
|
||||||
font.color = nodeText.getColor();
|
font.color = nodeText.getColor();
|
||||||
this._setStyle(font);
|
this._setStyle(font);
|
||||||
var me = this;
|
const me = this;
|
||||||
// Set editor's initial size
|
// Set editor's initial size
|
||||||
var displayFunc = function () {
|
const displayFunc = function () {
|
||||||
// Position the editor and set the size...
|
// Position the editor and set the size...
|
||||||
var textShape = topic.getTextShape();
|
const textShape = topic.getTextShape();
|
||||||
|
|
||||||
me._containerElem.css('display', 'block');
|
me._containerElem.css('display', 'block');
|
||||||
|
|
||||||
//FIXME: Im not sure if this is best way...
|
// FIXME: Im not sure if this is best way...
|
||||||
var shapePosition = textShape.getNativePosition();
|
const shapePosition = textShape.getNativePosition();
|
||||||
me._containerElem.offset(shapePosition);
|
me._containerElem.offset(shapePosition);
|
||||||
|
|
||||||
// Set editor's initial text ...
|
// Set editor's initial text ...
|
||||||
var text = $defined(defaultText) ? defaultText : topic.getText();
|
const text = $defined(defaultText) ? defaultText : topic.getText();
|
||||||
me._setText(text);
|
me._setText(text);
|
||||||
|
|
||||||
// Set the element focus and select the current text ...
|
// Set the element focus and select the current text ...
|
||||||
var inputElem = me._getTextareaElem();
|
const inputElem = me._getTextareaElem();
|
||||||
me._positionCursor(inputElem, !$defined(defaultText));
|
me._positionCursor(inputElem, !$defined(defaultText));
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
this._timeoutId = displayFunc.delay(10);
|
this._timeoutId = displayFunc.delay(10);
|
||||||
},
|
},
|
||||||
|
|
||||||
_setStyle: function (fontStyle) {
|
_setStyle(fontStyle) {
|
||||||
var inputField = this._getTextareaElem();
|
const inputField = this._getTextareaElem();
|
||||||
if (!$defined(fontStyle.font)) {
|
if (!$defined(fontStyle.font)) {
|
||||||
fontStyle.font = "Arial";
|
fontStyle.font = 'Arial';
|
||||||
}
|
}
|
||||||
if (!$defined(fontStyle.style)) {
|
if (!$defined(fontStyle.style)) {
|
||||||
fontStyle.style = "normal";
|
fontStyle.style = 'normal';
|
||||||
}
|
}
|
||||||
if (!$defined(fontStyle.weight)) {
|
if (!$defined(fontStyle.weight)) {
|
||||||
fontStyle.weight = "normal";
|
fontStyle.weight = 'normal';
|
||||||
}
|
}
|
||||||
if (!$defined(fontStyle.size)) {
|
if (!$defined(fontStyle.size)) {
|
||||||
fontStyle.size = 12;
|
fontStyle.size = 12;
|
||||||
}
|
}
|
||||||
var style = {
|
const style = {
|
||||||
fontSize: fontStyle.size + "px",
|
fontSize: `${fontStyle.size}px`,
|
||||||
fontFamily: fontStyle.font,
|
fontFamily: fontStyle.font,
|
||||||
fontStyle: fontStyle.style,
|
fontStyle: fontStyle.style,
|
||||||
fontWeight: fontStyle.weight,
|
fontWeight: fontStyle.weight,
|
||||||
color: fontStyle.color
|
color: fontStyle.color,
|
||||||
};
|
};
|
||||||
inputField.css(style);
|
inputField.css(style);
|
||||||
this._containerElem.css(style);
|
this._containerElem.css(style);
|
||||||
},
|
},
|
||||||
|
|
||||||
_setText: function (text) {
|
_setText(text) {
|
||||||
var textareaElem = this._getTextareaElem();
|
const textareaElem = this._getTextareaElem();
|
||||||
textareaElem.val(text);
|
textareaElem.val(text);
|
||||||
this._adjustEditorSize();
|
this._adjustEditorSize();
|
||||||
},
|
},
|
||||||
|
|
||||||
_getText: function () {
|
_getText() {
|
||||||
return this._getTextareaElem().val();
|
return this._getTextareaElem().val();
|
||||||
},
|
},
|
||||||
|
|
||||||
_getTextareaElem: function () {
|
_getTextareaElem() {
|
||||||
return this._containerElem.find('textarea');
|
return this._containerElem.find('textarea');
|
||||||
},
|
},
|
||||||
|
|
||||||
_positionCursor: function (textareaElem, selectText) {
|
_positionCursor(textareaElem, selectText) {
|
||||||
textareaElem.focus();
|
textareaElem.focus();
|
||||||
var lengh = textareaElem.val().length;
|
const lengh = textareaElem.val().length;
|
||||||
if (selectText) {
|
if (selectText) {
|
||||||
// Mark text as selected ...
|
// Mark text as selected ...
|
||||||
if (textareaElem.createTextRange) {
|
if (textareaElem.createTextRange) {
|
||||||
var rang = textareaElem.createTextRange();
|
const rang = textareaElem.createTextRange();
|
||||||
rang.select();
|
rang.select();
|
||||||
rang.move("character", lengh);
|
rang.move('character', lengh);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
textareaElem[0].setSelectionRange(0, lengh);
|
textareaElem[0].setSelectionRange(0, lengh);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Move the cursor to the last character ..
|
// Move the cursor to the last character ..
|
||||||
if (textareaElem.createTextRange) {
|
if (textareaElem.createTextRange) {
|
||||||
var range = textareaElem.createTextRange();
|
const range = textareaElem.createTextRange();
|
||||||
range.move("character", lengh);
|
range.move('character', lengh);
|
||||||
} else {
|
} else {
|
||||||
if (Browser.ie11) {
|
if (Browser.ie11) {
|
||||||
textareaElem[0].selectionStart = lengh;
|
textareaElem[0].selectionStart = lengh;
|
||||||
@ -289,10 +277,9 @@ const MultilineTextEditor = new Class({
|
|||||||
textareaElem.focus();
|
textareaElem.focus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
close: function (update) {
|
close(update) {
|
||||||
if (this.isVisible() && this._topic) {
|
if (this.isVisible() && this._topic) {
|
||||||
// Update changes ...
|
// Update changes ...
|
||||||
clearTimeout(this._timeoutId);
|
clearTimeout(this._timeoutId);
|
||||||
@ -310,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;
|
||||||
|
@ -27,7 +27,7 @@ const NodeGraph = new Class(
|
|||||||
* @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
|
||||||
*/
|
*/
|
||||||
initialize: function (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;
|
||||||
@ -38,13 +38,13 @@ const NodeGraph = new Class(
|
|||||||
},
|
},
|
||||||
|
|
||||||
/** @return true if option is set to read-only */
|
/** @return true if option is set to read-only */
|
||||||
isReadOnly: function () {
|
isReadOnly() {
|
||||||
return this._options.readOnly;
|
return this._options.readOnly;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @return model type */
|
/** @return model type */
|
||||||
getType: function () {
|
getType() {
|
||||||
var model = this.getModel();
|
const model = this.getModel();
|
||||||
return model.getType();
|
return model.getType();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -52,12 +52,12 @@ const NodeGraph = new Class(
|
|||||||
* @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: function (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: function (elem2d) {
|
_set2DElement(elem2d) {
|
||||||
this._elem2d = elem2d;
|
this._elem2d = elem2d;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -65,51 +65,51 @@ const NodeGraph = new Class(
|
|||||||
* @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: function () {
|
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: function (point, fireEvent) {
|
setPosition(point, fireEvent) {
|
||||||
throw 'Unsupported operation';
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
addEvent: function (type, listener) {
|
addEvent(type, listener) {
|
||||||
var elem = this.get2DElement();
|
const elem = this.get2DElement();
|
||||||
elem.addEvent(type, listener);
|
elem.addEvent(type, listener);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
removeEvent: function (type, listener) {
|
removeEvent(type, listener) {
|
||||||
var elem = this.get2DElement();
|
const elem = this.get2DElement();
|
||||||
elem.removeEvent(type, listener);
|
elem.removeEvent(type, listener);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
fireEvent: function (type, event) {
|
fireEvent(type, event) {
|
||||||
var elem = this.get2DElement();
|
const elem = this.get2DElement();
|
||||||
elem.trigger(type, event);
|
elem.trigger(type, event);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setMouseEventsEnabled: function (isEnabled) {
|
setMouseEventsEnabled(isEnabled) {
|
||||||
this._mouseEvents = isEnabled;
|
this._mouseEvents = isEnabled;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
isMouseEventsEnabled: function () {
|
isMouseEventsEnabled() {
|
||||||
return this._mouseEvents;
|
return this._mouseEvents;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @return {Object<Number>} size*/
|
/** @return {Object<Number>} size */
|
||||||
getSize: function () {
|
getSize() {
|
||||||
return this._size;
|
return this._size;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @param {Object<Number>} size*/
|
/** @param {Object<Number>} size */
|
||||||
setSize: function (size) {
|
setSize(size) {
|
||||||
this._size.width = parseInt(size.width);
|
this._size.width = parseInt(size.width);
|
||||||
this._size.height = parseInt(size.height);
|
this._size.height = parseInt(size.height);
|
||||||
},
|
},
|
||||||
@ -117,7 +117,7 @@ const NodeGraph = new Class(
|
|||||||
/**
|
/**
|
||||||
* @return {mindplot.model.NodeModel} the node model
|
* @return {mindplot.model.NodeModel} the node model
|
||||||
*/
|
*/
|
||||||
getModel: function () {
|
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;
|
||||||
},
|
},
|
||||||
@ -126,21 +126,21 @@ const NodeGraph = new Class(
|
|||||||
* @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: function (model) {
|
setModel(model) {
|
||||||
$assert(model, 'Model can not be null');
|
$assert(model, 'Model can not be null');
|
||||||
this._model = model;
|
this._model = model;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getId: function () {
|
getId() {
|
||||||
return this._model.getId();
|
return this._model.getId();
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setOnFocus: function (focus) {
|
setOnFocus(focus) {
|
||||||
if (this._onFocus != focus) {
|
if (this._onFocus != focus) {
|
||||||
this._onFocus = focus;
|
this._onFocus = focus;
|
||||||
var outerShape = this.getOuterShape();
|
const outerShape = this.getOuterShape();
|
||||||
if (focus) {
|
if (focus) {
|
||||||
outerShape.setFill(Topic.OUTER_SHAPE_ATTRIBUTES_FOCUS.fillColor);
|
outerShape.setFill(Topic.OUTER_SHAPE_ATTRIBUTES_FOCUS.fillColor);
|
||||||
outerShape.setOpacity(1);
|
outerShape.setOpacity(1);
|
||||||
@ -159,32 +159,32 @@ const NodeGraph = new Class(
|
|||||||
},
|
},
|
||||||
|
|
||||||
/** @return {Boolean} true if the node graph is on focus */
|
/** @return {Boolean} true if the node graph is on focus */
|
||||||
isOnFocus: function () {
|
isOnFocus() {
|
||||||
return this._onFocus;
|
return this._onFocus;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
dispose: function (workspace) {
|
dispose(workspace) {
|
||||||
this.setOnFocus(false);
|
this.setOnFocus(false);
|
||||||
workspace.removeChild(this);
|
workspace.removeChild(this);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
createDragNode: function (layoutManager) {
|
createDragNode(layoutManager) {
|
||||||
var dragShape = this._buildDragShape();
|
const dragShape = this._buildDragShape();
|
||||||
return new DragTopic(dragShape, this, layoutManager);
|
return new DragTopic(dragShape, this, layoutManager);
|
||||||
},
|
},
|
||||||
|
|
||||||
_buildDragShape: function () {
|
_buildDragShape() {
|
||||||
$assert(false, '_buildDragShape must be implemented by all nodes.');
|
$assert(false, '_buildDragShape must be implemented by all nodes.');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getPosition: function () {
|
getPosition() {
|
||||||
var model = this.getModel();
|
const model = this.getModel();
|
||||||
return model.getPosition();
|
return model.getPosition();
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -204,16 +204,16 @@ NodeGraph.create = function (nodeModel, options) {
|
|||||||
|
|
||||||
$assert(nodeModel, 'Model can not be null');
|
$assert(nodeModel, 'Model can not be null');
|
||||||
|
|
||||||
var type = nodeModel.getType();
|
const type = nodeModel.getType();
|
||||||
$assert(type, 'Node model type can not be null');
|
$assert(type, 'Node model type can not be null');
|
||||||
|
|
||||||
var result;
|
let result;
|
||||||
if (type == INodeModel.CENTRAL_TOPIC_TYPE) {
|
if (type == INodeModel.CENTRAL_TOPIC_TYPE) {
|
||||||
result = new CentralTopic(nodeModel, options);
|
result = new CentralTopic(nodeModel, options);
|
||||||
} else if (type == INodeModel.MAIN_TOPIC_TYPE) {
|
} else if (type == INodeModel.MAIN_TOPIC_TYPE) {
|
||||||
result = new MainTopic(nodeModel, options);
|
result = new MainTopic(nodeModel, options);
|
||||||
} else {
|
} else {
|
||||||
$assert(false, 'unsupported node type:' + type);
|
$assert(false, `unsupported node type:${type}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -20,7 +20,7 @@ const FloatingTip = require('./widget/FloatingTip').default;
|
|||||||
|
|
||||||
const NoteIcon = new Class({
|
const NoteIcon = new Class({
|
||||||
Extends: Icon,
|
Extends: Icon,
|
||||||
initialize: function (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);
|
this.parent(NoteIcon.IMAGE_URL);
|
||||||
@ -31,13 +31,13 @@ const NoteIcon = new Class({
|
|||||||
this._registerEvents();
|
this._registerEvents();
|
||||||
},
|
},
|
||||||
|
|
||||||
_registerEvents: function () {
|
_registerEvents() {
|
||||||
this._image.setCursor('pointer');
|
this._image.setCursor('pointer');
|
||||||
var me = this;
|
const me = this;
|
||||||
|
|
||||||
if (!this._readOnly) {
|
if (!this._readOnly) {
|
||||||
// Add on click event to open the editor ...
|
// Add on click event to open the editor ...
|
||||||
this.addEvent('click', function (event) {
|
this.addEvent('click', (event) => {
|
||||||
me._topic.showNoteEditor();
|
me._topic.showNoteEditor();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
});
|
});
|
||||||
@ -46,39 +46,37 @@ const NoteIcon = new Class({
|
|||||||
title: $msg('NOTE'),
|
title: $msg('NOTE'),
|
||||||
container: 'body',
|
container: 'body',
|
||||||
// Content can also be a function of the target element!
|
// Content can also be a function of the target element!
|
||||||
content: function () {
|
content() {
|
||||||
return me._buildTooltipContent();
|
return me._buildTooltipContent();
|
||||||
},
|
},
|
||||||
html: true,
|
html: true,
|
||||||
placement: 'bottom',
|
placement: 'bottom',
|
||||||
destroyOnExit: true
|
destroyOnExit: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_buildTooltipContent: function () {
|
_buildTooltipContent() {
|
||||||
if ($("body").find("#textPopoverNote").length == 1) {
|
if ($('body').find('#textPopoverNote').length == 1) {
|
||||||
var text = $("body").find("#textPopoverNote");
|
var text = $('body').find('#textPopoverNote');
|
||||||
text.text(this._linksModel.getText());
|
text.text(this._linksModel.getText());
|
||||||
} else {
|
} else {
|
||||||
var result = $('<div id="textPopoverNote"></div>').css({padding: '5px'});
|
const result = $('<div id="textPopoverNote"></div>').css({ padding: '5px' });
|
||||||
|
|
||||||
var text = $('<div></div>').text(this._linksModel.getText())
|
var text = $('<div></div>').text(this._linksModel.getText())
|
||||||
.css({
|
.css({
|
||||||
'white-space': 'pre-wrap',
|
'white-space': 'pre-wrap',
|
||||||
'word-wrap': 'break-word'
|
'word-wrap': 'break-word',
|
||||||
}
|
});
|
||||||
);
|
|
||||||
result.append(text);
|
result.append(text);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
getModel: function () {
|
getModel() {
|
||||||
return this._linksModel;
|
return this._linksModel;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
NoteIcon.IMAGE_URL = "images/notes.png";
|
NoteIcon.IMAGE_URL = 'images/notes.png';
|
||||||
|
|
||||||
export default NoteIcon
|
export default NoteIcon;
|
||||||
|
@ -1,14 +1,16 @@
|
|||||||
const Options = new Class({
|
const Options = new Class({
|
||||||
|
|
||||||
setOptions: function () {
|
setOptions() {
|
||||||
var options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments));
|
const options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments));
|
||||||
if (this.addEvent) for (var option in options) {
|
if (this.addEvent) {
|
||||||
|
for (const option in options) {
|
||||||
if (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;
|
if (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;
|
||||||
this.addEvent(option, options[option]);
|
this.addEvent(option, options[option]);
|
||||||
delete options[option];
|
delete options[option];
|
||||||
}
|
}
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -16,34 +16,35 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
const Core = require('@wismapping/core-js');
|
const Core = require('@wismapping/core-js');
|
||||||
|
|
||||||
const core = Core();
|
const core = Core();
|
||||||
const XMLSerializerFactory = require('./persistence/XMLSerializerFactory');
|
const XMLSerializerFactory = require('./persistence/XMLSerializerFactory');
|
||||||
|
|
||||||
const PersistenceManager = new Class({
|
const PersistenceManager = new Class({
|
||||||
Static: {
|
Static: {
|
||||||
loadFromDom: function (mapId, mapDom) {
|
loadFromDom(mapId, mapDom) {
|
||||||
$assert(mapId, 'mapId can not be null');
|
$assert(mapId, 'mapId can not be null');
|
||||||
$assert(mapDom, 'mapDom can not be null');
|
$assert(mapDom, 'mapDom can not be null');
|
||||||
|
|
||||||
var serializer = XMLSerializerFactory.getSerializerFromDocument(mapDom);
|
const serializer = XMLSerializerFactory.getSerializerFromDocument(mapDom);
|
||||||
return serializer.loadFromDom(mapDom, mapId);
|
return serializer.loadFromDom(mapDom, mapId);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
initialize: function () {},
|
initialize() {},
|
||||||
|
|
||||||
save: function (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');
|
||||||
$assert(editorProperties, 'editorProperties can not be null');
|
$assert(editorProperties, 'editorProperties can not be null');
|
||||||
|
|
||||||
var mapId = mindmap.getId();
|
const mapId = mindmap.getId();
|
||||||
$assert(mapId, 'mapId can not be null');
|
$assert(mapId, 'mapId can not be null');
|
||||||
|
|
||||||
var serializer = XMLSerializerFactory.getSerializerFromMindmap(mindmap);
|
const serializer = XMLSerializerFactory.getSerializerFromMindmap(mindmap);
|
||||||
var domMap = serializer.toXML(mindmap);
|
const domMap = serializer.toXML(mindmap);
|
||||||
var mapXml = core.Utils.innerXML(domMap);
|
const mapXml = core.Utils.innerXML(domMap);
|
||||||
|
|
||||||
var pref = JSON.stringify(editorProperties);
|
const pref = JSON.stringify(editorProperties);
|
||||||
try {
|
try {
|
||||||
this.saveMapXml(mapId, mapXml, pref, saveHistory, events, sync);
|
this.saveMapXml(mapId, mapXml, pref, saveHistory, events, sync);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -52,25 +53,25 @@ const PersistenceManager = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
load: function (mapId) {
|
load(mapId) {
|
||||||
$assert(mapId, 'mapId can not be null');
|
$assert(mapId, 'mapId can not be null');
|
||||||
var domDocument = this.loadMapDom(mapId);
|
const domDocument = this.loadMapDom(mapId);
|
||||||
return PersistenceManager.loadFromDom(mapId, domDocument);
|
return PersistenceManager.loadFromDom(mapId, domDocument);
|
||||||
},
|
},
|
||||||
|
|
||||||
discardChanges: function (mapId) {
|
discardChanges(mapId) {
|
||||||
throw new Error('Method must be implemented');
|
throw new Error('Method must be implemented');
|
||||||
},
|
},
|
||||||
|
|
||||||
loadMapDom: function (mapId) {
|
loadMapDom(mapId) {
|
||||||
throw new Error('Method must be implemented');
|
throw new Error('Method must be implemented');
|
||||||
},
|
},
|
||||||
|
|
||||||
saveMapXml: function (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: function (mindmap) {
|
unlockMap(mindmap) {
|
||||||
throw new Error('Method must be implemented');
|
throw new Error('Method must be implemented');
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -15,10 +15,12 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const Core = require('@wismapping/core-js')
|
const Core = require('@wismapping/core-js');
|
||||||
|
|
||||||
const core = Core();
|
const core = Core();
|
||||||
|
|
||||||
const web2D = require('@wismapping/web2d')
|
const web2D = require('@wismapping/web2d');
|
||||||
|
|
||||||
const web2d = web2D();
|
const web2d = web2D();
|
||||||
|
|
||||||
const ConnectionLine = require('./ConnectionLine').default;
|
const ConnectionLine = require('./ConnectionLine').default;
|
||||||
@ -26,24 +28,24 @@ const ControlPoint = require('./ControlPoint').default;
|
|||||||
|
|
||||||
const INodeModel = require('./model/INodeModel').default;
|
const INodeModel = require('./model/INodeModel').default;
|
||||||
|
|
||||||
const Shape = require('./util/Shape').default
|
const Shape = require('./util/Shape').default;
|
||||||
|
|
||||||
const Relationship = new Class({
|
const Relationship = new Class({
|
||||||
Extends: ConnectionLine,
|
Extends: ConnectionLine,
|
||||||
Static: {
|
Static: {
|
||||||
getStrokeColor: function () {
|
getStrokeColor() {
|
||||||
return '#9b74e6';
|
return '#9b74e6';
|
||||||
},
|
},
|
||||||
type: "Relationship"
|
type: 'Relationship',
|
||||||
},
|
},
|
||||||
initialize: function (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());
|
this.parent(sourceNode, targetNode, model.getLineType());
|
||||||
this.setModel(model);
|
this.setModel(model);
|
||||||
|
|
||||||
var strokeColor = Relationship.getStrokeColor();
|
const strokeColor = Relationship.getStrokeColor();
|
||||||
|
|
||||||
this._line2d.setIsSrcControlPointCustom(false);
|
this._line2d.setIsSrcControlPointCustom(false);
|
||||||
this._line2d.setIsDestControlPointCustom(false);
|
this._line2d.setIsDestControlPointCustom(false);
|
||||||
@ -51,9 +53,9 @@ const Relationship = new Class({
|
|||||||
this._line2d.setStroke(1, 'solid', strokeColor);
|
this._line2d.setStroke(1, 'solid', strokeColor);
|
||||||
this._line2d.setDashed(4, 2);
|
this._line2d.setDashed(4, 2);
|
||||||
this._focusShape = this._createLine(this.getLineType(), ConnectionLine.SIMPLE_CURVED);
|
this._focusShape = this._createLine(this.getLineType(), ConnectionLine.SIMPLE_CURVED);
|
||||||
this._focusShape.setStroke(2, "solid", "#3f96ff");
|
this._focusShape.setStroke(2, 'solid', '#3f96ff');
|
||||||
|
|
||||||
var ctrlPoints = this._line2d.getControlPoints();
|
const ctrlPoints = this._line2d.getControlPoints();
|
||||||
this._focusShape.setSrcControlPoint(ctrlPoints[0]);
|
this._focusShape.setSrcControlPoint(ctrlPoints[0]);
|
||||||
this._focusShape.setDestControlPoint(ctrlPoints[1]);
|
this._focusShape.setDestControlPoint(ctrlPoints[1]);
|
||||||
this._focusShape.setVisibility(false);
|
this._focusShape.setVisibility(false);
|
||||||
@ -75,48 +77,48 @@ const Relationship = new Class({
|
|||||||
|
|
||||||
// Position the line ...
|
// Position the line ...
|
||||||
if ($defined(model.getSrcCtrlPoint())) {
|
if ($defined(model.getSrcCtrlPoint())) {
|
||||||
var srcPoint = model.getSrcCtrlPoint().clone();
|
const srcPoint = model.getSrcCtrlPoint().clone();
|
||||||
this.setSrcControlPoint(srcPoint);
|
this.setSrcControlPoint(srcPoint);
|
||||||
}
|
}
|
||||||
if ($defined(model.getDestCtrlPoint())) {
|
if ($defined(model.getDestCtrlPoint())) {
|
||||||
var destPoint = model.getDestCtrlPoint().clone();
|
const destPoint = model.getDestCtrlPoint().clone();
|
||||||
this.setDestControlPoint(destPoint);
|
this.setDestControlPoint(destPoint);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
setStroke: function (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: function () {
|
redraw() {
|
||||||
var line2d = this._line2d;
|
const line2d = this._line2d;
|
||||||
var sourceTopic = this._sourceTopic;
|
const sourceTopic = this._sourceTopic;
|
||||||
var sourcePosition = sourceTopic.getPosition();
|
const sourcePosition = sourceTopic.getPosition();
|
||||||
|
|
||||||
var targetTopic = this._targetTopic;
|
const targetTopic = this._targetTopic;
|
||||||
var targetPosition = targetTopic.getPosition();
|
let targetPosition = targetTopic.getPosition();
|
||||||
if (targetTopic.getType() == INodeModel.CENTRAL_TOPIC_TYPE) {
|
if (targetTopic.getType() == INodeModel.CENTRAL_TOPIC_TYPE) {
|
||||||
targetPosition = Shape.workoutIncomingConnectionPoint(targetTopic, sourcePosition);
|
targetPosition = Shape.workoutIncomingConnectionPoint(targetTopic, sourcePosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
var sPos, tPos;
|
let sPos; let
|
||||||
|
tPos;
|
||||||
this._line2d.setStroke(2);
|
this._line2d.setStroke(2);
|
||||||
var ctrlPoints = this._line2d.getControlPoints();
|
const ctrlPoints = this._line2d.getControlPoints();
|
||||||
if (!this._line2d.isDestControlPointCustom() && !this._line2d.isSrcControlPointCustom()) {
|
if (!this._line2d.isDestControlPointCustom() && !this._line2d.isSrcControlPointCustom()) {
|
||||||
|
const defaultPoints = Shape.calculateDefaultControlPoints(sourcePosition, targetPosition);
|
||||||
var defaultPoints = Shape.calculateDefaultControlPoints(sourcePosition, targetPosition);
|
|
||||||
ctrlPoints[0].x = defaultPoints[0].x;
|
ctrlPoints[0].x = defaultPoints[0].x;
|
||||||
ctrlPoints[0].y = defaultPoints[0].y;
|
ctrlPoints[0].y = defaultPoints[0].y;
|
||||||
|
|
||||||
ctrlPoints[1].x = defaultPoints[1].x;
|
ctrlPoints[1].x = defaultPoints[1].x;
|
||||||
ctrlPoints[1].y = defaultPoints[1].y;
|
ctrlPoints[1].y = defaultPoints[1].y;
|
||||||
}
|
}
|
||||||
var spoint = new core.Point();
|
const spoint = new core.Point();
|
||||||
spoint.x = parseInt(ctrlPoints[0].x) + parseInt(sourcePosition.x);
|
spoint.x = parseInt(ctrlPoints[0].x) + parseInt(sourcePosition.x);
|
||||||
spoint.y = parseInt(ctrlPoints[0].y) + parseInt(sourcePosition.y);
|
spoint.y = parseInt(ctrlPoints[0].y) + parseInt(sourcePosition.y);
|
||||||
|
|
||||||
var tpoint = new core.Point();
|
const tpoint = new core.Point();
|
||||||
tpoint.x = parseInt(ctrlPoints[1].x) + parseInt(targetPosition.x);
|
tpoint.x = parseInt(ctrlPoints[1].x) + parseInt(targetPosition.x);
|
||||||
tpoint.y = parseInt(ctrlPoints[1].y) + parseInt(targetPosition.y);
|
tpoint.y = parseInt(ctrlPoints[1].y) + parseInt(targetPosition.y);
|
||||||
|
|
||||||
@ -128,7 +130,7 @@ const Relationship = new Class({
|
|||||||
|
|
||||||
line2d.moveToFront();
|
line2d.moveToFront();
|
||||||
|
|
||||||
//Positionate Arrows
|
// Positionate Arrows
|
||||||
this._positionArrows();
|
this._positionArrows();
|
||||||
|
|
||||||
// Add connector ...
|
// Add connector ...
|
||||||
@ -141,9 +143,9 @@ const Relationship = new Class({
|
|||||||
this._controlPointsController.redraw();
|
this._controlPointsController.redraw();
|
||||||
},
|
},
|
||||||
|
|
||||||
_positionArrows: function () {
|
_positionArrows() {
|
||||||
var tpos = this._line2d.getTo();
|
const tpos = this._line2d.getTo();
|
||||||
var spos = this._line2d.getFrom();
|
const spos = this._line2d.getFrom();
|
||||||
|
|
||||||
this._startArrow.setFrom(spos.x, spos.y);
|
this._startArrow.setFrom(spos.x, spos.y);
|
||||||
this._startArrow.moveToBack();
|
this._startArrow.moveToBack();
|
||||||
@ -153,8 +155,8 @@ const Relationship = new Class({
|
|||||||
this._endArrow.moveToBack();
|
this._endArrow.moveToBack();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._line2d.getType() == "CurvedLine") {
|
if (this._line2d.getType() == 'CurvedLine') {
|
||||||
var controlPoints = this._line2d.getControlPoints();
|
const controlPoints = this._line2d.getControlPoints();
|
||||||
this._startArrow.setControlPoint(controlPoints[0]);
|
this._startArrow.setControlPoint(controlPoints[0]);
|
||||||
if (this._endArrow) {
|
if (this._endArrow) {
|
||||||
this._endArrow.setControlPoint(controlPoints[1]);
|
this._endArrow.setControlPoint(controlPoints[1]);
|
||||||
@ -172,7 +174,7 @@ const Relationship = new Class({
|
|||||||
this._startArrow.setVisibility(this.isVisible() && this._showStartArrow);
|
this._startArrow.setVisibility(this.isVisible() && this._showStartArrow);
|
||||||
},
|
},
|
||||||
|
|
||||||
addToWorkspace: function (workspace) {
|
addToWorkspace(workspace) {
|
||||||
workspace.append(this._focusShape);
|
workspace.append(this._focusShape);
|
||||||
workspace.append(this._controlPointsController);
|
workspace.append(this._controlPointsController);
|
||||||
|
|
||||||
@ -181,36 +183,33 @@ const Relationship = new Class({
|
|||||||
this._isInWorkspace = true;
|
this._isInWorkspace = true;
|
||||||
|
|
||||||
workspace.append(this._startArrow);
|
workspace.append(this._startArrow);
|
||||||
if (this._endArrow)
|
if (this._endArrow) workspace.append(this._endArrow);
|
||||||
workspace.append(this._endArrow);
|
|
||||||
|
|
||||||
this.parent(workspace);
|
this.parent(workspace);
|
||||||
this._positionArrows();
|
this._positionArrows();
|
||||||
this.redraw();
|
this.redraw();
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_initializeControlPointController: function () {
|
_initializeControlPointController() {
|
||||||
this.setOnFocus(true);
|
this.setOnFocus(true);
|
||||||
},
|
},
|
||||||
|
|
||||||
removeFromWorkspace: function (workspace) {
|
removeFromWorkspace(workspace) {
|
||||||
workspace.removeChild(this._focusShape);
|
workspace.removeChild(this._focusShape);
|
||||||
workspace.removeChild(this._controlPointsController);
|
workspace.removeChild(this._controlPointsController);
|
||||||
this._line2d.removeEvent('click', this._controlPointControllerListener);
|
this._line2d.removeEvent('click', this._controlPointControllerListener);
|
||||||
this._isInWorkspace = false;
|
this._isInWorkspace = false;
|
||||||
workspace.removeChild(this._startArrow);
|
workspace.removeChild(this._startArrow);
|
||||||
if (this._endArrow)
|
if (this._endArrow) workspace.removeChild(this._endArrow);
|
||||||
workspace.removeChild(this._endArrow);
|
|
||||||
|
|
||||||
this.parent(workspace);
|
this.parent(workspace);
|
||||||
},
|
},
|
||||||
|
|
||||||
getType: function () {
|
getType() {
|
||||||
return Relationship.type;
|
return Relationship.type;
|
||||||
},
|
},
|
||||||
|
|
||||||
setOnFocus: function (focus) {
|
setOnFocus(focus) {
|
||||||
// Change focus shape
|
// Change focus shape
|
||||||
if (this.isOnFocus() != focus) {
|
if (this.isOnFocus() != focus) {
|
||||||
if (focus) {
|
if (focus) {
|
||||||
@ -225,13 +224,13 @@ const Relationship = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_refreshShape: function () {
|
_refreshShape() {
|
||||||
var sPos = this._line2d.getFrom();
|
const sPos = this._line2d.getFrom();
|
||||||
var tPos = this._line2d.getTo();
|
const tPos = this._line2d.getTo();
|
||||||
var ctrlPoints = this._line2d.getControlPoints();
|
const ctrlPoints = this._line2d.getControlPoints();
|
||||||
this._focusShape.setFrom(sPos.x, sPos.y);
|
this._focusShape.setFrom(sPos.x, sPos.y);
|
||||||
this._focusShape.setTo(tPos.x, tPos.y);
|
this._focusShape.setTo(tPos.x, tPos.y);
|
||||||
var shapeCtrlPoints = this._focusShape.getControlPoints();
|
const shapeCtrlPoints = this._focusShape.getControlPoints();
|
||||||
shapeCtrlPoints[0].x = ctrlPoints[0].x;
|
shapeCtrlPoints[0].x = ctrlPoints[0].x;
|
||||||
shapeCtrlPoints[0].y = ctrlPoints[0].y;
|
shapeCtrlPoints[0].y = ctrlPoints[0].y;
|
||||||
shapeCtrlPoints[1].x = ctrlPoints[1].x;
|
shapeCtrlPoints[1].x = ctrlPoints[1].x;
|
||||||
@ -239,107 +238,100 @@ const Relationship = new Class({
|
|||||||
this._focusShape.updateLine();
|
this._focusShape.updateLine();
|
||||||
},
|
},
|
||||||
|
|
||||||
addEvent: function (type, listener) {
|
addEvent(type, listener) {
|
||||||
// Translate to web 2d events ...
|
// Translate to web 2d events ...
|
||||||
if (type == 'onfocus') {
|
if (type == 'onfocus') {
|
||||||
type = 'mousedown';
|
type = 'mousedown';
|
||||||
}
|
}
|
||||||
|
|
||||||
var line = this._line2d;
|
const line = this._line2d;
|
||||||
line.addEvent(type, listener);
|
line.addEvent(type, listener);
|
||||||
},
|
},
|
||||||
|
|
||||||
isOnFocus: function () {
|
isOnFocus() {
|
||||||
return this._onFocus;
|
return this._onFocus;
|
||||||
},
|
},
|
||||||
|
|
||||||
isInWorkspace: function () {
|
isInWorkspace() {
|
||||||
return this._isInWorkspace;
|
return this._isInWorkspace;
|
||||||
},
|
},
|
||||||
|
|
||||||
setVisibility: function (value) {
|
setVisibility(value) {
|
||||||
this.parent(value);
|
this.parent(value);
|
||||||
if (this._showEndArrow)
|
if (this._showEndArrow) this._endArrow.setVisibility(this._showEndArrow);
|
||||||
this._endArrow.setVisibility(this._showEndArrow);
|
|
||||||
this._startArrow.setVisibility(this._showStartArrow && value);
|
this._startArrow.setVisibility(this._showStartArrow && value);
|
||||||
},
|
},
|
||||||
|
|
||||||
setOpacity: function (opacity) {
|
setOpacity(opacity) {
|
||||||
this.parent(opacity);
|
this.parent(opacity);
|
||||||
if (this._showEndArrow)
|
if (this._showEndArrow) this._endArrow.setOpacity(opacity);
|
||||||
this._endArrow.setOpacity(opacity);
|
if (this._showStartArrow) this._startArrow.setOpacity(opacity);
|
||||||
if (this._showStartArrow)
|
|
||||||
this._startArrow.setOpacity(opacity);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
setShowEndArrow: function (visible) {
|
setShowEndArrow(visible) {
|
||||||
this._showEndArrow = visible;
|
this._showEndArrow = visible;
|
||||||
if (this._isInWorkspace)
|
if (this._isInWorkspace) this.redraw();
|
||||||
this.redraw();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
setShowStartArrow: function (visible) {
|
setShowStartArrow(visible) {
|
||||||
this._showStartArrow = visible;
|
this._showStartArrow = visible;
|
||||||
if (this._isInWorkspace)
|
if (this._isInWorkspace) this.redraw();
|
||||||
this.redraw();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
setFrom: function (x, y) {
|
setFrom(x, y) {
|
||||||
$assert($defined(x), "x must be defined");
|
$assert($defined(x), 'x must be defined');
|
||||||
$assert($defined(y), "y must be defined");
|
$assert($defined(y), 'y must be defined');
|
||||||
|
|
||||||
this._line2d.setFrom(x, y);
|
this._line2d.setFrom(x, y);
|
||||||
this._startArrow.setFrom(x, y);
|
this._startArrow.setFrom(x, y);
|
||||||
},
|
},
|
||||||
|
|
||||||
setTo: function (x, y) {
|
setTo(x, y) {
|
||||||
$assert($defined(x), "x must be defined");
|
$assert($defined(x), 'x must be defined');
|
||||||
$assert($defined(y), "y must be defined");
|
$assert($defined(y), 'y must be defined');
|
||||||
|
|
||||||
this._line2d.setTo(x, y);
|
this._line2d.setTo(x, y);
|
||||||
if (this._endArrow)
|
if (this._endArrow) this._endArrow.setFrom(x, y);
|
||||||
this._endArrow.setFrom(x, y);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
setSrcControlPoint: function (control) {
|
setSrcControlPoint(control) {
|
||||||
this._line2d.setSrcControlPoint(control);
|
this._line2d.setSrcControlPoint(control);
|
||||||
this._startArrow.setControlPoint(control);
|
this._startArrow.setControlPoint(control);
|
||||||
},
|
},
|
||||||
|
|
||||||
setDestControlPoint: function (control) {
|
setDestControlPoint(control) {
|
||||||
this._line2d.setDestControlPoint(control);
|
this._line2d.setDestControlPoint(control);
|
||||||
if (this._showEndArrow)
|
if (this._showEndArrow) this._endArrow.setControlPoint(control);
|
||||||
this._endArrow.setControlPoint(control);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
getControlPoints: function () {
|
getControlPoints() {
|
||||||
return this._line2d.getControlPoints();
|
return this._line2d.getControlPoints();
|
||||||
},
|
},
|
||||||
|
|
||||||
isSrcControlPointCustom: function () {
|
isSrcControlPointCustom() {
|
||||||
return this._line2d.isSrcControlPointCustom();
|
return this._line2d.isSrcControlPointCustom();
|
||||||
},
|
},
|
||||||
|
|
||||||
isDestControlPointCustom: function () {
|
isDestControlPointCustom() {
|
||||||
return this._line2d.isDestControlPointCustom();
|
return this._line2d.isDestControlPointCustom();
|
||||||
},
|
},
|
||||||
|
|
||||||
setIsSrcControlPointCustom: function (isCustom) {
|
setIsSrcControlPointCustom(isCustom) {
|
||||||
this._line2d.setIsSrcControlPointCustom(isCustom);
|
this._line2d.setIsSrcControlPointCustom(isCustom);
|
||||||
},
|
},
|
||||||
|
|
||||||
setIsDestControlPointCustom: function (isCustom) {
|
setIsDestControlPointCustom(isCustom) {
|
||||||
this._line2d.setIsDestControlPointCustom(isCustom);
|
this._line2d.setIsDestControlPointCustom(isCustom);
|
||||||
},
|
},
|
||||||
|
|
||||||
getId: function () {
|
getId() {
|
||||||
return this._model.getId();
|
return this._model.getId();
|
||||||
},
|
},
|
||||||
|
|
||||||
fireEvent: function (type, event) {
|
fireEvent(type, event) {
|
||||||
var elem = this._line2d;
|
const elem = this._line2d;
|
||||||
elem.trigger(type, event);
|
elem.trigger(type, event);
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default Relationship;
|
export default Relationship;
|
||||||
|
@ -15,43 +15,44 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const Core = require('@wismapping/core-js')
|
const Core = require('@wismapping/core-js');
|
||||||
|
|
||||||
const core = Core();
|
const core = Core();
|
||||||
const web2D = require('@wismapping/web2d')
|
const web2D = require('@wismapping/web2d');
|
||||||
|
|
||||||
const web2d = web2D();
|
const web2d = web2D();
|
||||||
const INodeModel = require('./model/INodeModel').default
|
const INodeModel = require('./model/INodeModel').default;
|
||||||
const Shape = require('./util/Shape').default;
|
const Shape = require('./util/Shape').default;
|
||||||
|
|
||||||
const RelationshipPivot = new Class({
|
const RelationshipPivot = new Class({
|
||||||
initialize: function (workspace, designer) {
|
initialize(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;
|
||||||
this._designer = designer;
|
this._designer = designer;
|
||||||
|
|
||||||
//FIXME: the aim of the migration is remove .bind mootools method, please remove these!
|
// FIXME: the aim of the migration is remove .bind mootools method, please remove these!
|
||||||
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: function (sourceTopic, targetPos) {
|
start(sourceTopic, targetPos) {
|
||||||
$assert(sourceTopic, "sourceTopic can not be null");
|
$assert(sourceTopic, 'sourceTopic can not be null');
|
||||||
$assert(targetPos, "targetPos can not be null");
|
$assert(targetPos, 'targetPos can not be null');
|
||||||
|
|
||||||
this.dispose();
|
this.dispose();
|
||||||
this._sourceTopic = sourceTopic;
|
this._sourceTopic = sourceTopic;
|
||||||
if (sourceTopic != null) {
|
if (sourceTopic != null) {
|
||||||
this._workspace.enableWorkspaceEvents(false);
|
this._workspace.enableWorkspaceEvents(false);
|
||||||
|
|
||||||
var sourcePos = sourceTopic.getPosition();
|
const sourcePos = sourceTopic.getPosition();
|
||||||
var strokeColor = Relationship.getStrokeColor();
|
const strokeColor = Relationship.getStrokeColor();
|
||||||
|
|
||||||
this._pivot = new web2d.CurvedLine();
|
this._pivot = new web2d.CurvedLine();
|
||||||
this._pivot.setStyle(web2d.CurvedLine.SIMPLE_LINE);
|
this._pivot.setStyle(web2d.CurvedLine.SIMPLE_LINE);
|
||||||
|
|
||||||
var fromPos = this._calculateFromPosition(sourcePos);
|
const fromPos = this._calculateFromPosition(sourcePos);
|
||||||
this._pivot.setFrom(fromPos.x, fromPos.y);
|
this._pivot.setFrom(fromPos.x, fromPos.y);
|
||||||
|
|
||||||
this._pivot.setTo(targetPos.x, targetPos.y);
|
this._pivot.setTo(targetPos.x, targetPos.y);
|
||||||
@ -70,26 +71,25 @@ const RelationshipPivot = new Class({
|
|||||||
this._workspace.addEvent('click', this._onClickEvent);
|
this._workspace.addEvent('click', this._onClickEvent);
|
||||||
|
|
||||||
// Register focus events on all topics ...
|
// Register focus events on all topics ...
|
||||||
var model = this._designer.getModel();
|
const model = this._designer.getModel();
|
||||||
var topics = model.getTopics();
|
const topics = model.getTopics();
|
||||||
_.each(topics, function (topic) {
|
_.each(topics, (topic) => {
|
||||||
topic.addEvent('ontfocus', this._onTopicClick);
|
topic.addEvent('ontfocus', this._onTopicClick);
|
||||||
}.bind(this));
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
dispose: function () {
|
dispose() {
|
||||||
var workspace = this._workspace;
|
const workspace = this._workspace;
|
||||||
|
|
||||||
if (this._isActive()) {
|
if (this._isActive()) {
|
||||||
workspace.removeEvent('mousemove', this._mouseMoveEvent);
|
workspace.removeEvent('mousemove', this._mouseMoveEvent);
|
||||||
workspace.removeEvent('click', this._onClickEvent);
|
workspace.removeEvent('click', this._onClickEvent);
|
||||||
|
|
||||||
var model = this._designer.getModel();
|
const model = this._designer.getModel();
|
||||||
var topics = model.getTopics();
|
const topics = model.getTopics();
|
||||||
var me = this;
|
const me = this;
|
||||||
_.each(topics, function (topic) {
|
_.each(topics, (topic) => {
|
||||||
topic.removeEvent('ontfocus', me._onTopicClick);
|
topic.removeEvent('ontfocus', me._onTopicClick);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -103,21 +103,21 @@ const RelationshipPivot = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_mouseMove: function (event) {
|
_mouseMove(event) {
|
||||||
var screen = this._workspace.getScreenManager();
|
const screen = this._workspace.getScreenManager();
|
||||||
var pos = screen.getWorkspaceMousePosition(event);
|
const pos = screen.getWorkspaceMousePosition(event);
|
||||||
|
|
||||||
// Leave the arrow a couple of pixels away from the cursor.
|
// Leave the arrow a couple of pixels away from the cursor.
|
||||||
var sourcePosition = this._sourceTopic.getPosition();
|
const sourcePosition = this._sourceTopic.getPosition();
|
||||||
var gapDistance = Math.sign(pos.x - sourcePosition.x) * 5;
|
const gapDistance = Math.sign(pos.x - sourcePosition.x) * 5;
|
||||||
|
|
||||||
var sPos = this._calculateFromPosition(pos);
|
const sPos = this._calculateFromPosition(pos);
|
||||||
this._pivot.setFrom(sPos.x, sPos.y);
|
this._pivot.setFrom(sPos.x, sPos.y);
|
||||||
|
|
||||||
// Update target position ...
|
// Update target position ...
|
||||||
this._pivot.setTo(pos.x - gapDistance, pos.y);
|
this._pivot.setTo(pos.x - gapDistance, pos.y);
|
||||||
|
|
||||||
var controlPoints = this._pivot.getControlPoints();
|
const controlPoints = this._pivot.getControlPoints();
|
||||||
this._startArrow.setFrom(pos.x - gapDistance, pos.y);
|
this._startArrow.setFrom(pos.x - gapDistance, pos.y);
|
||||||
this._startArrow.setControlPoint(controlPoints[1]);
|
this._startArrow.setControlPoint(controlPoints[1]);
|
||||||
|
|
||||||
@ -125,43 +125,41 @@ const RelationshipPivot = new Class({
|
|||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
_cleanOnMouseClick: function (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: function (toPosition) {
|
_calculateFromPosition(toPosition) {
|
||||||
|
|
||||||
// Calculate origin position ...
|
// Calculate origin position ...
|
||||||
var sourcePosition = this._sourceTopic.getPosition();
|
let sourcePosition = this._sourceTopic.getPosition();
|
||||||
if (this._sourceTopic.getType() == INodeModel.CENTRAL_TOPIC_TYPE) {
|
if (this._sourceTopic.getType() == INodeModel.CENTRAL_TOPIC_TYPE) {
|
||||||
sourcePosition = Shape.workoutIncomingConnectionPoint(this._sourceTopic, toPosition);
|
sourcePosition = Shape.workoutIncomingConnectionPoint(this._sourceTopic, toPosition);
|
||||||
}
|
}
|
||||||
var controlPoint = Shape.calculateDefaultControlPoints(sourcePosition, toPosition);
|
const controlPoint = Shape.calculateDefaultControlPoints(sourcePosition, toPosition);
|
||||||
|
|
||||||
var spoint = new core.Point();
|
const spoint = new core.Point();
|
||||||
spoint.x = parseInt(controlPoint[0].x) + parseInt(sourcePosition.x);
|
spoint.x = parseInt(controlPoint[0].x) + parseInt(sourcePosition.x);
|
||||||
spoint.y = parseInt(controlPoint[0].y) + parseInt(sourcePosition.y);
|
spoint.y = parseInt(controlPoint[0].y) + parseInt(sourcePosition.y);
|
||||||
return Shape.calculateRelationShipPointCoordinates(this._sourceTopic, spoint);
|
return Shape.calculateRelationShipPointCoordinates(this._sourceTopic, spoint);
|
||||||
},
|
},
|
||||||
|
|
||||||
_connectOnFocus: function (event, targetTopic) {
|
_connectOnFocus(event, targetTopic) {
|
||||||
var sourceTopic = this._sourceTopic;
|
const sourceTopic = this._sourceTopic;
|
||||||
var mindmap = this._designer.getMindmap();
|
const mindmap = this._designer.getMindmap();
|
||||||
|
|
||||||
// Avoid circular connections ...
|
// Avoid circular connections ...
|
||||||
if (targetTopic.getId() != sourceTopic.getId()) {
|
if (targetTopic.getId() != sourceTopic.getId()) {
|
||||||
var relModel = mindmap.createRelationship(targetTopic.getId(), sourceTopic.getId());
|
const relModel = mindmap.createRelationship(targetTopic.getId(), sourceTopic.getId());
|
||||||
this._designer._actionDispatcher.addRelationship(relModel);
|
this._designer._actionDispatcher.addRelationship(relModel);
|
||||||
}
|
}
|
||||||
this.dispose();
|
this.dispose();
|
||||||
},
|
},
|
||||||
|
|
||||||
_isActive: function () {
|
_isActive() {
|
||||||
return this._pivot != null;
|
return this._pivot != null;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default RelationshipPivot;
|
export default RelationshipPivot;
|
||||||
|
@ -19,13 +19,13 @@ const PersistenceManager = require('./PersistenceManager').default;
|
|||||||
|
|
||||||
const RESTPersistenceManager = new Class({
|
const RESTPersistenceManager = new Class({
|
||||||
Extends: PersistenceManager,
|
Extends: PersistenceManager,
|
||||||
initialize: function (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');
|
||||||
$assert(options.lockUrl, "lockUrl can not be null");
|
$assert(options.lockUrl, 'lockUrl can not be null');
|
||||||
$assert(options.session, "session can not be null");
|
$assert(options.session, 'session can not be null');
|
||||||
$assert(options.timestamp, "timestamp can not be null");
|
$assert(options.timestamp, 'timestamp can not be null');
|
||||||
|
|
||||||
this.documentUrl = options.documentUrl;
|
this.documentUrl = options.documentUrl;
|
||||||
this.revertUrl = options.revertUrl;
|
this.revertUrl = options.revertUrl;
|
||||||
@ -34,58 +34,55 @@ const RESTPersistenceManager = new Class({
|
|||||||
this.session = options.session;
|
this.session = options.session;
|
||||||
},
|
},
|
||||||
|
|
||||||
saveMapXml: function (mapId, mapXml, pref, saveHistory, events, sync) {
|
saveMapXml(mapId, mapXml, pref, saveHistory, events, sync) {
|
||||||
|
const data = {
|
||||||
var data = {
|
|
||||||
id: mapId,
|
id: mapId,
|
||||||
xml: mapXml,
|
xml: mapXml,
|
||||||
properties: pref
|
properties: pref,
|
||||||
};
|
};
|
||||||
|
|
||||||
var persistence = this;
|
const persistence = this;
|
||||||
var query = "minor=" + !saveHistory;
|
let query = `minor=${!saveHistory}`;
|
||||||
query = query + "×tamp=" + this.timestamp;
|
query = `${query}×tamp=${this.timestamp}`;
|
||||||
query = query + "&session=" + this.session;
|
query = `${query}&session=${this.session}`;
|
||||||
|
|
||||||
if (!persistence.onSave) {
|
if (!persistence.onSave) {
|
||||||
|
|
||||||
// Mark save in process and fire a event unlocking the save ...
|
// Mark save in process and fire a event unlocking the save ...
|
||||||
persistence.onSave = true;
|
persistence.onSave = true;
|
||||||
persistence.clearTimeout = setTimeout(function () {
|
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}`,
|
||||||
type: 'put',
|
type: 'put',
|
||||||
dataType: "json",
|
dataType: 'json',
|
||||||
data: JSON.stringify(data),
|
data: JSON.stringify(data),
|
||||||
contentType: "application/json; charset=utf-8",
|
contentType: 'application/json; charset=utf-8',
|
||||||
async: !sync,
|
async: !sync,
|
||||||
|
|
||||||
success: function (data, textStatus, jqXHRresponseText) {
|
success(data, textStatus, jqXHRresponseText) {
|
||||||
persistence.timestamp = data;
|
persistence.timestamp = data;
|
||||||
events.onSuccess();
|
events.onSuccess();
|
||||||
},
|
},
|
||||||
error: function (jqXHR, textStatus, errorThrown) {
|
error(jqXHR, textStatus, errorThrown) {
|
||||||
events.onError(persistence._buildError());
|
events.onError(persistence._buildError());
|
||||||
},
|
},
|
||||||
complete: function () {
|
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: function (xhr, textStatus) {
|
fail(xhr, textStatus) {
|
||||||
|
const { responseText } = xhr;
|
||||||
|
let userMsg = { severity: 'SEVERE', message: $msg('SAVE_COULD_NOT_BE_COMPLETED') };
|
||||||
|
|
||||||
var responseText = xhr.responseText;
|
const contentType = xhr.getResponseHeader('Content-Type');
|
||||||
var userMsg = {severity: "SEVERE", message: $msg('SAVE_COULD_NOT_BE_COMPLETED')};
|
if (contentType != null && contentType.indexOf('application/json') != -1) {
|
||||||
|
let serverMsg = null;
|
||||||
var contentType = xhr.getResponseHeader("Content-Type");
|
|
||||||
if (contentType != null && contentType.indexOf("application/json") != -1) {
|
|
||||||
var serverMsg = null;
|
|
||||||
try {
|
try {
|
||||||
serverMsg = $.parseJSON(responseText);
|
serverMsg = $.parseJSON(responseText);
|
||||||
serverMsg = serverMsg.globalSeverity ? serverMsg : null;
|
serverMsg = serverMsg.globalSeverity ? serverMsg : null;
|
||||||
@ -93,74 +90,70 @@ const RESTPersistenceManager = new Class({
|
|||||||
// Message could not be decoded ...
|
// Message could not be decoded ...
|
||||||
}
|
}
|
||||||
userMsg = persistence._buildError(serverMsg);
|
userMsg = persistence._buildError(serverMsg);
|
||||||
|
} else if (this.status == 405) {
|
||||||
} else {
|
userMsg = { severity: 'SEVERE', message: $msg('SESSION_EXPIRED') };
|
||||||
if (this.status == 405) {
|
|
||||||
userMsg = {severity: "SEVERE", message: $msg('SESSION_EXPIRED')};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
events.onError(userMsg);
|
events.onError(userMsg);
|
||||||
persistence.onSave = false;
|
persistence.onSave = false;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
discardChanges: function (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: function (mindmap) {
|
unlockMap(mindmap) {
|
||||||
var mapId = mindmap.getId();
|
const mapId = mindmap.getId();
|
||||||
$.ajax({
|
$.ajax({
|
||||||
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: function (jsonSeverResponse) {
|
_buildError(jsonSeverResponse) {
|
||||||
var message = jsonSeverResponse ? jsonSeverResponse.globalErrors[0] : null;
|
let message = jsonSeverResponse ? jsonSeverResponse.globalErrors[0] : null;
|
||||||
var severity = jsonSeverResponse ? jsonSeverResponse.globalSeverity : null;
|
let severity = jsonSeverResponse ? jsonSeverResponse.globalSeverity : null;
|
||||||
|
|
||||||
if (!message) {
|
if (!message) {
|
||||||
message = $msg('SAVE_COULD_NOT_BE_COMPLETED');
|
message = $msg('SAVE_COULD_NOT_BE_COMPLETED');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!severity) {
|
if (!severity) {
|
||||||
severity = "INFO";
|
severity = 'INFO';
|
||||||
}
|
}
|
||||||
return {severity: severity, message: message};
|
return { severity, message };
|
||||||
},
|
},
|
||||||
|
|
||||||
loadMapDom: function (mapId) {
|
loadMapDom(mapId) {
|
||||||
// Let's try to open one from the local directory ...
|
// Let's try to open one from the local directory ...
|
||||||
var xml;
|
let xml;
|
||||||
$.ajax({
|
$.ajax({
|
||||||
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: function (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.
|
||||||
if (xml == null) {
|
if (xml == null) {
|
||||||
throw new Error("Map could not be loaded");
|
throw new Error('Map could not be loaded');
|
||||||
}
|
}
|
||||||
|
|
||||||
return xml;
|
return xml;
|
||||||
}
|
},
|
||||||
}
|
});
|
||||||
);
|
|
||||||
|
|
||||||
export default RESTPersistenceManager;
|
export default RESTPersistenceManager;
|
||||||
|
@ -16,138 +16,135 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
const Core = require('@wismapping/core-js');
|
const Core = require('@wismapping/core-js');
|
||||||
|
|
||||||
const core = Core();
|
const core = Core();
|
||||||
|
|
||||||
const ScreenManager = new Class({
|
const ScreenManager = new Class({
|
||||||
initialize: function (divElement) {
|
initialize(divElement) {
|
||||||
$assert(divElement, "can not be null");
|
$assert(divElement, 'can not be null');
|
||||||
this._divContainer = divElement;
|
this._divContainer = divElement;
|
||||||
this._padding = {x: 0, y: 0};
|
this._padding = { x: 0, y: 0 };
|
||||||
|
|
||||||
// Ignore default click event propagation. Prevent 'click' event on drag.
|
// Ignore default click event propagation. Prevent 'click' event on drag.
|
||||||
this._clickEvents = [];
|
this._clickEvents = [];
|
||||||
this._divContainer.bind('click', function (event) {
|
this._divContainer.bind('click', (event) => {
|
||||||
event.stopPropagation()
|
event.stopPropagation();
|
||||||
});
|
});
|
||||||
|
|
||||||
this._divContainer.bind('dblclick', function (event) {
|
this._divContainer.bind('dblclick', (event) => {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
setScale: function (scale) {
|
setScale(scale) {
|
||||||
$assert(scale, 'Screen scale can not be null');
|
$assert(scale, 'Screen scale can not be null');
|
||||||
this._scale = scale;
|
this._scale = scale;
|
||||||
},
|
},
|
||||||
|
|
||||||
addEvent: function (event, listener) {
|
addEvent(event, listener) {
|
||||||
if (event == 'click')
|
if (event == 'click') this._clickEvents.push(listener);
|
||||||
this._clickEvents.push(listener);
|
else this._divContainer.bind(event, listener);
|
||||||
else
|
|
||||||
this._divContainer.bind(event, listener);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
removeEvent: function (event, listener) {
|
removeEvent(event, listener) {
|
||||||
if (event == 'click') {
|
if (event == 'click') {
|
||||||
this._clickEvents.remove(listener);
|
this._clickEvents.remove(listener);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
this._divContainer.unbind(event, listener);
|
this._divContainer.unbind(event, listener);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
fireEvent: function (type, event) {
|
fireEvent(type, event) {
|
||||||
if (type == 'click') {
|
if (type == 'click') {
|
||||||
_.each(this._clickEvents, function (listener) {
|
_.each(this._clickEvents, (listener) => {
|
||||||
listener(type, event);
|
listener(type, event);
|
||||||
});
|
});
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
this._divContainer.trigger(type, event);
|
this._divContainer.trigger(type, event);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_getElementPosition: function (elem) {
|
_getElementPosition(elem) {
|
||||||
// Retrieve current element position.
|
// Retrieve current element position.
|
||||||
var elementPosition = elem.getPosition();
|
const elementPosition = elem.getPosition();
|
||||||
var x = elementPosition.x;
|
let { x } = elementPosition;
|
||||||
var y = elementPosition.y;
|
let { y } = elementPosition;
|
||||||
|
|
||||||
// Add workspace offset.
|
// Add workspace offset.
|
||||||
x = x - this._padding.x;
|
x -= this._padding.x;
|
||||||
y = y - this._padding.y;
|
y -= this._padding.y;
|
||||||
|
|
||||||
// Scale coordinate in order to be relative to the workspace. That's coord/size;
|
// Scale coordinate in order to be relative to the workspace. That's coord/size;
|
||||||
x = x / this._scale;
|
x /= this._scale;
|
||||||
y = y / this._scale;
|
y /= this._scale;
|
||||||
|
|
||||||
// Remove decimal part..
|
// Remove decimal part..
|
||||||
return {x: x, y: y};
|
return { x, y };
|
||||||
},
|
},
|
||||||
|
|
||||||
getWorkspaceIconPosition: function (e) {
|
getWorkspaceIconPosition(e) {
|
||||||
// Retrieve current icon position.
|
// Retrieve current icon position.
|
||||||
var image = e.getImage();
|
const image = e.getImage();
|
||||||
var elementPosition = image.getPosition();
|
const elementPosition = image.getPosition();
|
||||||
var imageSize = e.getSize();
|
const imageSize = e.getSize();
|
||||||
|
|
||||||
//Add group offset
|
// Add group offset
|
||||||
var iconGroup = e.getGroup();
|
const iconGroup = e.getGroup();
|
||||||
var group = iconGroup.getNativeElement();
|
const group = iconGroup.getNativeElement();
|
||||||
var coordOrigin = group.getCoordOrigin();
|
const coordOrigin = group.getCoordOrigin();
|
||||||
var groupSize = group.getSize();
|
const groupSize = group.getSize();
|
||||||
var coordSize = group.getCoordSize();
|
const coordSize = group.getCoordSize();
|
||||||
|
|
||||||
var scale = {x: coordSize.width / parseInt(groupSize.width), y: coordSize.height / parseInt(groupSize.height)};
|
const scale = { x: coordSize.width / parseInt(groupSize.width), y: coordSize.height / parseInt(groupSize.height) };
|
||||||
|
|
||||||
var x = (elementPosition.x - coordOrigin.x - (parseInt(imageSize.width) / 2)) / scale.x;
|
let x = (elementPosition.x - coordOrigin.x - (parseInt(imageSize.width) / 2)) / scale.x;
|
||||||
var y = (elementPosition.y - coordOrigin.y - (parseInt(imageSize.height) / 2)) / scale.y;
|
let y = (elementPosition.y - coordOrigin.y - (parseInt(imageSize.height) / 2)) / scale.y;
|
||||||
|
|
||||||
//Retrieve iconGroup Position
|
// Retrieve iconGroup Position
|
||||||
var groupPosition = iconGroup.getPosition();
|
const groupPosition = iconGroup.getPosition();
|
||||||
x = x + groupPosition.x;
|
x += groupPosition.x;
|
||||||
y = y + groupPosition.y;
|
y += groupPosition.y;
|
||||||
|
|
||||||
//Retrieve topic Position
|
// Retrieve topic Position
|
||||||
var topic = iconGroup.getTopic();
|
const topic = iconGroup.getTopic();
|
||||||
var topicPosition = this._getElementPosition(topic);
|
const topicPosition = this._getElementPosition(topic);
|
||||||
topicPosition.x = topicPosition.x - (parseInt(topic.getSize().width) / 2);
|
topicPosition.x -= (parseInt(topic.getSize().width) / 2);
|
||||||
|
|
||||||
// Remove decimal part..
|
// Remove decimal part..
|
||||||
return {x: x + topicPosition.x, y: y + topicPosition.y};
|
return { x: x + topicPosition.x, y: y + topicPosition.y };
|
||||||
},
|
},
|
||||||
|
|
||||||
getWorkspaceMousePosition: function (event) {
|
getWorkspaceMousePosition(event) {
|
||||||
// Retrieve current mouse position.
|
// Retrieve current mouse position.
|
||||||
var x = event.clientX;
|
let x = event.clientX;
|
||||||
var y = event.clientY;
|
let y = event.clientY;
|
||||||
|
|
||||||
//FIXME: paulo: why? Subtract div position.
|
// FIXME: paulo: why? Subtract div position.
|
||||||
/*var containerPosition = this.getContainer().position();
|
/* var containerPosition = this.getContainer().position();
|
||||||
x = x - containerPosition.x;
|
x = x - containerPosition.x;
|
||||||
y = y - containerPosition.y;*/
|
y = y - containerPosition.y; */
|
||||||
|
|
||||||
// Scale coordinate in order to be relative to the workspace. That's coordSize/size;
|
// Scale coordinate in order to be relative to the workspace. That's coordSize/size;
|
||||||
x = x * this._scale;
|
x *= this._scale;
|
||||||
y = y * this._scale;
|
y *= this._scale;
|
||||||
|
|
||||||
// Add workspace offset.
|
// Add workspace offset.
|
||||||
x = x + this._padding.x;
|
x += this._padding.x;
|
||||||
y = y + this._padding.y;
|
y += this._padding.y;
|
||||||
|
|
||||||
// Remove decimal part..
|
// Remove decimal part..
|
||||||
return new core.Point(x, y);
|
return new core.Point(x, y);
|
||||||
},
|
},
|
||||||
|
|
||||||
getContainer: function () {
|
getContainer() {
|
||||||
return this._divContainer;
|
return this._divContainer;
|
||||||
},
|
},
|
||||||
|
|
||||||
setOffset: function (x, y) {
|
setOffset(x, y) {
|
||||||
this._padding.x = x;
|
this._padding.x = x;
|
||||||
this._padding.y = y;
|
this._padding.y = y;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default ScreenManager;
|
export default ScreenManager;
|
||||||
|
@ -15,61 +15,58 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const web2D = require('@wismapping/web2d')
|
const web2D = require('@wismapping/web2d');
|
||||||
|
|
||||||
const web2d = web2D();
|
const web2d = web2D();
|
||||||
|
|
||||||
const Topic = require('./Topic').default
|
const Topic = require('./Topic').default;
|
||||||
const ActionDispatcher = require('./ActionDispatcher').default;
|
const ActionDispatcher = require('./ActionDispatcher').default;
|
||||||
|
|
||||||
const ShirinkConnector = new Class({
|
const ShirinkConnector = new Class({
|
||||||
initialize: function (topic) {
|
initialize(topic) {
|
||||||
|
const ellipse = new web2D.Elipse(Topic.prototype.INNER_RECT_ATTRIBUTES);
|
||||||
var ellipse = new web2D.Elipse(Topic.prototype.INNER_RECT_ATTRIBUTES);
|
|
||||||
this._ellipse = ellipse;
|
this._ellipse = ellipse;
|
||||||
ellipse.setFill('rgb(62,118,179)');
|
ellipse.setFill('rgb(62,118,179)');
|
||||||
|
|
||||||
ellipse.setSize(Topic.CONNECTOR_WIDTH, Topic.CONNECTOR_WIDTH);
|
ellipse.setSize(Topic.CONNECTOR_WIDTH, Topic.CONNECTOR_WIDTH);
|
||||||
ellipse.addEvent('click', function (event) {
|
ellipse.addEvent('click', (event) => {
|
||||||
var model = topic.getModel();
|
const model = topic.getModel();
|
||||||
var collapse = !model.areChildrenShrunken();
|
const collapse = !model.areChildrenShrunken();
|
||||||
|
|
||||||
var topicId = topic.getId();
|
const topicId = topic.getId();
|
||||||
var actionDispatcher = ActionDispatcher.getInstance();
|
const actionDispatcher = ActionDispatcher.getInstance();
|
||||||
actionDispatcher.shrinkBranch([topicId], collapse);
|
actionDispatcher.shrinkBranch([topicId], collapse);
|
||||||
|
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ellipse.addEvent('mousedown', function (event) {
|
ellipse.addEvent('mousedown', (event) => {
|
||||||
// Avoid node creation ...
|
// Avoid node creation ...
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
});
|
});
|
||||||
|
|
||||||
ellipse.addEvent('dblclick', function (event) {
|
ellipse.addEvent('dblclick', (event) => {
|
||||||
// Avoid node creation ...
|
// Avoid node creation ...
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
});
|
});
|
||||||
|
|
||||||
ellipse.addEvent('mouseover', function (event) {
|
ellipse.addEvent('mouseover', (event) => {
|
||||||
|
|
||||||
ellipse.setFill('rgb(153, 0, 255)');
|
ellipse.setFill('rgb(153, 0, 255)');
|
||||||
});
|
});
|
||||||
var me = this;
|
const me = this;
|
||||||
ellipse.addEvent('mouseout', function (event) {
|
ellipse.addEvent('mouseout', (event) => {
|
||||||
var color = topic.getBackgroundColor();
|
const color = topic.getBackgroundColor();
|
||||||
me.setFill(color);
|
me.setFill(color);
|
||||||
});
|
});
|
||||||
|
|
||||||
ellipse.setCursor('default');
|
ellipse.setCursor('default');
|
||||||
this._fillColor = '#f7f7f7';
|
this._fillColor = '#f7f7f7';
|
||||||
var model = topic.getModel();
|
const model = topic.getModel();
|
||||||
this.changeRender(model.areChildrenShrunken());
|
this.changeRender(model.areChildrenShrunken());
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
changeRender: function (isShrink) {
|
changeRender(isShrink) {
|
||||||
var elipse = this._ellipse;
|
const elipse = this._ellipse;
|
||||||
if (isShrink) {
|
if (isShrink) {
|
||||||
elipse.setStroke('2', 'solid');
|
elipse.setStroke('2', 'solid');
|
||||||
} else {
|
} else {
|
||||||
@ -77,38 +74,38 @@ const ShirinkConnector = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
setVisibility: function (value) {
|
setVisibility(value) {
|
||||||
this._ellipse.setVisibility(value);
|
this._ellipse.setVisibility(value);
|
||||||
},
|
},
|
||||||
|
|
||||||
setOpacity: function (opacity) {
|
setOpacity(opacity) {
|
||||||
this._ellipse.setOpacity(opacity);
|
this._ellipse.setOpacity(opacity);
|
||||||
},
|
},
|
||||||
|
|
||||||
setFill: function (color) {
|
setFill(color) {
|
||||||
this._fillColor = color;
|
this._fillColor = color;
|
||||||
this._ellipse.setFill(color);
|
this._ellipse.setFill(color);
|
||||||
},
|
},
|
||||||
|
|
||||||
setAttribute: function (name, value) {
|
setAttribute(name, value) {
|
||||||
this._ellipse.setAttribute(name, value);
|
this._ellipse.setAttribute(name, value);
|
||||||
},
|
},
|
||||||
|
|
||||||
addToWorkspace: function (group) {
|
addToWorkspace(group) {
|
||||||
group.append(this._ellipse);
|
group.append(this._ellipse);
|
||||||
},
|
},
|
||||||
|
|
||||||
setPosition: function (x, y) {
|
setPosition(x, y) {
|
||||||
this._ellipse.setPosition(x, y);
|
this._ellipse.setPosition(x, y);
|
||||||
},
|
},
|
||||||
|
|
||||||
moveToBack: function () {
|
moveToBack() {
|
||||||
this._ellipse.moveToBack();
|
this._ellipse.moveToBack();
|
||||||
},
|
},
|
||||||
|
|
||||||
moveToFront: function () {
|
moveToFront() {
|
||||||
this._ellipse.moveToFront();
|
this._ellipse.moveToFront();
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default ShirinkConnector;
|
export default ShirinkConnector;
|
||||||
|
@ -36,42 +36,42 @@ const StandaloneActionDispatcher = new Class(
|
|||||||
* @constructs
|
* @constructs
|
||||||
* @param {mindplot.CommandContext} commandContext
|
* @param {mindplot.CommandContext} commandContext
|
||||||
*/
|
*/
|
||||||
initialize: function (commandContext) {
|
initialize(commandContext) {
|
||||||
this.parent(commandContext);
|
this.parent(commandContext);
|
||||||
this._actionRunner = new DesignerActionRunner(commandContext, this);
|
this._actionRunner = new DesignerActionRunner(commandContext, this);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
addTopics: function (models, parentTopicsId) {
|
addTopics(models, parentTopicsId) {
|
||||||
var command = new AddTopicCommand(models, parentTopicsId);
|
const command = new AddTopicCommand(models, parentTopicsId);
|
||||||
this.execute(command);
|
this.execute(command);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
addRelationship: function (model) {
|
addRelationship(model) {
|
||||||
var command = new AddRelationshipCommand(model);
|
const command = new AddRelationshipCommand(model);
|
||||||
this.execute(command);
|
this.execute(command);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
deleteEntities: function (topicsIds, relIds) {
|
deleteEntities(topicsIds, relIds) {
|
||||||
var command = new DeleteCommand(topicsIds, relIds);
|
const command = new DeleteCommand(topicsIds, relIds);
|
||||||
this.execute(command);
|
this.execute(command);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
dragTopic: function (topicId, position, order, parentTopic) {
|
dragTopic(topicId, position, order, parentTopic) {
|
||||||
var command = new DragTopicCommand(topicId, position, order, parentTopic);
|
const command = new DragTopicCommand(topicId, position, order, parentTopic);
|
||||||
this.execute(command);
|
this.execute(command);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
moveTopic: function (topicId, position) {
|
moveTopic(topicId, position) {
|
||||||
$assert($defined(topicId), 'topicsId can not be null');
|
$assert($defined(topicId), 'topicsId can not be null');
|
||||||
$assert($defined(position), 'position can not be null');
|
$assert($defined(position), 'position can not be null');
|
||||||
|
|
||||||
var commandFunc = function (topic, value) {
|
const commandFunc = function (topic, value) {
|
||||||
var result = topic.getPosition();
|
const result = topic.getPosition();
|
||||||
EventBus.instance.fireEvent(EventBus.events.NodeMoveEvent, {
|
EventBus.instance.fireEvent(EventBus.events.NodeMoveEvent, {
|
||||||
node: topic.getModel(),
|
node: topic.getModel(),
|
||||||
position: value,
|
position: value,
|
||||||
@ -79,193 +79,193 @@ const StandaloneActionDispatcher = new Class(
|
|||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
var command = new GenericFunctionCommand(commandFunc, topicId, position);
|
const command = new GenericFunctionCommand(commandFunc, topicId, position);
|
||||||
this.execute(command);
|
this.execute(command);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
moveControlPoint: function (ctrlPoint, point) {
|
moveControlPoint(ctrlPoint, point) {
|
||||||
var command = new MoveControlPointCommand(ctrlPoint, point);
|
const command = new MoveControlPointCommand(ctrlPoint, point);
|
||||||
this.execute(command);
|
this.execute(command);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
changeFontStyleToTopic: function (topicsIds) {
|
changeFontStyleToTopic(topicsIds) {
|
||||||
var commandFunc = function (topic) {
|
const commandFunc = function (topic) {
|
||||||
var result = topic.getFontStyle();
|
const result = topic.getFontStyle();
|
||||||
var style = result == 'italic' ? 'normal' : 'italic';
|
const style = result == 'italic' ? 'normal' : 'italic';
|
||||||
topic.setFontStyle(style, true);
|
topic.setFontStyle(style, true);
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
var command = new GenericFunctionCommand(commandFunc, topicsIds);
|
const command = new GenericFunctionCommand(commandFunc, topicsIds);
|
||||||
this.execute(command);
|
this.execute(command);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
changeTextToTopic: function (topicsIds, text) {
|
changeTextToTopic(topicsIds, text) {
|
||||||
$assert($defined(topicsIds), 'topicsIds can not be null');
|
$assert($defined(topicsIds), 'topicsIds can not be null');
|
||||||
|
|
||||||
var commandFunc = function (topic, value) {
|
const commandFunc = function (topic, value) {
|
||||||
var result = topic.getText();
|
const result = topic.getText();
|
||||||
topic.setText(value);
|
topic.setText(value);
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
commandFunc.commandType = 'changeTextToTopic';
|
commandFunc.commandType = 'changeTextToTopic';
|
||||||
|
|
||||||
var command = new GenericFunctionCommand(commandFunc, topicsIds, text);
|
const command = new GenericFunctionCommand(commandFunc, topicsIds, text);
|
||||||
this.execute(command);
|
this.execute(command);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
changeFontFamilyToTopic: function (topicIds, fontFamily) {
|
changeFontFamilyToTopic(topicIds, fontFamily) {
|
||||||
$assert(topicIds, 'topicIds can not be null');
|
$assert(topicIds, 'topicIds can not be null');
|
||||||
$assert(fontFamily, 'fontFamily can not be null');
|
$assert(fontFamily, 'fontFamily can not be null');
|
||||||
|
|
||||||
var commandFunc = function (topic, fontFamily) {
|
const commandFunc = function (topic, fontFamily) {
|
||||||
var result = topic.getFontFamily();
|
const result = topic.getFontFamily();
|
||||||
topic.setFontFamily(fontFamily, true);
|
topic.setFontFamily(fontFamily, true);
|
||||||
|
|
||||||
topic._adjustShapes();
|
topic._adjustShapes();
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
var command = new GenericFunctionCommand(commandFunc, topicIds, fontFamily);
|
const command = new GenericFunctionCommand(commandFunc, topicIds, fontFamily);
|
||||||
this.execute(command);
|
this.execute(command);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
changeFontColorToTopic: function (topicsIds, color) {
|
changeFontColorToTopic(topicsIds, color) {
|
||||||
$assert(topicsIds, 'topicIds can not be null');
|
$assert(topicsIds, 'topicIds can not be null');
|
||||||
$assert(color, 'color can not be null');
|
$assert(color, 'color can not be null');
|
||||||
|
|
||||||
var commandFunc = function (topic, color) {
|
const commandFunc = function (topic, color) {
|
||||||
var result = topic.getFontColor();
|
const result = topic.getFontColor();
|
||||||
topic.setFontColor(color, true);
|
topic.setFontColor(color, true);
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
var command = new GenericFunctionCommand(commandFunc, topicsIds, color);
|
const command = new GenericFunctionCommand(commandFunc, topicsIds, color);
|
||||||
command.discardDuplicated = 'fontColorCommandId';
|
command.discardDuplicated = 'fontColorCommandId';
|
||||||
this.execute(command);
|
this.execute(command);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
changeBackgroundColorToTopic: function (topicsIds, color) {
|
changeBackgroundColorToTopic(topicsIds, color) {
|
||||||
$assert(topicsIds, 'topicIds can not be null');
|
$assert(topicsIds, 'topicIds can not be null');
|
||||||
$assert(color, 'color can not be null');
|
$assert(color, 'color can not be null');
|
||||||
|
|
||||||
var commandFunc = function (topic, color) {
|
const commandFunc = function (topic, color) {
|
||||||
var result = topic.getBackgroundColor();
|
const result = topic.getBackgroundColor();
|
||||||
topic.setBackgroundColor(color);
|
topic.setBackgroundColor(color);
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
var command = new GenericFunctionCommand(commandFunc, topicsIds, color);
|
const command = new GenericFunctionCommand(commandFunc, topicsIds, color);
|
||||||
command.discardDuplicated = 'backColor';
|
command.discardDuplicated = 'backColor';
|
||||||
this.execute(command);
|
this.execute(command);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
changeBorderColorToTopic: function (topicsIds, color) {
|
changeBorderColorToTopic(topicsIds, color) {
|
||||||
$assert(topicsIds, 'topicIds can not be null');
|
$assert(topicsIds, 'topicIds can not be null');
|
||||||
$assert(color, 'topicIds can not be null');
|
$assert(color, 'topicIds can not be null');
|
||||||
|
|
||||||
var commandFunc = function (topic, color) {
|
const commandFunc = function (topic, color) {
|
||||||
var result = topic.getBorderColor();
|
const result = topic.getBorderColor();
|
||||||
topic.setBorderColor(color);
|
topic.setBorderColor(color);
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
var command = new GenericFunctionCommand(commandFunc, topicsIds, color);
|
const command = new GenericFunctionCommand(commandFunc, topicsIds, color);
|
||||||
command.discardDuplicated = 'borderColorCommandId';
|
command.discardDuplicated = 'borderColorCommandId';
|
||||||
this.execute(command);
|
this.execute(command);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
changeFontSizeToTopic: function (topicsIds, size) {
|
changeFontSizeToTopic(topicsIds, size) {
|
||||||
$assert(topicsIds, 'topicIds can not be null');
|
$assert(topicsIds, 'topicIds can not be null');
|
||||||
$assert(size, 'size can not be null');
|
$assert(size, 'size can not be null');
|
||||||
|
|
||||||
var commandFunc = function (topic, size) {
|
const commandFunc = function (topic, size) {
|
||||||
var result = topic.getFontSize();
|
const result = topic.getFontSize();
|
||||||
topic.setFontSize(size, true);
|
topic.setFontSize(size, true);
|
||||||
|
|
||||||
topic._adjustShapes();
|
topic._adjustShapes();
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
var command = new GenericFunctionCommand(commandFunc, topicsIds, size);
|
const command = new GenericFunctionCommand(commandFunc, topicsIds, size);
|
||||||
this.execute(command);
|
this.execute(command);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
changeShapeTypeToTopic: function (topicsIds, shapeType) {
|
changeShapeTypeToTopic(topicsIds, shapeType) {
|
||||||
$assert(topicsIds, 'topicsIds can not be null');
|
$assert(topicsIds, 'topicsIds can not be null');
|
||||||
$assert(shapeType, 'shapeType can not be null');
|
$assert(shapeType, 'shapeType can not be null');
|
||||||
|
|
||||||
var commandFunc = function (topic, shapeType) {
|
const commandFunc = function (topic, shapeType) {
|
||||||
var result = topic.getShapeType();
|
const result = topic.getShapeType();
|
||||||
topic.setShapeType(shapeType, true);
|
topic.setShapeType(shapeType, true);
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
var command = new GenericFunctionCommand(commandFunc, topicsIds, shapeType);
|
const command = new GenericFunctionCommand(commandFunc, topicsIds, shapeType);
|
||||||
this.execute(command);
|
this.execute(command);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
changeFontWeightToTopic: function (topicsIds) {
|
changeFontWeightToTopic(topicsIds) {
|
||||||
$assert(topicsIds, 'topicsIds can not be null');
|
$assert(topicsIds, 'topicsIds can not be null');
|
||||||
|
|
||||||
var commandFunc = function (topic) {
|
const commandFunc = function (topic) {
|
||||||
var result = topic.getFontWeight();
|
const result = topic.getFontWeight();
|
||||||
var weight = result == 'bold' ? 'normal' : 'bold';
|
const weight = result == 'bold' ? 'normal' : 'bold';
|
||||||
topic.setFontWeight(weight, true);
|
topic.setFontWeight(weight, true);
|
||||||
|
|
||||||
topic._adjustShapes();
|
topic._adjustShapes();
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
var command = new GenericFunctionCommand(commandFunc, topicsIds);
|
const command = new GenericFunctionCommand(commandFunc, topicsIds);
|
||||||
this.execute(command);
|
this.execute(command);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
shrinkBranch: function (topicsIds, collapse) {
|
shrinkBranch(topicsIds, collapse) {
|
||||||
$assert(topicsIds, 'topicsIds can not be null');
|
$assert(topicsIds, 'topicsIds can not be null');
|
||||||
|
|
||||||
var commandFunc = function (topic, isShrink) {
|
const commandFunc = function (topic, isShrink) {
|
||||||
topic.setChildrenShrunken(isShrink);
|
topic.setChildrenShrunken(isShrink);
|
||||||
return !isShrink;
|
return !isShrink;
|
||||||
};
|
};
|
||||||
|
|
||||||
var command = new GenericFunctionCommand(commandFunc, topicsIds, collapse);
|
const command = new GenericFunctionCommand(commandFunc, topicsIds, collapse);
|
||||||
this.execute(command, false);
|
this.execute(command, false);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
addFeatureToTopic: function (topicId, featureType, attributes) {
|
addFeatureToTopic(topicId, featureType, attributes) {
|
||||||
var command = new AddFeatureToTopicCommand(topicId, featureType, attributes);
|
const command = new AddFeatureToTopicCommand(topicId, featureType, attributes);
|
||||||
this.execute(command);
|
this.execute(command);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
changeFeatureToTopic: function (topicId, featureId, attributes) {
|
changeFeatureToTopic(topicId, featureId, attributes) {
|
||||||
var command = new ChangeFeatureToTopicCommand(topicId, featureId, attributes);
|
const command = new ChangeFeatureToTopicCommand(topicId, featureId, attributes);
|
||||||
this.execute(command);
|
this.execute(command);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
removeFeatureFromTopic: function (topicId, featureId) {
|
removeFeatureFromTopic(topicId, featureId) {
|
||||||
var command = new RemoveFeatureFromTopicCommand(topicId, featureId);
|
const command = new RemoveFeatureFromTopicCommand(topicId, featureId);
|
||||||
this.execute(command);
|
this.execute(command);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
execute: function (command) {
|
execute(command) {
|
||||||
this._actionRunner.execute(command);
|
this._actionRunner.execute(command);
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
const CommandContext = new Class(
|
const CommandContext = new Class(
|
||||||
@ -274,108 +274,102 @@ const CommandContext = new Class(
|
|||||||
* @constructs
|
* @constructs
|
||||||
* @param {mindplot.Designer} designer
|
* @param {mindplot.Designer} designer
|
||||||
*/
|
*/
|
||||||
initialize: function (designer) {
|
initialize(designer) {
|
||||||
$assert(designer, 'designer can not be null');
|
$assert(designer, 'designer can not be null');
|
||||||
this._designer = designer;
|
this._designer = designer;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
findTopics: function (topicsIds) {
|
findTopics(topicsIds) {
|
||||||
$assert($defined(topicsIds), 'topicsIds can not be null');
|
$assert($defined(topicsIds), 'topicsIds can not be null');
|
||||||
if (!(topicsIds instanceof Array)) {
|
if (!(topicsIds instanceof Array)) {
|
||||||
topicsIds = [topicsIds];
|
topicsIds = [topicsIds];
|
||||||
}
|
}
|
||||||
|
|
||||||
var designerTopics = this._designer.getModel().getTopics();
|
const designerTopics = this._designer.getModel().getTopics();
|
||||||
var result = designerTopics.filter(function (topic) {
|
const result = designerTopics.filter((topic) => topicsIds.contains(topic.getId()));
|
||||||
return topicsIds.contains(topic.getId());
|
|
||||||
});
|
|
||||||
|
|
||||||
if (result.length != topicsIds.length) {
|
if (result.length != topicsIds.length) {
|
||||||
var ids = designerTopics.map(function (topic) {
|
const ids = designerTopics.map((topic) => topic.getId());
|
||||||
return topic.getId();
|
|
||||||
});
|
|
||||||
$assert(
|
$assert(
|
||||||
result.length == topicsIds.length,
|
result.length == topicsIds.length,
|
||||||
'Could not find topic. Result:' +
|
`Could not find topic. Result:${
|
||||||
result +
|
result
|
||||||
', Filter Criteria:' +
|
}, Filter Criteria:${
|
||||||
topicsIds +
|
topicsIds
|
||||||
', Current Topics: [' +
|
}, Current Topics: [${
|
||||||
ids +
|
ids
|
||||||
']'
|
}]`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
deleteTopic: function (topic) {
|
deleteTopic(topic) {
|
||||||
this._designer.removeTopic(topic);
|
this._designer.removeTopic(topic);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
createTopic: function (model) {
|
createTopic(model) {
|
||||||
$assert(model, 'model can not be null');
|
$assert(model, 'model can not be null');
|
||||||
return this._designer.nodeModelToNodeGraph(model);
|
return this._designer.nodeModelToNodeGraph(model);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
createModel: function () {
|
createModel() {
|
||||||
var mindmap = this._designer.getMindmap();
|
const mindmap = this._designer.getMindmap();
|
||||||
return mindmap.createNode(NodeModel.MAIN_TOPIC_TYPE);
|
return mindmap.createNode(NodeModel.MAIN_TOPIC_TYPE);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
addTopic: function (topic) {
|
addTopic(topic) {
|
||||||
var mindmap = this._designer.getMindmap();
|
const mindmap = this._designer.getMindmap();
|
||||||
return mindmap.addBranch(topic.getModel());
|
return mindmap.addBranch(topic.getModel());
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
connect: function (childTopic, parentTopic) {
|
connect(childTopic, parentTopic) {
|
||||||
childTopic.connectTo(parentTopic, this._designer._workspace);
|
childTopic.connectTo(parentTopic, this._designer._workspace);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
disconnect: function (topic) {
|
disconnect(topic) {
|
||||||
topic.disconnect(this._designer._workspace);
|
topic.disconnect(this._designer._workspace);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
addRelationship: function (model) {
|
addRelationship(model) {
|
||||||
$assert(model, 'model cannot be null');
|
$assert(model, 'model cannot be null');
|
||||||
return this._designer.addRelationship(model);
|
return this._designer.addRelationship(model);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
deleteRelationship: function (relationship) {
|
deleteRelationship(relationship) {
|
||||||
this._designer.deleteRelationship(relationship);
|
this._designer.deleteRelationship(relationship);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
findRelationships: function (relIds) {
|
findRelationships(relIds) {
|
||||||
$assert($defined(relIds), 'relId can not be null');
|
$assert($defined(relIds), 'relId can not be null');
|
||||||
if (!(relIds instanceof Array)) {
|
if (!(relIds instanceof Array)) {
|
||||||
relIds = [relIds];
|
relIds = [relIds];
|
||||||
}
|
}
|
||||||
|
|
||||||
var designerRel = this._designer.getModel().getRelationships();
|
const designerRel = this._designer.getModel().getRelationships();
|
||||||
return designerRel.filter(function (rel) {
|
return designerRel.filter((rel) => relIds.contains(rel.getId()));
|
||||||
return relIds.contains(rel.getId());
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
moveTopic: function (topic, position) {
|
moveTopic(topic, position) {
|
||||||
$assert(topic, 'topic cannot be null');
|
$assert(topic, 'topic cannot be null');
|
||||||
$assert(position, 'position cannot be null');
|
$assert(position, 'position cannot be null');
|
||||||
EventBus.instance.fireEvent(EventBus.events.NodeMoveEvent, {
|
EventBus.instance.fireEvent(EventBus.events.NodeMoveEvent, {
|
||||||
node: topic.getModel(),
|
node: topic.getModel(),
|
||||||
position: position,
|
position,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
export { StandaloneActionDispatcher, CommandContext };
|
export { StandaloneActionDispatcher, CommandContext };
|
||||||
|
@ -12,70 +12,66 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const web2D = require('@wismapping/web2d')
|
const web2D = require('@wismapping/web2d');
|
||||||
const web2d = web2D()
|
|
||||||
|
|
||||||
const ActionDispatcher = require('./ActionDispatcher').default
|
const web2d = web2D();
|
||||||
|
|
||||||
//FIXME: Not used!
|
const ActionDispatcher = require('./ActionDispatcher').default;
|
||||||
|
|
||||||
|
// FIXME: Not used!
|
||||||
const TextEditor = new Class({
|
const TextEditor = new Class({
|
||||||
initialize: function (topic) {
|
initialize(topic) {
|
||||||
this._topic = topic;
|
this._topic = topic;
|
||||||
},
|
},
|
||||||
|
|
||||||
_buildEditor: function () {
|
_buildEditor() {
|
||||||
|
this._size = { width: 500, height: 100 };
|
||||||
this._size = {width: 500, height: 100};
|
const result = new Element('div');
|
||||||
var result = new Element('div');
|
|
||||||
result.setStyles({
|
result.setStyles({
|
||||||
position: "absolute",
|
position: 'absolute',
|
||||||
display: "none",
|
display: 'none',
|
||||||
zIndex: "8",
|
zIndex: '8',
|
||||||
width: "500px",
|
width: '500px',
|
||||||
height: "100px"
|
height: '100px',
|
||||||
}
|
});
|
||||||
);
|
|
||||||
|
|
||||||
|
const inputContainer = new Element('div');
|
||||||
var inputContainer = new Element('div');
|
|
||||||
inputContainer.setStyles({
|
inputContainer.setStyles({
|
||||||
border: "none",
|
border: 'none',
|
||||||
overflow: "auto"
|
overflow: 'auto',
|
||||||
});
|
});
|
||||||
inputContainer.inject(result);
|
inputContainer.inject(result);
|
||||||
|
|
||||||
var inputText = new Element('input',
|
const inputText = new Element('input',
|
||||||
{
|
{
|
||||||
type: "text",
|
type: 'text',
|
||||||
tabindex: '-1',
|
tabindex: '-1',
|
||||||
value: ""
|
value: '',
|
||||||
}
|
});
|
||||||
);
|
|
||||||
inputText.setStyles({
|
inputText.setStyles({
|
||||||
border: "none",
|
border: 'none',
|
||||||
background: "transparent"
|
background: 'transparent',
|
||||||
});
|
});
|
||||||
inputText.inject(inputContainer);
|
inputText.inject(inputContainer);
|
||||||
|
|
||||||
var spanContainer = new Element('div');
|
const spanContainer = new Element('div');
|
||||||
spanContainer.setStyle('visibility', "hidden");
|
spanContainer.setStyle('visibility', 'hidden');
|
||||||
spanContainer.inject(result);
|
spanContainer.inject(result);
|
||||||
|
|
||||||
var spanElem = new Element('span', {tabindex: "-1"});
|
const spanElem = new Element('span', { tabindex: '-1' });
|
||||||
spanElem.setStyle('white-space', "nowrap");
|
spanElem.setStyle('white-space', 'nowrap');
|
||||||
spanElem.setStyle('nowrap', 'nowrap');
|
spanElem.setStyle('nowrap', 'nowrap');
|
||||||
spanElem.inject(spanContainer);
|
spanElem.inject(spanContainer);
|
||||||
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
_registerEvents: function (divElem) {
|
_registerEvents(divElem) {
|
||||||
var inputElem = this._getTextareaElem();
|
const inputElem = this._getTextareaElem();
|
||||||
var spanElem = this._getSpanElem();
|
const spanElem = this._getSpanElem();
|
||||||
var me = this;
|
const me = this;
|
||||||
|
|
||||||
divElem.addEvent('keydown', function (event) {
|
divElem.addEvent('keydown', (event) => {
|
||||||
switch (event.key) {
|
switch (event.key) {
|
||||||
case 'esc':
|
case 'esc':
|
||||||
me.close(false);
|
me.close(false);
|
||||||
@ -88,7 +84,7 @@ const TextEditor = new Class({
|
|||||||
var size = inputElem.value.length + 1;
|
var size = inputElem.value.length + 1;
|
||||||
inputElem.size = size;
|
inputElem.size = size;
|
||||||
if (spanElem.offsetWidth > (parseInt(divElem.style.width) - 100)) {
|
if (spanElem.offsetWidth > (parseInt(divElem.style.width) - 100)) {
|
||||||
divElem.style.width = (spanElem.offsetWidth + 100) + "px";
|
divElem.style.width = `${spanElem.offsetWidth + 100}px`;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -96,37 +92,35 @@ const TextEditor = new Class({
|
|||||||
});
|
});
|
||||||
|
|
||||||
// If the user clicks on the input, all event must be ignored ...
|
// If the user clicks on the input, all event must be ignored ...
|
||||||
divElem.addEvent('click', function (event) {
|
divElem.addEvent('click', (event) => {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
});
|
});
|
||||||
divElem.addEvent('dblclick', function (event) {
|
divElem.addEvent('dblclick', (event) => {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
});
|
});
|
||||||
divElem.addEvent('mousedown', function (event) {
|
divElem.addEvent('mousedown', (event) => {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
isVisible: function () {
|
isVisible() {
|
||||||
return $defined(this._containerElem) && this._containerElem.getStyle('display') == 'block';
|
return $defined(this._containerElem) && this._containerElem.getStyle('display') == 'block';
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateModel: function () {
|
_updateModel() {
|
||||||
|
|
||||||
if (this._topic.getText() != this._getText()) {
|
if (this._topic.getText() != this._getText()) {
|
||||||
var text = this._getText();
|
const text = this._getText();
|
||||||
var topicId = this._topic.getId();
|
const topicId = this._topic.getId();
|
||||||
|
|
||||||
var actionDispatcher = ActionDispatcher.getInstance();
|
const actionDispatcher = ActionDispatcher.getInstance();
|
||||||
actionDispatcher.changeTextToTopic([topicId], text);
|
actionDispatcher.changeTextToTopic([topicId], text);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
show: function (text) {
|
show(text) {
|
||||||
|
|
||||||
if (!this.isVisible()) {
|
if (!this.isVisible()) {
|
||||||
//Create editor ui
|
// Create editor ui
|
||||||
var editorElem = this._buildEditor();
|
const editorElem = this._buildEditor();
|
||||||
editorElem.inject($(document.body)[0]);
|
editorElem.inject($(document.body)[0]);
|
||||||
|
|
||||||
this._containerElem = editorElem;
|
this._containerElem = editorElem;
|
||||||
@ -135,62 +129,60 @@ const TextEditor = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_showEditor: function (defaultText) {
|
_showEditor(defaultText) {
|
||||||
|
const topic = this._topic;
|
||||||
var topic = this._topic;
|
|
||||||
|
|
||||||
// Hide topic text ...
|
// Hide topic text ...
|
||||||
topic.getTextShape().setVisibility(false);
|
topic.getTextShape().setVisibility(false);
|
||||||
|
|
||||||
// Set Editor Style
|
// Set Editor Style
|
||||||
var nodeText = topic.getTextShape();
|
const nodeText = topic.getTextShape();
|
||||||
var font = nodeText.getFont();
|
const font = nodeText.getFont();
|
||||||
font.size = nodeText.getHtmlFontSize();
|
font.size = nodeText.getHtmlFontSize();
|
||||||
font.color = nodeText.getColor();
|
font.color = nodeText.getColor();
|
||||||
this._setStyle(font);
|
this._setStyle(font);
|
||||||
|
|
||||||
// Set editor's initial text
|
// Set editor's initial text
|
||||||
var text = $defined(defaultText) ? defaultText : topic.getText();
|
const text = $defined(defaultText) ? defaultText : topic.getText();
|
||||||
this._setText(text);
|
this._setText(text);
|
||||||
|
|
||||||
var me = this;
|
const me = this;
|
||||||
// Set editor's initial size
|
// Set editor's initial size
|
||||||
var displayFunc = function () {
|
const displayFunc = function () {
|
||||||
// Position the editor and set the size...
|
// Position the editor and set the size...
|
||||||
var textShape = me._topic.getTextShape();
|
const textShape = me._topic.getTextShape();
|
||||||
|
|
||||||
me._containerElem.css('display', 'block');
|
me._containerElem.css('display', 'block');
|
||||||
|
|
||||||
me._containerElem.offset(textShape.getNativePosition());
|
me._containerElem.offset(textShape.getNativePosition());
|
||||||
// Set size ...
|
// Set size ...
|
||||||
var elemSize = topic.getSize();
|
const elemSize = topic.getSize();
|
||||||
me._setEditorSize(elemSize.width, elemSize.height);
|
me._setEditorSize(elemSize.width, elemSize.height);
|
||||||
|
|
||||||
var textareaElem = me._getTextareaElem();
|
const textareaElem = me._getTextareaElem();
|
||||||
textareaElem.focus();
|
textareaElem.focus();
|
||||||
me._positionCursor(textareaElem, !$defined(defaultText));
|
me._positionCursor(textareaElem, !$defined(defaultText));
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
displayFunc.delay(10);
|
displayFunc.delay(10);
|
||||||
},
|
},
|
||||||
|
|
||||||
_setStyle: function (fontStyle) {
|
_setStyle(fontStyle) {
|
||||||
var inputField = this._getTextareaElem();
|
const inputField = this._getTextareaElem();
|
||||||
var spanField = this._getSpanElem();
|
const spanField = this._getSpanElem();
|
||||||
if (!$defined(fontStyle.font)) {
|
if (!$defined(fontStyle.font)) {
|
||||||
fontStyle.font = "Arial";
|
fontStyle.font = 'Arial';
|
||||||
}
|
}
|
||||||
if (!$defined(fontStyle.style)) {
|
if (!$defined(fontStyle.style)) {
|
||||||
fontStyle.style = "normal";
|
fontStyle.style = 'normal';
|
||||||
}
|
}
|
||||||
if (!$defined(fontStyle.weight)) {
|
if (!$defined(fontStyle.weight)) {
|
||||||
fontStyle.weight = "normal";
|
fontStyle.weight = 'normal';
|
||||||
}
|
}
|
||||||
if (!$defined(fontStyle.size)) {
|
if (!$defined(fontStyle.size)) {
|
||||||
fontStyle.size = 12;
|
fontStyle.size = 12;
|
||||||
}
|
}
|
||||||
inputField.style.fontSize = fontStyle.size + "px";
|
inputField.style.fontSize = `${fontStyle.size}px`;
|
||||||
inputField.style.fontFamily = fontStyle.font;
|
inputField.style.fontFamily = fontStyle.font;
|
||||||
inputField.style.fontStyle = fontStyle.style;
|
inputField.style.fontStyle = fontStyle.style;
|
||||||
inputField.style.fontWeight = fontStyle.weight;
|
inputField.style.fontWeight = fontStyle.weight;
|
||||||
@ -198,59 +190,57 @@ const TextEditor = new Class({
|
|||||||
spanField.style.fontFamily = fontStyle.font;
|
spanField.style.fontFamily = fontStyle.font;
|
||||||
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: function (text) {
|
_setText(text) {
|
||||||
var inputField = this._getTextareaElem();
|
const inputField = this._getTextareaElem();
|
||||||
inputField.size = text.length + 1;
|
inputField.size = text.length + 1;
|
||||||
this._containerElem.style.width = (inputField.size * parseInt(inputField.style.fontSize) + 100) + "px";
|
this._containerElem.style.width = `${inputField.size * parseInt(inputField.style.fontSize) + 100}px`;
|
||||||
var spanField = this._getSpanElem();
|
const spanField = this._getSpanElem();
|
||||||
spanField.innerHTML = text;
|
spanField.innerHTML = text;
|
||||||
inputField.value = text;
|
inputField.value = text;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getText: function () {
|
_getText() {
|
||||||
return this._getTextareaElem().value;
|
return this._getTextareaElem().value;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getTextareaElem: function () {
|
_getTextareaElem() {
|
||||||
return this._containerElem.getElement('input');
|
return this._containerElem.getElement('input');
|
||||||
},
|
},
|
||||||
|
|
||||||
_getSpanElem: function () {
|
_getSpanElem() {
|
||||||
return this._containerElem.getElement('span');
|
return this._containerElem.getElement('span');
|
||||||
},
|
},
|
||||||
|
|
||||||
_setEditorSize: function (width, height) {
|
_setEditorSize(width, height) {
|
||||||
var textShape = this._topic.getTextShape();
|
const textShape = this._topic.getTextShape();
|
||||||
var scale = web2d.utils.TransformUtil.workoutScale(textShape._peer);
|
const scale = web2d.utils.TransformUtil.workoutScale(textShape._peer);
|
||||||
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: function (inputElem, selectText) {
|
_positionCursor(inputElem, selectText) {
|
||||||
// Select text if it's required ...
|
// Select text if it's required ...
|
||||||
if (inputElem.createTextRange) //ie
|
if (inputElem.createTextRange) // ie
|
||||||
{
|
{
|
||||||
var range = inputElem.createTextRange();
|
const range = inputElem.createTextRange();
|
||||||
var pos = inputElem.value.length;
|
const pos = inputElem.value.length;
|
||||||
if (!selectText) {
|
if (!selectText) {
|
||||||
range.select();
|
range.select();
|
||||||
range.move("character", pos);
|
range.move('character', pos);
|
||||||
}
|
} else {
|
||||||
else {
|
range.move('character', pos);
|
||||||
range.move("character", pos);
|
|
||||||
range.select();
|
range.select();
|
||||||
}
|
}
|
||||||
}
|
} else if (!selectText) {
|
||||||
else if (!selectText) {
|
|
||||||
inputElem.setSelectionRange(0, inputElem.value.length);
|
inputElem.setSelectionRange(0, inputElem.value.length);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
close: function (update) {
|
close(update) {
|
||||||
if (this.isVisible()) {
|
if (this.isVisible()) {
|
||||||
// Update changes ...
|
// Update changes ...
|
||||||
if (!$defined(update) || update) {
|
if (!$defined(update) || update) {
|
||||||
@ -264,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;
|
||||||
|
@ -20,7 +20,7 @@ const TextEditor = require('./TextEditor').default;
|
|||||||
const TextEditorFactory = {};
|
const TextEditorFactory = {};
|
||||||
|
|
||||||
TextEditorFactory.getTextEditorFromName = function (name) {
|
TextEditorFactory.getTextEditorFromName = function (name) {
|
||||||
var editorClass = null;
|
let editorClass = null;
|
||||||
if (name == 'RichTextEditor') {
|
if (name == 'RichTextEditor') {
|
||||||
editorClass = RichTextEditor;
|
editorClass = RichTextEditor;
|
||||||
} else {
|
} else {
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -24,33 +24,33 @@ const TopicEventDispatcher = new Class({
|
|||||||
Static: {
|
Static: {
|
||||||
_instance: null,
|
_instance: null,
|
||||||
|
|
||||||
configure: function (readOnly) {
|
configure(readOnly) {
|
||||||
this._instance = new TopicEventDispatcher(readOnly);
|
this._instance = new TopicEventDispatcher(readOnly);
|
||||||
},
|
},
|
||||||
|
|
||||||
getInstance: function () {
|
getInstance() {
|
||||||
return this._instance;
|
return this._instance;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
initialize: function (readOnly) {
|
initialize(readOnly) {
|
||||||
this._readOnly = readOnly;
|
this._readOnly = readOnly;
|
||||||
this._activeEditor = null;
|
this._activeEditor = null;
|
||||||
this._multilineEditor = new MultilineTextEditor();
|
this._multilineEditor = new MultilineTextEditor();
|
||||||
},
|
},
|
||||||
|
|
||||||
close: function (update) {
|
close(update) {
|
||||||
if (this.isVisible()) {
|
if (this.isVisible()) {
|
||||||
this._activeEditor.close(update);
|
this._activeEditor.close(update);
|
||||||
this._activeEditor = null;
|
this._activeEditor = null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
show: function (topic, options) {
|
show(topic, options) {
|
||||||
this.process(TopicEvent.EDIT, topic, options);
|
this.process(TopicEvent.EDIT, topic, options);
|
||||||
},
|
},
|
||||||
|
|
||||||
process: function (eventType, topic, options) {
|
process(eventType, topic, options) {
|
||||||
$assert(eventType, 'eventType can not be null');
|
$assert(eventType, 'eventType can not be null');
|
||||||
|
|
||||||
// Close all previous open editor ....
|
// Close all previous open editor ....
|
||||||
@ -59,20 +59,20 @@ const TopicEventDispatcher = new Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Open the new editor ...
|
// Open the new editor ...
|
||||||
var 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: model, readOnly: this._readOnly });
|
this.fireEvent(eventType, { model, readOnly: this._readOnly });
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
isVisible: function () {
|
isVisible() {
|
||||||
return this._activeEditor != null && this._activeEditor.isVisible();
|
return this._activeEditor != null && this._activeEditor.isVisible();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -29,31 +29,29 @@ const TopicFeature = {
|
|||||||
Icon: {
|
Icon: {
|
||||||
id: IconModel.FEATURE_TYPE,
|
id: IconModel.FEATURE_TYPE,
|
||||||
model: IconModel,
|
model: IconModel,
|
||||||
icon: ImageIcon
|
icon: ImageIcon,
|
||||||
},
|
},
|
||||||
|
|
||||||
/** the link object */
|
/** the link object */
|
||||||
Link: {
|
Link: {
|
||||||
id: LinkModel.FEATURE_TYPE,
|
id: LinkModel.FEATURE_TYPE,
|
||||||
model: LinkModel,
|
model: LinkModel,
|
||||||
icon: LinkIcon
|
icon: LinkIcon,
|
||||||
},
|
},
|
||||||
|
|
||||||
/** the note object */
|
/** the note object */
|
||||||
Note: {
|
Note: {
|
||||||
id: NoteModel.FEATURE_TYPE,
|
id: NoteModel.FEATURE_TYPE,
|
||||||
model: NoteModel,
|
model: NoteModel,
|
||||||
icon: NoteIcon
|
icon: NoteIcon,
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param id the feature metadata id
|
* @param id the feature metadata id
|
||||||
* @return {Boolean} returns true if the given id is contained in the metadata array
|
* @return {Boolean} returns true if the given id is contained in the metadata array
|
||||||
*/
|
*/
|
||||||
isSupported: function (id) {
|
isSupported(id) {
|
||||||
return TopicFeature._featuresMetadataById.some(function (elem) {
|
return TopicFeature._featuresMetadataById.some((elem) => elem.id == id);
|
||||||
return elem.id == id;
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -64,13 +62,11 @@ const TopicFeature = {
|
|||||||
* @return {mindplot.model.FeatureModel} a new instance of the feature model subclass matching
|
* @return {mindplot.model.FeatureModel} a new instance of the feature model subclass matching
|
||||||
* the topic feature
|
* the topic feature
|
||||||
*/
|
*/
|
||||||
createModel: function (type, attributes) {
|
createModel(type, attributes) {
|
||||||
$assert(type, 'type can not be null');
|
$assert(type, 'type can not be null');
|
||||||
$assert(attributes, 'attributes can not be null');
|
$assert(attributes, 'attributes can not be null');
|
||||||
|
|
||||||
var model = TopicFeature._featuresMetadataById.filter(function (elem) {
|
const { model } = TopicFeature._featuresMetadataById.filter((elem) => elem.id == type)[0];
|
||||||
return elem.id == type;
|
|
||||||
})[0].model;
|
|
||||||
return new model(attributes);
|
return new model(attributes);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -82,15 +78,13 @@ const TopicFeature = {
|
|||||||
* @throws will throw an error if model is null or undefined
|
* @throws will throw an error if model is null or undefined
|
||||||
* @return {mindplot.Icon} a new instance of the icon subclass matching the topic feature
|
* @return {mindplot.Icon} a new instance of the icon subclass matching the topic feature
|
||||||
*/
|
*/
|
||||||
createIcon: function (topic, model, readOnly) {
|
createIcon(topic, model, readOnly) {
|
||||||
$assert(topic, 'topic can not be null');
|
$assert(topic, 'topic can not be null');
|
||||||
$assert(model, 'model can not be null');
|
$assert(model, 'model can not be null');
|
||||||
|
|
||||||
var icon = TopicFeature._featuresMetadataById.filter(function (elem) {
|
const { icon } = TopicFeature._featuresMetadataById.filter((elem) => elem.id == model.getType())[0];
|
||||||
return elem.id == model.getType();
|
|
||||||
})[0].icon;
|
|
||||||
return new icon(topic, model, readOnly);
|
return new icon(topic, model, readOnly);
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
TopicFeature._featuresMetadataById = [TopicFeature.Icon, TopicFeature.Link, TopicFeature.Note];
|
TopicFeature._featuresMetadataById = [TopicFeature.Icon, TopicFeature.Link, TopicFeature.Note];
|
||||||
|
@ -19,14 +19,14 @@ const { TopicShape } = require('./model/INodeModel');
|
|||||||
|
|
||||||
const TopicStyle = new Class({
|
const TopicStyle = new Class({
|
||||||
Static: {
|
Static: {
|
||||||
_getStyles: function (topic) {
|
_getStyles(topic) {
|
||||||
$assert(topic, 'topic can not be null');
|
$assert(topic, 'topic can not be null');
|
||||||
|
|
||||||
var result;
|
let result;
|
||||||
if (topic.isCentralTopic()) {
|
if (topic.isCentralTopic()) {
|
||||||
result = TopicStyle.STYLES.CENTRAL_TOPIC;
|
result = TopicStyle.STYLES.CENTRAL_TOPIC;
|
||||||
} else {
|
} else {
|
||||||
var targetTopic = topic.getOutgoingConnectedTopic();
|
const targetTopic = topic.getOutgoingConnectedTopic();
|
||||||
if ($defined(targetTopic)) {
|
if ($defined(targetTopic)) {
|
||||||
if (targetTopic.isCentralTopic()) {
|
if (targetTopic.isCentralTopic()) {
|
||||||
result = TopicStyle.STYLES.MAIN_TOPIC;
|
result = TopicStyle.STYLES.MAIN_TOPIC;
|
||||||
@ -40,28 +40,28 @@ const TopicStyle = new Class({
|
|||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
defaultText: function (topic) {
|
defaultText(topic) {
|
||||||
var msgKey = this._getStyles(topic).msgKey;
|
const { msgKey } = this._getStyles(topic);
|
||||||
return $msg(msgKey);
|
return $msg(msgKey);
|
||||||
},
|
},
|
||||||
|
|
||||||
defaultFontStyle: function (topic) {
|
defaultFontStyle(topic) {
|
||||||
return this._getStyles(topic).fontStyle;
|
return this._getStyles(topic).fontStyle;
|
||||||
},
|
},
|
||||||
|
|
||||||
defaultBackgroundColor: function (topic) {
|
defaultBackgroundColor(topic) {
|
||||||
return this._getStyles(topic).backgroundColor;
|
return this._getStyles(topic).backgroundColor;
|
||||||
},
|
},
|
||||||
|
|
||||||
defaultBorderColor: function (topic) {
|
defaultBorderColor(topic) {
|
||||||
return this._getStyles(topic).borderColor;
|
return this._getStyles(topic).borderColor;
|
||||||
},
|
},
|
||||||
|
|
||||||
getInnerPadding: function (topic) {
|
getInnerPadding(topic) {
|
||||||
return this._getStyles(topic).innerPadding;
|
return this._getStyles(topic).innerPadding;
|
||||||
},
|
},
|
||||||
|
|
||||||
defaultShapeType: function (topic) {
|
defaultShapeType(topic) {
|
||||||
return this._getStyles(topic).shapeType;
|
return this._getStyles(topic).shapeType;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -15,11 +15,12 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const web2D = require('@wismapping/web2d')
|
const web2D = require('@wismapping/web2d');
|
||||||
|
|
||||||
const web2d = web2D();
|
const web2d = web2D();
|
||||||
|
|
||||||
const Workspace = new Class({
|
const Workspace = new Class({
|
||||||
initialize: function (screenManager, zoom) {
|
initialize(screenManager, zoom) {
|
||||||
// Create a suitable container ...
|
// Create a suitable container ...
|
||||||
$assert(screenManager, 'Div container can not be null');
|
$assert(screenManager, 'Div container can not be null');
|
||||||
$assert(zoom, 'zoom container can not be null');
|
$assert(zoom, 'zoom container can not be null');
|
||||||
@ -27,12 +28,12 @@ const Workspace = new Class({
|
|||||||
this._zoom = zoom;
|
this._zoom = zoom;
|
||||||
this._screenManager = screenManager;
|
this._screenManager = screenManager;
|
||||||
|
|
||||||
var divContainer = screenManager.getContainer();
|
const divContainer = screenManager.getContainer();
|
||||||
this._screenWidth = parseInt(divContainer.css('width'));
|
this._screenWidth = parseInt(divContainer.css('width'));
|
||||||
this._screenHeight = parseInt(divContainer.css('height'));
|
this._screenHeight = parseInt(divContainer.css('height'));
|
||||||
|
|
||||||
// Initialize web2d workspace.
|
// Initialize web2d workspace.
|
||||||
var workspace = this._createWorkspace();
|
const workspace = this._createWorkspace();
|
||||||
this._workspace = workspace;
|
this._workspace = workspace;
|
||||||
|
|
||||||
// Append to the workspace...
|
// Append to the workspace...
|
||||||
@ -44,26 +45,26 @@ const Workspace = new Class({
|
|||||||
this._eventsEnabled = true;
|
this._eventsEnabled = true;
|
||||||
},
|
},
|
||||||
|
|
||||||
_createWorkspace: function () {
|
_createWorkspace() {
|
||||||
// Initialize workspace ...
|
// Initialize workspace ...
|
||||||
var coordOriginX = -(this._screenWidth / 2);
|
const coordOriginX = -(this._screenWidth / 2);
|
||||||
var coordOriginY = -(this._screenHeight / 2);
|
const coordOriginY = -(this._screenHeight / 2);
|
||||||
|
|
||||||
var workspaceProfile = {
|
const workspaceProfile = {
|
||||||
width: this._screenWidth + "px",
|
width: `${this._screenWidth}px`,
|
||||||
height: this._screenHeight + "px",
|
height: `${this._screenHeight}px`,
|
||||||
coordSizeWidth: this._screenWidth,
|
coordSizeWidth: this._screenWidth,
|
||||||
coordSizeHeight: this._screenHeight,
|
coordSizeHeight: this._screenHeight,
|
||||||
coordOriginX: coordOriginX,
|
coordOriginX,
|
||||||
coordOriginY: coordOriginY,
|
coordOriginY,
|
||||||
fillColor: 'transparent',
|
fillColor: 'transparent',
|
||||||
strokeWidth: 0
|
strokeWidth: 0,
|
||||||
};
|
};
|
||||||
web2d.Toolkit.init();
|
web2d.Toolkit.init();
|
||||||
return new web2d.Workspace(workspaceProfile);
|
return new web2d.Workspace(workspaceProfile);
|
||||||
},
|
},
|
||||||
|
|
||||||
append: function (shape) {
|
append(shape) {
|
||||||
if ($defined(shape.addToWorkspace)) {
|
if ($defined(shape.addToWorkspace)) {
|
||||||
shape.addToWorkspace(this);
|
shape.addToWorkspace(this);
|
||||||
} else {
|
} else {
|
||||||
@ -71,7 +72,7 @@ const Workspace = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
removeChild: function (shape) {
|
removeChild(shape) {
|
||||||
// Element is a node, not a web2d element?
|
// Element is a node, not a web2d element?
|
||||||
if ($defined(shape.removeFromWorkspace)) {
|
if ($defined(shape.removeFromWorkspace)) {
|
||||||
shape.removeFromWorkspace(this);
|
shape.removeFromWorkspace(this);
|
||||||
@ -80,27 +81,27 @@ const Workspace = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
addEvent: function (type, listener) {
|
addEvent(type, listener) {
|
||||||
this._workspace.addEvent(type, listener);
|
this._workspace.addEvent(type, listener);
|
||||||
},
|
},
|
||||||
|
|
||||||
removeEvent: function (type, listener) {
|
removeEvent(type, listener) {
|
||||||
$assert(type, 'type can not be null');
|
$assert(type, 'type can not be null');
|
||||||
$assert(listener, 'listener can not be null');
|
$assert(listener, 'listener can not be null');
|
||||||
this._workspace.removeEvent(type, listener);
|
this._workspace.removeEvent(type, listener);
|
||||||
},
|
},
|
||||||
|
|
||||||
getSize: function () {
|
getSize() {
|
||||||
return this._workspace.getCoordSize();
|
return this._workspace.getCoordSize();
|
||||||
},
|
},
|
||||||
|
|
||||||
setZoom: function (zoom, center) {
|
setZoom(zoom, center) {
|
||||||
this._zoom = zoom;
|
this._zoom = zoom;
|
||||||
var workspace = this._workspace;
|
const workspace = this._workspace;
|
||||||
|
|
||||||
// Update coord scale...
|
// Update coord scale...
|
||||||
var coordWidth = zoom * this._screenWidth;
|
const coordWidth = zoom * this._screenWidth;
|
||||||
var coordHeight = zoom * this._screenHeight;
|
const coordHeight = zoom * this._screenHeight;
|
||||||
workspace.setCoordSize(coordWidth, coordHeight);
|
workspace.setCoordSize(coordWidth, coordHeight);
|
||||||
|
|
||||||
// View port coords ...
|
// View port coords ...
|
||||||
@ -110,8 +111,8 @@ const Workspace = new Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Center topic....
|
// Center topic....
|
||||||
var coordOriginX;
|
let coordOriginX;
|
||||||
var coordOriginY;
|
let coordOriginY;
|
||||||
|
|
||||||
if (center) {
|
if (center) {
|
||||||
if (this._viewPort) {
|
if (this._viewPort) {
|
||||||
@ -122,7 +123,7 @@ const Workspace = new Class({
|
|||||||
coordOriginY = -(coordHeight / 2);
|
coordOriginY = -(coordHeight / 2);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var coordOrigin = workspace.getCoordOrigin();
|
const coordOrigin = workspace.getCoordOrigin();
|
||||||
coordOriginX = coordOrigin.x;
|
coordOriginX = coordOrigin.x;
|
||||||
coordOriginY = coordOrigin.y;
|
coordOriginY = coordOrigin.y;
|
||||||
}
|
}
|
||||||
@ -137,66 +138,62 @@ const Workspace = new Class({
|
|||||||
this._screenManager.fireEvent('update');
|
this._screenManager.fireEvent('update');
|
||||||
},
|
},
|
||||||
|
|
||||||
getScreenManager: function () {
|
getScreenManager() {
|
||||||
return this._screenManager;
|
return this._screenManager;
|
||||||
},
|
},
|
||||||
|
|
||||||
enableWorkspaceEvents: function (value) {
|
enableWorkspaceEvents(value) {
|
||||||
this._eventsEnabled = value;
|
this._eventsEnabled = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
isWorkspaceEventsEnabled: function () {
|
isWorkspaceEventsEnabled() {
|
||||||
return this._eventsEnabled;
|
return this._eventsEnabled;
|
||||||
},
|
},
|
||||||
|
|
||||||
dumpNativeChart: function () {
|
dumpNativeChart() {
|
||||||
return this._workspace.dumpNativeChart();
|
return this._workspace.dumpNativeChart();
|
||||||
},
|
},
|
||||||
|
|
||||||
_registerDragEvents: function () {
|
_registerDragEvents() {
|
||||||
var workspace = this._workspace;
|
const workspace = this._workspace;
|
||||||
var screenManager = this._screenManager;
|
const screenManager = this._screenManager;
|
||||||
var mWorkspace = this;
|
const mWorkspace = this;
|
||||||
var mouseDownListener = function (event) {
|
const mouseDownListener = function (event) {
|
||||||
if (!$defined(workspace._mouseMoveListener)) {
|
if (!$defined(workspace._mouseMoveListener)) {
|
||||||
if (mWorkspace.isWorkspaceEventsEnabled()) {
|
if (mWorkspace.isWorkspaceEventsEnabled()) {
|
||||||
mWorkspace.enableWorkspaceEvents(false);
|
mWorkspace.enableWorkspaceEvents(false);
|
||||||
|
|
||||||
var mouseDownPosition = screenManager.getWorkspaceMousePosition(event);
|
const mouseDownPosition = screenManager.getWorkspaceMousePosition(event);
|
||||||
var originalCoordOrigin = workspace.getCoordOrigin();
|
const originalCoordOrigin = workspace.getCoordOrigin();
|
||||||
|
|
||||||
var wasDragged = false;
|
let wasDragged = false;
|
||||||
workspace._mouseMoveListener = function (event) {
|
workspace._mouseMoveListener = function (event) {
|
||||||
|
const currentMousePosition = screenManager.getWorkspaceMousePosition(event);
|
||||||
|
|
||||||
var currentMousePosition = screenManager.getWorkspaceMousePosition(event);
|
const offsetX = currentMousePosition.x - mouseDownPosition.x;
|
||||||
|
const coordOriginX = -offsetX + originalCoordOrigin.x;
|
||||||
|
|
||||||
var offsetX = currentMousePosition.x - mouseDownPosition.x;
|
const offsetY = currentMousePosition.y - mouseDownPosition.y;
|
||||||
var coordOriginX = -offsetX + originalCoordOrigin.x;
|
const coordOriginY = -offsetY + originalCoordOrigin.y;
|
||||||
|
|
||||||
var offsetY = currentMousePosition.y - mouseDownPosition.y;
|
|
||||||
var coordOriginY = -offsetY + originalCoordOrigin.y;
|
|
||||||
|
|
||||||
workspace.setCoordOrigin(coordOriginX, coordOriginY);
|
workspace.setCoordOrigin(coordOriginX, coordOriginY);
|
||||||
|
|
||||||
// Change cursor.
|
// Change cursor.
|
||||||
if (Browser.firefox) {
|
if (Browser.firefox) {
|
||||||
window.document.body.style.cursor = "-moz-grabbing";
|
window.document.body.style.cursor = '-moz-grabbing';
|
||||||
} else {
|
} else {
|
||||||
window.document.body.style.cursor = "move";
|
window.document.body.style.cursor = 'move';
|
||||||
}
|
}
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|
||||||
// Fire drag event ...
|
// Fire drag event ...
|
||||||
screenManager.fireEvent('update');
|
screenManager.fireEvent('update');
|
||||||
wasDragged = true;
|
wasDragged = true;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
screenManager.addEvent('mousemove', workspace._mouseMoveListener);
|
screenManager.addEvent('mousemove', workspace._mouseMoveListener);
|
||||||
|
|
||||||
// Register mouse up listeners ...
|
// Register mouse up listeners ...
|
||||||
workspace._mouseUpListener = function (event) {
|
workspace._mouseUpListener = function (event) {
|
||||||
|
|
||||||
screenManager.removeEvent('mousemove', workspace._mouseMoveListener);
|
screenManager.removeEvent('mousemove', workspace._mouseMoveListener);
|
||||||
screenManager.removeEvent('mouseup', workspace._mouseUpListener);
|
screenManager.removeEvent('mouseup', workspace._mouseUpListener);
|
||||||
workspace._mouseUpListener = null;
|
workspace._mouseUpListener = null;
|
||||||
@ -204,7 +201,7 @@ const Workspace = new Class({
|
|||||||
window.document.body.style.cursor = 'default';
|
window.document.body.style.cursor = 'default';
|
||||||
|
|
||||||
// Update screen manager offset.
|
// Update screen manager offset.
|
||||||
var coordOrigin = workspace.getCoordOrigin();
|
const coordOrigin = workspace.getCoordOrigin();
|
||||||
screenManager.setOffset(coordOrigin.x, coordOrigin.y);
|
screenManager.setOffset(coordOrigin.x, coordOrigin.y);
|
||||||
mWorkspace.enableWorkspaceEvents(true);
|
mWorkspace.enableWorkspaceEvents(true);
|
||||||
|
|
||||||
@ -221,9 +218,9 @@ const Workspace = new Class({
|
|||||||
screenManager.addEvent('mousedown', mouseDownListener);
|
screenManager.addEvent('mousedown', mouseDownListener);
|
||||||
},
|
},
|
||||||
|
|
||||||
setViewPort: function (size) {
|
setViewPort(size) {
|
||||||
this._viewPort = size;
|
this._viewPort = size;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default Workspace;
|
export default Workspace;
|
||||||
|
@ -29,8 +29,7 @@ const AddFeatureToTopicCommand = new Class(/** @lends AddFeatureToTopicCommand *
|
|||||||
* @extends mindplot.Command
|
* @extends mindplot.Command
|
||||||
* @see mindplot.model.FeatureModel and subclasses
|
* @see mindplot.model.FeatureModel and subclasses
|
||||||
*/
|
*/
|
||||||
initialize:function (topicId, featureType, attributes) {
|
initialize(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');
|
||||||
@ -45,12 +44,12 @@ const AddFeatureToTopicCommand = new Class(/** @lends AddFeatureToTopicCommand *
|
|||||||
/**
|
/**
|
||||||
* Overrides abstract parent method
|
* Overrides abstract parent method
|
||||||
*/
|
*/
|
||||||
execute:function (commandContext) {
|
execute(commandContext) {
|
||||||
var 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) {
|
||||||
var 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);
|
||||||
@ -60,10 +59,10 @@ const AddFeatureToTopicCommand = new Class(/** @lends AddFeatureToTopicCommand *
|
|||||||
* Overrides abstract parent method
|
* Overrides abstract parent method
|
||||||
* @see {@link mindplot.Command.undoExecute}
|
* @see {@link mindplot.Command.undoExecute}
|
||||||
*/
|
*/
|
||||||
undoExecute:function (commandContext) {
|
undoExecute(commandContext) {
|
||||||
var 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;
|
||||||
|
@ -15,17 +15,17 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const Command = require('../Command').default
|
const Command = require('../Command').default;
|
||||||
|
|
||||||
const AddRelationshipCommand = new Class(/** @lends AddRelationshipCommand */{
|
const AddRelationshipCommand = new Class(/** @lends 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:function (model) {
|
initialize(model) {
|
||||||
$assert(model, 'Relationship model can not be null');
|
$assert(model, 'Relationship model can not be null');
|
||||||
|
|
||||||
this.parent();
|
this.parent();
|
||||||
@ -35,8 +35,8 @@ const AddRelationshipCommand = new Class(/** @lends AddRelationshipCommand */{
|
|||||||
/**
|
/**
|
||||||
* Overrides abstract parent method
|
* Overrides abstract parent method
|
||||||
*/
|
*/
|
||||||
execute:function (commandContext) {
|
execute(commandContext) {
|
||||||
var relationship = commandContext.addRelationship(this._model);
|
const relationship = commandContext.addRelationship(this._model);
|
||||||
relationship.setOnFocus(true);
|
relationship.setOnFocus(true);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -44,10 +44,10 @@ const AddRelationshipCommand = new Class(/** @lends AddRelationshipCommand */{
|
|||||||
* Overrides abstract parent method
|
* Overrides abstract parent method
|
||||||
* @see {@link mindplot.Command.undoExecute}
|
* @see {@link mindplot.Command.undoExecute}
|
||||||
*/
|
*/
|
||||||
undoExecute:function (commandContext) {
|
undoExecute(commandContext) {
|
||||||
var 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;
|
||||||
|
@ -29,11 +29,11 @@ const AddTopicCommand = new Class(
|
|||||||
* when attaching a dragged node or a node/branch from clipboard
|
* when attaching a dragged node or a node/branch from clipboard
|
||||||
* @extends mindplot.Command
|
* @extends mindplot.Command
|
||||||
*/
|
*/
|
||||||
initialize: function (models, parentTopicsId) {
|
initialize(models, parentTopicsId) {
|
||||||
$assert(models, 'models can not be null');
|
$assert(models, 'models can not be null');
|
||||||
$assert(
|
$assert(
|
||||||
parentTopicsId == null || parentTopicsId.length == models.length,
|
parentTopicsId == null || parentTopicsId.length == models.length,
|
||||||
'parents and models must have the same size'
|
'parents and models must have the same size',
|
||||||
);
|
);
|
||||||
|
|
||||||
this.parent();
|
this.parent();
|
||||||
@ -44,17 +44,17 @@ const AddTopicCommand = new Class(
|
|||||||
/**
|
/**
|
||||||
* Overrides abstract parent method
|
* Overrides abstract parent method
|
||||||
*/
|
*/
|
||||||
execute: function (commandContext) {
|
execute(commandContext) {
|
||||||
var me = this;
|
const me = this;
|
||||||
_.each(this._models, function (model, index) {
|
_.each(this._models, (model, index) => {
|
||||||
// Add a new topic ...
|
// Add a new topic ...
|
||||||
var topic = commandContext.createTopic(model);
|
const topic = commandContext.createTopic(model);
|
||||||
|
|
||||||
// Connect to topic ...
|
// Connect to topic ...
|
||||||
if (me._parentsIds) {
|
if (me._parentsIds) {
|
||||||
var parentId = me._parentsIds[index];
|
const parentId = me._parentsIds[index];
|
||||||
if ($defined(parentId)) {
|
if ($defined(parentId)) {
|
||||||
var parentTopic = commandContext.findTopics(parentId)[0];
|
const parentTopic = commandContext.findTopics(parentId)[0];
|
||||||
commandContext.connect(topic, parentTopic);
|
commandContext.connect(topic, parentTopic);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -62,7 +62,7 @@ const AddTopicCommand = new Class(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Select just created node ...
|
// Select just created node ...
|
||||||
var designer = commandContext._designer;
|
const designer = commandContext._designer;
|
||||||
designer.onObjectFocusEvent(topic);
|
designer.onObjectFocusEvent(topic);
|
||||||
topic.setOnFocus(true);
|
topic.setOnFocus(true);
|
||||||
|
|
||||||
@ -75,23 +75,23 @@ const AddTopicCommand = new Class(
|
|||||||
* Overrides abstract parent method
|
* Overrides abstract parent method
|
||||||
* @see {@link mindplot.Command.undoExecute}
|
* @see {@link mindplot.Command.undoExecute}
|
||||||
*/
|
*/
|
||||||
undoExecute: function (commandContext) {
|
undoExecute(commandContext) {
|
||||||
// Delete disconnected the nodes. Create a copy of the topics ...
|
// Delete disconnected the nodes. Create a copy of the topics ...
|
||||||
var clonedModel = [];
|
const clonedModel = [];
|
||||||
_.each(this._models, function (model) {
|
_.each(this._models, (model) => {
|
||||||
clonedModel.push(model.clone());
|
clonedModel.push(model.clone());
|
||||||
});
|
});
|
||||||
|
|
||||||
// Finally, remove the nodes ...
|
// Finally, remove the nodes ...
|
||||||
_.each(this._models, function (model) {
|
_.each(this._models, (model) => {
|
||||||
var topicId = model.getId();
|
const topicId = model.getId();
|
||||||
var 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;
|
||||||
|
@ -15,10 +15,10 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const Command = require('../Command').default
|
const Command = require('../Command').default;
|
||||||
|
|
||||||
const ChangeFeatureToTopicCommand = new Class(/** @lends ChangeFeatureToTopicCommand */{
|
const ChangeFeatureToTopicCommand = new Class(/** @lends ChangeFeatureToTopicCommand */{
|
||||||
Extends:Command,
|
Extends: Command,
|
||||||
/**
|
/**
|
||||||
* @extends mindplot.Command
|
* @extends mindplot.Command
|
||||||
* @constructs
|
* @constructs
|
||||||
@ -29,7 +29,7 @@ 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: function(topicId, featureId, attributes) {
|
initialize(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');
|
||||||
@ -43,11 +43,11 @@ const ChangeFeatureToTopicCommand = new Class(/** @lends ChangeFeatureToTopicCom
|
|||||||
/**
|
/**
|
||||||
* Overrides abstract parent method
|
* Overrides abstract parent method
|
||||||
*/
|
*/
|
||||||
execute: function(commandContext) {
|
execute(commandContext) {
|
||||||
var topic = commandContext.findTopics(this._topicId)[0];
|
const topic = commandContext.findTopics(this._topicId)[0];
|
||||||
var feature = topic.findFeatureById(this._featureId);
|
const feature = topic.findFeatureById(this._featureId);
|
||||||
|
|
||||||
var oldAttributes = feature.getAttributes();
|
const oldAttributes = feature.getAttributes();
|
||||||
feature.setAttributes(this._attributes);
|
feature.setAttributes(this._attributes);
|
||||||
this._attributes = oldAttributes;
|
this._attributes = oldAttributes;
|
||||||
},
|
},
|
||||||
@ -56,9 +56,9 @@ const ChangeFeatureToTopicCommand = new Class(/** @lends ChangeFeatureToTopicCom
|
|||||||
* Overrides abstract parent method
|
* Overrides abstract parent method
|
||||||
* @see {@link mindplot.Command.undoExecute}
|
* @see {@link mindplot.Command.undoExecute}
|
||||||
*/
|
*/
|
||||||
undoExecute: function(commandContext) {
|
undoExecute(commandContext) {
|
||||||
this.execute(commandContext);
|
this.execute(commandContext);
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default ChangeFeatureToTopicCommand;
|
export default ChangeFeatureToTopicCommand;
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
const Command = require('../Command').default;
|
const Command = require('../Command').default;
|
||||||
|
|
||||||
const DeleteCommand = new Class(/** @lends mindplot.commands.DeleteCommand */{
|
const DeleteCommand = new Class(/** @lends mindplot.commands.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,7 +26,7 @@ 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:function (topicIds, relIds) {
|
initialize(topicIds, relIds) {
|
||||||
$assert($defined(relIds), 'topicIds can not be null');
|
$assert($defined(relIds), 'topicIds can not be null');
|
||||||
|
|
||||||
this.parent();
|
this.parent();
|
||||||
@ -40,33 +40,30 @@ const DeleteCommand = new Class(/** @lends mindplot.commands.DeleteCommand */{
|
|||||||
/**
|
/**
|
||||||
* Overrides abstract parent method
|
* Overrides abstract parent method
|
||||||
*/
|
*/
|
||||||
execute:function (commandContext) {
|
execute(commandContext) {
|
||||||
|
|
||||||
// If a parent has been selected for deletion, the children must be excluded from the delete ...
|
// If a parent has been selected for deletion, the children must be excluded from the delete ...
|
||||||
var topics = this._filterChildren(this._topicIds, commandContext);
|
const topics = this._filterChildren(this._topicIds, commandContext);
|
||||||
|
|
||||||
if (topics.length > 0) {
|
if (topics.length > 0) {
|
||||||
_.each(topics, function (topic) {
|
_.each(topics, function (topic) {
|
||||||
// In case that it's editing text node, force close without update ...
|
// In case that it's editing text node, force close without update ...
|
||||||
topic.closeEditors();
|
topic.closeEditors();
|
||||||
|
|
||||||
var model = topic.getModel();
|
const model = topic.getModel();
|
||||||
|
|
||||||
// Delete relationships
|
// Delete relationships
|
||||||
var relationships = this._collectInDepthRelationships(topic);
|
const relationships = this._collectInDepthRelationships(topic);
|
||||||
this._deletedRelModel.append(relationships.map(function (rel) {
|
this._deletedRelModel.append(relationships.map((rel) => rel.getModel().clone()));
|
||||||
return rel.getModel().clone();
|
|
||||||
}));
|
|
||||||
|
|
||||||
_.each(relationships, function (relationship) {
|
_.each(relationships, (relationship) => {
|
||||||
commandContext.deleteRelationship(relationship);
|
commandContext.deleteRelationship(relationship);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Store information for undo ...
|
// Store information for undo ...
|
||||||
var clonedModel = model.clone();
|
const clonedModel = model.clone();
|
||||||
this._deletedTopicModels.push(clonedModel);
|
this._deletedTopicModels.push(clonedModel);
|
||||||
var outTopic = topic.getOutgoingConnectedTopic();
|
const outTopic = topic.getOutgoingConnectedTopic();
|
||||||
var outTopicId = null;
|
let outTopicId = null;
|
||||||
if (outTopic != null) {
|
if (outTopic != null) {
|
||||||
outTopicId = outTopic.getId();
|
outTopicId = outTopic.getId();
|
||||||
}
|
}
|
||||||
@ -74,11 +71,10 @@ const DeleteCommand = new Class(/** @lends mindplot.commands.DeleteCommand */{
|
|||||||
|
|
||||||
// Finally, delete the topic from the workspace...
|
// Finally, delete the topic from the workspace...
|
||||||
commandContext.deleteTopic(topic);
|
commandContext.deleteTopic(topic);
|
||||||
|
|
||||||
}, this);
|
}, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
var rels = commandContext.findRelationships(this._relIds);
|
const rels = commandContext.findRelationships(this._relIds);
|
||||||
if (rels.length > 0) {
|
if (rels.length > 0) {
|
||||||
_.each(rels, function (rel) {
|
_.each(rels, function (rel) {
|
||||||
this._deletedRelModel.push(rel.getModel().clone());
|
this._deletedRelModel.push(rel.getModel().clone());
|
||||||
@ -91,39 +87,38 @@ const DeleteCommand = new Class(/** @lends mindplot.commands.DeleteCommand */{
|
|||||||
* Overrides abstract parent method
|
* Overrides abstract parent method
|
||||||
* @see {@link mindplot.Command.undoExecute}
|
* @see {@link mindplot.Command.undoExecute}
|
||||||
*/
|
*/
|
||||||
undoExecute:function (commandContext) {
|
undoExecute(commandContext) {
|
||||||
|
|
||||||
// Add all the topics ...
|
// Add all the topics ...
|
||||||
_.each(this._deletedTopicModels, function (model) {
|
_.each(this._deletedTopicModels, (model) => {
|
||||||
commandContext.createTopic(model);
|
commandContext.createTopic(model);
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
// Do they need to be connected ?
|
// Do they need to be connected ?
|
||||||
_.each(this._deletedTopicModels, function (topicModel, index) {
|
_.each(this._deletedTopicModels, function (topicModel, index) {
|
||||||
var topics = commandContext.findTopics(topicModel.getId());
|
const topics = commandContext.findTopics(topicModel.getId());
|
||||||
|
|
||||||
var parentId = this._parentTopicIds[index];
|
const parentId = this._parentTopicIds[index];
|
||||||
if (parentId) {
|
if (parentId) {
|
||||||
var parentTopics = commandContext.findTopics(parentId);
|
const parentTopics = commandContext.findTopics(parentId);
|
||||||
commandContext.connect(topics[0], parentTopics[0]);
|
commandContext.connect(topics[0], parentTopics[0]);
|
||||||
}
|
}
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
// Add rebuild relationships ...
|
// Add rebuild relationships ...
|
||||||
_.each(this._deletedRelModel, function (model) {
|
_.each(this._deletedRelModel, (model) => {
|
||||||
commandContext.addRelationship(model);
|
commandContext.addRelationship(model);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Finally display the topics ...
|
// Finally display the topics ...
|
||||||
_.each(this._deletedTopicModels, function (topicModel) {
|
_.each(this._deletedTopicModels, (topicModel) => {
|
||||||
var topics = commandContext.findTopics(topicModel.getId());
|
const topics = commandContext.findTopics(topicModel.getId());
|
||||||
topics[0].setBranchVisibility(true);
|
topics[0].setBranchVisibility(true);
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
// Focus on last recovered topic ..
|
// Focus on last recovered topic ..
|
||||||
if (this._deletedTopicModels.length > 0) {
|
if (this._deletedTopicModels.length > 0) {
|
||||||
var firstTopic = this._deletedTopicModels[0];
|
const firstTopic = this._deletedTopicModels[0];
|
||||||
var topic = commandContext.findTopics(firstTopic.getId())[0];
|
const topic = commandContext.findTopics(firstTopic.getId())[0];
|
||||||
topic.setOnFocus(true);
|
topic.setOnFocus(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,13 +127,13 @@ const DeleteCommand = new Class(/** @lends mindplot.commands.DeleteCommand */{
|
|||||||
this._deletedRelModel = [];
|
this._deletedRelModel = [];
|
||||||
},
|
},
|
||||||
|
|
||||||
_filterChildren:function (topicIds, commandContext) {
|
_filterChildren(topicIds, commandContext) {
|
||||||
var topics = commandContext.findTopics(topicIds);
|
const topics = commandContext.findTopics(topicIds);
|
||||||
|
|
||||||
var result = [];
|
const result = [];
|
||||||
_.each(topics, function (topic) {
|
_.each(topics, (topic) => {
|
||||||
var parent = topic.getParent();
|
let parent = topic.getParent();
|
||||||
var found = false;
|
let found = false;
|
||||||
while (parent != null && !found) {
|
while (parent != null && !found) {
|
||||||
found = topicIds.contains(parent.getId());
|
found = topicIds.contains(parent.getId());
|
||||||
if (found) {
|
if (found) {
|
||||||
@ -155,23 +150,21 @@ const DeleteCommand = new Class(/** @lends mindplot.commands.DeleteCommand */{
|
|||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
_collectInDepthRelationships:function (topic) {
|
_collectInDepthRelationships(topic) {
|
||||||
var result = [];
|
let result = [];
|
||||||
result.append(topic.getRelationships());
|
result.append(topic.getRelationships());
|
||||||
|
|
||||||
var children = topic.getChildren();
|
const children = topic.getChildren();
|
||||||
var rels = children.map(function (topic) {
|
const rels = children.map(function (topic) {
|
||||||
return this._collectInDepthRelationships(topic);
|
return this._collectInDepthRelationships(topic);
|
||||||
}, this);
|
}, this);
|
||||||
result.append(rels.flatten());
|
result.append(rels.flatten());
|
||||||
|
|
||||||
if (result.length > 0) {
|
if (result.length > 0) {
|
||||||
// Filter for unique ...
|
// Filter for unique ...
|
||||||
result = result.sort(function (a, b) {
|
result = result.sort((a, b) => a.getModel().getId() - b.getModel().getId());
|
||||||
return a.getModel().getId() - b.getModel().getId();
|
const ret = [result[0]];
|
||||||
});
|
for (let i = 1; i < result.length; i++) { // start loop at 1 as element 0 can never be a duplicate
|
||||||
var ret = [result[0]];
|
|
||||||
for (var i = 1; i < result.length; i++) { // start loop at 1 as element 0 can never be a duplicate
|
|
||||||
if (result[i - 1] !== result[i]) {
|
if (result[i - 1] !== result[i]) {
|
||||||
ret.push(result[i]);
|
ret.push(result[i]);
|
||||||
}
|
}
|
||||||
@ -179,7 +172,7 @@ const DeleteCommand = new Class(/** @lends mindplot.commands.DeleteCommand */{
|
|||||||
result = ret;
|
result = ret;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
},
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -15,10 +15,10 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const Command = require('../Command').default
|
const Command = require('../Command').default;
|
||||||
|
|
||||||
const DragTopicCommand = new Class(/** @lends DragTopicCommand */{
|
const DragTopicCommand = new Class(/** @lends 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,12 +28,11 @@ 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:function (topicId, position, order, parentTopic) {
|
initialize(topicId, position, order, parentTopic) {
|
||||||
$assert(topicId, "topicId must be defined");
|
$assert(topicId, 'topicId must be defined');
|
||||||
|
|
||||||
this._topicsId = topicId;
|
this._topicsId = topicId;
|
||||||
if ($defined(parentTopic))
|
if ($defined(parentTopic)) this._parentId = parentTopic.getId();
|
||||||
this._parentId = parentTopic.getId();
|
|
||||||
|
|
||||||
this.parent();
|
this.parent();
|
||||||
this._position = position;
|
this._position = position;
|
||||||
@ -43,17 +42,16 @@ const DragTopicCommand = new Class(/** @lends DragTopicCommand */{
|
|||||||
/**
|
/**
|
||||||
* Overrides abstract parent method
|
* Overrides abstract parent method
|
||||||
*/
|
*/
|
||||||
execute:function (commandContext) {
|
execute(commandContext) {
|
||||||
|
const topic = commandContext.findTopics(this._topicsId)[0];
|
||||||
var topic = commandContext.findTopics(this._topicsId)[0];
|
|
||||||
topic.setVisibility(false);
|
topic.setVisibility(false);
|
||||||
|
|
||||||
// Save old position ...
|
// Save old position ...
|
||||||
var origParentTopic = topic.getOutgoingConnectedTopic();
|
const origParentTopic = topic.getOutgoingConnectedTopic();
|
||||||
|
|
||||||
// In this case, topics are positioned using order ...
|
// In this case, topics are positioned using order ...
|
||||||
var origOrder = topic.getOrder();
|
const origOrder = topic.getOrder();
|
||||||
var origPosition = topic.getPosition();
|
const origPosition = topic.getPosition();
|
||||||
|
|
||||||
// Disconnect topic ..
|
// Disconnect topic ..
|
||||||
if ($defined(origParentTopic) && origParentTopic != this._parentId) {
|
if ($defined(origParentTopic) && origParentTopic != this._parentId) {
|
||||||
@ -66,14 +64,13 @@ const DragTopicCommand = new Class(/** @lends DragTopicCommand */{
|
|||||||
} else if (this._position != null) {
|
} else if (this._position != null) {
|
||||||
commandContext.moveTopic(topic, this._position);
|
commandContext.moveTopic(topic, this._position);
|
||||||
} else {
|
} else {
|
||||||
$assert("Illegal command state exception.");
|
$assert('Illegal command state exception.');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finally, connect topic ...
|
// Finally, connect topic ...
|
||||||
if (origParentTopic != this._parentId) {
|
if (origParentTopic != this._parentId) {
|
||||||
|
|
||||||
if ($defined(this._parentId)) {
|
if ($defined(this._parentId)) {
|
||||||
var parentTopic = commandContext.findTopics(this._parentId)[0];
|
const parentTopic = commandContext.findTopics(this._parentId)[0];
|
||||||
commandContext.connect(topic, parentTopic);
|
commandContext.connect(topic, parentTopic);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,16 +85,15 @@ 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
|
||||||
* @see {@link mindplot.Command.undoExecute}
|
* @see {@link mindplot.Command.undoExecute}
|
||||||
*/
|
*/
|
||||||
undoExecute:function (commandContext) {
|
undoExecute(commandContext) {
|
||||||
this.execute(commandContext);
|
this.execute(commandContext);
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default DragTopicCommand;
|
export default DragTopicCommand;
|
||||||
|
@ -15,10 +15,10 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const Command = require('../Command').default
|
const Command = require('../Command').default;
|
||||||
|
|
||||||
const GenericFunctionCommand = new Class(/** @lends GenericFunctionCommand */{
|
const GenericFunctionCommand = new Class(/** @lends 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
|
||||||
@ -30,9 +30,9 @@ 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:function (commandFunc, topicsIds, value) {
|
initialize(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();
|
this.parent();
|
||||||
this._value = value;
|
this._value = value;
|
||||||
@ -44,14 +44,13 @@ const GenericFunctionCommand = new Class(/** @lends GenericFunctionCommand */{
|
|||||||
/**
|
/**
|
||||||
* Overrides abstract parent method
|
* Overrides abstract parent method
|
||||||
*/
|
*/
|
||||||
execute:function (commandContext) {
|
execute(commandContext) {
|
||||||
if (!this.applied) {
|
if (!this.applied) {
|
||||||
|
let topics = null;
|
||||||
var topics = null;
|
|
||||||
try {
|
try {
|
||||||
topics = commandContext.findTopics(this._topicsId);
|
topics = commandContext.findTopics(this._topicsId);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (this._commandFunc.commandType != "changeTextToTopic") {
|
if (this._commandFunc.commandType != 'changeTextToTopic') {
|
||||||
// Workaround: For some reason, there is a combination of events that involves
|
// Workaround: For some reason, there is a combination of events that involves
|
||||||
// making some modification and firing out of focus event. This is causing
|
// making some modification and firing out of focus event. This is causing
|
||||||
// that a remove node try to be removed. In some other life, I will come with the solution.
|
// that a remove node try to be removed. In some other life, I will come with the solution.
|
||||||
@ -61,39 +60,36 @@ const GenericFunctionCommand = new Class(/** @lends GenericFunctionCommand */{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (topics != null) {
|
if (topics != null) {
|
||||||
var me = this;
|
const me = this;
|
||||||
_.each(topics, function (topic) {
|
_.each(topics, (topic) => {
|
||||||
var oldValue = me._commandFunc(topic, me._value);
|
const oldValue = me._commandFunc(topic, me._value);
|
||||||
me._oldValues.push(oldValue);
|
me._oldValues.push(oldValue);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
this.applied = true;
|
this.applied = true;
|
||||||
|
|
||||||
} 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
|
||||||
* @see {@link mindplot.Command.undoExecute}
|
* @see {@link mindplot.Command.undoExecute}
|
||||||
*/
|
*/
|
||||||
undoExecute:function (commandContext) {
|
undoExecute(commandContext) {
|
||||||
if (this.applied) {
|
if (this.applied) {
|
||||||
var topics = commandContext.findTopics(this._topicsId);
|
const topics = commandContext.findTopics(this._topicsId);
|
||||||
var me = this;
|
const me = this;
|
||||||
_.each(topics, function (topic, index) {
|
_.each(topics, (topic, index) => {
|
||||||
me._commandFunc(topic, me._oldValues[index]);
|
me._commandFunc(topic, me._oldValues[index]);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
this.applied = false;
|
this.applied = false;
|
||||||
this._oldValues = [];
|
this._oldValues = [];
|
||||||
} else {
|
} else {
|
||||||
throw "undo can not be applied.";
|
throw 'undo can not be applied.';
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default GenericFunctionCommand
|
export default GenericFunctionCommand;
|
||||||
|
@ -31,7 +31,7 @@ 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: function (ctrlPointController, point) {
|
initialize(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');
|
||||||
|
|
||||||
@ -57,8 +57,8 @@ const MoveControlPointCommand = new Class(
|
|||||||
/**
|
/**
|
||||||
* Overrides abstract parent method
|
* Overrides abstract parent method
|
||||||
*/
|
*/
|
||||||
execute: function (commandContext) {
|
execute(commandContext) {
|
||||||
var 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());
|
||||||
@ -85,9 +85,9 @@ const MoveControlPointCommand = new Class(
|
|||||||
* Overrides abstract parent method
|
* Overrides abstract parent method
|
||||||
* @see {@link mindplot.Command.undoExecute}
|
* @see {@link mindplot.Command.undoExecute}
|
||||||
*/
|
*/
|
||||||
undoExecute: function (commandContext) {
|
undoExecute(commandContext) {
|
||||||
var line = this._line;
|
const line = this._line;
|
||||||
var 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)) {
|
||||||
@ -112,8 +112,7 @@ const MoveControlPointCommand = new Class(
|
|||||||
line._refreshShape();
|
line._refreshShape();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
export default MoveControlPointCommand;
|
export default MoveControlPointCommand;
|
||||||
|
|
||||||
|
@ -17,8 +17,8 @@
|
|||||||
*/
|
*/
|
||||||
const Command = require('../Command').default;
|
const Command = require('../Command').default;
|
||||||
|
|
||||||
const RemoveFeatureFromTopicCommand = new Class(/**@lends RemoveFeatureFromTopicCommand */{
|
const RemoveFeatureFromTopicCommand = new Class(/** @lends 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,7 +27,7 @@ const RemoveFeatureFromTopicCommand = new Class(/**@lends RemoveFeatureFromTopic
|
|||||||
* @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:function (topicId, featureId) {
|
initialize(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');
|
||||||
|
|
||||||
@ -40,9 +40,9 @@ const RemoveFeatureFromTopicCommand = new Class(/**@lends RemoveFeatureFromTopic
|
|||||||
/**
|
/**
|
||||||
* Overrides abstract parent method
|
* Overrides abstract parent method
|
||||||
*/
|
*/
|
||||||
execute:function (commandContext) {
|
execute(commandContext) {
|
||||||
var topic = commandContext.findTopics(this._topicId)[0];
|
const topic = commandContext.findTopics(this._topicId)[0];
|
||||||
var feature = topic.findFeatureById(this._featureId);
|
const feature = topic.findFeatureById(this._featureId);
|
||||||
topic.removeFeature(feature);
|
topic.removeFeature(feature);
|
||||||
this._oldFeature = feature;
|
this._oldFeature = feature;
|
||||||
},
|
},
|
||||||
@ -51,11 +51,11 @@ const RemoveFeatureFromTopicCommand = new Class(/**@lends RemoveFeatureFromTopic
|
|||||||
* Overrides abstract parent method
|
* Overrides abstract parent method
|
||||||
* @see {@link mindplot.Command.undoExecute}
|
* @see {@link mindplot.Command.undoExecute}
|
||||||
*/
|
*/
|
||||||
undoExecute:function (commandContext) {
|
undoExecute(commandContext) {
|
||||||
var 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;
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var mindplot = {};
|
const mindplot = {};
|
||||||
mindplot.util = {};
|
mindplot.util = {};
|
||||||
mindplot.commands = {};
|
mindplot.commands = {};
|
||||||
mindplot.layout = {};
|
mindplot.layout = {};
|
||||||
|
@ -72,8 +72,8 @@ export const Components = {
|
|||||||
EditorProperties: editorProperties,
|
EditorProperties: editorProperties,
|
||||||
Events: events,
|
Events: events,
|
||||||
|
|
||||||
footer: footer,
|
footer,
|
||||||
header: header,
|
header,
|
||||||
|
|
||||||
Icon: icon,
|
Icon: icon,
|
||||||
IconGroup: iconGroup,
|
IconGroup: iconGroup,
|
||||||
@ -81,7 +81,7 @@ export const Components = {
|
|||||||
Keyboard: keyboard,
|
Keyboard: keyboard,
|
||||||
LinkIcon: linkIcon,
|
LinkIcon: linkIcon,
|
||||||
|
|
||||||
localSorageManager: localSorageManager,
|
localSorageManager,
|
||||||
MainTopic: mainTopic,
|
MainTopic: mainTopic,
|
||||||
|
|
||||||
Messages: messages,
|
Messages: messages,
|
||||||
|
@ -30,31 +30,31 @@ const AbstractBasicSorter = new Class(
|
|||||||
* @param {} node
|
* @param {} node
|
||||||
* @return the height of a node and its children if existing and not shrunken
|
* @return the height of a node and its children if existing and not shrunken
|
||||||
*/
|
*/
|
||||||
computeChildrenIdByHeights: function (treeSet, node) {
|
computeChildrenIdByHeights(treeSet, node) {
|
||||||
var result = {};
|
const result = {};
|
||||||
this._computeChildrenHeight(treeSet, node, result);
|
this._computeChildrenHeight(treeSet, node, result);
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getVerticalPadding: function () {
|
_getVerticalPadding() {
|
||||||
return AbstractBasicSorter.INTERNODE_VERTICAL_PADDING;
|
return AbstractBasicSorter.INTERNODE_VERTICAL_PADDING;
|
||||||
},
|
},
|
||||||
|
|
||||||
_computeChildrenHeight: function (treeSet, node, heightCache) {
|
_computeChildrenHeight(treeSet, node, heightCache) {
|
||||||
var height = node.getSize().height + this._getVerticalPadding() * 2; // 2* Top and down padding;
|
const height = node.getSize().height + this._getVerticalPadding() * 2; // 2* Top and down padding;
|
||||||
|
|
||||||
var result;
|
let result;
|
||||||
var children = treeSet.getChildren(node);
|
const children = treeSet.getChildren(node);
|
||||||
if (children.length == 0 || node.areChildrenShrunken()) {
|
if (children.length == 0 || node.areChildrenShrunken()) {
|
||||||
result = height;
|
result = height;
|
||||||
} else {
|
} else {
|
||||||
var childrenHeight = 0;
|
let childrenHeight = 0;
|
||||||
_.each(
|
_.each(
|
||||||
children,
|
children,
|
||||||
function (child) {
|
function (child) {
|
||||||
childrenHeight += this._computeChildrenHeight(treeSet, child, heightCache);
|
childrenHeight += this._computeChildrenHeight(treeSet, child, heightCache);
|
||||||
},
|
},
|
||||||
this
|
this,
|
||||||
);
|
);
|
||||||
|
|
||||||
result = Math.max(height, childrenHeight);
|
result = Math.max(height, childrenHeight);
|
||||||
@ -67,19 +67,17 @@ const AbstractBasicSorter = new Class(
|
|||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getSortedChildren: function (treeSet, node) {
|
_getSortedChildren(treeSet, node) {
|
||||||
var result = treeSet.getChildren(node);
|
const result = treeSet.getChildren(node);
|
||||||
result.sort(function (a, b) {
|
result.sort((a, b) => a.getOrder() - b.getOrder());
|
||||||
return a.getOrder() - b.getOrder();
|
|
||||||
});
|
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getRelativeDirection: function (reference, position) {
|
_getRelativeDirection(reference, position) {
|
||||||
var offset = position.x - reference.x;
|
const offset = position.x - reference.x;
|
||||||
return offset >= 0 ? 1 : -1;
|
return offset >= 0 ? 1 : -1;
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -24,7 +24,7 @@ const BalancedSorter = new Class(
|
|||||||
* @constructs
|
* @constructs
|
||||||
* @extends mindplot.layout.AbstractBasicSorter
|
* @extends mindplot.layout.AbstractBasicSorter
|
||||||
*/
|
*/
|
||||||
initialize: function () {},
|
initialize() {},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {} graph
|
* @param {} graph
|
||||||
@ -34,30 +34,28 @@ const BalancedSorter = new Class(
|
|||||||
* @param {Boolean} free
|
* @param {Boolean} free
|
||||||
* @return an array with order and position
|
* @return an array with order and position
|
||||||
*/
|
*/
|
||||||
predict: function (graph, parent, node, position, free) {
|
predict(graph, parent, node, position, free) {
|
||||||
// If its a free node...
|
// If its a free node...
|
||||||
if (free) {
|
if (free) {
|
||||||
$assert(
|
$assert(
|
||||||
$defined(position),
|
$defined(position),
|
||||||
'position cannot be null for predict in free positioning'
|
'position cannot be null for predict in free positioning',
|
||||||
);
|
);
|
||||||
$assert($defined(node), 'node cannot be null for predict in free positioning');
|
$assert($defined(node), 'node cannot be null for predict in free positioning');
|
||||||
|
|
||||||
var rootNode = graph.getRootNode(parent);
|
var rootNode = graph.getRootNode(parent);
|
||||||
var direction = this._getRelativeDirection(
|
var direction = this._getRelativeDirection(
|
||||||
rootNode.getPosition(),
|
rootNode.getPosition(),
|
||||||
node.getPosition()
|
node.getPosition(),
|
||||||
);
|
);
|
||||||
|
|
||||||
var limitXPos =
|
const limitXPos = parent.getPosition().x
|
||||||
parent.getPosition().x +
|
+ direction
|
||||||
direction *
|
* (parent.getSize().width / 2
|
||||||
(parent.getSize().width / 2 +
|
+ node.getSize().width / 2
|
||||||
node.getSize().width / 2 +
|
+ BalancedSorter.INTERNODE_HORIZONTAL_PADDING);
|
||||||
BalancedSorter.INTERNODE_HORIZONTAL_PADDING);
|
|
||||||
|
|
||||||
var xPos =
|
const xPos = direction > 0
|
||||||
direction > 0
|
|
||||||
? position.x >= limitXPos
|
? position.x >= limitXPos
|
||||||
? position.x
|
? position.x
|
||||||
: limitXPos
|
: limitXPos
|
||||||
@ -73,17 +71,17 @@ const BalancedSorter = new Class(
|
|||||||
// If it is a dragged node...
|
// If it is a dragged node...
|
||||||
if (node) {
|
if (node) {
|
||||||
$assert($defined(position), 'position cannot be null for predict in dragging');
|
$assert($defined(position), 'position cannot be null for predict in dragging');
|
||||||
var nodeDirection = this._getRelativeDirection(
|
const nodeDirection = this._getRelativeDirection(
|
||||||
rootNode.getPosition(),
|
rootNode.getPosition(),
|
||||||
node.getPosition()
|
node.getPosition(),
|
||||||
);
|
);
|
||||||
var positionDirection = this._getRelativeDirection(
|
const positionDirection = this._getRelativeDirection(
|
||||||
rootNode.getPosition(),
|
rootNode.getPosition(),
|
||||||
position
|
position,
|
||||||
);
|
);
|
||||||
var siblings = graph.getSiblings(node);
|
const siblings = graph.getSiblings(node);
|
||||||
|
|
||||||
var sameParent = parent == graph.getParent(node);
|
const sameParent = parent == graph.getParent(node);
|
||||||
if (siblings.length == 0 && nodeDirection == positionDirection && sameParent) {
|
if (siblings.length == 0 && nodeDirection == positionDirection && sameParent) {
|
||||||
return [node.getOrder(), node.getPosition()];
|
return [node.getOrder(), node.getPosition()];
|
||||||
}
|
}
|
||||||
@ -94,7 +92,7 @@ const BalancedSorter = new Class(
|
|||||||
var left = this._getChildrenForOrder(parent, graph, 1);
|
var left = this._getChildrenForOrder(parent, graph, 1);
|
||||||
}
|
}
|
||||||
// Filter nodes on one side..
|
// Filter nodes on one side..
|
||||||
var order = position
|
const order = position
|
||||||
? position.x > rootNode.getPosition().x
|
? position.x > rootNode.getPosition().x
|
||||||
? 0
|
? 0
|
||||||
: 1
|
: 1
|
||||||
@ -104,9 +102,7 @@ const BalancedSorter = new Class(
|
|||||||
var direction = order % 2 == 0 ? 1 : -1;
|
var direction = order % 2 == 0 ? 1 : -1;
|
||||||
|
|
||||||
// Exclude the dragged node (if set)
|
// Exclude the dragged node (if set)
|
||||||
var children = this._getChildrenForOrder(parent, graph, order).filter(function (child) {
|
const children = this._getChildrenForOrder(parent, graph, order).filter((child) => child != node);
|
||||||
return child != node;
|
|
||||||
});
|
|
||||||
|
|
||||||
// No children?
|
// No children?
|
||||||
if (children.length == 0) {
|
if (children.length == 0) {
|
||||||
@ -114,24 +110,23 @@ const BalancedSorter = new Class(
|
|||||||
order,
|
order,
|
||||||
{
|
{
|
||||||
x:
|
x:
|
||||||
parent.getPosition().x +
|
parent.getPosition().x
|
||||||
direction *
|
+ direction
|
||||||
(parent.getSize().width / 2 +
|
* (parent.getSize().width / 2
|
||||||
BalancedSorter.INTERNODE_HORIZONTAL_PADDING * 2),
|
+ BalancedSorter.INTERNODE_HORIZONTAL_PADDING * 2),
|
||||||
y: parent.getPosition().y,
|
y: parent.getPosition().y,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to fit within ...
|
// Try to fit within ...
|
||||||
var result = null;
|
let result = null;
|
||||||
var last = children.getLast();
|
const last = children.getLast();
|
||||||
position = position || { x: last.getPosition().x, y: last.getPosition().y + 1 };
|
position = position || { x: last.getPosition().x, y: last.getPosition().y + 1 };
|
||||||
_.each(children, function (child, index) {
|
_.each(children, (child, index) => {
|
||||||
var cpos = child.getPosition();
|
const cpos = child.getPosition();
|
||||||
if (position.y > cpos.y) {
|
if (position.y > cpos.y) {
|
||||||
let yOffset =
|
const yOffset = child == last
|
||||||
child == last
|
|
||||||
? child.getSize().height + BalancedSorter.INTERNODE_VERTICAL_PADDING * 2
|
? child.getSize().height + BalancedSorter.INTERNODE_VERTICAL_PADDING * 2
|
||||||
: (children[index + 1].getPosition().y - child.getPosition().y) / 2;
|
: (children[index + 1].getPosition().y - child.getPosition().y) / 2;
|
||||||
result = [child.getOrder() + 2, { x: cpos.x, y: cpos.y + yOffset }];
|
result = [child.getOrder() + 2, { x: cpos.x, y: cpos.y + yOffset }];
|
||||||
@ -140,15 +135,15 @@ const BalancedSorter = new Class(
|
|||||||
|
|
||||||
// Position wasn't below any node, so it must be inserted above
|
// Position wasn't below any node, so it must be inserted above
|
||||||
if (!result) {
|
if (!result) {
|
||||||
var first = children[0];
|
const first = children[0];
|
||||||
result = [
|
result = [
|
||||||
position.x > 0 ? 0 : 1,
|
position.x > 0 ? 0 : 1,
|
||||||
{
|
{
|
||||||
x: first.getPosition().x,
|
x: first.getPosition().x,
|
||||||
y:
|
y:
|
||||||
first.getPosition().y -
|
first.getPosition().y
|
||||||
first.getSize().height -
|
- first.getSize().height
|
||||||
BalancedSorter.INTERNODE_VERTICAL_PADDING * 2,
|
- BalancedSorter.INTERNODE_VERTICAL_PADDING * 2,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@ -162,8 +157,8 @@ const BalancedSorter = new Class(
|
|||||||
* @param {} child
|
* @param {} child
|
||||||
* @param {} order
|
* @param {} order
|
||||||
*/
|
*/
|
||||||
insert: function (treeSet, parent, child, order) {
|
insert(treeSet, parent, child, order) {
|
||||||
var children = this._getChildrenForOrder(parent, treeSet, order);
|
const children = this._getChildrenForOrder(parent, treeSet, order);
|
||||||
|
|
||||||
// If no children, return 0 or 1 depending on the side
|
// If no children, return 0 or 1 depending on the side
|
||||||
if (children.length == 0) {
|
if (children.length == 0) {
|
||||||
@ -173,9 +168,9 @@ const BalancedSorter = new Class(
|
|||||||
|
|
||||||
// Shift all the elements by two, so side is the same.
|
// Shift all the elements by two, so side is the same.
|
||||||
// In case of balanced sorter, order don't need to be continuous...
|
// In case of balanced sorter, order don't need to be continuous...
|
||||||
var max = 0;
|
let max = 0;
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
var node = children[i];
|
const node = children[i];
|
||||||
max = Math.max(max, node.getOrder());
|
max = Math.max(max, node.getOrder());
|
||||||
if (node.getOrder() >= order) {
|
if (node.getOrder() >= order) {
|
||||||
max = Math.max(max, node.getOrder() + 2);
|
max = Math.max(max, node.getOrder() + 2);
|
||||||
@ -183,7 +178,7 @@ const BalancedSorter = new Class(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var newOrder = order > max + 1 ? max + 2 : order;
|
const newOrder = order > max + 1 ? max + 2 : order;
|
||||||
child.setOrder(newOrder);
|
child.setOrder(newOrder);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -191,12 +186,12 @@ const BalancedSorter = new Class(
|
|||||||
* @param {} treeSet
|
* @param {} treeSet
|
||||||
* @param {} node
|
* @param {} node
|
||||||
*/
|
*/
|
||||||
detach: function (treeSet, node) {
|
detach(treeSet, node) {
|
||||||
var parent = treeSet.getParent(node);
|
const parent = treeSet.getParent(node);
|
||||||
// Filter nodes on one side..
|
// Filter nodes on one side..
|
||||||
var children = this._getChildrenForOrder(parent, treeSet, node.getOrder());
|
const children = this._getChildrenForOrder(parent, treeSet, node.getOrder());
|
||||||
|
|
||||||
_.each(children, function (child, index) {
|
_.each(children, (child, index) => {
|
||||||
if (child.getOrder() > node.getOrder()) {
|
if (child.getOrder() > node.getOrder()) {
|
||||||
child.setOrder(child.getOrder() - 2);
|
child.setOrder(child.getOrder() - 2);
|
||||||
}
|
}
|
||||||
@ -209,14 +204,14 @@ const BalancedSorter = new Class(
|
|||||||
* @param {} node
|
* @param {} node
|
||||||
* @return offsets
|
* @return offsets
|
||||||
*/
|
*/
|
||||||
computeOffsets: function (treeSet, node) {
|
computeOffsets(treeSet, node) {
|
||||||
$assert(treeSet, 'treeSet can no be null.');
|
$assert(treeSet, 'treeSet can no be null.');
|
||||||
$assert(node, 'node can no be null.');
|
$assert(node, 'node can no be null.');
|
||||||
|
|
||||||
var children = this._getSortedChildren(treeSet, node);
|
const children = this._getSortedChildren(treeSet, node);
|
||||||
|
|
||||||
// Compute heights ...
|
// Compute heights ...
|
||||||
var heights = children
|
const heights = children
|
||||||
.map(function (child) {
|
.map(function (child) {
|
||||||
return {
|
return {
|
||||||
id: child.getId(),
|
id: child.getId(),
|
||||||
@ -228,39 +223,38 @@ const BalancedSorter = new Class(
|
|||||||
.reverse();
|
.reverse();
|
||||||
|
|
||||||
// Compute the center of the branch ...
|
// Compute the center of the branch ...
|
||||||
var totalPHeight = 0;
|
let totalPHeight = 0;
|
||||||
var totalNHeight = 0;
|
let totalNHeight = 0;
|
||||||
|
|
||||||
_.each(heights, function (elem) {
|
_.each(heights, (elem) => {
|
||||||
if (elem.order % 2 == 0) {
|
if (elem.order % 2 == 0) {
|
||||||
totalPHeight += elem.height;
|
totalPHeight += elem.height;
|
||||||
} else {
|
} else {
|
||||||
totalNHeight += elem.height;
|
totalNHeight += elem.height;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var psum = totalPHeight / 2;
|
let psum = totalPHeight / 2;
|
||||||
var nsum = totalNHeight / 2;
|
let nsum = totalNHeight / 2;
|
||||||
var ysum = 0;
|
let ysum = 0;
|
||||||
|
|
||||||
// Calculate the offsets ...
|
// Calculate the offsets ...
|
||||||
var result = {};
|
const result = {};
|
||||||
for (var i = 0; i < heights.length; i++) {
|
for (let i = 0; i < heights.length; i++) {
|
||||||
var direction = heights[i].order % 2 ? -1 : 1;
|
const direction = heights[i].order % 2 ? -1 : 1;
|
||||||
|
|
||||||
if (direction > 0) {
|
if (direction > 0) {
|
||||||
psum = psum - heights[i].height;
|
psum -= heights[i].height;
|
||||||
ysum = psum;
|
ysum = psum;
|
||||||
} else {
|
} else {
|
||||||
nsum = nsum - heights[i].height;
|
nsum -= heights[i].height;
|
||||||
ysum = nsum;
|
ysum = nsum;
|
||||||
}
|
}
|
||||||
|
|
||||||
var yOffset = ysum + heights[i].height / 2;
|
const yOffset = ysum + heights[i].height / 2;
|
||||||
var xOffset =
|
const xOffset = direction
|
||||||
direction *
|
* (node.getSize().width / 2
|
||||||
(node.getSize().width / 2 +
|
+ heights[i].width / 2
|
||||||
heights[i].width / 2 +
|
+ +BalancedSorter.INTERNODE_HORIZONTAL_PADDING);
|
||||||
+BalancedSorter.INTERNODE_HORIZONTAL_PADDING);
|
|
||||||
|
|
||||||
$assert(!isNaN(xOffset), 'xOffset can not be null');
|
$assert(!isNaN(xOffset), 'xOffset can not be null');
|
||||||
$assert(!isNaN(yOffset), 'yOffset can not be null');
|
$assert(!isNaN(yOffset), 'yOffset can not be null');
|
||||||
@ -275,23 +269,23 @@ const BalancedSorter = new Class(
|
|||||||
* @param {} node
|
* @param {} node
|
||||||
* @throw will throw an error if order elements are missing
|
* @throw will throw an error if order elements are missing
|
||||||
*/
|
*/
|
||||||
verify: function (treeSet, node) {
|
verify(treeSet, node) {
|
||||||
// Check that all is consistent ...
|
// Check that all is consistent ...
|
||||||
var children = this._getChildrenForOrder(node, treeSet, node.getOrder());
|
const children = this._getChildrenForOrder(node, treeSet, node.getOrder());
|
||||||
|
|
||||||
// All odd ordered nodes should be "continuous" by themselves
|
// All odd ordered nodes should be "continuous" by themselves
|
||||||
// All even numbered nodes should be "continuous" by themselves
|
// All even numbered nodes should be "continuous" by themselves
|
||||||
var factor = node.getOrder() % 2 == 0 ? 2 : 1;
|
const factor = node.getOrder() % 2 == 0 ? 2 : 1;
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
var order = i == 0 && factor == 1 ? 1 : factor * i;
|
const order = i == 0 && factor == 1 ? 1 : factor * i;
|
||||||
$assert(
|
$assert(
|
||||||
children[i].getOrder() == order,
|
children[i].getOrder() == order,
|
||||||
'Missing order elements. Missing order: ' +
|
`Missing order elements. Missing order: ${
|
||||||
i * factor +
|
i * factor
|
||||||
'. Parent:' +
|
}. Parent:${
|
||||||
node.getId() +
|
node.getId()
|
||||||
',Node:' +
|
},Node:${
|
||||||
children[i].getId()
|
children[i].getId()}`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -301,27 +295,25 @@ const BalancedSorter = new Class(
|
|||||||
* @param {} child
|
* @param {} child
|
||||||
* @return the direction of the child within the treeSet
|
* @return the direction of the child within the treeSet
|
||||||
*/
|
*/
|
||||||
getChildDirection: function (treeSet, child) {
|
getChildDirection(treeSet, child) {
|
||||||
return child.getOrder() % 2 == 0 ? 1 : -1;
|
return child.getOrder() % 2 == 0 ? 1 : -1;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return {String} the print name of this class
|
* @return {String} the print name of this class
|
||||||
*/
|
*/
|
||||||
toString: function () {
|
toString() {
|
||||||
return 'Balanced Sorter';
|
return 'Balanced Sorter';
|
||||||
},
|
},
|
||||||
|
|
||||||
_getChildrenForOrder: function (parent, graph, order) {
|
_getChildrenForOrder(parent, graph, order) {
|
||||||
return this._getSortedChildren(graph, parent).filter(function (child) {
|
return this._getSortedChildren(graph, parent).filter((child) => child.getOrder() % 2 == order % 2);
|
||||||
return child.getOrder() % 2 == order % 2;
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_getVerticalPadding: function () {
|
_getVerticalPadding() {
|
||||||
return BalancedSorter.INTERNODE_VERTICAL_PADDING;
|
return BalancedSorter.INTERNODE_VERTICAL_PADDING;
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -22,25 +22,25 @@ const ChangeEvent = new Class(/** @lends ChangeEvent */{
|
|||||||
* @param {} id
|
* @param {} id
|
||||||
* @throws will throw an error if the given id is not/cannot be converted to a numerical value
|
* @throws will throw an error if the given id is not/cannot be converted to a numerical value
|
||||||
*/
|
*/
|
||||||
initialize:function(id) {
|
initialize(id) {
|
||||||
$assert(!isNaN(id), "id can not be null");
|
$assert(!isNaN(id), 'id can not be null');
|
||||||
this._id = id;
|
this._id = id;
|
||||||
this._position = null;
|
this._position = null;
|
||||||
this._order = null;
|
this._order = null;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @return id */
|
/** @return id */
|
||||||
getId:function() {
|
getId() {
|
||||||
return this._id;
|
return this._id;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @return order */
|
/** @return order */
|
||||||
getOrder: function() {
|
getOrder() {
|
||||||
return this._order;
|
return this._order;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @return position */
|
/** @return position */
|
||||||
getPosition: function() {
|
getPosition() {
|
||||||
return this._position;
|
return this._position;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -49,22 +49,22 @@ const ChangeEvent = new Class(/** @lends ChangeEvent */{
|
|||||||
* @throws will throw an error if the given parameter is not/cannot be converted to a numerical
|
* @throws will throw an error if the given parameter is not/cannot be converted to a numerical
|
||||||
* value
|
* value
|
||||||
*/
|
*/
|
||||||
setOrder: function(value) {
|
setOrder(value) {
|
||||||
$assert(!isNaN(value), "value can not be null");
|
$assert(!isNaN(value), 'value can not be null');
|
||||||
this._order = value;
|
this._order = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @param {} value
|
/** @param {} value
|
||||||
* @throws will throw an error if the value is null or undefined*/
|
* @throws will throw an error if the value is null or undefined */
|
||||||
setPosition: function(value) {
|
setPosition(value) {
|
||||||
$assert(value, "value can not be null");
|
$assert(value, 'value can not be null');
|
||||||
this._position = value;
|
this._position = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @return {String} order and position */
|
/** @return {String} order and position */
|
||||||
toString: function() {
|
toString() {
|
||||||
return "[order:" + this.getOrder() + ", position: {" + this.getPosition().x + "," + this.getPosition().y + "}]";
|
return `[order:${this.getOrder()}, position: {${this.getPosition().x},${this.getPosition().y}}]`;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default ChangeEvent;
|
export default ChangeEvent;
|
||||||
|
@ -20,50 +20,50 @@ const ChildrenSorterStrategy = new Class(/** @lends ChildrenSorterStrategy */{
|
|||||||
/**
|
/**
|
||||||
* @constructs
|
* @constructs
|
||||||
*/
|
*/
|
||||||
initialize:function() {
|
initialize() {
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
computeChildrenIdByHeights: function(treeSet, node) {
|
computeChildrenIdByHeights(treeSet, node) {
|
||||||
throw "Method must be implemented";
|
throw 'Method must be implemented';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
computeOffsets:function(treeSet, node) {
|
computeOffsets(treeSet, node) {
|
||||||
throw "Method must be implemented";
|
throw 'Method must be implemented';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
insert: function(treeSet, parent, child, order) {
|
insert(treeSet, parent, child, order) {
|
||||||
throw "Method must be implemented";
|
throw 'Method must be implemented';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
detach:function(treeSet, node) {
|
detach(treeSet, node) {
|
||||||
throw "Method must be implemented";
|
throw 'Method must be implemented';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
predict:function(treeSet, parent, node, position, free) {
|
predict(treeSet, parent, node, position, free) {
|
||||||
throw "Method must be implemented";
|
throw 'Method must be implemented';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
verify:function(treeSet, node) {
|
verify(treeSet, node) {
|
||||||
throw "Method must be implemented";
|
throw 'Method must be implemented';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
getChildDirection: function(treeSet, node) {
|
getChildDirection(treeSet, node) {
|
||||||
throw "Method must be implemented";
|
throw 'Method must be implemented';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
toString:function() {
|
toString() {
|
||||||
throw "Method must be implemented: print name";
|
throw 'Method must be implemented: print name';
|
||||||
}
|
},
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export default ChildrenSorterStrategy
|
export default ChildrenSorterStrategy;
|
||||||
|
@ -23,8 +23,8 @@ const EventBus = new Class(/** @lends EventBus */{
|
|||||||
* @constructs
|
* @constructs
|
||||||
* @implements mindplot.Events
|
* @implements mindplot.Events
|
||||||
*/
|
*/
|
||||||
initialize: function() {
|
initialize() {
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -32,14 +32,14 @@ const EventBus = new Class(/** @lends EventBus */{
|
|||||||
* @enum {String}
|
* @enum {String}
|
||||||
*/
|
*/
|
||||||
EventBus.events = {
|
EventBus.events = {
|
||||||
NodeResizeEvent:'NodeResizeEvent',
|
NodeResizeEvent: 'NodeResizeEvent',
|
||||||
NodeMoveEvent:'NodeMoveEvent',
|
NodeMoveEvent: 'NodeMoveEvent',
|
||||||
NodeShrinkEvent:'NodeShrinkEvent',
|
NodeShrinkEvent: 'NodeShrinkEvent',
|
||||||
NodeConnectEvent:'NodeConnectEvent',
|
NodeConnectEvent: 'NodeConnectEvent',
|
||||||
NodeDisconnectEvent:'NodeDisconnectEvent',
|
NodeDisconnectEvent: 'NodeDisconnectEvent',
|
||||||
NodeAdded:'NodeAdded',
|
NodeAdded: 'NodeAdded',
|
||||||
NodeRemoved:'NodeRemoved',
|
NodeRemoved: 'NodeRemoved',
|
||||||
DoLayout:'DoLayout'
|
DoLayout: 'DoLayout',
|
||||||
};
|
};
|
||||||
|
|
||||||
/** instance */
|
/** instance */
|
||||||
|
@ -15,27 +15,27 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const EventBus = require('./EventBus').default
|
const EventBus = require('./EventBus').default;
|
||||||
|
|
||||||
const EventBusDispatcher = new Class(/** @lends EventBusDispatcher */{
|
const EventBusDispatcher = new Class(/** @lends EventBusDispatcher */{
|
||||||
/**
|
/**
|
||||||
* @constructs
|
* @constructs
|
||||||
*/
|
*/
|
||||||
initialize:function() {
|
initialize() {
|
||||||
this.registerBusEvents();
|
this.registerBusEvents();
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {mindplot.layout.LayoutManager} layoutManager
|
* @param {mindplot.layout.LayoutManager} layoutManager
|
||||||
*/
|
*/
|
||||||
setLayoutManager : function(layoutManager) {
|
setLayoutManager(layoutManager) {
|
||||||
this._layoutManager = layoutManager;
|
this._layoutManager = layoutManager;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* register bus events
|
* register bus events
|
||||||
*/
|
*/
|
||||||
registerBusEvents:function () {
|
registerBusEvents() {
|
||||||
EventBus.instance.addEvent(EventBus.events.NodeAdded, this._nodeAdded.bind(this));
|
EventBus.instance.addEvent(EventBus.events.NodeAdded, this._nodeAdded.bind(this));
|
||||||
EventBus.instance.addEvent(EventBus.events.NodeRemoved, this._nodeRemoved.bind(this));
|
EventBus.instance.addEvent(EventBus.events.NodeRemoved, this._nodeRemoved.bind(this));
|
||||||
EventBus.instance.addEvent(EventBus.events.NodeResizeEvent, this._nodeResizeEvent.bind(this));
|
EventBus.instance.addEvent(EventBus.events.NodeResizeEvent, this._nodeResizeEvent.bind(this));
|
||||||
@ -46,54 +46,53 @@ const EventBusDispatcher = new Class(/** @lends EventBusDispatcher */{
|
|||||||
EventBus.instance.addEvent(EventBus.events.DoLayout, this._doLayout.bind(this));
|
EventBus.instance.addEvent(EventBus.events.DoLayout, this._doLayout.bind(this));
|
||||||
},
|
},
|
||||||
|
|
||||||
_nodeResizeEvent: function(args) {
|
_nodeResizeEvent(args) {
|
||||||
this._layoutManager.updateNodeSize(args.node.getId(), args.size);
|
this._layoutManager.updateNodeSize(args.node.getId(), args.size);
|
||||||
},
|
},
|
||||||
|
|
||||||
_nodeMoveEvent: function(args) {
|
_nodeMoveEvent(args) {
|
||||||
this._layoutManager.moveNode(args.node.getId(), args.position);
|
this._layoutManager.moveNode(args.node.getId(), args.position);
|
||||||
},
|
},
|
||||||
|
|
||||||
_nodeDisconnectEvent: function(node) {
|
_nodeDisconnectEvent(node) {
|
||||||
this._layoutManager.disconnectNode(node.getId());
|
this._layoutManager.disconnectNode(node.getId());
|
||||||
},
|
},
|
||||||
|
|
||||||
_nodeConnectEvent: function(args) {
|
_nodeConnectEvent(args) {
|
||||||
this._layoutManager.connectNode(args.parentNode.getId(), args.childNode.getId(), args.childNode.getOrder());
|
this._layoutManager.connectNode(args.parentNode.getId(), args.childNode.getId(), args.childNode.getOrder());
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_nodeShrinkEvent: function(node) {
|
_nodeShrinkEvent(node) {
|
||||||
this._layoutManager.updateShrinkState(node.getId(), node.areChildrenShrunken());
|
this._layoutManager.updateShrinkState(node.getId(), node.areChildrenShrunken());
|
||||||
},
|
},
|
||||||
|
|
||||||
_nodeAdded: function(node) {
|
_nodeAdded(node) {
|
||||||
// Central topic must not be added twice ...
|
// Central topic must not be added twice ...
|
||||||
if (node.getId() != 0) {
|
if (node.getId() != 0) {
|
||||||
this._layoutManager.addNode(node.getId(), {width:10,height:10}, node.getPosition());
|
this._layoutManager.addNode(node.getId(), { width: 10, height: 10 }, node.getPosition());
|
||||||
this._layoutManager.updateShrinkState(node.getId(), node.areChildrenShrunken());
|
this._layoutManager.updateShrinkState(node.getId(), node.areChildrenShrunken());
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_nodeRemoved: function(node) {
|
_nodeRemoved(node) {
|
||||||
this._layoutManager.removeNode(node.getId());
|
this._layoutManager.removeNode(node.getId());
|
||||||
},
|
},
|
||||||
|
|
||||||
_doLayout: function() {
|
_doLayout() {
|
||||||
// (function() {
|
// (function() {
|
||||||
this._layoutManager.layout(true);
|
this._layoutManager.layout(true);
|
||||||
// console.log("---------");
|
// console.log("---------");
|
||||||
// this._layoutManager.dump();
|
// this._layoutManager.dump();
|
||||||
// console.log("---------");
|
// console.log("---------");
|
||||||
// console.log("---------");
|
// console.log("---------");
|
||||||
// }).delay(0, this);
|
// }).delay(0, this);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @return layout manager */
|
/** @return layout manager */
|
||||||
getLayoutManager: function() {
|
getLayoutManager() {
|
||||||
return this._layoutManager;
|
return this._layoutManager;
|
||||||
}
|
},
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export default EventBusDispatcher
|
export default EventBusDispatcher;
|
||||||
|
@ -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.
|
||||||
*/
|
*/
|
||||||
const AbstractBasicSorter = require('./AbstractBasicSorter').default
|
const AbstractBasicSorter = require('./AbstractBasicSorter').default;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @class
|
* @class
|
||||||
@ -29,42 +29,39 @@ const GridSorter = new Class(/** @lends GridSorter */{
|
|||||||
* @param {} node
|
* @param {} node
|
||||||
* @return offsets
|
* @return offsets
|
||||||
*/
|
*/
|
||||||
computeOffsets: function(treeSet, node) {
|
computeOffsets(treeSet, node) {
|
||||||
$assert(treeSet, "treeSet can no be null.");
|
$assert(treeSet, 'treeSet can no be null.');
|
||||||
$assert(node, "node can no be null.");
|
$assert(node, 'node can no be null.');
|
||||||
$assert("order can no be null.");
|
$assert('order can no be null.');
|
||||||
|
|
||||||
var children = this._getSortedChildren(treeSet, node);
|
const children = this._getSortedChildren(treeSet, node);
|
||||||
|
|
||||||
// Compute heights ...
|
// Compute heights ...
|
||||||
var me = this;
|
const me = this;
|
||||||
var heights = children.map(function(child) {
|
const heights = children.map((child) => ({
|
||||||
return {
|
|
||||||
id: child.getId(),
|
id: child.getId(),
|
||||||
height: me._computeChildrenHeight(treeSet, child)
|
height: me._computeChildrenHeight(treeSet, child),
|
||||||
};
|
}));
|
||||||
});
|
|
||||||
|
|
||||||
// Calculate the offsets ...
|
// Calculate the offsets ...
|
||||||
var result = {};
|
const result = {};
|
||||||
for (var i = 0; i < heights.length; i++) {
|
for (let i = 0; i < heights.length; i++) {
|
||||||
var even = i%2 == 0 ? 1 : -1;
|
const even = i % 2 == 0 ? 1 : -1;
|
||||||
|
|
||||||
var zeroHeight = i == 0 ? 0 : heights[0].height/2 * even;
|
const zeroHeight = i == 0 ? 0 : heights[0].height / 2 * even;
|
||||||
var middleHeight = 0;
|
let middleHeight = 0;
|
||||||
for (var j=i-2; j>0; j=j-2) {
|
for (let j = i - 2; j > 0; j -= 2) {
|
||||||
middleHeight += heights[j].height * even;
|
middleHeight += heights[j].height * even;
|
||||||
}
|
}
|
||||||
var finalHeight = i == 0 ? 0 : heights[i].height/2 * even;
|
const finalHeight = i == 0 ? 0 : heights[i].height / 2 * even;
|
||||||
|
|
||||||
var yOffset = zeroHeight + middleHeight +finalHeight;
|
const yOffset = zeroHeight + middleHeight + finalHeight;
|
||||||
var xOffset = node.getSize().width + GridSorter.GRID_HORIZONTAR_SIZE;
|
const xOffset = node.getSize().width + GridSorter.GRID_HORIZONTAR_SIZE;
|
||||||
|
|
||||||
$assert(!isNaN(xOffset), "xOffset can not be null");
|
$assert(!isNaN(xOffset), 'xOffset can not be null');
|
||||||
$assert(!isNaN(yOffset), "yOffset can not be null");
|
$assert(!isNaN(yOffset), 'yOffset can not be null');
|
||||||
|
|
||||||
result[heights[i].id] = {x:xOffset,y:yOffset};
|
|
||||||
|
|
||||||
|
result[heights[i].id] = { x: xOffset, y: yOffset };
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
@ -72,9 +69,9 @@ const GridSorter = new Class(/** @lends GridSorter */{
|
|||||||
/**
|
/**
|
||||||
* @return {String} the print name of this class
|
* @return {String} the print name of this class
|
||||||
*/
|
*/
|
||||||
toString:function() {
|
toString() {
|
||||||
return "Grid Sorter";
|
return 'Grid Sorter';
|
||||||
}
|
},
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ const LayoutManager = new Class(
|
|||||||
* @throws will throw an error if the root node id is null or undefined
|
* @throws will throw an error if the root node id is null or undefined
|
||||||
* @throws will throw an error if the root size is null
|
* @throws will throw an error if the root size is null
|
||||||
*/
|
*/
|
||||||
initialize: function (rootNodeId, rootSize) {
|
initialize(rootNodeId, rootSize) {
|
||||||
$assert($defined(rootNodeId), 'rootNodeId can not be null');
|
$assert($defined(rootNodeId), 'rootNodeId can not be null');
|
||||||
$assert(rootSize, 'rootSize can not be null');
|
$assert(rootSize, 'rootSize can not be null');
|
||||||
var position = position || { x: 0, y: 0 };
|
var position = position || { x: 0, y: 0 };
|
||||||
@ -39,7 +39,7 @@ const LayoutManager = new Class(
|
|||||||
this._treeSet = new RootedTreeSet();
|
this._treeSet = new RootedTreeSet();
|
||||||
this._layout = new OriginalLayout(this._treeSet);
|
this._layout = new OriginalLayout(this._treeSet);
|
||||||
|
|
||||||
var rootNode = this._layout.createNode(rootNodeId, rootSize, position, 'root');
|
const rootNode = this._layout.createNode(rootNodeId, rootSize, position, 'root');
|
||||||
this._treeSet.setRoot(rootNode);
|
this._treeSet.setRoot(rootNode);
|
||||||
this._events = [];
|
this._events = [];
|
||||||
},
|
},
|
||||||
@ -49,10 +49,10 @@ const LayoutManager = new Class(
|
|||||||
* @param size
|
* @param size
|
||||||
* @throws will throw an error if id is null or undefined
|
* @throws will throw an error if id is null or undefined
|
||||||
*/
|
*/
|
||||||
updateNodeSize: function (id, size) {
|
updateNodeSize(id, size) {
|
||||||
$assert($defined(id), 'id can not be null');
|
$assert($defined(id), 'id can not be null');
|
||||||
|
|
||||||
var node = this._treeSet.find(id);
|
const node = this._treeSet.find(id);
|
||||||
node.setSize(size);
|
node.setSize(size);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -63,11 +63,11 @@ const LayoutManager = new Class(
|
|||||||
* @throws will throw an error if value is null or undefined
|
* @throws will throw an error if value is null or undefined
|
||||||
* @return this
|
* @return this
|
||||||
*/
|
*/
|
||||||
updateShrinkState: function (id, value) {
|
updateShrinkState(id, value) {
|
||||||
$assert($defined(id), 'id can not be null');
|
$assert($defined(id), 'id can not be null');
|
||||||
$assert($defined(value), 'value can not be null');
|
$assert($defined(value), 'value can not be null');
|
||||||
|
|
||||||
var node = this._treeSet.find(id);
|
const node = this._treeSet.find(id);
|
||||||
node.setShrunken(value);
|
node.setShrunken(value);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
@ -77,7 +77,7 @@ const LayoutManager = new Class(
|
|||||||
* @param id
|
* @param id
|
||||||
* @return {@link RootedTreeSet}.find(id)
|
* @return {@link RootedTreeSet}.find(id)
|
||||||
*/
|
*/
|
||||||
find: function (id) {
|
find(id) {
|
||||||
return this._treeSet.find(id);
|
return this._treeSet.find(id);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -89,13 +89,13 @@ const LayoutManager = new Class(
|
|||||||
* @throws will throw an error if the position's x property is null or undefined
|
* @throws will throw an error if the position's x property is null or undefined
|
||||||
* @throws will throw an error if the position's y property is null or undefined
|
* @throws will throw an error if the position's y property is null or undefined
|
||||||
*/
|
*/
|
||||||
moveNode: function (id, position) {
|
moveNode(id, position) {
|
||||||
$assert($defined(id), 'id cannot be null');
|
$assert($defined(id), 'id cannot be null');
|
||||||
$assert($defined(position), 'position cannot be null');
|
$assert($defined(position), 'position cannot be null');
|
||||||
$assert($defined(position.x), 'x can not be null');
|
$assert($defined(position.x), 'x can not be null');
|
||||||
$assert($defined(position.y), 'y can not be null');
|
$assert($defined(position.y), 'y can not be null');
|
||||||
|
|
||||||
var node = this._treeSet.find(id);
|
const node = this._treeSet.find(id);
|
||||||
// @Todo: this should not be here. This is broking the isolated node support...
|
// @Todo: this should not be here. This is broking the isolated node support...
|
||||||
// node.setFree(true);
|
// node.setFree(true);
|
||||||
// node.setFreeDisplacement({x:position.x - node.getPosition().x, y:position.y - node.getPosition().y});
|
// node.setFreeDisplacement({x:position.x - node.getPosition().x, y:position.y - node.getPosition().y});
|
||||||
@ -111,7 +111,7 @@ const LayoutManager = new Class(
|
|||||||
* @throws will throw an error if order is null or undefined
|
* @throws will throw an error if order is null or undefined
|
||||||
* @return this
|
* @return this
|
||||||
*/
|
*/
|
||||||
connectNode: function (parentId, childId, order) {
|
connectNode(parentId, childId, order) {
|
||||||
$assert($defined(parentId), 'parentId cannot be null');
|
$assert($defined(parentId), 'parentId cannot be null');
|
||||||
$assert($defined(childId), 'childId cannot be null');
|
$assert($defined(childId), 'childId cannot be null');
|
||||||
$assert($defined(order), 'order cannot be null');
|
$assert($defined(order), 'order cannot be null');
|
||||||
@ -126,7 +126,7 @@ const LayoutManager = new Class(
|
|||||||
* @throws will throw an error if id is null or undefined
|
* @throws will throw an error if id is null or undefined
|
||||||
* @return this
|
* @return this
|
||||||
*/
|
*/
|
||||||
disconnectNode: function (id) {
|
disconnectNode(id) {
|
||||||
$assert($defined(id), 'id can not be null');
|
$assert($defined(id), 'id can not be null');
|
||||||
this._layout.disconnectNode(id);
|
this._layout.disconnectNode(id);
|
||||||
|
|
||||||
@ -140,9 +140,9 @@ const LayoutManager = new Class(
|
|||||||
* @throws will throw an error if id is null or undefined
|
* @throws will throw an error if id is null or undefined
|
||||||
* @return this
|
* @return this
|
||||||
*/
|
*/
|
||||||
addNode: function (id, size, position) {
|
addNode(id, size, position) {
|
||||||
$assert($defined(id), 'id can not be null');
|
$assert($defined(id), 'id can not be null');
|
||||||
var result = this._layout.createNode(id, size, position, 'topic');
|
const result = this._layout.createNode(id, size, position, 'topic');
|
||||||
this._treeSet.add(result);
|
this._treeSet.add(result);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
@ -154,9 +154,9 @@ const LayoutManager = new Class(
|
|||||||
* @throws will throw an error if id is null or undefined
|
* @throws will throw an error if id is null or undefined
|
||||||
* @return this
|
* @return this
|
||||||
*/
|
*/
|
||||||
removeNode: function (id) {
|
removeNode(id) {
|
||||||
$assert($defined(id), 'id can not be null');
|
$assert($defined(id), 'id can not be null');
|
||||||
var node = this._treeSet.find(id);
|
const node = this._treeSet.find(id);
|
||||||
|
|
||||||
// Is It connected ?
|
// Is It connected ?
|
||||||
if (this._treeSet.getParent(node)) {
|
if (this._treeSet.getParent(node)) {
|
||||||
@ -177,21 +177,21 @@ const LayoutManager = new Class(
|
|||||||
* @param {Boolean=} free true specifies free node positioning
|
* @param {Boolean=} free true specifies free node positioning
|
||||||
* @throws will throw an error if parentId is null or undefined
|
* @throws will throw an error if parentId is null or undefined
|
||||||
*/
|
*/
|
||||||
predict: function (parentId, nodeId, position, free) {
|
predict(parentId, nodeId, position, free) {
|
||||||
$assert($defined(parentId), 'parentId can not be null');
|
$assert($defined(parentId), 'parentId can not be null');
|
||||||
|
|
||||||
var parent = this._treeSet.find(parentId);
|
const parent = this._treeSet.find(parentId);
|
||||||
var node = nodeId ? this._treeSet.find(nodeId) : null;
|
const node = nodeId ? this._treeSet.find(nodeId) : null;
|
||||||
var sorter = parent.getSorter();
|
const sorter = parent.getSorter();
|
||||||
|
|
||||||
var result = sorter.predict(this._treeSet, parent, node, position, free);
|
const result = sorter.predict(this._treeSet, parent, node, position, free);
|
||||||
return { order: result[0], position: result[1] };
|
return { order: result[0], position: result[1] };
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* logs dump to console
|
* logs dump to console
|
||||||
*/
|
*/
|
||||||
dump: function () {
|
dump() {
|
||||||
console.log(this._treeSet.dump());
|
console.log(this._treeSet.dump());
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -201,18 +201,18 @@ const LayoutManager = new Class(
|
|||||||
* @throws will throw an error if containerId is null or undefined
|
* @throws will throw an error if containerId is null or undefined
|
||||||
* @return canvas
|
* @return canvas
|
||||||
*/
|
*/
|
||||||
plot: function (containerId, size) {
|
plot(containerId, size) {
|
||||||
$assert(containerId, 'containerId cannot be null');
|
$assert(containerId, 'containerId cannot be null');
|
||||||
size = size || { width: 200, height: 200 };
|
size = size || { width: 200, height: 200 };
|
||||||
var squaresize = 10;
|
const squaresize = 10;
|
||||||
var canvas = Raphael(containerId, size.width, size.height);
|
const canvas = Raphael(containerId, size.width, size.height);
|
||||||
canvas.drawGrid(
|
canvas.drawGrid(
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
size.width,
|
size.width,
|
||||||
size.height,
|
size.height,
|
||||||
size.width / squaresize,
|
size.width / squaresize,
|
||||||
size.height / squaresize
|
size.height / squaresize,
|
||||||
);
|
);
|
||||||
this._treeSet.plot(canvas);
|
this._treeSet.plot(canvas);
|
||||||
|
|
||||||
@ -224,7 +224,7 @@ const LayoutManager = new Class(
|
|||||||
* @param fireEvents
|
* @param fireEvents
|
||||||
* @return this
|
* @return this
|
||||||
*/
|
*/
|
||||||
layout: function (fireEvents) {
|
layout(fireEvents) {
|
||||||
// File repositioning ...
|
// File repositioning ...
|
||||||
this._layout.layout();
|
this._layout.layout();
|
||||||
|
|
||||||
@ -238,18 +238,18 @@ const LayoutManager = new Class(
|
|||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
_flushEvents: function () {
|
_flushEvents() {
|
||||||
_.each(
|
_.each(
|
||||||
this._events,
|
this._events,
|
||||||
function (event) {
|
function (event) {
|
||||||
this.fireEvent('change', event);
|
this.fireEvent('change', event);
|
||||||
},
|
},
|
||||||
this
|
this,
|
||||||
);
|
);
|
||||||
this._events = [];
|
this._events = [];
|
||||||
},
|
},
|
||||||
|
|
||||||
_collectChanges: function (nodes) {
|
_collectChanges(nodes) {
|
||||||
if (!nodes) nodes = this._treeSet.getTreeRoots();
|
if (!nodes) nodes = this._treeSet.getTreeRoots();
|
||||||
|
|
||||||
_.each(
|
_.each(
|
||||||
@ -257,10 +257,8 @@ const LayoutManager = new Class(
|
|||||||
function (node) {
|
function (node) {
|
||||||
if (node.hasOrderChanged() || node.hasPositionChanged()) {
|
if (node.hasOrderChanged() || node.hasPositionChanged()) {
|
||||||
// Find or create a event ...
|
// Find or create a event ...
|
||||||
var id = node.getId();
|
const id = node.getId();
|
||||||
var event = this._events.some(function (event) {
|
let event = this._events.some((event) => event.id == id);
|
||||||
return event.id == id;
|
|
||||||
});
|
|
||||||
if (!event) {
|
if (!event) {
|
||||||
event = new ChangeEvent(id);
|
event = new ChangeEvent(id);
|
||||||
}
|
}
|
||||||
@ -276,10 +274,10 @@ const LayoutManager = new Class(
|
|||||||
}
|
}
|
||||||
this._collectChanges(this._treeSet.getChildren(node));
|
this._collectChanges(this._treeSet.getChildren(node));
|
||||||
},
|
},
|
||||||
this
|
this,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
export default LayoutManager;
|
export default LayoutManager;
|
||||||
|
@ -29,7 +29,7 @@ const Node = new Class(
|
|||||||
* @throws will throw an error if position is null or undefined
|
* @throws will throw an error if position is null or undefined
|
||||||
* @throws will throw an error if sorter is null or undefined
|
* @throws will throw an error if sorter is null or undefined
|
||||||
*/
|
*/
|
||||||
initialize: function (id, size, position, sorter) {
|
initialize(id, size, position, sorter) {
|
||||||
$assert(typeof id === 'number' && isFinite(id), 'id can not be null');
|
$assert(typeof id === 'number' && isFinite(id), 'id can not be null');
|
||||||
$assert(size, 'size can not be null');
|
$assert(size, 'size can not be null');
|
||||||
$assert(position, 'position can not be null');
|
$assert(position, 'position can not be null');
|
||||||
@ -45,116 +45,116 @@ const Node = new Class(
|
|||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getId: function () {
|
getId() {
|
||||||
return this._id;
|
return this._id;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setFree: function (value) {
|
setFree(value) {
|
||||||
this._setProperty('free', value);
|
this._setProperty('free', value);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
isFree: function () {
|
isFree() {
|
||||||
return this._getProperty('free');
|
return this._getProperty('free');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
hasFreeChanged: function () {
|
hasFreeChanged() {
|
||||||
return this._isPropertyChanged('free');
|
return this._isPropertyChanged('free');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
hasFreeDisplacementChanged: function () {
|
hasFreeDisplacementChanged() {
|
||||||
return this._isPropertyChanged('freeDisplacement');
|
return this._isPropertyChanged('freeDisplacement');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setShrunken: function (value) {
|
setShrunken(value) {
|
||||||
this._setProperty('shrink', value);
|
this._setProperty('shrink', value);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
areChildrenShrunken: function () {
|
areChildrenShrunken() {
|
||||||
return this._getProperty('shrink');
|
return this._getProperty('shrink');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setOrder: function (order) {
|
setOrder(order) {
|
||||||
$assert(
|
$assert(
|
||||||
typeof order === 'number' && isFinite(order),
|
typeof order === 'number' && isFinite(order),
|
||||||
'Order can not be null. Value:' + order
|
`Order can not be null. Value:${order}`,
|
||||||
);
|
);
|
||||||
this._setProperty('order', order);
|
this._setProperty('order', order);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
resetPositionState: function () {
|
resetPositionState() {
|
||||||
var prop = this._properties['position'];
|
const prop = this._properties.position;
|
||||||
if (prop) {
|
if (prop) {
|
||||||
prop.hasChanged = false;
|
prop.hasChanged = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
resetOrderState: function () {
|
resetOrderState() {
|
||||||
var prop = this._properties['order'];
|
const prop = this._properties.order;
|
||||||
if (prop) {
|
if (prop) {
|
||||||
prop.hasChanged = false;
|
prop.hasChanged = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
resetFreeState: function () {
|
resetFreeState() {
|
||||||
var prop = this._properties['freeDisplacement'];
|
const prop = this._properties.freeDisplacement;
|
||||||
if (prop) {
|
if (prop) {
|
||||||
prop.hasChanged = false;
|
prop.hasChanged = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getOrder: function () {
|
getOrder() {
|
||||||
return this._getProperty('order');
|
return this._getProperty('order');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
hasOrderChanged: function () {
|
hasOrderChanged() {
|
||||||
return this._isPropertyChanged('order');
|
return this._isPropertyChanged('order');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
hasPositionChanged: function () {
|
hasPositionChanged() {
|
||||||
return this._isPropertyChanged('position');
|
return this._isPropertyChanged('position');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
hasSizeChanged: function () {
|
hasSizeChanged() {
|
||||||
return this._isPropertyChanged('size');
|
return this._isPropertyChanged('size');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getPosition: function () {
|
getPosition() {
|
||||||
return this._getProperty('position');
|
return this._getProperty('position');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setSize: function (size) {
|
setSize(size) {
|
||||||
$assert($defined(size), 'Size can not be null');
|
$assert($defined(size), 'Size can not be null');
|
||||||
this._setProperty('size', Object.clone(size));
|
this._setProperty('size', Object.clone(size));
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getSize: function () {
|
getSize() {
|
||||||
return this._getProperty('size');
|
return this._getProperty('size');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setFreeDisplacement: function (displacement) {
|
setFreeDisplacement(displacement) {
|
||||||
$assert($defined(displacement), 'Position can not be null');
|
$assert($defined(displacement), 'Position can not be null');
|
||||||
$assert($defined(displacement.x), 'x can not be null');
|
$assert($defined(displacement.x), 'x can not be null');
|
||||||
$assert($defined(displacement.y), 'y can not be null');
|
$assert($defined(displacement.y), 'y can not be null');
|
||||||
var oldDisplacement = this.getFreeDisplacement();
|
const oldDisplacement = this.getFreeDisplacement();
|
||||||
var newDisplacement = {
|
const newDisplacement = {
|
||||||
x: oldDisplacement.x + displacement.x,
|
x: oldDisplacement.x + displacement.x,
|
||||||
y: oldDisplacement.y + displacement.y,
|
y: oldDisplacement.y + displacement.y,
|
||||||
};
|
};
|
||||||
@ -163,34 +163,33 @@ const Node = new Class(
|
|||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
resetFreeDisplacement: function () {
|
resetFreeDisplacement() {
|
||||||
this._setProperty('freeDisplacement', { x: 0, y: 0 });
|
this._setProperty('freeDisplacement', { x: 0, y: 0 });
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getFreeDisplacement: function () {
|
getFreeDisplacement() {
|
||||||
var freeDisplacement = this._getProperty('freeDisplacement');
|
const freeDisplacement = this._getProperty('freeDisplacement');
|
||||||
return freeDisplacement || { x: 0, y: 0 };
|
return freeDisplacement || { x: 0, y: 0 };
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setPosition: function (position) {
|
setPosition(position) {
|
||||||
$assert($defined(position), 'Position can not be null');
|
$assert($defined(position), 'Position can not be null');
|
||||||
$assert($defined(position.x), 'x can not be null');
|
$assert($defined(position.x), 'x can not be null');
|
||||||
$assert($defined(position.y), 'y can not be null');
|
$assert($defined(position.y), 'y can not be null');
|
||||||
|
|
||||||
// This is a performance improvement to avoid movements that really could be avoided.
|
// This is a performance improvement to avoid movements that really could be avoided.
|
||||||
var currentPos = this.getPosition();
|
const currentPos = this.getPosition();
|
||||||
if (
|
if (
|
||||||
currentPos == null ||
|
currentPos == null
|
||||||
Math.abs(currentPos.x - position.x) > 2 ||
|
|| Math.abs(currentPos.x - position.x) > 2
|
||||||
Math.abs(currentPos.y - position.y) > 2
|
|| Math.abs(currentPos.y - position.y) > 2
|
||||||
)
|
) this._setProperty('position', position);
|
||||||
this._setProperty('position', position);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_setProperty: function (key, value) {
|
_setProperty(key, value) {
|
||||||
var prop = this._properties[key];
|
let prop = this._properties[key];
|
||||||
if (!prop) {
|
if (!prop) {
|
||||||
prop = {
|
prop = {
|
||||||
hasChanged: false,
|
hasChanged: false,
|
||||||
@ -208,42 +207,42 @@ const Node = new Class(
|
|||||||
this._properties[key] = prop;
|
this._properties[key] = prop;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getProperty: function (key) {
|
_getProperty(key) {
|
||||||
var prop = this._properties[key];
|
const prop = this._properties[key];
|
||||||
return $defined(prop) ? prop.value : null;
|
return $defined(prop) ? prop.value : null;
|
||||||
},
|
},
|
||||||
|
|
||||||
_isPropertyChanged: function (key) {
|
_isPropertyChanged(key) {
|
||||||
var prop = this._properties[key];
|
const prop = this._properties[key];
|
||||||
return prop ? prop.hasChanged : false;
|
return prop ? prop.hasChanged : false;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getSorter: function () {
|
getSorter() {
|
||||||
return this._sorter;
|
return this._sorter;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @return {String} returns id, order, position, size and shrink information*/
|
/** @return {String} returns id, order, position, size and shrink information */
|
||||||
toString: function () {
|
toString() {
|
||||||
return (
|
return (
|
||||||
'[id:' +
|
`[id:${
|
||||||
this.getId() +
|
this.getId()
|
||||||
', order:' +
|
}, order:${
|
||||||
this.getOrder() +
|
this.getOrder()
|
||||||
', position: {' +
|
}, position: {${
|
||||||
this.getPosition().x +
|
this.getPosition().x
|
||||||
',' +
|
},${
|
||||||
this.getPosition().y +
|
this.getPosition().y
|
||||||
'}, size: {' +
|
}}, size: {${
|
||||||
this.getSize().width +
|
this.getSize().width
|
||||||
',' +
|
},${
|
||||||
this.getSize().height +
|
this.getSize().height
|
||||||
'}, shrink:' +
|
}}, shrink:${
|
||||||
this.areChildrenShrunken() +
|
this.areChildrenShrunken()
|
||||||
']'
|
}]`
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
export default Node;
|
export default Node;
|
||||||
|
@ -26,29 +26,28 @@ const OriginalLayout = new Class(
|
|||||||
* @constructs
|
* @constructs
|
||||||
* @param treeSet
|
* @param treeSet
|
||||||
*/
|
*/
|
||||||
initialize: function (treeSet) {
|
initialize(treeSet) {
|
||||||
this._treeSet = treeSet;
|
this._treeSet = treeSet;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
createNode: function (id, size, position, type) {
|
createNode(id, size, position, type) {
|
||||||
$assert($defined(id), 'id can not be null');
|
$assert($defined(id), 'id can not be null');
|
||||||
$assert(size, 'size can not be null');
|
$assert(size, 'size can not be null');
|
||||||
$assert(position, 'position can not be null');
|
$assert(position, 'position can not be null');
|
||||||
$assert(type, 'type can not be null');
|
$assert(type, 'type can not be null');
|
||||||
|
|
||||||
var strategy =
|
const strategy = type === 'root' ? OriginalLayout.BALANCED_SORTER : OriginalLayout.SYMMETRIC_SORTER;
|
||||||
type === 'root' ? OriginalLayout.BALANCED_SORTER : OriginalLayout.SYMMETRIC_SORTER;
|
|
||||||
return new Node(id, size, position, strategy);
|
return new Node(id, size, position, strategy);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
connectNode: function (parentId, childId, order) {
|
connectNode(parentId, childId, order) {
|
||||||
var parent = this._treeSet.find(parentId);
|
const parent = this._treeSet.find(parentId);
|
||||||
var child = this._treeSet.find(childId);
|
const child = this._treeSet.find(childId);
|
||||||
|
|
||||||
// Insert the new node ...
|
// Insert the new node ...
|
||||||
var sorter = parent.getSorter();
|
const sorter = parent.getSorter();
|
||||||
sorter.insert(this._treeSet, parent, child, order);
|
sorter.insert(this._treeSet, parent, child, order);
|
||||||
|
|
||||||
// Connect the new node ...
|
// Connect the new node ...
|
||||||
@ -59,9 +58,9 @@ const OriginalLayout = new Class(
|
|||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
disconnectNode: function (nodeId) {
|
disconnectNode(nodeId) {
|
||||||
var node = this._treeSet.find(nodeId);
|
const node = this._treeSet.find(nodeId);
|
||||||
var parent = this._treeSet.getParent(node);
|
const parent = this._treeSet.getParent(node);
|
||||||
$assert(parent, 'Node already disconnected');
|
$assert(parent, 'Node already disconnected');
|
||||||
|
|
||||||
// Make it fixed
|
// Make it fixed
|
||||||
@ -69,7 +68,7 @@ const OriginalLayout = new Class(
|
|||||||
node.resetFreeDisplacement();
|
node.resetFreeDisplacement();
|
||||||
|
|
||||||
// Remove from children list.
|
// Remove from children list.
|
||||||
var sorter = parent.getSorter();
|
const sorter = parent.getSorter();
|
||||||
sorter.detach(this._treeSet, node);
|
sorter.detach(this._treeSet, node);
|
||||||
|
|
||||||
// Disconnect the new node ...
|
// Disconnect the new node ...
|
||||||
@ -80,57 +79,53 @@ const OriginalLayout = new Class(
|
|||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
layout: function () {
|
layout() {
|
||||||
var roots = this._treeSet.getTreeRoots();
|
const roots = this._treeSet.getTreeRoots();
|
||||||
_.each(
|
_.each(
|
||||||
roots,
|
roots,
|
||||||
function (node) {
|
function (node) {
|
||||||
// Calculate all node heights ...
|
// Calculate all node heights ...
|
||||||
var sorter = node.getSorter();
|
const sorter = node.getSorter();
|
||||||
|
|
||||||
var heightById = sorter.computeChildrenIdByHeights(this._treeSet, node);
|
const heightById = sorter.computeChildrenIdByHeights(this._treeSet, node);
|
||||||
|
|
||||||
this._layoutChildren(node, heightById);
|
this._layoutChildren(node, heightById);
|
||||||
|
|
||||||
this._fixOverlapping(node, heightById);
|
this._fixOverlapping(node, heightById);
|
||||||
},
|
},
|
||||||
this
|
this,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
_layoutChildren: function (node, heightById) {
|
_layoutChildren(node, heightById) {
|
||||||
var nodeId = node.getId();
|
const nodeId = node.getId();
|
||||||
var children = this._treeSet.getChildren(node);
|
const children = this._treeSet.getChildren(node);
|
||||||
var parent = this._treeSet.getParent(node);
|
const parent = this._treeSet.getParent(node);
|
||||||
var childrenOrderMoved = children.some(function (child) {
|
const childrenOrderMoved = children.some((child) => child.hasOrderChanged());
|
||||||
return child.hasOrderChanged();
|
const childrenSizeChanged = children.some((child) => child.hasSizeChanged());
|
||||||
});
|
|
||||||
var childrenSizeChanged = children.some(function (child) {
|
|
||||||
return child.hasSizeChanged();
|
|
||||||
});
|
|
||||||
|
|
||||||
// If ether any of the nodes has been changed of position or the height of the children is not
|
// If ether any of the nodes has been changed of position or the height of the children is not
|
||||||
// the same, children nodes must be repositioned ....
|
// the same, children nodes must be repositioned ....
|
||||||
var newBranchHeight = heightById[nodeId];
|
const newBranchHeight = heightById[nodeId];
|
||||||
|
|
||||||
var parentHeightChanged = $defined(parent) ? parent._heightChanged : false;
|
const parentHeightChanged = $defined(parent) ? parent._heightChanged : false;
|
||||||
var heightChanged = node._branchHeight != newBranchHeight;
|
const heightChanged = node._branchHeight != newBranchHeight;
|
||||||
node._heightChanged = heightChanged || parentHeightChanged;
|
node._heightChanged = heightChanged || parentHeightChanged;
|
||||||
|
|
||||||
if (childrenOrderMoved || childrenSizeChanged || heightChanged || parentHeightChanged) {
|
if (childrenOrderMoved || childrenSizeChanged || heightChanged || parentHeightChanged) {
|
||||||
var sorter = node.getSorter();
|
const sorter = node.getSorter();
|
||||||
var offsetById = sorter.computeOffsets(this._treeSet, node);
|
const offsetById = sorter.computeOffsets(this._treeSet, node);
|
||||||
var parentPosition = node.getPosition();
|
const parentPosition = node.getPosition();
|
||||||
var me = this;
|
const me = this;
|
||||||
_.each(children, function (child) {
|
_.each(children, (child) => {
|
||||||
var offset = offsetById[child.getId()];
|
const offset = offsetById[child.getId()];
|
||||||
|
|
||||||
var childFreeDisplacement = child.getFreeDisplacement();
|
const childFreeDisplacement = child.getFreeDisplacement();
|
||||||
var direction = node.getSorter().getChildDirection(me._treeSet, child);
|
const direction = node.getSorter().getChildDirection(me._treeSet, child);
|
||||||
|
|
||||||
if (
|
if (
|
||||||
(direction > 0 && childFreeDisplacement.x < 0) ||
|
(direction > 0 && childFreeDisplacement.x < 0)
|
||||||
(direction < 0 && childFreeDisplacement.x > 0)
|
|| (direction < 0 && childFreeDisplacement.x > 0)
|
||||||
) {
|
) {
|
||||||
child.resetFreeDisplacement();
|
child.resetFreeDisplacement();
|
||||||
child.setFreeDisplacement({
|
child.setFreeDisplacement({
|
||||||
@ -142,10 +137,10 @@ const OriginalLayout = new Class(
|
|||||||
offset.x += child.getFreeDisplacement().x;
|
offset.x += child.getFreeDisplacement().x;
|
||||||
offset.y += child.getFreeDisplacement().y;
|
offset.y += child.getFreeDisplacement().y;
|
||||||
|
|
||||||
var parentX = parentPosition.x;
|
const parentX = parentPosition.x;
|
||||||
var parentY = parentPosition.y;
|
const parentY = parentPosition.y;
|
||||||
|
|
||||||
var newPos = {
|
const newPos = {
|
||||||
x: parentX + offset.x,
|
x: parentX + offset.x,
|
||||||
y: parentY + offset.y + me._calculateAlignOffset(node, child, heightById),
|
y: parentY + offset.y + me._calculateAlignOffset(node, child, heightById),
|
||||||
};
|
};
|
||||||
@ -161,28 +156,27 @@ const OriginalLayout = new Class(
|
|||||||
function (child) {
|
function (child) {
|
||||||
this._layoutChildren(child, heightById);
|
this._layoutChildren(child, heightById);
|
||||||
},
|
},
|
||||||
this
|
this,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
_calculateAlignOffset: function (node, child, heightById) {
|
_calculateAlignOffset(node, child, heightById) {
|
||||||
if (child.isFree()) {
|
if (child.isFree()) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
var offset = 0;
|
let offset = 0;
|
||||||
|
|
||||||
var nodeHeight = node.getSize().height;
|
const nodeHeight = node.getSize().height;
|
||||||
var childHeight = child.getSize().height;
|
const childHeight = child.getSize().height;
|
||||||
|
|
||||||
if (
|
if (
|
||||||
this._treeSet.isStartOfSubBranch(child) &&
|
this._treeSet.isStartOfSubBranch(child)
|
||||||
this._branchIsTaller(child, heightById)
|
&& this._branchIsTaller(child, heightById)
|
||||||
) {
|
) {
|
||||||
if (this._treeSet.hasSinglePathToSingleLeaf(child)) {
|
if (this._treeSet.hasSinglePathToSingleLeaf(child)) {
|
||||||
offset =
|
offset = heightById[child.getId()] / 2
|
||||||
heightById[child.getId()] / 2 -
|
- (childHeight + child.getSorter()._getVerticalPadding() * 2) / 2;
|
||||||
(childHeight + child.getSorter()._getVerticalPadding() * 2) / 2;
|
|
||||||
} else {
|
} else {
|
||||||
offset = this._treeSet.isLeaf(child) ? 0 : -(childHeight - nodeHeight) / 2;
|
offset = this._treeSet.isLeaf(child) ? 0 : -(childHeight - nodeHeight) / 2;
|
||||||
}
|
}
|
||||||
@ -203,15 +197,15 @@ const OriginalLayout = new Class(
|
|||||||
return offset;
|
return offset;
|
||||||
},
|
},
|
||||||
|
|
||||||
_branchIsTaller: function (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: function (node, heightById) {
|
_fixOverlapping(node, heightById) {
|
||||||
var children = this._treeSet.getChildren(node);
|
const children = this._treeSet.getChildren(node);
|
||||||
|
|
||||||
if (node.isFree()) {
|
if (node.isFree()) {
|
||||||
this._shiftBranches(node, heightById);
|
this._shiftBranches(node, heightById);
|
||||||
@ -222,66 +216,64 @@ const OriginalLayout = new Class(
|
|||||||
function (child) {
|
function (child) {
|
||||||
this._fixOverlapping(child, heightById);
|
this._fixOverlapping(child, heightById);
|
||||||
},
|
},
|
||||||
this
|
this,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
_shiftBranches: function (node, heightById) {
|
_shiftBranches(node, heightById) {
|
||||||
var shiftedBranches = [node];
|
const shiftedBranches = [node];
|
||||||
|
|
||||||
var siblingsToShift = this._treeSet.getSiblingsInVerticalDirection(
|
const siblingsToShift = this._treeSet.getSiblingsInVerticalDirection(
|
||||||
node,
|
node,
|
||||||
node.getFreeDisplacement().y
|
node.getFreeDisplacement().y,
|
||||||
);
|
);
|
||||||
var last = node;
|
let last = node;
|
||||||
_.each(
|
_.each(
|
||||||
siblingsToShift,
|
siblingsToShift,
|
||||||
function (sibling) {
|
function (sibling) {
|
||||||
var overlappingOccurs = shiftedBranches.some(function (shiftedBranch) {
|
const overlappingOccurs = shiftedBranches.some(function (shiftedBranch) {
|
||||||
return this._branchesOverlap(shiftedBranch, sibling, heightById);
|
return this._branchesOverlap(shiftedBranch, sibling, heightById);
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
if (!sibling.isFree() || overlappingOccurs) {
|
if (!sibling.isFree() || overlappingOccurs) {
|
||||||
var sAmount = node.getFreeDisplacement().y;
|
const sAmount = node.getFreeDisplacement().y;
|
||||||
this._treeSet.shiftBranchPosition(sibling, 0, sAmount);
|
this._treeSet.shiftBranchPosition(sibling, 0, sAmount);
|
||||||
shiftedBranches.push(sibling);
|
shiftedBranches.push(sibling);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
this
|
this,
|
||||||
);
|
);
|
||||||
|
|
||||||
var branchesToShift = this._treeSet
|
const branchesToShift = this._treeSet
|
||||||
.getBranchesInVerticalDirection(node, node.getFreeDisplacement().y)
|
.getBranchesInVerticalDirection(node, node.getFreeDisplacement().y)
|
||||||
.filter(function (branch) {
|
.filter((branch) => !shiftedBranches.contains(branch));
|
||||||
return !shiftedBranches.contains(branch);
|
|
||||||
});
|
|
||||||
|
|
||||||
_.each(
|
_.each(
|
||||||
branchesToShift,
|
branchesToShift,
|
||||||
function (branch) {
|
function (branch) {
|
||||||
var bAmount = node.getFreeDisplacement().y;
|
const bAmount = node.getFreeDisplacement().y;
|
||||||
this._treeSet.shiftBranchPosition(branch, 0, bAmount);
|
this._treeSet.shiftBranchPosition(branch, 0, bAmount);
|
||||||
shiftedBranches.push(branch);
|
shiftedBranches.push(branch);
|
||||||
last = branch;
|
last = branch;
|
||||||
},
|
},
|
||||||
this
|
this,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
_branchesOverlap: function (branchA, branchB, heightById) {
|
_branchesOverlap(branchA, branchB, heightById) {
|
||||||
// a branch doesn't really overlap with itself
|
// a branch doesn't really overlap with itself
|
||||||
if (branchA == branchB) {
|
if (branchA == branchB) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var topA = branchA.getPosition().y - heightById[branchA.getId()] / 2;
|
const topA = branchA.getPosition().y - heightById[branchA.getId()] / 2;
|
||||||
var bottomA = branchA.getPosition().y + heightById[branchA.getId()] / 2;
|
const bottomA = branchA.getPosition().y + heightById[branchA.getId()] / 2;
|
||||||
var topB = branchB.getPosition().y - heightById[branchB.getId()] / 2;
|
const topB = branchB.getPosition().y - heightById[branchB.getId()] / 2;
|
||||||
var 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);
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
const RootedTreeSet = new Class(
|
const RootedTreeSet = new Class(
|
||||||
/** @lends RootedTreeSet */ {
|
/** @lends RootedTreeSet */ {
|
||||||
/** @constructs */
|
/** @constructs */
|
||||||
initialize: function () {
|
initialize() {
|
||||||
this._rootNodes = [];
|
this._rootNodes = [];
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -27,17 +27,17 @@ const RootedTreeSet = new Class(
|
|||||||
* @param root
|
* @param root
|
||||||
* @throws will throw an error if root is null or undefined
|
* @throws will throw an error if root is null or undefined
|
||||||
*/
|
*/
|
||||||
setRoot: function (root) {
|
setRoot(root) {
|
||||||
$assert(root, 'root can not be null');
|
$assert(root, 'root can not be null');
|
||||||
this._rootNodes.push(this._decodate(root));
|
this._rootNodes.push(this._decodate(root));
|
||||||
},
|
},
|
||||||
|
|
||||||
/** getter */
|
/** getter */
|
||||||
getTreeRoots: function () {
|
getTreeRoots() {
|
||||||
return this._rootNodes;
|
return this._rootNodes;
|
||||||
},
|
},
|
||||||
|
|
||||||
_decodate: function (node) {
|
_decodate(node) {
|
||||||
node._children = [];
|
node._children = [];
|
||||||
return node;
|
return node;
|
||||||
},
|
},
|
||||||
@ -48,11 +48,11 @@ const RootedTreeSet = new Class(
|
|||||||
* @throws will throw an error if node with id already exists
|
* @throws will throw an error if node with id already exists
|
||||||
* @throws will throw an error if node has been added already
|
* @throws will throw an error if node has been added already
|
||||||
*/
|
*/
|
||||||
add: function (node) {
|
add(node) {
|
||||||
$assert(node, 'node can not be null');
|
$assert(node, 'node can not be null');
|
||||||
$assert(
|
$assert(
|
||||||
!this.find(node.getId(), false),
|
!this.find(node.getId(), false),
|
||||||
'node already exits with this id. Id:' + node.getId()
|
`node already exits with this id. Id:${node.getId()}`,
|
||||||
);
|
);
|
||||||
$assert(!node._children, 'node already added');
|
$assert(!node._children, 'node already added');
|
||||||
this._rootNodes.push(this._decodate(node));
|
this._rootNodes.push(this._decodate(node));
|
||||||
@ -62,9 +62,9 @@ const RootedTreeSet = new Class(
|
|||||||
* @param nodeId
|
* @param nodeId
|
||||||
* @throws will throw an error if nodeId is null or undefined
|
* @throws will throw an error if nodeId is null or undefined
|
||||||
*/
|
*/
|
||||||
remove: function (nodeId) {
|
remove(nodeId) {
|
||||||
$assert($defined(nodeId), 'nodeId can not be null');
|
$assert($defined(nodeId), 'nodeId can not be null');
|
||||||
var node = this.find(nodeId);
|
const node = this.find(nodeId);
|
||||||
this._rootNodes.erase(node);
|
this._rootNodes.erase(node);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -75,15 +75,15 @@ const RootedTreeSet = new Class(
|
|||||||
* @throws will throw an error if childId is null or undefined
|
* @throws will throw an error if childId is null or undefined
|
||||||
* @throws will throw an error if node with id childId is already a child of parent
|
* @throws will throw an error if node with id childId is already a child of parent
|
||||||
*/
|
*/
|
||||||
connect: function (parentId, childId) {
|
connect(parentId, childId) {
|
||||||
$assert($defined(parentId), 'parent can not be null');
|
$assert($defined(parentId), 'parent can not be null');
|
||||||
$assert($defined(childId), 'child can not be null');
|
$assert($defined(childId), 'child can not be null');
|
||||||
|
|
||||||
var parent = this.find(parentId);
|
const parent = this.find(parentId);
|
||||||
var child = this.find(childId, true);
|
const child = this.find(childId, true);
|
||||||
$assert(
|
$assert(
|
||||||
!child._parent,
|
!child._parent,
|
||||||
'node already connected. Id:' + child.getId() + ',previous:' + child._parent
|
`node already connected. Id:${child.getId()},previous:${child._parent}`,
|
||||||
);
|
);
|
||||||
|
|
||||||
parent._children.push(child);
|
parent._children.push(child);
|
||||||
@ -96,9 +96,9 @@ const RootedTreeSet = new Class(
|
|||||||
* @throws will throw an error if nodeId is null or undefined
|
* @throws will throw an error if nodeId is null or undefined
|
||||||
* @throws will throw an error if node is not connected
|
* @throws will throw an error if node is not connected
|
||||||
*/
|
*/
|
||||||
disconnect: function (nodeId) {
|
disconnect(nodeId) {
|
||||||
$assert($defined(nodeId), 'nodeId can not be null');
|
$assert($defined(nodeId), 'nodeId can not be null');
|
||||||
var node = this.find(nodeId);
|
const node = this.find(nodeId);
|
||||||
$assert(node._parent, 'Node is not connected');
|
$assert(node._parent, 'Node is not connected');
|
||||||
|
|
||||||
node._parent._children.erase(node);
|
node._parent._children.erase(node);
|
||||||
@ -113,13 +113,13 @@ const RootedTreeSet = new Class(
|
|||||||
* @throws will throw an error if node cannot be found
|
* @throws will throw an error if node cannot be found
|
||||||
* @return node
|
* @return node
|
||||||
*/
|
*/
|
||||||
find: function (id, validate) {
|
find(id, validate) {
|
||||||
$assert($defined(id), 'id can not be null');
|
$assert($defined(id), 'id can not be null');
|
||||||
|
|
||||||
var graphs = this._rootNodes;
|
const graphs = this._rootNodes;
|
||||||
var result = null;
|
let result = null;
|
||||||
for (var i = 0; i < graphs.length; i++) {
|
for (let i = 0; i < graphs.length; i++) {
|
||||||
var node = graphs[i];
|
const node = graphs[i];
|
||||||
result = this._find(id, node);
|
result = this._find(id, node);
|
||||||
if (result) {
|
if (result) {
|
||||||
break;
|
break;
|
||||||
@ -128,20 +128,20 @@ const RootedTreeSet = new Class(
|
|||||||
validate = !$defined(validate) ? true : validate;
|
validate = !$defined(validate) ? true : validate;
|
||||||
$assert(
|
$assert(
|
||||||
validate ? result : true,
|
validate ? result : true,
|
||||||
'node could not be found id:' + id + '\n,RootedTreeSet' + this.dump()
|
`node could not be found id:${id}\n,RootedTreeSet${this.dump()}`,
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
_find: function (id, parent) {
|
_find(id, parent) {
|
||||||
if (parent.getId() == id) {
|
if (parent.getId() == id) {
|
||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
var result = null;
|
let result = null;
|
||||||
var children = parent._children;
|
const children = parent._children;
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
var child = children[i];
|
const child = children[i];
|
||||||
result = this._find(id, child);
|
result = this._find(id, child);
|
||||||
if (result) break;
|
if (result) break;
|
||||||
}
|
}
|
||||||
@ -154,7 +154,7 @@ const RootedTreeSet = new Class(
|
|||||||
* @throws will throw an error if nodeId is null or undefined
|
* @throws will throw an error if nodeId is null or undefined
|
||||||
* @return children
|
* @return children
|
||||||
*/
|
*/
|
||||||
getChildren: function (node) {
|
getChildren(node) {
|
||||||
$assert(node, 'node cannot be null');
|
$assert(node, 'node cannot be null');
|
||||||
return node._children;
|
return node._children;
|
||||||
},
|
},
|
||||||
@ -164,9 +164,9 @@ const RootedTreeSet = new Class(
|
|||||||
* @throws will throw an error if node is null or undefined
|
* @throws will throw an error if node is null or undefined
|
||||||
* @return root node or the provided node, if it has no parent
|
* @return root node or the provided node, if it has no parent
|
||||||
*/
|
*/
|
||||||
getRootNode: function (node) {
|
getRootNode(node) {
|
||||||
$assert(node, 'node cannot be null');
|
$assert(node, 'node cannot be null');
|
||||||
var parent = this.getParent(node);
|
const parent = this.getParent(node);
|
||||||
if ($defined(parent)) {
|
if ($defined(parent)) {
|
||||||
return this.getRootNode(parent);
|
return this.getRootNode(parent);
|
||||||
}
|
}
|
||||||
@ -177,14 +177,14 @@ const RootedTreeSet = new Class(
|
|||||||
/**
|
/**
|
||||||
* @param node
|
* @param node
|
||||||
* @throws will throw an error if node is null or undefined
|
* @throws will throw an error if node is null or undefined
|
||||||
* @return {Array} ancestors*/
|
* @return {Array} ancestors */
|
||||||
getAncestors: function (node) {
|
getAncestors(node) {
|
||||||
$assert(node, 'node cannot be null');
|
$assert(node, 'node cannot be null');
|
||||||
return this._getAncestors(this.getParent(node), []);
|
return this._getAncestors(this.getParent(node), []);
|
||||||
},
|
},
|
||||||
|
|
||||||
_getAncestors: function (node, ancestors) {
|
_getAncestors(node, ancestors) {
|
||||||
var result = ancestors;
|
const result = ancestors;
|
||||||
if (node) {
|
if (node) {
|
||||||
result.push(node);
|
result.push(node);
|
||||||
this._getAncestors(this.getParent(node), result);
|
this._getAncestors(this.getParent(node), result);
|
||||||
@ -197,14 +197,12 @@ const RootedTreeSet = new Class(
|
|||||||
* @throws will throw an error if node is null or undefined
|
* @throws will throw an error if node is null or undefined
|
||||||
* @return {Array} siblings
|
* @return {Array} siblings
|
||||||
*/
|
*/
|
||||||
getSiblings: function (node) {
|
getSiblings(node) {
|
||||||
$assert(node, 'node cannot be null');
|
$assert(node, 'node cannot be null');
|
||||||
if (!$defined(node._parent)) {
|
if (!$defined(node._parent)) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
var siblings = node._parent._children.filter(function (child) {
|
const siblings = node._parent._children.filter((child) => child != node);
|
||||||
return child != node;
|
|
||||||
});
|
|
||||||
return siblings;
|
return siblings;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -213,13 +211,13 @@ const RootedTreeSet = new Class(
|
|||||||
* @throws will throw an error if node is null or undefined
|
* @throws will throw an error if node is null or undefined
|
||||||
* @return {Boolean} whether the node has a single path to a single leaf (no branching)
|
* @return {Boolean} whether the node has a single path to a single leaf (no branching)
|
||||||
*/
|
*/
|
||||||
hasSinglePathToSingleLeaf: function (node) {
|
hasSinglePathToSingleLeaf(node) {
|
||||||
$assert(node, 'node cannot be null');
|
$assert(node, 'node cannot be null');
|
||||||
return this._hasSinglePathToSingleLeaf(node);
|
return this._hasSinglePathToSingleLeaf(node);
|
||||||
},
|
},
|
||||||
|
|
||||||
_hasSinglePathToSingleLeaf: function (node) {
|
_hasSinglePathToSingleLeaf(node) {
|
||||||
var children = this.getChildren(node);
|
const children = this.getChildren(node);
|
||||||
|
|
||||||
if (children.length == 1) {
|
if (children.length == 1) {
|
||||||
return this._hasSinglePathToSingleLeaf(children[0]);
|
return this._hasSinglePathToSingleLeaf(children[0]);
|
||||||
@ -230,8 +228,8 @@ const RootedTreeSet = new Class(
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param node
|
* @param node
|
||||||
* @return {Boolean} whether the node is the start of a subbranch*/
|
* @return {Boolean} whether the node is the start of a subbranch */
|
||||||
isStartOfSubBranch: function (node) {
|
isStartOfSubBranch(node) {
|
||||||
return this.getSiblings(node).length > 0 && this.getChildren(node).length == 1;
|
return this.getSiblings(node).length > 0 && this.getChildren(node).length == 1;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -240,7 +238,7 @@ const RootedTreeSet = new Class(
|
|||||||
* @throws will throw an error if node is null or undefined
|
* @throws will throw an error if node is null or undefined
|
||||||
* @return {Boolean} whether the node is a leaf
|
* @return {Boolean} whether the node is a leaf
|
||||||
*/
|
*/
|
||||||
isLeaf: function (node) {
|
isLeaf(node) {
|
||||||
$assert(node, 'node cannot be null');
|
$assert(node, 'node cannot be null');
|
||||||
return this.getChildren(node).length == 0;
|
return this.getChildren(node).length == 0;
|
||||||
},
|
},
|
||||||
@ -250,7 +248,7 @@ const RootedTreeSet = new Class(
|
|||||||
* @throws will throw an error if node is null or undefined
|
* @throws will throw an error if node is null or undefined
|
||||||
* @return parent
|
* @return parent
|
||||||
*/
|
*/
|
||||||
getParent: function (node) {
|
getParent(node) {
|
||||||
$assert(node, 'node cannot be null');
|
$assert(node, 'node cannot be null');
|
||||||
return node._parent;
|
return node._parent;
|
||||||
},
|
},
|
||||||
@ -258,22 +256,22 @@ const RootedTreeSet = new Class(
|
|||||||
/**
|
/**
|
||||||
* @return result
|
* @return result
|
||||||
*/
|
*/
|
||||||
dump: function () {
|
dump() {
|
||||||
var branches = this._rootNodes;
|
const branches = this._rootNodes;
|
||||||
var result = '';
|
let result = '';
|
||||||
for (var i = 0; i < branches.length; i++) {
|
for (let i = 0; i < branches.length; i++) {
|
||||||
var branch = branches[i];
|
const branch = branches[i];
|
||||||
result += this._dump(branch, '');
|
result += this._dump(branch, '');
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
_dump: function (node, indent) {
|
_dump(node, indent) {
|
||||||
var result = indent + node + '\n';
|
let result = `${indent + node}\n`;
|
||||||
var children = this.getChildren(node);
|
const children = this.getChildren(node);
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
var child = children[i];
|
const child = children[i];
|
||||||
result += this._dump(child, indent + ' ');
|
result += this._dump(child, `${indent} `);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -282,83 +280,83 @@ const RootedTreeSet = new Class(
|
|||||||
/**
|
/**
|
||||||
* @param canvas
|
* @param canvas
|
||||||
*/
|
*/
|
||||||
plot: function (canvas) {
|
plot(canvas) {
|
||||||
var branches = this._rootNodes;
|
const branches = this._rootNodes;
|
||||||
for (var i = 0; i < branches.length; i++) {
|
for (let i = 0; i < branches.length; i++) {
|
||||||
var branch = branches[i];
|
const branch = branches[i];
|
||||||
this._plot(canvas, branch);
|
this._plot(canvas, branch);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_plot: function (canvas, node, root) {
|
_plot(canvas, node, root) {
|
||||||
var children = this.getChildren(node);
|
const children = this.getChildren(node);
|
||||||
var cx = node.getPosition().x + canvas.width / 2 - node.getSize().width / 2;
|
const cx = node.getPosition().x + canvas.width / 2 - node.getSize().width / 2;
|
||||||
var cy = node.getPosition().y + canvas.height / 2 - node.getSize().height / 2;
|
const cy = node.getPosition().y + canvas.height / 2 - node.getSize().height / 2;
|
||||||
var rect = canvas.rect(cx, cy, node.getSize().width, node.getSize().height);
|
const rect = canvas.rect(cx, cy, node.getSize().width, node.getSize().height);
|
||||||
var order = node.getOrder() == null ? 'r' : node.getOrder();
|
const order = node.getOrder() == null ? 'r' : node.getOrder();
|
||||||
var text = canvas.text(
|
const text = canvas.text(
|
||||||
node.getPosition().x + canvas.width / 2,
|
node.getPosition().x + canvas.width / 2,
|
||||||
node.getPosition().y + canvas.height / 2,
|
node.getPosition().y + canvas.height / 2,
|
||||||
node.getId() + '[' + order + ']'
|
`${node.getId()}[${order}]`,
|
||||||
);
|
);
|
||||||
text.attr('fill', '#FFF');
|
text.attr('fill', '#FFF');
|
||||||
var fillColor = this._rootNodes.contains(node)
|
const fillColor = this._rootNodes.contains(node)
|
||||||
? '#000'
|
? '#000'
|
||||||
: node.isFree()
|
: node.isFree()
|
||||||
? '#abc'
|
? '#abc'
|
||||||
: '#c00';
|
: '#c00';
|
||||||
rect.attr('fill', fillColor);
|
rect.attr('fill', fillColor);
|
||||||
|
|
||||||
var rectPosition = {
|
const rectPosition = {
|
||||||
x: rect.attr('x') - canvas.width / 2 + rect.attr('width') / 2,
|
x: rect.attr('x') - canvas.width / 2 + rect.attr('width') / 2,
|
||||||
y: rect.attr('y') - canvas.height / 2 + rect.attr('height') / 2,
|
y: rect.attr('y') - canvas.height / 2 + rect.attr('height') / 2,
|
||||||
};
|
};
|
||||||
var rectSize = { width: rect.attr('width'), height: rect.attr('height') };
|
const rectSize = { width: rect.attr('width'), height: rect.attr('height') };
|
||||||
rect.click(function () {
|
rect.click(() => {
|
||||||
console.log(
|
console.log(
|
||||||
'[id:' +
|
`[id:${
|
||||||
node.getId() +
|
node.getId()
|
||||||
', order:' +
|
}, order:${
|
||||||
node.getOrder() +
|
node.getOrder()
|
||||||
', position:(' +
|
}, position:(${
|
||||||
rectPosition.x +
|
rectPosition.x
|
||||||
',' +
|
},${
|
||||||
rectPosition.y +
|
rectPosition.y
|
||||||
'), size:' +
|
}), size:${
|
||||||
rectSize.width +
|
rectSize.width
|
||||||
'x' +
|
}x${
|
||||||
rectSize.height +
|
rectSize.height
|
||||||
', freeDisplacement:(' +
|
}, freeDisplacement:(${
|
||||||
node.getFreeDisplacement().x +
|
node.getFreeDisplacement().x
|
||||||
',' +
|
},${
|
||||||
node.getFreeDisplacement().y +
|
node.getFreeDisplacement().y
|
||||||
')]'
|
})]`,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
text.click(function () {
|
text.click(() => {
|
||||||
console.log(
|
console.log(
|
||||||
'[id:' +
|
`[id:${
|
||||||
node.getId() +
|
node.getId()
|
||||||
', order:' +
|
}, order:${
|
||||||
node.getOrder() +
|
node.getOrder()
|
||||||
', position:(' +
|
}, position:(${
|
||||||
rectPosition.x +
|
rectPosition.x
|
||||||
',' +
|
},${
|
||||||
rectPosition.y +
|
rectPosition.y
|
||||||
'), size:' +
|
}), size:${
|
||||||
rectSize.width +
|
rectSize.width
|
||||||
'x' +
|
}x${
|
||||||
rectSize.height +
|
rectSize.height
|
||||||
', freeDisplacement:(' +
|
}, freeDisplacement:(${
|
||||||
node.getFreeDisplacement().x +
|
node.getFreeDisplacement().x
|
||||||
',' +
|
},${
|
||||||
node.getFreeDisplacement().y +
|
node.getFreeDisplacement().y
|
||||||
')]'
|
})]`,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
var child = children[i];
|
const child = children[i];
|
||||||
this._plot(canvas, child);
|
this._plot(canvas, child);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -367,16 +365,16 @@ const RootedTreeSet = new Class(
|
|||||||
* @param node
|
* @param node
|
||||||
* @param position
|
* @param position
|
||||||
*/
|
*/
|
||||||
updateBranchPosition: function (node, position) {
|
updateBranchPosition(node, position) {
|
||||||
var oldPos = node.getPosition();
|
const oldPos = node.getPosition();
|
||||||
node.setPosition(position);
|
node.setPosition(position);
|
||||||
|
|
||||||
var xOffset = oldPos.x - position.x;
|
const xOffset = oldPos.x - position.x;
|
||||||
var yOffset = oldPos.y - position.y;
|
const yOffset = oldPos.y - position.y;
|
||||||
|
|
||||||
var children = this.getChildren(node);
|
const children = this.getChildren(node);
|
||||||
var me = this;
|
const me = this;
|
||||||
_.each(children, function (child) {
|
_.each(children, (child) => {
|
||||||
me.shiftBranchPosition(child, xOffset, yOffset);
|
me.shiftBranchPosition(child, xOffset, yOffset);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -386,13 +384,13 @@ const RootedTreeSet = new Class(
|
|||||||
* @param xOffset
|
* @param xOffset
|
||||||
* @param yOffset
|
* @param yOffset
|
||||||
*/
|
*/
|
||||||
shiftBranchPosition: function (node, xOffset, yOffset) {
|
shiftBranchPosition(node, xOffset, yOffset) {
|
||||||
var position = node.getPosition();
|
const position = node.getPosition();
|
||||||
node.setPosition({ x: position.x + xOffset, y: position.y + yOffset });
|
node.setPosition({ x: position.x + xOffset, y: position.y + yOffset });
|
||||||
|
|
||||||
var children = this.getChildren(node);
|
const children = this.getChildren(node);
|
||||||
var me = this;
|
const me = this;
|
||||||
_.each(children, function (child) {
|
_.each(children, (child) => {
|
||||||
me.shiftBranchPosition(child, xOffset, yOffset);
|
me.shiftBranchPosition(child, xOffset, yOffset);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -402,16 +400,14 @@ const RootedTreeSet = new Class(
|
|||||||
* @param yOffset
|
* @param yOffset
|
||||||
* @return siblings in the offset (vertical) direction, i.e. with lower or higher order, respectively
|
* @return siblings in the offset (vertical) direction, i.e. with lower or higher order, respectively
|
||||||
*/
|
*/
|
||||||
getSiblingsInVerticalDirection: function (node, yOffset) {
|
getSiblingsInVerticalDirection(node, yOffset) {
|
||||||
// siblings with lower or higher order, depending on the direction of the offset and on the same side as their parent
|
// siblings with lower or higher order, depending on the direction of the offset and on the same side as their parent
|
||||||
var parent = this.getParent(node);
|
const parent = this.getParent(node);
|
||||||
var siblings = this.getSiblings(node).filter(function (sibling) {
|
const siblings = this.getSiblings(node).filter((sibling) => {
|
||||||
var sameSide =
|
const sameSide = node.getPosition().x > parent.getPosition().x
|
||||||
node.getPosition().x > parent.getPosition().x
|
|
||||||
? sibling.getPosition().x > parent.getPosition().x
|
? sibling.getPosition().x > parent.getPosition().x
|
||||||
: sibling.getPosition().x < parent.getPosition().x;
|
: sibling.getPosition().x < parent.getPosition().x;
|
||||||
var orderOK =
|
const orderOK = yOffset < 0
|
||||||
yOffset < 0
|
|
||||||
? sibling.getOrder() < node.getOrder()
|
? sibling.getOrder() < node.getOrder()
|
||||||
: sibling.getOrder() > node.getOrder();
|
: sibling.getOrder() > node.getOrder();
|
||||||
return orderOK && sameSide;
|
return orderOK && sameSide;
|
||||||
@ -430,22 +426,20 @@ const RootedTreeSet = new Class(
|
|||||||
* @return branches of the root node on the same side as the given node's, in the given
|
* @return branches of the root node on the same side as the given node's, in the given
|
||||||
* vertical direction
|
* vertical direction
|
||||||
*/
|
*/
|
||||||
getBranchesInVerticalDirection: function (node, yOffset) {
|
getBranchesInVerticalDirection(node, yOffset) {
|
||||||
// direct descendants of the root that do not contain the node and are on the same side
|
// direct descendants of the root that do not contain the node and are on the same side
|
||||||
// and on the direction of the offset
|
// and on the direction of the offset
|
||||||
var rootNode = this.getRootNode(node);
|
const rootNode = this.getRootNode(node);
|
||||||
var branches = this.getChildren(rootNode).filter(function (child) {
|
const branches = this.getChildren(rootNode).filter(function (child) {
|
||||||
return this._find(node.getId(), child);
|
return this._find(node.getId(), child);
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
var branch = branches[0];
|
const branch = branches[0];
|
||||||
var rootDescendants = this.getSiblings(branch).filter(function (sibling) {
|
const rootDescendants = this.getSiblings(branch).filter((sibling) => {
|
||||||
var sameSide =
|
const sameSide = node.getPosition().x > rootNode.getPosition().x
|
||||||
node.getPosition().x > rootNode.getPosition().x
|
|
||||||
? sibling.getPosition().x > rootNode.getPosition().x
|
? sibling.getPosition().x > rootNode.getPosition().x
|
||||||
: sibling.getPosition().x < rootNode.getPosition().x;
|
: sibling.getPosition().x < rootNode.getPosition().x;
|
||||||
var sameDirection =
|
const sameDirection = yOffset < 0
|
||||||
yOffset < 0
|
|
||||||
? sibling.getOrder() < branch.getOrder()
|
? sibling.getOrder() < branch.getOrder()
|
||||||
: sibling.getOrder() > branch.getOrder();
|
: sibling.getOrder() > branch.getOrder();
|
||||||
return sameSide && sameDirection;
|
return sameSide && sameDirection;
|
||||||
@ -453,7 +447,7 @@ const RootedTreeSet = new Class(
|
|||||||
|
|
||||||
return rootDescendants;
|
return rootDescendants;
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
export default RootedTreeSet;
|
export default RootedTreeSet;
|
||||||
|
@ -24,7 +24,7 @@ const SymmetricSorter = new Class(
|
|||||||
* @constructs
|
* @constructs
|
||||||
* @extends mindplot.layout.AbstractBasicSorter
|
* @extends mindplot.layout.AbstractBasicSorter
|
||||||
*/
|
*/
|
||||||
initialize: function () {},
|
initialize() {},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Predict the order and position of a dragged node.
|
* Predict the order and position of a dragged node.
|
||||||
@ -36,31 +36,29 @@ const SymmetricSorter = new Class(
|
|||||||
* @param free Free drag or not
|
* @param free Free drag or not
|
||||||
* @return {*}
|
* @return {*}
|
||||||
*/
|
*/
|
||||||
predict: function (graph, parent, node, position, free) {
|
predict(graph, parent, node, position, free) {
|
||||||
var self = this;
|
const self = this;
|
||||||
var rootNode = graph.getRootNode(parent);
|
const rootNode = graph.getRootNode(parent);
|
||||||
|
|
||||||
// If its a free node...
|
// If its a free node...
|
||||||
if (free) {
|
if (free) {
|
||||||
$assert(
|
$assert(
|
||||||
$defined(position),
|
$defined(position),
|
||||||
'position cannot be null for predict in free positioning'
|
'position cannot be null for predict in free positioning',
|
||||||
);
|
);
|
||||||
$assert($defined(node), 'node cannot be null for predict in free positioning');
|
$assert($defined(node), 'node cannot be null for predict in free positioning');
|
||||||
|
|
||||||
var direction = this._getRelativeDirection(
|
const direction = this._getRelativeDirection(
|
||||||
rootNode.getPosition(),
|
rootNode.getPosition(),
|
||||||
parent.getPosition()
|
parent.getPosition(),
|
||||||
);
|
);
|
||||||
var limitXPos =
|
const limitXPos = parent.getPosition().x
|
||||||
parent.getPosition().x +
|
+ direction
|
||||||
direction *
|
* (parent.getSize().width / 2
|
||||||
(parent.getSize().width / 2 +
|
+ node.getSize().width / 2
|
||||||
node.getSize().width / 2 +
|
+ SymmetricSorter.INTERNODE_HORIZONTAL_PADDING);
|
||||||
SymmetricSorter.INTERNODE_HORIZONTAL_PADDING);
|
|
||||||
|
|
||||||
var xPos =
|
const xPos = direction > 0
|
||||||
direction > 0
|
|
||||||
? position.x >= limitXPos
|
? position.x >= limitXPos
|
||||||
? position.x
|
? position.x
|
||||||
: limitXPos
|
: limitXPos
|
||||||
@ -73,16 +71,16 @@ const SymmetricSorter = new Class(
|
|||||||
|
|
||||||
// Its not a dragged node (it is being added)
|
// Its not a dragged node (it is being added)
|
||||||
if (!node) {
|
if (!node) {
|
||||||
var parentDirection = self._getRelativeDirection(
|
const parentDirection = self._getRelativeDirection(
|
||||||
rootNode.getPosition(),
|
rootNode.getPosition(),
|
||||||
parent.getPosition()
|
parent.getPosition(),
|
||||||
);
|
);
|
||||||
|
|
||||||
var position = {
|
var position = {
|
||||||
x:
|
x:
|
||||||
parent.getPosition().x +
|
parent.getPosition().x
|
||||||
parentDirection *
|
+ parentDirection
|
||||||
(parent.getSize().width + SymmetricSorter.INTERNODE_HORIZONTAL_PADDING),
|
* (parent.getSize().width + SymmetricSorter.INTERNODE_HORIZONTAL_PADDING),
|
||||||
y: parent.getPosition().y,
|
y: parent.getPosition().y,
|
||||||
};
|
};
|
||||||
return [graph.getChildren(parent).length, position];
|
return [graph.getChildren(parent).length, position];
|
||||||
@ -90,91 +88,87 @@ const SymmetricSorter = new Class(
|
|||||||
|
|
||||||
// If it is a dragged node...
|
// If it is a dragged node...
|
||||||
$assert($defined(position), 'position cannot be null for predict in dragging');
|
$assert($defined(position), 'position cannot be null for predict in dragging');
|
||||||
var nodeDirection = this._getRelativeDirection(
|
const nodeDirection = this._getRelativeDirection(
|
||||||
rootNode.getPosition(),
|
rootNode.getPosition(),
|
||||||
node.getPosition()
|
node.getPosition(),
|
||||||
);
|
);
|
||||||
var positionDirection = this._getRelativeDirection(rootNode.getPosition(), position);
|
const positionDirection = this._getRelativeDirection(rootNode.getPosition(), position);
|
||||||
var siblings = graph.getSiblings(node);
|
const siblings = graph.getSiblings(node);
|
||||||
|
|
||||||
// node has no siblings and its trying to reconnect to its own parent
|
// node has no siblings and its trying to reconnect to its own parent
|
||||||
var sameParent = parent == graph.getParent(node);
|
const sameParent = parent == graph.getParent(node);
|
||||||
if (siblings.length == 0 && nodeDirection == positionDirection && sameParent) {
|
if (siblings.length == 0 && nodeDirection == positionDirection && sameParent) {
|
||||||
return [node.getOrder(), node.getPosition()];
|
return [node.getOrder(), node.getPosition()];
|
||||||
}
|
}
|
||||||
|
|
||||||
var parentChildren = graph.getChildren(parent);
|
const parentChildren = graph.getChildren(parent);
|
||||||
|
|
||||||
if (parentChildren.length == 0) {
|
if (parentChildren.length == 0) {
|
||||||
// Fit as a child of the parent node...
|
// Fit as a child of the parent node...
|
||||||
var position = {
|
var position = {
|
||||||
x:
|
x:
|
||||||
parent.getPosition().x +
|
parent.getPosition().x
|
||||||
positionDirection *
|
+ positionDirection
|
||||||
(parent.getSize().width + SymmetricSorter.INTERNODE_HORIZONTAL_PADDING),
|
* (parent.getSize().width + SymmetricSorter.INTERNODE_HORIZONTAL_PADDING),
|
||||||
y: parent.getPosition().y,
|
y: parent.getPosition().y,
|
||||||
};
|
};
|
||||||
return [0, position];
|
return [0, position];
|
||||||
} else {
|
}
|
||||||
// Try to fit within ...
|
// Try to fit within ...
|
||||||
var result = null;
|
const result = null;
|
||||||
var last = parentChildren.getLast();
|
const last = parentChildren.getLast();
|
||||||
for (var i = 0; i < parentChildren.length; i++) {
|
for (let i = 0; i < parentChildren.length; i++) {
|
||||||
var parentChild = parentChildren[i];
|
const parentChild = parentChildren[i];
|
||||||
var nodeAfter = i + 1 == parentChild.length ? null : parentChildren[i + 1];
|
const nodeAfter = i + 1 == parentChild.length ? null : parentChildren[i + 1];
|
||||||
|
|
||||||
// Fit at the bottom
|
// Fit at the bottom
|
||||||
if (!nodeAfter && position.y > parentChild.getPosition().y) {
|
if (!nodeAfter && position.y > parentChild.getPosition().y) {
|
||||||
var order =
|
var order = graph.getParent(node) && graph.getParent(node).getId() == parent.getId()
|
||||||
graph.getParent(node) && graph.getParent(node).getId() == parent.getId()
|
|
||||||
? last.getOrder()
|
? last.getOrder()
|
||||||
: last.getOrder() + 1;
|
: last.getOrder() + 1;
|
||||||
var position = {
|
var position = {
|
||||||
x: parentChild.getPosition().x,
|
x: parentChild.getPosition().x,
|
||||||
y:
|
y:
|
||||||
parentChild.getPosition().y +
|
parentChild.getPosition().y
|
||||||
parentChild.getSize().height +
|
+ parentChild.getSize().height
|
||||||
SymmetricSorter.INTERNODE_VERTICAL_PADDING * 2,
|
+ SymmetricSorter.INTERNODE_VERTICAL_PADDING * 2,
|
||||||
};
|
};
|
||||||
return [order, position];
|
return [order, position];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fit after this node
|
// Fit after this node
|
||||||
if (
|
if (
|
||||||
nodeAfter &&
|
nodeAfter
|
||||||
position.y > parentChild.getPosition().y &&
|
&& position.y > parentChild.getPosition().y
|
||||||
position.y < nodeAfter.getPosition().y
|
&& position.y < nodeAfter.getPosition().y
|
||||||
) {
|
) {
|
||||||
if (
|
if (
|
||||||
nodeAfter.getId() == node.getId() ||
|
nodeAfter.getId() == node.getId()
|
||||||
parentChild.getId() == node.getId()
|
|| parentChild.getId() == node.getId()
|
||||||
) {
|
) {
|
||||||
return [node.getOrder(), node.getPosition()];
|
return [node.getOrder(), node.getPosition()];
|
||||||
} else {
|
}
|
||||||
var order =
|
var order = position.y > node.getPosition().y
|
||||||
position.y > node.getPosition().y
|
|
||||||
? nodeAfter.getOrder() - 1
|
? nodeAfter.getOrder() - 1
|
||||||
: parentChild.getOrder() + 1;
|
: parentChild.getOrder() + 1;
|
||||||
var position = {
|
var position = {
|
||||||
x: parentChild.getPosition().x,
|
x: parentChild.getPosition().x,
|
||||||
y:
|
y:
|
||||||
parentChild.getPosition().y +
|
parentChild.getPosition().y
|
||||||
(nodeAfter.getPosition().y - parentChild.getPosition().y) / 2,
|
+ (nodeAfter.getPosition().y - parentChild.getPosition().y) / 2,
|
||||||
};
|
};
|
||||||
return [order, position];
|
return [order, position];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Position wasn't below any node, so it must be fitted above the first
|
// Position wasn't below any node, so it must be fitted above the first
|
||||||
var first = parentChildren[0];
|
const first = parentChildren[0];
|
||||||
var position = {
|
var position = {
|
||||||
x: first.getPosition().x,
|
x: first.getPosition().x,
|
||||||
y:
|
y:
|
||||||
first.getPosition().y -
|
first.getPosition().y
|
||||||
first.getSize().height -
|
- first.getSize().height
|
||||||
SymmetricSorter.INTERNODE_VERTICAL_PADDING * 2,
|
- SymmetricSorter.INTERNODE_VERTICAL_PADDING * 2,
|
||||||
};
|
};
|
||||||
return [0, position];
|
return [0, position];
|
||||||
},
|
},
|
||||||
@ -186,16 +180,16 @@ const SymmetricSorter = new Class(
|
|||||||
* @param order
|
* @param order
|
||||||
* @throws will throw an error if the order is not strictly continuous
|
* @throws will throw an error if the order is not strictly continuous
|
||||||
*/
|
*/
|
||||||
insert: function (treeSet, parent, child, order) {
|
insert(treeSet, parent, child, order) {
|
||||||
var children = this._getSortedChildren(treeSet, parent);
|
const children = this._getSortedChildren(treeSet, parent);
|
||||||
$assert(
|
$assert(
|
||||||
order <= children.length,
|
order <= children.length,
|
||||||
'Order must be continues and can not have holes. Order:' + order
|
`Order must be continues and can not have holes. Order:${order}`,
|
||||||
);
|
);
|
||||||
|
|
||||||
// Shift all the elements in one .
|
// Shift all the elements in one .
|
||||||
for (var i = order; i < children.length; i++) {
|
for (let i = order; i < children.length; i++) {
|
||||||
var node = children[i];
|
const node = children[i];
|
||||||
node.setOrder(i + 1);
|
node.setOrder(i + 1);
|
||||||
}
|
}
|
||||||
child.setOrder(order);
|
child.setOrder(order);
|
||||||
@ -204,16 +198,16 @@ const SymmetricSorter = new Class(
|
|||||||
/**
|
/**
|
||||||
* @param treeSet
|
* @param treeSet
|
||||||
* @param node
|
* @param node
|
||||||
* @throws will throw an error if the node is in the wrong position*/
|
* @throws will throw an error if the node is in the wrong position */
|
||||||
detach: function (treeSet, node) {
|
detach(treeSet, node) {
|
||||||
var parent = treeSet.getParent(node);
|
const parent = treeSet.getParent(node);
|
||||||
var children = this._getSortedChildren(treeSet, parent);
|
const children = this._getSortedChildren(treeSet, parent);
|
||||||
var order = node.getOrder();
|
const order = node.getOrder();
|
||||||
$assert(children[order] === node, 'Node seems not to be in the right position');
|
$assert(children[order] === node, 'Node seems not to be in the right position');
|
||||||
|
|
||||||
// Shift all the nodes ...
|
// Shift all the nodes ...
|
||||||
for (var i = node.getOrder() + 1; i < children.length; i++) {
|
for (let i = node.getOrder() + 1; i < children.length; i++) {
|
||||||
var child = children[i];
|
const child = children[i];
|
||||||
child.setOrder(child.getOrder() - 1);
|
child.setOrder(child.getOrder() - 1);
|
||||||
}
|
}
|
||||||
node.setOrder(0);
|
node.setOrder(0);
|
||||||
@ -230,14 +224,14 @@ const SymmetricSorter = new Class(
|
|||||||
* value, is null or undefined
|
* value, is null or undefined
|
||||||
* @return offsets
|
* @return offsets
|
||||||
*/
|
*/
|
||||||
computeOffsets: function (treeSet, node) {
|
computeOffsets(treeSet, node) {
|
||||||
$assert(treeSet, 'treeSet can no be null.');
|
$assert(treeSet, 'treeSet can no be null.');
|
||||||
$assert(node, 'node can no be null.');
|
$assert(node, 'node can no be null.');
|
||||||
|
|
||||||
var children = this._getSortedChildren(treeSet, node);
|
const children = this._getSortedChildren(treeSet, node);
|
||||||
|
|
||||||
// Compute heights ...
|
// Compute heights ...
|
||||||
var heights = children
|
const heights = children
|
||||||
.map(function (child) {
|
.map(function (child) {
|
||||||
return {
|
return {
|
||||||
id: child.getId(),
|
id: child.getId(),
|
||||||
@ -250,25 +244,24 @@ const SymmetricSorter = new Class(
|
|||||||
.reverse();
|
.reverse();
|
||||||
|
|
||||||
// Compute the center of the branch ...
|
// Compute the center of the branch ...
|
||||||
var totalHeight = 0;
|
let totalHeight = 0;
|
||||||
_.each(heights, function (elem) {
|
_.each(heights, (elem) => {
|
||||||
totalHeight += elem.height;
|
totalHeight += elem.height;
|
||||||
});
|
});
|
||||||
var ysum = totalHeight / 2;
|
let ysum = totalHeight / 2;
|
||||||
|
|
||||||
// Calculate the offsets ...
|
// Calculate the offsets ...
|
||||||
var result = {};
|
const result = {};
|
||||||
for (var i = 0; i < heights.length; i++) {
|
for (let i = 0; i < heights.length; i++) {
|
||||||
ysum = ysum - heights[i].height;
|
ysum -= heights[i].height;
|
||||||
var childNode = treeSet.find(heights[i].id);
|
const childNode = treeSet.find(heights[i].id);
|
||||||
var direction = this.getChildDirection(treeSet, childNode);
|
const direction = this.getChildDirection(treeSet, childNode);
|
||||||
|
|
||||||
var yOffset = ysum + heights[i].height / 2;
|
const yOffset = ysum + heights[i].height / 2;
|
||||||
var xOffset =
|
const xOffset = direction
|
||||||
direction *
|
* (heights[i].width / 2
|
||||||
(heights[i].width / 2 +
|
+ node.getSize().width / 2
|
||||||
node.getSize().width / 2 +
|
+ SymmetricSorter.INTERNODE_HORIZONTAL_PADDING);
|
||||||
SymmetricSorter.INTERNODE_HORIZONTAL_PADDING);
|
|
||||||
|
|
||||||
$assert(!isNaN(xOffset), 'xOffset can not be null');
|
$assert(!isNaN(xOffset), 'xOffset can not be null');
|
||||||
$assert(!isNaN(yOffset), 'yOffset can not be null');
|
$assert(!isNaN(yOffset), 'yOffset can not be null');
|
||||||
@ -283,11 +276,11 @@ const SymmetricSorter = new Class(
|
|||||||
* @param node
|
* @param node
|
||||||
* @throws will throw an error if order elements are missing
|
* @throws will throw an error if order elements are missing
|
||||||
*/
|
*/
|
||||||
verify: function (treeSet, node) {
|
verify(treeSet, node) {
|
||||||
// Check that all is consistent ...
|
// Check that all is consistent ...
|
||||||
var children = this._getSortedChildren(treeSet, node);
|
const children = this._getSortedChildren(treeSet, node);
|
||||||
|
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
$assert(children[i].getOrder() == i, 'missing order elements');
|
$assert(children[i].getOrder() == i, 'missing order elements');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -295,35 +288,35 @@ const SymmetricSorter = new Class(
|
|||||||
/**
|
/**
|
||||||
* @param treeSet
|
* @param treeSet
|
||||||
* @param child
|
* @param child
|
||||||
* @return direction of the given child from its parent or from the root node, if isolated*/
|
* @return direction of the given child from its parent or from the root node, if isolated */
|
||||||
getChildDirection: function (treeSet, child) {
|
getChildDirection(treeSet, child) {
|
||||||
$assert(treeSet, 'treeSet can no be null.');
|
$assert(treeSet, 'treeSet can no be null.');
|
||||||
$assert(treeSet.getParent(child), 'This should not happen');
|
$assert(treeSet.getParent(child), 'This should not happen');
|
||||||
|
|
||||||
var result;
|
let result;
|
||||||
var rootNode = treeSet.getRootNode(child);
|
const rootNode = treeSet.getRootNode(child);
|
||||||
if (treeSet.getParent(child) == rootNode) {
|
if (treeSet.getParent(child) == rootNode) {
|
||||||
// This is the case of a isolated child ... In this case, the directions is based on the root.
|
// This is the case of a isolated child ... In this case, the directions is based on the root.
|
||||||
result = Math.sign(rootNode.getPosition().x);
|
result = Math.sign(rootNode.getPosition().x);
|
||||||
} else {
|
} else {
|
||||||
// if this is not the case, honor the direction of the parent ...
|
// if this is not the case, honor the direction of the parent ...
|
||||||
var parent = treeSet.getParent(child);
|
const parent = treeSet.getParent(child);
|
||||||
var grandParent = treeSet.getParent(parent);
|
const grandParent = treeSet.getParent(parent);
|
||||||
var sorter = grandParent.getSorter();
|
const sorter = grandParent.getSorter();
|
||||||
result = sorter.getChildDirection(treeSet, parent);
|
result = sorter.getChildDirection(treeSet, parent);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @return {String} the print name of this class */
|
/** @return {String} the print name of this class */
|
||||||
toString: function () {
|
toString() {
|
||||||
return 'Symmetric Sorter';
|
return 'Symmetric Sorter';
|
||||||
},
|
},
|
||||||
|
|
||||||
_getVerticalPadding: function () {
|
_getVerticalPadding() {
|
||||||
return SymmetricSorter.INTERNODE_VERTICAL_PADDING;
|
return SymmetricSorter.INTERNODE_VERTICAL_PADDING;
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,25 +1,25 @@
|
|||||||
const BootstrapDialog = require('./BootstrapDialog').default
|
const BootstrapDialog = require('./BootstrapDialog').default;
|
||||||
|
|
||||||
BootstrapDialog.Request = new Class({
|
BootstrapDialog.Request = new Class({
|
||||||
|
|
||||||
Extends: BootstrapDialog,
|
Extends: BootstrapDialog,
|
||||||
|
|
||||||
initialize: function(url, title, options) {
|
initialize(url, title, options) {
|
||||||
this.parent(title, options);
|
this.parent(title, options);
|
||||||
this.requestOptions = {};
|
this.requestOptions = {};
|
||||||
this.requestOptions.cache = false;
|
this.requestOptions.cache = false;
|
||||||
var me = this;
|
const me = this;
|
||||||
this.requestOptions.fail = function(xhr) {
|
this.requestOptions.fail = function (xhr) {
|
||||||
// Intercept form requests ...
|
// Intercept form requests ...
|
||||||
console.log("Failure:");
|
console.log('Failure:');
|
||||||
console.log(xhr);
|
console.log(xhr);
|
||||||
};
|
};
|
||||||
|
|
||||||
this.requestOptions.success = function() {
|
this.requestOptions.success = function () {
|
||||||
// Intercept form requests ...
|
// Intercept form requests ...
|
||||||
var forms = me._native.find('form');
|
const forms = me._native.find('form');
|
||||||
_.each(forms, function(form) {
|
_.each(forms, (form) => {
|
||||||
$(form).on('submit', function(event) {
|
$(form).on('submit', (event) => {
|
||||||
// Intercept form ...
|
// Intercept form ...
|
||||||
me.requestOptions.url = form.action;
|
me.requestOptions.url = form.action;
|
||||||
me.requestOptions.method = form.method ? form.method : 'post';
|
me.requestOptions.method = form.method ? form.method : 'post';
|
||||||
@ -30,8 +30,8 @@ BootstrapDialog.Request = new Class({
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
this._native.find('.modal-body').load(url, function () {
|
this._native.find('.modal-body').load(url, () => {
|
||||||
me.acceptButton.unbind('click').click(function () {
|
me.acceptButton.unbind('click').click(() => {
|
||||||
submitDialogForm();
|
submitDialogForm();
|
||||||
});
|
});
|
||||||
me._native.on('hidden.bs.modal', function () {
|
me._native.on('hidden.bs.modal', function () {
|
||||||
@ -41,11 +41,10 @@ BootstrapDialog.Request = new Class({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
onDialogShown: function() {
|
onDialogShown() {
|
||||||
if (typeof(onDialogShown) == "function") {
|
if (typeof (onDialogShown) === 'function') {
|
||||||
onDialogShown();
|
onDialogShown();
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -7,109 +7,109 @@ const BootstrapDialog = new Class({
|
|||||||
cancelButton: false,
|
cancelButton: false,
|
||||||
closeButton: false,
|
closeButton: false,
|
||||||
acceptButton: true,
|
acceptButton: true,
|
||||||
removeButton:false,
|
removeButton: false,
|
||||||
errorMessage: false,
|
errorMessage: false,
|
||||||
onEventData:{}
|
onEventData: {},
|
||||||
},
|
},
|
||||||
|
|
||||||
initialize: function (title, options) {
|
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>');
|
||||||
var content = $('<div class="modal-content"></div>');
|
const content = $('<div class="modal-content"></div>');
|
||||||
var header = this._buildHeader(title);
|
const header = this._buildHeader(title);
|
||||||
if (header) {
|
if (header) {
|
||||||
content.append(header);
|
content.append(header);
|
||||||
}
|
}
|
||||||
var body = $('<div class="modal-body"></div>');
|
const body = $('<div class="modal-body"></div>');
|
||||||
if(this.options.errorMessage){
|
if (this.options.errorMessage) {
|
||||||
var error = $('<div class="alert alert-danger"></div>');
|
const error = $('<div class="alert alert-danger"></div>');
|
||||||
error.hide();
|
error.hide();
|
||||||
body.append(error);
|
body.append(error);
|
||||||
}
|
}
|
||||||
content.append(body);
|
content.append(body);
|
||||||
var footer = this._buildFooter();
|
const footer = this._buildFooter();
|
||||||
if (footer) {
|
if (footer) {
|
||||||
content.append(footer);
|
content.append(footer);
|
||||||
}
|
}
|
||||||
this._native.find(".modal-dialog").append(content);
|
this._native.find('.modal-dialog').append(content);
|
||||||
this._native.on('hidden.bs.modal', function() {
|
this._native.on('hidden.bs.modal', function () {
|
||||||
$(this).remove();
|
$(this).remove();
|
||||||
});
|
});
|
||||||
this._native.on('shown.bs.modal', this.onDialogShown);
|
this._native.on('shown.bs.modal', this.onDialogShown);
|
||||||
},
|
},
|
||||||
|
|
||||||
_buildFooter: function() {
|
_buildFooter() {
|
||||||
var footer = null;
|
let footer = null;
|
||||||
if (this.options.acceptButton || this.options.removeButton || this.options.cancelButton) {
|
if (this.options.acceptButton || this.options.removeButton || this.options.cancelButton) {
|
||||||
footer = $('<div class="modal-footer" style="paddingTop:5;textAlign:center">');
|
footer = $('<div class="modal-footer" style="paddingTop:5;textAlign:center">');
|
||||||
}
|
}
|
||||||
if (this.options.acceptButton) {
|
if (this.options.acceptButton) {
|
||||||
this.acceptButton = $('<button type="button" class="btn btn-primary" id="acceptBtn" data-dismiss="modal">'+ $msg('ACCEPT') + '</button>');
|
this.acceptButton = $(`<button type="button" class="btn btn-primary" id="acceptBtn" data-dismiss="modal">${$msg('ACCEPT')}</button>`);
|
||||||
footer.append(this.acceptButton);
|
footer.append(this.acceptButton);
|
||||||
this.acceptButton.unbind('click').on("click",this.options.onEventData, this.onAcceptClick)
|
this.acceptButton.unbind('click').on('click', this.options.onEventData, this.onAcceptClick);
|
||||||
}
|
}
|
||||||
if (this.options.removeButton) {
|
if (this.options.removeButton) {
|
||||||
this.removeButton = $('<button type="button" class="btn btn-secondary" id="removeBtn" data-dismiss="modal">'+ $msg('REMOVE') +'</button>');
|
this.removeButton = $(`<button type="button" class="btn btn-secondary" id="removeBtn" data-dismiss="modal">${$msg('REMOVE')}</button>`);
|
||||||
footer.append(this.removeButton);
|
footer.append(this.removeButton);
|
||||||
this.removeButton.on('click', this.options.onEventData, this.onRemoveClick);
|
this.removeButton.on('click', this.options.onEventData, this.onRemoveClick);
|
||||||
}
|
}
|
||||||
if (this.options.cancelButton) {
|
if (this.options.cancelButton) {
|
||||||
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: function(title) {
|
_buildHeader(title) {
|
||||||
var header = null;
|
let header = null;
|
||||||
if (this.options.closeButton || title) {
|
if (this.options.closeButton || title) {
|
||||||
header = $('<div class="modal-header"></div>');
|
header = $('<div class="modal-header"></div>');
|
||||||
}
|
}
|
||||||
if (this.options.closeButton) {
|
if (this.options.closeButton) {
|
||||||
header.append(
|
header.append(
|
||||||
'<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>'
|
'<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (title) {
|
if (title) {
|
||||||
header.append('<h2 class="modal-title">' + title + '</h2>');
|
header.append(`<h2 class="modal-title">${title}</h2>`);
|
||||||
}
|
}
|
||||||
return header;
|
return header;
|
||||||
},
|
},
|
||||||
|
|
||||||
onAcceptClick: function(event) {
|
onAcceptClick(event) {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
onDialogShown: function() {},
|
onDialogShown() {},
|
||||||
onRemoveClick: function(event) {
|
onRemoveClick(event) {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
show: function () {
|
show() {
|
||||||
this._native.modal();
|
this._native.modal();
|
||||||
},
|
},
|
||||||
|
|
||||||
setContent: function(content) {
|
setContent(content) {
|
||||||
var modalBody = this._native.find('.modal-body');
|
const modalBody = this._native.find('.modal-body');
|
||||||
modalBody.append(content);
|
modalBody.append(content);
|
||||||
},
|
},
|
||||||
|
|
||||||
css: function(options){
|
css(options) {
|
||||||
this._native.find('.modal-dialog').css(options);
|
this._native.find('.modal-dialog').css(options);
|
||||||
},
|
},
|
||||||
|
|
||||||
close: function() {
|
close() {
|
||||||
this._native.modal('hide');
|
this._native.modal('hide');
|
||||||
},
|
},
|
||||||
|
|
||||||
alertError: function(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: function(){
|
cleanError() {
|
||||||
this._native.find('.alert-danger').hide();
|
this._native.find('.alert-danger').hide();
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default BootstrapDialog;
|
export default BootstrapDialog;
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -15,96 +15,158 @@
|
|||||||
* Might be useful, when you want to pass some other data to your handler
|
* Might be useful, when you want to pass some other data to your handler
|
||||||
*/
|
*/
|
||||||
|
|
||||||
(function(jQuery){
|
(function (jQuery) {
|
||||||
|
|
||||||
jQuery.hotkeys = {
|
jQuery.hotkeys = {
|
||||||
version: "0.8",
|
version: '0.8',
|
||||||
|
|
||||||
specialKeys: {
|
specialKeys: {
|
||||||
8: "backspace", 9: "tab", 10: "return", 13: "enter", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause",
|
8: 'backspace',
|
||||||
20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home",
|
9: 'tab',
|
||||||
37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del",
|
10: 'return',
|
||||||
96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7",
|
13: 'enter',
|
||||||
104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/",
|
16: 'shift',
|
||||||
112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8",
|
17: 'ctrl',
|
||||||
120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 186: ";", 191: "/",
|
18: 'alt',
|
||||||
220: "\\", 222: "'", 224: "meta"
|
19: 'pause',
|
||||||
|
20: 'capslock',
|
||||||
|
27: 'esc',
|
||||||
|
32: 'space',
|
||||||
|
33: 'pageup',
|
||||||
|
34: 'pagedown',
|
||||||
|
35: 'end',
|
||||||
|
36: 'home',
|
||||||
|
37: 'left',
|
||||||
|
38: 'up',
|
||||||
|
39: 'right',
|
||||||
|
40: 'down',
|
||||||
|
45: 'insert',
|
||||||
|
46: 'del',
|
||||||
|
96: '0',
|
||||||
|
97: '1',
|
||||||
|
98: '2',
|
||||||
|
99: '3',
|
||||||
|
100: '4',
|
||||||
|
101: '5',
|
||||||
|
102: '6',
|
||||||
|
103: '7',
|
||||||
|
104: '8',
|
||||||
|
105: '9',
|
||||||
|
106: '*',
|
||||||
|
107: '+',
|
||||||
|
109: '-',
|
||||||
|
110: '.',
|
||||||
|
111: '/',
|
||||||
|
112: 'f1',
|
||||||
|
113: 'f2',
|
||||||
|
114: 'f3',
|
||||||
|
115: 'f4',
|
||||||
|
116: 'f5',
|
||||||
|
117: 'f6',
|
||||||
|
118: 'f7',
|
||||||
|
119: 'f8',
|
||||||
|
120: 'f9',
|
||||||
|
121: 'f10',
|
||||||
|
122: 'f11',
|
||||||
|
123: 'f12',
|
||||||
|
144: 'numlock',
|
||||||
|
145: 'scroll',
|
||||||
|
186: ';',
|
||||||
|
191: '/',
|
||||||
|
220: '\\',
|
||||||
|
222: "'",
|
||||||
|
224: 'meta',
|
||||||
},
|
},
|
||||||
|
|
||||||
shiftNums: {
|
shiftNums: {
|
||||||
"`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&",
|
'`': '~',
|
||||||
"8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<",
|
1: '!',
|
||||||
".": ">", "/": "?", "\\": "|"
|
2: '@',
|
||||||
}
|
3: '#',
|
||||||
|
4: '$',
|
||||||
|
5: '%',
|
||||||
|
6: '^',
|
||||||
|
7: '&',
|
||||||
|
8: '*',
|
||||||
|
9: '(',
|
||||||
|
0: ')',
|
||||||
|
'-': '_',
|
||||||
|
'=': '+',
|
||||||
|
';': ': ',
|
||||||
|
"'": '"',
|
||||||
|
',': '<',
|
||||||
|
'.': '>',
|
||||||
|
'/': '?',
|
||||||
|
'\\': '|',
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
function keyHandler( handleObj ) {
|
function keyHandler(handleObj) {
|
||||||
if ( typeof handleObj.data === "string" ) {
|
if (typeof handleObj.data === 'string') {
|
||||||
handleObj.data = { keys: handleObj.data };
|
handleObj.data = { keys: handleObj.data };
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only care when a possible input has been specified
|
// Only care when a possible input has been specified
|
||||||
if ( !handleObj.data || !handleObj.data.keys || typeof handleObj.data.keys !== "string" ) {
|
if (!handleObj.data || !handleObj.data.keys || typeof handleObj.data.keys !== 'string') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var origHandler = handleObj.handler,
|
const origHandler = handleObj.handler;
|
||||||
keys = handleObj.data.keys.toLowerCase().split(" "),
|
const keys = handleObj.data.keys.toLowerCase().split(' ');
|
||||||
textAcceptingInputTypes = ["text", "password", "number", "email", "url", "range", "date", "month", "week", "time", "datetime", "datetime-local", "search", "color", "tel"];
|
const textAcceptingInputTypes = ['text', 'password', 'number', 'email', 'url', 'range', 'date', 'month', 'week', 'time', 'datetime', 'datetime-local', 'search', 'color', 'tel'];
|
||||||
|
|
||||||
handleObj.handler = function( event ) {
|
handleObj.handler = function (event) {
|
||||||
// Don't fire in text-accepting inputs that we didn't directly bind to
|
// Don't fire in text-accepting inputs that we didn't directly bind to
|
||||||
if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) ||
|
if (this !== event.target && (/textarea|select/i.test(event.target.nodeName)
|
||||||
jQuery.inArray(event.target.type, textAcceptingInputTypes) > -1 ) ) {
|
|| jQuery.inArray(event.target.type, textAcceptingInputTypes) > -1)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var special = jQuery.hotkeys.specialKeys[ event.keyCode ],
|
const special = jQuery.hotkeys.specialKeys[event.keyCode];
|
||||||
character = String.fromCharCode( event.which ).toLowerCase(),
|
const character = String.fromCharCode(event.which).toLowerCase();
|
||||||
modif = "", possible = {};
|
let modif = ''; const
|
||||||
|
possible = {};
|
||||||
|
|
||||||
// check combinations (alt|ctrl|shift+anything)
|
// check combinations (alt|ctrl|shift+anything)
|
||||||
if ( event.altKey && special !== "alt" ) {
|
if (event.altKey && special !== 'alt') {
|
||||||
modif += "alt+";
|
modif += 'alt+';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( event.ctrlKey && special !== "ctrl" ) {
|
if (event.ctrlKey && special !== 'ctrl') {
|
||||||
modif += "ctrl+";
|
modif += 'ctrl+';
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Need to make sure this works consistently across platforms
|
// TODO: Need to make sure this works consistently across platforms
|
||||||
if ( event.metaKey && !event.ctrlKey && special !== "meta" ) {
|
if (event.metaKey && !event.ctrlKey && special !== 'meta') {
|
||||||
modif += "meta+";
|
modif += 'meta+';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( event.shiftKey && special !== "shift" ) {
|
if (event.shiftKey && special !== 'shift') {
|
||||||
modif += "shift+";
|
modif += 'shift+';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( special ) {
|
if (special) {
|
||||||
possible[ modif + special ] = true;
|
possible[modif + special] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( character ) {
|
if (character) {
|
||||||
possible[ modif + character ] = true;
|
possible[modif + character] = true;
|
||||||
possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true;
|
possible[modif + jQuery.hotkeys.shiftNums[character]] = true;
|
||||||
|
|
||||||
// "$" can be triggered as "Shift+4" or "Shift+$" or just "$"
|
// "$" can be triggered as "Shift+4" or "Shift+$" or just "$"
|
||||||
if ( modif === "shift+" ) {
|
if (modif === 'shift+') {
|
||||||
possible[ jQuery.hotkeys.shiftNums[ character ] ] = true;
|
possible[jQuery.hotkeys.shiftNums[character]] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( var i = 0, l = keys.length; i < l; i++ ) {
|
for (let i = 0, l = keys.length; i < l; i++) {
|
||||||
if ( possible[ keys[i] ] ) {
|
if (possible[keys[i]]) {
|
||||||
return origHandler.apply( this, arguments );
|
return origHandler.apply(this, arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
jQuery.each([ "keydown", "keyup", "keypress" ], function() {
|
jQuery.each(['keydown', 'keyup', 'keypress'], function () {
|
||||||
jQuery.event.special[ this ] = { add: keyHandler };
|
jQuery.event.special[this] = { add: keyHandler };
|
||||||
});
|
});
|
||||||
|
}(this.jQuery));
|
||||||
})( this.jQuery );
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -5,4 +5,8 @@
|
|||||||
*
|
*
|
||||||
* Requires: jQuery 1.2.2+
|
* Requires: jQuery 1.2.2+
|
||||||
*/
|
*/
|
||||||
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a:a(jQuery)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type="mousewheel","detail"in g&&(m=-1*g.detail),"wheelDelta"in g&&(m=g.wheelDelta),"wheelDeltaY"in g&&(m=g.wheelDeltaY),"wheelDeltaX"in g&&(l=-1*g.wheelDeltaX),"axis"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,"deltaY"in g&&(m=-1*g.deltaY,j=m),"deltaX"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,"mousewheel-line-height");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,"mousewheel-page-height");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||f>n)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?"floor":"ceil"](j/f),l=Math[l>=1?"floor":"ceil"](l/f),m=Math[m>=1?"floor":"ceil"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&"mousewheel"===a.type&&b%120===0}var e,f,g=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],h="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:"3.1.11",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,"mousewheel-line-height",k.getLineHeight(this)),a.data(this,"mousewheel-page-height",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,"mousewheel-line-height"),a.removeData(this,"mousewheel-page-height")},getLineHeight:function(b){var c=a(b)["offsetParent"in a.fn?"offsetParent":"parent"]();return c.length||(c=a("body")),parseInt(c.css("fontSize"),10)},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})});
|
!(function (a) { typeof define === 'function' && define.amd ? define(['jquery'], a) : typeof exports === 'object' ? module.exports = a : a(jQuery); }((a) => {
|
||||||
|
function b(b) { const g = b || window.event; const h = i.call(arguments, 1); let j = 0; let l = 0; let m = 0; let n = 0; let o = 0; let p = 0; if (b = a.event.fix(g), b.type = 'mousewheel', 'detail' in g && (m = -1 * g.detail), 'wheelDelta' in g && (m = g.wheelDelta), 'wheelDeltaY' in g && (m = g.wheelDeltaY), 'wheelDeltaX' in g && (l = -1 * g.wheelDeltaX), 'axis' in g && g.axis === g.HORIZONTAL_AXIS && (l = -1 * m, m = 0), j = m === 0 ? l : m, 'deltaY' in g && (m = -1 * g.deltaY, j = m), 'deltaX' in g && (l = g.deltaX, m === 0 && (j = -1 * l)), m !== 0 || l !== 0) { if (g.deltaMode === 1) { const q = a.data(this, 'mousewheel-line-height'); j *= q, m *= q, l *= q; } else if (g.deltaMode === 2) { const r = a.data(this, 'mousewheel-page-height'); j *= r, m *= r, l *= r; } if (n = Math.max(Math.abs(m), Math.abs(l)), (!f || f > n) && (f = n, d(g, n) && (f /= 40)), d(g, n) && (j /= 40, l /= 40, m /= 40), j = Math[j >= 1 ? 'floor' : 'ceil'](j / f), l = Math[l >= 1 ? 'floor' : 'ceil'](l / f), m = Math[m >= 1 ? 'floor' : 'ceil'](m / f), k.settings.normalizeOffset && this.getBoundingClientRect) { const s = this.getBoundingClientRect(); o = b.clientX - s.left, p = b.clientY - s.top; } return b.deltaX = l, b.deltaY = m, b.deltaFactor = f, b.offsetX = o, b.offsetY = p, b.deltaMode = 0, h.unshift(b, j, l, m), e && clearTimeout(e), e = setTimeout(c, 200), (a.event.dispatch || a.event.handle).apply(this, h); } } function c() { f = null; } function d(a, b) { return k.settings.adjustOldDeltas && a.type === 'mousewheel' && b % 120 === 0; } let e; let f; const g = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll']; const h = 'onwheel' in document || document.documentMode >= 9 ? ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll']; var i = Array.prototype.slice; if (a.event.fixHooks) for (let j = g.length; j;)a.event.fixHooks[g[--j]] = a.event.mouseHooks; var k = a.event.special.mousewheel = {
|
||||||
|
version: '3.1.11', setup() { if (this.addEventListener) for (let c = h.length; c;) this.addEventListener(h[--c], b, !1); else this.onmousewheel = b; a.data(this, 'mousewheel-line-height', k.getLineHeight(this)), a.data(this, 'mousewheel-page-height', k.getPageHeight(this)); }, teardown() { if (this.removeEventListener) for (let c = h.length; c;) this.removeEventListener(h[--c], b, !1); else this.onmousewheel = null; a.removeData(this, 'mousewheel-line-height'), a.removeData(this, 'mousewheel-page-height'); }, getLineHeight(b) { let c = a(b)['offsetParent' in a.fn ? 'offsetParent' : 'parent'](); return c.length || (c = a('body')), parseInt(c.css('fontSize'), 10); }, getPageHeight(b) { return a(b).height(); }, settings: { adjustOldDeltas: !0, normalizeOffset: !0 },
|
||||||
|
}; a.fn.extend({ mousewheel(a) { return a ? this.bind('mousewheel', a) : this.trigger('mousewheel'); }, unmousewheel(a) { return this.unbind('mousewheel', a); } });
|
||||||
|
}));
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -17,29 +17,27 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
this.MooTools = {version: "1.4.5", build: "ab8ea8824dc3b24b6666867a2c4ed58ebb762cf0"};
|
this.MooTools = { version: '1.4.5', build: 'ab8ea8824dc3b24b6666867a2c4ed58ebb762cf0' };
|
||||||
var o = this.typeOf = function (i) {
|
const o = this.typeOf = function (i) {
|
||||||
if (i == null) {
|
if (i == null) {
|
||||||
return "null";
|
return 'null';
|
||||||
}
|
}
|
||||||
if (i.$family != null) {
|
if (i.$family != null) {
|
||||||
return i.$family();
|
return i.$family();
|
||||||
}
|
}
|
||||||
if (i.nodeName) {
|
if (i.nodeName) {
|
||||||
if (i.nodeType == 1) {
|
if (i.nodeType == 1) {
|
||||||
return "element";
|
return 'element';
|
||||||
}
|
}
|
||||||
if (i.nodeType == 3) {
|
if (i.nodeType == 3) {
|
||||||
return (/\S/).test(i.nodeValue) ? "textnode" : "whitespace";
|
return (/\S/).test(i.nodeValue) ? 'textnode' : 'whitespace';
|
||||||
}
|
}
|
||||||
} else {
|
} else if (typeof i.length === 'number') {
|
||||||
if (typeof i.length == "number") {
|
|
||||||
if (i.callee) {
|
if (i.callee) {
|
||||||
return "arguments";
|
return 'arguments';
|
||||||
}
|
|
||||||
if ("item" in i) {
|
|
||||||
return "collection";
|
|
||||||
}
|
}
|
||||||
|
if ('item' in i) {
|
||||||
|
return 'collection';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return typeof i;
|
return typeof i;
|
||||||
@ -48,7 +46,7 @@
|
|||||||
if (t == null) {
|
if (t == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
var s = t.$constructor || t.constructor;
|
let s = t.$constructor || t.constructor;
|
||||||
while (s) {
|
while (s) {
|
||||||
if (s === i) {
|
if (s === i) {
|
||||||
return true;
|
return true;
|
||||||
@ -60,26 +58,26 @@
|
|||||||
}
|
}
|
||||||
return t instanceof i;
|
return t instanceof i;
|
||||||
};
|
};
|
||||||
var f = this.Function;
|
const f = this.Function;
|
||||||
var p = true;
|
let p = true;
|
||||||
for (var k in {toString: 1}) {
|
for (const k in { toString: 1 }) {
|
||||||
p = null;
|
p = null;
|
||||||
}
|
}
|
||||||
if (p) {
|
if (p) {
|
||||||
p = ["hasOwnProperty", "valueOf", "isPrototypeOf", "propertyIsEnumerable", "toLocaleString", "toString", "constructor"];
|
p = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor'];
|
||||||
}
|
}
|
||||||
f.prototype.overloadSetter = function (s) {
|
f.prototype.overloadSetter = function (s) {
|
||||||
var i = this;
|
const i = this;
|
||||||
return function (u, t) {
|
return function (u, t) {
|
||||||
if (u == null) {
|
if (u == null) {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
if (s || typeof u != "string") {
|
if (s || typeof u !== 'string') {
|
||||||
for (var v in u) {
|
for (var v in u) {
|
||||||
i.call(this, v, u[v]);
|
i.call(this, v, u[v]);
|
||||||
}
|
}
|
||||||
if (p) {
|
if (p) {
|
||||||
for (var w = p.length; w--;) {
|
for (let w = p.length; w--;) {
|
||||||
v = p[w];
|
v = p[w];
|
||||||
if (u.hasOwnProperty(v)) {
|
if (u.hasOwnProperty(v)) {
|
||||||
i.call(this, v, u[v]);
|
i.call(this, v, u[v]);
|
||||||
@ -98,29 +96,30 @@
|
|||||||
f.prototype.implement = function (i, s) {
|
f.prototype.implement = function (i, s) {
|
||||||
this.prototype[i] = s;
|
this.prototype[i] = s;
|
||||||
}.overloadSetter();
|
}.overloadSetter();
|
||||||
var n = Array.prototype.slice;
|
const n = Array.prototype.slice;
|
||||||
Array.from = function (i) {
|
Array.from = function (i) {
|
||||||
if (i == null) {
|
if (i == null) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
return (a.isEnumerable(i) && typeof i != "string") ? (o(i) == "array") ? i : n.call(i) : [i];
|
return (a.isEnumerable(i) && typeof i !== 'string') ? (o(i) == 'array') ? i : n.call(i) : [i];
|
||||||
};
|
};
|
||||||
f.implement({
|
f.implement({
|
||||||
hide: function () {
|
hide() {
|
||||||
this.$hidden = true;
|
this.$hidden = true;
|
||||||
return this;
|
return this;
|
||||||
}, protect: function () {
|
},
|
||||||
|
protect() {
|
||||||
this.$protected = true;
|
this.$protected = true;
|
||||||
return this;
|
return this;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
var a = this.Type = function (u, t) {
|
var a = this.Type = function (u, t) {
|
||||||
if (u) {
|
if (u) {
|
||||||
var s = u.toLowerCase();
|
const s = u.toLowerCase();
|
||||||
var i = function (v) {
|
const i = function (v) {
|
||||||
return (o(v) == s);
|
return (o(v) == s);
|
||||||
};
|
};
|
||||||
a["is" + u] = i;
|
a[`is${u}`] = i;
|
||||||
if (t != null) {
|
if (t != null) {
|
||||||
t.prototype.$family = (function () {
|
t.prototype.$family = (function () {
|
||||||
return s;
|
return s;
|
||||||
@ -135,34 +134,34 @@
|
|||||||
t.prototype.$constructor = t;
|
t.prototype.$constructor = t;
|
||||||
return t;
|
return t;
|
||||||
};
|
};
|
||||||
var e = Object.prototype.toString;
|
const e = Object.prototype.toString;
|
||||||
a.isEnumerable = function (i) {
|
a.isEnumerable = function (i) {
|
||||||
return (i != null && typeof i.length == "number" && e.call(i) != "[object Function]");
|
return (i != null && typeof i.length === 'number' && e.call(i) != '[object Function]');
|
||||||
};
|
};
|
||||||
var q = {};
|
const q = {};
|
||||||
var r = function (i) {
|
const r = function (i) {
|
||||||
var s = o(i.prototype);
|
const s = o(i.prototype);
|
||||||
return q[s] || (q[s] = []);
|
return q[s] || (q[s] = []);
|
||||||
};
|
};
|
||||||
var b = function (t, x) {
|
var b = function (t, x) {
|
||||||
if (x && x.$hidden) {
|
if (x && x.$hidden) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var s = r(this);
|
const s = r(this);
|
||||||
for (var u = 0; u < s.length;
|
for (let u = 0; u < s.length;
|
||||||
u++) {
|
u++) {
|
||||||
var w = s[u];
|
const w = s[u];
|
||||||
if (o(w) == "type") {
|
if (o(w) == 'type') {
|
||||||
b.call(w, t, x);
|
b.call(w, t, x);
|
||||||
} else {
|
} else {
|
||||||
w.call(this, t, x);
|
w.call(this, t, x);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var v = this.prototype[t];
|
const v = this.prototype[t];
|
||||||
if (v == null || !v.$protected) {
|
if (v == null || !v.$protected) {
|
||||||
this.prototype[t] = x;
|
this.prototype[t] = x;
|
||||||
}
|
}
|
||||||
if (this[t] == null && o(x) == "function") {
|
if (this[t] == null && o(x) == 'function') {
|
||||||
m.call(this, t, function (i) {
|
m.call(this, t, function (i) {
|
||||||
return x.apply(i, n.call(arguments, 1));
|
return x.apply(i, n.call(arguments, 1));
|
||||||
});
|
});
|
||||||
@ -172,27 +171,32 @@
|
|||||||
if (t && t.$hidden) {
|
if (t && t.$hidden) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var s = this[i];
|
const s = this[i];
|
||||||
if (s == null || !s.$protected) {
|
if (s == null || !s.$protected) {
|
||||||
this[i] = t;
|
this[i] = t;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
a.implement({
|
a.implement({
|
||||||
implement: b.overloadSetter(), extend: m.overloadSetter(), alias: function (i, s) {
|
implement: b.overloadSetter(),
|
||||||
|
extend: m.overloadSetter(),
|
||||||
|
alias: function (i, s) {
|
||||||
b.call(this, i, this.prototype[s]);
|
b.call(this, i, this.prototype[s]);
|
||||||
}.overloadSetter(), mirror: function (i) {
|
}.overloadSetter(),
|
||||||
|
mirror(i) {
|
||||||
r(this).push(i);
|
r(this).push(i);
|
||||||
return this;
|
return this;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
new a("Type", a);
|
new a('Type', a);
|
||||||
var d = function (s, x, v) {
|
var d = function (s, x, v) {
|
||||||
var u = (x != Object), B = x.prototype;
|
const u = (x != Object); const
|
||||||
|
B = x.prototype;
|
||||||
if (u) {
|
if (u) {
|
||||||
x = new a(s, x);
|
x = new a(s, x);
|
||||||
}
|
}
|
||||||
for (var y = 0, w = v.length; y < w; y++) {
|
for (let y = 0, w = v.length; y < w; y++) {
|
||||||
var C = v[y], A = x[C], z = B[C];
|
const C = v[y]; const A = x[C]; const
|
||||||
|
z = B[C];
|
||||||
if (A) {
|
if (A) {
|
||||||
A.protect();
|
A.protect();
|
||||||
}
|
}
|
||||||
@ -201,35 +205,31 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (u) {
|
if (u) {
|
||||||
var t = B.propertyIsEnumerable(v[0]);
|
const t = B.propertyIsEnumerable(v[0]);
|
||||||
x.forEachMethod = function (G) {
|
x.forEachMethod = function (G) {
|
||||||
if (!t) {
|
if (!t) {
|
||||||
for (var F = 0, D = v.length; F < D; F++) {
|
for (let F = 0, D = v.length; F < D; F++) {
|
||||||
G.call(B, B[v[F]], v[F]);
|
G.call(B, B[v[F]], v[F]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (var E in B) {
|
for (const E in B) {
|
||||||
G.call(B, B[E], E);
|
G.call(B, B[E], E);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return d;
|
return d;
|
||||||
};
|
};
|
||||||
d("String", String, ["charAt", "charCodeAt", "concat", "indexOf", "lastIndexOf", "match", "quote", "replace", "search", "slice", "split", "substr", "substring", "trim", "toLowerCase", "toUpperCase"])("Array", Array, ["pop", "push", "reverse", "shift", "sort", "splice", "unshift", "concat", "join", "slice", "indexOf", "lastIndexOf", "filter", "forEach", "every", "map", "some", "reduce", "reduceRight"])("Number", Number, ["toExponential", "toFixed", "toLocaleString", "toPrecision"])("Function", f, ["apply", "call", "bind"])("RegExp", RegExp, ["exec", "test"])("Object", Object, ["create", "defineProperty", "defineProperties", "keys", "getPrototypeOf", "getOwnPropertyDescriptor", "getOwnPropertyNames", "preventExtensions", "isExtensible", "seal", "isSealed", "freeze", "isFrozen"])("Date", Date, ["now"]);
|
d('String', String, ['charAt', 'charCodeAt', 'concat', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search', 'slice', 'split', 'substr', 'substring', 'trim', 'toLowerCase', 'toUpperCase'])('Array', Array, ['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice', 'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight'])('Number', Number, ['toExponential', 'toFixed', 'toLocaleString', 'toPrecision'])('Function', f, ['apply', 'call', 'bind'])('RegExp', RegExp, ['exec', 'test'])('Object', Object, ['create', 'defineProperty', 'defineProperties', 'keys', 'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames', 'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen'])('Date', Date, ['now']);
|
||||||
Object.extend = m.overloadSetter();
|
Object.extend = m.overloadSetter();
|
||||||
Date.extend("now", function () {
|
Date.extend('now', () => +(new Date()));
|
||||||
return +(new Date);
|
new a('Boolean', Boolean);
|
||||||
});
|
|
||||||
new a("Boolean", Boolean);
|
|
||||||
Number.prototype.$family = function () {
|
Number.prototype.$family = function () {
|
||||||
return isFinite(this) ? "number" : "null";
|
return isFinite(this) ? 'number' : 'null';
|
||||||
}.hide();
|
}.hide();
|
||||||
Number.extend("random", function (s, i) {
|
Number.extend('random', (s, i) => Math.floor(Math.random() * (i - s + 1) + s));
|
||||||
return Math.floor(Math.random() * (i - s + 1) + s);
|
const g = Object.prototype.hasOwnProperty;
|
||||||
});
|
Object.extend('forEach', (i, t, u) => {
|
||||||
var g = Object.prototype.hasOwnProperty;
|
for (const s in i) {
|
||||||
Object.extend("forEach", function (i, t, u) {
|
|
||||||
for (var s in i) {
|
|
||||||
if (g.call(i, s)) {
|
if (g.call(i, s)) {
|
||||||
t.call(u, i[s], s, i);
|
t.call(u, i[s], s, i);
|
||||||
}
|
}
|
||||||
@ -237,44 +237,46 @@
|
|||||||
});
|
});
|
||||||
Object.each = Object.forEach;
|
Object.each = Object.forEach;
|
||||||
Array.implement({
|
Array.implement({
|
||||||
forEach: function (u, v) {
|
forEach(u, v) {
|
||||||
for (var t = 0, s = this.length; t < s; t++) {
|
for (let t = 0, s = this.length; t < s; t++) {
|
||||||
if (t in this) {
|
if (t in this) {
|
||||||
u.call(v, this[t], t, this);
|
u.call(v, this[t], t, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, each: function (i, s) {
|
},
|
||||||
|
each(i, s) {
|
||||||
Array.forEach(this, i, s);
|
Array.forEach(this, i, s);
|
||||||
return this;
|
return this;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
var l = function (i) {
|
const l = function (i) {
|
||||||
switch (o(i)) {
|
switch (o(i)) {
|
||||||
case"array":
|
case 'array':
|
||||||
return i.clone();
|
return i.clone();
|
||||||
case"object":
|
case 'object':
|
||||||
return Object.clone(i);
|
return Object.clone(i);
|
||||||
default:
|
default:
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Array.implement("clone", function () {
|
Array.implement('clone', function () {
|
||||||
var s = this.length, t = new Array(s);
|
let s = this.length; const
|
||||||
|
t = new Array(s);
|
||||||
while (s--) {
|
while (s--) {
|
||||||
t[s] = l(this[s]);
|
t[s] = l(this[s]);
|
||||||
}
|
}
|
||||||
return t;
|
return t;
|
||||||
});
|
});
|
||||||
var h = function (s, i, t) {
|
const h = function (s, i, t) {
|
||||||
switch (o(t)) {
|
switch (o(t)) {
|
||||||
case"object":
|
case 'object':
|
||||||
if (o(s[i]) == "object") {
|
if (o(s[i]) == 'object') {
|
||||||
Object.merge(s[i], t);
|
Object.merge(s[i], t);
|
||||||
} else {
|
} else {
|
||||||
s[i] = Object.clone(t);
|
s[i] = Object.clone(t);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case"array":
|
case 'array':
|
||||||
s[i] = t.clone();
|
s[i] = t.clone();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -283,47 +285,47 @@
|
|||||||
return s;
|
return s;
|
||||||
};
|
};
|
||||||
Object.extend({
|
Object.extend({
|
||||||
merge: function (z, u, t) {
|
merge(z, u, t) {
|
||||||
if (o(u) == "string") {
|
if (o(u) == 'string') {
|
||||||
return h(z, u, t);
|
return h(z, u, t);
|
||||||
}
|
}
|
||||||
for (var y = 1, s = arguments.length;
|
for (let y = 1, s = arguments.length;
|
||||||
y < s; y++) {
|
y < s; y++) {
|
||||||
var w = arguments[y];
|
const w = arguments[y];
|
||||||
for (var x in w) {
|
for (const x in w) {
|
||||||
h(z, x, w[x]);
|
h(z, x, w[x]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return z;
|
return z;
|
||||||
}, clone: function (i) {
|
},
|
||||||
var t = {};
|
clone(i) {
|
||||||
for (var s in i) {
|
const t = {};
|
||||||
|
for (const s in i) {
|
||||||
t[s] = l(i[s]);
|
t[s] = l(i[s]);
|
||||||
}
|
}
|
||||||
return t;
|
return t;
|
||||||
}, append: function (w) {
|
},
|
||||||
for (var v = 1, t = arguments.length;
|
append(w) {
|
||||||
|
for (let v = 1, t = arguments.length;
|
||||||
v < t; v++) {
|
v < t; v++) {
|
||||||
var s = arguments[v] || {};
|
const s = arguments[v] || {};
|
||||||
for (var u in s) {
|
for (const u in s) {
|
||||||
w[u] = s[u];
|
w[u] = s[u];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return w;
|
return w;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
["Object", "WhiteSpace", "TextNode", "Collection", "Arguments"].each(function (i) {
|
['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each((i) => {
|
||||||
new a(i);
|
new a(i);
|
||||||
});
|
});
|
||||||
var c = Date.now();
|
let c = Date.now();
|
||||||
String.extend("uniqueID", function () {
|
String.extend('uniqueID', () => (c++).toString(36));
|
||||||
return (c++).toString(36);
|
}());
|
||||||
});
|
|
||||||
})();
|
|
||||||
|
|
||||||
Array.implement({
|
Array.implement({
|
||||||
filter: function (d, f) {
|
filter(d, f) {
|
||||||
var c = [];
|
const c = [];
|
||||||
for (var e, b = 0, a = this.length >>> 0; b < a; b++) {
|
for (var e, b = 0, a = this.length >>> 0; b < a; b++) {
|
||||||
if (b in this) {
|
if (b in this) {
|
||||||
e = this[b];
|
e = this[b];
|
||||||
@ -333,133 +335,150 @@ Array.implement({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return c;
|
return c;
|
||||||
}, indexOf: function (c, d) {
|
},
|
||||||
var b = this.length >>> 0;
|
indexOf(c, d) {
|
||||||
for (var a = (d < 0) ? Math.max(0, b + d) : d || 0; a < b; a++) {
|
const b = this.length >>> 0;
|
||||||
|
for (let a = (d < 0) ? Math.max(0, b + d) : d || 0; a < b; a++) {
|
||||||
if (this[a] === c) {
|
if (this[a] === c) {
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}, map: function (c, e) {
|
},
|
||||||
var d = this.length >>> 0, b = Array(d);
|
map(c, e) {
|
||||||
for (var a = 0; a < d; a++) {
|
const d = this.length >>> 0; const
|
||||||
|
b = Array(d);
|
||||||
|
for (let a = 0; a < d; a++) {
|
||||||
if (a in this) {
|
if (a in this) {
|
||||||
b[a] = c.call(e, this[a], a, this);
|
b[a] = c.call(e, this[a], a, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return b;
|
return b;
|
||||||
}, some: function (c, d) {
|
},
|
||||||
for (var b = 0, a = this.length >>> 0;
|
some(c, d) {
|
||||||
|
for (let b = 0, a = this.length >>> 0;
|
||||||
b < a; b++) {
|
b < a; b++) {
|
||||||
if ((b in this) && c.call(d, this[b], b, this)) {
|
if ((b in this) && c.call(d, this[b], b, this)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}, clean: function () {
|
},
|
||||||
return this.filter(function (a) {
|
clean() {
|
||||||
return a != null;
|
return this.filter((a) => a != null);
|
||||||
});
|
},
|
||||||
}, contains: function (a, b) {
|
contains(a, b) {
|
||||||
return this.indexOf(a, b) != -1;
|
return this.indexOf(a, b) != -1;
|
||||||
}, append: function (a) {
|
},
|
||||||
|
append(a) {
|
||||||
this.push.apply(this, a);
|
this.push.apply(this, a);
|
||||||
return this;
|
return this;
|
||||||
}, getLast: function () {
|
},
|
||||||
|
getLast() {
|
||||||
return (this.length) ? this[this.length - 1] : null;
|
return (this.length) ? this[this.length - 1] : null;
|
||||||
}, include: function (a) {
|
},
|
||||||
|
include(a) {
|
||||||
if (!this.contains(a)) {
|
if (!this.contains(a)) {
|
||||||
this.push(a);
|
this.push(a);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}, erase: function (b) {
|
},
|
||||||
for (var a = this.length; a--;) {
|
erase(b) {
|
||||||
|
for (let a = this.length; a--;) {
|
||||||
if (this[a] === b) {
|
if (this[a] === b) {
|
||||||
this.splice(a, 1);
|
this.splice(a, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}, empty: function () {
|
},
|
||||||
|
empty() {
|
||||||
this.length = 0;
|
this.length = 0;
|
||||||
return this;
|
return this;
|
||||||
}, flatten: function () {
|
},
|
||||||
var d = [];
|
flatten() {
|
||||||
for (var b = 0, a = this.length; b < a; b++) {
|
let d = [];
|
||||||
var c = typeOf(this[b]);
|
for (let b = 0, a = this.length; b < a; b++) {
|
||||||
if (c == "null") {
|
const c = typeOf(this[b]);
|
||||||
|
if (c == 'null') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
d = d.concat((c == "array" || c == "collection" || c == "arguments" || instanceOf(this[b], Array)) ? Array.flatten(this[b]) : this[b]);
|
d = d.concat((c == 'array' || c == 'collection' || c == 'arguments' || instanceOf(this[b], Array)) ? Array.flatten(this[b]) : this[b]);
|
||||||
}
|
}
|
||||||
return d;
|
return d;
|
||||||
}, pick: function () {
|
},
|
||||||
for (var b = 0, a = this.length; b < a; b++) {
|
pick() {
|
||||||
|
for (let b = 0, a = this.length; b < a; b++) {
|
||||||
if (this[b] != null) {
|
if (this[b] != null) {
|
||||||
return this[b];
|
return this[b];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}, rgbToHex: function (d) {
|
},
|
||||||
|
rgbToHex(d) {
|
||||||
if (this.length < 3) {
|
if (this.length < 3) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (this.length == 4 && this[3] == 0 && !d) {
|
if (this.length == 4 && this[3] == 0 && !d) {
|
||||||
return "transparent";
|
return 'transparent';
|
||||||
}
|
}
|
||||||
var b = [];
|
const b = [];
|
||||||
for (var a = 0; a < 3; a++) {
|
for (let a = 0; a < 3; a++) {
|
||||||
var c = (this[a] - 0).toString(16);
|
const c = (this[a] - 0).toString(16);
|
||||||
b.push((c.length == 1) ? "0" + c : c);
|
b.push((c.length == 1) ? `0${c}` : c);
|
||||||
}
|
|
||||||
return (d) ? b : "#" + b.join("");
|
|
||||||
}
|
}
|
||||||
|
return (d) ? b : `#${b.join('')}`;
|
||||||
|
},
|
||||||
});
|
});
|
||||||
String.implement({
|
String.implement({
|
||||||
test: function (a, b) {
|
test(a, b) {
|
||||||
return ((typeOf(a) == "regexp") ? a : new RegExp("" + a, b)).test(this);
|
return ((typeOf(a) == 'regexp') ? a : new RegExp(`${a}`, b)).test(this);
|
||||||
}, contains: function (a, b) {
|
},
|
||||||
|
contains(a, b) {
|
||||||
return (b) ? (b + this + b).indexOf(b + a + b) > -1 : String(this).indexOf(a) > -1;
|
return (b) ? (b + this + b).indexOf(b + a + b) > -1 : String(this).indexOf(a) > -1;
|
||||||
}, capitalize: function () {
|
},
|
||||||
return String(this).replace(/\b[a-z]/g, function (a) {
|
capitalize() {
|
||||||
return a.toUpperCase();
|
return String(this).replace(/\b[a-z]/g, (a) => a.toUpperCase());
|
||||||
});
|
},
|
||||||
}, rgbToHex: function (b) {
|
rgbToHex(b) {
|
||||||
var a = String(this).match(/\d{1,3}/g);
|
const a = String(this).match(/\d{1,3}/g);
|
||||||
return (a) ? a.rgbToHex(b) : null;
|
return (a) ? a.rgbToHex(b) : null;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
Function.implement({
|
Function.implement({
|
||||||
bind: function (e) {
|
bind(e) {
|
||||||
var a = this, b = arguments.length > 1 ? Array.slice(arguments, 1) : null, d = function () {
|
const a = this; const b = arguments.length > 1 ? Array.slice(arguments, 1) : null; const
|
||||||
|
d = function () {
|
||||||
};
|
};
|
||||||
var c = function () {
|
var c = function () {
|
||||||
var g = e, h = arguments.length;
|
let g = e; const
|
||||||
|
h = arguments.length;
|
||||||
if (this instanceof c) {
|
if (this instanceof c) {
|
||||||
d.prototype = a.prototype;
|
d.prototype = a.prototype;
|
||||||
g = new d;
|
g = new d();
|
||||||
}
|
}
|
||||||
var f = (!b && !h) ? a.call(g) : a.apply(g, b && h ? b.concat(Array.slice(arguments)) : b || arguments);
|
const f = (!b && !h) ? a.call(g) : a.apply(g, b && h ? b.concat(Array.slice(arguments)) : b || arguments);
|
||||||
return g == e ? f : g;
|
return g == e ? f : g;
|
||||||
};
|
};
|
||||||
return c;
|
return c;
|
||||||
}, pass: function (b, c) {
|
},
|
||||||
var a = this;
|
pass(b, c) {
|
||||||
|
const a = this;
|
||||||
if (b != null) {
|
if (b != null) {
|
||||||
b = Array.from(b);
|
b = Array.from(b);
|
||||||
}
|
}
|
||||||
return function () {
|
return function () {
|
||||||
return a.apply(c, b || arguments);
|
return a.apply(c, b || arguments);
|
||||||
};
|
};
|
||||||
}, delay: function (b, c, a) {
|
},
|
||||||
|
delay(b, c, a) {
|
||||||
return setTimeout(this.pass((a == null ? [] : a), c), b);
|
return setTimeout(this.pass((a == null ? [] : a), c), b);
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Number.alias("each", "times");
|
Number.alias('each', 'times');
|
||||||
(function (b) {
|
(function (b) {
|
||||||
var a = {};
|
const a = {};
|
||||||
b.each(function (c) {
|
b.each((c) => {
|
||||||
if (!Number[c]) {
|
if (!Number[c]) {
|
||||||
a[c] = function () {
|
a[c] = function () {
|
||||||
return Math[c].apply(null, [this].concat(Array.from(arguments)));
|
return Math[c].apply(null, [this].concat(Array.from(arguments)));
|
||||||
@ -467,12 +486,12 @@ Number.alias("each", "times");
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
Number.implement(a);
|
Number.implement(a);
|
||||||
})(["abs", "acos", "asin", "atan", "atan2", "ceil", "cos", "exp", "floor", "log", "max", "min", "pow", "sin", "sqrt", "tan"]);
|
}(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']));
|
||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
var a = this.Class = new Type("Class", function (h) {
|
var a = this.Class = new Type('Class', function (h) {
|
||||||
if (instanceOf(h, Function)) {
|
if (instanceOf(h, Function)) {
|
||||||
h = {initialize: h};
|
h = { initialize: h };
|
||||||
}
|
}
|
||||||
var g = function () {
|
var g = function () {
|
||||||
e(this);
|
e(this);
|
||||||
@ -480,7 +499,7 @@ Number.alias("each", "times");
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
this.$caller = null;
|
this.$caller = null;
|
||||||
var i = (this.initialize) ? this.initialize.apply(this, arguments) : this;
|
const i = (this.initialize) ? this.initialize.apply(this, arguments) : this;
|
||||||
this.$caller = this.caller = null;
|
this.$caller = this.caller = null;
|
||||||
return i;
|
return i;
|
||||||
}.extend(this).implement(h);
|
}.extend(this).implement(h);
|
||||||
@ -493,55 +512,57 @@ Number.alias("each", "times");
|
|||||||
if (!this.$caller) {
|
if (!this.$caller) {
|
||||||
throw new Error('The method "parent" cannot be called.');
|
throw new Error('The method "parent" cannot be called.');
|
||||||
}
|
}
|
||||||
var g = this.$caller.$name, h = this.$caller.$owner.parent, i = (h) ? h.prototype[g] : null;
|
const g = this.$caller.$name; const h = this.$caller.$owner.parent; const
|
||||||
|
i = (h) ? h.prototype[g] : null;
|
||||||
if (!i) {
|
if (!i) {
|
||||||
throw new Error('The method "' + g + '" has no parent.');
|
throw new Error(`The method "${g}" has no parent.`);
|
||||||
}
|
}
|
||||||
return i.apply(this, arguments);
|
return i.apply(this, arguments);
|
||||||
};
|
};
|
||||||
var e = function (g) {
|
var e = function (g) {
|
||||||
for (var h in g) {
|
for (const h in g) {
|
||||||
var j = g[h];
|
const j = g[h];
|
||||||
switch (typeOf(j)) {
|
switch (typeOf(j)) {
|
||||||
case"object":
|
case 'object':
|
||||||
var i = function () {
|
var i = function () {
|
||||||
};
|
};
|
||||||
i.prototype = j;
|
i.prototype = j;
|
||||||
g[h] = e(new i);
|
g[h] = e(new i());
|
||||||
break;
|
break;
|
||||||
case"array":
|
case 'array':
|
||||||
g[h] = j.clone();
|
g[h] = j.clone();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return g;
|
return g;
|
||||||
};
|
};
|
||||||
var b = function (g, h, j) {
|
const b = function (g, h, j) {
|
||||||
if (j.$origin) {
|
if (j.$origin) {
|
||||||
j = j.$origin;
|
j = j.$origin;
|
||||||
}
|
}
|
||||||
var i = function () {
|
var i = function () {
|
||||||
if (j.$protected && this.$caller == null) {
|
if (j.$protected && this.$caller == null) {
|
||||||
throw new Error('The method "' + h + '" cannot be called.');
|
throw new Error(`The method "${h}" cannot be called.`);
|
||||||
}
|
}
|
||||||
var l = this.caller, m = this.$caller;
|
const l = this.caller; const
|
||||||
|
m = this.$caller;
|
||||||
this.caller = m;
|
this.caller = m;
|
||||||
this.$caller = i;
|
this.$caller = i;
|
||||||
var k = j.apply(this, arguments);
|
const k = j.apply(this, arguments);
|
||||||
this.$caller = m;
|
this.$caller = m;
|
||||||
this.caller = l;
|
this.caller = l;
|
||||||
return k;
|
return k;
|
||||||
}.extend({$owner: g, $origin: j, $name: h});
|
}.extend({ $owner: g, $origin: j, $name: h });
|
||||||
return i;
|
return i;
|
||||||
};
|
};
|
||||||
var f = function (h, i, g) {
|
const f = function (h, i, g) {
|
||||||
if (a.Mutators.hasOwnProperty(h)) {
|
if (a.Mutators.hasOwnProperty(h)) {
|
||||||
i = a.Mutators[h].call(this, i);
|
i = a.Mutators[h].call(this, i);
|
||||||
if (i == null) {
|
if (i == null) {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (typeOf(i) == "function") {
|
if (typeOf(i) == 'function') {
|
||||||
if (i.$hidden) {
|
if (i.$hidden) {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -551,24 +572,25 @@ Number.alias("each", "times");
|
|||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
var d = function (g) {
|
const d = function (g) {
|
||||||
g.$prototyping = true;
|
g.$prototyping = true;
|
||||||
var h = new g;
|
const h = new g();
|
||||||
delete g.$prototyping;
|
delete g.$prototyping;
|
||||||
return h;
|
return h;
|
||||||
};
|
};
|
||||||
a.implement("implement", f.overloadSetter());
|
a.implement('implement', f.overloadSetter());
|
||||||
a.Mutators = {
|
a.Mutators = {
|
||||||
Extends: function (g) {
|
Extends(g) {
|
||||||
this.parent = g;
|
this.parent = g;
|
||||||
this.prototype = d(g);
|
this.prototype = d(g);
|
||||||
}, Implements: function (g) {
|
},
|
||||||
|
Implements(g) {
|
||||||
Array.from(g).each(function (j) {
|
Array.from(g).each(function (j) {
|
||||||
var h = new j;
|
const h = new j();
|
||||||
for (var i in h) {
|
for (const i in h) {
|
||||||
f.call(this, i, h[i], true);
|
f.call(this, i, h[i], true);
|
||||||
}
|
}
|
||||||
}, this);
|
}, this);
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
})();
|
}());
|
||||||
|
@ -16,61 +16,256 @@
|
|||||||
...
|
...
|
||||||
*/
|
*/
|
||||||
|
|
||||||
(function(){this.MooTools={version:"1.4.5",build:"ab8ea8824dc3b24b6666867a2c4ed58ebb762cf0"};var o=this.typeOf=function(i){if(i==null){return"null";}if(i.$family!=null){return i.$family();
|
(function () {
|
||||||
}if(i.nodeName){if(i.nodeType==1){return"element";}if(i.nodeType==3){return(/\S/).test(i.nodeValue)?"textnode":"whitespace";}}else{if(typeof i.length=="number"){if(i.callee){return"arguments";
|
this.MooTools = { version: '1.4.5', build: 'ab8ea8824dc3b24b6666867a2c4ed58ebb762cf0' }; const o = this.typeOf = function (i) {
|
||||||
}if("item" in i){return"collection";}}}return typeof i;};var j=this.instanceOf=function(t,i){if(t==null){return false;}var s=t.$constructor||t.constructor;
|
if (i == null) { return 'null'; } if (i.$family != null) {
|
||||||
while(s){if(s===i){return true;}s=s.parent;}if(!t.hasOwnProperty){return false;}return t instanceof i;};var f=this.Function;var p=true;for(var k in {toString:1}){p=null;
|
return i.$family();
|
||||||
}if(p){p=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"];}f.prototype.overloadSetter=function(s){var i=this;
|
} if (i.nodeName) { if (i.nodeType == 1) { return 'element'; } if (i.nodeType == 3) { return (/\S/).test(i.nodeValue) ? 'textnode' : 'whitespace'; } } else if (typeof i.length === 'number') {
|
||||||
return function(u,t){if(u==null){return this;}if(s||typeof u!="string"){for(var v in u){i.call(this,v,u[v]);}if(p){for(var w=p.length;w--;){v=p[w];if(u.hasOwnProperty(v)){i.call(this,v,u[v]);
|
if (i.callee) {
|
||||||
}}}}else{i.call(this,u,t);}return this;};};f.prototype.overloadGetter=function(s){var i=this;return function(u){var v,t;if(typeof u!="string"){v=u;}else{if(arguments.length>1){v=arguments;
|
return 'arguments';
|
||||||
}else{if(s){v=[u];}}}if(v){t={};for(var w=0;w<v.length;w++){t[v[w]]=i.call(this,v[w]);}}else{t=i.call(this,u);}return t;};};f.prototype.extend=function(i,s){this[i]=s;
|
} if ('item' in i) { return 'collection'; }
|
||||||
}.overloadSetter();f.prototype.implement=function(i,s){this.prototype[i]=s;}.overloadSetter();var n=Array.prototype.slice;f.from=function(i){return(o(i)=="function")?i:function(){return i;
|
} return typeof i;
|
||||||
};};Array.from=function(i){if(i==null){return[];}return(a.isEnumerable(i)&&typeof i!="string")?(o(i)=="array")?i:n.call(i):[i];};Number.from=function(s){var i=parseFloat(s);
|
}; const j = this.instanceOf = function (t, i) {
|
||||||
return isFinite(i)?i:null;};String.from=function(i){return i+"";};f.implement({hide:function(){this.$hidden=true;return this;},protect:function(){this.$protected=true;
|
if (t == null) { return false; } let s = t.$constructor || t.constructor;
|
||||||
return this;}});var a=this.Type=function(u,t){if(u){var s=u.toLowerCase();var i=function(v){return(o(v)==s);};a["is"+u]=i;if(t!=null){t.prototype.$family=(function(){return s;
|
while (s) { if (s === i) { return true; }s = s.parent; } if (!t.hasOwnProperty) { return false; } return t instanceof i;
|
||||||
}).hide();}}if(t==null){return null;}t.extend(this);t.$constructor=a;t.prototype.$constructor=t;return t;};var e=Object.prototype.toString;a.isEnumerable=function(i){return(i!=null&&typeof i.length=="number"&&e.call(i)!="[object Function]");
|
}; const f = this.Function; let p = true; for (const k in { toString: 1 }) {
|
||||||
};var q={};var r=function(i){var s=o(i.prototype);return q[s]||(q[s]=[]);};var b=function(t,x){if(x&&x.$hidden){return;}var s=r(this);for(var u=0;u<s.length;
|
p = null;
|
||||||
u++){var w=s[u];if(o(w)=="type"){b.call(w,t,x);}else{w.call(this,t,x);}}var v=this.prototype[t];if(v==null||!v.$protected){this.prototype[t]=x;}if(this[t]==null&&o(x)=="function"){m.call(this,t,function(i){return x.apply(i,n.call(arguments,1));
|
} if (p) { p = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor']; }f.prototype.overloadSetter = function (s) {
|
||||||
});}};var m=function(i,t){if(t&&t.$hidden){return;}var s=this[i];if(s==null||!s.$protected){this[i]=t;}};a.implement({implement:b.overloadSetter(),extend:m.overloadSetter(),alias:function(i,s){b.call(this,i,this.prototype[s]);
|
const i = this;
|
||||||
}.overloadSetter(),mirror:function(i){r(this).push(i);return this;}});new a("Type",a);var d=function(s,x,v){var u=(x!=Object),B=x.prototype;if(u){x=new a(s,x);
|
return function (u, t) {
|
||||||
}for(var y=0,w=v.length;y<w;y++){var C=v[y],A=x[C],z=B[C];if(A){A.protect();}if(u&&z){x.implement(C,z.protect());}}if(u){var t=B.propertyIsEnumerable(v[0]);
|
if (u == null) { return this; } if (s || typeof u !== 'string') {
|
||||||
x.forEachMethod=function(G){if(!t){for(var F=0,D=v.length;F<D;F++){G.call(B,B[v[F]],v[F]);}}for(var E in B){G.call(B,B[E],E);}};}return d;};d("String",String,["charAt","charCodeAt","concat","indexOf","lastIndexOf","match","quote","replace","search","slice","split","substr","substring","trim","toLowerCase","toUpperCase"])("Array",Array,["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice","indexOf","lastIndexOf","filter","forEach","every","map","some","reduce","reduceRight"])("Number",Number,["toExponential","toFixed","toLocaleString","toPrecision"])("Function",f,["apply","call","bind"])("RegExp",RegExp,["exec","test"])("Object",Object,["create","defineProperty","defineProperties","keys","getPrototypeOf","getOwnPropertyDescriptor","getOwnPropertyNames","preventExtensions","isExtensible","seal","isSealed","freeze","isFrozen"])("Date",Date,["now"]);
|
for (var v in u) { i.call(this, v, u[v]); } if (p) {
|
||||||
Object.extend=m.overloadSetter();Date.extend("now",function(){return +(new Date);});new a("Boolean",Boolean);Number.prototype.$family=function(){return isFinite(this)?"number":"null";
|
for (let w = p.length; w--;) {
|
||||||
}.hide();Number.extend("random",function(s,i){return Math.floor(Math.random()*(i-s+1)+s);});var g=Object.prototype.hasOwnProperty;Object.extend("forEach",function(i,t,u){for(var s in i){if(g.call(i,s)){t.call(u,i[s],s,i);
|
v = p[w]; if (u.hasOwnProperty(v)) {
|
||||||
}}});Object.each=Object.forEach;Array.implement({forEach:function(u,v){for(var t=0,s=this.length;t<s;t++){if(t in this){u.call(v,this[t],t,this);}}},each:function(i,s){Array.forEach(this,i,s);
|
i.call(this, v, u[v]);
|
||||||
return this;}});var l=function(i){switch(o(i)){case"array":return i.clone();case"object":return Object.clone(i);default:return i;}};Array.implement("clone",function(){var s=this.length,t=new Array(s);
|
}
|
||||||
while(s--){t[s]=l(this[s]);}return t;});var h=function(s,i,t){switch(o(t)){case"object":if(o(s[i])=="object"){Object.merge(s[i],t);}else{s[i]=Object.clone(t);
|
}
|
||||||
}break;case"array":s[i]=t.clone();break;default:s[i]=t;}return s;};Object.extend({merge:function(z,u,t){if(o(u)=="string"){return h(z,u,t);}for(var y=1,s=arguments.length;
|
}
|
||||||
y<s;y++){var w=arguments[y];for(var x in w){h(z,x,w[x]);}}return z;},clone:function(i){var t={};for(var s in i){t[s]=l(i[s]);}return t;},append:function(w){for(var v=1,t=arguments.length;
|
} else { i.call(this, u, t); } return this;
|
||||||
v<t;v++){var s=arguments[v]||{};for(var u in s){w[u]=s[u];}}return w;}});["Object","WhiteSpace","TextNode","Collection","Arguments"].each(function(i){new a(i);
|
};
|
||||||
});var c=Date.now();String.extend("uniqueID",function(){return(c++).toString(36);});})();Array.implement({every:function(c,d){for(var b=0,a=this.length>>>0;
|
}; f.prototype.overloadGetter = function (s) {
|
||||||
b<a;b++){if((b in this)&&!c.call(d,this[b],b,this)){return false;}}return true;},filter:function(d,f){var c=[];for(var e,b=0,a=this.length>>>0;b<a;b++){if(b in this){e=this[b];
|
const i = this; return function (u) {
|
||||||
if(d.call(f,e,b,this)){c.push(e);}}}return c;},indexOf:function(c,d){var b=this.length>>>0;for(var a=(d<0)?Math.max(0,b+d):d||0;a<b;a++){if(this[a]===c){return a;
|
let v; let t; if (typeof u !== 'string') { v = u; } else if (arguments.length > 1) {
|
||||||
}}return -1;},map:function(c,e){var d=this.length>>>0,b=Array(d);for(var a=0;a<d;a++){if(a in this){b[a]=c.call(e,this[a],a,this);}}return b;},some:function(c,d){for(var b=0,a=this.length>>>0;
|
v = arguments;
|
||||||
b<a;b++){if((b in this)&&c.call(d,this[b],b,this)){return true;}}return false;},clean:function(){return this.filter(function(a){return a!=null;});},invoke:function(a){var b=Array.slice(arguments,1);
|
} else if (s) { v = [u]; } if (v) { t = {}; for (let w = 0; w < v.length; w++) { t[v[w]] = i.call(this, v[w]); } } else { t = i.call(this, u); } return t;
|
||||||
return this.map(function(c){return c[a].apply(c,b);});},associate:function(c){var d={},b=Math.min(this.length,c.length);for(var a=0;a<b;a++){d[c[a]]=this[a];
|
};
|
||||||
}return d;},link:function(c){var a={};for(var e=0,b=this.length;e<b;e++){for(var d in c){if(c[d](this[e])){a[d]=this[e];delete c[d];break;}}}return a;},contains:function(a,b){return this.indexOf(a,b)!=-1;
|
}; f.prototype.extend = function (i, s) {
|
||||||
},append:function(a){this.push.apply(this,a);return this;},getLast:function(){return(this.length)?this[this.length-1]:null;},getRandom:function(){return(this.length)?this[Number.random(0,this.length-1)]:null;
|
this[i] = s;
|
||||||
},include:function(a){if(!this.contains(a)){this.push(a);}return this;},combine:function(c){for(var b=0,a=c.length;b<a;b++){this.include(c[b]);}return this;
|
}.overloadSetter(); f.prototype.implement = function (i, s) { this.prototype[i] = s; }.overloadSetter(); const n = Array.prototype.slice; f.from = function (i) {
|
||||||
},erase:function(b){for(var a=this.length;a--;){if(this[a]===b){this.splice(a,1);}}return this;},empty:function(){this.length=0;return this;},flatten:function(){var d=[];
|
return (o(i) == 'function') ? i : function () {
|
||||||
for(var b=0,a=this.length;b<a;b++){var c=typeOf(this[b]);if(c=="null"){continue;}d=d.concat((c=="array"||c=="collection"||c=="arguments"||instanceOf(this[b],Array))?Array.flatten(this[b]):this[b]);
|
return i;
|
||||||
}return d;},pick:function(){for(var b=0,a=this.length;b<a;b++){if(this[b]!=null){return this[b];}}return null;},rgbToHex:function(d){if(this.length<3){return null;}if(this.length==4&&this[3]==0&&!d){return"transparent";
|
};
|
||||||
}var b=[];for(var a=0;a<3;a++){var c=(this[a]-0).toString(16);b.push((c.length==1)?"0"+c:c);}return(d)?b:"#"+b.join("");}});String.implement({test:function(a,b){return((typeOf(a)=="regexp")?a:new RegExp(""+a,b)).test(this);
|
}; Array.from = function (i) { if (i == null) { return []; } return (a.isEnumerable(i) && typeof i !== 'string') ? (o(i) == 'array') ? i : n.call(i) : [i]; }; Number.from = function (s) {
|
||||||
},contains:function(a,b){return(b)?(b+this+b).indexOf(b+a+b)>-1:String(this).indexOf(a)>-1;},trim:function(){return String(this).replace(/^\s+|\s+$/g,"");
|
const i = parseFloat(s);
|
||||||
},clean:function(){return String(this).replace(/\s+/g," ").trim();},camelCase:function(){return String(this).replace(/-\D/g,function(a){return a.charAt(1).toUpperCase();
|
return isFinite(i) ? i : null;
|
||||||
});},hyphenate:function(){return String(this).replace(/[A-Z]/g,function(a){return("-"+a.charAt(0).toLowerCase());});},capitalize:function(){return String(this).replace(/\b[a-z]/g,function(a){return a.toUpperCase();
|
}; String.from = function (i) { return `${i}`; }; f.implement({
|
||||||
});},escapeRegExp:function(){return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1");},rgbToHex:function(b){var a=String(this).match(/\d{1,3}/g);
|
hide() { this.$hidden = true; return this; },
|
||||||
return(a)?a.rgbToHex(b):null;},substitute:function(a,b){return String(this).replace(b||(/\\?\{([^{}]+)\}/g),function(d,c){if(d.charAt(0)=="\\"){return d.slice(1);
|
protect() {
|
||||||
}return(a[c]!=null)?a[c]:"";});}});
|
this.$protected = true;
|
||||||
Function.implement({bind:function(e){var a=this,b=arguments.length>1?Array.slice(arguments,1):null,d=function(){};var c=function(){var g=e,h=arguments.length;if(this instanceof c){d.prototype=a.prototype;g=new d;}var f=(!b&&!h)?a.call(g):a.apply(g,b&&h?b.concat(Array.slice(arguments)):b||arguments);return g==e?f:g;};return c;},pass:function(b,c){var a=this;if(b!=null){b=Array.from(b);}return function(){return a.apply(c,b||arguments);};},delay:function(b,c,a){return setTimeout(this.pass((a==null?[]:a),c),b);},});
|
return this;
|
||||||
Number.alias("each","times");(function(b){var a={};b.each(function(c){if(!Number[c]){a[c]=function(){return Math[c].apply(null,[this].concat(Array.from(arguments)));
|
},
|
||||||
};}});Number.implement(a);})(["abs","acos","asin","atan","atan2","ceil","cos","exp","floor","log","max","min","pow","sin","sqrt","tan"]);(function(){var a=this.Class=new Type("Class",function(h){if(instanceOf(h,Function)){h={initialize:h};
|
}); var a = this.Type = function (u, t) {
|
||||||
}var g=function(){e(this);if(g.$prototyping){return this;}this.$caller=null;var i=(this.initialize)?this.initialize.apply(this,arguments):this;this.$caller=this.caller=null;
|
if (u) {
|
||||||
return i;}.extend(this).implement(h);g.$constructor=a;g.prototype.$constructor=g;g.prototype.parent=c;return g;});var c=function(){if(!this.$caller){throw new Error('The method "parent" cannot be called.');
|
const s = u.toLowerCase(); const i = function (v) { return (o(v) == s); }; a[`is${u}`] = i; if (t != null) {
|
||||||
}var g=this.$caller.$name,h=this.$caller.$owner.parent,i=(h)?h.prototype[g]:null;if(!i){throw new Error('The method "'+g+'" has no parent.');}return i.apply(this,arguments);
|
t.prototype.$family = (function () {
|
||||||
};var e=function(g){for(var h in g){var j=g[h];switch(typeOf(j)){case"object":var i=function(){};i.prototype=j;g[h]=e(new i);break;case"array":g[h]=j.clone();
|
return s;
|
||||||
break;}}return g;};var b=function(g,h,j){if(j.$origin){j=j.$origin;}var i=function(){if(j.$protected&&this.$caller==null){throw new Error('The method "'+h+'" cannot be called.');
|
}).hide();
|
||||||
}var l=this.caller,m=this.$caller;this.caller=m;this.$caller=i;var k=j.apply(this,arguments);this.$caller=m;this.caller=l;return k;}.extend({$owner:g,$origin:j,$name:h});
|
}
|
||||||
return i;};var f=function(h,i,g){if(a.Mutators.hasOwnProperty(h)){i=a.Mutators[h].call(this,i);if(i==null){return this;}}if(typeOf(i)=="function"){if(i.$hidden){return this;
|
} if (t == null) { return null; }t.extend(this); t.$constructor = a; t.prototype.$constructor = t; return t;
|
||||||
}this.prototype[h]=(g)?i:b(this,h,i);}else{Object.merge(this.prototype,h,i);}return this;};var d=function(g){g.$prototyping=true;var h=new g;delete g.$prototyping;
|
}; const e = Object.prototype.toString; a.isEnumerable = function (i) {
|
||||||
return h;};a.implement("implement",f.overloadSetter());a.Mutators={Extends:function(g){this.parent=g;this.prototype=d(g);},Implements:function(g){Array.from(g).each(function(j){var h=new j;for(var i in h){f.call(this,i,h[i],true);}},this);}};})();
|
return (i != null && typeof i.length === 'number' && e.call(i) != '[object Function]');
|
||||||
|
}; const q = {}; const r = function (i) { const s = o(i.prototype); return q[s] || (q[s] = []); }; var b = function (t, x) {
|
||||||
|
if (x && x.$hidden) { return; } const s = r(this); for (let u = 0; u < s.length;
|
||||||
|
u++) { const w = s[u]; if (o(w) == 'type') { b.call(w, t, x); } else { w.call(this, t, x); } } const v = this.prototype[t]; if (v == null || !v.$protected) { this.prototype[t] = x; } if (this[t] == null && o(x) == 'function') {
|
||||||
|
m.call(this, t, function (i) {
|
||||||
|
return x.apply(i, n.call(arguments, 1));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}; var m = function (i, t) { if (t && t.$hidden) { return; } const s = this[i]; if (s == null || !s.$protected) { this[i] = t; } }; a.implement({
|
||||||
|
implement: b.overloadSetter(),
|
||||||
|
extend: m.overloadSetter(),
|
||||||
|
alias: function (i, s) {
|
||||||
|
b.call(this, i, this.prototype[s]);
|
||||||
|
}.overloadSetter(),
|
||||||
|
mirror(i) { r(this).push(i); return this; },
|
||||||
|
}); new a('Type', a); var d = function (s, x, v) {
|
||||||
|
const u = (x != Object); const B = x.prototype; if (u) {
|
||||||
|
x = new a(s, x);
|
||||||
|
} for (let y = 0, w = v.length; y < w; y++) { const C = v[y]; const A = x[C]; const z = B[C]; if (A) { A.protect(); } if (u && z) { x.implement(C, z.protect()); } } if (u) {
|
||||||
|
const t = B.propertyIsEnumerable(v[0]);
|
||||||
|
x.forEachMethod = function (G) { if (!t) { for (let F = 0, D = v.length; F < D; F++) { G.call(B, B[v[F]], v[F]); } } for (const E in B) { G.call(B, B[E], E); } };
|
||||||
|
} return d;
|
||||||
|
}; d('String', String, ['charAt', 'charCodeAt', 'concat', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search', 'slice', 'split', 'substr', 'substring', 'trim', 'toLowerCase', 'toUpperCase'])('Array', Array, ['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice', 'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight'])('Number', Number, ['toExponential', 'toFixed', 'toLocaleString', 'toPrecision'])('Function', f, ['apply', 'call', 'bind'])('RegExp', RegExp, ['exec', 'test'])('Object', Object, ['create', 'defineProperty', 'defineProperties', 'keys', 'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames', 'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen'])('Date', Date, ['now']);
|
||||||
|
Object.extend = m.overloadSetter(); Date.extend('now', () => +(new Date())); new a('Boolean', Boolean); Number.prototype.$family = function () {
|
||||||
|
return isFinite(this) ? 'number' : 'null';
|
||||||
|
}.hide(); Number.extend('random', (s, i) => Math.floor(Math.random() * (i - s + 1) + s)); const g = Object.prototype.hasOwnProperty; Object.extend('forEach', (i, t, u) => {
|
||||||
|
for (const s in i) {
|
||||||
|
if (g.call(i, s)) {
|
||||||
|
t.call(u, i[s], s, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}); Object.each = Object.forEach; Array.implement({
|
||||||
|
forEach(u, v) { for (let t = 0, s = this.length; t < s; t++) { if (t in this) { u.call(v, this[t], t, this); } } },
|
||||||
|
each(i, s) {
|
||||||
|
Array.forEach(this, i, s);
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
}); const l = function (i) { switch (o(i)) { case 'array': return i.clone(); case 'object': return Object.clone(i); default: return i; } }; Array.implement('clone', function () {
|
||||||
|
let s = this.length; const t = new Array(s);
|
||||||
|
while (s--) { t[s] = l(this[s]); } return t;
|
||||||
|
}); const h = function (s, i, t) {
|
||||||
|
switch (o(t)) {
|
||||||
|
case 'object': if (o(s[i]) == 'object') { Object.merge(s[i], t); } else {
|
||||||
|
s[i] = Object.clone(t);
|
||||||
|
} break; case 'array': s[i] = t.clone(); break; default: s[i] = t;
|
||||||
|
} return s;
|
||||||
|
}; Object.extend({
|
||||||
|
merge(z, u, t) {
|
||||||
|
if (o(u) == 'string') { return h(z, u, t); } for (let y = 1, s = arguments.length;
|
||||||
|
y < s; y++) { const w = arguments[y]; for (const x in w) { h(z, x, w[x]); } } return z;
|
||||||
|
},
|
||||||
|
clone(i) { const t = {}; for (const s in i) { t[s] = l(i[s]); } return t; },
|
||||||
|
append(w) {
|
||||||
|
for (let v = 1, t = arguments.length;
|
||||||
|
v < t; v++) { const s = arguments[v] || {}; for (const u in s) { w[u] = s[u]; } } return w;
|
||||||
|
},
|
||||||
|
}); ['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each((i) => {
|
||||||
|
new a(i);
|
||||||
|
}); let c = Date.now(); String.extend('uniqueID', () => (c++).toString(36));
|
||||||
|
}()); Array.implement({
|
||||||
|
every(c, d) {
|
||||||
|
for (let b = 0, a = this.length >>> 0;
|
||||||
|
b < a; b++) { if ((b in this) && !c.call(d, this[b], b, this)) { return false; } } return true;
|
||||||
|
},
|
||||||
|
filter(d, f) {
|
||||||
|
const c = []; for (var e, b = 0, a = this.length >>> 0; b < a; b++) {
|
||||||
|
if (b in this) {
|
||||||
|
e = this[b];
|
||||||
|
if (d.call(f, e, b, this)) { c.push(e); }
|
||||||
|
}
|
||||||
|
} return c;
|
||||||
|
},
|
||||||
|
indexOf(c, d) {
|
||||||
|
const b = this.length >>> 0; for (let a = (d < 0) ? Math.max(0, b + d) : d || 0; a < b; a++) {
|
||||||
|
if (this[a] === c) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
} return -1;
|
||||||
|
},
|
||||||
|
map(c, e) { const d = this.length >>> 0; const b = Array(d); for (let a = 0; a < d; a++) { if (a in this) { b[a] = c.call(e, this[a], a, this); } } return b; },
|
||||||
|
some(c, d) {
|
||||||
|
for (let b = 0, a = this.length >>> 0;
|
||||||
|
b < a; b++) { if ((b in this) && c.call(d, this[b], b, this)) { return true; } } return false;
|
||||||
|
},
|
||||||
|
clean() { return this.filter((a) => a != null); },
|
||||||
|
invoke(a) {
|
||||||
|
const b = Array.slice(arguments, 1);
|
||||||
|
return this.map((c) => c[a].apply(c, b));
|
||||||
|
},
|
||||||
|
associate(c) {
|
||||||
|
const d = {}; const b = Math.min(this.length, c.length); for (let a = 0; a < b; a++) {
|
||||||
|
d[c[a]] = this[a];
|
||||||
|
} return d;
|
||||||
|
},
|
||||||
|
link(c) { const a = {}; for (let e = 0, b = this.length; e < b; e++) { for (const d in c) { if (c[d](this[e])) { a[d] = this[e]; delete c[d]; break; } } } return a; },
|
||||||
|
contains(a, b) {
|
||||||
|
return this.indexOf(a, b) != -1;
|
||||||
|
},
|
||||||
|
append(a) { this.push.apply(this, a); return this; },
|
||||||
|
getLast() { return (this.length) ? this[this.length - 1] : null; },
|
||||||
|
getRandom() {
|
||||||
|
return (this.length) ? this[Number.random(0, this.length - 1)] : null;
|
||||||
|
},
|
||||||
|
include(a) { if (!this.contains(a)) { this.push(a); } return this; },
|
||||||
|
combine(c) {
|
||||||
|
for (let b = 0, a = c.length; b < a; b++) { this.include(c[b]); } return this;
|
||||||
|
},
|
||||||
|
erase(b) { for (let a = this.length; a--;) { if (this[a] === b) { this.splice(a, 1); } } return this; },
|
||||||
|
empty() { this.length = 0; return this; },
|
||||||
|
flatten() {
|
||||||
|
let d = [];
|
||||||
|
for (let b = 0, a = this.length; b < a; b++) {
|
||||||
|
const c = typeOf(this[b]); if (c == 'null') { continue; }d = d.concat((c == 'array' || c == 'collection' || c == 'arguments' || instanceOf(this[b], Array)) ? Array.flatten(this[b]) : this[b]);
|
||||||
|
} return d;
|
||||||
|
},
|
||||||
|
pick() { for (let b = 0, a = this.length; b < a; b++) { if (this[b] != null) { return this[b]; } } return null; },
|
||||||
|
rgbToHex(d) {
|
||||||
|
if (this.length < 3) { return null; } if (this.length == 4 && this[3] == 0 && !d) {
|
||||||
|
return 'transparent';
|
||||||
|
} const b = []; for (let a = 0; a < 3; a++) { const c = (this[a] - 0).toString(16); b.push((c.length == 1) ? `0${c}` : c); } return (d) ? b : `#${b.join('')}`;
|
||||||
|
},
|
||||||
|
}); String.implement({
|
||||||
|
test(a, b) {
|
||||||
|
return ((typeOf(a) == 'regexp') ? a : new RegExp(`${a}`, b)).test(this);
|
||||||
|
},
|
||||||
|
contains(a, b) { return (b) ? (b + this + b).indexOf(b + a + b) > -1 : String(this).indexOf(a) > -1; },
|
||||||
|
trim() {
|
||||||
|
return String(this).replace(/^\s+|\s+$/g, '');
|
||||||
|
},
|
||||||
|
clean() { return String(this).replace(/\s+/g, ' ').trim(); },
|
||||||
|
camelCase() {
|
||||||
|
return String(this).replace(/-\D/g, (a) => a.charAt(1).toUpperCase());
|
||||||
|
},
|
||||||
|
hyphenate() { return String(this).replace(/[A-Z]/g, (a) => (`-${a.charAt(0).toLowerCase()}`)); },
|
||||||
|
capitalize() {
|
||||||
|
return String(this).replace(/\b[a-z]/g, (a) => a.toUpperCase());
|
||||||
|
},
|
||||||
|
escapeRegExp() { return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1'); },
|
||||||
|
rgbToHex(b) {
|
||||||
|
const a = String(this).match(/\d{1,3}/g);
|
||||||
|
return (a) ? a.rgbToHex(b) : null;
|
||||||
|
},
|
||||||
|
substitute(a, b) {
|
||||||
|
return String(this).replace(b || (/\\?\{([^{}]+)\}/g), (d, c) => {
|
||||||
|
if (d.charAt(0) == '\\') {
|
||||||
|
return d.slice(1);
|
||||||
|
} return (a[c] != null) ? a[c] : '';
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
Function.implement({ bind(e) { const a = this; const b = arguments.length > 1 ? Array.slice(arguments, 1) : null; const d = function () {}; var c = function () { let g = e; const h = arguments.length; if (this instanceof c) { d.prototype = a.prototype; g = new d(); } const f = (!b && !h) ? a.call(g) : a.apply(g, b && h ? b.concat(Array.slice(arguments)) : b || arguments); return g == e ? f : g; }; return c; }, pass(b, c) { const a = this; if (b != null) { b = Array.from(b); } return function () { return a.apply(c, b || arguments); }; }, delay(b, c, a) { return setTimeout(this.pass((a == null ? [] : a), c), b); } });
|
||||||
|
Number.alias('each', 'times'); (function (b) {
|
||||||
|
const a = {}; b.each((c) => {
|
||||||
|
if (!Number[c]) {
|
||||||
|
a[c] = function () {
|
||||||
|
return Math[c].apply(null, [this].concat(Array.from(arguments)));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}); Number.implement(a);
|
||||||
|
}(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan'])); (function () {
|
||||||
|
var a = this.Class = new Type('Class', function (h) {
|
||||||
|
if (instanceOf(h, Function)) {
|
||||||
|
h = { initialize: h };
|
||||||
|
} var g = function () {
|
||||||
|
e(this); if (g.$prototyping) { return this; } this.$caller = null; const i = (this.initialize) ? this.initialize.apply(this, arguments) : this; this.$caller = this.caller = null;
|
||||||
|
return i;
|
||||||
|
}.extend(this).implement(h); g.$constructor = a; g.prototype.$constructor = g; g.prototype.parent = c; return g;
|
||||||
|
}); var c = function () {
|
||||||
|
if (!this.$caller) {
|
||||||
|
throw new Error('The method "parent" cannot be called.');
|
||||||
|
} const g = this.$caller.$name; const h = this.$caller.$owner.parent; const i = (h) ? h.prototype[g] : null; if (!i) { throw new Error(`The method "${g}" has no parent.`); } return i.apply(this, arguments);
|
||||||
|
}; var e = function (g) {
|
||||||
|
for (const h in g) {
|
||||||
|
const j = g[h]; switch (typeOf(j)) {
|
||||||
|
case 'object': var i = function () {}; i.prototype = j; g[h] = e(new i()); break; case 'array': g[h] = j.clone();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} return g;
|
||||||
|
}; const b = function (g, h, j) {
|
||||||
|
if (j.$origin) { j = j.$origin; } var i = function () {
|
||||||
|
if (j.$protected && this.$caller == null) {
|
||||||
|
throw new Error(`The method "${h}" cannot be called.`);
|
||||||
|
} const l = this.caller; const m = this.$caller; this.caller = m; this.$caller = i; const k = j.apply(this, arguments); this.$caller = m; this.caller = l; return k;
|
||||||
|
}.extend({ $owner: g, $origin: j, $name: h });
|
||||||
|
return i;
|
||||||
|
}; const f = function (h, i, g) {
|
||||||
|
if (a.Mutators.hasOwnProperty(h)) { i = a.Mutators[h].call(this, i); if (i == null) { return this; } } if (typeOf(i) == 'function') {
|
||||||
|
if (i.$hidden) {
|
||||||
|
return this;
|
||||||
|
} this.prototype[h] = (g) ? i : b(this, h, i);
|
||||||
|
} else { Object.merge(this.prototype, h, i); } return this;
|
||||||
|
}; const d = function (g) {
|
||||||
|
g.$prototyping = true; const h = new g(); delete g.$prototyping;
|
||||||
|
return h;
|
||||||
|
}; a.implement('implement', f.overloadSetter()); a.Mutators = { Extends(g) { this.parent = g; this.prototype = d(g); }, Implements(g) { Array.from(g).each(function (j) { const h = new j(); for (const i in h) { f.call(this, i, h[i], true); } }, this); } };
|
||||||
|
}());
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -17,15 +17,15 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const FeatureModel = new Class(/** @lends FeatureModel */{
|
const FeatureModel = new Class(/** @lends FeatureModel */{
|
||||||
Static:{
|
Static: {
|
||||||
_nextUUID:function () {
|
_nextUUID() {
|
||||||
if (!$defined(FeatureModel._uuid)) {
|
if (!$defined(FeatureModel._uuid)) {
|
||||||
FeatureModel._uuid = 0;
|
FeatureModel._uuid = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
FeatureModel._uuid = FeatureModel._uuid + 1;
|
FeatureModel._uuid += 1;
|
||||||
return FeatureModel._uuid;
|
return FeatureModel._uuid;
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -34,7 +34,7 @@ const FeatureModel = new Class(/** @lends FeatureModel */{
|
|||||||
* @throws will throw an exception if type is null or undefined
|
* @throws will throw an exception if type is null or undefined
|
||||||
* assigns a unique id and the given type to the new model
|
* assigns a unique id and the given type to the new model
|
||||||
*/
|
*/
|
||||||
initialize:function (type) {
|
initialize(type) {
|
||||||
$assert(type, 'type can not be null');
|
$assert(type, 'type can not be null');
|
||||||
this._id = FeatureModel._nextUUID();
|
this._id = FeatureModel._nextUUID();
|
||||||
|
|
||||||
@ -42,50 +42,50 @@ const FeatureModel = new Class(/** @lends FeatureModel */{
|
|||||||
this._attributes = {};
|
this._attributes = {};
|
||||||
|
|
||||||
// Create type method ...
|
// Create type method ...
|
||||||
this['is' + $.camelCase(type) + 'Model'] = function () {
|
this[`is${$.camelCase(type)}Model`] = function () {
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getAttributes:function () {
|
getAttributes() {
|
||||||
return Object.clone(this._attributes);
|
return Object.clone(this._attributes);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setAttributes:function (attributes) {
|
setAttributes(attributes) {
|
||||||
for (key in attributes) {
|
for (key in attributes) {
|
||||||
this["set" + key.capitalize()](attributes[key]);
|
this[`set${key.capitalize()}`](attributes[key]);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setAttribute:function (key, value) {
|
setAttribute(key, value) {
|
||||||
$assert(key, 'key id can not be null');
|
$assert(key, 'key id can not be null');
|
||||||
this._attributes[key] = value;
|
this._attributes[key] = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getAttribute:function (key) {
|
getAttribute(key) {
|
||||||
$assert(key, 'key id can not be null');
|
$assert(key, 'key id can not be null');
|
||||||
|
|
||||||
return this._attributes[key];
|
return this._attributes[key];
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getId:function () {
|
getId() {
|
||||||
return this._id;
|
return this._id;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setId:function (id) {
|
setId(id) {
|
||||||
this._id = id;
|
this._id = id;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getType:function () {
|
getType() {
|
||||||
return this._type;
|
return this._type;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default FeatureModel;
|
export default FeatureModel;
|
||||||
|
@ -21,63 +21,63 @@ const IMindmap = new Class(/** @lends IMindmap */{
|
|||||||
* @constructs
|
* @constructs
|
||||||
* @abstract
|
* @abstract
|
||||||
*/
|
*/
|
||||||
initialize : function() {
|
initialize() {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getCentralTopic : function() {
|
getCentralTopic() {
|
||||||
return this.getBranches()[0];
|
return this.getBranches()[0];
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
getDescription : function() {
|
getDescription() {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
setDescription : function(value) {
|
setDescription(value) {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
getId : function() {
|
getId() {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
setId : function(id) {
|
setId(id) {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
getVersion : function() {
|
getVersion() {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
setVersion : function(version) {
|
setVersion(version) {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
addBranch : function(nodeModel) {
|
addBranch(nodeModel) {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
getBranches : function() {
|
getBranches() {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
removeBranch : function(node) {
|
removeBranch(node) {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
getRelationships : function() {
|
getRelationships() {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -85,7 +85,7 @@ const IMindmap = new Class(/** @lends IMindmap */{
|
|||||||
* @param child
|
* @param child
|
||||||
* @throws will throw an error if child already has a connection to a parent node
|
* @throws will throw an error if child already has a connection to a parent node
|
||||||
*/
|
*/
|
||||||
connect : function(parent, child) {
|
connect(parent, child) {
|
||||||
// Child already has a parent ?
|
// Child already has a parent ?
|
||||||
$assert(!child.getParent(), 'Child model seems to be already connected');
|
$assert(!child.getParent(), 'Child model seems to be already connected');
|
||||||
|
|
||||||
@ -101,8 +101,8 @@ const IMindmap = new Class(/** @lends IMindmap */{
|
|||||||
* @throws will throw an error if child is null or undefined
|
* @throws will throw an error if child is null or undefined
|
||||||
* @throws will throw an error if child's parent cannot be found
|
* @throws will throw an error if child's parent cannot be found
|
||||||
*/
|
*/
|
||||||
disconnect : function(child) {
|
disconnect(child) {
|
||||||
var parent = child.getParent();
|
const parent = child.getParent();
|
||||||
$assert(child, 'Child can not be null.');
|
$assert(child, 'Child can not be null.');
|
||||||
$assert(parent, 'Child model seems to be already connected');
|
$assert(parent, 'Child model seems to be already connected');
|
||||||
|
|
||||||
@ -111,71 +111,71 @@ const IMindmap = new Class(/** @lends IMindmap */{
|
|||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
hasAlreadyAdded : function(node) {
|
hasAlreadyAdded(node) {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
createNode : function(type, id) {
|
createNode(type, id) {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
createRelationship : function(fromNode, toNode) {
|
createRelationship(fromNode, toNode) {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
addRelationship : function(rel) {
|
addRelationship(rel) {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
deleteRelationship : function(relationship) {
|
deleteRelationship(relationship) {
|
||||||
throw "Unsupported operation";
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
inspect : function() {
|
inspect() {
|
||||||
var result = '';
|
let result = '';
|
||||||
result = '{ ';
|
result = '{ ';
|
||||||
|
|
||||||
var branches = this.getBranches();
|
const branches = this.getBranches();
|
||||||
result = result + "version:" + this.getVersion();
|
result = `${result}version:${this.getVersion()}`;
|
||||||
result = result + " , [";
|
result = `${result} , [`;
|
||||||
|
|
||||||
for (var i = 0; i < branches.length; i++) {
|
for (let i = 0; i < branches.length; i++) {
|
||||||
var node = branches[i];
|
const node = branches[i];
|
||||||
if (i != 0) {
|
if (i != 0) {
|
||||||
result = result + ',\n ';
|
result = `${result},\n `;
|
||||||
}
|
}
|
||||||
result = result + "(" + i + ") =>" + node.inspect();
|
result = `${result}(${i}) =>${node.inspect()}`;
|
||||||
}
|
}
|
||||||
result = result + "]";
|
result = `${result}]`;
|
||||||
|
|
||||||
result = result + ' } ';
|
result = `${result} } `;
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param target
|
* @param target
|
||||||
*/
|
*/
|
||||||
copyTo : function(target) {
|
copyTo(target) {
|
||||||
var source = this;
|
const source = this;
|
||||||
var version = source.getVersion();
|
const version = source.getVersion();
|
||||||
target.setVersion(version);
|
target.setVersion(version);
|
||||||
|
|
||||||
var desc = this.getDescription();
|
const desc = this.getDescription();
|
||||||
target.setDescription(desc);
|
target.setDescription(desc);
|
||||||
|
|
||||||
// Then the rest of the branches ...
|
// Then the rest of the branches ...
|
||||||
var sbranchs = source.getBranches();
|
const sbranchs = source.getBranches();
|
||||||
_.each(sbranchs, function(snode) {
|
_.each(sbranchs, (snode) => {
|
||||||
var tnode = target.createNode(snode.getType(), snode.getId());
|
const tnode = target.createNode(snode.getType(), snode.getId());
|
||||||
snode.copyTo(tnode);
|
snode.copyTo(tnode);
|
||||||
target.addBranch(tnode);
|
target.addBranch(tnode);
|
||||||
});
|
});
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default IMindmap
|
export default IMindmap;
|
||||||
|
@ -22,18 +22,18 @@ const INodeModel = new Class(
|
|||||||
* @constructs
|
* @constructs
|
||||||
* @param mindmap
|
* @param mindmap
|
||||||
*/
|
*/
|
||||||
initialize: function (mindmap) {
|
initialize(mindmap) {
|
||||||
$assert(mindmap && mindmap.getBranches, 'mindmap can not be null');
|
$assert(mindmap && mindmap.getBranches, 'mindmap can not be null');
|
||||||
this._mindmap = mindmap;
|
this._mindmap = mindmap;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getId: function () {
|
getId() {
|
||||||
return this.getProperty('id');
|
return this.getProperty('id');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setId: function (id) {
|
setId(id) {
|
||||||
if ($defined(id) && id > INodeModel._uuid) {
|
if ($defined(id) && id > INodeModel._uuid) {
|
||||||
INodeModel._uuid = id;
|
INodeModel._uuid = id;
|
||||||
}
|
}
|
||||||
@ -45,79 +45,79 @@ const INodeModel = new Class(
|
|||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getType: function () {
|
getType() {
|
||||||
return this.getProperty('type');
|
return this.getProperty('type');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setType: function (type) {
|
setType(type) {
|
||||||
this.putProperty('type', type);
|
this.putProperty('type', type);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setText: function (text) {
|
setText(text) {
|
||||||
this.putProperty('text', text);
|
this.putProperty('text', text);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getText: function () {
|
getText() {
|
||||||
return this.getProperty('text');
|
return this.getProperty('text');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setPosition: function (x, y) {
|
setPosition(x, y) {
|
||||||
$assert(!isNaN(parseInt(x)), 'x position is not valid:' + x);
|
$assert(!isNaN(parseInt(x)), `x position is not valid:${x}`);
|
||||||
$assert(!isNaN(parseInt(y)), 'y position is not valid:' + y);
|
$assert(!isNaN(parseInt(y)), `y position is not valid:${y}`);
|
||||||
this.putProperty('position', '{x:' + parseInt(x) + ',y:' + parseInt(y) + '}');
|
this.putProperty('position', `{x:${parseInt(x)},y:${parseInt(y)}}`);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getPosition: function () {
|
getPosition() {
|
||||||
var value = this.getProperty('position');
|
const value = this.getProperty('position');
|
||||||
var result = null;
|
let result = null;
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
result = eval('(' + value + ')');
|
result = eval(`(${value})`);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setImageSize: function (width, height) {
|
setImageSize(width, height) {
|
||||||
this.putProperty('imageSize', '{width:' + width + ',height:' + height + '}');
|
this.putProperty('imageSize', `{width:${width},height:${height}}`);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getImageSize: function () {
|
getImageSize() {
|
||||||
var value = this.getProperty('imageSize');
|
const value = this.getProperty('imageSize');
|
||||||
var result = null;
|
let result = null;
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
result = eval('(' + value + ')');
|
result = eval(`(${value})`);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setImageUrl: function (url) {
|
setImageUrl(url) {
|
||||||
this.putProperty('imageUrl', url);
|
this.putProperty('imageUrl', url);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getMetadata: function () {
|
getMetadata() {
|
||||||
return this.getProperty('metadata');
|
return this.getProperty('metadata');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setMetadata: function (json) {
|
setMetadata(json) {
|
||||||
this.putProperty('metadata', json);
|
this.putProperty('metadata', json);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getImageUrl: function () {
|
getImageUrl() {
|
||||||
return this.getProperty('imageUrl');
|
return this.getProperty('imageUrl');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getMindmap: function () {
|
getMindmap() {
|
||||||
return this._mindmap;
|
return this._mindmap;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -125,134 +125,134 @@ const INodeModel = new Class(
|
|||||||
* lets the mindmap handle the disconnect node operation
|
* lets the mindmap handle the disconnect node operation
|
||||||
* @see mindplot.model.IMindmap.disconnect
|
* @see mindplot.model.IMindmap.disconnect
|
||||||
*/
|
*/
|
||||||
disconnect: function () {
|
disconnect() {
|
||||||
var mindmap = this.getMindmap();
|
const mindmap = this.getMindmap();
|
||||||
mindmap.disconnect(this);
|
mindmap.disconnect(this);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getShapeType: function () {
|
getShapeType() {
|
||||||
return this.getProperty('shapeType');
|
return this.getProperty('shapeType');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setShapeType: function (type) {
|
setShapeType(type) {
|
||||||
this.putProperty('shapeType', type);
|
this.putProperty('shapeType', type);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setOrder: function (value) {
|
setOrder(value) {
|
||||||
$assert(
|
$assert(
|
||||||
(typeof value === 'number' && isFinite(value)) || value == null,
|
(typeof value === 'number' && isFinite(value)) || value == null,
|
||||||
'Order must be null or a number'
|
'Order must be null or a number',
|
||||||
);
|
);
|
||||||
this.putProperty('order', value);
|
this.putProperty('order', value);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getOrder: function () {
|
getOrder() {
|
||||||
return this.getProperty('order');
|
return this.getProperty('order');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setFontFamily: function (fontFamily) {
|
setFontFamily(fontFamily) {
|
||||||
this.putProperty('fontFamily', fontFamily);
|
this.putProperty('fontFamily', fontFamily);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getFontFamily: function () {
|
getFontFamily() {
|
||||||
return this.getProperty('fontFamily');
|
return this.getProperty('fontFamily');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setFontStyle: function (fontStyle) {
|
setFontStyle(fontStyle) {
|
||||||
this.putProperty('fontStyle', fontStyle);
|
this.putProperty('fontStyle', fontStyle);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getFontStyle: function () {
|
getFontStyle() {
|
||||||
return this.getProperty('fontStyle');
|
return this.getProperty('fontStyle');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setFontWeight: function (weight) {
|
setFontWeight(weight) {
|
||||||
this.putProperty('fontWeight', weight);
|
this.putProperty('fontWeight', weight);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getFontWeight: function () {
|
getFontWeight() {
|
||||||
return this.getProperty('fontWeight');
|
return this.getProperty('fontWeight');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setFontColor: function (color) {
|
setFontColor(color) {
|
||||||
this.putProperty('fontColor', color);
|
this.putProperty('fontColor', color);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getFontColor: function () {
|
getFontColor() {
|
||||||
return this.getProperty('fontColor');
|
return this.getProperty('fontColor');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setFontSize: function (size) {
|
setFontSize(size) {
|
||||||
this.putProperty('fontSize', size);
|
this.putProperty('fontSize', size);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getFontSize: function () {
|
getFontSize() {
|
||||||
return this.getProperty('fontSize');
|
return this.getProperty('fontSize');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getBorderColor: function () {
|
getBorderColor() {
|
||||||
return this.getProperty('borderColor');
|
return this.getProperty('borderColor');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setBorderColor: function (color) {
|
setBorderColor(color) {
|
||||||
this.putProperty('borderColor', color);
|
this.putProperty('borderColor', color);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getBackgroundColor: function () {
|
getBackgroundColor() {
|
||||||
return this.getProperty('backgroundColor');
|
return this.getProperty('backgroundColor');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setBackgroundColor: function (color) {
|
setBackgroundColor(color) {
|
||||||
this.putProperty('backgroundColor', color);
|
this.putProperty('backgroundColor', color);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
areChildrenShrunken: function () {
|
areChildrenShrunken() {
|
||||||
var result = this.getProperty('shrunken');
|
const result = this.getProperty('shrunken');
|
||||||
return $defined(result) ? result : false;
|
return $defined(result) ? result : false;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return {Boolean} true if the children nodes are hidden by the shrink option
|
* @return {Boolean} true if the children nodes are hidden by the shrink option
|
||||||
*/
|
*/
|
||||||
setChildrenShrunken: function (value) {
|
setChildrenShrunken(value) {
|
||||||
this.putProperty('shrunken', value);
|
this.putProperty('shrunken', value);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return {Boolean} true
|
* @return {Boolean} true
|
||||||
*/
|
*/
|
||||||
isNodeModel: function () {
|
isNodeModel() {
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return {Boolean} true if the node model has a parent assigned to it
|
* @return {Boolean} true if the node model has a parent assigned to it
|
||||||
*/
|
*/
|
||||||
isConnected: function () {
|
isConnected() {
|
||||||
return this.getParent() != null;
|
return this.getParent() != null;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
append: function (node) {
|
append(node) {
|
||||||
throw 'Unsupported operation';
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -261,9 +261,9 @@ const INodeModel = new Class(
|
|||||||
* @throws will throw an error if parent is null or undefined
|
* @throws will throw an error if parent is null or undefined
|
||||||
* @see mindplot.model.IMindmap.connect
|
* @see mindplot.model.IMindmap.connect
|
||||||
*/
|
*/
|
||||||
connectTo: function (parent) {
|
connectTo(parent) {
|
||||||
$assert(parent, 'parent can not be null');
|
$assert(parent, 'parent can not be null');
|
||||||
var mindmap = this.getMindmap();
|
const mindmap = this.getMindmap();
|
||||||
mindmap.connect(parent, this);
|
mindmap.connect(parent, this);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -271,21 +271,21 @@ const INodeModel = new Class(
|
|||||||
* @param target
|
* @param target
|
||||||
* @return target
|
* @return target
|
||||||
*/
|
*/
|
||||||
copyTo: function (target) {
|
copyTo(target) {
|
||||||
var source = this;
|
const source = this;
|
||||||
// Copy properties ...
|
// Copy properties ...
|
||||||
var keys = source.getPropertiesKeys();
|
const keys = source.getPropertiesKeys();
|
||||||
_.each(keys, function (key) {
|
_.each(keys, (key) => {
|
||||||
var value = source.getProperty(key);
|
const value = source.getProperty(key);
|
||||||
target.putProperty(key, value);
|
target.putProperty(key, value);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Copy children ...
|
// Copy children ...
|
||||||
var children = this.getChildren();
|
const children = this.getChildren();
|
||||||
var tmindmap = target.getMindmap();
|
const tmindmap = target.getMindmap();
|
||||||
|
|
||||||
_.each(function (children, snode) {
|
_.each((children, snode) => {
|
||||||
var tnode = tmindmap.createNode(snode.getType(), snode.getId());
|
const tnode = tmindmap.createNode(snode.getType(), snode.getId());
|
||||||
snode.copyTo(tnode);
|
snode.copyTo(tnode);
|
||||||
target.append(tnode);
|
target.append(tnode);
|
||||||
});
|
});
|
||||||
@ -297,11 +297,11 @@ const INodeModel = new Class(
|
|||||||
* lets parent handle the delete node operation, or, if none defined, calls the mindmap to
|
* lets parent handle the delete node operation, or, if none defined, calls the mindmap to
|
||||||
* remove the respective branch
|
* remove the respective branch
|
||||||
*/
|
*/
|
||||||
deleteNode: function () {
|
deleteNode() {
|
||||||
var mindmap = this.getMindmap();
|
const mindmap = this.getMindmap();
|
||||||
|
|
||||||
// console.log("Before:" + mindmap.inspect());
|
// console.log("Before:" + mindmap.inspect());
|
||||||
var parent = this.getParent();
|
const parent = this.getParent();
|
||||||
if ($defined(parent)) {
|
if ($defined(parent)) {
|
||||||
parent.removeChild(this);
|
parent.removeChild(this);
|
||||||
} else {
|
} else {
|
||||||
@ -313,68 +313,67 @@ const INodeModel = new Class(
|
|||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
getPropertiesKeys: function () {
|
getPropertiesKeys() {
|
||||||
throw 'Unsupported operation';
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
putProperty: function (key, value) {
|
putProperty(key, value) {
|
||||||
throw 'Unsupported operation';
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
setParent: function (parent) {
|
setParent(parent) {
|
||||||
throw 'Unsupported operation';
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
getChildren: function () {
|
getChildren() {
|
||||||
throw 'Unsupported operation';
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
getParent: function () {
|
getParent() {
|
||||||
throw 'Unsupported operation';
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
clone: function () {
|
clone() {
|
||||||
throw 'Unsupported operation';
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
inspect: function () {
|
inspect() {
|
||||||
var result =
|
let result = `{ type: ${
|
||||||
'{ type: ' +
|
this.getType()
|
||||||
this.getType() +
|
} , id: ${
|
||||||
' , id: ' +
|
this.getId()
|
||||||
this.getId() +
|
} , text: ${
|
||||||
' , text: ' +
|
this.getText()}`;
|
||||||
this.getText();
|
|
||||||
|
|
||||||
var children = this.getChildren();
|
const children = this.getChildren();
|
||||||
if (children.length > 0) {
|
if (children.length > 0) {
|
||||||
result = result + ', children: {(size:' + children.length;
|
result = `${result}, children: {(size:${children.length}`;
|
||||||
_.each(children, function (node) {
|
_.each(children, (node) => {
|
||||||
result = result + '=> (';
|
result = `${result}=> (`;
|
||||||
var keys = node.getPropertiesKeys();
|
const keys = node.getPropertiesKeys();
|
||||||
_.each(keys, function (key) {
|
_.each(keys, (key) => {
|
||||||
var value = node.getProperty(key);
|
const value = node.getProperty(key);
|
||||||
result = result + key + ':' + value + ',';
|
result = `${result + key}:${value},`;
|
||||||
});
|
});
|
||||||
result = result + '}';
|
result = `${result}}`;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
result = result + ' }';
|
result = `${result} }`;
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @abstract */
|
/** @abstract */
|
||||||
removeChild: function (child) {
|
removeChild(child) {
|
||||||
throw 'Unsupported operation';
|
throw 'Unsupported operation';
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -416,7 +415,7 @@ INodeModel._nextUUID = function () {
|
|||||||
INodeModel._uuid = 0;
|
INodeModel._uuid = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
INodeModel._uuid = INodeModel._uuid + 1;
|
INodeModel._uuid += 1;
|
||||||
return INodeModel._uuid;
|
return INodeModel._uuid;
|
||||||
};
|
};
|
||||||
INodeModel._uuid = 0;
|
INodeModel._uuid = 0;
|
||||||
|
@ -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.
|
||||||
*/
|
*/
|
||||||
const FeatureModel = require('./FeatureModel').default
|
const FeatureModel = require('./FeatureModel').default;
|
||||||
|
|
||||||
const IconModel = new Class(/** @lends IconModel */{
|
const IconModel = new Class(/** @lends IconModel */{
|
||||||
Extends: FeatureModel,
|
Extends: FeatureModel,
|
||||||
@ -24,21 +24,21 @@ const IconModel = new Class(/** @lends IconModel */{
|
|||||||
* @param attributes
|
* @param attributes
|
||||||
* @extends mindplot.model.FeatureModel
|
* @extends mindplot.model.FeatureModel
|
||||||
*/
|
*/
|
||||||
initialize:function (attributes) {
|
initialize(attributes) {
|
||||||
this.parent(IconModel.FEATURE_TYPE);
|
this.parent(IconModel.FEATURE_TYPE);
|
||||||
this.setIconType(attributes.id);
|
this.setIconType(attributes.id);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @return the icon type id */
|
/** @return the icon type id */
|
||||||
getIconType:function () {
|
getIconType() {
|
||||||
return this.getAttribute('id');
|
return this.getAttribute('id');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @param {String} iconType the icon type id*/
|
/** @param {String} iconType the icon type id */
|
||||||
setIconType:function (iconType) {
|
setIconType(iconType) {
|
||||||
$assert(iconType, 'iconType id can not be null');
|
$assert(iconType, 'iconType id can not be null');
|
||||||
this.setAttribute('id', iconType);
|
this.setAttribute('id', iconType);
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -46,6 +46,6 @@ const IconModel = new Class(/** @lends IconModel */{
|
|||||||
* @type {String}
|
* @type {String}
|
||||||
* @default
|
* @default
|
||||||
*/
|
*/
|
||||||
IconModel.FEATURE_TYPE = "icon";
|
IconModel.FEATURE_TYPE = 'icon';
|
||||||
|
|
||||||
export default IconModel;
|
export default IconModel;
|
||||||
|
@ -18,19 +18,19 @@
|
|||||||
const FeatureModel = require('./FeatureModel').default;
|
const FeatureModel = require('./FeatureModel').default;
|
||||||
|
|
||||||
const LinkModel = new Class(/** @lends LinkModel */{
|
const LinkModel = new Class(/** @lends LinkModel */{
|
||||||
Extends:FeatureModel,
|
Extends: FeatureModel,
|
||||||
/**
|
/**
|
||||||
* @constructs
|
* @constructs
|
||||||
* @param attributes
|
* @param attributes
|
||||||
* @extends mindplot.model.FeatureModel
|
* @extends mindplot.model.FeatureModel
|
||||||
*/
|
*/
|
||||||
initialize:function (attributes) {
|
initialize(attributes) {
|
||||||
this.parent(LinkModel.FEATURE_TYPE);
|
this.parent(LinkModel.FEATURE_TYPE);
|
||||||
this.setUrl(attributes.url);
|
this.setUrl(attributes.url);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** @return {String} the url attribute value */
|
/** @return {String} the url attribute value */
|
||||||
getUrl:function () {
|
getUrl() {
|
||||||
return this.getAttribute('url');
|
return this.getAttribute('url');
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -38,22 +38,21 @@ const LinkModel = new Class(/** @lends LinkModel */{
|
|||||||
* @param {String} url a URL provided by the user to set the link to
|
* @param {String} url a URL provided by the user to set the link to
|
||||||
* @throws will throw an error if url is null or undefined
|
* @throws will throw an error if url is null or undefined
|
||||||
*/
|
*/
|
||||||
setUrl:function (url) {
|
setUrl(url) {
|
||||||
$assert(url, 'url can not be null');
|
$assert(url, 'url can not be null');
|
||||||
|
|
||||||
var fixedUrl = this._fixUrl(url);
|
const fixedUrl = this._fixUrl(url);
|
||||||
this.setAttribute('url', fixedUrl);
|
this.setAttribute('url', fixedUrl);
|
||||||
|
|
||||||
var type = fixedUrl.contains('mailto:') ? 'mail' : 'url';
|
const type = fixedUrl.contains('mailto:') ? 'mail' : 'url';
|
||||||
this.setAttribute('urlType', type);
|
this.setAttribute('urlType', type);
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
//url format is already checked in LinkEditor.checkUrl
|
// url format is already checked in LinkEditor.checkUrl
|
||||||
_fixUrl:function (url) {
|
_fixUrl(url) {
|
||||||
var result = url;
|
let result = url;
|
||||||
if (!result.contains('http://') && !result.contains('https://') && !result.contains('mailto://')) {
|
if (!result.contains('http://') && !result.contains('https://') && !result.contains('mailto://')) {
|
||||||
result = "http://" + result;
|
result = `http://${result}`;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
@ -62,10 +61,10 @@ const LinkModel = new Class(/** @lends LinkModel */{
|
|||||||
* @param {String} urlType the url type, either 'mail' or 'url'
|
* @param {String} urlType the url type, either 'mail' or 'url'
|
||||||
* @throws will throw an error if urlType is null or undefined
|
* @throws will throw an error if urlType is null or undefined
|
||||||
*/
|
*/
|
||||||
setUrlType:function (urlType) {
|
setUrlType(urlType) {
|
||||||
$assert(urlType, 'urlType can not be null');
|
$assert(urlType, 'urlType can not be null');
|
||||||
this.setAttribute('urlType', urlType);
|
this.setAttribute('urlType', urlType);
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -19,18 +19,18 @@ const IMindmap = require('./IMindmap').default;
|
|||||||
const INodeModel = require('./INodeModel').default;
|
const INodeModel = require('./INodeModel').default;
|
||||||
const NodeModel = require('./NodeModel').default;
|
const NodeModel = require('./NodeModel').default;
|
||||||
const RelationshipModel = require('./RelationshipModel').default;
|
const RelationshipModel = require('./RelationshipModel').default;
|
||||||
const ModelCodeName = require('../persistence/ModelCodeName').default
|
const ModelCodeName = require('../persistence/ModelCodeName').default;
|
||||||
|
|
||||||
const Mindmap = new Class(/** @lends Mindmap */{
|
const Mindmap = new Class(/** @lends Mindmap */{
|
||||||
Extends:IMindmap,
|
Extends: IMindmap,
|
||||||
/**
|
/**
|
||||||
* @constructs
|
* @constructs
|
||||||
* @param id
|
* @param id
|
||||||
* @param version
|
* @param version
|
||||||
* @extends mindplot.model.IMindmap
|
* @extends mindplot.model.IMindmap
|
||||||
*/
|
*/
|
||||||
initialize:function (id, version) {
|
initialize(id, version) {
|
||||||
$assert(id, "Id can not be null");
|
$assert(id, 'Id can not be null');
|
||||||
this._branches = [];
|
this._branches = [];
|
||||||
this._description = null;
|
this._description = null;
|
||||||
this._relationships = [];
|
this._relationships = [];
|
||||||
@ -39,32 +39,32 @@ const Mindmap = new Class(/** @lends Mindmap */{
|
|||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getDescription:function () {
|
getDescription() {
|
||||||
return this._description;
|
return this._description;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setDescription:function (value) {
|
setDescription(value) {
|
||||||
this._description = value;
|
this._description = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getId:function () {
|
getId() {
|
||||||
return this._id;
|
return this._id;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setId:function (id) {
|
setId(id) {
|
||||||
this._id = id;
|
this._id = id;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getVersion:function () {
|
getVersion() {
|
||||||
return this._version;
|
return this._version;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setVersion:function (version) {
|
setVersion(version) {
|
||||||
this._version = version;
|
this._version = version;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -73,14 +73,14 @@ const Mindmap = new Class(/** @lends Mindmap */{
|
|||||||
* @throws will throw an error if nodeModel is null, undefined or not a node model object
|
* @throws will throw an error if nodeModel is null, undefined or not a node model object
|
||||||
* @throws will throw an error if
|
* @throws will throw an error if
|
||||||
*/
|
*/
|
||||||
addBranch:function (nodeModel) {
|
addBranch(nodeModel) {
|
||||||
$assert(nodeModel && nodeModel.isNodeModel(), 'Add node must be invoked with model objects');
|
$assert(nodeModel && nodeModel.isNodeModel(), 'Add node must be invoked with model objects');
|
||||||
var branches = this.getBranches();
|
const branches = this.getBranches();
|
||||||
if (branches.length == 0) {
|
if (branches.length == 0) {
|
||||||
$assert(nodeModel.getType() == INodeModel.CENTRAL_TOPIC_TYPE, "First element must be the central topic");
|
$assert(nodeModel.getType() == INodeModel.CENTRAL_TOPIC_TYPE, 'First element must be the central topic');
|
||||||
nodeModel.setPosition(0, 0);
|
nodeModel.setPosition(0, 0);
|
||||||
} else {
|
} else {
|
||||||
$assert(nodeModel.getType() != INodeModel.CENTRAL_TOPIC_TYPE, "Mindmaps only have one cental topic");
|
$assert(nodeModel.getType() != INodeModel.CENTRAL_TOPIC_TYPE, 'Mindmaps only have one cental topic');
|
||||||
}
|
}
|
||||||
|
|
||||||
this._branches.push(nodeModel);
|
this._branches.push(nodeModel);
|
||||||
@ -89,18 +89,18 @@ const Mindmap = new Class(/** @lends Mindmap */{
|
|||||||
/**
|
/**
|
||||||
* @param nodeModel
|
* @param nodeModel
|
||||||
*/
|
*/
|
||||||
removeBranch:function (nodeModel) {
|
removeBranch(nodeModel) {
|
||||||
$assert(nodeModel && nodeModel.isNodeModel(), 'Remove node must be invoked with model objects');
|
$assert(nodeModel && nodeModel.isNodeModel(), 'Remove node must be invoked with model objects');
|
||||||
return this._branches.erase(nodeModel);
|
return this._branches.erase(nodeModel);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getBranches:function () {
|
getBranches() {
|
||||||
return this._branches;
|
return this._branches;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getRelationships:function () {
|
getRelationships() {
|
||||||
return this._relationships;
|
return this._relationships;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -108,12 +108,12 @@ const Mindmap = new Class(/** @lends Mindmap */{
|
|||||||
* @param node
|
* @param node
|
||||||
* @return {Boolean} true if node already exists
|
* @return {Boolean} true if node already exists
|
||||||
*/
|
*/
|
||||||
hasAlreadyAdded:function (node) {
|
hasAlreadyAdded(node) {
|
||||||
var result = false;
|
let result = false;
|
||||||
|
|
||||||
// Check in not connected nodes.
|
// Check in not connected nodes.
|
||||||
var branches = this._branches;
|
const branches = this._branches;
|
||||||
for (var i = 0; i < branches.length; i++) {
|
for (let i = 0; i < branches.length; i++) {
|
||||||
result = branches[i]._isChildNode(node);
|
result = branches[i]._isChildNode(node);
|
||||||
if (result) {
|
if (result) {
|
||||||
break;
|
break;
|
||||||
@ -126,7 +126,7 @@ const Mindmap = new Class(/** @lends Mindmap */{
|
|||||||
* @param id
|
* @param id
|
||||||
* @return the node model created
|
* @return the node model created
|
||||||
*/
|
*/
|
||||||
createNode:function (type, id) {
|
createNode(type, id) {
|
||||||
type = !$defined(type) ? INodeModel.MAIN_TOPIC_TYPE : type;
|
type = !$defined(type) ? INodeModel.MAIN_TOPIC_TYPE : type;
|
||||||
return new NodeModel(type, this, id);
|
return new NodeModel(type, this, id);
|
||||||
},
|
},
|
||||||
@ -138,7 +138,7 @@ const Mindmap = new Class(/** @lends Mindmap */{
|
|||||||
* @throws will throw an error if target node is null or undefined
|
* @throws will throw an error if target node is null or undefined
|
||||||
* @return the relationship model created
|
* @return the relationship model created
|
||||||
*/
|
*/
|
||||||
createRelationship:function (sourceNodeId, targetNodeId) {
|
createRelationship(sourceNodeId, targetNodeId) {
|
||||||
$assert($defined(sourceNodeId), 'from node cannot be null');
|
$assert($defined(sourceNodeId), 'from node cannot be null');
|
||||||
$assert($defined(targetNodeId), 'to node cannot be null');
|
$assert($defined(targetNodeId), 'to node cannot be null');
|
||||||
|
|
||||||
@ -148,14 +148,14 @@ const Mindmap = new Class(/** @lends Mindmap */{
|
|||||||
/**
|
/**
|
||||||
* @param relationship
|
* @param relationship
|
||||||
*/
|
*/
|
||||||
addRelationship:function (relationship) {
|
addRelationship(relationship) {
|
||||||
this._relationships.push(relationship);
|
this._relationships.push(relationship);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param relationship
|
* @param relationship
|
||||||
*/
|
*/
|
||||||
deleteRelationship:function (relationship) {
|
deleteRelationship(relationship) {
|
||||||
this._relationships.erase(relationship);
|
this._relationships.erase(relationship);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -163,27 +163,26 @@ const Mindmap = new Class(/** @lends Mindmap */{
|
|||||||
* @param id
|
* @param id
|
||||||
* @return the node with the respective id or null if not in the mindmap
|
* @return the node with the respective id or null if not in the mindmap
|
||||||
*/
|
*/
|
||||||
findNodeById:function (id) {
|
findNodeById(id) {
|
||||||
var result = null;
|
let result = null;
|
||||||
for (var i = 0; i < this._branches.length; i++) {
|
for (let i = 0; i < this._branches.length; i++) {
|
||||||
var branch = this._branches[i];
|
const branch = this._branches[i];
|
||||||
result = branch.findNodeById(id);
|
result = branch.findNodeById(id);
|
||||||
if (result) {
|
if (result) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
},
|
||||||
}
|
});
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param mapId
|
* @param mapId
|
||||||
* @return an empty mindmap with central topic only
|
* @return an empty mindmap with central topic only
|
||||||
*/
|
*/
|
||||||
Mindmap.buildEmpty = function (mapId) {
|
Mindmap.buildEmpty = function (mapId) {
|
||||||
var result = new Mindmap(mapId);
|
const result = new Mindmap(mapId);
|
||||||
var node = result.createNode(INodeModel.CENTRAL_TOPIC_TYPE, 0);
|
const node = result.createNode(INodeModel.CENTRAL_TOPIC_TYPE, 0);
|
||||||
result.addBranch(node);
|
result.addBranch(node);
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
@ -15,18 +15,18 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const INodeModel = require('./INodeModel').default
|
const INodeModel = require('./INodeModel').default;
|
||||||
const TopicFeature = require('../TopicFeature').default
|
const TopicFeature = require('../TopicFeature').default;
|
||||||
|
|
||||||
const NodeModel = new Class(/** @lends NodeModel */{
|
const NodeModel = new Class(/** @lends NodeModel */{
|
||||||
Extends:INodeModel,
|
Extends: INodeModel,
|
||||||
/**
|
/**
|
||||||
* @constructs
|
* @constructs
|
||||||
* @param {String} type node type
|
* @param {String} type node type
|
||||||
* @param mindmap
|
* @param mindmap
|
||||||
* @param id
|
* @param id
|
||||||
*/
|
*/
|
||||||
initialize:function (type, mindmap, id) {
|
initialize(type, mindmap, id) {
|
||||||
$assert(type, 'Node type can not be null');
|
$assert(type, 'Node type can not be null');
|
||||||
$assert(mindmap, 'mindmap can not be null');
|
$assert(mindmap, 'mindmap can not be null');
|
||||||
this._properties = {};
|
this._properties = {};
|
||||||
@ -45,7 +45,7 @@ const NodeModel = new Class(/** @lends NodeModel */{
|
|||||||
* @param attributes
|
* @param attributes
|
||||||
* @return {mindplot.model.FeatureModel} the created feature model
|
* @return {mindplot.model.FeatureModel} the created feature model
|
||||||
*/
|
*/
|
||||||
createFeature:function (type, attributes) {
|
createFeature(type, attributes) {
|
||||||
return TopicFeature.createModel(type, attributes);
|
return TopicFeature.createModel(type, attributes);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -53,13 +53,13 @@ const NodeModel = new Class(/** @lends NodeModel */{
|
|||||||
* @param feature
|
* @param feature
|
||||||
* @throws will throw an error if feature is null or undefined
|
* @throws will throw an error if feature is null or undefined
|
||||||
*/
|
*/
|
||||||
addFeature:function (feature) {
|
addFeature(feature) {
|
||||||
$assert(feature, 'feature can not be null');
|
$assert(feature, 'feature can not be null');
|
||||||
this._feature.push(feature);
|
this._feature.push(feature);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getFeatures:function () {
|
getFeatures() {
|
||||||
return this._feature;
|
return this._feature;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -68,25 +68,20 @@ const NodeModel = new Class(/** @lends NodeModel */{
|
|||||||
* @throws will throw an error if feature is null or undefined
|
* @throws will throw an error if feature is null or undefined
|
||||||
* @throws will throw an error if the feature could not be removed
|
* @throws will throw an error if the feature could not be removed
|
||||||
*/
|
*/
|
||||||
removeFeature:function (feature) {
|
removeFeature(feature) {
|
||||||
$assert(feature, 'feature can not be null');
|
$assert(feature, 'feature can not be null');
|
||||||
var size = this._feature.length;
|
const size = this._feature.length;
|
||||||
this._feature = this._feature.filter(function (f) {
|
this._feature = this._feature.filter((f) => feature.getId() != f.getId());
|
||||||
return feature.getId() != f.getId();
|
|
||||||
});
|
|
||||||
$assert(size - 1 == this._feature.length, 'Could not be removed ...');
|
$assert(size - 1 == this._feature.length, 'Could not be removed ...');
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {String} type the feature type, e.g. icon or link
|
* @param {String} type the feature type, e.g. icon or link
|
||||||
* @throws will throw an error if type is null or undefined
|
* @throws will throw an error if type is null or undefined
|
||||||
*/
|
*/
|
||||||
findFeatureByType:function (type) {
|
findFeatureByType(type) {
|
||||||
$assert(type, 'type can not be null');
|
$assert(type, 'type can not be null');
|
||||||
return this._feature.filter(function (feature) {
|
return this._feature.filter((feature) => feature.getType() == type);
|
||||||
return feature.getType() == type;
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -95,17 +90,15 @@ const NodeModel = new Class(/** @lends NodeModel */{
|
|||||||
* @throws will throw an error if feature could not be found
|
* @throws will throw an error if feature could not be found
|
||||||
* @return the feature with the given id
|
* @return the feature with the given id
|
||||||
*/
|
*/
|
||||||
findFeatureById:function (id) {
|
findFeatureById(id) {
|
||||||
$assert($defined(id), 'id can not be null');
|
$assert($defined(id), 'id can not be null');
|
||||||
var result = this._feature.filter(function (feature) {
|
const result = this._feature.filter((feature) => feature.getId() == id);
|
||||||
return feature.getId() == id;
|
$assert(result.length == 1, `Feature could not be found:${id}`);
|
||||||
});
|
|
||||||
$assert(result.length == 1, "Feature could not be found:" + id);
|
|
||||||
return result[0];
|
return result[0];
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getPropertiesKeys:function () {
|
getPropertiesKeys() {
|
||||||
return Object.keys(this._properties);
|
return Object.keys(this._properties);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -114,30 +107,30 @@ const NodeModel = new Class(/** @lends NodeModel */{
|
|||||||
* @param value
|
* @param value
|
||||||
* @throws will throw an error if key is null or undefined
|
* @throws will throw an error if key is null or undefined
|
||||||
*/
|
*/
|
||||||
putProperty:function (key, value) {
|
putProperty(key, value) {
|
||||||
$defined(key, 'key can not be null');
|
$defined(key, 'key can not be null');
|
||||||
this._properties[key] = value;
|
this._properties[key] = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getProperties:function () {
|
getProperties() {
|
||||||
return this._properties;
|
return this._properties;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getProperty:function (key) {
|
getProperty(key) {
|
||||||
$defined(key, 'key can not be null');
|
$defined(key, 'key can not be null');
|
||||||
var result = this._properties[key];
|
const result = this._properties[key];
|
||||||
return !$defined(result) ? null : result;
|
return !$defined(result) ? null : result;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return {mindplot.model.NodeModel} an identical clone of the NodeModel
|
* @return {mindplot.model.NodeModel} an identical clone of the NodeModel
|
||||||
*/
|
*/
|
||||||
clone:function () {
|
clone() {
|
||||||
var result = new NodeModel(this.getType(), this._mindmap);
|
const result = new NodeModel(this.getType(), this._mindmap);
|
||||||
result._children = this._children.map(function (node) {
|
result._children = this._children.map((node) => {
|
||||||
var cnode = node.clone();
|
const cnode = node.clone();
|
||||||
cnode._parent = result;
|
cnode._parent = result;
|
||||||
return cnode;
|
return cnode;
|
||||||
});
|
});
|
||||||
@ -151,15 +144,15 @@ const NodeModel = new Class(/** @lends NodeModel */{
|
|||||||
* Similar to clone, assign new id to the elements ...
|
* Similar to clone, assign new id to the elements ...
|
||||||
* @return {mindplot.model.NodeModel}
|
* @return {mindplot.model.NodeModel}
|
||||||
*/
|
*/
|
||||||
deepCopy:function () {
|
deepCopy() {
|
||||||
var result = new NodeModel(this.getType(), this._mindmap);
|
const result = new NodeModel(this.getType(), this._mindmap);
|
||||||
result._children = this._children.map(function (node) {
|
result._children = this._children.map((node) => {
|
||||||
var cnode = node.deepCopy();
|
const cnode = node.deepCopy();
|
||||||
cnode._parent = result;
|
cnode._parent = result;
|
||||||
return cnode;
|
return cnode;
|
||||||
});
|
});
|
||||||
|
|
||||||
var id = result.getId();
|
const id = result.getId();
|
||||||
result._properties = Object.clone(this._properties);
|
result._properties = Object.clone(this._properties);
|
||||||
result.setId(id);
|
result.setId(id);
|
||||||
|
|
||||||
@ -171,7 +164,7 @@ const NodeModel = new Class(/** @lends NodeModel */{
|
|||||||
* @param {mindplot.model.NodeModel} child
|
* @param {mindplot.model.NodeModel} child
|
||||||
* @throws will throw an error if child is null, undefined or not a NodeModel object
|
* @throws will throw an error if child is null, undefined or not a NodeModel object
|
||||||
*/
|
*/
|
||||||
append:function (child) {
|
append(child) {
|
||||||
$assert(child && child.isNodeModel(), 'Only NodeModel can be appended to Mindmap object');
|
$assert(child && child.isNodeModel(), 'Only NodeModel can be appended to Mindmap object');
|
||||||
this._children.push(child);
|
this._children.push(child);
|
||||||
child._parent = this;
|
child._parent = this;
|
||||||
@ -181,36 +174,36 @@ const NodeModel = new Class(/** @lends NodeModel */{
|
|||||||
* @param {mindplot.model.NodeModel} child
|
* @param {mindplot.model.NodeModel} child
|
||||||
* @throws will throw an error if child is null, undefined or not a NodeModel object
|
* @throws will throw an error if child is null, undefined or not a NodeModel object
|
||||||
*/
|
*/
|
||||||
removeChild:function (child) {
|
removeChild(child) {
|
||||||
$assert(child && child.isNodeModel(), 'Only NodeModel can be appended to Mindmap object.');
|
$assert(child && child.isNodeModel(), 'Only NodeModel can be appended to Mindmap object.');
|
||||||
this._children.erase(child);
|
this._children.erase(child);
|
||||||
child._parent = null;
|
child._parent = null;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getChildren:function () {
|
getChildren() {
|
||||||
return this._children;
|
return this._children;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getParent:function () {
|
getParent() {
|
||||||
return this._parent;
|
return this._parent;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setParent:function (parent) {
|
setParent(parent) {
|
||||||
$assert(parent != this, 'The same node can not be parent and child if itself.');
|
$assert(parent != this, 'The same node can not be parent and child if itself.');
|
||||||
this._parent = parent;
|
this._parent = parent;
|
||||||
},
|
},
|
||||||
|
|
||||||
_isChildNode:function (node) {
|
_isChildNode(node) {
|
||||||
var result = false;
|
let result = false;
|
||||||
if (node == this) {
|
if (node == this) {
|
||||||
result = true;
|
result = true;
|
||||||
} else {
|
} else {
|
||||||
var children = this.getChildren();
|
const children = this.getChildren();
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
var child = children[i];
|
const child = children[i];
|
||||||
result = child._isChildNode(node);
|
result = child._isChildNode(node);
|
||||||
if (result) {
|
if (result) {
|
||||||
break;
|
break;
|
||||||
@ -224,14 +217,14 @@ const NodeModel = new Class(/** @lends NodeModel */{
|
|||||||
* @id
|
* @id
|
||||||
* @return {mindplot.model.NodeModel} the node with the respective id
|
* @return {mindplot.model.NodeModel} the node with the respective id
|
||||||
*/
|
*/
|
||||||
findNodeById:function (id) {
|
findNodeById(id) {
|
||||||
var result = null;
|
let result = null;
|
||||||
if (this.getId() == id) {
|
if (this.getId() == id) {
|
||||||
result = this;
|
result = this;
|
||||||
} else {
|
} else {
|
||||||
var children = this.getChildren();
|
const children = this.getChildren();
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
var child = children[i];
|
const child = children[i];
|
||||||
result = child.findNodeById(id);
|
result = child.findNodeById(id);
|
||||||
if (result) {
|
if (result) {
|
||||||
break;
|
break;
|
||||||
@ -239,7 +232,7 @@ const NodeModel = new Class(/** @lends NodeModel */{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default NodeModel
|
export default NodeModel;
|
||||||
|
@ -15,31 +15,31 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const FeatureModel = require('./FeatureModel').default
|
const FeatureModel = require('./FeatureModel').default;
|
||||||
|
|
||||||
const NoteModel = new Class(/** @lends NoteModel */{
|
const NoteModel = new Class(/** @lends NoteModel */{
|
||||||
Extends:FeatureModel,
|
Extends: FeatureModel,
|
||||||
/**
|
/**
|
||||||
* @constructs
|
* @constructs
|
||||||
* @param attributes
|
* @param attributes
|
||||||
* @extends mindplot.model.FeatureModel
|
* @extends mindplot.model.FeatureModel
|
||||||
*/
|
*/
|
||||||
initialize:function (attributes) {
|
initialize(attributes) {
|
||||||
this.parent(NoteModel.FEATURE_TYPE);
|
this.parent(NoteModel.FEATURE_TYPE);
|
||||||
var noteText = attributes.text ? attributes.text : " ";
|
const noteText = attributes.text ? attributes.text : ' ';
|
||||||
this.setText(noteText);
|
this.setText(noteText);
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getText:function () {
|
getText() {
|
||||||
return this.getAttribute('text');
|
return this.getAttribute('text');
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setText:function (text) {
|
setText(text) {
|
||||||
$assert(text, 'text can not be null');
|
$assert(text, 'text can not be null');
|
||||||
this.setAttribute('text', text);
|
this.setAttribute('text', text);
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -47,6 +47,6 @@ const NoteModel = new Class(/** @lends NoteModel */{
|
|||||||
* @type {String}
|
* @type {String}
|
||||||
* @default
|
* @default
|
||||||
*/
|
*/
|
||||||
NoteModel.FEATURE_TYPE = "note";
|
NoteModel.FEATURE_TYPE = 'note';
|
||||||
|
|
||||||
export default NoteModel;
|
export default NoteModel;
|
||||||
|
@ -20,11 +20,11 @@ const ConnectionLine = require('../ConnectionLine').default;
|
|||||||
const RelationshipModel = new Class(
|
const RelationshipModel = new Class(
|
||||||
/** @lends RelationshipModel */ {
|
/** @lends RelationshipModel */ {
|
||||||
Static: {
|
Static: {
|
||||||
_nextUUID: function () {
|
_nextUUID() {
|
||||||
if (!$defined(RelationshipModel._uuid)) {
|
if (!$defined(RelationshipModel._uuid)) {
|
||||||
RelationshipModel._uuid = 0;
|
RelationshipModel._uuid = 0;
|
||||||
}
|
}
|
||||||
RelationshipModel._uuid = RelationshipModel._uuid + 1;
|
RelationshipModel._uuid += 1;
|
||||||
return RelationshipModel._uuid;
|
return RelationshipModel._uuid;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -36,7 +36,7 @@ const RelationshipModel = new Class(
|
|||||||
* @throws will throw an error if sourceTopicId is null or undefined
|
* @throws will throw an error if sourceTopicId is null or undefined
|
||||||
* @throws will throw an error if targetTopicId is null or undefined
|
* @throws will throw an error if targetTopicId is null or undefined
|
||||||
*/
|
*/
|
||||||
initialize: function (sourceTopicId, targetTopicId) {
|
initialize(sourceTopicId, targetTopicId) {
|
||||||
$assert($defined(sourceTopicId), 'from node type can not be null');
|
$assert($defined(sourceTopicId), 'from node type can not be null');
|
||||||
$assert($defined(targetTopicId), 'to node type can not be null');
|
$assert($defined(targetTopicId), 'to node type can not be null');
|
||||||
|
|
||||||
@ -51,76 +51,76 @@ const RelationshipModel = new Class(
|
|||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getFromNode: function () {
|
getFromNode() {
|
||||||
return this._sourceTargetId;
|
return this._sourceTargetId;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getToNode: function () {
|
getToNode() {
|
||||||
return this._targetTopicId;
|
return this._targetTopicId;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getId: function () {
|
getId() {
|
||||||
$assert(this._id, 'id is null');
|
$assert(this._id, 'id is null');
|
||||||
return this._id;
|
return this._id;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getLineType: function () {
|
getLineType() {
|
||||||
return this._lineType;
|
return this._lineType;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setLineType: function (lineType) {
|
setLineType(lineType) {
|
||||||
this._lineType = lineType;
|
this._lineType = lineType;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getSrcCtrlPoint: function () {
|
getSrcCtrlPoint() {
|
||||||
return this._srcCtrlPoint;
|
return this._srcCtrlPoint;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setSrcCtrlPoint: function (srcCtrlPoint) {
|
setSrcCtrlPoint(srcCtrlPoint) {
|
||||||
this._srcCtrlPoint = srcCtrlPoint;
|
this._srcCtrlPoint = srcCtrlPoint;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getDestCtrlPoint: function () {
|
getDestCtrlPoint() {
|
||||||
return this._destCtrlPoint;
|
return this._destCtrlPoint;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setDestCtrlPoint: function (destCtrlPoint) {
|
setDestCtrlPoint(destCtrlPoint) {
|
||||||
this._destCtrlPoint = destCtrlPoint;
|
this._destCtrlPoint = destCtrlPoint;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getEndArrow: function () {
|
getEndArrow() {
|
||||||
return this._endArrow;
|
return this._endArrow;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setEndArrow: function (endArrow) {
|
setEndArrow(endArrow) {
|
||||||
this._endArrow = endArrow;
|
this._endArrow = endArrow;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
getStartArrow: function () {
|
getStartArrow() {
|
||||||
return this._startArrow;
|
return this._startArrow;
|
||||||
},
|
},
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
setStartArrow: function (startArrow) {
|
setStartArrow(startArrow) {
|
||||||
this._startArrow = startArrow;
|
this._startArrow = startArrow;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return a clone of the relationship model
|
* @return a clone of the relationship model
|
||||||
*/
|
*/
|
||||||
clone: function () {
|
clone() {
|
||||||
var result = new RelationshipModel(this._sourceTargetId, this._targetTopicId);
|
const result = new RelationshipModel(this._sourceTargetId, this._targetTopicId);
|
||||||
result._id = this._id;
|
result._id = this._id;
|
||||||
result._lineType = this._lineType;
|
result._lineType = this._lineType;
|
||||||
result._srcCtrlPoint = this._srcCtrlPoint;
|
result._srcCtrlPoint = this._srcCtrlPoint;
|
||||||
@ -133,16 +133,16 @@ const RelationshipModel = new Class(
|
|||||||
/**
|
/**
|
||||||
* @return {String} textual information about the relationship's source and target node
|
* @return {String} textual information about the relationship's source and target node
|
||||||
*/
|
*/
|
||||||
inspect: function () {
|
inspect() {
|
||||||
return (
|
return (
|
||||||
'(fromNode:' +
|
`(fromNode:${
|
||||||
this.getFromNode().getId() +
|
this.getFromNode().getId()
|
||||||
' , toNode: ' +
|
} , toNode: ${
|
||||||
this.getToNode().getId() +
|
this.getToNode().getId()
|
||||||
')'
|
})`
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
export default RelationshipModel;
|
export default RelationshipModel;
|
||||||
|
@ -15,45 +15,45 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const ModelCodeName = require('./ModelCodeName').default
|
const ModelCodeName = require('./ModelCodeName').default;
|
||||||
const XMLSerializer_Pela = require('./XMLSerializer_Pela').default;
|
const XMLSerializer_Pela = require('./XMLSerializer_Pela').default;
|
||||||
|
|
||||||
const Beta2PelaMigrator = new Class({
|
const Beta2PelaMigrator = new Class({
|
||||||
initialize:function (betaSerializer) {
|
initialize(betaSerializer) {
|
||||||
this._betaSerializer = betaSerializer;
|
this._betaSerializer = betaSerializer;
|
||||||
this._pelaSerializer = new XMLSerializer_Pela();
|
this._pelaSerializer = new XMLSerializer_Pela();
|
||||||
},
|
},
|
||||||
|
|
||||||
toXML:function (mindmap) {
|
toXML(mindmap) {
|
||||||
return this._pelaSerializer.toXML(mindmap);
|
return this._pelaSerializer.toXML(mindmap);
|
||||||
},
|
},
|
||||||
|
|
||||||
loadFromDom:function (dom, mapId) {
|
loadFromDom(dom, mapId) {
|
||||||
$assert($defined(mapId), "mapId can not be null");
|
$assert($defined(mapId), 'mapId can not be null');
|
||||||
var mindmap = this._betaSerializer.loadFromDom(dom, mapId);
|
const mindmap = this._betaSerializer.loadFromDom(dom, mapId);
|
||||||
mindmap.setVersion(ModelCodeName.PELA);
|
mindmap.setVersion(ModelCodeName.PELA);
|
||||||
|
|
||||||
// Beta does not set position on second level nodes ...
|
// Beta does not set position on second level nodes ...
|
||||||
var branches = mindmap.getBranches();
|
const branches = mindmap.getBranches();
|
||||||
var me = this;
|
const me = this;
|
||||||
_.each(branches, function (model) {
|
_.each(branches, (model) => {
|
||||||
me._fixPosition(model);
|
me._fixPosition(model);
|
||||||
});
|
});
|
||||||
|
|
||||||
return mindmap;
|
return mindmap;
|
||||||
},
|
},
|
||||||
|
|
||||||
_fixPosition:function (parentModel) {
|
_fixPosition(parentModel) {
|
||||||
var parentPos = parentModel.getPosition();
|
const parentPos = parentModel.getPosition();
|
||||||
var isRight = parentPos.x > 0;
|
const isRight = parentPos.x > 0;
|
||||||
var me = this;
|
const me = this;
|
||||||
_.each(parentModel.getChildren(), function (child) {
|
_.each(parentModel.getChildren(), (child) => {
|
||||||
if (!child.getPosition()) {
|
if (!child.getPosition()) {
|
||||||
child.setPosition(parentPos.x + (50 * isRight ? 1 : -1), parentPos.y);
|
child.setPosition(parentPos.x + (50 * isRight ? 1 : -1), parentPos.y);
|
||||||
}
|
}
|
||||||
me._fixPosition(child);
|
me._fixPosition(child);
|
||||||
});
|
});
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default Beta2PelaMigrator;
|
export default Beta2PelaMigrator;
|
||||||
|
@ -21,9 +21,9 @@
|
|||||||
* @enum {String}
|
* @enum {String}
|
||||||
*/
|
*/
|
||||||
const ModelCodeName = {
|
const ModelCodeName = {
|
||||||
BETA : "beta",
|
BETA: 'beta',
|
||||||
PELA : "pela",
|
PELA: 'pela',
|
||||||
TANGO : "tango"
|
TANGO: 'tango',
|
||||||
};
|
};
|
||||||
|
|
||||||
export default ModelCodeName
|
export default ModelCodeName;
|
||||||
|
@ -15,49 +15,45 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const XMLSerializer_Tango = require('./XMLSerializer_Tango').default
|
const XMLSerializer_Tango = require('./XMLSerializer_Tango').default;
|
||||||
const ModelCodeName = require('./ModelCodeName').default;
|
const ModelCodeName = require('./ModelCodeName').default;
|
||||||
|
|
||||||
const Pela2TangoMigrator = new Class({
|
const Pela2TangoMigrator = new Class({
|
||||||
initialize : function(pelaSerializer) {
|
initialize(pelaSerializer) {
|
||||||
this._pelaSerializer = pelaSerializer;
|
this._pelaSerializer = pelaSerializer;
|
||||||
this._tangoSerializer = new XMLSerializer_Tango();
|
this._tangoSerializer = new XMLSerializer_Tango();
|
||||||
},
|
},
|
||||||
|
|
||||||
toXML : function(mindmap) {
|
toXML(mindmap) {
|
||||||
return this._tangoSerializer.toXML(mindmap);
|
return this._tangoSerializer.toXML(mindmap);
|
||||||
},
|
},
|
||||||
|
|
||||||
loadFromDom : function(dom, mapId) {
|
loadFromDom(dom, mapId) {
|
||||||
$assert($defined(mapId), "mapId can not be null");
|
$assert($defined(mapId), 'mapId can not be null');
|
||||||
var mindmap = this._pelaSerializer.loadFromDom(dom, mapId);
|
const mindmap = this._pelaSerializer.loadFromDom(dom, mapId);
|
||||||
mindmap.setVersion(ModelCodeName.TANGO);
|
mindmap.setVersion(ModelCodeName.TANGO);
|
||||||
this._fixOrder(mindmap);
|
this._fixOrder(mindmap);
|
||||||
this._fixPosition(mindmap);
|
this._fixPosition(mindmap);
|
||||||
return mindmap;
|
return mindmap;
|
||||||
},
|
},
|
||||||
|
|
||||||
_fixOrder : function(mindmap) {
|
_fixOrder(mindmap) {
|
||||||
// First level node policies has been changed.
|
// First level node policies has been changed.
|
||||||
var centralNode = mindmap.getBranches()[0];
|
const centralNode = mindmap.getBranches()[0];
|
||||||
var children = centralNode.getChildren();
|
const children = centralNode.getChildren();
|
||||||
var leftNodes = [];
|
const leftNodes = [];
|
||||||
var rightNodes = [];
|
const rightNodes = [];
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (var i = 0; i < children.length; i++) {
|
||||||
var child = children[i];
|
const child = children[i];
|
||||||
var position = child.getPosition();
|
const position = child.getPosition();
|
||||||
if (position.x < 0) {
|
if (position.x < 0) {
|
||||||
leftNodes.push(child);
|
leftNodes.push(child);
|
||||||
} else {
|
} else {
|
||||||
rightNodes.push(child);
|
rightNodes.push(child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rightNodes.sort(function(a, b) {
|
rightNodes.sort((a, b) => a.getOrder() > b.getOrder());
|
||||||
return a.getOrder() > b.getOrder()
|
leftNodes.sort((a, b) => a.getOrder() > b.getOrder());
|
||||||
});
|
|
||||||
leftNodes.sort(function(a, b) {
|
|
||||||
return a.getOrder() > b.getOrder();
|
|
||||||
});
|
|
||||||
|
|
||||||
for (i = 0; i < rightNodes.length; i++) {
|
for (i = 0; i < rightNodes.length; i++) {
|
||||||
rightNodes[i].setOrder(i * 2);
|
rightNodes[i].setOrder(i * 2);
|
||||||
@ -68,32 +64,29 @@ const Pela2TangoMigrator = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_fixPosition : function(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 .
|
||||||
var centralNode = mindmap.getBranches()[0];
|
const centralNode = mindmap.getBranches()[0];
|
||||||
var children = centralNode.getChildren();
|
const children = centralNode.getChildren();
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
var child = children[i];
|
const child = children[i];
|
||||||
var position = child.getPosition();
|
const position = child.getPosition();
|
||||||
this._fixNodePosition(child, position)
|
this._fixNodePosition(child, position);
|
||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
_fixNodePosition : function(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 .
|
||||||
var position = node.getPosition();
|
let position = node.getPosition();
|
||||||
if (!position) {
|
if (!position) {
|
||||||
position = {x:parentPosition.x + 30,y:parentPosition.y};
|
position = { x: parentPosition.x + 30, y: parentPosition.y };
|
||||||
node.setPosition(position.x, position.y);
|
node.setPosition(position.x, position.y);
|
||||||
}
|
}
|
||||||
var children = node.getChildren();
|
const children = node.getChildren();
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
var child = children[i];
|
const child = children[i];
|
||||||
this._fixNodePosition(child, position);
|
this._fixNodePosition(child, position);
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default Pela2TangoMigrator;
|
export default Pela2TangoMigrator;
|
||||||
|
@ -15,8 +15,8 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const ModelCodeName = require('./ModelCodeName').default
|
const ModelCodeName = require('./ModelCodeName').default;
|
||||||
const Beta2PelaMigrator = require('./Beta2PelaMigrator').default
|
const Beta2PelaMigrator = require('./Beta2PelaMigrator').default;
|
||||||
const Pela2TangoMigrator = require('./Pela2TangoMigrator').default;
|
const Pela2TangoMigrator = require('./Pela2TangoMigrator').default;
|
||||||
const XMLSerializer_Beta = require('./XMLSerializer_Beta').default;
|
const XMLSerializer_Beta = require('./XMLSerializer_Beta').default;
|
||||||
const XMLSerializer_Pela = require('./XMLSerializer_Pela').default;
|
const XMLSerializer_Pela = require('./XMLSerializer_Pela').default;
|
||||||
@ -32,7 +32,7 @@ const XMLSerializerFactory = {};
|
|||||||
* @return {mindplot.persistence.XMLSerializer_Beta|mindplot.persistence.XMLSerializer_Pela|
|
* @return {mindplot.persistence.XMLSerializer_Beta|mindplot.persistence.XMLSerializer_Pela|
|
||||||
* mindplot.persistence.XMLSerializer_Tango} serializer corresponding to the mindmap's version
|
* mindplot.persistence.XMLSerializer_Tango} serializer corresponding to the mindmap's version
|
||||||
*/
|
*/
|
||||||
XMLSerializerFactory.getSerializerFromMindmap = function(mindmap) {
|
XMLSerializerFactory.getSerializerFromMindmap = function (mindmap) {
|
||||||
return XMLSerializerFactory.getSerializer(mindmap.getVersion());
|
return XMLSerializerFactory.getSerializer(mindmap.getVersion());
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -40,9 +40,9 @@ XMLSerializerFactory.getSerializerFromMindmap = function(mindmap) {
|
|||||||
* @param domDocument
|
* @param domDocument
|
||||||
* @return serializer corresponding to the mindmap's version
|
* @return serializer corresponding to the mindmap's version
|
||||||
*/
|
*/
|
||||||
XMLSerializerFactory.getSerializerFromDocument = function(domDocument) {
|
XMLSerializerFactory.getSerializerFromDocument = function (domDocument) {
|
||||||
var rootElem = domDocument.documentElement;
|
const rootElem = domDocument.documentElement;
|
||||||
return XMLSerializerFactory.getSerializer(rootElem.getAttribute("version"))
|
return XMLSerializerFactory.getSerializer(rootElem.getAttribute('version'));
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -52,20 +52,19 @@ XMLSerializerFactory.getSerializerFromDocument = function(domDocument) {
|
|||||||
* @param {String} version the version name
|
* @param {String} version the version name
|
||||||
* @return serializer
|
* @return serializer
|
||||||
*/
|
*/
|
||||||
XMLSerializerFactory.getSerializer = function(version) {
|
XMLSerializerFactory.getSerializer = function (version) {
|
||||||
if (!$defined(version)) {
|
if (!$defined(version)) {
|
||||||
version = ModelCodeName.BETA;
|
version = ModelCodeName.BETA;
|
||||||
}
|
}
|
||||||
var codeNames = XMLSerializerFactory._codeNames;
|
const codeNames = XMLSerializerFactory._codeNames;
|
||||||
var found = false;
|
let found = false;
|
||||||
var serializer = null;
|
let serializer = null;
|
||||||
for (var i = 0; i < codeNames.length; i++) {
|
for (let i = 0; i < codeNames.length; i++) {
|
||||||
if (!found) {
|
if (!found) {
|
||||||
found = codeNames[i].codeName == version;
|
found = codeNames[i].codeName == version;
|
||||||
if (found)
|
if (found) serializer = new (codeNames[i].serializer)();
|
||||||
serializer = new (codeNames[i].serializer)();
|
|
||||||
} else {
|
} else {
|
||||||
var migrator = codeNames[i].migrator;
|
const { migrator } = codeNames[i];
|
||||||
serializer = new migrator(serializer);
|
serializer = new migrator(serializer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -73,23 +72,23 @@ XMLSerializerFactory.getSerializer = function(version) {
|
|||||||
return serializer;
|
return serializer;
|
||||||
};
|
};
|
||||||
|
|
||||||
XMLSerializerFactory._codeNames =
|
XMLSerializerFactory._codeNames = [
|
||||||
[
|
|
||||||
{
|
{
|
||||||
codeName:ModelCodeName.BETA,
|
codeName: ModelCodeName.BETA,
|
||||||
serializer: XMLSerializer_Beta,
|
serializer: XMLSerializer_Beta,
|
||||||
migrator:function() {
|
migrator() {
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
codeName:ModelCodeName.PELA,
|
codeName: ModelCodeName.PELA,
|
||||||
serializer:XMLSerializer_Pela,
|
serializer: XMLSerializer_Pela,
|
||||||
migrator:Beta2PelaMigrator },
|
migrator: Beta2PelaMigrator,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
codeName:ModelCodeName.TANGO,
|
codeName: ModelCodeName.TANGO,
|
||||||
serializer:XMLSerializer_Tango,
|
serializer: XMLSerializer_Tango,
|
||||||
migrator:Pela2TangoMigrator
|
migrator: Pela2TangoMigrator,
|
||||||
}
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
export default XMLSerializerFactory
|
export default XMLSerializerFactory;
|
||||||
|
@ -14,62 +14,63 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
const Core = require('@wismapping/core-js')
|
const Core = require('@wismapping/core-js');
|
||||||
|
|
||||||
const core = Core();
|
const core = Core();
|
||||||
const ModelCodeName = require('./ModelCodeName').default
|
const ModelCodeName = require('./ModelCodeName').default;
|
||||||
const Mindmap = require('../model/Mindmap').default
|
const Mindmap = require('../model/Mindmap').default;
|
||||||
const INodeModel = require('../model/INodeModel').default;
|
const INodeModel = require('../model/INodeModel').default;
|
||||||
const TopicFeature = require('../TopicFeature').default
|
const TopicFeature = require('../TopicFeature').default;
|
||||||
|
|
||||||
const XMLSerializer_Beta = new Class({
|
const XMLSerializer_Beta = new Class({
|
||||||
|
|
||||||
toXML:function (mindmap) {
|
toXML(mindmap) {
|
||||||
$assert(mindmap, "Can not save a null mindmap");
|
$assert(mindmap, 'Can not save a null mindmap');
|
||||||
|
|
||||||
var document = core.Utils.createDocument();
|
const document = core.Utils.createDocument();
|
||||||
|
|
||||||
// Store map attributes ...
|
// Store map attributes ...
|
||||||
var mapElem = document.createElement("map");
|
const mapElem = document.createElement('map');
|
||||||
var name = mindmap.getId();
|
const name = mindmap.getId();
|
||||||
if ($defined(name)) {
|
if ($defined(name)) {
|
||||||
mapElem.setAttribute('name', name);
|
mapElem.setAttribute('name', name);
|
||||||
}
|
}
|
||||||
document.append(mapElem);
|
document.append(mapElem);
|
||||||
|
|
||||||
// Create branches ...
|
// Create branches ...
|
||||||
var topics = mindmap.getBranches();
|
const topics = mindmap.getBranches();
|
||||||
for (var i = 0; i < topics.length; i++) {
|
for (let i = 0; i < topics.length; i++) {
|
||||||
var topic = topics[i];
|
const topic = topics[i];
|
||||||
var topicDom = this._topicToXML(document, topic);
|
const topicDom = this._topicToXML(document, topic);
|
||||||
mapElem.append(topicDom);
|
mapElem.append(topicDom);
|
||||||
}
|
}
|
||||||
|
|
||||||
return document;
|
return document;
|
||||||
},
|
},
|
||||||
|
|
||||||
_topicToXML:function (document, topic) {
|
_topicToXML(document, topic) {
|
||||||
var parentTopic = document.createElement("topic");
|
const parentTopic = document.createElement('topic');
|
||||||
|
|
||||||
// Set topic attributes...
|
// Set topic attributes...
|
||||||
if (topic.getType() == INodeModel.CENTRAL_TOPIC_TYPE) {
|
if (topic.getType() == INodeModel.CENTRAL_TOPIC_TYPE) {
|
||||||
parentTopic.setAttribute("central", true);
|
parentTopic.setAttribute('central', true);
|
||||||
} else {
|
} else {
|
||||||
var 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) {
|
||||||
var pos = topic.getPosition();
|
const pos = topic.getPosition();
|
||||||
parentTopic.setAttribute("position", pos.x + ',' + pos.y);
|
parentTopic.setAttribute('position', `${pos.x},${pos.y}`);
|
||||||
} else {
|
} else {
|
||||||
var order = topic.getOrder();
|
const order = topic.getOrder();
|
||||||
parentTopic.setAttribute("order", order);
|
parentTopic.setAttribute('order', order);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var text = topic.getText();
|
const text = topic.getText();
|
||||||
if ($defined(text)) {
|
if ($defined(text)) {
|
||||||
parentTopic.setAttribute('text', text);
|
parentTopic.setAttribute('text', text);
|
||||||
}
|
}
|
||||||
|
|
||||||
var shape = topic.getShapeType();
|
const shape = topic.getShapeType();
|
||||||
if ($defined(shape)) {
|
if ($defined(shape)) {
|
||||||
parentTopic.setAttribute('shape', shape);
|
parentTopic.setAttribute('shape', shape);
|
||||||
}
|
}
|
||||||
@ -79,113 +80,112 @@ const XMLSerializer_Beta = new Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Font properties ...
|
// Font properties ...
|
||||||
var font = "";
|
let font = '';
|
||||||
|
|
||||||
var fontFamily = topic.getFontFamily();
|
const fontFamily = topic.getFontFamily();
|
||||||
font += (fontFamily ? fontFamily : '') + ';';
|
font += `${fontFamily || ''};`;
|
||||||
|
|
||||||
var fontSize = topic.getFontSize();
|
const fontSize = topic.getFontSize();
|
||||||
font += (fontSize ? fontSize : '') + ';';
|
font += `${fontSize || ''};`;
|
||||||
|
|
||||||
var fontColor = topic.getFontColor();
|
const fontColor = topic.getFontColor();
|
||||||
font += (fontColor ? fontColor : '') + ';';
|
font += `${fontColor || ''};`;
|
||||||
|
|
||||||
var fontWeight = topic.getFontWeight();
|
const fontWeight = topic.getFontWeight();
|
||||||
font += (fontWeight ? fontWeight : '') + ';';
|
font += `${fontWeight || ''};`;
|
||||||
|
|
||||||
var fontStyle = topic.getFontStyle();
|
const fontStyle = topic.getFontStyle();
|
||||||
font += (fontStyle ? fontStyle : '') + ';';
|
font += `${fontStyle || ''};`;
|
||||||
|
|
||||||
if ($defined(fontFamily) || $defined(fontSize) || $defined(fontColor)
|
if ($defined(fontFamily) || $defined(fontSize) || $defined(fontColor)
|
||||||
|| $defined(fontWeight) || $defined(fontStyle)) {
|
|| $defined(fontWeight) || $defined(fontStyle)) {
|
||||||
parentTopic.setAttribute('fontStyle', font);
|
parentTopic.setAttribute('fontStyle', font);
|
||||||
}
|
}
|
||||||
|
|
||||||
var bgColor = topic.getBackgroundColor();
|
const bgColor = topic.getBackgroundColor();
|
||||||
if ($defined(bgColor)) {
|
if ($defined(bgColor)) {
|
||||||
parentTopic.setAttribute('bgColor', bgColor);
|
parentTopic.setAttribute('bgColor', bgColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
var brColor = topic.getBorderColor();
|
const brColor = topic.getBorderColor();
|
||||||
if ($defined(brColor)) {
|
if ($defined(brColor)) {
|
||||||
parentTopic.setAttribute('brColor', brColor);
|
parentTopic.setAttribute('brColor', brColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
//ICONS
|
// ICONS
|
||||||
var i;
|
let i;
|
||||||
var icons = topic.getIcons();
|
const icons = topic.getIcons();
|
||||||
for (i = 0; i < icons.length; i++) {
|
for (i = 0; i < icons.length; i++) {
|
||||||
var icon = icons[i];
|
const icon = icons[i];
|
||||||
var iconDom = this._iconToXML(document, icon);
|
const iconDom = this._iconToXML(document, icon);
|
||||||
parentTopic.append(iconDom);
|
parentTopic.append(iconDom);
|
||||||
}
|
}
|
||||||
|
|
||||||
//LINKS
|
// LINKS
|
||||||
var links = topic.getLinks();
|
const links = topic.getLinks();
|
||||||
for (i = 0; i < links.length; i++) {
|
for (i = 0; i < links.length; i++) {
|
||||||
var link = links[i];
|
const link = links[i];
|
||||||
var linkDom = this._linkToXML(document, link);
|
const linkDom = this._linkToXML(document, link);
|
||||||
parentTopic.append(linkDom);
|
parentTopic.append(linkDom);
|
||||||
}
|
}
|
||||||
|
|
||||||
var notes = topic.getNotes();
|
const notes = topic.getNotes();
|
||||||
for (i = 0; i < notes.length; i++) {
|
for (i = 0; i < notes.length; i++) {
|
||||||
var note = notes[i];
|
const note = notes[i];
|
||||||
var noteDom = this._noteToXML(document, note);
|
const noteDom = this._noteToXML(document, note);
|
||||||
parentTopic.append(noteDom);
|
parentTopic.append(noteDom);
|
||||||
}
|
}
|
||||||
|
|
||||||
//CHILDREN TOPICS
|
// CHILDREN TOPICS
|
||||||
var childTopics = topic.getChildren();
|
const childTopics = topic.getChildren();
|
||||||
for (i = 0; i < childTopics.length; i++) {
|
for (i = 0; i < childTopics.length; i++) {
|
||||||
var childTopic = childTopics[i];
|
const childTopic = childTopics[i];
|
||||||
var childDom = this._topicToXML(document, childTopic);
|
const childDom = this._topicToXML(document, childTopic);
|
||||||
parentTopic.append(childDom);
|
parentTopic.append(childDom);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return parentTopic;
|
return parentTopic;
|
||||||
},
|
},
|
||||||
|
|
||||||
_iconToXML:function (document, icon) {
|
_iconToXML(document, icon) {
|
||||||
var iconDom = document.createElement("icon");
|
const iconDom = document.createElement('icon');
|
||||||
iconDom.setAttribute('id', icon.getIconType());
|
iconDom.setAttribute('id', icon.getIconType());
|
||||||
return iconDom;
|
return iconDom;
|
||||||
},
|
},
|
||||||
|
|
||||||
_linkToXML:function (document, link) {
|
_linkToXML(document, link) {
|
||||||
var linkDom = document.createElement("link");
|
const linkDom = document.createElement('link');
|
||||||
linkDom.setAttribute('url', link.getUrl());
|
linkDom.setAttribute('url', link.getUrl());
|
||||||
return linkDom;
|
return linkDom;
|
||||||
},
|
},
|
||||||
|
|
||||||
_noteToXML:function (document, note) {
|
_noteToXML(document, note) {
|
||||||
var noteDom = document.createElement("note");
|
const noteDom = document.createElement('note');
|
||||||
noteDom.setAttribute('text', note.getText());
|
noteDom.setAttribute('text', note.getText());
|
||||||
return noteDom;
|
return noteDom;
|
||||||
},
|
},
|
||||||
|
|
||||||
loadFromDom:function (dom, mapId) {
|
loadFromDom(dom, mapId) {
|
||||||
$assert(dom, "Dom can not be null");
|
$assert(dom, 'Dom can not be null');
|
||||||
$assert(mapId, "mapId can not be null");
|
$assert(mapId, 'mapId can not be null');
|
||||||
|
|
||||||
// Is a valid object ?
|
// Is a valid object ?
|
||||||
var documentElement = dom.documentElement;
|
const { documentElement } = dom;
|
||||||
$assert(documentElement.nodeName != "parsererror", "Error while parsing: '" + documentElement.childNodes[0].nodeValue);
|
$assert(documentElement.nodeName != 'parsererror', `Error while parsing: '${documentElement.childNodes[0].nodeValue}`);
|
||||||
|
|
||||||
// Is a wisemap?.
|
// Is a wisemap?.
|
||||||
$assert(documentElement.tagName == XMLSerializer_Beta.MAP_ROOT_NODE, "This seem not to be a map document. Root Tag: '" + documentElement.tagName + ",',HTML:" +dom.innerHTML + ",XML:"+ core.Utils.innerXML(dom));
|
$assert(documentElement.tagName == XMLSerializer_Beta.MAP_ROOT_NODE, `This seem not to be a map document. Root Tag: '${documentElement.tagName},',HTML:${dom.innerHTML},XML:${core.Utils.innerXML(dom)}`);
|
||||||
|
|
||||||
// Start the loading process ...
|
// Start the loading process ...
|
||||||
var version = documentElement.getAttribute("version");
|
let version = documentElement.getAttribute('version');
|
||||||
version = !$defined(version) ? ModelCodeName.BETA : version;
|
version = !$defined(version) ? ModelCodeName.BETA : version;
|
||||||
var mindmap = new Mindmap(mapId, version);
|
const mindmap = new Mindmap(mapId, version);
|
||||||
|
|
||||||
var children = documentElement.childNodes;
|
const children = documentElement.childNodes;
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
var child = children[i];
|
const child = children[i];
|
||||||
if (child.nodeType == 1) {
|
if (child.nodeType == 1) {
|
||||||
var topic = this._deserializeNode(child, mindmap);
|
const topic = this._deserializeNode(child, mindmap);
|
||||||
mindmap.addBranch(topic);
|
mindmap.addBranch(topic);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -193,34 +193,34 @@ const XMLSerializer_Beta = new Class({
|
|||||||
return mindmap;
|
return mindmap;
|
||||||
},
|
},
|
||||||
|
|
||||||
_deserializeNode:function (domElem, mindmap) {
|
_deserializeNode(domElem, mindmap) {
|
||||||
var type = (domElem.getAttribute('central') != null) ? INodeModel.CENTRAL_TOPIC_TYPE : INodeModel.MAIN_TOPIC_TYPE;
|
const type = (domElem.getAttribute('central') != null) ? INodeModel.CENTRAL_TOPIC_TYPE : INodeModel.MAIN_TOPIC_TYPE;
|
||||||
var topic = mindmap.createNode(type);
|
const topic = mindmap.createNode(type);
|
||||||
|
|
||||||
// Load attributes...
|
// Load attributes...
|
||||||
var text = domElem.getAttribute('text');
|
const text = domElem.getAttribute('text');
|
||||||
if ($defined(text)) {
|
if ($defined(text)) {
|
||||||
topic.setText(text);
|
topic.setText(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
var order = domElem.getAttribute('order');
|
const order = domElem.getAttribute('order');
|
||||||
if ($defined(order)) {
|
if ($defined(order)) {
|
||||||
topic.setOrder(parseInt(order));
|
topic.setOrder(parseInt(order));
|
||||||
}
|
}
|
||||||
|
|
||||||
var shape = domElem.getAttribute('shape');
|
const shape = domElem.getAttribute('shape');
|
||||||
if ($defined(shape)) {
|
if ($defined(shape)) {
|
||||||
topic.setShapeType(shape);
|
topic.setShapeType(shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
var isShrink = domElem.getAttribute('shrink');
|
const isShrink = domElem.getAttribute('shrink');
|
||||||
if ($defined(isShrink)) {
|
if ($defined(isShrink)) {
|
||||||
topic.setChildrenShrunken(isShrink);
|
topic.setChildrenShrunken(isShrink);
|
||||||
}
|
}
|
||||||
|
|
||||||
var fontStyle = domElem.getAttribute('fontStyle');
|
const fontStyle = domElem.getAttribute('fontStyle');
|
||||||
if ($defined(fontStyle)) {
|
if ($defined(fontStyle)) {
|
||||||
var font = fontStyle.split(';');
|
const font = fontStyle.split(';');
|
||||||
|
|
||||||
if (font[0]) {
|
if (font[0]) {
|
||||||
topic.setFontFamily(font[0]);
|
topic.setFontFamily(font[0]);
|
||||||
@ -243,39 +243,39 @@ const XMLSerializer_Beta = new Class({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var bgColor = domElem.getAttribute('bgColor');
|
const bgColor = domElem.getAttribute('bgColor');
|
||||||
if ($defined(bgColor)) {
|
if ($defined(bgColor)) {
|
||||||
topic.setBackgroundColor(bgColor);
|
topic.setBackgroundColor(bgColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
var borderColor = domElem.getAttribute('brColor');
|
const borderColor = domElem.getAttribute('brColor');
|
||||||
if ($defined(borderColor)) {
|
if ($defined(borderColor)) {
|
||||||
topic.setBorderColor(borderColor);
|
topic.setBorderColor(borderColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
var position = domElem.getAttribute('position');
|
const position = domElem.getAttribute('position');
|
||||||
if ($defined(position)) {
|
if ($defined(position)) {
|
||||||
var pos = position.split(',');
|
const pos = position.split(',');
|
||||||
topic.setPosition(pos[0], pos[1]);
|
topic.setPosition(pos[0], pos[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Creating icons and children nodes
|
// Creating icons and children nodes
|
||||||
var children = domElem.childNodes;
|
const children = domElem.childNodes;
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
var child = children[i];
|
const child = children[i];
|
||||||
if (child.nodeType == 1) {
|
if (child.nodeType == 1) {
|
||||||
$assert(child.tagName == "topic" || child.tagName == "icon" || child.tagName == "link" || child.tagName == "note", 'Illegal node type:' + child.tagName);
|
$assert(child.tagName == 'topic' || child.tagName == 'icon' || child.tagName == 'link' || child.tagName == 'note', `Illegal node type:${child.tagName}`);
|
||||||
if (child.tagName == "topic") {
|
if (child.tagName == 'topic') {
|
||||||
var childTopic = this._deserializeNode(child, mindmap);
|
const childTopic = this._deserializeNode(child, mindmap);
|
||||||
childTopic.connectTo(topic);
|
childTopic.connectTo(topic);
|
||||||
} else if (child.tagName == "icon") {
|
} else if (child.tagName == 'icon') {
|
||||||
var icon = this._deserializeIcon(child, topic);
|
const icon = this._deserializeIcon(child, topic);
|
||||||
topic.addFeature(icon);
|
topic.addFeature(icon);
|
||||||
} else if (child.tagName == "link") {
|
} else if (child.tagName == 'link') {
|
||||||
var link = this._deserializeLink(child, topic);
|
const link = this._deserializeLink(child, topic);
|
||||||
topic.addFeature(link);
|
topic.addFeature(link);
|
||||||
} else if (child.tagName == "note") {
|
} else if (child.tagName == 'note') {
|
||||||
var note = this._deserializeNote(child, topic);
|
const note = this._deserializeNote(child, topic);
|
||||||
topic.addFeature(note);
|
topic.addFeature(note);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -284,20 +284,21 @@ const XMLSerializer_Beta = new Class({
|
|||||||
return topic;
|
return topic;
|
||||||
},
|
},
|
||||||
|
|
||||||
_deserializeIcon:function (domElem) {
|
_deserializeIcon(domElem) {
|
||||||
var 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:function (domElem) {
|
_deserializeLink(domElem) {
|
||||||
return TopicFeature.createModel(TopicFeature.Link.id, {url:domElem.getAttribute("url")});
|
return TopicFeature.createModel(TopicFeature.Link.id, { url: domElem.getAttribute('url') });
|
||||||
},
|
},
|
||||||
|
|
||||||
_deserializeNote:function (domElem) {
|
_deserializeNote(domElem) {
|
||||||
var 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';
|
||||||
|
|
||||||
|
@ -15,12 +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.
|
||||||
*/
|
*/
|
||||||
const Core = require('@wismapping/core-js')
|
const Core = require('@wismapping/core-js');
|
||||||
|
|
||||||
const core = Core();
|
const core = Core();
|
||||||
const Mindmap = require('../model/Mindmap').default
|
const Mindmap = require('../model/Mindmap').default;
|
||||||
const INodeModel = require('../model/INodeModel').default;
|
const INodeModel = require('../model/INodeModel').default;
|
||||||
const { TopicShape } = require('../model/INodeModel');
|
const { TopicShape } = require('../model/INodeModel');
|
||||||
const TopicFeature = require('../TopicFeature').default
|
const TopicFeature = require('../TopicFeature').default;
|
||||||
const ConnectionLine = require('../ConnectionLine').default;
|
const ConnectionLine = require('../ConnectionLine').default;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -33,18 +34,18 @@ const XMLSerializer_Pela = new Class(
|
|||||||
* @throws will throw an error if mindmap is null or undefined
|
* @throws will throw an error if mindmap is null or undefined
|
||||||
* @return the created XML document (using the cross-browser implementation in core)
|
* @return the created XML document (using the cross-browser implementation in core)
|
||||||
*/
|
*/
|
||||||
toXML: function (mindmap) {
|
toXML(mindmap) {
|
||||||
$assert(mindmap, 'Can not save a null mindmap');
|
$assert(mindmap, 'Can not save a null mindmap');
|
||||||
|
|
||||||
var document = core.Utils.createDocument();
|
const document = core.Utils.createDocument();
|
||||||
|
|
||||||
// Store map attributes ...
|
// Store map attributes ...
|
||||||
var mapElem = document.createElement('map');
|
const mapElem = document.createElement('map');
|
||||||
var 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));
|
||||||
}
|
}
|
||||||
var version = mindmap.getVersion();
|
const version = mindmap.getVersion();
|
||||||
if ($defined(version)) {
|
if ($defined(version)) {
|
||||||
mapElem.setAttribute('version', version);
|
mapElem.setAttribute('version', version);
|
||||||
}
|
}
|
||||||
@ -52,24 +53,24 @@ const XMLSerializer_Pela = new Class(
|
|||||||
document.appendChild(mapElem);
|
document.appendChild(mapElem);
|
||||||
|
|
||||||
// Create branches ...
|
// Create branches ...
|
||||||
var topics = mindmap.getBranches();
|
const topics = mindmap.getBranches();
|
||||||
for (var i = 0; i < topics.length; i++) {
|
for (let i = 0; i < topics.length; i++) {
|
||||||
var topic = topics[i];
|
const topic = topics[i];
|
||||||
var topicDom = this._topicToXML(document, topic);
|
const topicDom = this._topicToXML(document, topic);
|
||||||
mapElem.appendChild(topicDom);
|
mapElem.appendChild(topicDom);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create Relationships
|
// Create Relationships
|
||||||
var relationships = mindmap.getRelationships();
|
const relationships = mindmap.getRelationships();
|
||||||
if (relationships.length > 0) {
|
if (relationships.length > 0) {
|
||||||
for (var j = 0; j < relationships.length; j++) {
|
for (let j = 0; j < relationships.length; j++) {
|
||||||
var relationship = relationships[j];
|
const relationship = relationships[j];
|
||||||
if (
|
if (
|
||||||
mindmap.findNodeById(relationship.getFromNode()) !== null &&
|
mindmap.findNodeById(relationship.getFromNode()) !== null
|
||||||
mindmap.findNodeById(relationship.getToNode()) !== null
|
&& mindmap.findNodeById(relationship.getToNode()) !== null
|
||||||
) {
|
) {
|
||||||
// Isolated relationships are not persisted ....
|
// Isolated relationships are not persisted ....
|
||||||
var relationDom = this._relationshipToXML(document, relationship);
|
const relationDom = this._relationshipToXML(document, relationship);
|
||||||
mapElem.appendChild(relationDom);
|
mapElem.appendChild(relationDom);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -78,108 +79,107 @@ const XMLSerializer_Pela = new Class(
|
|||||||
return document;
|
return document;
|
||||||
},
|
},
|
||||||
|
|
||||||
_topicToXML: function (document, topic) {
|
_topicToXML(document, topic) {
|
||||||
var parentTopic = document.createElement('topic');
|
const parentTopic = document.createElement('topic');
|
||||||
|
|
||||||
// Set topic attributes...
|
// Set topic attributes...
|
||||||
if (topic.getType() == INodeModel.CENTRAL_TOPIC_TYPE) {
|
if (topic.getType() == INodeModel.CENTRAL_TOPIC_TYPE) {
|
||||||
parentTopic.setAttribute('central', 'true');
|
parentTopic.setAttribute('central', 'true');
|
||||||
} else {
|
} else {
|
||||||
var pos = topic.getPosition();
|
const pos = topic.getPosition();
|
||||||
parentTopic.setAttribute('position', pos.x + ',' + pos.y);
|
parentTopic.setAttribute('position', `${pos.x},${pos.y}`);
|
||||||
|
|
||||||
var order = topic.getOrder();
|
const order = topic.getOrder();
|
||||||
if (typeof order === 'number' && isFinite(order))
|
if (typeof order === 'number' && isFinite(order)) parentTopic.setAttribute('order', order);
|
||||||
parentTopic.setAttribute('order', order);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var text = topic.getText();
|
const text = topic.getText();
|
||||||
if ($defined(text)) {
|
if ($defined(text)) {
|
||||||
this._noteTextToXML(document, parentTopic, text);
|
this._noteTextToXML(document, parentTopic, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
var shape = topic.getShapeType();
|
const shape = topic.getShapeType();
|
||||||
if ($defined(shape)) {
|
if ($defined(shape)) {
|
||||||
parentTopic.setAttribute('shape', shape);
|
parentTopic.setAttribute('shape', shape);
|
||||||
|
|
||||||
if (shape == TopicShape.IMAGE) {
|
if (shape == TopicShape.IMAGE) {
|
||||||
parentTopic.setAttribute(
|
parentTopic.setAttribute(
|
||||||
'image',
|
'image',
|
||||||
topic.getImageSize().width +
|
`${topic.getImageSize().width
|
||||||
',' +
|
},${
|
||||||
topic.getImageSize().height +
|
topic.getImageSize().height
|
||||||
':' +
|
}:${
|
||||||
topic.getImageUrl()
|
topic.getImageUrl()}`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
topic.areChildrenShrunken() &&
|
topic.areChildrenShrunken()
|
||||||
topic.getType() != INodeModel.CENTRAL_TOPIC_TYPE
|
&& topic.getType() != INodeModel.CENTRAL_TOPIC_TYPE
|
||||||
) {
|
) {
|
||||||
parentTopic.setAttribute('shrink', 'true');
|
parentTopic.setAttribute('shrink', 'true');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Font properties ...
|
// Font properties ...
|
||||||
var id = topic.getId();
|
const id = topic.getId();
|
||||||
parentTopic.setAttribute('id', id);
|
parentTopic.setAttribute('id', id);
|
||||||
|
|
||||||
var font = '';
|
let font = '';
|
||||||
|
|
||||||
var fontFamily = topic.getFontFamily();
|
const fontFamily = topic.getFontFamily();
|
||||||
font += (fontFamily ? fontFamily : '') + ';';
|
font += `${fontFamily || ''};`;
|
||||||
|
|
||||||
var fontSize = topic.getFontSize();
|
const fontSize = topic.getFontSize();
|
||||||
font += (fontSize ? fontSize : '') + ';';
|
font += `${fontSize || ''};`;
|
||||||
|
|
||||||
var fontColor = topic.getFontColor();
|
const fontColor = topic.getFontColor();
|
||||||
font += (fontColor ? fontColor : '') + ';';
|
font += `${fontColor || ''};`;
|
||||||
|
|
||||||
var fontWeight = topic.getFontWeight();
|
const fontWeight = topic.getFontWeight();
|
||||||
font += (fontWeight ? fontWeight : '') + ';';
|
font += `${fontWeight || ''};`;
|
||||||
|
|
||||||
var fontStyle = topic.getFontStyle();
|
const fontStyle = topic.getFontStyle();
|
||||||
font += (fontStyle ? fontStyle : '') + ';';
|
font += `${fontStyle || ''};`;
|
||||||
|
|
||||||
if (
|
if (
|
||||||
$defined(fontFamily) ||
|
$defined(fontFamily)
|
||||||
$defined(fontSize) ||
|
|| $defined(fontSize)
|
||||||
$defined(fontColor) ||
|
|| $defined(fontColor)
|
||||||
$defined(fontWeight) ||
|
|| $defined(fontWeight)
|
||||||
$defined(fontStyle)
|
|| $defined(fontStyle)
|
||||||
) {
|
) {
|
||||||
parentTopic.setAttribute('fontStyle', font);
|
parentTopic.setAttribute('fontStyle', font);
|
||||||
}
|
}
|
||||||
|
|
||||||
var bgColor = topic.getBackgroundColor();
|
const bgColor = topic.getBackgroundColor();
|
||||||
if ($defined(bgColor)) {
|
if ($defined(bgColor)) {
|
||||||
parentTopic.setAttribute('bgColor', bgColor);
|
parentTopic.setAttribute('bgColor', bgColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
var brColor = topic.getBorderColor();
|
const brColor = topic.getBorderColor();
|
||||||
if ($defined(brColor)) {
|
if ($defined(brColor)) {
|
||||||
parentTopic.setAttribute('brColor', brColor);
|
parentTopic.setAttribute('brColor', brColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
var metadata = topic.getMetadata();
|
const metadata = topic.getMetadata();
|
||||||
if ($defined(metadata)) {
|
if ($defined(metadata)) {
|
||||||
parentTopic.setAttribute('metadata', metadata);
|
parentTopic.setAttribute('metadata', metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Serialize features ...
|
// Serialize features ...
|
||||||
var features = topic.getFeatures();
|
const features = topic.getFeatures();
|
||||||
for (var i = 0; i < features.length; i++) {
|
for (let i = 0; i < features.length; i++) {
|
||||||
var feature = features[i];
|
const feature = features[i];
|
||||||
|
|
||||||
var featureType = feature.getType();
|
const featureType = feature.getType();
|
||||||
var featureDom = document.createElement(featureType);
|
const featureDom = document.createElement(featureType);
|
||||||
var attributes = feature.getAttributes();
|
const attributes = feature.getAttributes();
|
||||||
|
|
||||||
for (var key in attributes) {
|
for (const key in attributes) {
|
||||||
var value = attributes[key];
|
const value = attributes[key];
|
||||||
if (key == 'text') {
|
if (key == 'text') {
|
||||||
var cdata = document.createCDATASection(this.rmXmlInv(value));
|
const cdata = document.createCDATASection(this.rmXmlInv(value));
|
||||||
featureDom.appendChild(cdata);
|
featureDom.appendChild(cdata);
|
||||||
} else {
|
} else {
|
||||||
featureDom.setAttribute(key, this.rmXmlInv(value));
|
featureDom.setAttribute(key, this.rmXmlInv(value));
|
||||||
@ -188,50 +188,50 @@ const XMLSerializer_Pela = new Class(
|
|||||||
parentTopic.appendChild(featureDom);
|
parentTopic.appendChild(featureDom);
|
||||||
}
|
}
|
||||||
|
|
||||||
//CHILDREN TOPICS
|
// CHILDREN TOPICS
|
||||||
var childTopics = topic.getChildren();
|
const childTopics = topic.getChildren();
|
||||||
for (var j = 0; j < childTopics.length; j++) {
|
for (let j = 0; j < childTopics.length; j++) {
|
||||||
var childTopic = childTopics[j];
|
const childTopic = childTopics[j];
|
||||||
var childDom = this._topicToXML(document, childTopic);
|
const childDom = this._topicToXML(document, childTopic);
|
||||||
parentTopic.appendChild(childDom);
|
parentTopic.appendChild(childDom);
|
||||||
}
|
}
|
||||||
return parentTopic;
|
return parentTopic;
|
||||||
},
|
},
|
||||||
|
|
||||||
_noteTextToXML: function (document, elem, text) {
|
_noteTextToXML(document, elem, text) {
|
||||||
if (text.indexOf('\n') == -1) {
|
if (text.indexOf('\n') == -1) {
|
||||||
elem.setAttribute('text', this.rmXmlInv(text));
|
elem.setAttribute('text', this.rmXmlInv(text));
|
||||||
} else {
|
} else {
|
||||||
var textDom = document.createElement('text');
|
const textDom = document.createElement('text');
|
||||||
var cdata = document.createCDATASection(this.rmXmlInv(text));
|
const cdata = document.createCDATASection(this.rmXmlInv(text));
|
||||||
textDom.appendChild(cdata);
|
textDom.appendChild(cdata);
|
||||||
elem.appendChild(textDom);
|
elem.appendChild(textDom);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_relationshipToXML: function (document, relationship) {
|
_relationshipToXML(document, relationship) {
|
||||||
var result = document.createElement('relationship');
|
const result = document.createElement('relationship');
|
||||||
result.setAttribute('srcTopicId', relationship.getFromNode());
|
result.setAttribute('srcTopicId', relationship.getFromNode());
|
||||||
result.setAttribute('destTopicId', relationship.getToNode());
|
result.setAttribute('destTopicId', relationship.getToNode());
|
||||||
|
|
||||||
var lineType = relationship.getLineType();
|
const lineType = relationship.getLineType();
|
||||||
result.setAttribute('lineType', lineType);
|
result.setAttribute('lineType', lineType);
|
||||||
if (
|
if (
|
||||||
lineType == ConnectionLine.CURVED ||
|
lineType == ConnectionLine.CURVED
|
||||||
lineType == ConnectionLine.SIMPLE_CURVED
|
|| lineType == ConnectionLine.SIMPLE_CURVED
|
||||||
) {
|
) {
|
||||||
if ($defined(relationship.getSrcCtrlPoint())) {
|
if ($defined(relationship.getSrcCtrlPoint())) {
|
||||||
var srcPoint = relationship.getSrcCtrlPoint();
|
const srcPoint = relationship.getSrcCtrlPoint();
|
||||||
result.setAttribute(
|
result.setAttribute(
|
||||||
'srcCtrlPoint',
|
'srcCtrlPoint',
|
||||||
Math.round(srcPoint.x) + ',' + Math.round(srcPoint.y)
|
`${Math.round(srcPoint.x)},${Math.round(srcPoint.y)}`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if ($defined(relationship.getDestCtrlPoint())) {
|
if ($defined(relationship.getDestCtrlPoint())) {
|
||||||
var destPoint = relationship.getDestCtrlPoint();
|
const destPoint = relationship.getDestCtrlPoint();
|
||||||
result.setAttribute(
|
result.setAttribute(
|
||||||
'destCtrlPoint',
|
'destCtrlPoint',
|
||||||
Math.round(destPoint.x) + ',' + Math.round(destPoint.y)
|
`${Math.round(destPoint.x)},${Math.round(destPoint.y)}`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -248,26 +248,26 @@ const XMLSerializer_Pela = new Class(
|
|||||||
* @throws will throw an error if the document element is not consistent with a wisemap's root
|
* @throws will throw an error if the document element is not consistent with a wisemap's root
|
||||||
* element
|
* element
|
||||||
*/
|
*/
|
||||||
loadFromDom: function (dom, mapId) {
|
loadFromDom(dom, mapId) {
|
||||||
$assert(dom, 'dom can not be null');
|
$assert(dom, 'dom can not be null');
|
||||||
$assert(mapId, 'mapId can not be null');
|
$assert(mapId, 'mapId can not be null');
|
||||||
|
|
||||||
var rootElem = dom.documentElement;
|
const rootElem = dom.documentElement;
|
||||||
|
|
||||||
// Is a wisemap?.
|
// Is a wisemap?.
|
||||||
$assert(
|
$assert(
|
||||||
rootElem.tagName == XMLSerializer_Pela.MAP_ROOT_NODE,
|
rootElem.tagName == XMLSerializer_Pela.MAP_ROOT_NODE,
|
||||||
'This seem not to be a map document.'
|
'This seem not to be a map document.',
|
||||||
);
|
);
|
||||||
|
|
||||||
this._idsMap = {};
|
this._idsMap = {};
|
||||||
// Start the loading process ...
|
// Start the loading process ...
|
||||||
var version = rootElem.getAttribute('version');
|
const version = rootElem.getAttribute('version');
|
||||||
|
|
||||||
var mindmap = new Mindmap(mapId, version);
|
const mindmap = new Mindmap(mapId, version);
|
||||||
var children = rootElem.childNodes;
|
const children = rootElem.childNodes;
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
var child = children[i];
|
const child = children[i];
|
||||||
if (child.nodeType == 1) {
|
if (child.nodeType == 1) {
|
||||||
switch (child.tagName) {
|
switch (child.tagName) {
|
||||||
case 'topic':
|
case 'topic':
|
||||||
@ -286,14 +286,13 @@ const XMLSerializer_Pela = new Class(
|
|||||||
return mindmap;
|
return mindmap;
|
||||||
},
|
},
|
||||||
|
|
||||||
_deserializeNode: function (domElem, mindmap) {
|
_deserializeNode(domElem, mindmap) {
|
||||||
var type =
|
const type = domElem.getAttribute('central') != null
|
||||||
domElem.getAttribute('central') != null
|
|
||||||
? INodeModel.CENTRAL_TOPIC_TYPE
|
? INodeModel.CENTRAL_TOPIC_TYPE
|
||||||
: INodeModel.MAIN_TOPIC_TYPE;
|
: INodeModel.MAIN_TOPIC_TYPE;
|
||||||
|
|
||||||
// Load attributes...
|
// Load attributes...
|
||||||
var id = domElem.getAttribute('id');
|
let id = domElem.getAttribute('id');
|
||||||
if ($defined(id)) {
|
if ($defined(id)) {
|
||||||
id = parseInt(id);
|
id = parseInt(id);
|
||||||
}
|
}
|
||||||
@ -304,17 +303,17 @@ const XMLSerializer_Pela = new Class(
|
|||||||
this._idsMap[id] = domElem;
|
this._idsMap[id] = domElem;
|
||||||
}
|
}
|
||||||
|
|
||||||
var topic = mindmap.createNode(type, id);
|
const topic = mindmap.createNode(type, id);
|
||||||
|
|
||||||
// Set text property is it;s defined...
|
// Set text property is it;s defined...
|
||||||
var text = domElem.getAttribute('text');
|
const text = domElem.getAttribute('text');
|
||||||
if ($defined(text) && text) {
|
if ($defined(text) && text) {
|
||||||
topic.setText(text);
|
topic.setText(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
var fontStyle = domElem.getAttribute('fontStyle');
|
const fontStyle = domElem.getAttribute('fontStyle');
|
||||||
if ($defined(fontStyle) && fontStyle) {
|
if ($defined(fontStyle) && fontStyle) {
|
||||||
var font = fontStyle.split(';');
|
const font = fontStyle.split(';');
|
||||||
|
|
||||||
if (font[0]) {
|
if (font[0]) {
|
||||||
topic.setFontFamily(font[0]);
|
topic.setFontFamily(font[0]);
|
||||||
@ -337,83 +336,83 @@ const XMLSerializer_Pela = new Class(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var shape = domElem.getAttribute('shape');
|
const shape = domElem.getAttribute('shape');
|
||||||
if ($defined(shape)) {
|
if ($defined(shape)) {
|
||||||
topic.setShapeType(shape);
|
topic.setShapeType(shape);
|
||||||
|
|
||||||
if (shape == TopicShape.IMAGE) {
|
if (shape == TopicShape.IMAGE) {
|
||||||
var image = domElem.getAttribute('image');
|
const image = domElem.getAttribute('image');
|
||||||
var size = image.substring(0, image.indexOf(':'));
|
const size = image.substring(0, image.indexOf(':'));
|
||||||
var url = image.substring(image.indexOf(':') + 1, image.length);
|
const url = image.substring(image.indexOf(':') + 1, image.length);
|
||||||
topic.setImageUrl(url);
|
topic.setImageUrl(url);
|
||||||
|
|
||||||
var split = size.split(',');
|
const split = size.split(',');
|
||||||
topic.setImageSize(split[0], split[1]);
|
topic.setImageSize(split[0], split[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var bgColor = domElem.getAttribute('bgColor');
|
const bgColor = domElem.getAttribute('bgColor');
|
||||||
if ($defined(bgColor)) {
|
if ($defined(bgColor)) {
|
||||||
topic.setBackgroundColor(bgColor);
|
topic.setBackgroundColor(bgColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
var borderColor = domElem.getAttribute('brColor');
|
const borderColor = domElem.getAttribute('brColor');
|
||||||
if ($defined(borderColor)) {
|
if ($defined(borderColor)) {
|
||||||
topic.setBorderColor(borderColor);
|
topic.setBorderColor(borderColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
var order = domElem.getAttribute('order');
|
const order = domElem.getAttribute('order');
|
||||||
if ($defined(order) && order != 'NaN') {
|
if ($defined(order) && order != 'NaN') {
|
||||||
// Hack for broken maps ...
|
// Hack for broken maps ...
|
||||||
topic.setOrder(parseInt(order));
|
topic.setOrder(parseInt(order));
|
||||||
}
|
}
|
||||||
|
|
||||||
var isShrink = domElem.getAttribute('shrink');
|
const isShrink = domElem.getAttribute('shrink');
|
||||||
// Hack: Some production maps has been stored with the central topic collapsed. This is a bug.
|
// Hack: Some production maps has been stored with the central topic collapsed. This is a bug.
|
||||||
if ($defined(isShrink) && type != INodeModel.CENTRAL_TOPIC_TYPE) {
|
if ($defined(isShrink) && type != INodeModel.CENTRAL_TOPIC_TYPE) {
|
||||||
topic.setChildrenShrunken(isShrink);
|
topic.setChildrenShrunken(isShrink);
|
||||||
}
|
}
|
||||||
|
|
||||||
var position = domElem.getAttribute('position');
|
const position = domElem.getAttribute('position');
|
||||||
if ($defined(position)) {
|
if ($defined(position)) {
|
||||||
var pos = position.split(',');
|
const pos = position.split(',');
|
||||||
topic.setPosition(pos[0], pos[1]);
|
topic.setPosition(pos[0], pos[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
var metadata = domElem.getAttribute('metadata');
|
const metadata = domElem.getAttribute('metadata');
|
||||||
if ($defined(metadata)) {
|
if ($defined(metadata)) {
|
||||||
topic.setMetadata(metadata);
|
topic.setMetadata(metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Creating icons and children nodes
|
// Creating icons and children nodes
|
||||||
var children = domElem.childNodes;
|
const children = domElem.childNodes;
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
var child = children[i];
|
const child = children[i];
|
||||||
if (child.nodeType == Node.ELEMENT_NODE) {
|
if (child.nodeType == Node.ELEMENT_NODE) {
|
||||||
if (child.tagName == 'topic') {
|
if (child.tagName == 'topic') {
|
||||||
var childTopic = this._deserializeNode(child, mindmap);
|
const childTopic = this._deserializeNode(child, mindmap);
|
||||||
childTopic.connectTo(topic);
|
childTopic.connectTo(topic);
|
||||||
} else if (TopicFeature.isSupported(child.tagName)) {
|
} else if (TopicFeature.isSupported(child.tagName)) {
|
||||||
// Load attributes ...
|
// Load attributes ...
|
||||||
var namedNodeMap = child.attributes;
|
const namedNodeMap = child.attributes;
|
||||||
var attributes = {};
|
const attributes = {};
|
||||||
for (var j = 0; j < namedNodeMap.length; j++) {
|
for (let j = 0; j < namedNodeMap.length; j++) {
|
||||||
var attribute = namedNodeMap.item(j);
|
const attribute = namedNodeMap.item(j);
|
||||||
attributes[attribute.name] = attribute.value;
|
attributes[attribute.name] = attribute.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Has text node ?.
|
// Has text node ?.
|
||||||
var textAttr = this._deserializeTextAttr(child);
|
const textAttr = this._deserializeTextAttr(child);
|
||||||
if (textAttr) {
|
if (textAttr) {
|
||||||
attributes['text'] = textAttr;
|
attributes.text = textAttr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a new element ....
|
// Create a new element ....
|
||||||
var featureType = child.tagName;
|
const featureType = child.tagName;
|
||||||
var feature = TopicFeature.createModel(featureType, attributes);
|
const feature = TopicFeature.createModel(featureType, attributes);
|
||||||
topic.addFeature(feature);
|
topic.addFeature(feature);
|
||||||
} else if (child.tagName == 'text') {
|
} else if (child.tagName == 'text') {
|
||||||
var nodeText = this._deserializeNodeText(child);
|
const nodeText = this._deserializeNodeText(child);
|
||||||
topic.setText(nodeText);
|
topic.setText(nodeText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -421,12 +420,12 @@ const XMLSerializer_Pela = new Class(
|
|||||||
return topic;
|
return topic;
|
||||||
},
|
},
|
||||||
|
|
||||||
_deserializeTextAttr: function (domElem) {
|
_deserializeTextAttr(domElem) {
|
||||||
var value = domElem.getAttribute('text');
|
let value = domElem.getAttribute('text');
|
||||||
if (!$defined(value)) {
|
if (!$defined(value)) {
|
||||||
var children = domElem.childNodes;
|
const children = domElem.childNodes;
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
var 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;
|
||||||
}
|
}
|
||||||
@ -444,11 +443,11 @@ const XMLSerializer_Pela = new Class(
|
|||||||
return value;
|
return value;
|
||||||
},
|
},
|
||||||
|
|
||||||
_deserializeNodeText: function (domElem) {
|
_deserializeNodeText(domElem) {
|
||||||
var children = domElem.childNodes;
|
const children = domElem.childNodes;
|
||||||
var value = null;
|
let value = null;
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
var 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;
|
||||||
}
|
}
|
||||||
@ -456,15 +455,15 @@ const XMLSerializer_Pela = new Class(
|
|||||||
return value;
|
return value;
|
||||||
},
|
},
|
||||||
|
|
||||||
_deserializeRelationship: function (domElement, mindmap) {
|
_deserializeRelationship(domElement, mindmap) {
|
||||||
var srcId = domElement.getAttribute('srcTopicId');
|
const srcId = domElement.getAttribute('srcTopicId');
|
||||||
var destId = domElement.getAttribute('destTopicId');
|
const destId = domElement.getAttribute('destTopicId');
|
||||||
var lineType = domElement.getAttribute('lineType');
|
const lineType = domElement.getAttribute('lineType');
|
||||||
var srcCtrlPoint = domElement.getAttribute('srcCtrlPoint');
|
const srcCtrlPoint = domElement.getAttribute('srcCtrlPoint');
|
||||||
var destCtrlPoint = domElement.getAttribute('destCtrlPoint');
|
const destCtrlPoint = domElement.getAttribute('destCtrlPoint');
|
||||||
var endArrow = domElement.getAttribute('endArrow');
|
const endArrow = domElement.getAttribute('endArrow');
|
||||||
var startArrow = domElement.getAttribute('startArrow');
|
const startArrow = domElement.getAttribute('startArrow');
|
||||||
//If for some reason a relationship lines has source and dest nodes the same, don't import it.
|
// If for some reason a relationship lines has source and dest nodes the same, don't import it.
|
||||||
if (srcId == destId) {
|
if (srcId == destId) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -473,7 +472,7 @@ const XMLSerializer_Pela = new Class(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var model = mindmap.createRelationship(srcId, destId);
|
const model = mindmap.createRelationship(srcId, destId);
|
||||||
model.setLineType(lineType);
|
model.setLineType(lineType);
|
||||||
if ($defined(srcCtrlPoint) && srcCtrlPoint != '') {
|
if ($defined(srcCtrlPoint) && srcCtrlPoint != '') {
|
||||||
model.setSrcCtrlPoint(core.Point.fromString(srcCtrlPoint));
|
model.setSrcCtrlPoint(core.Point.fromString(srcCtrlPoint));
|
||||||
@ -497,26 +496,26 @@ const XMLSerializer_Pela = new Class(
|
|||||||
* @param in The String whose non-valid characters we want to remove.
|
* @param in The String whose non-valid characters we want to remove.
|
||||||
* @return The in String, stripped of non-valid characters.
|
* @return The in String, stripped of non-valid characters.
|
||||||
*/
|
*/
|
||||||
rmXmlInv: function (str) {
|
rmXmlInv(str) {
|
||||||
if (str == null || str == undefined) return null;
|
if (str == null || str == undefined) return null;
|
||||||
|
|
||||||
var result = '';
|
let result = '';
|
||||||
for (var i = 0; i < str.length; i++) {
|
for (let i = 0; i < str.length; i++) {
|
||||||
var c = str.charCodeAt(i);
|
const c = str.charCodeAt(i);
|
||||||
if (
|
if (
|
||||||
c == 0x9 ||
|
c == 0x9
|
||||||
c == 0xa ||
|
|| c == 0xa
|
||||||
c == 0xd ||
|
|| c == 0xd
|
||||||
(c >= 0x20 && c <= 0xd7ff) ||
|
|| (c >= 0x20 && c <= 0xd7ff)
|
||||||
(c >= 0xe000 && c <= 0xfffd) ||
|
|| (c >= 0xe000 && c <= 0xfffd)
|
||||||
(c >= 0x10000 && c <= 0x10ffff)
|
|| (c >= 0x10000 && c <= 0x10ffff)
|
||||||
) {
|
) {
|
||||||
result = result + str.charAt(i);
|
result += str.charAt(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -24,7 +24,7 @@ const XMLSerializer_Pela = require('./XMLSerializer_Pela').default;
|
|||||||
* @extends mindplot.persistence.XMLSerializer_Pela
|
* @extends mindplot.persistence.XMLSerializer_Pela
|
||||||
*/
|
*/
|
||||||
const XMLSerializer_Tango = new Class({
|
const XMLSerializer_Tango = new Class({
|
||||||
Extends: XMLSerializer_Pela
|
Extends: XMLSerializer_Pela,
|
||||||
});
|
});
|
||||||
|
|
||||||
export default XMLSerializer_Tango
|
export default XMLSerializer_Tango;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user