From 8da65a9102d9f9dd07a6a3f319d49ceed6f27e2e Mon Sep 17 00:00:00 2001 From: Paulo Gustavo Veiga Date: Fri, 6 Jul 2012 21:21:56 -0300 Subject: [PATCH] Fix error connecting to the central node. --- mindplot/pom.xml | 2 +- .../src/main/javascript/ActionDispatcher.js | 2 +- mindplot/src/main/javascript/CentralTopic.js | 202 ++++---- .../main/javascript/CollabActionDispatcher.js | 2 +- mindplot/src/main/javascript/Designer.js | 121 ++--- .../src/main/javascript/DesignerKeyboard.js | 4 +- mindplot/src/main/javascript/DesignerModel.js | 82 ++-- mindplot/src/main/javascript/Messages.js | 460 +++++++++--------- mindplot/src/main/javascript/NodeGraph.js | 334 ++++++------- .../{RelationshipLine.js => Relationship.js} | 164 ++++--- .../javascript/StandaloneActionDispatcher.js | 116 ++--- mindplot/src/main/javascript/Topic.js | 2 +- .../framework/collab/model/NodeModel.js | 2 +- .../commands/AddRelationshipCommand.js | 2 +- .../main/javascript/commands/DeleteCommand.js | 31 +- .../src/main/javascript/model/IMindmap.js | 286 +++++------ mindplot/src/main/javascript/model/Mindmap.js | 2 +- .../javascript/model/RelationshipModel.js | 55 +-- .../persistence/XMLSerializer_Pela.js | 19 +- mindplot/src/main/javascript/widget/Menu.js | 6 +- .../src/main/resources/messages_en.properties | 2 + .../wisemapping/service/UserServiceImpl.java | 3 + 22 files changed, 957 insertions(+), 942 deletions(-) rename mindplot/src/main/javascript/{RelationshipLine.js => Relationship.js} (66%) diff --git a/mindplot/pom.xml b/mindplot/pom.xml index 2cf48a70..d46f812e 100644 --- a/mindplot/pom.xml +++ b/mindplot/pom.xml @@ -106,7 +106,7 @@ DragManager.js DragPivot.js ConnectionLine.js - RelationshipLine.js + Relationship.js DragConnector.js TextEditor.js MultilineTextEditor.js diff --git a/mindplot/src/main/javascript/ActionDispatcher.js b/mindplot/src/main/javascript/ActionDispatcher.js index 6d8dfb36..4505789b 100644 --- a/mindplot/src/main/javascript/ActionDispatcher.js +++ b/mindplot/src/main/javascript/ActionDispatcher.js @@ -31,7 +31,7 @@ mindplot.ActionDispatcher = new Class({ throw "method must be implemented."; }, - deleteTopics: function(topicsIds, relIds) { + deleteEntities: function(topicsIds, relIds) { throw "method must be implemented."; }, diff --git a/mindplot/src/main/javascript/CentralTopic.js b/mindplot/src/main/javascript/CentralTopic.js index 647a6b08..4ac5040d 100644 --- a/mindplot/src/main/javascript/CentralTopic.js +++ b/mindplot/src/main/javascript/CentralTopic.js @@ -1,98 +1,106 @@ -/* - * Copyright [2011] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -mindplot.CentralTopic = new Class({ - - Extends:mindplot.Topic, - initialize: function(model, options) { - this.parent(model, options); - }, - - _registerEvents : function() { - this.parent(); - - // 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) { - event.stopPropagation(); - }); - }, - - workoutIncomingConnectionPoint : function() { - return this.getPosition(); - }, - - _getInnerPadding : function() { - return 11; - }, - - getTopicType : function() { - return mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE; - }, - - setCursor : function(type) { - type = (type == 'move') ? 'default' : type; - this.parent(type); - }, - - isConnectedToCentralTopic : function() { - return false; - }, - - - _defaultShapeType : function() { - return mindplot.model.TopicShape.ROUNDED_RECT; - }, - - - updateTopicShape : function() { - - }, - - _updatePositionOnChangeSize : function(oldSize, newSize, updatePosition) { - - // Center main topic ... - var zeroPoint = new core.Point(0, 0); - this.setPosition(zeroPoint); - }, - - _defaultText : function() { - return $msg('CENTRAL_TOPIC'); - }, - - _defaultBackgroundColor : function() { - return "rgb(80,157,192)"; - }, - - _defaultBorderColor : function() { - return "rgb(57,113,177)"; - }, - - _defaultFontStyle : function() { - return { - font:"Verdana", - size: 10, - style:"normal", - weight:"bold", - color:"#ffffff" - }; - }, - - getShrinkConnector : function() { - return null; - } +/* + * Copyright [2011] [wisemapping] + * + * Licensed under WiseMapping Public License, Version 1.0 (the "License"). + * It is basically the Apache License, Version 2.0 (the "License") plus the + * "powered by wisemapping" text requirement on every single page; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the license at + * + * http://www.wisemapping.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +mindplot.CentralTopic = new Class({ + + Extends:mindplot.Topic, + initialize:function (model, options) { + this.parent(model, options); + }, + + _registerEvents:function () { + this.parent(); + + // 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) { + event.stopPropagation(); + }); + }, + + workoutIncomingConnectionPoint:function () { + return this.getPosition(); + }, + + _getInnerPadding:function () { + return 11; + }, + + getTopicType:function () { + return mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE; + }, + + setCursor:function (type) { + type = (type == 'move') ? 'default' : type; + this.parent(type); + }, + + isConnectedToCentralTopic:function () { + return false; + }, + + + _defaultShapeType:function () { + return mindplot.model.TopicShape.ROUNDED_RECT; + }, + + + updateTopicShape:function () { + + }, + + _updatePositionOnChangeSize:function () { + + // Center main topic ... + var zeroPoint = new core.Point(0, 0); + this.setPosition(zeroPoint); + }, + + _defaultText:function () { + return $msg('CENTRAL_TOPIC'); + }, + + _defaultBackgroundColor:function () { + return "rgb(80,157,192)"; + }, + + _defaultBorderColor:function () { + return "rgb(57,113,177)"; + }, + + _defaultFontStyle:function () { + return { + font:"Verdana", + size:10, + style:"normal", + weight:"bold", + color:"#ffffff" + }; + }, + + getShrinkConnector:function () { + return null; + }, + + workoutOutgoingConnectionPoint:function (targetPosition) { + $assert(targetPosition, 'targetPoint can not be null'); + var pos = this.getPosition(); + var isAtRight = mindplot.util.Shape.isAtRight(targetPosition, pos); + var size = this.getSize(); + return mindplot.util.Shape.calculateRectConnectionPoint(pos, size, !isAtRight); + } }); \ No newline at end of file diff --git a/mindplot/src/main/javascript/CollabActionDispatcher.js b/mindplot/src/main/javascript/CollabActionDispatcher.js index 0aeef814..a8999f23 100644 --- a/mindplot/src/main/javascript/CollabActionDispatcher.js +++ b/mindplot/src/main/javascript/CollabActionDispatcher.js @@ -139,7 +139,7 @@ mindplot.BrixActionDispatcher = new Class({ }.bind(this)); }, - deleteTopics : function(topicsIds, relIds) { + deleteEntities : function(topicsIds, relIds) { $assert(topicsIds, "topicsIds can not be null"); var framework = this._getFramework(); var mindmap = framework.getModel(); diff --git a/mindplot/src/main/javascript/Designer.js b/mindplot/src/main/javascript/Designer.js index b3987858..e0ce97cf 100644 --- a/mindplot/src/main/javascript/Designer.js +++ b/mindplot/src/main/javascript/Designer.js @@ -248,7 +248,7 @@ mindplot.Designer = new Class({ topic.addEvent('ontblur', function () { var topics = this.getModel().filterSelectedTopics(); - var rels = this.getModel().filterSelectedRelations(); + var rels = this.getModel().filterSelectedRelationships(); if (topics.length == 0 || rels.length == 0) { this.fireEvent('onblur'); @@ -257,7 +257,7 @@ mindplot.Designer = new Class({ topic.addEvent('ontfocus', function () { var topics = this.getModel().filterSelectedTopics(); - var rels = this.getModel().filterSelectedRelations(); + var rels = this.getModel().filterSelectedRelationships(); if (topics.length == 1 || rels.length == 1) { this.fireEvent('onfocus'); @@ -275,7 +275,7 @@ mindplot.Designer = new Class({ }); var model = this.getModel(); - var objects = model.getObjects(); + var objects = model.getEntities(); objects.forEach(function (object) { // Disable all nodes on focus but not the current if Ctrl key isn't being pressed if (!$defined(event) || (!event.control && !event.meta)) { @@ -289,14 +289,14 @@ mindplot.Designer = new Class({ selectAll:function () { var model = this.getModel(); - var objects = model.getObjects(); + var objects = model.getEntities(); objects.forEach(function (object) { object.setOnFocus(true); }); }, deselectAll:function () { - var objects = this.getModel().getObjects(); + var objects = this.getModel().getEntities(); objects.forEach(function (object) { object.setOnFocus(false); }); @@ -475,13 +475,20 @@ mindplot.Designer = new Class({ }, showRelPivot:function (event) { + + var nodes = this.getModel().filterSelectedTopics(); + if (nodes.length <= 0) { + // This could not happen ... + $notify("Could not create relationship. Parent relationship topic must be selected first."); + return; + } + // Current mouse position .... var screen = this._workspace.getScreenManager(); var pos = screen.getWorkspaceMousePosition(event); - var selectedTopic = this.getModel().selectedTopic(); // create a connection ... - this._relPivot.start(selectedTopic, pos); + this._relPivot.start(nodes[0], pos); }, connectByRelation:function (sourceTopic, targetTopic) { @@ -489,10 +496,8 @@ mindplot.Designer = new Class({ $assert(targetTopic, "targetTopic can not be null"); // Create a new topic model ... - // @Todo: Model should not be modified from here ... var mindmap = this.getMindmap(); var model = mindmap.createRelationship(sourceTopic.getModel().getId(), targetTopic.getModel().getId()); - this._actionDispatcher.connectByRelation(model); }, @@ -614,77 +619,46 @@ mindplot.Designer = new Class({ return this._relationshipModelToRelationship(model); }, - removeRelationship:function (model) { - this._mindmap.removeRelationship(model); - var relationship = this._relationships[model.getId()]; + _deleteRelationship:function (relationship) { var sourceTopic = relationship.getSourceTopic(); - sourceTopic.removeRelationship(relationship); + sourceTopic.deleteRelationship(relationship); + var targetTopic = relationship.getTargetTopic(); - targetTopic.removeRelationship(relationship); + targetTopic.deleteRelationship(relationship); + this._workspace.removeChild(relationship); - delete this._relationships[model.getId()]; + + this.getModel().removeRelationship(relationship); }, _buildRelationship:function (model) { - var elem = this; - - var fromNodeId = model.getFromNode(); - var toNodeId = model.getToNode(); - - var sourceTopic = null; - var targetTopic = null; var dmodel = this.getModel(); - var topics = dmodel.getTopics(); - for (var i = 0; i < topics.length; i++) { - var t = topics[i]; - if (t.getModel().getId() == fromNodeId) { - sourceTopic = t; - } - if (t.getModel().getId() == toNodeId) { - targetTopic = t; - } - if (targetTopic != null && sourceTopic != null) { - break; - } - } + var sourceTopicId = model.getFromNode(); + var sourceTopic = dmodel.findTopicById(sourceTopicId); - // Create node graph ... - var relationLine = new mindplot.RelationshipLine(sourceTopic, targetTopic, model.getLineType()); - if ($defined(model.getSrcCtrlPoint())) { - var srcPoint = model.getSrcCtrlPoint().clone(); - relationLine.setSrcControlPoint(srcPoint); - } - if ($defined(model.getDestCtrlPoint())) { - var destPoint = model.getDestCtrlPoint().clone(); - relationLine.setDestControlPoint(destPoint); - } + var targetTopicId = model.getToNode(); + var targetTopic = dmodel.findTopicById(targetTopicId); - - relationLine.getLine().setDashed(3, 2); - relationLine.setShowEndArrow(model.getEndArrow()); - relationLine.setShowStartArrow(model.getStartArrow()); - relationLine.setModel(model); - - //Add Listeners - relationLine.addEvent('onfocus', function (event) { - elem.onObjectFocusEvent(relationLine, event); - }); + // Build relationship line .... + var relationship = new mindplot.Relationship(sourceTopic, targetTopic, model); + relationship.addEvent('onfocus', function (event) { + this.onObjectFocusEvent(relationship, event); + }.bind(this)); // Append it to the workspace ... - dmodel.addRelationship(model.getId(), relationLine); - - return relationLine; + dmodel.addRelationship(relationship); + return relationship; }, - _removeNode:function (node) { + _removeTopic:function (node) { if (node.getTopicType() != mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE) { var parent = node._parent; node.disconnect(this._workspace); //remove children while (node.getChildren().length > 0) { - this._removeNode(node.getChildren()[0]); + this._removeTopic(node.getChildren()[0]); } this._workspace.removeChild(node); @@ -700,19 +674,30 @@ mindplot.Designer = new Class({ } }, - deleteCurrentNode:function () { + deleteSelectedEntities:function () { + var topics = this.getModel().filterSelectedTopics(); + var relation = this.getModel().filterSelectedRelationships(); + if (topics.length <= 0 && relation.length <= 0) { + // If there are more than one node selected, + $notify($msg('ENTITIES_COULD_NOT_BE_DELETED')); + return; + } + + // Filter the lists ... var validateFunc = function (object) { - return object.getType() == mindplot.RelationshipLine.type || object.getTopicType() != mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE + return object.getType() == mindplot.Relationship.type || object.getTopicType() != mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE }; - var validateError = 'Central topic can not be deleted.'; - + var validateError = $msg('CENTRAL_TOPIC_CAN_NOT_BE_DELETED'); var model = this.getModel(); - var topicsIds = model.filterTopicsIds(validateFunc, validateError); - var relIds = model.filterRelationIds(validateFunc, validateError); + var topicIds = model.filterTopicsIds(validateFunc, validateError); + var relIds = model.filterSelectedRelationships().map(function (rel) { + return rel.getId(); + }); - if (topicsIds.length > 0 || relIds.length > 0) { - this._actionDispatcher.deleteTopics(topicsIds, relIds); + // Finally delete the topics ... + if (topicIds.length > 0 || relIds.length > 0) { + this._actionDispatcher.deleteEntities(topicIds, relIds); } }, diff --git a/mindplot/src/main/javascript/DesignerKeyboard.js b/mindplot/src/main/javascript/DesignerKeyboard.js index 875409f0..d3ffed21 100644 --- a/mindplot/src/main/javascript/DesignerKeyboard.js +++ b/mindplot/src/main/javascript/DesignerKeyboard.js @@ -42,7 +42,7 @@ mindplot.DesignerKeyboard = new Class({ var model = designer.getModel(); var keyboardEvents = { 'backspace':function (event) { - designer.deleteCurrentNode(); + designer.deleteSelectedEntities(); event.preventDefault(); event.stopPropagation(); @@ -61,7 +61,7 @@ mindplot.DesignerKeyboard = new Class({ }.bind(this), 'delete':function () { - designer.deleteCurrentNode(); + designer.deleteSelectedEntities(); }.bind(this), 'enter':function () { diff --git a/mindplot/src/main/javascript/DesignerModel.js b/mindplot/src/main/javascript/DesignerModel.js index fac2ee6a..e42b47ea 100644 --- a/mindplot/src/main/javascript/DesignerModel.js +++ b/mindplot/src/main/javascript/DesignerModel.js @@ -17,31 +17,35 @@ */ mindplot.DesignerModel = new Class({ - Implements: [Events], - initialize : function(options) { + Implements:[Events], + initialize:function (options) { this._zoom = options.zoom; this._topics = []; - this._relationships = {}; + this._relationships = []; }, - getZoom : function() { + getZoom:function () { return this._zoom; }, - setZoom : function(zoom) { + setZoom:function (zoom) { this._zoom = zoom; }, - getTopics : function() { + getTopics:function () { return this._topics; }, - getCentralTopic : function() { + getRelationships:function () { + return this._relationships; + }, + + getCentralTopic:function () { var topics = this.getTopics(); return topics[0]; }, - filterSelectedTopics : function() { + filterSelectedTopics:function () { var result = []; for (var i = 0; i < this._topics.length; i++) { if (this._topics[i].isOnFocus()) { @@ -51,43 +55,43 @@ mindplot.DesignerModel = new Class({ return result; }, - filterSelectedRelations : function() { + filterSelectedRelationships:function () { var result = []; - for (var id in this._relationships) { - var relationship = this._relationships[id]; - if (relationship.isOnFocus()) { - result.push(relationship); + for (var i = 0; i < this._relationships.length; i++) { + if (this._relationships[i].isOnFocus()) { + result.push(this._relationships[i]); } } return result; }, - getObjects : function() { + getEntities:function () { var result = [].append(this._topics); - for (var id in this._relationships) { - result.push(this._relationships[id]); - } + result.append(this._relationships); return result; }, - removeTopic : function(topic) { + removeTopic:function (topic) { $assert(topic, "topic can not be null"); this._topics.erase(topic); }, - addTopic : function(topic) { + removeRelationship:function (rel) { + $assert(rel, "rel can not be null"); + this._relationships.erase(rel); + }, + + addTopic:function (topic) { $assert(topic, "topic can not be null"); this._topics.push(topic); }, - addRelationship : function(id, rel) { + addRelationship:function (rel) { $assert(rel, "rel can not be null"); - $assert(id, "id can not be null"); - - this._relationships[id] = rel; + this._relationships.push(rel); }, - filterTopicsIds : function(validate, errorMsg) { + filterTopicsIds:function (validate, errorMsg) { var result = []; var topics = this.filterSelectedTopics(); @@ -109,41 +113,17 @@ mindplot.DesignerModel = new Class({ return result; }, - filterRelationIds : function(validate, errorMsg) { - var result = []; - var relationships = this.filterSelectedRelations(); - var isValid = true; - for (var j = 0; j < relationships.length; j++) { - var selectedLine = relationships[j]; - isValid = true; - if ($defined(validate)) { - isValid = validate(selectedLine); - } - - if (isValid) { - result.push(selectedLine.getId()); - } else { - $notify(errorMsg); - } - } - return result; - }, - - getRelationshipsById : function() { - return this._relationships; - }, - - selectedTopic : function() { + selectedTopic:function () { var topics = this.filterSelectedTopics(); return (topics.length > 0) ? topics[0] : null; }, - findTopicById: function(id) { + findTopicById:function (id) { var result = null; for (var i = 0; i < this._topics.length; i++) { var topic = this._topics[i]; - if(topic.getId()==id){ + if (topic.getId() == id) { result = topic; break; } diff --git a/mindplot/src/main/javascript/Messages.js b/mindplot/src/main/javascript/Messages.js index 88769fb1..0d120a7f 100644 --- a/mindplot/src/main/javascript/Messages.js +++ b/mindplot/src/main/javascript/Messages.js @@ -1,229 +1,231 @@ -/* - * Copyright [2011] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -mindplot.Messages = new Class({ - Static:{ - init:function (locale) { - locale = $defined(locale) ? locale : 'en'; - var bundle = mindplot.Messages.BUNDLES[locale]; - if (bundle == null && locale.indexOf("_") != -1) { - // Try to locate without the specialization ... - locale = locale.substring(0, locale.indexOf("_")); - bundle = mindplot.Messages.BUNDLES[locale]; - } - mindplot.Messages.__bundle = bundle; - } - } -}); - -$msg = function (key) { - if (!mindplot.Messages.__bundle) { - mindplot.Messages.init('en'); - } - return mindplot.Messages.__bundle[key]; -}; - -mindplot.Messages.BUNDLES = { - 'en':{ - - ZOOM_IN:'Zoom In', - ZOOM_OUT:'Zoom Out', - TOPIC_SHAPE:'Topic Shape', - TOPIC_ADD:'Add Topic', - TOPIC_DELETE:'Delete Topic', - TOPIC_ICON:'Add Icon', - TOPIC_LINK:'Add Link', - TOPIC_RELATIONSHIP:'Relationship', - TOPIC_COLOR:'Topic Color', - TOPIC_BORDER_COLOR:'Topic Border Color', - TOPIC_NOTE:'Add Note', - FONT_FAMILY:'Font Type', - FONT_SIZE:'Text Size', - FONT_BOLD:'Text Bold', - FONT_ITALIC:'Text Italic', - UNDO_EDITION:'Undo Edition', - REDO_EDITION:'Redo Edition', - UNDO:'Undo', - REDO:'Redo', - INSERT:'Insert', - SAVE:'Save', - NOTE:'Note', - ADD_TOPIC:'Add Topic', - LOADING:'Loading ...', - EXPORT:'Export', - PRINT:'Print', - PUBLISH:'Publish', - COLLABORATE:'Share', - HISTORY:'History', - DISCARD_CHANGES:'Discard Changes', - FONT_COLOR:'Text Color', - SAVING:'Saving ...', - SAVE_COMPLETE:'Save Complete', - ZOOM_IN_ERROR:'Zoom too high.', - ZOOM_ERROR:'No more zoom can be applied.', - ONLY_ONE_TOPIC_MUST_BE_SELECTED:'Could not create a topic. Only one topic must be selected.', - ONE_TOPIC_MUST_BE_SELECTED:'Could not create a topic. One topic must be selected.', - SAVE_COULD_NOT_BE_COMPLETED:'Save could not be completed. Try latter.', - UNEXPECTED_ERROR_LOADING:"We're sorry, an unexpected error has occurred. Try again reloading the editor.\nIf the problem persists, contact us to support@wisemapping.com.", - MAIN_TOPIC:'Main Topic', - SUB_TOPIC:'Sub Topic', - ISOLATED_TOPIC:'Isolated Topic', - CENTRAL_TOPIC:'Central Topic', - ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE:'Children can not be collapsed. One topic must be selected.', - SHORTCUTS:'Keyboard Shortcuts' - }, - 'es':{ - DISCARD_CHANGES:'Descartar Cambios', - SAVE:'Guardar', - INSERT:'Insertar', - ZOOM_IN:'Acercar', - ZOOM_OUT:'Alejar', - TOPIC_BORDER_COLOR:'Color del Borde', - TOPIC_SHAPE:'Forma del Tópico', - TOPIC_ADD:'Agregar Tópico', - TOPIC_DELETE:'Borrar Tópico', - TOPIC_ICON:'Agregar Icono', - TOPIC_LINK:'Agregar Enlace', - TOPIC_NOTE:'Agregar Nota', - TOPIC_COLOR:'Color Tópico', - TOPIC_RELATIONSHIP:'Relación', - FONT_FAMILY:'Tipo de Fuente', - FONT_SIZE:'Tamaño de Texto', - FONT_BOLD:'Negrita', - FONT_ITALIC:'Italica', - FONT_COLOR:'Color de Texto', - UNDO_EDITION:'Undo Edition', - REDO_EDITION:'Redo Edition', - UNDO:'Rehacer', - NOTE:'Nota', - LOADING:'Cargando ...', - PRINT:'Imprimir', - PUBLISH:'Publicar', - REDO:'Deshacer', - ADD_TOPIC:'Agregar Tópico', - COLLABORATE:'Compartir', - EXPORT:'Exportar', - HISTORY:'History', - SAVE_COMPLETE:'Grabado Completo', - SAVING:'Grabando ...', - ONE_TOPIC_MUST_BE_SELECTED:'No ha sido posible crear un nuevo tópico. Al menos un tópico debe ser seleccionado.', - ONLY_ONE_TOPIC_MUST_BE_SELECTED:'No ha sido posible crear un nuevo tópico. Solo un tópico debe ser seleccionado.', - SAVE_COULD_NOT_BE_COMPLETED:'Grabación no pudo ser completada. Intentelo mas tarde.', - UNEXPECTED_ERROR_LOADING:"Lo sentimos, un error inesperado ha ocurrido. Intentelo nuevamente recargando el editor.\n Si el problema persiste, contactenos a support@wisemapping.com.", - ZOOM_ERROR:'No es posible aplicar mas zoom.', - ZOOM_IN_ERROR:'El zoom es muy alto.', - MAIN_TOPIC:'Tópico Principal', - SUB_TOPIC:'Tópico Secundario', - ISOLATED_TOPIC:'Tópico Aislado', - CENTRAL_TOPIC:'Tópico Central', - ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE:'Tópicos hijos no pueden ser colapsados. Solo un topic debe ser seleccionado.', - SHORTCUTS:'Accesos directos' - }, - zh_cn:{ - ZOOM_IN:'放大', - ZOOM_OUT:'缩小', - TOPIC_SHAPE:'节点外形', - TOPIC_ADD:'添加节点', - TOPIC_DELETE:'删除节点', - TOPIC_ICON:'加入图标', - TOPIC_LINK:'添加链接', - TOPIC_RELATIONSHIP:'关系', - TOPIC_COLOR:'节点颜色', - TOPIC_BORDER_COLOR:'边框颜色', - TOPIC_NOTE:'添加注释', - FONT_FAMILY:'字体', - FONT_SIZE:'文字大小', - FONT_BOLD:'粗体', - FONT_ITALIC:'斜体', - UNDO:'撤销', - REDO:'重做', - INSERT:'插入', - SAVE:'保存', - NOTE:'注释', - ADD_TOPIC:'添加节点', - LOADING:'载入中……', - EXPORT:'导出', - PRINT:'打印', - PUBLISH:'公开', - COLLABORATE:'共享', - HISTORY:'历史', - DISCARD_CHANGES:'清除改变', - FONT_COLOR:'文本颜色', - SAVING:'保存中……', - SAVE_COMPLETE:'完成保存', - ZOOM_IN_ERROR:'缩放过多。', - ZOOM_ERROR:'不能再缩放。', - ONLY_ONE_TOPIC_MUST_BE_SELECTED:'不能创建节点。仅能选择一个节点。', - ONE_TOPIC_MUST_BE_SELECTED:'不能创建节点。必须选择一个节点。', - ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE:'子节点不能折叠。必须选择一个节点。', - SAVE_COULD_NOT_BE_COMPLETED:'保存未完成。稍后再试。', - UNEXPECTED_ERROR_LOADING:'抱歉,突遭错误,我们无法处理你的请求。\n尝试重新装载编辑器。如果问题依然存在请联系support@wisemapping.com。', - MAIN_TOPIC:'主节点', - SUB_TOPIC:'子节点', - ISOLATED_TOPIC:'独立节点', - CENTRAL_TOPIC:'中心节点', - SHORTCUTS:'快捷键' - }, - zh_tw:{ - ZOOM_IN:'放大', - ZOOM_OUT:'縮小', - TOPIC_SHAPE:'節點外形', - TOPIC_ADD:'添加節點', - TOPIC_DELETE:'刪除節點', - TOPIC_ICON:'加入圖示', - TOPIC_LINK:'添加鏈接', - TOPIC_RELATIONSHIP:'關係', - TOPIC_COLOR:'節點顏色', - TOPIC_BORDER_COLOR:'邊框顏色', - TOPIC_NOTE:'添加注釋', - FONT_FAMILY:'字體', - FONT_SIZE:'文字大小', - FONT_BOLD:'粗體', - FONT_ITALIC:'斜體', - UNDO:'撤銷', - REDO:'重做', - INSERT:'插入', - SAVE:'保存', - NOTE:'注釋', - ADD_TOPIC:'添加節點', - LOADING:'載入中……', - EXPORT:'導出', - PRINT:'列印', - PUBLISH:'公開', - COLLABORATE:'共用', - HISTORY:'歷史', - DISCARD_CHANGES:'清除改變', - FONT_COLOR:'文本顏色', - SAVING:'保存中……', - SAVE_COMPLETE:'完成保存', - ZOOM_IN_ERROR:'縮放過多。', - ZOOM_ERROR:'不能再縮放。', - ONLY_ONE_TOPIC_MUST_BE_SELECTED:'不能創建節點。僅能選擇一個節點。', - ONE_TOPIC_MUST_BE_SELECTED:'不能創建節點。必須選擇一個節點。', - ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE:'子節點不能折疊。必須選擇一個節點。', - SAVE_COULD_NOT_BE_COMPLETED:'保存未完成。稍後再試。', - UNEXPECTED_ERROR_LOADING:'抱歉,突遭錯誤,我們無法處理你的請求。\n嘗試重新裝載編輯器。如果問題依然存在請聯繫support@wisemapping.com。', - MAIN_TOPIC:'主節點', - SUB_TOPIC:'子節點', - ISOLATED_TOPIC:'獨立節點', - CENTRAL_TOPIC:'中心節點', - SHORTCUTS:'快捷鍵' - } -}; -mindplot.Messages.BUNDLES['zh'] = mindplot.Messages.zh_tw; - +/* + * Copyright [2011] [wisemapping] + * + * Licensed under WiseMapping Public License, Version 1.0 (the "License"). + * It is basically the Apache License, Version 2.0 (the "License") plus the + * "powered by wisemapping" text requirement on every single page; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the license at + * + * http://www.wisemapping.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +mindplot.Messages = new Class({ + Static:{ + init:function (locale) { + locale = $defined(locale) ? locale : 'en'; + var bundle = mindplot.Messages.BUNDLES[locale]; + if (bundle == null && locale.indexOf("_") != -1) { + // Try to locate without the specialization ... + locale = locale.substring(0, locale.indexOf("_")); + bundle = mindplot.Messages.BUNDLES[locale]; + } + mindplot.Messages.__bundle = bundle; + } + } +}); + +$msg = function (key) { + if (!mindplot.Messages.__bundle) { + mindplot.Messages.init('en'); + } + return mindplot.Messages.__bundle[key]; +}; + +mindplot.Messages.BUNDLES = { + 'en':{ + + ZOOM_IN:'Zoom In', + ZOOM_OUT:'Zoom Out', + TOPIC_SHAPE:'Topic Shape', + TOPIC_ADD:'Add Topic', + TOPIC_DELETE:'Delete Topic', + TOPIC_ICON:'Add Icon', + TOPIC_LINK:'Add Link', + TOPIC_RELATIONSHIP:'Relationship', + TOPIC_COLOR:'Topic Color', + TOPIC_BORDER_COLOR:'Topic Border Color', + TOPIC_NOTE:'Add Note', + FONT_FAMILY:'Font Type', + FONT_SIZE:'Text Size', + FONT_BOLD:'Text Bold', + FONT_ITALIC:'Text Italic', + UNDO_EDITION:'Undo Edition', + REDO_EDITION:'Redo Edition', + UNDO:'Undo', + REDO:'Redo', + INSERT:'Insert', + SAVE:'Save', + NOTE:'Note', + ADD_TOPIC:'Add Topic', + LOADING:'Loading ...', + EXPORT:'Export', + PRINT:'Print', + PUBLISH:'Publish', + COLLABORATE:'Share', + HISTORY:'History', + DISCARD_CHANGES:'Discard Changes', + FONT_COLOR:'Text Color', + SAVING:'Saving ...', + SAVE_COMPLETE:'Save Complete', + ZOOM_IN_ERROR:'Zoom too high.', + ZOOM_ERROR:'No more zoom can be applied.', + ONLY_ONE_TOPIC_MUST_BE_SELECTED:'Could not create a topic. Only one topic must be selected.', + ONE_TOPIC_MUST_BE_SELECTED:'Could not create a topic. One topic must be selected.', + SAVE_COULD_NOT_BE_COMPLETED:'Save could not be completed. Try latter.', + UNEXPECTED_ERROR_LOADING:"We're sorry, an unexpected error has occurred. Try again reloading the editor.\nIf the problem persists, contact us to support@wisemapping.com.", + MAIN_TOPIC:'Main Topic', + SUB_TOPIC:'Sub Topic', + ISOLATED_TOPIC:'Isolated Topic', + CENTRAL_TOPIC:'Central Topic', + ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE:'Children can not be collapsed. One topic must be selected.', + SHORTCUTS:'Keyboard Shortcuts', + ENTITIES_COULD_NOT_BE_DELETED: 'Could not delete topic or relation. At least one map entity must be selected.', + CENTRAL_TOPIC_CAN_NOT_BE_DELETED: 'Central topic can not be deleted.' + }, + 'es':{ + DISCARD_CHANGES:'Descartar Cambios', + SAVE:'Guardar', + INSERT:'Insertar', + ZOOM_IN:'Acercar', + ZOOM_OUT:'Alejar', + TOPIC_BORDER_COLOR:'Color del Borde', + TOPIC_SHAPE:'Forma del Tópico', + TOPIC_ADD:'Agregar Tópico', + TOPIC_DELETE:'Borrar Tópico', + TOPIC_ICON:'Agregar Icono', + TOPIC_LINK:'Agregar Enlace', + TOPIC_NOTE:'Agregar Nota', + TOPIC_COLOR:'Color Tópico', + TOPIC_RELATIONSHIP:'Relación', + FONT_FAMILY:'Tipo de Fuente', + FONT_SIZE:'Tamaño de Texto', + FONT_BOLD:'Negrita', + FONT_ITALIC:'Italica', + FONT_COLOR:'Color de Texto', + UNDO_EDITION:'Undo Edition', + REDO_EDITION:'Redo Edition', + UNDO:'Rehacer', + NOTE:'Nota', + LOADING:'Cargando ...', + PRINT:'Imprimir', + PUBLISH:'Publicar', + REDO:'Deshacer', + ADD_TOPIC:'Agregar Tópico', + COLLABORATE:'Compartir', + EXPORT:'Exportar', + HISTORY:'History', + SAVE_COMPLETE:'Grabado Completo', + SAVING:'Grabando ...', + ONE_TOPIC_MUST_BE_SELECTED:'No ha sido posible crear un nuevo tópico. Al menos un tópico debe ser seleccionado.', + ONLY_ONE_TOPIC_MUST_BE_SELECTED:'No ha sido posible crear un nuevo tópico. Solo un tópico debe ser seleccionado.', + SAVE_COULD_NOT_BE_COMPLETED:'Grabación no pudo ser completada. Intentelo mas tarde.', + UNEXPECTED_ERROR_LOADING:"Lo sentimos, un error inesperado ha ocurrido. Intentelo nuevamente recargando el editor.\n Si el problema persiste, contactenos a support@wisemapping.com.", + ZOOM_ERROR:'No es posible aplicar mas zoom.', + ZOOM_IN_ERROR:'El zoom es muy alto.', + MAIN_TOPIC:'Tópico Principal', + SUB_TOPIC:'Tópico Secundario', + ISOLATED_TOPIC:'Tópico Aislado', + CENTRAL_TOPIC:'Tópico Central', + ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE:'Tópicos hijos no pueden ser colapsados. Solo un topic debe ser seleccionado.', + SHORTCUTS:'Accesos directos' + }, + zh_cn:{ + ZOOM_IN:'放大', + ZOOM_OUT:'缩小', + TOPIC_SHAPE:'节点外形', + TOPIC_ADD:'添加节点', + TOPIC_DELETE:'删除节点', + TOPIC_ICON:'加入图标', + TOPIC_LINK:'添加链接', + TOPIC_RELATIONSHIP:'关系', + TOPIC_COLOR:'节点颜色', + TOPIC_BORDER_COLOR:'边框颜色', + TOPIC_NOTE:'添加注释', + FONT_FAMILY:'字体', + FONT_SIZE:'文字大小', + FONT_BOLD:'粗体', + FONT_ITALIC:'斜体', + UNDO:'撤销', + REDO:'重做', + INSERT:'插入', + SAVE:'保存', + NOTE:'注释', + ADD_TOPIC:'添加节点', + LOADING:'载入中……', + EXPORT:'导出', + PRINT:'打印', + PUBLISH:'公开', + COLLABORATE:'共享', + HISTORY:'历史', + DISCARD_CHANGES:'清除改变', + FONT_COLOR:'文本颜色', + SAVING:'保存中……', + SAVE_COMPLETE:'完成保存', + ZOOM_IN_ERROR:'缩放过多。', + ZOOM_ERROR:'不能再缩放。', + ONLY_ONE_TOPIC_MUST_BE_SELECTED:'不能创建节点。仅能选择一个节点。', + ONE_TOPIC_MUST_BE_SELECTED:'不能创建节点。必须选择一个节点。', + ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE:'子节点不能折叠。必须选择一个节点。', + SAVE_COULD_NOT_BE_COMPLETED:'保存未完成。稍后再试。', + UNEXPECTED_ERROR_LOADING:'抱歉,突遭错误,我们无法处理你的请求。\n尝试重新装载编辑器。如果问题依然存在请联系support@wisemapping.com。', + MAIN_TOPIC:'主节点', + SUB_TOPIC:'子节点', + ISOLATED_TOPIC:'独立节点', + CENTRAL_TOPIC:'中心节点', + SHORTCUTS:'快捷键' + }, + zh_tw:{ + ZOOM_IN:'放大', + ZOOM_OUT:'縮小', + TOPIC_SHAPE:'節點外形', + TOPIC_ADD:'添加節點', + TOPIC_DELETE:'刪除節點', + TOPIC_ICON:'加入圖示', + TOPIC_LINK:'添加鏈接', + TOPIC_RELATIONSHIP:'關係', + TOPIC_COLOR:'節點顏色', + TOPIC_BORDER_COLOR:'邊框顏色', + TOPIC_NOTE:'添加注釋', + FONT_FAMILY:'字體', + FONT_SIZE:'文字大小', + FONT_BOLD:'粗體', + FONT_ITALIC:'斜體', + UNDO:'撤銷', + REDO:'重做', + INSERT:'插入', + SAVE:'保存', + NOTE:'注釋', + ADD_TOPIC:'添加節點', + LOADING:'載入中……', + EXPORT:'導出', + PRINT:'列印', + PUBLISH:'公開', + COLLABORATE:'共用', + HISTORY:'歷史', + DISCARD_CHANGES:'清除改變', + FONT_COLOR:'文本顏色', + SAVING:'保存中……', + SAVE_COMPLETE:'完成保存', + ZOOM_IN_ERROR:'縮放過多。', + ZOOM_ERROR:'不能再縮放。', + ONLY_ONE_TOPIC_MUST_BE_SELECTED:'不能創建節點。僅能選擇一個節點。', + ONE_TOPIC_MUST_BE_SELECTED:'不能創建節點。必須選擇一個節點。', + ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE:'子節點不能折疊。必須選擇一個節點。', + SAVE_COULD_NOT_BE_COMPLETED:'保存未完成。稍後再試。', + UNEXPECTED_ERROR_LOADING:'抱歉,突遭錯誤,我們無法處理你的請求。\n嘗試重新裝載編輯器。如果問題依然存在請聯繫support@wisemapping.com。', + MAIN_TOPIC:'主節點', + SUB_TOPIC:'子節點', + ISOLATED_TOPIC:'獨立節點', + CENTRAL_TOPIC:'中心節點', + SHORTCUTS:'快捷鍵' + } +}; +mindplot.Messages.BUNDLES['zh'] = mindplot.Messages.zh_tw; + diff --git a/mindplot/src/main/javascript/NodeGraph.js b/mindplot/src/main/javascript/NodeGraph.js index 4715d7b5..daf2997c 100644 --- a/mindplot/src/main/javascript/NodeGraph.js +++ b/mindplot/src/main/javascript/NodeGraph.js @@ -1,168 +1,168 @@ -/* - * Copyright [2011] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -mindplot.NodeGraph = new Class({ - initialize:function(nodeModel, options) { - $assert(nodeModel, "model can not be null"); - - this._options = options; - this._mouseEvents = true; - this.setModel(nodeModel); - this._onFocus = false; - this._event = new Events(); - this._size = {width:50,height:20}; - }, - - isReadOnly : function(){ - return this._options.readOnly; - }, - - getType : function() { - var model = this.getModel(); - return model.getType(); - }, - - setId : function(id) { - this.getModel().setId(id); - }, - - _set2DElement : function(elem2d) { - this._elem2d = elem2d; - }, - - get2DElement : function() { - $assert(this._elem2d, 'NodeGraph has not been initialized properly'); - return this._elem2d; - }, - - setPosition : function(point, fireEvent) { - throw "Unsupported operation"; - }, - - addEvent : function(type, listener) { - var elem = this.get2DElement(); - elem.addEvent(type, listener); - }, - - removeEvent : function(type, listener) { - var elem = this.get2DElement(); - elem.removeEvent(type, listener); - }, - - fireEvent: function(type, event) { - var elem = this.get2DElement(); - elem.fireEvent(type, event); - }, - - setMouseEventsEnabled : function(isEnabled) { - this._mouseEvents = isEnabled; - }, - - isMouseEventsEnabled : function() { - return this._mouseEvents; - }, - - getSize : function() { - return this._size; - }, - - setSize : function(size) { - this._size.width = parseInt(size.width); - this._size.height = parseInt(size.height); - }, - - getModel:function() { - $assert(this._model, 'Model has not been initialized yet'); - return this._model; - }, - - setModel : function(model) { - $assert(model, 'Model can not be null'); - this._model = model; - }, - - getId : function() { - return this._model.getId(); - }, - - setOnFocus : function(focus) { - if (this._onFocus != focus) { - - this._onFocus = focus; - var outerShape = this.getOuterShape(); - if (focus) { - outerShape.setFill(mindplot.Topic.OUTER_SHAPE_ATTRIBUTES_FOCUS.fillColor); - outerShape.setOpacity(1); - - } else { - outerShape.setFill(mindplot.Topic.OUTER_SHAPE_ATTRIBUTES.fillColor); - outerShape.setOpacity(0); - } - this.setCursor('move'); - - // In any case, always try to hide the editor ... - this.closeEditors(); - - // Fire event ... - this.fireEvent(focus ? 'ontfocus' : 'ontblur'); - - } - }, - - isOnFocus : function() { - return this._onFocus; - }, - - dispose : function(workspace) { - this.setOnFocus(false); - workspace.removeChild(this); - }, - - createDragNode : function(layoutManager) { - var dragShape = this._buildDragShape(); - return new mindplot.DragTopic(dragShape, this, layoutManager); - }, - - _buildDragShape : function() { - $assert(false, '_buildDragShape must be implemented by all nodes.'); - }, - - getPosition : function() { - var model = this.getModel(); - return model.getPosition(); - } -}); - -mindplot.NodeGraph.create = function(nodeModel, options) { - $assert(nodeModel, 'Model can not be null'); - - var type = nodeModel.getType(); - $assert(type, 'Node model type can not be null'); - - var result; - if (type == mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE) { - result = new mindplot.CentralTopic(nodeModel, options); - } else - if (type == mindplot.model.INodeModel.MAIN_TOPIC_TYPE) { - result = new mindplot.MainTopic(nodeModel, options); - } else { - $assert(false, "unsupported node type:" + type); - } - - return result; +/* + * Copyright [2011] [wisemapping] + * + * Licensed under WiseMapping Public License, Version 1.0 (the "License"). + * It is basically the Apache License, Version 2.0 (the "License") plus the + * "powered by wisemapping" text requirement on every single page; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the license at + * + * http://www.wisemapping.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +mindplot.NodeGraph = new Class({ + initialize:function(nodeModel, options) { + $assert(nodeModel, "model can not be null"); + + this._options = options; + this._mouseEvents = true; + this.setModel(nodeModel); + this._onFocus = false; + this._event = new Events(); + this._size = {width:50,height:20}; + }, + + isReadOnly : function(){ + return this._options.readOnly; + }, + + getType : function() { + var model = this.getModel(); + return model.getType(); + }, + + setId : function(id) { + this.getModel().setId(id); + }, + + _set2DElement : function(elem2d) { + this._elem2d = elem2d; + }, + + get2DElement : function() { + $assert(this._elem2d, 'NodeGraph has not been initialized properly'); + return this._elem2d; + }, + + setPosition : function(point, fireEvent) { + throw "Unsupported operation"; + }, + + addEvent : function(type, listener) { + var elem = this.get2DElement(); + elem.addEvent(type, listener); + }, + + removeEvent : function(type, listener) { + var elem = this.get2DElement(); + elem.removeEvent(type, listener); + }, + + fireEvent: function(type, event) { + var elem = this.get2DElement(); + elem.fireEvent(type, event); + }, + + setMouseEventsEnabled : function(isEnabled) { + this._mouseEvents = isEnabled; + }, + + isMouseEventsEnabled : function() { + return this._mouseEvents; + }, + + getSize : function() { + return this._size; + }, + + setSize : function(size) { + this._size.width = parseInt(size.width); + this._size.height = parseInt(size.height); + }, + + getModel:function() { + $assert(this._model, 'Model has not been initialized yet'); + return this._model; + }, + + setModel : function(model) { + $assert(model, 'Model can not be null'); + this._model = model; + }, + + getId : function() { + return this._model.getId(); + }, + + setOnFocus : function(focus) { + if (this._onFocus != focus) { + + this._onFocus = focus; + var outerShape = this.getOuterShape(); + if (focus) { + outerShape.setFill(mindplot.Topic.OUTER_SHAPE_ATTRIBUTES_FOCUS.fillColor); + outerShape.setOpacity(1); + + } else { + outerShape.setFill(mindplot.Topic.OUTER_SHAPE_ATTRIBUTES.fillColor); + outerShape.setOpacity(0); + } + this.setCursor('move'); + + // In any case, always try to hide the editor ... + this.closeEditors(); + + // Fire event ... + this.fireEvent(focus ? 'ontfocus' : 'ontblur',this); + + } + }, + + isOnFocus : function() { + return this._onFocus; + }, + + dispose : function(workspace) { + this.setOnFocus(false); + workspace.removeChild(this); + }, + + createDragNode : function(layoutManager) { + var dragShape = this._buildDragShape(); + return new mindplot.DragTopic(dragShape, this, layoutManager); + }, + + _buildDragShape : function() { + $assert(false, '_buildDragShape must be implemented by all nodes.'); + }, + + getPosition : function() { + var model = this.getModel(); + return model.getPosition(); + } +}); + +mindplot.NodeGraph.create = function(nodeModel, options) { + $assert(nodeModel, 'Model can not be null'); + + var type = nodeModel.getType(); + $assert(type, 'Node model type can not be null'); + + var result; + if (type == mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE) { + result = new mindplot.CentralTopic(nodeModel, options); + } else + if (type == mindplot.model.INodeModel.MAIN_TOPIC_TYPE) { + result = new mindplot.MainTopic(nodeModel, options); + } else { + $assert(false, "unsupported node type:" + type); + } + + return result; }; \ No newline at end of file diff --git a/mindplot/src/main/javascript/RelationshipLine.js b/mindplot/src/main/javascript/Relationship.js similarity index 66% rename from mindplot/src/main/javascript/RelationshipLine.js rename to mindplot/src/main/javascript/Relationship.js index bfd19450..b18f5af7 100644 --- a/mindplot/src/main/javascript/RelationshipLine.js +++ b/mindplot/src/main/javascript/Relationship.js @@ -15,15 +15,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -mindplot.RelationshipLine = new Class({ - Extends: mindplot.ConnectionLine, - initialize:function(sourceNode, targetNode, lineType) { - this.parent(sourceNode, targetNode, lineType); +mindplot.Relationship = new Class({ + Extends:mindplot.ConnectionLine, + initialize:function (sourceNode, targetNode, model) { + $assert(sourceNode,"sourceNode can not be null"); + $assert(targetNode,"targetNode can not be null"); + + this.parent(sourceNode, targetNode, model.getLineType()); + this.setModel(model); + + var strokeColor = mindplot.Relationship.getStrokeColor(); this._line2d.setIsSrcControlPointCustom(false); this._line2d.setIsDestControlPointCustom(false); + this._line2d.setCursor('pointer'); + this._line2d.setStroke(1, 'solid', strokeColor); + this._line2d.setDashed(4, 2); this._focusShape = this._createLine(this.getLineType(), mindplot.ConnectionLine.SIMPLE_CURVED); this._focusShape.setStroke(2, "solid", "#3f96ff"); + var ctrlPoints = this._line2d.getControlPoints(); this._focusShape.setSrcControlPoint(ctrlPoints[0]); this._focusShape.setDestControlPoint(ctrlPoints[1]); @@ -32,23 +42,35 @@ mindplot.RelationshipLine = new Class({ this._isInWorkspace = false; this._controlPointsController = new mindplot.ControlPoint(); - var strokeColor = mindplot.RelationshipLine.getStrokeColor(); this._startArrow = new web2d.Arrow(); - this._endArrow = new web2d.Arrow(); this._startArrow.setStrokeColor(strokeColor); this._startArrow.setStrokeWidth(2); - this._endArrow.setStrokeColor(strokeColor); - this._endArrow.setStrokeWidth(2); - this._line2d.setStroke(1, 'solid', strokeColor); + this.setShowStartArrow(true); + // Share style is disable ... + if (this._showEndArrow) { + this._endArrow = new web2d.Arrow(); + this._endArrow.setStrokeColor(strokeColor); + this._endArrow.setStrokeWidth(2); + } + + // Position the line ... + if ($defined(model.getSrcCtrlPoint())) { + var srcPoint = model.getSrcCtrlPoint().clone(); + this.setSrcControlPoint(srcPoint); + } + if ($defined(model.getDestCtrlPoint())) { + var destPoint = model.getDestCtrlPoint().clone(); + this.setDestControlPoint(destPoint); + } }, - setStroke : function(color, style, opacity) { + setStroke:function (color, style, opacity) { this.parent(color, style, opacity); this._startArrow.setStrokeColor(color); }, - redraw : function() { + redraw:function () { var line2d = this._line2d; var sourceTopic = this._sourceTopic; var sourcePosition = sourceTopic.getPosition(); @@ -56,7 +78,7 @@ mindplot.RelationshipLine = new Class({ var targetTopic = this._targetTopic; var targetPosition = targetTopic.getPosition(); - var sPos,tPos; + var sPos, tPos; this._line2d.setStroke(2); var ctrlPoints = this._line2d.getControlPoints(); if (!this._line2d.isDestControlPointCustom() && !this._line2d.isSrcControlPointCustom()) { @@ -82,7 +104,7 @@ mindplot.RelationshipLine = new Class({ line2d.moveToFront(); //Positionate Arrows - this._positionateArrows(); + this._positionArrows(); // Add connector ... this._positionateConnector(targetTopic); @@ -94,62 +116,74 @@ mindplot.RelationshipLine = new Class({ this._controlPointsController.redraw(); }, - _positionateArrows : function() { + _positionArrows:function () { var tpos = this._line2d.getTo(); - this._endArrow.setFrom(tpos.x, tpos.y); - var spos = this._line2d.getFrom(); - this._startArrow.setFrom(spos.x, spos.y); - this._endArrow.moveToBack(); + this._startArrow.setFrom(spos.x, spos.y); this._startArrow.moveToBack(); + if (this._endArrow) { + this._endArrow.setFrom(tpos.x, tpos.y); + this._endArrow.moveToBack(); + } + if (this._line2d.getType() == "CurvedLine") { var controlPoints = this._line2d.getControlPoints(); this._startArrow.setControlPoint(controlPoints[0]); - this._endArrow.setControlPoint(controlPoints[1]); + if (this._endArrow) { + this._endArrow.setControlPoint(controlPoints[1]); + } } else { this._startArrow.setControlPoint(this._line2d.getTo()); - this._endArrow.setControlPoint(this._line2d.getFrom()); + if (this._endArrow) { + this._endArrow.setControlPoint(this._line2d.getFrom()); + } } - this._endArrow.setVisibility(this.isVisible() && this._showEndArrow); + if (this._showEndArrow) { + this._endArrow.setVisibility(this.isVisible()); + } this._startArrow.setVisibility(this.isVisible() && this._showStartArrow); }, - addToWorkspace : function(workspace) { + addToWorkspace:function (workspace) { workspace.appendChild(this._focusShape); workspace.appendChild(this._controlPointsController); + this._controlPointControllerListener = this._initializeControlPointController.bind(this); this._line2d.addEvent('click', this._controlPointControllerListener); this._isInWorkspace = true; workspace.appendChild(this._startArrow); - workspace.appendChild(this._endArrow); + if (this._endArrow) + workspace.appendChild(this._endArrow); this.parent(workspace); + this._positionArrows(); }, - _initializeControlPointController : function() { + _initializeControlPointController:function () { this.setOnFocus(true); }, - removeFromWorkspace : function(workspace) { + removeFromWorkspace:function (workspace) { workspace.removeChild(this._focusShape); workspace.removeChild(this._controlPointsController); this._line2d.removeEvent('click', this._controlPointControllerListener); this._isInWorkspace = false; workspace.removeChild(this._startArrow); - workspace.removeChild(this._endArrow); + if (this._endArrow) + workspace.removeChild(this._endArrow); this.parent(workspace); }, - getType : function() { - return mindplot.RelationshipLine.type; + getType:function () { + return mindplot.Relationship.type; }, - setOnFocus : function(focus) { + setOnFocus:function (focus) { // Change focus shape if (this.isOnFocus() != focus) { if (focus) { @@ -160,12 +194,12 @@ mindplot.RelationshipLine = new Class({ this._controlPointsController.setVisibility(focus); this._onFocus = focus; - this._line2d.setCursor(this.isOnFocus() ? 'default' : 'pointer'); + console.log("foucus:...."); } }, - _refreshShape : function () { + _refreshShape:function () { var sPos = this._line2d.getFrom(); var tPos = this._line2d.getTo(); var ctrlPoints = this._line2d.getControlPoints(); @@ -179,7 +213,7 @@ mindplot.RelationshipLine = new Class({ this._focusShape.updateLine(); }, - addEvent : function(type, listener) { + addEvent:function (type, listener) { // Translate to web 2d events ... if (type == 'onfocus') { type = 'mousedown'; @@ -189,21 +223,22 @@ mindplot.RelationshipLine = new Class({ line.addEvent(type, listener); }, - isOnFocus : function() { + isOnFocus:function () { return this._onFocus; }, - isInWorkspace : function() { + isInWorkspace:function () { return this._isInWorkspace; }, - setVisibility : function(value) { + setVisibility:function (value) { this.parent(value); - this._endArrow.setVisibility(this._showEndArrow && value); + if (this._showEndArrow) + this._endArrow.setVisibility(this._showEndArrow); this._startArrow.setVisibility(this._showStartArrow && value); }, - setOpacity : function(opacity) { + setOpacity:function (opacity) { this.parent(opacity); if (this._showEndArrow) this._endArrow.setOpacity(opacity); @@ -211,74 +246,73 @@ mindplot.RelationshipLine = new Class({ this._startArrow.setOpacity(opacity); }, - setShowEndArrow : function(visible) { + setShowEndArrow:function (visible) { this._showEndArrow = visible; if (this._isInWorkspace) this.redraw(); }, - setShowStartArrow : function(visible) { + setShowStartArrow:function (visible) { this._showStartArrow = visible; if (this._isInWorkspace) this.redraw(); }, - isShowEndArrow : function() { - return this._showEndArrow; - }, - - isShowStartArrow : function() { - return this._showStartArrow; - }, - - setFrom : function(x, y) { - $assert(x, "x must be defined"); - $assert(y, "y must be defined"); + setFrom:function (x, y) { + $assert($defined(x), "x must be defined"); + $assert($defined(y), "y must be defined"); this._line2d.setFrom(x, y); this._startArrow.setFrom(x, y); }, - setTo : function(x, y) { - $assert(y, "x must be defined"); - $assert(y, "y must be defined"); + setTo:function (x, y) { + $assert($defined(x), "x must be defined"); + $assert($defined(y), "y must be defined"); this._line2d.setTo(x, y); - this._endArrow.setFrom(x, y); + if (this._endArrow) + this._endArrow.setFrom(x, y); }, - setSrcControlPoint : function(control) { + setSrcControlPoint:function (control) { this._line2d.setSrcControlPoint(control); this._startArrow.setControlPoint(control); }, - setDestControlPoint : function(control) { + setDestControlPoint:function (control) { this._line2d.setDestControlPoint(control); - this._endArrow.setControlPoint(control); + if (this._showEndArrow) + this._endArrow.setControlPoint(control); }, - getControlPoints : function() { + getControlPoints:function () { return this._line2d.getControlPoints(); }, - isSrcControlPointCustom : function() { + isSrcControlPointCustom:function () { return this._line2d.isSrcControlPointCustom(); }, - isDestControlPointCustom : function() { + isDestControlPointCustom:function () { return this._line2d.isDestControlPointCustom(); }, - setIsSrcControlPointCustom : function(isCustom) { + setIsSrcControlPointCustom:function (isCustom) { this._line2d.setIsSrcControlPointCustom(isCustom); }, - setIsDestControlPointCustom : function(isCustom) { + setIsDestControlPointCustom:function (isCustom) { this._line2d.setIsDestControlPointCustom(isCustom); - }}); + }, + + getId: function(){ + return this._model.getId(); + } +}); -mindplot.RelationshipLine.type = "RelationshipLine"; -mindplot.RelationshipLine.getStrokeColor = function() { +mindplot.Relationship.type = "Relationship"; +mindplot.Relationship.getStrokeColor = function () { return '#9b74e6'; }; diff --git a/mindplot/src/main/javascript/StandaloneActionDispatcher.js b/mindplot/src/main/javascript/StandaloneActionDispatcher.js index ae368c99..0c0ca2d4 100644 --- a/mindplot/src/main/javascript/StandaloneActionDispatcher.js +++ b/mindplot/src/main/javascript/StandaloneActionDispatcher.js @@ -17,45 +17,45 @@ */ mindplot.StandaloneActionDispatcher = new Class({ - Extends: mindplot.ActionDispatcher, - initialize: function(commandContext) { + Extends:mindplot.ActionDispatcher, + initialize:function (commandContext) { this.parent(commandContext); this._actionRunner = new mindplot.DesignerActionRunner(commandContext, this); }, - hasBeenChanged: function() { + hasBeenChanged:function () { // @todo: This don't seems to belong here. this._actionRunner.hasBeenChanged(); }, - addTopic:function(nodeModel, parentTopicId, animated) { + addTopic:function (nodeModel, parentTopicId, animated) { var command = new mindplot.commands.AddTopicCommand(nodeModel, parentTopicId, animated); this.execute(command); }, - connectByRelation: function(model) { + connectByRelation:function (model) { var command = new mindplot.commands.AddRelationshipCommand(model); this.execute(command); }, - deleteTopics: function(topicsIds, relIds) { + deleteEntities:function (topicsIds, relIds) { var command = new mindplot.commands.DeleteCommand(topicsIds, relIds); this.execute(command); }, - dragTopic: function(topicId, position, order, parentTopic) { + dragTopic:function (topicId, position, order, parentTopic) { var command = new mindplot.commands.DragTopicCommand(topicId, position, order, parentTopic); this.execute(command); }, - moveTopic: function(topicId, position) { + moveTopic:function (topicId, position) { $assert($defined(topicId), "topicsId can not be null"); $assert($defined(position), "position can not be null"); - var commandFunc = function(topic, value) { + var commandFunc = function (topic, value) { var result = topic.getPosition(); - mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.NodeMoveEvent, {node:topic.getModel(),position:value}); + mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.NodeMoveEvent, {node:topic.getModel(), position:value}); return result; }; @@ -63,14 +63,14 @@ mindplot.StandaloneActionDispatcher = new Class({ this.execute(command); }, - moveControlPoint: function(ctrlPoint, point) { + moveControlPoint:function (ctrlPoint, point) { var command = new mindplot.commands.MoveControlPointCommand(ctrlPoint, point); this.execute(command); }, - changeFontStyleToTopic: function(topicsIds) { + changeFontStyleToTopic:function (topicsIds) { - var commandFunc = function(topic) { + var commandFunc = function (topic) { var result = topic.getFontStyle(); var style = (result == "italic") ? "normal" : "italic"; topic.setFontStyle(style, true); @@ -81,10 +81,10 @@ mindplot.StandaloneActionDispatcher = new Class({ }, - changeTextToTopic : function(topicsIds, text) { + changeTextToTopic:function (topicsIds, text) { $assert($defined(topicsIds), "topicsIds can not be null"); - var commandFunc = function(topic, value) { + var commandFunc = function (topic, value) { var result = topic.getText(); topic.setText(value); return result; @@ -94,12 +94,12 @@ mindplot.StandaloneActionDispatcher = new Class({ this.execute(command); }, - changeFontFamilyToTopic: function(topicIds, fontFamily) { + changeFontFamilyToTopic:function (topicIds, fontFamily) { $assert(topicIds, "topicIds can not be null"); $assert(fontFamily, "fontFamily can not be null"); - var commandFunc = function(topic, fontFamily) { + var commandFunc = function (topic, fontFamily) { var result = topic.getFontFamily(); topic.setFontFamily(fontFamily, true); @@ -111,11 +111,11 @@ mindplot.StandaloneActionDispatcher = new Class({ this.execute(command); }, - changeFontColorToTopic: function(topicsIds, color) { + changeFontColorToTopic:function (topicsIds, color) { $assert(topicsIds, "topicIds can not be null"); $assert(color, "color can not be null"); - var commandFunc = function(topic, color) { + var commandFunc = function (topic, color) { var result = topic.getFontColor(); topic.setFontColor(color, true); return result; @@ -126,11 +126,11 @@ mindplot.StandaloneActionDispatcher = new Class({ this.execute(command); }, - changeBackgroundColorToTopic: function(topicsIds, color) { + changeBackgroundColorToTopic:function (topicsIds, color) { $assert(topicsIds, "topicIds can not be null"); $assert(color, "color can not be null"); - var commandFunc = function(topic, color) { + var commandFunc = function (topic, color) { var result = topic.getBackgroundColor(); topic.setBackgroundColor(color); return result; @@ -141,11 +141,11 @@ mindplot.StandaloneActionDispatcher = new Class({ this.execute(command); }, - changeBorderColorToTopic : function(topicsIds, color) { + changeBorderColorToTopic:function (topicsIds, color) { $assert(topicsIds, "topicIds can not be null"); $assert(color, "topicIds can not be null"); - var commandFunc = function(topic, color) { + var commandFunc = function (topic, color) { var result = topic.getBorderColor(); topic.setBorderColor(color); return result; @@ -156,11 +156,11 @@ mindplot.StandaloneActionDispatcher = new Class({ this.execute(command); }, - changeFontSizeToTopic : function(topicsIds, size) { + changeFontSizeToTopic:function (topicsIds, size) { $assert(topicsIds, "topicIds can not be null"); $assert(size, "size can not be null"); - var commandFunc = function(topic, size) { + var commandFunc = function (topic, size) { var result = topic.getFontSize(); topic.setFontSize(size, true); @@ -172,11 +172,11 @@ mindplot.StandaloneActionDispatcher = new Class({ this.execute(command); }, - changeShapeTypeToTopic : function(topicsIds, shapeType) { + changeShapeTypeToTopic:function (topicsIds, shapeType) { $assert(topicsIds, "topicsIds can not be null"); $assert(shapeType, "shapeType can not be null"); - var commandFunc = function(topic, shapeType) { + var commandFunc = function (topic, shapeType) { var result = topic.getShapeType(); topic.setShapeType(shapeType, true); return result; @@ -186,10 +186,10 @@ mindplot.StandaloneActionDispatcher = new Class({ this.execute(command); }, - changeFontWeightToTopic : function(topicsIds) { + changeFontWeightToTopic:function (topicsIds) { $assert(topicsIds, "topicsIds can not be null"); - var commandFunc = function(topic) { + var commandFunc = function (topic) { var result = topic.getFontWeight(); var weight = (result == "bold") ? "normal" : "bold"; topic.setFontWeight(weight, true); @@ -202,10 +202,10 @@ mindplot.StandaloneActionDispatcher = new Class({ this.execute(command); }, - shrinkBranch : function(topicsIds, collapse) { + shrinkBranch:function (topicsIds, collapse) { $assert(topicsIds, "topicsIds can not be null"); - var commandFunc = function(topic, isShrink) { + var commandFunc = function (topic, isShrink) { topic.setChildrenShrunken(isShrink); return !isShrink; }; @@ -214,22 +214,22 @@ mindplot.StandaloneActionDispatcher = new Class({ this.execute(command, false); }, - addFeatureToTopic : function(topicId, featureType, attributes) { + addFeatureToTopic:function (topicId, featureType, attributes) { var command = new mindplot.commands.AddFeatureToTopicCommand(topicId, featureType, attributes); this.execute(command); }, - changeFeatureToTopic : function(topicId, featureId, attributes) { + changeFeatureToTopic:function (topicId, featureId, attributes) { var command = new mindplot.commands.ChangeFeatureToTopicCommand(topicId, featureId, attributes); this.execute(command); }, - removeFeatureFromTopic : function(topicId, featureId) { + removeFeatureFromTopic:function (topicId, featureId) { var command = new mindplot.commands.RemoveFeatureFromTopicCommand(topicId, featureId); this.execute(command); }, - execute:function(command) { + execute:function (command) { this._actionRunner.execute(command); mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.DoLayout); } @@ -237,62 +237,64 @@ mindplot.StandaloneActionDispatcher = new Class({ }); mindplot.CommandContext = new Class({ - initialize: function(designer) { + initialize:function (designer) { $assert(designer, "designer can not be null"); this._designer = designer; }, - findTopics:function(topicsIds) { + findTopics:function (topicsIds) { $assert($defined(topicsIds), "topicsIds can not be null"); if (!(topicsIds instanceof Array)) { topicsIds = [topicsIds]; } var designerTopics = this._designer.getModel().getTopics(); - return designerTopics.filter(function(topic) { + return designerTopics.filter(function (topic) { return topicsIds.contains(topic.getId()); }); }, - deleteTopic:function(topic) { - this._designer._removeNode(topic); + deleteTopic:function (topic) { + this._designer._removeTopic(topic); }, - createTopic:function(model, isVisible) { + createTopic:function (model, isVisible) { $assert(model, "model can not be null"); return this._designer._nodeModelToNodeGraph(model, isVisible); }, - createModel:function() { + createModel:function () { var mindmap = this._designer.getMindmap(); return mindmap.createNode(mindplot.NodeModel.MAIN_TOPIC_TYPE); }, - connect:function(childTopic, parentTopic, isVisible) { + connect:function (childTopic, parentTopic, isVisible) { childTopic.connectTo(parentTopic, this._designer._workspace, isVisible); - } , + }, - disconnect:function(topic) { + disconnect:function (topic) { topic.disconnect(this._designer._workspace); }, - createRelationship:function(model) { + createRelationship:function (model) { $assert(model, "model cannot be null"); return this._designer.createRelationship(model); }, - removeRelationship:function(model) { - this._designer.removeRelationship(model); + + deleteRelationship:function (relationship) { + this._designer._deleteRelationship(relationship); }, - findRelationships:function(lineIds) { - var result = []; - lineIds.forEach(function(lineId) { - var line = this._designer.getModel().getRelationshipsById()[lineId]; - if ($defined(line)) { - result.push(line); - } - }.bind(this)); - return result; + findRelationships:function (relIds) { + $assert($defined(relIds), "relId can not be null"); + if (!(relIds instanceof Array)) { + relIds = [relIds]; + } + + var designerRel = this._designer.getModel().getRelationships(); + return designerRel.filter(function (rel) { + return relIds.contains(rel.getId()); + }); } }); diff --git a/mindplot/src/main/javascript/Topic.js b/mindplot/src/main/javascript/Topic.js index 2e6984b2..195b128e 100644 --- a/mindplot/src/main/javascript/Topic.js +++ b/mindplot/src/main/javascript/Topic.js @@ -315,7 +315,7 @@ mindplot.Topic = new Class({ this._relationships.push(relationship); }, - removeRelationship : function(relationship) { + deleteRelationship : function(relationship) { this._relationships.erase(relationship); }, diff --git a/mindplot/src/main/javascript/collaboration/framework/collab/model/NodeModel.js b/mindplot/src/main/javascript/collaboration/framework/collab/model/NodeModel.js index bac6c41e..e880d6be 100644 --- a/mindplot/src/main/javascript/collaboration/framework/collab/model/NodeModel.js +++ b/mindplot/src/main/javascript/collaboration/framework/collab/model/NodeModel.js @@ -76,7 +76,7 @@ mindplot.collaboration.framework.brix.model.NodeModel = new Class({ for (var i = 0; i < brixChildren.size(); i++) { var brixNodeModel = brixChildren.get(i); var cmodel = new mindplot.collaboration.framework.brix.model.NodeModel(this._brixFramework, brixNodeModel, this.getMindmap()); - actionDispatcher.deleteTopics([cmodel.getId()]); + actionDispatcher.deleteEntities([cmodel.getId()]); } } catch(e) { console.trace(); diff --git a/mindplot/src/main/javascript/commands/AddRelationshipCommand.js b/mindplot/src/main/javascript/commands/AddRelationshipCommand.js index 72825571..4b5cce71 100644 --- a/mindplot/src/main/javascript/commands/AddRelationshipCommand.js +++ b/mindplot/src/main/javascript/commands/AddRelationshipCommand.js @@ -32,7 +32,7 @@ mindplot.commands.AddRelationshipCommand = new Class({ relationship.setOnFocus(true); }, undoExecute: function(commandContext) { - var relationship = commandContext.removeRelationship(this._model); + var relationship = commandContext.deleteRelationship(this._model); // @Todo: Esto esta mal. Designer toca el mindmap ... // this._mindmap.removeRelationship(this._model); diff --git a/mindplot/src/main/javascript/commands/DeleteCommand.js b/mindplot/src/main/javascript/commands/DeleteCommand.js index 7e0c4a6f..57771d1d 100644 --- a/mindplot/src/main/javascript/commands/DeleteCommand.js +++ b/mindplot/src/main/javascript/commands/DeleteCommand.js @@ -18,7 +18,7 @@ mindplot.commands.DeleteCommand = new Class({ Extends:mindplot.Command, - initialize: function(topicIds, relIds) { + initialize:function (topicIds, relIds) { $assert($defined(topicIds), 'topicIds can not be null'); this.parent(); @@ -30,19 +30,20 @@ mindplot.commands.DeleteCommand = new Class({ this._id = mindplot.Command._nextUUID(); }, - execute: function(commandContext) { + execute:function (commandContext) { var topics = commandContext.findTopics(this._topicIds); if (topics.length > 0) { topics.forEach( - function(topic, index) { + function (topic, index) { var model = topic.getModel(); // Delete relationships var relationships = topic.getRelationships(); while (relationships.length > 0) { var relationship = relationships[0]; - this._deletedRelationships.push(relationship.getModel().clone()); - commandContext.removeRelationship(relationship.getModel()); + + this._deletedRelationships.push(relationship); + commandContext.deleteRelationship(relationship); } this._deletedTopicModels.push(model); @@ -61,24 +62,22 @@ mindplot.commands.DeleteCommand = new Class({ }.bind(this) ); } - var lines = commandContext.findRelationships(this._relIds); - if (lines.length > 0) { - lines.forEach(function(line, index) { - if (line.isInWorkspace()) { - this._deletedRelationships.push(line.getModel().clone()); - commandContext.removeRelationship(line.getModel()); - } + var rels = commandContext.findRelationships(this._relIds); + if (rels.length > 0) { + rels.forEach(function (rel) { + this._deletedRelationships.push(rel.getModel().clone()); + commandContext.deleteRelationship(rel); }.bind(this)); } }, - undoExecute: function(commandContext) { + undoExecute:function (commandContext) { var topics = commandContext.findTopics(this._topicIds); var parent = commandContext.findTopics(this._parentTopicIds); this._deletedTopicModels.forEach( - function(model, index) { + function (model, index) { var topic = commandContext.createTopic(model); // Was the topic connected? @@ -90,8 +89,8 @@ mindplot.commands.DeleteCommand = new Class({ }.bind(this) ); this._deletedRelationships.forEach( - function(relationship, index) { - commandContext.createRelationship(relationship); + function (rel) { + commandContext.createRelationship(rel); }.bind(this)); this._deletedTopicModels = []; diff --git a/mindplot/src/main/javascript/model/IMindmap.js b/mindplot/src/main/javascript/model/IMindmap.js index dc703a70..8b09c5fe 100644 --- a/mindplot/src/main/javascript/model/IMindmap.js +++ b/mindplot/src/main/javascript/model/IMindmap.js @@ -1,144 +1,144 @@ -/* - * Copyright [2011] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -mindplot.model.IMindmap = new Class({ - initialize : function() { - throw "Unsupported operation"; - }, - - getCentralTopic : function() { - return this.getBranches()[0]; - }, - - getDescription : function() { - throw "Unsupported operation"; - }, - - setDescription : function(value) { - throw "Unsupported operation"; - }, - - getId : function() { - throw "Unsupported operation"; - }, - - setId : function(id) { - throw "Unsupported operation"; - }, - - getVersion : function() { - throw "Unsupported operation"; - }, - - setVersion : function(version) { - throw "Unsupported operation"; - }, - - addBranch : function(nodeModel) { - throw "Unsupported operation"; - }, - - getBranches : function() { - throw "Unsupported operation"; - }, - - removeBranch : function(node) { - throw "Unsupported operation"; - }, - - getRelationships : function() { - throw "Unsupported operation"; - }, - - connect : function(parent, child) { - // Child already has a parent ? - $assert(!child.getParent(), 'Child model seems to be already connected'); - - // Connect node... - parent.appendChild(child); - - // Remove from the branch ... - this.removeBranch(child); - }, - - disconnect : function(child) { - var parent = child.getParent(); - $assert(child, 'Child can not be null.'); - $assert(parent, 'Child model seems to be already connected'); - - parent.removeChild(child); - this.addBranch(child); - }, - - hasAlreadyAdded : function(node) { - throw "Unsupported operation"; - }, - - createNode : function(type, id) { - throw "Unsupported operation"; - }, - - createRelationship : function(fromNode, toNode) { - throw "Unsupported operation"; - }, - - addRelationship : function(rel) { - throw "Unsupported operation"; - }, - - removeRelationship : function(relationship) { - throw "Unsupported operation"; - }, - - inspect : function() { - var result = ''; - result = '{ '; - - var branches = this.getBranches(); - result = result + "version:" + this.getVersion(); - result = result + " , ["; - - for (var i = 0; i < branches.length; i++) { - var node = branches[i]; - if (i != 0) { - result = result + ',\n '; - } - result = result + "(" + i + ") =>" + node.inspect(); - } - result = result + "]"; - - result = result + ' } '; - return result; - }, - - copyTo : function(target) { - var source = this; - var version = source.getVersion(); - target.setVersion(version); - - var desc = this.getDescription(); - target.setDescription(desc); - - // Then the rest of the branches ... - var sbranchs = source.getBranches(); - sbranchs.forEach(function(snode) { - var tnode = target.createNode(snode.getType(), snode.getId()); - snode.copyTo(tnode); - target.addBranch(tnode); - }); - } +/* + * Copyright [2011] [wisemapping] + * + * Licensed under WiseMapping Public License, Version 1.0 (the "License"). + * It is basically the Apache License, Version 2.0 (the "License") plus the + * "powered by wisemapping" text requirement on every single page; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the license at + * + * http://www.wisemapping.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +mindplot.model.IMindmap = new Class({ + initialize : function() { + throw "Unsupported operation"; + }, + + getCentralTopic : function() { + return this.getBranches()[0]; + }, + + getDescription : function() { + throw "Unsupported operation"; + }, + + setDescription : function(value) { + throw "Unsupported operation"; + }, + + getId : function() { + throw "Unsupported operation"; + }, + + setId : function(id) { + throw "Unsupported operation"; + }, + + getVersion : function() { + throw "Unsupported operation"; + }, + + setVersion : function(version) { + throw "Unsupported operation"; + }, + + addBranch : function(nodeModel) { + throw "Unsupported operation"; + }, + + getBranches : function() { + throw "Unsupported operation"; + }, + + removeBranch : function(node) { + throw "Unsupported operation"; + }, + + getRelationships : function() { + throw "Unsupported operation"; + }, + + connect : function(parent, child) { + // Child already has a parent ? + $assert(!child.getParent(), 'Child model seems to be already connected'); + + // Connect node... + parent.appendChild(child); + + // Remove from the branch ... + this.removeBranch(child); + }, + + disconnect : function(child) { + var parent = child.getParent(); + $assert(child, 'Child can not be null.'); + $assert(parent, 'Child model seems to be already connected'); + + parent.removeChild(child); + this.addBranch(child); + }, + + hasAlreadyAdded : function(node) { + throw "Unsupported operation"; + }, + + createNode : function(type, id) { + throw "Unsupported operation"; + }, + + createRelationship : function(fromNode, toNode) { + throw "Unsupported operation"; + }, + + addRelationship : function(rel) { + throw "Unsupported operation"; + }, + + deleteRelationship : function(relationship) { + throw "Unsupported operation"; + }, + + inspect : function() { + var result = ''; + result = '{ '; + + var branches = this.getBranches(); + result = result + "version:" + this.getVersion(); + result = result + " , ["; + + for (var i = 0; i < branches.length; i++) { + var node = branches[i]; + if (i != 0) { + result = result + ',\n '; + } + result = result + "(" + i + ") =>" + node.inspect(); + } + result = result + "]"; + + result = result + ' } '; + return result; + }, + + copyTo : function(target) { + var source = this; + var version = source.getVersion(); + target.setVersion(version); + + var desc = this.getDescription(); + target.setDescription(desc); + + // Then the rest of the branches ... + var sbranchs = source.getBranches(); + sbranchs.forEach(function(snode) { + var tnode = target.createNode(snode.getType(), snode.getId()); + snode.copyTo(tnode); + target.addBranch(tnode); + }); + } }); \ No newline at end of file diff --git a/mindplot/src/main/javascript/model/Mindmap.js b/mindplot/src/main/javascript/model/Mindmap.js index 99227896..983eb46f 100644 --- a/mindplot/src/main/javascript/model/Mindmap.js +++ b/mindplot/src/main/javascript/model/Mindmap.js @@ -106,7 +106,7 @@ mindplot.model.Mindmap = new Class({ this._relationships.push(relationship); }, - removeRelationship : function(relationship) { + deleteRelationship : function(relationship) { this._relationships.erase(relationship); } } diff --git a/mindplot/src/main/javascript/model/RelationshipModel.js b/mindplot/src/main/javascript/model/RelationshipModel.js index f0e6b85a..6f26f1a5 100644 --- a/mindplot/src/main/javascript/model/RelationshipModel.js +++ b/mindplot/src/main/javascript/model/RelationshipModel.js @@ -16,7 +16,17 @@ * limitations under the License. */ mindplot.model.RelationshipModel = new Class({ - initialize:function(sourceTopicId, targetTopicId) { + Static:{ + _nextUUID:function () { + if (!$defined(mindplot.model.RelationshipModel._uuid)) { + mindplot.model.RelationshipModel._uuid = 0; + } + mindplot.model.RelationshipModel._uuid = mindplot.model.RelationshipModel._uuid + 1; + return mindplot.model.RelationshipModel._uuid; + } + }, + + initialize:function (sourceTopicId, targetTopicId) { $assert($defined(sourceTopicId), 'from node type can not be null'); $assert($defined(targetTopicId), 'to node type can not be null'); @@ -30,59 +40,60 @@ mindplot.model.RelationshipModel = new Class({ this._startArrow = false; }, - getFromNode : function() { + getFromNode:function () { return this._sourceTargetId; }, - getToNode : function() { + getToNode:function () { return this._targetTopicId; }, - getId : function() { + getId:function () { + $assert(this._id, "id is null"); return this._id; }, - getLineType : function() { + getLineType:function () { return this._lineType; }, - setLineType : function(lineType) { + setLineType:function (lineType) { this._lineType = lineType; }, - getSrcCtrlPoint : function() { + getSrcCtrlPoint:function () { return this._srcCtrlPoint; }, - setSrcCtrlPoint : function(srcCtrlPoint) { + setSrcCtrlPoint:function (srcCtrlPoint) { this._srcCtrlPoint = srcCtrlPoint; }, - getDestCtrlPoint : function() { + getDestCtrlPoint:function () { return this._destCtrlPoint; }, - setDestCtrlPoint : function(destCtrlPoint) { + setDestCtrlPoint:function (destCtrlPoint) { this._destCtrlPoint = destCtrlPoint; }, - getEndArrow : function() { + getEndArrow:function () { return this._endArrow; }, - setEndArrow : function(endArrow) { + setEndArrow:function (endArrow) { this._endArrow = endArrow; }, - getStartArrow : function() { + getStartArrow:function () { return this._startArrow; }, - setStartArrow : function(startArrow) { + setStartArrow:function (startArrow) { this._startArrow = startArrow; }, - clone : function(model) { + clone:function (model) { var result = new mindplot.model.RelationshipModel(this._sourceTargetId, this._targetTopicId); result._id = this._id; result._lineType = this._lineType; @@ -93,21 +104,9 @@ mindplot.model.RelationshipModel = new Class({ return result; }, - inspect : function() { + inspect:function () { return '(fromNode:' + this.getFromNode().getId() + ' , toNode: ' + this.getToNode().getId() + ')'; } }); -/** - * @todo: This method must be implemented. - */ -mindplot.model.RelationshipModel._nextUUID = function() { - if (!$defined(this._uuid)) { - this._uuid = 0; - } - - this._uuid = this._uuid + 1; - return this._uuid; -} - diff --git a/mindplot/src/main/javascript/persistence/XMLSerializer_Pela.js b/mindplot/src/main/javascript/persistence/XMLSerializer_Pela.js index 77c187a8..d2b07e3f 100644 --- a/mindplot/src/main/javascript/persistence/XMLSerializer_Pela.js +++ b/mindplot/src/main/javascript/persistence/XMLSerializer_Pela.js @@ -176,24 +176,25 @@ mindplot.persistence.XMLSerializer_Pela = new Class({ }, _relationshipToXML : function(document, relationship) { - var relationDom = document.createElement("relationship"); - relationDom.setAttribute("srcTopicId", relationship.getFromNode()); - relationDom.setAttribute("destTopicId", relationship.getToNode()); + var result = document.createElement("relationship"); + result.setAttribute("srcTopicId", relationship.getFromNode()); + result.setAttribute("destTopicId", relationship.getToNode()); + var lineType = relationship.getLineType(); - relationDom.setAttribute("lineType", lineType); + result.setAttribute("lineType", lineType); if (lineType == mindplot.ConnectionLine.CURVED || lineType == mindplot.ConnectionLine.SIMPLE_CURVED) { if ($defined(relationship.getSrcCtrlPoint())) { var srcPoint = relationship.getSrcCtrlPoint(); - relationDom.setAttribute("srcCtrlPoint", Math.round(srcPoint.x) + "," + Math.round(srcPoint.y)); + result.setAttribute("srcCtrlPoint", Math.round(srcPoint.x) + "," + Math.round(srcPoint.y)); } if ($defined(relationship.getDestCtrlPoint())) { var destPoint = relationship.getDestCtrlPoint(); - relationDom.setAttribute("destCtrlPoint", Math.round(destPoint.x) + "," + Math.round(destPoint.y)); + result.setAttribute("destCtrlPoint", Math.round(destPoint.x) + "," + Math.round(destPoint.y)); } } - relationDom.setAttribute("endArrow", relationship.getEndArrow()); - relationDom.setAttribute("startArrow", relationship.getStartArrow()); - return relationDom; + result.setAttribute("endArrow", relationship.getEndArrow()); + result.setAttribute("startArrow", relationship.getStartArrow()); + return result; }, loadFromDom : function(dom, mapId) { diff --git a/mindplot/src/main/javascript/widget/Menu.js b/mindplot/src/main/javascript/widget/Menu.js index 9cb10c2e..df636b0e 100644 --- a/mindplot/src/main/javascript/widget/Menu.js +++ b/mindplot/src/main/javascript/widget/Menu.js @@ -258,7 +258,7 @@ mindplot.widget.Menu = new Class({ this._addButton('deleteTopic', true, true, function () { - designer.deleteCurrentNode(); + designer.deleteSelectedEntities(); }); this._registerTooltip('deleteTopic', $msg('TOPIC_DELETE'), "Delete"); @@ -446,7 +446,7 @@ mindplot.widget.Menu = new Class({ designer.addEvent('onblur', function () { var topics = designer.getModel().filterSelectedTopics(); - var rels = designer.getModel().filterSelectedRelations(); + var rels = designer.getModel().filterSelectedRelationships(); this._toolbarElems.forEach(function (button) { var disable = false; @@ -472,7 +472,7 @@ mindplot.widget.Menu = new Class({ designer.addEvent('onfocus', function () { var topics = designer.getModel().filterSelectedTopics(); - var rels = designer.getModel().filterSelectedRelations(); + var rels = designer.getModel().filterSelectedRelationships(); this._toolbarElems.forEach(function (button) { if (button.isTopicAction() && topics.length > 0) { diff --git a/mindplot/src/main/resources/messages_en.properties b/mindplot/src/main/resources/messages_en.properties index 9c23210e..ca497be2 100644 --- a/mindplot/src/main/resources/messages_en.properties +++ b/mindplot/src/main/resources/messages_en.properties @@ -43,3 +43,5 @@ SUB_TOPIC=Sub Topic ISOLATED_TOPIC=Isolated Topic CENTRAL_TOPIC=Central Topic SHORTCUTS=Keyboard Shortcuts +ENTITIES_COULD_NOT_BE_DELETED=Could not delete topic or relation. At least one map entity must be selected. +CENTRAL_TOPIC_CAN_NOT_BE_DELETED=Central topic can not be deleted. \ No newline at end of file diff --git a/wise-webapp/src/main/java/com/wisemapping/service/UserServiceImpl.java b/wise-webapp/src/main/java/com/wisemapping/service/UserServiceImpl.java index df30dd56..3444a77e 100755 --- a/wise-webapp/src/main/java/com/wisemapping/service/UserServiceImpl.java +++ b/wise-webapp/src/main/java/com/wisemapping/service/UserServiceImpl.java @@ -90,6 +90,9 @@ public class UserServiceImpl @Override public void auditLogin(@NotNull User user) { + if(user==null){ + throw new IllegalArgumentException("User can not be null"); + } final AccessAuditory accessAuditory = new AccessAuditory(); accessAuditory.setUser(user); accessAuditory.setLoginDate(Calendar.getInstance());