Add support for Images on nodes.

This commit is contained in:
Paulo Gustavo Veiga 2012-03-07 01:13:50 -03:00
parent bbfaabd75d
commit 24047e02bb
14 changed files with 143 additions and 96 deletions

View File

@ -145,7 +145,7 @@ core.Utils.setVisibilityAnimated = function(elems, isVisible, doneFn) {
}; };
core.Utils.setChildrenVisibilityAnimated = function(rootElem, isVisible) { core.Utils.setChildrenVisibilityAnimated = function(rootElem, isVisible) {
var children = core.Utils._addInnerChildrens(rootElem); var children = core.Utils.flattenTopicChildElements(rootElem);
core.Utils.animateVisibility(children, isVisible); core.Utils.animateVisibility(children, isVisible);
}; };
@ -153,21 +153,21 @@ core.Utils.animateVisibility = function (elems, isVisible, doneFn) {
var _fadeEffect = null; var _fadeEffect = null;
var _opacity = (isVisible ? 0 : 1); var _opacity = (isVisible ? 0 : 1);
if (isVisible) { if (isVisible) {
elems.forEach(function(child, index) { elems.forEach(function(child) {
if ($defined(child)) { if ($defined(child)) {
child.setOpacity(_opacity); child.setOpacity(_opacity);
child.setVisibility(isVisible); child.setVisibility(isVisible ? "visible" : "hidden");
} }
}); });
} }
var fadeEffect = function(index) { var fadeEffect = function() {
var step = 10; var step = 10;
if ((_opacity <= 0 && !isVisible) || (_opacity >= 1 && isVisible)) { if ((_opacity <= 0 && !isVisible) || (_opacity >= 1 && isVisible)) {
$clear(_fadeEffect); $clear(_fadeEffect);
_fadeEffect = null; _fadeEffect = null;
elems.forEach(function(child, index) { elems.forEach(function(child) {
if ($defined(child)) { if ($defined(child)) {
child.setVisibility(isVisible); child.setVisibility(isVisible ? "visible" : "hidden");
} }
}); });
@ -180,7 +180,7 @@ core.Utils.animateVisibility = function (elems, isVisible, doneFn) {
fix = -1; fix = -1;
} }
_opacity -= (1 / step) * fix; _opacity -= (1 / step) * fix;
elems.forEach(function(child, index) { elems.forEach(function(child) {
if ($defined(child)) { if ($defined(child)) {
child.setOpacity(_opacity); child.setOpacity(_opacity);
} }
@ -232,17 +232,21 @@ core.Utils.animatePosition = function (elems, doneFn, designer) {
_moveEffect = moveEffect.periodical(10); _moveEffect = moveEffect.periodical(10);
}; };
core.Utils._addInnerChildrens = function(elem) { core.Utils.flattenTopicChildElements = function(topic) {
var children = []; var result = [];
var childs = elem._getChildren();
for (var i = 0; i < childs.length; i++) { var children = topic.getChildren();
var child = childs[i]; for (var i = 0; i < children.length; i++) {
children.push(child);
children.push(child.getOutgoingLine()); var child = children[i];
result.push(child);
result.push(child.getOutgoingLine());
var relationships = child.getRelationships(); var relationships = child.getRelationships();
children = children.concat(relationships); result = result.concat(relationships);
var innerChilds = core.Utils._addInnerChildrens(child);
children = children.concat(innerChilds); var innerChilds = core.Utils.flattenTopicChildElements(child);
result = result.concat(innerChilds);
} }
return children; return result;
}; };

View File

@ -422,7 +422,7 @@ mindplot.Designer = new Class({
$assert(mindmapModel, "mindmapModel can not be null"); $assert(mindmapModel, "mindmapModel can not be null");
this._mindmap = mindmapModel; this._mindmap = mindmapModel;
try { // try {
// Init layout manager ... // Init layout manager ...
var size = {width:25,height:25}; var size = {width:25,height:25};
var layoutManager = new mindplot.layout.LayoutManager(mindmapModel.getCentralTopic().getId(), size); var layoutManager = new mindplot.layout.LayoutManager(mindmapModel.getCentralTopic().getId(), size);
@ -459,9 +459,9 @@ mindplot.Designer = new Class({
mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.DoLayout); mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.DoLayout);
this.fireEvent('loadSuccess'); this.fireEvent('loadSuccess');
} catch(e) { // } catch(e) {
this.fireEvent('loadError', e); // this.fireEvent('loadError', e);
} // }
}, },
getMindmap : function() { getMindmap : function() {
@ -595,8 +595,8 @@ mindplot.Designer = new Class({
node.disconnect(this._workspace); node.disconnect(this._workspace);
//remove children //remove children
while (node._getChildren().length > 0) { while (node.getChildren().length > 0) {
this._removeNode(node._getChildren()[0]); this._removeNode(node.getChildren()[0]);
} }
this._workspace.removeChild(node); this._workspace.removeChild(node);

View File

@ -243,7 +243,7 @@ mindplot.DesignerKeyboard = new Class({
}, },
_goToBrother : function(designer, node, direction) { _goToBrother : function(designer, node, direction) {
var brothers = node._parent._getChildren(); var brothers = node._parent.getChildren();
var target = node; var target = node;
var y = node.getPosition().y; var y = node.getPosition().y;
var x = node.getPosition().x; var x = node.getPosition().x;
@ -280,7 +280,7 @@ mindplot.DesignerKeyboard = new Class({
_goToSideChild : function(designer, node, side) { _goToSideChild : function(designer, node, side) {
var children = node._getChildren(); var children = node.getChildren();
if (children.length > 0) { if (children.length > 0) {
var target = children[0]; var target = children[0];
var top = null; var top = null;
@ -311,7 +311,7 @@ mindplot.DesignerKeyboard = new Class({
}, },
_goToChild : function(designer, node) { _goToChild : function(designer, node) {
var children = node._getChildren(); var children = node.getChildren();
if (children.length > 0) { if (children.length > 0) {
var target = children[0]; var target = children[0];
var top = target.getPosition().y; var top = target.getPosition().y;

View File

@ -81,8 +81,8 @@ mindplot.DragConnector = new Class({
var targetPosition = targetTopic.getPosition(); var targetPosition = targetTopic.getPosition();
var fix = position.y > targetPosition.y; var fix = position.y > targetPosition.y;
var gap = 0; var gap = 0;
if (targetTopic._getChildren().length > 0) { if (targetTopic.getChildren().length > 0) {
gap = Math.abs(targetPosition.y - targetTopic._getChildren()[0].getPosition().y) gap = Math.abs(targetPosition.y - targetTopic.getChildren()[0].getPosition().y)
} }
var yDistance = Math.abs(position.y - fix * gap - targetPosition.y); var yDistance = Math.abs(position.y - fix * gap - targetPosition.y);
if (distance == null || yDistance < distance) { if (distance == null || yDistance < distance) {

View File

@ -110,7 +110,7 @@ mindplot.DragTopic = new Class({
var targetTopicModel = targetTopic.getModel(); var targetTopicModel = targetTopic.getModel();
var childTopicModel = draggedNode.getModel(); var childTopicModel = draggedNode.getModel();
result = targetTopicModel.canBeConnected(childTopicModel, topicPosition, 18); result = targetTopicModel.canBeConnected(childTopicModel, topicPosition, 18, targetTopic.getSize());
} }
} else { } else {
result = false; result = false;

View File

@ -25,7 +25,7 @@ mindplot.MainTopic = new Class({
INNER_RECT_ATTRIBUTES : {stroke:'0.5 solid #009900'}, INNER_RECT_ATTRIBUTES : {stroke:'0.5 solid #009900'},
_buildDragShape : function() { _buildDragShape : function() {
var innerShape = this.buildShape(this.INNER_RECT_ATTRIBUTES); var innerShape = this._buildShape(this.INNER_RECT_ATTRIBUTES, this.getShapeType());
var size = this.getSize(); var size = this.getSize();
innerShape.setSize(size.width, size.height); innerShape.setSize(size.width, size.height);
innerShape.setPosition(0, 0); innerShape.setPosition(0, 0);
@ -45,12 +45,13 @@ mindplot.MainTopic = new Class({
group.appendChild(innerShape); group.appendChild(innerShape);
// Add Text ... // Add Text ...
var textShape = this._buildTextShape(true); if (this.getShapeType() != mindplot.model.TopicShape.IMAGE) {
var text = this.getText(); var textShape = this._buildTextShape(true);
textShape.setText(text); var text = this.getText();
textShape.setOpacity(0.5); textShape.setText(text);
group.appendChild(textShape); textShape.setOpacity(0.5);
group.appendChild(textShape);
}
return group; return group;
}, },

View File

@ -25,6 +25,7 @@ mindplot.NodeGraph = new Class({
this.setModel(nodeModel); this.setModel(nodeModel);
this._onFocus = false; this._onFocus = false;
this._event = new Events(); this._event = new Events();
this._size = {width:50,height:20};
}, },
getType : function() { getType : function() {
@ -73,11 +74,12 @@ mindplot.NodeGraph = new Class({
}, },
getSize : function() { getSize : function() {
return this._model.getSize(); return this._size;
}, },
setSize : function(size) { setSize : function(size) {
this._model.setSize(parseInt(size.width), parseInt(size.height)); this._size.width = parseInt(size.width);
this._size.height = parseInt(size.height);
}, },
getModel:function() { getModel:function() {

View File

@ -27,7 +27,7 @@ mindplot.Topic = new Class({
this._parent = null; this._parent = null;
this._relationships = []; this._relationships = [];
this._isInWorkspace = false; this._isInWorkspace = false;
this._buildShape(); this._buildTopicShape();
// Position a topic .... // Position a topic ....
var pos = model.getPosition(); var pos = model.getPosition();
@ -90,7 +90,7 @@ mindplot.Topic = new Class({
var innerShape = this.getInnerShape(); var innerShape = this.getInnerShape();
// Update figure size ... // Update figure size ...
var size = model.getSize(); var size = this.getSize();
this.setSize(size, true); this.setSize(size, true);
var group = this.get2DElement(); var group = this.get2DElement();
@ -134,7 +134,7 @@ mindplot.Topic = new Class({
getInnerShape : function() { getInnerShape : function() {
if (!$defined(this._innerShape)) { if (!$defined(this._innerShape)) {
// Create inner box. // Create inner box.
this._innerShape = this.buildShape(mindplot.Topic.INNER_RECT_ATTRIBUTES); this._innerShape = this._buildShape(mindplot.Topic.INNER_RECT_ATTRIBUTES, this.getShapeType());
// Update bgcolor ... // Update bgcolor ...
var bgColor = this.getBackgroundColor(); var bgColor = this.getBackgroundColor();
@ -155,24 +155,36 @@ mindplot.Topic = new Class({
return this._innerShape; return this._innerShape;
}, },
buildShape : function(attributes, type) { _buildShape : function(attributes, shapeType) {
var result; $assert(attributes, "attributes can not be null");
if (!$defined(type)) { $assert(shapeType, "shapeType can not be null");
type = this.getShapeType();
}
if (type == mindplot.model.TopicShape.RECTANGLE) { var result;
if (shapeType == mindplot.model.TopicShape.RECTANGLE) {
result = new web2d.Rect(0, attributes); result = new web2d.Rect(0, attributes);
}else if(type == mindplot.model.TopicShape.IMAGE){ } else if (shapeType == mindplot.model.TopicShape.IMAGE) {
throw "Must be implemented ..."; var model = this.getModel();
var url = model.getImageUrl();
var size = model.getImageSize();
result = new web2d.Image();
result.setHref(url);
result.setSize(size.width, size.height);
result.getSize = function() {
return model.getImageSize();
};
result.setPosition = function() {
};
} }
else if (type == mindplot.model.TopicShape.ELLIPSE) { else if (shapeType == mindplot.model.TopicShape.ELLIPSE) {
result = new web2d.Rect(0.9, attributes); result = new web2d.Rect(0.9, attributes);
} }
else if (type == mindplot.model.TopicShape.ROUNDED_RECT) { else if (shapeType == mindplot.model.TopicShape.ROUNDED_RECT) {
result = new web2d.Rect(0.3, attributes); result = new web2d.Rect(0.3, attributes);
} }
else if (type == mindplot.model.TopicShape.LINE) { else if (shapeType == mindplot.model.TopicShape.LINE) {
result = new web2d.Line({strokeColor:"#495879",strokeWidth:1}); result = new web2d.Line({strokeColor:"#495879",strokeWidth:1});
result.setSize = function(width, height) { result.setSize = function(width, height) {
this.size = {width:width, height:height}; this.size = {width:width, height:height};
@ -191,7 +203,6 @@ mindplot.Topic = new Class({
result.setPosition = function() { result.setPosition = function() {
}; };
var setStrokeFunction = result.setStroke;
result.setFill = function() { result.setFill = function() {
}; };
@ -201,7 +212,7 @@ mindplot.Topic = new Class({
}; };
} }
else { else {
$assert(false, "Unsupported figure type:" + type); $assert(false, "Unsupported figure shapeType:" + shapeType);
} }
result.setPosition(0, 0); result.setPosition(0, 0);
return result; return result;
@ -221,7 +232,7 @@ mindplot.Topic = new Class({
getOuterShape : function() { getOuterShape : function() {
if (!$defined(this._outerShape)) { if (!$defined(this._outerShape)) {
var rect = this.buildShape(mindplot.Topic.OUTER_SHAPE_ATTRIBUTES, mindplot.model.TopicShape.ROUNDED_RECT); var rect = this._buildShape(mindplot.Topic.OUTER_SHAPE_ATTRIBUTES, mindplot.model.TopicShape.ROUNDED_RECT);
rect.setPosition(-2, -3); rect.setPosition(-2, -3);
rect.setOpacity(0); rect.setOpacity(0);
this._outerShape = rect; this._outerShape = rect;
@ -238,6 +249,7 @@ mindplot.Topic = new Class({
var text = this.getText(); var text = this.getText();
this._setText(text, false); this._setText(text, false);
} }
return this._text; return this._text;
}, },
@ -533,7 +545,7 @@ mindplot.Topic = new Class({
return result; return result;
}, },
_buildShape : function() { _buildTopicShape : function() {
var groupAttributes = {width: 100, height:100,coordSizeWidth:100,coordSizeHeight:100}; var groupAttributes = {width: 100, height:100,coordSizeWidth:100,coordSizeHeight:100};
var group = new web2d.Group(groupAttributes); var group = new web2d.Group(groupAttributes);
this._set2DElement(group); this._set2DElement(group);
@ -761,7 +773,7 @@ mindplot.Topic = new Class({
getIncomingLines : function() { getIncomingLines : function() {
var result = []; var result = [];
var children = this._getChildren(); var children = this.getChildren();
for (var i = 0; i < children.length; i++) { for (var i = 0; i < children.length; i++) {
var node = children[i]; var node = children[i];
var line = node.getOutgoingLine(); var line = node.getOutgoingLine();
@ -868,8 +880,7 @@ mindplot.Topic = new Class({
} }
var textShape = this.getTextShape(); var textShape = this.getTextShape();
textShape.setVisibility(value); textShape.setVisibility(this.getShapeType() != mindplot.model.TopicShape.IMAGE ? value : false);
}, },
setOpacity : function(opacity) { setOpacity : function(opacity) {
@ -885,7 +896,7 @@ mindplot.Topic = new Class({
_setChildrenVisibility : function(isVisible) { _setChildrenVisibility : function(isVisible) {
// Hide all children. // Hide all children.
var children = this._getChildren(); var children = this.getChildren();
var model = this.getModel(); var model = this.getModel();
isVisible = isVisible ? !model.areChildrenShrunken() : isVisible; isVisible = isVisible ? !model.areChildrenShrunken() : isVisible;
@ -975,7 +986,7 @@ mindplot.Topic = new Class({
} }
// Hide connection line?. // Hide connection line?.
if (targetTopic._getChildren().length == 0) { if (targetTopic.getChildren().length == 0) {
var connector = targetTopic.getShrinkConnector(); var connector = targetTopic.getShrinkConnector();
connector.setVisibility(false); connector.setVisibility(false);
} }
@ -1009,8 +1020,9 @@ mindplot.Topic = new Class({
// Create a connection line ... // Create a connection line ...
var outgoingLine = new mindplot.ConnectionLine(this, targetTopic); var outgoingLine = new mindplot.ConnectionLine(this, targetTopic);
if ($defined(isVisible)) if ($defined(isVisible)) {
outgoingLine.setVisibility(isVisible); outgoingLine.setVisibility(isVisible);
}
this._outgoingLine = outgoingLine; this._outgoingLine = outgoingLine;
workspace.appendChild(outgoingLine); workspace.appendChild(outgoingLine);
@ -1044,16 +1056,16 @@ mindplot.Topic = new Class({
}, },
appendChild : function(child) { appendChild : function(child) {
var children = this._getChildren(); var children = this.getChildren();
children.push(child); children.push(child);
}, },
removeChild : function(child) { removeChild : function(child) {
var children = this._getChildren(); var children = this.getChildren();
children.erase(child); children.erase(child);
}, },
_getChildren : function() { getChildren : function() {
var result = this._children; var result = this._children;
if (!$defined(result)) { if (!$defined(result)) {
this._children = []; this._children = [];
@ -1111,34 +1123,42 @@ mindplot.Topic = new Class({
_adjustShapes : function() { _adjustShapes : function() {
if (this._isInWorkspace) { if (this._isInWorkspace) {
var textShape = this.getTextShape(); var textShape = this.getTextShape();
var textWidth = textShape.getWidth(); if (this.getShapeType() != mindplot.model.TopicShape.IMAGE) {
var textHeight = textShape.getHeight(); var textWidth = textShape.getWidth();
textHeight = textHeight != 0 ? textHeight : 20;
var topicPadding = this._getInnerPadding(); var textHeight = textShape.getHeight();
textHeight = textHeight != 0 ? textHeight : 20;
// Adjust the icon size to the size of the text ... var topicPadding = this._getInnerPadding();
var iconGroup = this.getOrBuildIconGroup();
var fontHeight = this.getTextShape().getFontHeight();
iconGroup.setPosition(topicPadding, topicPadding);
iconGroup.seIconSize(fontHeight, fontHeight);
// Add a extra padding between the text and the icons // Adjust the icon size to the size of the text ...
var iconsWidth = iconGroup.getSize().width; var iconGroup = this.getOrBuildIconGroup();
if (iconsWidth != 0) { var fontHeight = this.getTextShape().getFontHeight();
iconGroup.setPosition(topicPadding, topicPadding);
iconGroup.seIconSize(fontHeight, fontHeight);
iconsWidth = iconsWidth + (textHeight / 4); // Add a extra padding between the text and the icons
var iconsWidth = iconGroup.getSize().width;
if (iconsWidth != 0) {
iconsWidth = iconsWidth + (textHeight / 4);
}
var height = textHeight + (topicPadding * 2);
var width = textWidth + iconsWidth + (topicPadding * 2);
this.setSize({width:width,height:height});
// Position node ...
textShape.setPosition(topicPadding + iconsWidth, topicPadding);
} else {
// In case of images, the size if fixed ...
var size = this.getModel().getImageSize();
this.setSize(size);
} }
var height = textHeight + (topicPadding * 2);
var width = textWidth + iconsWidth + (topicPadding * 2);
this.setSize({width:width,height:height});
// Position node ...
textShape.setPosition(topicPadding + iconsWidth, topicPadding);
} }
} }

View File

@ -69,12 +69,12 @@ mindplot.model.INodeModel = new Class({
return result; return result;
}, },
setSize : function(width, height) { setImageSize : function(width, height) {
this.putProperty('size', '{width:' + width + ',height:' + height + '}'); this.putProperty('imageSize', '{width:' + width + ',height:' + height + '}');
}, },
getSize : function() { getImageSize : function() {
var value = this.getProperty('size'); var value = this.getProperty('imageSize');
var result = null; var result = null;
if (value != null) { if (value != null) {
result = eval("(" + value + ")"); result = eval("(" + value + ")");

View File

@ -27,7 +27,6 @@ mindplot.model.NodeModel = new Class({
this.setId(id); this.setId(id);
this.setType(type); this.setType(type);
this.areChildrenShrunken(false); this.areChildrenShrunken(false);
this.setSize(50, 20);
this._children = []; this._children = [];
this._feature = []; this._feature = [];
@ -123,10 +122,12 @@ mindplot.model.NodeModel = new Class({
this._parent = parent; this._parent = parent;
}, },
canBeConnected : function(sourceModel, sourcePosition, targetTopicHeight) { canBeConnected : function(sourceModel, sourcePosition, targetTopicHeight,targetTopicSize) {
$assert(sourceModel != this, 'The same node can not be parent and child if itself.'); $assert(sourceModel != this, 'The same node can not be parent and child if itself.');
$assert(sourcePosition, 'childPosition can not be null.'); $assert(sourcePosition, 'childPosition can not be null.');
$assert(targetTopicHeight, 'childrenWidth can not be null.'); $assert(targetTopicHeight, 'childrenWidth can not be null.');
$assert(targetTopicSize, 'targetTopicSize can not be null.');
// Only can be connected if the node is in the left or rigth. // Only can be connected if the node is in the left or rigth.
var targetModel = this; var targetModel = this;
@ -135,8 +136,7 @@ mindplot.model.NodeModel = new Class({
var result = false; var result = false;
if (sourceModel.getType() == mindplot.model.INodeModel.MAIN_TOPIC_TYPE) { if (sourceModel.getType() == mindplot.model.INodeModel.MAIN_TOPIC_TYPE) {
// Finally, check current node ubication. // Finally, check current node position ...
var targetTopicSize = targetModel.getSize();
var yDistance = Math.abs(sourcePosition.y - targetPosition.y); var yDistance = Math.abs(sourcePosition.y - targetPosition.y);
var gap = 35 + targetTopicHeight / 2; var gap = 35 + targetTopicHeight / 2;
if (targetModel.getChildren().length > 0) { if (targetModel.getChildren().length > 0) {

View File

@ -80,6 +80,11 @@ mindplot.persistence.XMLSerializer_Pela = new Class({
var shape = topic.getShapeType(); var shape = topic.getShapeType();
if ($defined(shape)) { if ($defined(shape)) {
parentTopic.setAttribute('shape', shape); parentTopic.setAttribute('shape', shape);
if (shape == mindplot.model.TopicShape.IMAGE) {
parentTopic.setAttribute('image', topic.getImageSize().width + "," + topic.getImageSize().height + ":" + topic.getImageUrl());
}
} }
if (topic.areChildrenShrunken()) { if (topic.areChildrenShrunken()) {
@ -242,9 +247,20 @@ mindplot.persistence.XMLSerializer_Pela = new Class({
if ($defined(text)) { if ($defined(text)) {
topic.setText(text); topic.setText(text);
} }
var shape = domElem.getAttribute('shape'); var shape = domElem.getAttribute('shape');
if ($defined(shape)) { if ($defined(shape)) {
topic.setShapeType(shape); topic.setShapeType(shape);
if (shape == mindplot.model.TopicShape.IMAGE) {
var image = domElem.getAttribute('image');
var size = image.substring(0, image.indexOf(':'));
var url = image.substring(image.indexOf(':') + 1, image.length);
topic.setImageUrl(url);
var split = size.split(',');
topic.setImageSize(split[0], split[1]);
}
} }
var fontStyle = domElem.getAttribute('fontStyle'); var fontStyle = domElem.getAttribute('fontStyle');

View File

@ -23,6 +23,7 @@ web2d.peer.svg.ImagePeer = new Class({
this.parent(svgElement); this.parent(svgElement);
this._position = {x:0,y:0}; this._position = {x:0,y:0};
this._href = ""; this._href = "";
this._native.setAttribute("preserveAspectRatio", "none");
}, },
setPosition : function(x, y) { setPosition : function(x, y) {

View File

@ -42,6 +42,8 @@
<topic position="410,-97" order="2" text="Anyplace, Anytime" id="9"/> <topic position="410,-97" order="2" text="Anyplace, Anytime" id="9"/>
<topic position="386,-73" order="3" text="Free!!!" id="10"/> <topic position="386,-73" order="3" text="Free!!!" id="10"/>
</topic> </topic>
<topic type="media" size="50,50" image="http://m3.licdn.com/mpr/mpr/shrink_100_100/p/3/000/070/205/1461ef2.jpg" prop="" order="9" position="-336,-100"/> <topic shape="image"
image="163,80:images/logo-medium.png"
prop="" order="9" position="-336,-100"/>
</topic> </topic>
</map> </map>

View File

@ -442,6 +442,7 @@
<plugin> <plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId> <groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId> <artifactId>maven-jaxb2-plugin</artifactId>
<version>0.8.1</version>
<executions> <executions>
<execution> <execution>
<id>mindmap-generate</id> <id>mindmap-generate</id>