mirror of
https://bitbucket.org/wisemapping/wisemapping-open-source.git
synced 2024-11-26 07:44:56 +01:00
Merge branch 'master' of repo.wisemapping.org:wisemapping/wiseorg
This commit is contained in:
commit
42148c0d2e
@ -5,7 +5,7 @@
|
||||
The following products must be installed:
|
||||
|
||||
* Java Development Kit 6 or higher (http://java.sun.com/javase/downloads/index.jsp)
|
||||
* Maven 2.2.1 or higher (http://maven.apache.org/)
|
||||
* Maven 3.x or higher (http://maven.apache.org/)
|
||||
|
||||
## Compiling
|
||||
|
||||
@ -14,13 +14,14 @@ WiseMapping uses Maven as packaging and project management. The project is compo
|
||||
* core-js: Utilities JavaScript libraries
|
||||
* web2d: JavaScript 2D VML/SVG abstraction library used by the mind map editor
|
||||
* mindplot: JavaScript mind map designer core
|
||||
* wise-editor: Mindmap Editor standalone distribution
|
||||
* wise-webapp: J2EE web application
|
||||
|
||||
Full compilation of the project can be done executing within <project-dir>:
|
||||
|
||||
`mvn install`
|
||||
`mvn package`
|
||||
|
||||
Once this command is execute, the file <project-dir>/wise-webapp/target/wisemapping.war will be generated.
|
||||
Once this command is execute, the file <project-dir>/wise-webapp/target/wisemapping*.war will be generated.
|
||||
|
||||
## Testing
|
||||
The previously generated war can be deployed locally executing within the directory <project-dir>/wise-webapp the following command:
|
||||
@ -30,5 +31,4 @@ The previously generated war can be deployed locally executing within the direct
|
||||
This will start the application on the URL: http://localhost:8080/wise-webapp/. Additionally, a file based database is automatically populated with a test user.
|
||||
|
||||
User: test@wisemapping.org
|
||||
|
||||
Password: test
|
11
Faq.textile
11
Faq.textile
@ -1,11 +0,0 @@
|
||||
h1. FAQ
|
||||
|
||||
h2. Which technology is being used to render the mind maps?
|
||||
|
||||
We use SVG for Firefox and Safari, and VML for IE and Opera.
|
||||
|
||||
SVG (Scalable Vectorial Graphics) allows straightforward and efficient vector graphics animation and VML (Vector Markup Language) supports the markup of vector graphic information in the same way that HTML supports the markup of textual information.
|
||||
|
||||
h2. What's the source code License?
|
||||
|
||||
http://www.wisemapping.org/license
|
@ -16,7 +16,7 @@ The following products must be installed:
|
||||
|
||||
WiseMapping uses Maven as packaging and project management. The project is composed of 4 maven sub-modules:
|
||||
* core-js: Utilities JavaScript libraries
|
||||
* web2d: JavaScript 2D VML/SVG abstraction library used by the mind map editor
|
||||
* web2d: JavaScript 2D SVG abstraction library used by the mind map editor
|
||||
* mindplot: JavaScript mind map designer core
|
||||
* wise-webapp: J2EE web application
|
||||
|
||||
|
@ -139,110 +139,3 @@ core.Utils.calculateDefaultControlPoints = function(srcPos, tarPos) {
|
||||
|
||||
return [new core.Point(-srcPos.x + x1, -srcPos.y + y1),new core.Point(-tarPos.x + x2, -tarPos.y + y2)];
|
||||
};
|
||||
|
||||
core.Utils.setVisibilityAnimated = function(elems, isVisible, doneFn) {
|
||||
core.Utils.animateVisibility(elems, isVisible, doneFn);
|
||||
};
|
||||
|
||||
core.Utils.setChildrenVisibilityAnimated = function(rootElem, isVisible) {
|
||||
var children = core.Utils._addInnerChildrens(rootElem);
|
||||
core.Utils.animateVisibility(children, isVisible);
|
||||
};
|
||||
|
||||
core.Utils.animateVisibility = function (elems, isVisible, doneFn) {
|
||||
var _fadeEffect = null;
|
||||
var _opacity = (isVisible ? 0 : 1);
|
||||
if (isVisible) {
|
||||
elems.forEach(function(child, index) {
|
||||
if ($defined(child)) {
|
||||
child.setOpacity(_opacity);
|
||||
child.setVisibility(isVisible);
|
||||
}
|
||||
});
|
||||
}
|
||||
var fadeEffect = function(index) {
|
||||
var step = 10;
|
||||
if ((_opacity <= 0 && !isVisible) || (_opacity >= 1 && isVisible)) {
|
||||
$clear(_fadeEffect);
|
||||
_fadeEffect = null;
|
||||
elems.forEach(function(child, index) {
|
||||
if ($defined(child)) {
|
||||
child.setVisibility(isVisible);
|
||||
}
|
||||
|
||||
});
|
||||
if ($defined(doneFn))
|
||||
doneFn.attempt();
|
||||
}
|
||||
else {
|
||||
var fix = 1;
|
||||
if (isVisible) {
|
||||
fix = -1;
|
||||
}
|
||||
_opacity -= (1 / step) * fix;
|
||||
elems.forEach(function(child, index) {
|
||||
if ($defined(child)) {
|
||||
child.setOpacity(_opacity);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
};
|
||||
_fadeEffect = fadeEffect.periodical(10);
|
||||
};
|
||||
|
||||
core.Utils.animatePosition = function (elems, doneFn, designer) {
|
||||
var _moveEffect = null;
|
||||
var i = 10;
|
||||
var step = 10;
|
||||
var moveEffect = function () {
|
||||
if (i > 0) {
|
||||
var keys = elems.keys();
|
||||
for (var j = 0; j < keys.length; j++) {
|
||||
var id = keys[j];
|
||||
var mod = elems.get(id);
|
||||
var allTopics = designer.getModel().getTopics();
|
||||
var currentTopic = allTopics.filter(function(node) {
|
||||
return node.getId() == id;
|
||||
})[0];
|
||||
var xStep = (mod.originalPos.x - mod.newPos.x) / step;
|
||||
var yStep = (mod.originalPos.y - mod.newPos.y) / step;
|
||||
var newPos = currentTopic.getPosition().clone();
|
||||
newPos.x += xStep;
|
||||
newPos.y += yStep;
|
||||
currentTopic.setPosition(newPos, false);
|
||||
}
|
||||
} else {
|
||||
$clear(_moveEffect);
|
||||
var keys = elems.keys();
|
||||
for (var j = 0; j < keys.length; j++) {
|
||||
var id = keys[j];
|
||||
var mod = elems.get(id);
|
||||
var allTopics = designer.getModel().getTopics();
|
||||
var currentTopic = allTopics.filter(function(node) {
|
||||
return node.getId() == id;
|
||||
})[0];
|
||||
currentTopic.setPosition(mod.originalPos, false);
|
||||
}
|
||||
if ($defined(doneFn))
|
||||
doneFn.attempt();
|
||||
}
|
||||
i--;
|
||||
};
|
||||
_moveEffect = moveEffect.periodical(10);
|
||||
};
|
||||
|
||||
core.Utils._addInnerChildrens = function(elem) {
|
||||
var children = [];
|
||||
var childs = elem._getChildren();
|
||||
for (var i = 0; i < childs.length; i++) {
|
||||
var child = childs[i];
|
||||
children.push(child);
|
||||
children.push(child.getOutgoingLine());
|
||||
var relationships = child.getRelationships();
|
||||
children = children.concat(relationships);
|
||||
var innerChilds = core.Utils._addInnerChildrens(child);
|
||||
children = children.concat(innerChilds);
|
||||
}
|
||||
return children;
|
||||
};
|
@ -51,7 +51,7 @@
|
||||
<mkdir dir="${basedir}/target/classes"/>
|
||||
<concat destfile="${basedir}/target/tmp/mindplot.js" append="false">
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="header.js"/>
|
||||
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="TopicEditor.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="model/IMindmap.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="model/Mindmap.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="model/INodeModel.js"/>
|
||||
@ -81,20 +81,23 @@
|
||||
<!--<filelist dir="${basedir}/src/main/javascript/" files="RichTextEditor.js"/>-->
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="TextEditorFactory.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="util/Shape.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="ModelCodeName.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="util/FadeEffect.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/"
|
||||
files="XMLMindmapSerializer_Pela.js"/>
|
||||
files="persistence/ModelCodeName.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/"
|
||||
files="XMLMindmapSerializer_Tango.js"/>
|
||||
files="persistence/XMLSerializer_Pela.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/"
|
||||
files="Pela2TangoMigrator.js"/>
|
||||
files="persistence/XMLSerializer_Tango.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/"
|
||||
files="XMLMindmapSerializer_Beta.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="Beta2PelaMigrator.js"/>
|
||||
files="persistence/Pela2TangoMigrator.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/"
|
||||
files="XMLMindmapSerializerFactory.js"/>
|
||||
files="persistence/XMLSerializer_Beta.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/"
|
||||
files="persistence/Beta2PelaMigrator.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/"
|
||||
files="persistence/XMLSerializerFactory.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="PersistenceManager.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="DwrPersistenceManager.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="RestPersistenceManager.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="LocalStorageManager.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="EditorProperties.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="IconGroup.js"/>
|
||||
@ -104,6 +107,7 @@
|
||||
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="ActionIcon.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="ImageIcon.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="model/FeatureModel.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="model/IconModel.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="model/LinkModel.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="model/NoteModel.js"/>
|
||||
@ -113,7 +117,7 @@
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="ControlPoint.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="EditorOptions.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="RelationshipPivot.js"/>
|
||||
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="TopicFeature.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/commands/"
|
||||
files="GenericFunctionCommand.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/commands/" files="DeleteCommand.js"/>
|
||||
@ -122,17 +126,11 @@
|
||||
<filelist dir="${basedir}/src/main/javascript/commands/"
|
||||
files="AddTopicCommand.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/"
|
||||
files="commands/ChangeLinkToTopicCommand.js"/>
|
||||
files="commands/ChangeFeatureToTopicCommand.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/"
|
||||
files="commands/RemoveLinkFromTopicCommand.js"/>
|
||||
files="commands/RemoveFeatureFromTopicCommand.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/"
|
||||
files="commands/AddIconToTopicCommand.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/"
|
||||
files="commands/RemoveIconFromTopicCommand.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/"
|
||||
files="commands/ChangeNoteToTopicCommand.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/"
|
||||
files="commands/RemoveNoteFromTopicCommand.js"/>
|
||||
files="commands/AddFeatureToTopicCommand.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/"
|
||||
files="commands/AddRelationshipCommand.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/"
|
||||
@ -166,6 +164,7 @@
|
||||
files="widget/IMenu.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/"
|
||||
files="widget/Menu.js"/>
|
||||
<filelist dir="${basedir}/src/main/javascript/" files="TopicFeature.js"/>
|
||||
|
||||
<filelist dir="${basedir}/src/main/javascript/"
|
||||
files="layout/EventBusDispatcher.js"/>
|
||||
@ -245,23 +244,7 @@
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<!-- <plugin>
|
||||
<groupId>com.google.jstestdriver</groupId>
|
||||
<artifactId>maven-jstestdriver-plugin</artifactId>
|
||||
<version>1.2.2-SNAPSHOT</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>run-tests</id>
|
||||
<phase>test</phase>
|
||||
<goals>
|
||||
<goal>test</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<config>${basedir}/src/test/jsTestDriver.conf</config>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin> -->
|
||||
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
|
@ -23,18 +23,6 @@ mindplot.ActionDispatcher = new Class({
|
||||
$assert(commandContext, "commandContext can not be null");
|
||||
},
|
||||
|
||||
addIconToTopic: function(topicId, iconType) {
|
||||
throw "method must be implemented.";
|
||||
},
|
||||
|
||||
changeLinkToTopic: function(topicId, url) {
|
||||
throw "method must be implemented.";
|
||||
},
|
||||
|
||||
changeNoteToTopic: function(topicId, text) {
|
||||
throw "method must be implemented.";
|
||||
},
|
||||
|
||||
connectByRelation: function(model, mindmap) {
|
||||
throw "method must be implemented.";
|
||||
},
|
||||
@ -59,18 +47,6 @@ mindplot.ActionDispatcher = new Class({
|
||||
throw "method must be implemented.";
|
||||
},
|
||||
|
||||
removeIconFromTopic: function(topicId, iconModel) {
|
||||
throw "method must be implemented.";
|
||||
},
|
||||
|
||||
removeLinkFromTopic: function(topicId) {
|
||||
throw "method must be implemented.";
|
||||
},
|
||||
|
||||
removeNoteFromTopic: function(topicId) {
|
||||
throw "method must be implemented.";
|
||||
},
|
||||
|
||||
changeFontFamilyToTopic: function(topicIds, fontFamily) {
|
||||
throw "method must be implemented.";
|
||||
},
|
||||
@ -109,9 +85,19 @@ mindplot.ActionDispatcher = new Class({
|
||||
|
||||
shrinkBranch : function(topicsIds, collapse) {
|
||||
throw "method must be implemented.";
|
||||
},
|
||||
|
||||
addFeatureToTopic : function(topicId, type, attributes) {
|
||||
throw "method must be implemented.";
|
||||
},
|
||||
|
||||
changeFeatureToTopic : function(topicId, featureId, attributes) {
|
||||
throw "method must be implemented.";
|
||||
},
|
||||
|
||||
removeFeatureFromTopic : function(topicId, featureId) {
|
||||
throw "method must be implemented.";
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
mindplot.ActionDispatcher.setInstance = function(dispatcher) {
|
||||
|
@ -55,7 +55,7 @@ mindplot.CentralTopic = new Class({
|
||||
|
||||
|
||||
_defaultShapeType : function() {
|
||||
return mindplot.model.INodeModel.SHAPE_TYPE_ROUNDED_RECT;
|
||||
return mindplot.model.TopicShape.ROUNDED_RECT;
|
||||
},
|
||||
|
||||
|
||||
@ -90,5 +90,9 @@ mindplot.CentralTopic = new Class({
|
||||
weight:"bold",
|
||||
color:"#ffffff"
|
||||
};
|
||||
},
|
||||
|
||||
getShrinkConnector : function() {
|
||||
return null;
|
||||
}
|
||||
});
|
@ -34,7 +34,7 @@ mindplot.BrixActionDispatcher = new Class({
|
||||
// Set position ...
|
||||
node.setPosition(position);
|
||||
} else {
|
||||
$assert("Illegal commnad state exception.");
|
||||
$assert("Illegal commnand state exception.");
|
||||
}
|
||||
// Finally, connect node ...
|
||||
if ($defined(this._parentId)) {
|
@ -22,14 +22,17 @@ mindplot.Command = new Class(
|
||||
{
|
||||
this._id = mindplot.Command._nextUUID();
|
||||
},
|
||||
|
||||
execute: function(commandContext)
|
||||
{
|
||||
throw "execute must be implemented.";
|
||||
},
|
||||
|
||||
undoExecute: function(commandContext)
|
||||
{
|
||||
throw "undo must be implemented.";
|
||||
},
|
||||
|
||||
getId:function()
|
||||
{
|
||||
return this._id;
|
||||
|
@ -123,7 +123,7 @@ mindplot.ConnectionLine = new Class({
|
||||
var offset = mindplot.Topic.CONNECTOR_WIDTH / 2;
|
||||
var targetTopicSize = targetTopic.getSize();
|
||||
var y;
|
||||
if (targetTopic.getShapeType() == mindplot.model.INodeModel.SHAPE_TYPE_LINE) {
|
||||
if (targetTopic.getShapeType() == mindplot.model.TopicShape.LINE) {
|
||||
y = targetTopicSize.height;
|
||||
} else {
|
||||
y = targetTopicSize.height / 2;
|
||||
@ -131,6 +131,7 @@ mindplot.ConnectionLine = new Class({
|
||||
y = y - offset;
|
||||
|
||||
var connector = targetTopic.getShrinkConnector();
|
||||
if ($defined(connector)) {
|
||||
if (Math.sign(targetPosition.x) > 0) {
|
||||
var x = targetTopicSize.width;
|
||||
connector.setPosition(x, y);
|
||||
@ -139,6 +140,7 @@ mindplot.ConnectionLine = new Class({
|
||||
var x = -mindplot.Topic.CONNECTOR_WIDTH;
|
||||
connector.setPosition(x, y);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
setStroke : function(color, style, opacity) {
|
||||
|
@ -61,6 +61,7 @@ mindplot.Designer = new Class({
|
||||
// Set editor working area ...
|
||||
this.setViewPort(options.viewPort);
|
||||
|
||||
mindplot.TopicEditor.configure();
|
||||
},
|
||||
|
||||
_registerEvents : function() {
|
||||
@ -160,6 +161,7 @@ mindplot.Designer = new Class({
|
||||
this._workspace.setZoom(model.getZoom(), true);
|
||||
},
|
||||
|
||||
|
||||
_buildNodeGraph : function(model, readOnly) {
|
||||
var workspace = this._workspace;
|
||||
|
||||
@ -340,6 +342,30 @@ mindplot.Designer = new Class({
|
||||
return childModel;
|
||||
},
|
||||
|
||||
addDraggedNode: function(event, options) {
|
||||
$assert(event, "event can not be null");
|
||||
$assert(options, "option can not be null");
|
||||
|
||||
// Create a new node ...
|
||||
var mindmap = this.getMindmap();
|
||||
var model = mindmap.createNode(mindplot.model.INodeModel.MAIN_TOPIC_TYPE);
|
||||
model.setShapeType(mindplot.model.TopicShape.IMAGE);
|
||||
|
||||
// Set node specified options ...
|
||||
model.setImageUrl(options.imageUrl);
|
||||
model.setImageSize(options.imageWidth, options.imageHeight);
|
||||
model.setMetadata(options.metadata);
|
||||
|
||||
// Position far from the visual area ...
|
||||
model.setPosition(1000, 1000);
|
||||
|
||||
this._actionDispatcher.addTopic(model, null, false);
|
||||
var topic = this.getModel().findTopicById(model.getId());
|
||||
|
||||
// Simulate a mouse down event to start the dragging ...
|
||||
topic.fireEvent("mousedown", event);
|
||||
},
|
||||
|
||||
createSiblingForSelectedNode : function() {
|
||||
var nodes = this.getModel().filterSelectedTopics();
|
||||
if (nodes.length <= 0) {
|
||||
@ -422,7 +448,7 @@ mindplot.Designer = new Class({
|
||||
$assert(mindmapModel, "mindmapModel can not be null");
|
||||
this._mindmap = mindmapModel;
|
||||
|
||||
try {
|
||||
// try {
|
||||
// Init layout manager ...
|
||||
var size = {width:25,height:25};
|
||||
var layoutManager = new mindplot.layout.LayoutManager(mindmapModel.getCentralTopic().getId(), size);
|
||||
@ -446,7 +472,6 @@ mindplot.Designer = new Class({
|
||||
nodeGraph.setBranchVisibility(true);
|
||||
}
|
||||
|
||||
|
||||
var relationships = mindmapModel.getRelationships();
|
||||
for (var j = 0; j < relationships.length; j++) {
|
||||
this._relationshipModelToRelationship(relationships[j]);
|
||||
@ -460,9 +485,9 @@ mindplot.Designer = new Class({
|
||||
mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.DoLayout);
|
||||
|
||||
this.fireEvent('loadSuccess');
|
||||
} catch(e) {
|
||||
this.fireEvent('loadError',e);
|
||||
}
|
||||
// } catch(e) {
|
||||
// this.fireEvent('loadError', e);
|
||||
// }
|
||||
},
|
||||
|
||||
getMindmap : function() {
|
||||
@ -596,8 +621,8 @@ mindplot.Designer = new Class({
|
||||
node.disconnect(this._workspace);
|
||||
|
||||
//remove children
|
||||
while (node._getChildren().length > 0) {
|
||||
this._removeNode(node._getChildren()[0]);
|
||||
while (node.getChildren().length > 0) {
|
||||
this._removeNode(node.getChildren()[0]);
|
||||
}
|
||||
|
||||
this._workspace.removeChild(node);
|
||||
@ -657,7 +682,7 @@ mindplot.Designer = new Class({
|
||||
changeBackgroundColor : function(color) {
|
||||
|
||||
var validateFunc = function(topic) {
|
||||
return topic.getShapeType() != mindplot.model.INodeModel.SHAPE_TYPE_LINE
|
||||
return topic.getShapeType() != mindplot.model.TopicShape.LINE;
|
||||
};
|
||||
var validateError = 'Color can not be set to line topics.';
|
||||
|
||||
@ -669,7 +694,7 @@ mindplot.Designer = new Class({
|
||||
|
||||
changeBorderColor : function(color) {
|
||||
var validateFunc = function(topic) {
|
||||
return topic.getShapeType() != mindplot.model.INodeModel.SHAPE_TYPE_LINE
|
||||
return topic.getShapeType() != mindplot.model.TopicShape.LINE;
|
||||
};
|
||||
var validateError = 'Color can not be set to line topics.';
|
||||
var topicsIds = this.getModel().filterTopicsIds(validateFunc, validateError);
|
||||
@ -687,7 +712,7 @@ mindplot.Designer = new Class({
|
||||
|
||||
changeTopicShape : function(shape) {
|
||||
var validateFunc = function(topic) {
|
||||
return !(topic.getType() == mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE && shape == mindplot.model.INodeModel.SHAPE_TYPE_LINE)
|
||||
return !(topic.getType() == mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE && shape == mindplot.model.TopicShape.LINE)
|
||||
};
|
||||
|
||||
var validateError = 'Central Topic shape can not be changed to line figure.';
|
||||
@ -707,7 +732,7 @@ mindplot.Designer = new Class({
|
||||
addIconType : function(iconType) {
|
||||
var topicsIds = this.getModel().filterTopicsIds();
|
||||
if (topicsIds.length > 0) {
|
||||
this._actionDispatcher.addIconToTopic(topicsIds[0], iconType);
|
||||
this._actionDispatcher.addFeatureToTopic(topicsIds[0], mindplot.TopicFeature.Icon.id, {id:iconType});
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -201,7 +201,7 @@ mindplot.DesignerKeyboard = new Class({
|
||||
|
||||
var regex = /^(?:shift|control|ctrl|alt|meta)$/;
|
||||
var modifiers = ['shift', 'control', 'alt', 'meta'];
|
||||
var excludes = ['esc','capslock','tab','f1','f3','f4','f5','f6','f7','f8','f9','f10','f11','f12','backspace','down','up','left','right'];
|
||||
var excludes = ['esc','capslock','tab','f1','f3','f4','f5','f6','f7','f8','f9','f10','f11','f12','backspace','down','up','left','right','control'];
|
||||
|
||||
$(document).addEvent('keydown', function(event) {
|
||||
|
||||
@ -243,7 +243,7 @@ mindplot.DesignerKeyboard = new Class({
|
||||
},
|
||||
|
||||
_goToBrother : function(designer, node, direction) {
|
||||
var brothers = node._parent._getChildren();
|
||||
var brothers = node._parent.getChildren();
|
||||
var target = node;
|
||||
var y = node.getPosition().y;
|
||||
var x = node.getPosition().x;
|
||||
@ -280,7 +280,7 @@ mindplot.DesignerKeyboard = new Class({
|
||||
|
||||
|
||||
_goToSideChild : function(designer, node, side) {
|
||||
var children = node._getChildren();
|
||||
var children = node.getChildren();
|
||||
if (children.length > 0) {
|
||||
var target = children[0];
|
||||
var top = null;
|
||||
@ -311,7 +311,7 @@ mindplot.DesignerKeyboard = new Class({
|
||||
},
|
||||
|
||||
_goToChild : function(designer, node) {
|
||||
var children = node._getChildren();
|
||||
var children = node.getChildren();
|
||||
if (children.length > 0) {
|
||||
var target = children[0];
|
||||
var top = target.getPosition().y;
|
||||
|
@ -81,8 +81,8 @@ mindplot.DragConnector = new Class({
|
||||
var targetPosition = targetTopic.getPosition();
|
||||
var fix = position.y > targetPosition.y;
|
||||
var gap = 0;
|
||||
if (targetTopic._getChildren().length > 0) {
|
||||
gap = Math.abs(targetPosition.y - targetTopic._getChildren()[0].getPosition().y)
|
||||
if (targetTopic.getChildren().length > 0) {
|
||||
gap = Math.abs(targetPosition.y - targetTopic.getChildren()[0].getPosition().y)
|
||||
}
|
||||
var yDistance = Math.abs(position.y - fix * gap - targetPosition.y);
|
||||
if (distance == null || yDistance < distance) {
|
||||
|
@ -110,7 +110,7 @@ mindplot.DragTopic = new Class({
|
||||
var targetTopicModel = targetTopic.getModel();
|
||||
var childTopicModel = draggedNode.getModel();
|
||||
|
||||
result = targetTopicModel.canBeConnected(childTopicModel, topicPosition, 18);
|
||||
result = targetTopicModel.canBeConnected(childTopicModel, topicPosition, 18, targetTopic.getSize());
|
||||
}
|
||||
} else {
|
||||
result = false;
|
||||
|
@ -1,83 +0,0 @@
|
||||
/*
|
||||
* 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.DwrPersitenceManager = new Class({
|
||||
Extends:mindplot.PersistenceManager,
|
||||
initialize: function() {
|
||||
this.parent();
|
||||
},
|
||||
|
||||
saveMapXml : function(mapId, mapXml, pref, saveHistory, events) {
|
||||
window.MapEditorService.saveMap(mapId, mapXml, pref, saveHistory, {
|
||||
callback:function(response) {
|
||||
if (response.msgCode != "OK") {
|
||||
events.onError(response);
|
||||
} else {
|
||||
events.onSuccess(response);
|
||||
}
|
||||
},
|
||||
|
||||
errorHandler:function(message) {
|
||||
events.onError(message);
|
||||
},
|
||||
verb:"POST",
|
||||
async: true
|
||||
}
|
||||
)
|
||||
},
|
||||
|
||||
loadMapDom : function(mapId) {
|
||||
$assert(mapId, "mapId can not be null");
|
||||
throw "This must be implemented";
|
||||
|
||||
// var result = {r:null};
|
||||
// window.MapEditorService.loadMap(mapId, {
|
||||
// callback:function(response) {
|
||||
//
|
||||
// if (response.msgCode == "OK") {
|
||||
// // Explorer Hack with local files ...
|
||||
// var xmlContent = response.content;
|
||||
// var domDocument = core.Utils.createDocumentFromText(xmlContent);
|
||||
// var serializer = mindplot.XMLMindmapSerializerFactory.getSerializerFromDocument(domDocument);
|
||||
// var mindmap = serializer.loadFromDom(domDocument);
|
||||
// mindmap.setId(mapId);
|
||||
//
|
||||
// result.r = mindmap;
|
||||
// } else {
|
||||
// // Handle error message ...
|
||||
// var msg = response.msgDetails;
|
||||
// var monitor = core.ToolbarNotifier.getInstance();
|
||||
// monitor.logFatal("We're sorry, an error has occurred and we can't load your map. Please try again in a few minutes.");
|
||||
//// wLogger.error(msg);
|
||||
// }
|
||||
// },
|
||||
// verb:"GET",
|
||||
// async: false,
|
||||
// errorHandler:function(msg) {
|
||||
// var monitor = core.ToolbarNotifier.getInstance();
|
||||
// monitor.logFatal("We're sorry, an error has occurred and we can't load your map. Please try again in a few minutes.");
|
||||
//// wLogger.error(msg);
|
||||
// }
|
||||
// });
|
||||
//
|
||||
// return result.r;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
|
@ -70,23 +70,12 @@ mindplot.IconGroup = new Class({
|
||||
}
|
||||
},
|
||||
|
||||
_findIconFromUrl : function(url) {
|
||||
var result = null;
|
||||
this._icons.each(function(el) {
|
||||
var nativeImage = el.getImage();
|
||||
if (nativeImage.getHref() == url) {
|
||||
result = el;
|
||||
}
|
||||
}, this);
|
||||
return result;
|
||||
},
|
||||
|
||||
_findIconFromModel : function(iconModel) {
|
||||
var result = null;
|
||||
this._icons.each(function(el) {
|
||||
var elModel = el.getModel();
|
||||
if (result == null && $defined(elModel.isIconModel) && elModel.getId() == iconModel.getId()) {
|
||||
result = el;
|
||||
this._icons.each(function(icon) {
|
||||
var elModel = icon.getModel();
|
||||
if (elModel.getId() == iconModel.getId()) {
|
||||
result = icon;
|
||||
}
|
||||
}, this);
|
||||
|
||||
@ -97,16 +86,10 @@ mindplot.IconGroup = new Class({
|
||||
return result;
|
||||
},
|
||||
|
||||
removeIconByUrl : function(url) {
|
||||
var icon = this._findIconFromUrl(url);
|
||||
$assert(icon, 'icon could not be found');
|
||||
this._removeIcon(icon);
|
||||
},
|
||||
removeIconByModel : function(featureModel) {
|
||||
$assert(featureModel, "featureModel can not be null");
|
||||
|
||||
removeIcon : function(iconModel) {
|
||||
$assert(iconModel, "iconModel can not be null");
|
||||
|
||||
var icon = this._findIconFromModel(iconModel);
|
||||
var icon = this._findIconFromModel(featureModel);
|
||||
this._removeIcon(icon);
|
||||
},
|
||||
|
||||
@ -215,7 +198,6 @@ mindplot.IconGroup.RemoveTip = new Class({
|
||||
}
|
||||
|
||||
if (this._activeIcon) {
|
||||
var icon = this._activeIcon;
|
||||
var widget = this._widget;
|
||||
var close = function() {
|
||||
|
||||
|
@ -23,7 +23,7 @@ mindplot.ImageIcon = new Class({
|
||||
$assert(topic, 'topic can not be null');
|
||||
|
||||
this._topicId = topic.getId();
|
||||
this._iconModel = iconModel;
|
||||
this._featureModel = iconModel;
|
||||
|
||||
// @Todo: Read only must be a property ...
|
||||
this._readOnly = designer._readOnly;
|
||||
@ -53,11 +53,11 @@ mindplot.ImageIcon = new Class({
|
||||
},
|
||||
|
||||
_getImageUrl : function(iconId) {
|
||||
return "../icons/" + iconId + ".png";
|
||||
return "icons/" + iconId + ".png";
|
||||
},
|
||||
|
||||
getModel : function() {
|
||||
return this._iconModel;
|
||||
return this._featureModel;
|
||||
},
|
||||
|
||||
_getNextFamilyIconId : function(iconId) {
|
||||
@ -98,21 +98,39 @@ mindplot.ImageIcon = new Class({
|
||||
return result;
|
||||
},
|
||||
|
||||
getId : function() {
|
||||
return this._iconType;
|
||||
},
|
||||
|
||||
getUiId : function() {
|
||||
return this._uiId;
|
||||
},
|
||||
|
||||
remove : function() {
|
||||
var actionDispatcher = mindplot.ActionDispatcher.getInstance();
|
||||
actionDispatcher.removeIconFromTopic(this._topicId, this._iconModel);
|
||||
var featureId = this._featureModel.getId();
|
||||
var topicId = this._topicId;
|
||||
actionDispatcher.removeFeatureFromTopic(topicId, featureId);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
mindplot.ImageIcon.prototype.ICON_FAMILIES = [{"id": "face", "icons" : ["face_plain","face_sad","face_crying","face_smile","face_surprise","face_wink"]},{"id": "funy", "icons" : ["funy_angel","funy_devilish","funy_glasses","funy_grin","funy_kiss","funy_monkey"]},{"id": "conn", "icons" : ["conn_connect","conn_disconnect"]},{"id": "sport", "icons" : ["sport_basketball","sport_football","sport_golf","sport_raquet","sport_shuttlecock","sport_soccer","sport_tennis"]},{"id": "bulb", "icons" : ["bulb_light_on","bulb_light_off"]},{"id": "thumb", "icons" : ["thumb_thumb_up","thumb_thumb_down"]},{"id": "tick", "icons" : ["tick_tick","tick_cross"]},{"id": "onoff", "icons" : ["onoff_clock","onoff_clock_red","onoff_add","onoff_delete","onoff_status_offline","onoff_status_online"]},{"id": "money", "icons" : ["money_money","money_dollar","money_euro","money_pound","money_yen","money_coins","money_ruby"]},{"id": "time", "icons" : ["time_calendar","time_clock","time_hourglass"]},{"id": "chart", "icons" : ["chart_bar","chart_line","chart_curve","chart_pie","chart_organisation"]},{"id": "sign", "icons" : ["sign_warning","sign_info","sign_stop","sign_help","sign_cancel"]},{"id": "hard", "icons" : ["hard_cd","hard_computer","hard_controller","hard_driver_disk","hard_ipod","hard_keyboard","hard_mouse","hard_printer"]},{"id": "soft", "icons" : ["soft_bug","soft_cursor","soft_database_table","soft_database","soft_feed","soft_folder_explore","soft_rss","soft_penguin"]},{"id": "arrow", "icons" : ["arrow_up","arrow_down","arrow_left","arrow_right"]},{"id": "arrowc", "icons" : ["arrowc_rotate_anticlockwise","arrowc_rotate_clockwise","arrowc_turn_left","arrowc_turn_right"]},{"id": "people", "icons" : ["people_group","people_male1","people_male2","people_female1","people_female2"]},{"id": "mail", "icons" : ["mail_envelop","mail_mailbox","mail_edit","mail_list"]},{"id": "flag", "icons" : ["flag_blue","flag_green","flag_orange","flag_pink","flag_purple","flag_yellow"]},{"id": "bullet", "icons" : ["bullet_black","bullet_blue","bullet_green","bullet_orange","bullet_red","bullet_pink","bullet_purple"]},{"id": "tag", "icons" : ["tag_blue","tag_green","tag_orange","tag_red","tag_pink","tag_yellow"]},{"id": "object", "icons" : ["object_bell","object_clanbomber","object_key","object_pencil","object_phone","object_magnifier","object_clip","object_music","object_star","object_wizard","object_house","object_cake","object_camera","object_palette","object_rainbow"]},{"id": "weather", "icons" : ["weather_clear-night","weather_clear","weather_few-clouds-night","weather_few-clouds","weather_overcast","weather_severe-alert","weather_showers-scattered","weather_showers","weather_snow","weather_storm"]}];
|
||||
mindplot.ImageIcon.prototype.ICON_FAMILIES = [
|
||||
{"id": "face", "icons" : ["face_plain","face_sad","face_crying","face_smile","face_surprise","face_wink"]},
|
||||
{"id": "funy", "icons" : ["funy_angel","funy_devilish","funy_glasses","funy_grin","funy_kiss","funy_monkey"]},
|
||||
{"id": "conn", "icons" : ["conn_connect","conn_disconnect"]},
|
||||
{"id": "sport", "icons" : ["sport_basketball","sport_football","sport_golf","sport_raquet","sport_shuttlecock","sport_soccer","sport_tennis"]},
|
||||
{"id": "bulb", "icons" : ["bulb_light_on","bulb_light_off"]},
|
||||
{"id": "thumb", "icons" : ["thumb_thumb_up","thumb_thumb_down"]},
|
||||
{"id": "tick", "icons" : ["tick_tick","tick_cross"]},
|
||||
{"id": "onoff", "icons" : ["onoff_clock","onoff_clock_red","onoff_add","onoff_delete","onoff_status_offline","onoff_status_online"]},
|
||||
{"id": "money", "icons" : ["money_money","money_dollar","money_euro","money_pound","money_yen","money_coins","money_ruby"]},
|
||||
{"id": "time", "icons" : ["time_calendar","time_clock","time_hourglass"]},
|
||||
{"id": "chart", "icons" : ["chart_bar","chart_line","chart_curve","chart_pie","chart_organisation"]},
|
||||
{"id": "sign", "icons" : ["sign_warning","sign_info","sign_stop","sign_help","sign_cancel"]},
|
||||
{"id": "hard", "icons" : ["hard_cd","hard_computer","hard_controller","hard_driver_disk","hard_ipod","hard_keyboard","hard_mouse","hard_printer"]},
|
||||
{"id": "soft", "icons" : ["soft_bug","soft_cursor","soft_database_table","soft_database","soft_feed","soft_folder_explore","soft_rss","soft_penguin"]},
|
||||
{"id": "arrow", "icons" : ["arrow_up","arrow_down","arrow_left","arrow_right"]},
|
||||
{"id": "arrowc", "icons" : ["arrowc_rotate_anticlockwise","arrowc_rotate_clockwise","arrowc_turn_left","arrowc_turn_right"]},
|
||||
{"id": "people", "icons" : ["people_group","people_male1","people_male2","people_female1","people_female2"]},
|
||||
{"id": "mail", "icons" : ["mail_envelop","mail_mailbox","mail_edit","mail_list"]},
|
||||
{"id": "flag", "icons" : ["flag_blue","flag_green","flag_orange","flag_pink","flag_purple","flag_yellow"]},
|
||||
{"id": "bullet", "icons" : ["bullet_black","bullet_blue","bullet_green","bullet_orange","bullet_red","bullet_pink","bullet_purple"]},
|
||||
{"id": "tag", "icons" : ["tag_blue","tag_green","tag_orange","tag_red","tag_pink","tag_yellow"]},
|
||||
{"id": "object", "icons" : ["object_bell","object_clanbomber","object_key","object_pencil","object_phone","object_magnifier","object_clip","object_music","object_star","object_wizard","object_house","object_cake","object_camera","object_palette","object_rainbow"]},
|
||||
{"id": "weather", "icons" : ["weather_clear-night","weather_clear","weather_few-clouds-night","weather_few-clouds","weather_overcast","weather_severe-alert","weather_showers-scattered","weather_showers","weather_snow","weather_storm"]}
|
||||
];
|
||||
|
||||
|
||||
|
@ -52,6 +52,6 @@ mindplot.LinkIcon = new Class({
|
||||
actionDispatcher.removeLinkFromTopic(this._topic.getId());
|
||||
}
|
||||
});
|
||||
mindplot.LinkIcon.IMAGE_URL = "../images/links.png";
|
||||
mindplot.LinkIcon.IMAGE_URL = "images/links.png";
|
||||
|
||||
|
@ -27,12 +27,16 @@ mindplot.LocalStorageManager = new Class({
|
||||
events.onSuccess();
|
||||
},
|
||||
|
||||
discard : function(mapId) {
|
||||
localStorage.removeItem(mapId + "-xml");
|
||||
},
|
||||
|
||||
loadMapDom : function(mapId) {
|
||||
var xml = localStorage.getItem(mapId + "-xml");
|
||||
if (xml == null) {
|
||||
// Let's try to open one from the local directory ...
|
||||
var xmlRequest = new Request({
|
||||
url: '../samples/' + mapId + '.xml',
|
||||
url: 'samples/' + mapId + '.xml',
|
||||
method: 'get',
|
||||
async: false,
|
||||
onSuccess: function(responseText) {
|
||||
|
@ -25,7 +25,7 @@ mindplot.MainTopic = new Class({
|
||||
INNER_RECT_ATTRIBUTES : {stroke:'0.5 solid #009900'},
|
||||
|
||||
_buildDragShape : function() {
|
||||
var innerShape = this.buildShape(this.INNER_RECT_ATTRIBUTES);
|
||||
var innerShape = this._buildShape(this.INNER_RECT_ATTRIBUTES, this.getShapeType());
|
||||
var size = this.getSize();
|
||||
innerShape.setSize(size.width, size.height);
|
||||
innerShape.setPosition(0, 0);
|
||||
@ -45,18 +45,19 @@ mindplot.MainTopic = new Class({
|
||||
group.appendChild(innerShape);
|
||||
|
||||
// Add Text ...
|
||||
if (this.getShapeType() != mindplot.model.TopicShape.IMAGE) {
|
||||
var textShape = this._buildTextShape(true);
|
||||
var text = this.getText();
|
||||
textShape.setText(text);
|
||||
textShape.setOpacity(0.5);
|
||||
group.appendChild(textShape);
|
||||
|
||||
}
|
||||
return group;
|
||||
},
|
||||
|
||||
|
||||
_defaultShapeType : function() {
|
||||
return mindplot.model.INodeModel.SHAPE_TYPE_LINE;
|
||||
return mindplot.model.TopicShape.LINE;
|
||||
},
|
||||
|
||||
updateTopicShape : function(targetTopic, workspace) {
|
||||
@ -81,7 +82,7 @@ mindplot.MainTopic = new Class({
|
||||
if (!$defined(shapeType)) {
|
||||
// Change figure ...
|
||||
shapeType = this.getShapeType();
|
||||
this._setShapeType(mindplot.model.INodeModel.SHAPE_TYPE_ROUNDED_RECT, false);
|
||||
this._setShapeType(mindplot.model.TopicShape.ROUNDED_RECT, false);
|
||||
}
|
||||
var innerShape = this.getInnerShape();
|
||||
innerShape.setVisibility(true);
|
||||
@ -112,7 +113,7 @@ mindplot.MainTopic = new Class({
|
||||
|
||||
var isAtRight = mindplot.util.Shape.isAtRight(sourcePosition, pos);
|
||||
var result = mindplot.util.Shape.calculateRectConnectionPoint(pos, size, isAtRight);
|
||||
if (this.getShapeType() == mindplot.model.INodeModel.SHAPE_TYPE_LINE) {
|
||||
if (this.getShapeType() == mindplot.model.TopicShape.LINE) {
|
||||
result.y = result.y + (this.getSize().height / 2);
|
||||
}
|
||||
|
||||
@ -133,14 +134,15 @@ mindplot.MainTopic = new Class({
|
||||
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();
|
||||
|
||||
var result;
|
||||
if (this.getShapeType() == mindplot.model.INodeModel.SHAPE_TYPE_LINE) {
|
||||
if (this.getShapeType() == mindplot.model.TopicShape.LINE) {
|
||||
|
||||
result = new core.Point();
|
||||
var groupPosition = this._elem2d.getPosition();
|
||||
var innerShareSize = this.getInnerShape().getSize();
|
||||
var isAtRight = mindplot.util.Shape.isAtRight(targetPosition, pos);
|
||||
|
||||
if (innerShareSize) {
|
||||
var magicCorrectionNumber = 0.3;
|
||||
@ -153,7 +155,6 @@ mindplot.MainTopic = new Class({
|
||||
} else {
|
||||
// Hack: When the size has not being defined. This is because the node has not being added.
|
||||
// Try to do our best ...
|
||||
var size = this.getSize();
|
||||
if (!isAtRight) {
|
||||
result.x = pos.x + (size.width / 2);
|
||||
} else {
|
||||
|
@ -18,8 +18,8 @@
|
||||
|
||||
mindplot.MultilineTextEditor = new Class({
|
||||
Extends: Events,
|
||||
initialize:function(topic) {
|
||||
this._topic = topic;
|
||||
initialize:function() {
|
||||
this._topic = null;
|
||||
},
|
||||
|
||||
_buildEditor : function() {
|
||||
@ -133,8 +133,9 @@ mindplot.MultilineTextEditor = new Class({
|
||||
}
|
||||
},
|
||||
|
||||
show : function (text) {
|
||||
show : function (topic,text) {
|
||||
|
||||
this._topic = topic;
|
||||
if (!this.isVisible()) {
|
||||
//Create editor ui
|
||||
var containerElem = this._buildEditor();
|
||||
@ -260,6 +261,7 @@ mindplot.MultilineTextEditor = new Class({
|
||||
// Remove it form the screen ...
|
||||
this._containerElem.dispose();
|
||||
this._containerElem = null;
|
||||
this._topic = null;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -25,6 +25,7 @@ mindplot.NodeGraph = new Class({
|
||||
this.setModel(nodeModel);
|
||||
this._onFocus = false;
|
||||
this._event = new Events();
|
||||
this._size = {width:50,height:20};
|
||||
},
|
||||
|
||||
getType : function() {
|
||||
@ -73,11 +74,12 @@ mindplot.NodeGraph = new Class({
|
||||
},
|
||||
|
||||
getSize : function() {
|
||||
return this._model.getSize();
|
||||
return this._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() {
|
||||
|
@ -83,5 +83,5 @@ mindplot.NoteIcon = new Class({
|
||||
}
|
||||
});
|
||||
|
||||
mindplot.NoteIcon.IMAGE_URL = "../images/notes.png";
|
||||
mindplot.NoteIcon.IMAGE_URL = "images/notes.png";
|
||||
|
||||
|
@ -28,7 +28,7 @@ mindplot.PersistenceManager = new Class({
|
||||
var mapId = mindmap.getId();
|
||||
$assert(mapId, "mapId can not be null");
|
||||
|
||||
var serializer = mindplot.XMLMindmapSerializerFactory.getSerializerFromMindmap(mindmap);
|
||||
var serializer = mindplot.persistence.XMLSerializerFactory.getSerializerFromMindmap(mindmap);
|
||||
var domMap = serializer.toXML(mindmap);
|
||||
var mapXml = core.Utils.innerXML(domMap);
|
||||
|
||||
@ -47,6 +47,10 @@ mindplot.PersistenceManager = new Class({
|
||||
return this.loadFromDom(mapId, domDocument);
|
||||
},
|
||||
|
||||
discard: function(mapId) {
|
||||
throw "Method must be implemented";
|
||||
},
|
||||
|
||||
loadMapDom: function(mapId) {
|
||||
throw "Method must be implemented";
|
||||
},
|
||||
@ -59,7 +63,7 @@ mindplot.PersistenceManager = new Class({
|
||||
$assert(mapId, "mapId can not be null");
|
||||
$assert(mapDom, "mapDom can not be null");
|
||||
|
||||
var serializer = mindplot.XMLMindmapSerializerFactory.getSerializerFromDocument(mapDom);
|
||||
var serializer = mindplot.persistence.XMLSerializerFactory.getSerializerFromDocument(mapDom);
|
||||
return serializer.loadFromDom(mapDom, mapId);
|
||||
},
|
||||
|
||||
|
57
mindplot/src/main/javascript/RestPersistenceManager.js
Normal file
57
mindplot/src/main/javascript/RestPersistenceManager.js
Normal file
@ -0,0 +1,57 @@
|
||||
/*
|
||||
* 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.RESTPersistenceManager = new Class({
|
||||
Extends:mindplot.PersistenceManager,
|
||||
initialize: function(saveUrl) {
|
||||
this.parent();
|
||||
$assert(saveUrl, "saveUrl can not be null");
|
||||
this.saveUrl = saveUrl;
|
||||
},
|
||||
|
||||
saveMapXml : function(mapId, mapXml, pref, saveHistory, events) {
|
||||
|
||||
var data = {
|
||||
id:mapId,
|
||||
xml: mapXml,
|
||||
properties: pref
|
||||
};
|
||||
|
||||
var request = new Request({
|
||||
url:this.saveUrl + mapId + "?minor=" + !saveHistory,
|
||||
method: 'put',
|
||||
onSuccess:function(responseText, responseXML) {
|
||||
events.onSuccess();
|
||||
|
||||
},
|
||||
onException:function(headerName, value) {
|
||||
events.onError();
|
||||
},
|
||||
onFailure:function(xhr) {
|
||||
events.onError();
|
||||
},
|
||||
headers: {"Content-Type":"application/json","Accept":"application/json"},
|
||||
emulation:false,
|
||||
urlEncoded:false
|
||||
});
|
||||
request.put(JSON.encode(data));
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
|
@ -1,158 +0,0 @@
|
||||
/*
|
||||
* 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.RichTextEditor = mindplot.TextEditor.extend({
|
||||
initialize:function(screenManager,actionRunner){
|
||||
this.parent(screenManager, actionRunner);
|
||||
},
|
||||
_buildEditor:function(){
|
||||
//Create editor ui
|
||||
this._size = {width:440, height:200};
|
||||
this._myOverlay = new Element('div').setStyles({position:"absolute", display: "none", zIndex: "8", top: "50%", left:"50%", marginLeft:"-200px", marginTop:"-90px", width:"400px", height:"180px"});
|
||||
var inputContainer = new Element('div').setStyles({border:"none", overflow:"auto"}).inject(this._myOverlay);
|
||||
this.inputText = new Element('textarea').setProperties({tabindex:'-1', id:"inputText2", value:""}).setStyles({width:"398px", height:"175px", border:"none", background:"transparent"}).inject(inputContainer);
|
||||
this._myOverlay.inject(this._screenManager.getContainer());
|
||||
this._editorNode = new web2d.Rect(0.3,mindplot.Topic.OUTER_SHAPE_ATTRIBUTES);
|
||||
this._editorNode.setSize(50,20);
|
||||
this._editorNode.setVisibility(false);
|
||||
this._designer.getWorkSpace().appendChild(this._editorNode);
|
||||
this._addListeners();
|
||||
},
|
||||
_registerListeners:function(){
|
||||
|
||||
$(this._myOverlay).addEvent('click', function(event){
|
||||
event.preventDefault();
|
||||
event.stop();
|
||||
}.bindWithEvent(this));
|
||||
$(this._myOverlay).addEvent('dblclick', function(event){
|
||||
event.preventDefault();
|
||||
event.stop();
|
||||
}.bindWithEvent(this));
|
||||
},
|
||||
getFocusEvent:function(node){
|
||||
var screenSize = this._designer.getWorkSpace().getSize();
|
||||
var coordOrigin = this._designer.getWorkSpace()._workspace.getCoordOrigin();
|
||||
var middlePosition = {x:parseInt(screenSize.width)/2 + parseInt(coordOrigin.x), y:parseInt(screenSize.height)/2 + parseInt(coordOrigin.y)};
|
||||
|
||||
this._designer.getWorkSpace().enableWorkspaceEvents(false);
|
||||
var position = node.getPosition().clone();
|
||||
var size = node.getSize();
|
||||
this._editorNode.setPosition(position.x-(size.width/2), position.y-(size.height/2));
|
||||
position = this._editorNode.getPosition();
|
||||
this._editorNode.setSize(size.width, size.height);
|
||||
this._editorNode.moveToFront();
|
||||
this._editorNode.setVisibility(true);
|
||||
var scale = web2d.peer.utils.TransformUtil.workoutScale(node.getOuterShape());
|
||||
// scale.width=1;
|
||||
// scale.height = 1;
|
||||
var steps = 10;
|
||||
this._delta = {width:((this._size.width/scale.width)-size.width)/steps, height:((this._size.height/scale.height)-size.height)/steps};
|
||||
var finx = (middlePosition.x-(((this._size.width)/2)/scale.width));
|
||||
var finy = (middlePosition.y-((this._size.height/2)/scale.height));
|
||||
var step = 10;
|
||||
var d = {x:(position.x - finx)/step, y:(position.y - finy)/step};
|
||||
var _animEffect = null;
|
||||
var effect = function(){
|
||||
if(step>=0){
|
||||
var xStep= (position.x -finx)/step;
|
||||
var yStep= (position.y -finy)/step;
|
||||
var pos = {x:position.x - d.x*(10-step), y: position.y -d.y *(10-step)};
|
||||
|
||||
var size = this._editorNode.getSize();
|
||||
this._editorNode.setSize(size.width + this._delta.width, size.height + this._delta.height);
|
||||
this._editorNode.setPosition(pos.x, pos.y);
|
||||
if(step>0)
|
||||
this._editorNode.setOpacity(1-step/10);
|
||||
step--;
|
||||
}else{
|
||||
$clear(_animEffect);
|
||||
this._editorNode.setSize((this._size.width/scale.width), (this._size.height/scale.height));
|
||||
this.init(node);
|
||||
}
|
||||
}.bind(this);
|
||||
_animEffect = effect.periodical(10);
|
||||
$(this.inputText).value = $defined(this.initialText)&& this.initialText!=""? this.initialText: node.getText();
|
||||
this._editor = new nicEditor({iconsPath: '../images/nicEditorIcons.gif', buttonList : ['bold','italic','underline','removeformat','forecolor', 'fontSize', 'fontFamily', 'xhtml']}).panelInstance("inputText2");
|
||||
},
|
||||
init:function(node){
|
||||
this._currentNode = node;
|
||||
this._applyChanges = false;
|
||||
$(this._myOverlay.setStyle('display','block'));
|
||||
inst = this._editor.instanceById("inputText2");
|
||||
inst.elm.focus();
|
||||
|
||||
|
||||
|
||||
//becarefull this._editor is not mootools!!
|
||||
this._editor.addEvent('blur',function(event){
|
||||
this._myOverlay.setStyle('display','none');
|
||||
var text = this._text;
|
||||
this._text = this._editor.instanceById("inputText2").getContent();
|
||||
if(text!=this._text){
|
||||
this._applyChanges = true;
|
||||
}
|
||||
console.log('bye');
|
||||
this.lostFocusListener();
|
||||
this._editor.removeInstance("inputText2");
|
||||
this._editor.destruct();
|
||||
this._editor = null;
|
||||
|
||||
}.bind(this));
|
||||
|
||||
this._editor.fireEvent();
|
||||
$(this.inputText).focus();
|
||||
},
|
||||
getText:function(){
|
||||
return this._text;
|
||||
},
|
||||
lostFocusListener:function(){
|
||||
this._hideNode();
|
||||
if (this._currentNode != null)
|
||||
{
|
||||
if(this._applyChanges)
|
||||
{
|
||||
this._updateModel();
|
||||
}
|
||||
this._applyChanges=true;
|
||||
this._currentNode = null;
|
||||
}
|
||||
},
|
||||
_hideNode:function(){
|
||||
var _animEffect = null;
|
||||
var step = 10;
|
||||
var position = this._editorNode.getPosition();
|
||||
var finx = this._currentNode.getPosition().x - this._currentNode.getSize().width/2;
|
||||
var finy = this._currentNode.getPosition().y - this._currentNode.getSize().height/2;
|
||||
var d = {x:(position.x - finx)/step, y:(position.y - finy)/step};
|
||||
var effect = function(){
|
||||
if(step>=0){
|
||||
var pos = {x:position.x - d.x*(10-step), y: position.y - d.y*(10-step)};
|
||||
|
||||
var size = this._editorNode.getSize();
|
||||
this._editorNode.setSize(size.width - this._delta.width, size.height - this._delta.height);
|
||||
this._editorNode.setPosition(pos.x, pos.y);
|
||||
this._editorNode.setOpacity(step/10);
|
||||
step--;
|
||||
}else{
|
||||
$clear(_animEffect);
|
||||
this._designer.getWorkSpace().enableWorkspaceEvents(true);
|
||||
this._editorNode.setVisibility(false); }
|
||||
}.bind(this);
|
||||
_animEffect = effect.periodical(10);
|
||||
}
|
||||
});
|
@ -28,26 +28,12 @@ mindplot.StandaloneActionDispatcher = new Class({
|
||||
this._actionRunner.hasBeenChanged();
|
||||
},
|
||||
|
||||
addIconToTopic: function(topicId, iconType) {
|
||||
var command = new mindplot.commands.AddIconToTopicCommand(topicId, iconType);
|
||||
this.execute(command);
|
||||
},
|
||||
|
||||
changeLinkToTopic: function(topicId, url) {
|
||||
var command = new mindplot.commands.ChangeLinkToTopicCommand(topicId, url);
|
||||
this.execute(command);
|
||||
},
|
||||
|
||||
addTopic:function(nodeModel, parentTopicId, animated) {
|
||||
var command = new mindplot.commands.AddTopicCommand(nodeModel, parentTopicId, animated);
|
||||
this.execute(command);
|
||||
},
|
||||
|
||||
changeNoteToTopic: function(topicId, text) {
|
||||
var command = new mindplot.commands.ChangeNoteToTopicCommand(topicId, text);
|
||||
this.execute(command);
|
||||
},
|
||||
|
||||
connectByRelation: function(model) {
|
||||
var command = new mindplot.commands.AddRelationshipCommand(model);
|
||||
this.execute(command);
|
||||
@ -82,20 +68,6 @@ mindplot.StandaloneActionDispatcher = new Class({
|
||||
this.execute(command);
|
||||
},
|
||||
|
||||
removeIconFromTopic: function(topicId, iconModel) {
|
||||
var command = new mindplot.commands.RemoveIconFromTopicCommand(topicId, iconModel);
|
||||
this.execute(command);
|
||||
},
|
||||
removeLinkFromTopic: function(topicId) {
|
||||
var command = new mindplot.commands.RemoveLinkFromTopicCommand(topicId);
|
||||
this.execute(command);
|
||||
},
|
||||
|
||||
removeNoteFromTopic: function(topicId) {
|
||||
var command = new mindplot.commands.RemoveNoteFromTopicCommand(topicId);
|
||||
this.execute(command);
|
||||
},
|
||||
|
||||
changeFontStyleToTopic: function(topicsIds) {
|
||||
|
||||
var commandFunc = function(topic) {
|
||||
@ -242,6 +214,21 @@ mindplot.StandaloneActionDispatcher = new Class({
|
||||
this.execute(command, false);
|
||||
},
|
||||
|
||||
addFeatureToTopic : function(topicId, featureType, attributes) {
|
||||
var command = new mindplot.commands.AddFeatureToTopicCommand(topicId, featureType, attributes);
|
||||
this.execute(command);
|
||||
},
|
||||
|
||||
changeFeatureToTopic : function(topicId, featureId, attributes) {
|
||||
var command = new mindplot.commands.ChangeFeatureToTopicCommand(topicId, featureId, attributes);
|
||||
this.execute(command);
|
||||
},
|
||||
|
||||
removeFeatureFromTopic : function(topicId, featureId) {
|
||||
var command = new mindplot.commands.RemoveFeatureFromTopicCommand(topicId, featureId);
|
||||
this.execute(command);
|
||||
},
|
||||
|
||||
execute:function(command) {
|
||||
this._actionRunner.execute(command);
|
||||
mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.DoLayout);
|
||||
@ -273,8 +260,7 @@ mindplot.CommandContext = new Class({
|
||||
|
||||
createTopic:function(model, isVisible) {
|
||||
$assert(model, "model can not be null");
|
||||
var result = this._designer._nodeModelToNodeGraph(model, isVisible);
|
||||
return result;
|
||||
return this._designer._nodeModelToNodeGraph(model, isVisible);
|
||||
},
|
||||
|
||||
createModel:function() {
|
||||
|
@ -21,13 +21,11 @@ mindplot.Topic = new Class({
|
||||
Extends:mindplot.NodeGraph,
|
||||
initialize : function(model, options) {
|
||||
this.parent(model, options);
|
||||
this._textEditor = new mindplot.MultilineTextEditor(this);
|
||||
|
||||
this._children = [];
|
||||
this._parent = null;
|
||||
this._relationships = [];
|
||||
this._isInWorkspace = false;
|
||||
this._buildShape();
|
||||
this._buildTopicShape();
|
||||
|
||||
// Position a topic ....
|
||||
var pos = model.getPosition();
|
||||
@ -51,24 +49,13 @@ mindplot.Topic = new Class({
|
||||
});
|
||||
|
||||
this.addEvent('dblclick', function (event) {
|
||||
this._textEditor.show();
|
||||
this._getTopicEditor().show(this);
|
||||
event.stopPropagation(true);
|
||||
}.bind(this));
|
||||
|
||||
this._textEditor.addEvent('input', function(event, text) {
|
||||
var textShape = this.getTextShape();
|
||||
// var oldText = textShape.getText();
|
||||
|
||||
// this._setText(text, false);
|
||||
// @Todo: I must resize, no change the position ...
|
||||
// textShape.setText(oldText);
|
||||
}.bind(this));
|
||||
|
||||
},
|
||||
|
||||
setShapeType : function(type) {
|
||||
this._setShapeType(type, true);
|
||||
|
||||
},
|
||||
|
||||
getParent : function() {
|
||||
@ -91,7 +78,7 @@ mindplot.Topic = new Class({
|
||||
var innerShape = this.getInnerShape();
|
||||
|
||||
// Update figure size ...
|
||||
var size = model.getSize();
|
||||
var size = this.getSize();
|
||||
this.setSize(size, true);
|
||||
|
||||
var group = this.get2DElement();
|
||||
@ -106,6 +93,7 @@ mindplot.Topic = new Class({
|
||||
if ($defined(iconGroup)) {
|
||||
iconGroup.moveToFront();
|
||||
}
|
||||
|
||||
//Move connector to front
|
||||
var connector = this.getShrinkConnector();
|
||||
if ($defined(connector)) {
|
||||
@ -135,7 +123,7 @@ mindplot.Topic = new Class({
|
||||
getInnerShape : function() {
|
||||
if (!$defined(this._innerShape)) {
|
||||
// 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 ...
|
||||
var bgColor = this.getBackgroundColor();
|
||||
@ -156,22 +144,36 @@ mindplot.Topic = new Class({
|
||||
return this._innerShape;
|
||||
},
|
||||
|
||||
buildShape : function(attributes, type) {
|
||||
var result;
|
||||
if (!$defined(type)) {
|
||||
type = this.getShapeType();
|
||||
}
|
||||
_buildShape : function(attributes, shapeType) {
|
||||
$assert(attributes, "attributes can not be null");
|
||||
$assert(shapeType, "shapeType can not be null");
|
||||
|
||||
if (type == mindplot.model.INodeModel.SHAPE_TYPE_RECT) {
|
||||
var result;
|
||||
if (shapeType == mindplot.model.TopicShape.RECTANGLE) {
|
||||
result = new web2d.Rect(0, attributes);
|
||||
} else if (shapeType == mindplot.model.TopicShape.IMAGE) {
|
||||
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.INodeModel.SHAPE_TYPE_ELIPSE) {
|
||||
else if (shapeType == mindplot.model.TopicShape.ELLIPSE) {
|
||||
result = new web2d.Rect(0.9, attributes);
|
||||
}
|
||||
else if (type == mindplot.model.INodeModel.SHAPE_TYPE_ROUNDED_RECT) {
|
||||
else if (shapeType == mindplot.model.TopicShape.ROUNDED_RECT) {
|
||||
result = new web2d.Rect(0.3, attributes);
|
||||
}
|
||||
else if (type == mindplot.model.INodeModel.SHAPE_TYPE_LINE) {
|
||||
else if (shapeType == mindplot.model.TopicShape.LINE) {
|
||||
result = new web2d.Line({strokeColor:"#495879",strokeWidth:1});
|
||||
result.setSize = function(width, height) {
|
||||
this.size = {width:width, height:height};
|
||||
@ -190,7 +192,6 @@ mindplot.Topic = new Class({
|
||||
result.setPosition = function() {
|
||||
};
|
||||
|
||||
var setStrokeFunction = result.setStroke;
|
||||
result.setFill = function() {
|
||||
|
||||
};
|
||||
@ -200,7 +201,7 @@ mindplot.Topic = new Class({
|
||||
};
|
||||
}
|
||||
else {
|
||||
$assert(false, "Unsupported figure type:" + type);
|
||||
$assert(false, "Unsupported figure shapeType:" + shapeType);
|
||||
}
|
||||
result.setPosition(0, 0);
|
||||
return result;
|
||||
@ -220,7 +221,7 @@ mindplot.Topic = new Class({
|
||||
|
||||
getOuterShape : function() {
|
||||
if (!$defined(this._outerShape)) {
|
||||
var rect = this.buildShape(mindplot.Topic.OUTER_SHAPE_ATTRIBUTES, mindplot.model.INodeModel.SHAPE_TYPE_ROUNDED_RECT);
|
||||
var rect = this._buildShape(mindplot.Topic.OUTER_SHAPE_ATTRIBUTES, mindplot.model.TopicShape.ROUNDED_RECT);
|
||||
rect.setPosition(-2, -3);
|
||||
rect.setOpacity(0);
|
||||
this._outerShape = rect;
|
||||
@ -237,6 +238,7 @@ mindplot.Topic = new Class({
|
||||
var text = this.getText();
|
||||
this._setText(text, false);
|
||||
}
|
||||
|
||||
return this._text;
|
||||
},
|
||||
|
||||
@ -260,129 +262,55 @@ mindplot.Topic = new Class({
|
||||
var padding = this._getInnerPadding();
|
||||
result.setPosition(padding, padding);
|
||||
|
||||
// Load topic features ...
|
||||
var model = this.getModel();
|
||||
|
||||
//Icons
|
||||
var icons = model.getIcons();
|
||||
for (var i = 0; i < icons.length; i++) {
|
||||
// Update model identifier ...
|
||||
var iconModel = icons[i];
|
||||
var icon = new mindplot.ImageIcon(this, iconModel);
|
||||
result.addIcon(icon, true);
|
||||
}
|
||||
|
||||
//Links
|
||||
var links = model.getLinks();
|
||||
for (var i = 0; i < links.length; i++) {
|
||||
this._link = new mindplot.LinkIcon(this, links[i]);
|
||||
result.addIcon(this._link);
|
||||
}
|
||||
|
||||
//Notes
|
||||
var notes = model.getNotes();
|
||||
for (var j = 0; j < notes.length; j++) {
|
||||
this._note = new mindplot.NoteIcon(this, notes[j]);
|
||||
result.addIcon(this._note);
|
||||
var featuresModel = model.getFeatures();
|
||||
for (var i = 0; i < featuresModel.length; i++) {
|
||||
var featureModel = featuresModel[i];
|
||||
var icon = mindplot.TopicFeature.createIcon(this, featureModel);
|
||||
result.addIcon(icon, featureModel.getType() == "icon"); // @Todo: Remove hack ...
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
addLink : function(url) {
|
||||
var iconGroup = this.getOrBuildIconGroup();
|
||||
var model = this.getModel();
|
||||
var linkModel = model.createLink(url);
|
||||
model.addLink(linkModel);
|
||||
|
||||
this._link = new mindplot.LinkIcon(this, linkModel);
|
||||
iconGroup.addIcon(this._link);
|
||||
|
||||
this._adjustShapes();
|
||||
},
|
||||
|
||||
addNote : function(text) {
|
||||
var iconGroup = this.getOrBuildIconGroup();
|
||||
var model = this.getModel();
|
||||
|
||||
var noteModel = model.createNote(text);
|
||||
model.addNote(noteModel);
|
||||
|
||||
this._note = new mindplot.NoteIcon(this, noteModel);
|
||||
iconGroup.addIcon(this._note);
|
||||
|
||||
this._adjustShapes();
|
||||
},
|
||||
|
||||
addIcon : function(iconType) {
|
||||
addFeature : function(type, attributes) {
|
||||
var iconGroup = this.getOrBuildIconGroup();
|
||||
this.closeEditors();
|
||||
|
||||
var model = this.getModel();
|
||||
|
||||
// Update model ...
|
||||
var iconModel = model.createIcon(iconType);
|
||||
model.addIcon(iconModel);
|
||||
var feature = model.createFeature(type, attributes);
|
||||
model.addFeature(feature);
|
||||
|
||||
var result = mindplot.TopicFeature.createIcon(this, feature);
|
||||
iconGroup.addIcon(result, type == "icon"); // @Todo: Remove hack ...
|
||||
|
||||
var imageIcon = new mindplot.ImageIcon(this, iconModel);
|
||||
iconGroup.addIcon(imageIcon, true);
|
||||
this._adjustShapes();
|
||||
return imageIcon;
|
||||
return result;
|
||||
},
|
||||
|
||||
removeIcon : function(iconModel) {
|
||||
findFeatureById : function(id) {
|
||||
var model = this.getModel();
|
||||
return model.findFeatureById(id);
|
||||
},
|
||||
|
||||
removeFeature : function(featureModel) {
|
||||
$assert(featureModel, "featureModel could not be null");
|
||||
|
||||
//Removing the icon from MODEL
|
||||
var model = this.getModel();
|
||||
model.removeIcon(iconModel);
|
||||
model.removeFeature(featureModel);
|
||||
|
||||
//Removing the icon from UI
|
||||
var iconGroup = this.getIconGroup();
|
||||
if ($defined(iconGroup)) {
|
||||
iconGroup.removeIcon(iconModel);
|
||||
iconGroup.removeIconByModel(featureModel);
|
||||
}
|
||||
this._adjustShapes();
|
||||
},
|
||||
|
||||
removeLink : function() {
|
||||
// Update model ...
|
||||
var model = this.getModel();
|
||||
var links = model.getLinks();
|
||||
model._removeLink(links[0]);
|
||||
|
||||
// Remove UI ...
|
||||
var iconGroup = this.getIconGroup();
|
||||
if ($defined(iconGroup)) {
|
||||
iconGroup.removeIconByUrl(mindplot.LinkIcon.IMAGE_URL);
|
||||
}
|
||||
|
||||
this._link = null;
|
||||
this._adjustShapes();
|
||||
},
|
||||
|
||||
removeNote : function() {
|
||||
// Update model ...
|
||||
var model = this.getModel();
|
||||
var notes = model.getNotes();
|
||||
model.removeNote(notes[0]);
|
||||
|
||||
// Remove UI ...
|
||||
var iconGroup = this.getIconGroup();
|
||||
if ($defined(iconGroup)) {
|
||||
iconGroup.removeIconByUrl(mindplot.NoteIcon.IMAGE_URL);
|
||||
}
|
||||
|
||||
this._note = null;
|
||||
this._adjustShapes();
|
||||
},
|
||||
|
||||
hasNote : function() {
|
||||
return this.getModel().getNotes().length != 0;
|
||||
},
|
||||
|
||||
hasLink : function() {
|
||||
return this.getModel().getLinks().length != 0;
|
||||
},
|
||||
|
||||
connectByRelation : function(relationship) {
|
||||
this._relationships.push(relationship);
|
||||
},
|
||||
@ -562,7 +490,9 @@ mindplot.Topic = new Class({
|
||||
innerShape.setFill(color);
|
||||
|
||||
var connector = this.getShrinkConnector();
|
||||
if (connector) {
|
||||
connector.setFill(color);
|
||||
}
|
||||
|
||||
if ($defined(updateModel) && updateModel) {
|
||||
var model = this.getModel();
|
||||
@ -588,8 +518,9 @@ mindplot.Topic = new Class({
|
||||
innerShape.setAttribute('strokeColor', color);
|
||||
|
||||
var connector = this.getShrinkConnector();
|
||||
if (connector) {
|
||||
connector.setAttribute('strokeColor', color);
|
||||
|
||||
}
|
||||
|
||||
if ($defined(updateModel) && updateModel) {
|
||||
var model = this.getModel();
|
||||
@ -606,7 +537,7 @@ mindplot.Topic = new Class({
|
||||
return result;
|
||||
},
|
||||
|
||||
_buildShape : function() {
|
||||
_buildTopicShape : function() {
|
||||
var groupAttributes = {width: 100, height:100,coordSizeWidth:100,coordSizeHeight:100};
|
||||
var group = new web2d.Group(groupAttributes);
|
||||
this._set2DElement(group);
|
||||
@ -615,7 +546,6 @@ mindplot.Topic = new Class({
|
||||
var outerShape = this.getOuterShape();
|
||||
var innerShape = this.getInnerShape();
|
||||
var textShape = this.getTextShape();
|
||||
var shrinkConnector = this.getShrinkConnector();
|
||||
|
||||
// Add to the group ...
|
||||
group.appendChild(outerShape);
|
||||
@ -624,11 +554,12 @@ mindplot.Topic = new Class({
|
||||
|
||||
// Update figure size ...
|
||||
var model = this.getModel();
|
||||
if (model.getLinks().length != 0 || model.getNotes().length != 0 || model.getIcons().length != 0) {
|
||||
if (model.getFeatures().length != 0) {
|
||||
this.getOrBuildIconGroup();
|
||||
}
|
||||
|
||||
if (this.getType() != mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE) {
|
||||
var shrinkConnector = this.getShrinkConnector();
|
||||
if ($defined(shrinkConnector)) {
|
||||
shrinkConnector.addToWorkspace(group);
|
||||
}
|
||||
|
||||
@ -670,7 +601,6 @@ mindplot.Topic = new Class({
|
||||
},
|
||||
|
||||
isCollapsed : function() {
|
||||
var model = this.getModel();
|
||||
var result = false;
|
||||
|
||||
var current = this.getParent();
|
||||
@ -687,12 +617,21 @@ mindplot.Topic = new Class({
|
||||
model.setChildrenShrunken(value);
|
||||
|
||||
// Change render base on the state.
|
||||
var shrinkConnector = this.getShrinkConnector();
|
||||
shrinkConnector.changeRender(value);
|
||||
|
||||
// Hide children ...
|
||||
core.Utils.setChildrenVisibilityAnimated(this, !value);
|
||||
mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.NodeShrinkEvent, this.getModel());
|
||||
var shrinkConnector = this.getShrinkConnector();
|
||||
if ($defined(shrinkConnector)) {
|
||||
shrinkConnector.changeRender(value);
|
||||
}
|
||||
|
||||
// Do some fancy animation ....
|
||||
var elements = this._flatten2DElements(this);
|
||||
var fade = new mindplot.util.FadeEffect(elements, !value);
|
||||
fade.addEvent('complete', function() {
|
||||
|
||||
});
|
||||
fade.start();
|
||||
mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.NodeShrinkEvent, model);
|
||||
|
||||
},
|
||||
|
||||
getShrinkConnector : function() {
|
||||
@ -711,7 +650,7 @@ mindplot.Topic = new Class({
|
||||
outerShape.setOpacity(1);
|
||||
},
|
||||
|
||||
handleMouseOut : function(event) {
|
||||
handleMouseOut : function() {
|
||||
var outerShape = this.getOuterShape();
|
||||
if (!this.isOnFocus()) {
|
||||
outerShape.setOpacity(0);
|
||||
@ -719,7 +658,7 @@ mindplot.Topic = new Class({
|
||||
},
|
||||
|
||||
showTextEditor : function(text) {
|
||||
this._textEditor.show(text);
|
||||
this._getTopicEditor().show(this, {text:text});
|
||||
},
|
||||
|
||||
showNoteEditor : function() {
|
||||
@ -728,7 +667,7 @@ mindplot.Topic = new Class({
|
||||
var model = this.getModel();
|
||||
var editorModel = {
|
||||
getValue : function() {
|
||||
var notes = model.getNotes();
|
||||
var notes = model.findFeatureByType(mindplot.TopicFeature.Note.id);
|
||||
var result;
|
||||
if (notes.length > 0)
|
||||
result = notes[0].getText();
|
||||
@ -738,11 +677,18 @@ mindplot.Topic = new Class({
|
||||
|
||||
setValue : function(value) {
|
||||
var dispatcher = mindplot.ActionDispatcher.getInstance();
|
||||
var notes = model.findFeatureByType(mindplot.TopicFeature.Note.id);
|
||||
if (!$defined(value)) {
|
||||
dispatcher.removeNoteFromTopic(topicId);
|
||||
var featureId = notes[0].getId();
|
||||
dispatcher.removeFeatureFromTopic(topicId, featureId);
|
||||
}
|
||||
else {
|
||||
dispatcher.changeNoteToTopic(topicId, value);
|
||||
if (notes.length > 0) {
|
||||
dispatcher.changeFeatureToTopic(topicId, notes[0].getId(), {text:value});
|
||||
}
|
||||
else {
|
||||
dispatcher.addFeatureToTopic(topicId, mindplot.TopicFeature.Note.id, {text:value});
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -757,7 +703,7 @@ mindplot.Topic = new Class({
|
||||
var model = this.getModel();
|
||||
var editorModel = {
|
||||
getValue : function() {
|
||||
var links = model.getLinks();
|
||||
var links = model.findFeatureByType(mindplot.TopicFeature.Link.id);
|
||||
var result;
|
||||
if (links.length > 0)
|
||||
result = links[0].getUrl();
|
||||
@ -767,11 +713,18 @@ mindplot.Topic = new Class({
|
||||
|
||||
setValue : function(value) {
|
||||
var dispatcher = mindplot.ActionDispatcher.getInstance();
|
||||
var links = model.findFeatureByType(mindplot.TopicFeature.Link.id);
|
||||
if (!$defined(value)) {
|
||||
dispatcher.removeLinkFromTopic(topicId);
|
||||
var featureId = links[0].getId();
|
||||
dispatcher.removeFeatureFromTopic(topicId, featureId);
|
||||
}
|
||||
else {
|
||||
dispatcher.changeLinkToTopic(topicId, value);
|
||||
if (links.length > 0) {
|
||||
dispatcher.changeFeatureToTopic(topicId, links[0].getId(), {url:value});
|
||||
}
|
||||
else {
|
||||
dispatcher.addFeatureToTopic(topicId, mindplot.TopicFeature.Link.id, {url:value});
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -781,9 +734,12 @@ mindplot.Topic = new Class({
|
||||
editor.show();
|
||||
},
|
||||
|
||||
|
||||
closeEditors : function() {
|
||||
this._textEditor.close(true);
|
||||
this._getTopicEditor().close(true);
|
||||
},
|
||||
|
||||
_getTopicEditor : function() {
|
||||
return mindplot.TopicEditor.getInstance();
|
||||
},
|
||||
|
||||
/**
|
||||
@ -821,7 +777,7 @@ mindplot.Topic = new Class({
|
||||
|
||||
getIncomingLines : function() {
|
||||
var result = [];
|
||||
var children = this._getChildren();
|
||||
var children = this.getChildren();
|
||||
for (var i = 0; i < children.length; i++) {
|
||||
var node = children[i];
|
||||
var line = node.getOutgoingLine();
|
||||
@ -841,7 +797,6 @@ mindplot.Topic = new Class({
|
||||
return result;
|
||||
},
|
||||
|
||||
|
||||
_updateConnectionLines : function() {
|
||||
// Update this to parent line ...
|
||||
var outgoingLine = this.getOutgoingLine();
|
||||
@ -925,20 +880,23 @@ mindplot.Topic = new Class({
|
||||
|
||||
if (this.getIncomingLines().length > 0) {
|
||||
var connector = this.getShrinkConnector();
|
||||
if ($defined(connector)) {
|
||||
connector.setVisibility(value);
|
||||
}
|
||||
}
|
||||
|
||||
var textShape = this.getTextShape();
|
||||
textShape.setVisibility(value);
|
||||
|
||||
textShape.setVisibility(this.getShapeType() != mindplot.model.TopicShape.IMAGE ? value : false);
|
||||
},
|
||||
|
||||
setOpacity : function(opacity) {
|
||||
var elem = this.get2DElement();
|
||||
elem.setOpacity(opacity);
|
||||
|
||||
this.getShrinkConnector().setOpacity(opacity);
|
||||
|
||||
var connector = this.getShrinkConnector();
|
||||
if ($defined(connector)) {
|
||||
connector.setOpacity(opacity);
|
||||
}
|
||||
var textShape = this.getTextShape();
|
||||
textShape.setOpacity(opacity);
|
||||
},
|
||||
@ -946,7 +904,7 @@ mindplot.Topic = new Class({
|
||||
_setChildrenVisibility : function(isVisible) {
|
||||
|
||||
// Hide all children.
|
||||
var children = this._getChildren();
|
||||
var children = this.getChildren();
|
||||
var model = this.getModel();
|
||||
|
||||
isVisible = isVisible ? !model.areChildrenShrunken() : isVisible;
|
||||
@ -997,7 +955,7 @@ mindplot.Topic = new Class({
|
||||
}
|
||||
},
|
||||
|
||||
_updatePositionOnChangeSize : function(oldSize, newSize) {
|
||||
_updatePositionOnChangeSize : function() {
|
||||
$assert(false, "this method must be overwrited.");
|
||||
},
|
||||
|
||||
@ -1036,11 +994,13 @@ mindplot.Topic = new Class({
|
||||
}
|
||||
|
||||
// Hide connection line?.
|
||||
if (targetTopic._getChildren().length == 0) {
|
||||
if (targetTopic.getChildren().length == 0) {
|
||||
var connector = targetTopic.getShrinkConnector();
|
||||
if ($defined(connector)) {
|
||||
connector.setVisibility(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
getOrder : function() {
|
||||
@ -1070,8 +1030,9 @@ mindplot.Topic = new Class({
|
||||
|
||||
// Create a connection line ...
|
||||
var outgoingLine = new mindplot.ConnectionLine(this, targetTopic);
|
||||
if ($defined(isVisible))
|
||||
if ($defined(isVisible)) {
|
||||
outgoingLine.setVisibility(isVisible);
|
||||
}
|
||||
this._outgoingLine = outgoingLine;
|
||||
workspace.appendChild(outgoingLine);
|
||||
|
||||
@ -1092,7 +1053,9 @@ mindplot.Topic = new Class({
|
||||
|
||||
// Display connection node...
|
||||
var connector = targetTopic.getShrinkConnector();
|
||||
if ($defined(connector)) {
|
||||
connector.setVisibility(true);
|
||||
}
|
||||
|
||||
// Redraw line ...
|
||||
outgoingLine.redraw();
|
||||
@ -1105,16 +1068,16 @@ mindplot.Topic = new Class({
|
||||
},
|
||||
|
||||
appendChild : function(child) {
|
||||
var children = this._getChildren();
|
||||
var children = this.getChildren();
|
||||
children.push(child);
|
||||
},
|
||||
|
||||
removeChild : function(child) {
|
||||
var children = this._getChildren();
|
||||
var children = this.getChildren();
|
||||
children.erase(child);
|
||||
},
|
||||
|
||||
_getChildren : function() {
|
||||
getChildren : function() {
|
||||
var result = this._children;
|
||||
if (!$defined(result)) {
|
||||
this._children = [];
|
||||
@ -1165,14 +1128,17 @@ mindplot.Topic = new Class({
|
||||
}
|
||||
|
||||
// If a drag node is create for it, let's hide the editor.
|
||||
this._textEditor.close();
|
||||
this._getTopicEditor().close();
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
_adjustShapes : function() {
|
||||
if (this._isInWorkspace) {
|
||||
|
||||
var textShape = this.getTextShape();
|
||||
if (this.getShapeType() != mindplot.model.TopicShape.IMAGE) {
|
||||
|
||||
var textWidth = textShape.getWidth();
|
||||
|
||||
var textHeight = textShape.getHeight();
|
||||
@ -1200,8 +1166,32 @@ mindplot.Topic = new Class({
|
||||
|
||||
// Position node ...
|
||||
textShape.setPosition(topicPadding + iconsWidth, topicPadding);
|
||||
} else {
|
||||
// In case of images, the size if fixed ...
|
||||
var size = this.getModel().getImageSize();
|
||||
this.setSize(size);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_flatten2DElements : function(topic) {
|
||||
var result = [];
|
||||
|
||||
var children = topic.getChildren();
|
||||
for (var i = 0; i < children.length; i++) {
|
||||
|
||||
var child = children[i];
|
||||
result.push(child);
|
||||
result.push(child.getOutgoingLine());
|
||||
|
||||
var relationships = child.getRelationships();
|
||||
result = result.concat(relationships);
|
||||
|
||||
var innerChilds = this._flatten2DElements(child);
|
||||
result = result.concat(innerChilds);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
66
mindplot/src/main/javascript/TopicEditor.js
Normal file
66
mindplot/src/main/javascript/TopicEditor.js
Normal file
@ -0,0 +1,66 @@
|
||||
/*
|
||||
* 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.TopicEditor = new Class({
|
||||
Extends: Events,
|
||||
Static: {
|
||||
_instance: null,
|
||||
|
||||
configure: function(options) {
|
||||
this._instance = new mindplot.TopicEditor();
|
||||
},
|
||||
|
||||
getInstance : function() {
|
||||
return this._instance;
|
||||
}
|
||||
},
|
||||
|
||||
initialize:function() {
|
||||
this._activeEditor = null;
|
||||
this._multilineEditor = new mindplot.MultilineTextEditor();
|
||||
},
|
||||
|
||||
close : function(update) {
|
||||
if (this.isVisible()) {
|
||||
this._activeEditor.close(update);
|
||||
this._activeEditor = null;
|
||||
}
|
||||
},
|
||||
|
||||
show : function(topic, options) {
|
||||
|
||||
// Close all previous open editor ....
|
||||
if (this.isVisible()) {
|
||||
this.close();
|
||||
}
|
||||
|
||||
// Open the new editor ...
|
||||
var model = topic.getModel();
|
||||
if (model.getShapeType() != mindplot.model.TopicShape.IMAGE) {
|
||||
this._multilineEditor.show(topic, options ? options.text : null);
|
||||
this._activeEditor = this._multilineEditor;
|
||||
} else {
|
||||
// To be implemented....
|
||||
}
|
||||
},
|
||||
|
||||
isVisible: function() {
|
||||
return this._activeEditor != null && this._activeEditor.isVisible();
|
||||
}
|
||||
});
|
||||
|
68
mindplot/src/main/javascript/TopicFeature.js
Normal file
68
mindplot/src/main/javascript/TopicFeature.js
Normal file
@ -0,0 +1,68 @@
|
||||
/*
|
||||
* 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.TopicFeature = {
|
||||
Icon: {
|
||||
id:mindplot.model.IconModel.FEATURE_TYPE,
|
||||
model: mindplot.model.IconModel,
|
||||
icon : mindplot.ImageIcon
|
||||
},
|
||||
|
||||
Link: {
|
||||
id: mindplot.model.LinkModel.FEATURE_TYPE,
|
||||
model: mindplot.model.LinkModel,
|
||||
icon : mindplot.LinkIcon
|
||||
},
|
||||
|
||||
Note: {
|
||||
id: mindplot.model.NoteModel.FEATURE_TYPE,
|
||||
model: mindplot.model.NoteModel,
|
||||
icon : mindplot.NoteIcon
|
||||
},
|
||||
|
||||
isSupported : function(id) {
|
||||
return mindplot.TopicFeature._featuresMetadataById.some(function(elem) {
|
||||
return elem.id == id;
|
||||
});
|
||||
},
|
||||
|
||||
createModel : function(id, topic, attributes) {
|
||||
$assert(id, 'type can not be null');
|
||||
$assert(topic, 'topic can not be null');
|
||||
$assert(attributes, 'attributes can not be null');
|
||||
|
||||
var model = mindplot.TopicFeature._featuresMetadataById.filter(function(elem) {
|
||||
return elem.id == id;
|
||||
})[0].model;
|
||||
return new model(topic, attributes);
|
||||
},
|
||||
|
||||
createIcon : function(topic, model) {
|
||||
$assert(topic, 'topic can not be null');
|
||||
$assert(model, 'model can not be null');
|
||||
|
||||
var icon = mindplot.TopicFeature._featuresMetadataById.filter(function(elem) {
|
||||
return elem.id == model.getType();
|
||||
})[0].icon;
|
||||
return new icon(topic, model);
|
||||
}
|
||||
};
|
||||
|
||||
mindplot.TopicFeature._featuresMetadataById = [mindplot.TopicFeature.Icon,mindplot.TopicFeature.Link,mindplot.TopicFeature.Note];
|
||||
|
||||
|
@ -16,23 +16,28 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
mindplot.commands.RemoveLinkFromTopicCommand = new Class({
|
||||
mindplot.commands.AddFeatureToTopicCommand = new Class({
|
||||
Extends:mindplot.Command,
|
||||
initialize: function(topicId) {
|
||||
initialize: function(topicId, featureType, attributes) {
|
||||
|
||||
$assert($defined(topicId), 'topicId can not be null');
|
||||
this._topicsIds = topicId;
|
||||
$assert(featureType, 'featureType can not be null');
|
||||
$assert(attributes, 'attributes can not be null');
|
||||
|
||||
this.parent();
|
||||
this._topicId = topicId;
|
||||
this._featureType = featureType;
|
||||
this._attributes = attributes;
|
||||
},
|
||||
|
||||
execute: function(commandContext) {
|
||||
var topic = commandContext.findTopics(this._topicsIds)[0];
|
||||
var model = topic.getModel();
|
||||
var links = model.getLinks()[0];
|
||||
this._text = links.getUrl();
|
||||
topic.removeLink();
|
||||
var topic = commandContext.findTopics(this._topicId)[0];
|
||||
var icon = topic.addFeature(this._featureType, this._attributes);
|
||||
this._featureModel = icon.getModel();
|
||||
},
|
||||
|
||||
undoExecute: function(commandContext) {
|
||||
var topic = commandContext.findTopics(this._topicsIds)[0];
|
||||
topic.addLink(this._url, commandContext._designer);
|
||||
var topic = commandContext.findTopics(this._topicId)[0];
|
||||
topic.removeFeature(this._featureModel);
|
||||
}
|
||||
});
|
@ -19,8 +19,9 @@ mindplot.commands.AddRelationshipCommand = new Class({
|
||||
Extends:mindplot.Command,
|
||||
initialize: function(model) {
|
||||
$assert(model, 'Relationship model can not be null');
|
||||
|
||||
this.parent();
|
||||
this._model = model;
|
||||
this._id = mindplot.Command._nextUUID();
|
||||
},
|
||||
execute: function(commandContext) {
|
||||
var relationship = commandContext.createRelationship(this._model);
|
||||
|
@ -16,53 +16,41 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
mindplot.commands.AddTopicCommand = new Class(
|
||||
{
|
||||
mindplot.commands.AddTopicCommand = new Class({
|
||||
Extends:mindplot.Command,
|
||||
initialize: function(model, parentTopicId, animated) {
|
||||
initialize: function(model, parentTopicId) {
|
||||
$assert(model, 'Model can not be null');
|
||||
|
||||
this.parent();
|
||||
this._model = model;
|
||||
this._parentId = parentTopicId;
|
||||
this._id = mindplot.Command._nextUUID();
|
||||
this._animated = $defined(animated) ? animated : false;
|
||||
},
|
||||
|
||||
execute: function(commandContext) {
|
||||
|
||||
// Add a new topic ...
|
||||
var topic = commandContext.createTopic(this._model, !this._animated);
|
||||
var topic = commandContext.createTopic(this._model, false);
|
||||
|
||||
// Connect to topic ...
|
||||
if ($defined(this._parentId)) {
|
||||
var parentTopic = commandContext.findTopics(this._parentId)[0];
|
||||
commandContext.connect(topic, parentTopic, !this._animated);
|
||||
commandContext.connect(topic, parentTopic);
|
||||
}
|
||||
|
||||
var doneFn = function() {
|
||||
// Finally, focus ...
|
||||
var designer = commandContext._designer;
|
||||
var fade = new mindplot.util.FadeEffect([topic,topic.getOutgoingLine()], true);
|
||||
fade.addEvent('complete', function() {
|
||||
designer.onObjectFocusEvent(topic);
|
||||
topic.setOnFocus(true);
|
||||
};
|
||||
|
||||
if (this._animated) {
|
||||
core.Utils.setVisibilityAnimated([topic,topic.getOutgoingLine()], true, doneFn);
|
||||
} else {
|
||||
doneFn.attempt();
|
||||
}
|
||||
});
|
||||
fade.start();
|
||||
},
|
||||
|
||||
undoExecute: function(commandContext) {
|
||||
// Finally, delete the topic from the workspace ...
|
||||
var topicId = this._model.getId();
|
||||
var topic = commandContext.findTopics(topicId)[0];
|
||||
var doneFn = function() {
|
||||
commandContext.deleteTopic(topic);
|
||||
};
|
||||
if (this._animated) {
|
||||
core.Utils.setVisibilityAnimated([topic,topic.getOutgoingLine()], false, doneFn);
|
||||
}
|
||||
else
|
||||
doneFn.attempt();
|
||||
}
|
||||
});
|
@ -16,23 +16,29 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
mindplot.commands.AddIconToTopicCommand = new Class({
|
||||
mindplot.commands.ChangeFeatureToTopicCommand = new Class({
|
||||
Extends:mindplot.Command,
|
||||
initialize: function(topicId, iconType) {
|
||||
initialize: function(topicId, featureId, attributes) {
|
||||
$assert($defined(topicId), 'topicId can not be null');
|
||||
$assert(iconType, 'iconType can not be null');
|
||||
this._topicsIds = topicId;
|
||||
this._iconType = iconType;
|
||||
$assert($defined(featureId), 'featureId can not be null');
|
||||
$assert($defined(attributes), 'attributes can not be null');
|
||||
|
||||
this.parent();
|
||||
this._topicId = topicId;
|
||||
this._featureId = featureId;
|
||||
this._attributes = attributes;
|
||||
},
|
||||
|
||||
execute: function(commandContext) {
|
||||
var topic = commandContext.findTopics(this._topicsIds)[0];
|
||||
var iconImg = topic.addIcon(this._iconType, commandContext._designer);
|
||||
this._iconModel = iconImg.getModel();
|
||||
var topic = commandContext.findTopics(this._topicId)[0];
|
||||
var feature = topic.findFeatureById(this._featureId);
|
||||
|
||||
var oldAttributes = feature.getAttributes();
|
||||
feature.setAttributes(this._attributes);
|
||||
this._attributes = oldAttributes;
|
||||
},
|
||||
|
||||
undoExecute: function(commandContext) {
|
||||
var topic = commandContext.findTopics(this._topicsIds)[0];
|
||||
topic.removeIcon(this._iconModel);
|
||||
this.execute(commandContext);
|
||||
}
|
||||
});
|
@ -1,48 +0,0 @@
|
||||
/*
|
||||
* 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.commands.ChangeLinkToTopicCommand = new Class({
|
||||
Extends:mindplot.Command,
|
||||
initialize: function(topicId, url) {
|
||||
$assert($defined(topicId), 'topicId can not be null');
|
||||
this._topicsIds = topicId;
|
||||
this._url = url;
|
||||
this._id = mindplot.Command._nextUUID();
|
||||
},
|
||||
|
||||
execute: function(commandContext) {
|
||||
var topic = commandContext.findTopics(this._topicsIds)[0];
|
||||
if (topic.hasLink()) {
|
||||
var model = topic.getModel();
|
||||
var link = model.getLinks()[0];
|
||||
this._oldUrl = link.getUrl();
|
||||
topic.removeLink();
|
||||
}
|
||||
topic.addLink(this._url);
|
||||
},
|
||||
|
||||
undoExecute: function(commandContext) {
|
||||
var topic = commandContext.findTopics(this._topicsIds)[0];
|
||||
if (this._oldtext) {
|
||||
topic.removeLink();
|
||||
topic.addLink(this._oldUrl);
|
||||
} else {
|
||||
topic.removeLink();
|
||||
}
|
||||
}
|
||||
});
|
@ -1,49 +0,0 @@
|
||||
/*
|
||||
* 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.commands.ChangeNoteToTopicCommand = new Class({
|
||||
Extends:mindplot.Command,
|
||||
initialize: function(topicId, text) {
|
||||
$assert($defined(topicId), 'topicId can not be null');
|
||||
this._topicsIds = topicId;
|
||||
this._text = text;
|
||||
this._oldtext = null;
|
||||
this._id = mindplot.Command._nextUUID();
|
||||
},
|
||||
|
||||
execute: function(commandContext) {
|
||||
var topic = commandContext.findTopics(this._topicsIds)[0];
|
||||
if (topic.hasNote()) {
|
||||
var model = topic.getModel();
|
||||
var notes = model.getNotes()[0];
|
||||
this._oldtext = notes.getText();
|
||||
topic.removeNote();
|
||||
}
|
||||
topic.addNote(this._text);
|
||||
},
|
||||
|
||||
undoExecute: function(commandContext) {
|
||||
var topic = commandContext.findTopics(this._topicsIds)[0];
|
||||
if (this._oldtext) {
|
||||
topic.removeNote();
|
||||
topic.addNote(this._oldtext);
|
||||
} else {
|
||||
topic.removeNote();
|
||||
}
|
||||
}
|
||||
});
|
@ -21,6 +21,7 @@ mindplot.commands.DeleteCommand = new Class({
|
||||
initialize: function(topicIds, relIds) {
|
||||
$assert($defined(topicIds), 'topicIds can not be null');
|
||||
|
||||
this.parent();
|
||||
this._relIds = relIds;
|
||||
this._topicIds = topicIds;
|
||||
this._deletedTopicModels = [];
|
||||
|
@ -25,6 +25,7 @@ mindplot.commands.DragTopicCommand = new Class({
|
||||
if ($defined(parentTopic))
|
||||
this._parentId = parentTopic.getId();
|
||||
|
||||
this.parent();
|
||||
this._position = position;
|
||||
this._order = order;
|
||||
this._id = mindplot.Command._nextUUID();
|
||||
@ -58,7 +59,7 @@ mindplot.commands.DragTopicCommand = new Class({
|
||||
// Set position ...
|
||||
topic.setPosition(this._position);
|
||||
} else {
|
||||
$assert("Illegal commnad state exception.");
|
||||
$assert("Illegal command state exception.");
|
||||
}
|
||||
|
||||
// Finally, connect topic ...
|
||||
|
@ -22,11 +22,11 @@ mindplot.commands.GenericFunctionCommand = new Class({
|
||||
$assert(commandFunc, "commandFunc must be defined");
|
||||
$assert($defined(topicsIds), "topicsIds must be defined");
|
||||
|
||||
this.parent();
|
||||
this._value = value;
|
||||
this._topicsIds = topicsIds;
|
||||
this._commandFunc = commandFunc;
|
||||
this._oldValues = [];
|
||||
this._id = mindplot.Command._nextUUID();
|
||||
},
|
||||
|
||||
execute: function(commandContext) {
|
||||
|
@ -21,6 +21,7 @@ mindplot.commands.MoveControlPointCommand = new Class({
|
||||
$assert(ctrlPointController, 'line can not be null');
|
||||
$assert($defined(point), 'point can not be null');
|
||||
|
||||
this.parent();
|
||||
this._ctrlPointControler = ctrlPointController;
|
||||
this._line = ctrlPointController._line;
|
||||
this._controlPoint = this._ctrlPointControler.getControlPoint(point).clone();
|
||||
@ -36,7 +37,6 @@ mindplot.commands.MoveControlPointCommand = new Class({
|
||||
this._endPoint = this._line.getLine().getTo().clone();
|
||||
break;
|
||||
}
|
||||
this._id = mindplot.Command._nextUUID();
|
||||
this._point = point;
|
||||
},
|
||||
|
||||
|
@ -16,21 +16,31 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
mindplot.commands.RemoveNoteFromTopicCommand = new Class({
|
||||
mindplot.commands.RemoveFeatureFromTopicCommand = new Class({
|
||||
Extends:mindplot.Command,
|
||||
initialize: function(topicId) {
|
||||
initialize: function(topicId, featureId) {
|
||||
$assert($defined(topicId), 'topicId can not be null');
|
||||
this._topicsIds = topicId;
|
||||
$assert(featureId, 'iconModel can not be null');
|
||||
|
||||
this.parent();
|
||||
this._topicId = topicId;
|
||||
this._featureId = featureId;
|
||||
this._oldFeature = null;
|
||||
},
|
||||
|
||||
execute: function(commandContext) {
|
||||
var topic = commandContext.findTopics(this._topicsIds)[0];
|
||||
var model = topic.getModel();
|
||||
var notes = model.getNotes()[0];
|
||||
this._text = notes.getText();
|
||||
topic.removeNote();
|
||||
var topic = commandContext.findTopics(this._topicId)[0];
|
||||
|
||||
var feature = topic.findFeatureById(this._featureId);
|
||||
topic.removeFeature(feature);
|
||||
this._oldFeature = feature;
|
||||
},
|
||||
|
||||
undoExecute: function(commandContext) {
|
||||
var topic = commandContext.findTopics(this._topicsIds)[0];
|
||||
topic.addNote(this._text, commandContext._designer);
|
||||
var topic = commandContext.findTopics(this._topicId)[0];
|
||||
|
||||
var feature = this._oldFeature;
|
||||
topic.addFeature(feature.getType(), feature.getAttributes());
|
||||
this._oldFeature = null;
|
||||
}
|
||||
});
|
@ -26,7 +26,11 @@ mindplot.widget = {};
|
||||
mindplot.model = {};
|
||||
mindplot.collaboration = {};
|
||||
mindplot.collaboration.framework = {};
|
||||
mindplot.collaboration.framework.brix = {};
|
||||
mindplot.collaboration.framework.brix.model = {};
|
||||
mindplot.persistence = {};
|
||||
|
||||
mindplot.layout = {};
|
||||
|
||||
Class.Mutators.Static = function(items){
|
||||
this.extend(items);
|
||||
};
|
||||
|
||||
|
@ -73,7 +73,7 @@ mindplot.layout.EventBusDispatcher = new Class({
|
||||
// (function() {
|
||||
this._layoutManager.layout(true);
|
||||
// console.log("---------");
|
||||
this._layoutManager.dump();
|
||||
// this._layoutManager.dump();
|
||||
// console.log("---------");
|
||||
// console.log("---------");
|
||||
// }).delay(0, this);
|
||||
|
@ -157,7 +157,8 @@ mindplot.layout.OriginalLayout = new Class({
|
||||
}, this);
|
||||
|
||||
if (!sibling.isFree() || overlappingOccurs) {
|
||||
this._treeSet.shiftBranchPosition(sibling, 0, node.getFreeDisplacement().y);
|
||||
var sAmount = node.getFreeDisplacement().y;
|
||||
this._treeSet.shiftBranchPosition(sibling, 0, sAmount);
|
||||
shiftedBranches.push(sibling);
|
||||
}
|
||||
}, this);
|
||||
@ -167,14 +168,9 @@ mindplot.layout.OriginalLayout = new Class({
|
||||
});
|
||||
|
||||
branchesToShift.forEach(function(branch) {
|
||||
var overlappingOccurs = shiftedBranches.some(function(shiftedBranch) {
|
||||
return this._branchesOverlap(shiftedBranch, branch, heightById);
|
||||
}, this);
|
||||
|
||||
if (overlappingOccurs) {
|
||||
this._treeSet.shiftBranchPosition(branch, 0, node.getFreeDisplacement().y);
|
||||
var bAmount = node.getFreeDisplacement().y;
|
||||
this._treeSet.shiftBranchPosition(branch, 0, bAmount);
|
||||
shiftedBranches.push(branch);
|
||||
}
|
||||
last = branch;
|
||||
},this);
|
||||
},
|
||||
|
@ -176,6 +176,10 @@ mindplot.layout.SymmetricSorter = new Class({
|
||||
|
||||
toString:function() {
|
||||
return "Symmetric Sorter";
|
||||
},
|
||||
|
||||
_getVerticalPadding: function() {
|
||||
return mindplot.layout.SymmetricSorter.INTERNODE_VERTICAL_PADDING;
|
||||
}
|
||||
});
|
||||
|
||||
|
76
mindplot/src/main/javascript/model/FeatureModel.js
Normal file
76
mindplot/src/main/javascript/model/FeatureModel.js
Normal file
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* 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.FeatureModel = new Class({
|
||||
initialize:function(type, topic) {
|
||||
$assert(type, 'type can not be null');
|
||||
$assert(topic, 'topic can not be null');
|
||||
|
||||
this._id = mindplot.model.FeatureModel._nextUUID();
|
||||
this._type = type;
|
||||
this._topic = topic;
|
||||
this._attributes = {};
|
||||
|
||||
// Create type method ...
|
||||
this['is' + type.camelCase() + 'Model'] = function() {
|
||||
return true;
|
||||
};
|
||||
},
|
||||
|
||||
getAttributes : function() {
|
||||
return Object.clone(this._attributes);
|
||||
},
|
||||
|
||||
setAttributes : function(attributes) {
|
||||
for (key in attributes) {
|
||||
this["set" + key.capitalize()](attributes[key]);
|
||||
}
|
||||
},
|
||||
|
||||
setAttribute : function(key, value) {
|
||||
$assert(key, 'key id can not be null');
|
||||
this._attributes[key] = value;
|
||||
},
|
||||
|
||||
getAttribute : function(key) {
|
||||
$assert(key, 'key id can not be null');
|
||||
|
||||
return this._attributes[key];
|
||||
},
|
||||
|
||||
getTopic : function() {
|
||||
return this._topic;
|
||||
},
|
||||
|
||||
getId : function() {
|
||||
return this._id;
|
||||
},
|
||||
|
||||
getType:function() {
|
||||
return this._type;
|
||||
}
|
||||
});
|
||||
|
||||
mindplot.model.FeatureModel._nextUUID = function() {
|
||||
if (!$defined(this._uuid)) {
|
||||
this._uuid = 0;
|
||||
}
|
||||
|
||||
this._uuid = this._uuid + 1;
|
||||
return this._uuid;
|
||||
};
|
@ -69,12 +69,12 @@ mindplot.model.INodeModel = new Class({
|
||||
return result;
|
||||
},
|
||||
|
||||
setSize : function(width, height) {
|
||||
this.putProperty('size', '{width:' + width + ',height:' + height + '}');
|
||||
setImageSize : function(width, height) {
|
||||
this.putProperty('imageSize', '{width:' + width + ',height:' + height + '}');
|
||||
},
|
||||
|
||||
getSize : function() {
|
||||
var value = this.getProperty('size');
|
||||
getImageSize : function() {
|
||||
var value = this.getProperty('imageSize');
|
||||
var result = null;
|
||||
if (value != null) {
|
||||
result = eval("(" + value + ")");
|
||||
@ -82,6 +82,24 @@ mindplot.model.INodeModel = new Class({
|
||||
return result;
|
||||
},
|
||||
|
||||
setImageUrl:function(url) {
|
||||
this.putProperty('imageUrl', url);
|
||||
|
||||
},
|
||||
|
||||
getMetadata:function() {
|
||||
return this.getProperty('metadata');
|
||||
},
|
||||
|
||||
setMetadata:function(json) {
|
||||
this.putProperty('metadata', json);
|
||||
|
||||
},
|
||||
|
||||
getImageUrl:function() {
|
||||
return this.getProperty('imageUrl');
|
||||
},
|
||||
|
||||
getMindmap : function() {
|
||||
return this._mindmap;
|
||||
},
|
||||
@ -239,58 +257,10 @@ mindplot.model.INodeModel = new Class({
|
||||
throw "Unsupported operation";
|
||||
},
|
||||
|
||||
createLink : function(url) {
|
||||
throw "Unsupported operation";
|
||||
},
|
||||
|
||||
addLink : function(link) {
|
||||
throw "Unsupported operation";
|
||||
},
|
||||
|
||||
createNote : function(text) {
|
||||
throw "Unsupported operation";
|
||||
},
|
||||
|
||||
addNote : function(note) {
|
||||
throw "Unsupported operation";
|
||||
},
|
||||
|
||||
removeNote : function(note) {
|
||||
throw "Unsupported operation";
|
||||
},
|
||||
|
||||
createIcon : function(iconType) {
|
||||
throw "Unsupported operation";
|
||||
},
|
||||
|
||||
addIcon : function(icon) {
|
||||
throw "Unsupported operation";
|
||||
},
|
||||
|
||||
removeIcon : function(icon) {
|
||||
throw "Unsupported operation";
|
||||
},
|
||||
|
||||
removeLastIcon : function() {
|
||||
throw "Unsupported operation";
|
||||
},
|
||||
|
||||
getChildren : function() {
|
||||
throw "Unsupported operation";
|
||||
},
|
||||
|
||||
getIcons : function() {
|
||||
throw "Unsupported operation";
|
||||
},
|
||||
|
||||
getLinks : function() {
|
||||
throw "Unsupported operation";
|
||||
},
|
||||
|
||||
getNotes : function() {
|
||||
throw "Unsupported operation";
|
||||
},
|
||||
|
||||
getParent : function() {
|
||||
throw "Unsupported operation";
|
||||
},
|
||||
@ -328,13 +298,19 @@ mindplot.model.INodeModel = new Class({
|
||||
}
|
||||
});
|
||||
|
||||
mindplot.model.TopicShape =
|
||||
{
|
||||
RECTANGLE : 'rectagle',
|
||||
ROUNDED_RECT : 'rounded rectagle',
|
||||
ELLIPSE : 'elipse',
|
||||
LINE : 'line',
|
||||
IMAGE : 'image'
|
||||
};
|
||||
|
||||
|
||||
mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE = 'CentralTopic';
|
||||
mindplot.model.INodeModel.MAIN_TOPIC_TYPE = 'MainTopic';
|
||||
|
||||
mindplot.model.INodeModel.SHAPE_TYPE_RECT = 'rectagle';
|
||||
mindplot.model.INodeModel.SHAPE_TYPE_ROUNDED_RECT = 'rounded rectagle';
|
||||
mindplot.model.INodeModel.SHAPE_TYPE_ELIPSE = 'elipse';
|
||||
mindplot.model.INodeModel.SHAPE_TYPE_LINE = 'line';
|
||||
|
||||
mindplot.model.INodeModel.MAIN_TOPIC_TO_MAIN_TOPIC_DISTANCE = 220;
|
||||
|
||||
|
@ -17,46 +17,19 @@
|
||||
*/
|
||||
|
||||
mindplot.model.IconModel = new Class({
|
||||
initialize:function(iconType, topic) {
|
||||
$assert(iconType, 'Icon id can not be null');
|
||||
$assert(topic, 'topic can not be null');
|
||||
|
||||
this._iconType = iconType;
|
||||
this._id = mindplot.model.IconModel._nextUUID();
|
||||
this._topic = topic;
|
||||
},
|
||||
|
||||
getId : function() {
|
||||
return this._id;
|
||||
Extends: mindplot.model.FeatureModel,
|
||||
initialize:function(topic, attributes) {
|
||||
this.parent(mindplot.model.IconModel.FEATURE_TYPE, topic);
|
||||
this.setIconType(attributes.id);
|
||||
},
|
||||
|
||||
getIconType : function() {
|
||||
return this._iconType;
|
||||
return this.getAttribute('id');
|
||||
},
|
||||
|
||||
|
||||
setIconType : function(iconType) {
|
||||
this._iconType = iconType;
|
||||
},
|
||||
|
||||
getTopic : function() {
|
||||
return this._topic;
|
||||
},
|
||||
|
||||
isIconModel : function() {
|
||||
return true;
|
||||
}});
|
||||
|
||||
|
||||
/**
|
||||
* @todo: This method must be implemented.
|
||||
*/
|
||||
mindplot.model.IconModel._nextUUID = function() {
|
||||
if (!$defined(this._uuid)) {
|
||||
this._uuid = 0;
|
||||
$assert(iconType, 'iconType id can not be null');
|
||||
this.setAttribute('id', iconType);
|
||||
}
|
||||
|
||||
this._uuid = this._uuid + 1;
|
||||
return this._uuid;
|
||||
};
|
||||
|
||||
});
|
||||
mindplot.model.IconModel.FEATURE_TYPE = "icon";
|
||||
|
@ -17,31 +17,27 @@
|
||||
*/
|
||||
|
||||
mindplot.model.LinkModel = new Class({
|
||||
initialize : function(url, topic) {
|
||||
$assert(url, 'url can not be null');
|
||||
$assert(topic, 'mindmap can not be null');
|
||||
this._topic = topic;
|
||||
this.setUrl(url);
|
||||
Extends: mindplot.model.FeatureModel,
|
||||
initialize : function(topic, attributes) {
|
||||
this.parent(mindplot.model.LinkModel.FEATURE_TYPE, topic);
|
||||
this.setUrl(attributes.url);
|
||||
},
|
||||
|
||||
getUrl : function() {
|
||||
return this._url;
|
||||
return this.getAttribute('url');
|
||||
},
|
||||
|
||||
setUrl : function(url) {
|
||||
$assert(url, 'url can not be null');
|
||||
this._url = this._fixUrl(url);
|
||||
this._type = this._url.contains('mailto:') ? 'mail' : 'url';
|
||||
|
||||
var fixedUrl = this._fixUrl(url);
|
||||
this.setAttribute('url', fixedUrl);
|
||||
|
||||
var type = fixedUrl.contains('mailto:') ? 'mail' : 'url';
|
||||
this.setAttribute('type', type);
|
||||
|
||||
},
|
||||
|
||||
getTopic : function() {
|
||||
return this._topic;
|
||||
},
|
||||
|
||||
isLinkModel : function() {
|
||||
return true;
|
||||
}
|
||||
,
|
||||
_fixUrl : function(url) {
|
||||
var result = url;
|
||||
if (!result.contains('http://') && !result.contains('https://') && !result.contains('mailto://')) {
|
||||
@ -50,3 +46,5 @@ mindplot.model.LinkModel = new Class({
|
||||
return result;
|
||||
}
|
||||
});
|
||||
|
||||
mindplot.model.LinkModel.FEATURE_TYPE = 'link';
|
@ -22,7 +22,7 @@ mindplot.model.Mindmap = new Class({
|
||||
this._branches = [];
|
||||
this._description = null;
|
||||
this._relationships = [];
|
||||
this._version = $defined(version) ? version : mindplot.ModelCodeName.TANGO;
|
||||
this._version = $defined(version) ? version : mindplot.persistence.ModelCodeName.TANGO;
|
||||
this._id = id;
|
||||
},
|
||||
|
||||
|
@ -27,12 +27,41 @@ mindplot.model.NodeModel = new Class({
|
||||
this.setId(id);
|
||||
this.setType(type);
|
||||
this.areChildrenShrunken(false);
|
||||
this.setSize(50, 20);
|
||||
|
||||
this._children = [];
|
||||
this._icons = [];
|
||||
this._links = [];
|
||||
this._notes = [];
|
||||
this._feature = [];
|
||||
},
|
||||
|
||||
createFeature: function(type, attributes) {
|
||||
return mindplot.TopicFeature.createModel(type, this, attributes);
|
||||
},
|
||||
|
||||
addFeature: function(feature) {
|
||||
$assert(feature, 'feature can not be null');
|
||||
this._feature.push(feature);
|
||||
},
|
||||
|
||||
getFeatures: function() {
|
||||
return this._feature;
|
||||
},
|
||||
|
||||
removeFeature: function(feature) {
|
||||
$assert(feature, 'feature can not be null');
|
||||
this._feature.erase(feature);
|
||||
},
|
||||
|
||||
findFeatureByType : function(type) {
|
||||
$assert(type, 'type can not be null');
|
||||
return this._feature.filter(function(feature) {
|
||||
return feature.getType() == type;
|
||||
});
|
||||
},
|
||||
|
||||
findFeatureById : function(id) {
|
||||
$assert($defined(id), 'id can not be null');
|
||||
return this._feature.filter(function(feature) {
|
||||
return feature.getId() == id;
|
||||
})[0];
|
||||
},
|
||||
|
||||
getPropertiesKeys : function() {
|
||||
@ -64,67 +93,10 @@ mindplot.model.NodeModel = new Class({
|
||||
});
|
||||
|
||||
result._properties = Object.clone(this._properties);
|
||||
result._icons = this._icons.clone();
|
||||
result._links = this._links.clone();
|
||||
result._notes = this._notes.clone();
|
||||
result._feature = this._feature.clone();
|
||||
return result;
|
||||
},
|
||||
|
||||
addChildren : function() {
|
||||
$assert(child && child.isNodeModel(), 'Only NodeModel can be appended to Mindmap object');
|
||||
this._children.push(child);
|
||||
child._parent = this;
|
||||
},
|
||||
|
||||
createLink : function(url) {
|
||||
$assert(url, 'Link URL must be specified.');
|
||||
return new mindplot.model.LinkModel(url, this);
|
||||
},
|
||||
|
||||
addLink : function(link) {
|
||||
$assert(link && link.isLinkModel(), 'Only LinkModel can be appended to Mindmap object as links');
|
||||
this._links.push(link);
|
||||
},
|
||||
|
||||
_removeLink : function(link) {
|
||||
$assert(link && link.isLinkModel(), 'Only LinkModel can be appended to Mindmap object as links');
|
||||
this._links.erase(link);
|
||||
},
|
||||
|
||||
createNote : function(text) {
|
||||
$assert(text != null, 'note text must be specified.');
|
||||
return new mindplot.model.NoteModel(text, this);
|
||||
},
|
||||
|
||||
addNote : function(note) {
|
||||
$assert(note && note.isNoteModel(), 'Only NoteModel can be appended to Mindmap object as links');
|
||||
this._notes.push(note);
|
||||
},
|
||||
|
||||
removeNote : function(note) {
|
||||
$assert(note && note.isNoteModel(), 'Only NoteModel can be appended to Mindmap object as links');
|
||||
this._notes.erase(note);
|
||||
},
|
||||
|
||||
createIcon : function(iconType) {
|
||||
$assert(iconType, 'IconType must be specified.');
|
||||
return new mindplot.model.IconModel(iconType, this);
|
||||
},
|
||||
|
||||
addIcon : function(icon) {
|
||||
$assert(icon && icon.isIconModel(), 'Only IconModel can be appended to Mindmap object as icons');
|
||||
this._icons.push(icon);
|
||||
},
|
||||
|
||||
removeIcon : function(icon) {
|
||||
$assert(icon && icon.isIconModel(), 'Only IconModel can be appended to Mindmap object as icons');
|
||||
this._icons.erase(icon);
|
||||
},
|
||||
|
||||
removeLastIcon : function() {
|
||||
this._icons.pop();
|
||||
},
|
||||
|
||||
appendChild : function(child) {
|
||||
$assert(child && child.isNodeModel(), 'Only NodeModel can be appended to Mindmap object');
|
||||
this._children.push(child);
|
||||
@ -141,18 +113,6 @@ mindplot.model.NodeModel = new Class({
|
||||
return this._children;
|
||||
},
|
||||
|
||||
getIcons : function() {
|
||||
return this._icons;
|
||||
},
|
||||
|
||||
getLinks : function() {
|
||||
return this._links;
|
||||
},
|
||||
|
||||
getNotes : function() {
|
||||
return this._notes;
|
||||
},
|
||||
|
||||
getParent : function() {
|
||||
return this._parent;
|
||||
},
|
||||
@ -162,10 +122,12 @@ mindplot.model.NodeModel = new Class({
|
||||
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(sourcePosition, 'childPosition 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.
|
||||
var targetModel = this;
|
||||
@ -174,8 +136,7 @@ mindplot.model.NodeModel = new Class({
|
||||
var result = false;
|
||||
|
||||
if (sourceModel.getType() == mindplot.model.INodeModel.MAIN_TOPIC_TYPE) {
|
||||
// Finally, check current node ubication.
|
||||
var targetTopicSize = targetModel.getSize();
|
||||
// Finally, check current node position ...
|
||||
var yDistance = Math.abs(sourcePosition.y - targetPosition.y);
|
||||
var gap = 35 + targetTopicHeight / 2;
|
||||
if (targetModel.getChildren().length > 0) {
|
||||
|
@ -17,26 +17,20 @@
|
||||
*/
|
||||
|
||||
mindplot.model.NoteModel = new Class({
|
||||
initialize : function(text, topic) {
|
||||
$assert(text, 'text text can not be null');
|
||||
$assert(topic, 'topic can not be null');
|
||||
this._text = text;
|
||||
this._topic = topic;
|
||||
Extends: mindplot.model.FeatureModel,
|
||||
initialize : function(topic, attributes) {
|
||||
this.parent(mindplot.model.NoteModel.FEATURE_TYPE, topic);
|
||||
this.setText(attributes.text);
|
||||
},
|
||||
|
||||
getText:function() {
|
||||
return this._text;
|
||||
return this.getAttribute('text');
|
||||
},
|
||||
|
||||
setText : function(text) {
|
||||
this._text = text;
|
||||
},
|
||||
|
||||
getTopic : function() {
|
||||
return this._topic;
|
||||
},
|
||||
|
||||
isNoteModel : function() {
|
||||
return true;
|
||||
$assert(text, 'text can not be null');
|
||||
this.setAttribute('text', text);
|
||||
}
|
||||
});
|
||||
|
||||
mindplot.model.NoteModel.FEATURE_TYPE = "note";
|
||||
|
@ -15,10 +15,10 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
mindplot.Beta2PelaMigrator = new Class({
|
||||
mindplot.persistence.Beta2PelaMigrator = new Class({
|
||||
initialize : function(betaSerializer) {
|
||||
this._betaSerializer = betaSerializer;
|
||||
this._pelaSerializer = new mindplot.XMLMindmapSerializer_Pela();
|
||||
this._pelaSerializer = new mindplot.persistence.XMLSerializer_Pela();
|
||||
},
|
||||
|
||||
toXML : function(mindmap) {
|
||||
@ -28,7 +28,7 @@ mindplot.Beta2PelaMigrator = new Class({
|
||||
loadFromDom : function(dom, mapId) {
|
||||
$assert($defined(mapId), "mapId can not be null");
|
||||
var mindmap = this._betaSerializer.loadFromDom(dom, mapId);
|
||||
mindmap.setVersion(mindplot.ModelCodeName.PELA);
|
||||
mindmap.setVersion(mindplot.persistence.ModelCodeName.PELA);
|
||||
return mindmap;
|
||||
}
|
||||
});
|
@ -15,7 +15,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
mindplot.ModelCodeName = {
|
||||
mindplot.persistence.ModelCodeName = {
|
||||
BETA : "beta",
|
||||
PELA : "pela",
|
||||
TANGO : "tango"
|
@ -15,10 +15,10 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
mindplot.Pela2TangoMigrator = new Class({
|
||||
mindplot.persistence.Pela2TangoMigrator = new Class({
|
||||
initialize : function(pelaSerializer) {
|
||||
this._pelaSerializer = pelaSerializer;
|
||||
this._tangoSerializer = new mindplot.XMLMindmapSerializer_Tango();
|
||||
this._tangoSerializer = new mindplot.persistence.XMLSerializer_Tango();
|
||||
},
|
||||
|
||||
toXML : function(mindmap) {
|
||||
@ -28,7 +28,7 @@ mindplot.Pela2TangoMigrator = new Class({
|
||||
loadFromDom : function(dom, mapId) {
|
||||
$assert($defined(mapId), "mapId can not be null");
|
||||
var mindmap = this._pelaSerializer.loadFromDom(dom, mapId);
|
||||
mindmap.setVersion(mindplot.ModelCodeName.TANGO);
|
||||
mindmap.setVersion(mindplot.persistence.ModelCodeName.TANGO);
|
||||
this._fixOrder(mindmap);
|
||||
return mindmap;
|
||||
},
|
@ -15,23 +15,23 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
mindplot.XMLMindmapSerializerFactory = {};
|
||||
mindplot.persistence.XMLSerializerFactory = {};
|
||||
|
||||
mindplot.XMLMindmapSerializerFactory.getSerializerFromMindmap = function(mindmap) {
|
||||
return mindplot.XMLMindmapSerializerFactory.getSerializer(mindmap.getVersion());
|
||||
mindplot.persistence.XMLSerializerFactory.getSerializerFromMindmap = function(mindmap) {
|
||||
return mindplot.persistence.XMLSerializerFactory.getSerializer(mindmap.getVersion());
|
||||
};
|
||||
|
||||
mindplot.XMLMindmapSerializerFactory.getSerializerFromDocument = function(domDocument) {
|
||||
mindplot.persistence.XMLSerializerFactory.getSerializerFromDocument = function(domDocument) {
|
||||
var rootElem = domDocument.documentElement;
|
||||
return mindplot.XMLMindmapSerializerFactory.getSerializer(rootElem.getAttribute("version"))
|
||||
return mindplot.persistence.XMLSerializerFactory.getSerializer(rootElem.getAttribute("version"))
|
||||
};
|
||||
|
||||
|
||||
mindplot.XMLMindmapSerializerFactory.getSerializer = function(version) {
|
||||
mindplot.persistence.XMLSerializerFactory.getSerializer = function(version) {
|
||||
if (!$defined(version)) {
|
||||
version = mindplot.ModelCodeName.BETA;
|
||||
version = mindplot.persistence.ModelCodeName.BETA;
|
||||
}
|
||||
var codeNames = mindplot.XMLMindmapSerializerFactory._codeNames;
|
||||
var codeNames = mindplot.persistence.XMLSerializerFactory._codeNames;
|
||||
var found = false;
|
||||
var serializer = null;
|
||||
for (var i = 0; i < codeNames.length; i++) {
|
||||
@ -48,22 +48,22 @@ mindplot.XMLMindmapSerializerFactory.getSerializer = function(version) {
|
||||
return serializer;
|
||||
};
|
||||
|
||||
mindplot.XMLMindmapSerializerFactory._codeNames =
|
||||
mindplot.persistence.XMLSerializerFactory._codeNames =
|
||||
[
|
||||
{
|
||||
codeName:mindplot.ModelCodeName.BETA,
|
||||
serializer: mindplot.XMLMindmapSerializer_Beta,
|
||||
codeName:mindplot.persistence.ModelCodeName.BETA,
|
||||
serializer: mindplot.persistence.XMLSerializer_Beta,
|
||||
migrator:function() {
|
||||
}
|
||||
},
|
||||
{
|
||||
codeName:mindplot.ModelCodeName.PELA,
|
||||
serializer:mindplot.XMLMindmapSerializer_Pela,
|
||||
migrator:mindplot.Beta2PelaMigrator
|
||||
codeName:mindplot.persistence.ModelCodeName.PELA,
|
||||
serializer:mindplot.persistence.XMLSerializer_Pela,
|
||||
migrator:mindplot.persistence.Beta2PelaMigrator
|
||||
},
|
||||
{
|
||||
codeName:mindplot.ModelCodeName.TANGO,
|
||||
serializer:mindplot.XMLMindmapSerializer_Tango,
|
||||
migrator:mindplot.Pela2TangoMigrator
|
||||
codeName:mindplot.persistence.ModelCodeName.TANGO,
|
||||
serializer:mindplot.persistence.XMLSerializer_Tango,
|
||||
migrator:mindplot.persistence.Pela2TangoMigrator
|
||||
}
|
||||
];
|
@ -14,7 +14,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
mindplot.XMLMindmapSerializer_Beta = new Class({
|
||||
mindplot.persistence.XMLSerializer_Beta = new Class({
|
||||
|
||||
toXML : function(mindmap) {
|
||||
$assert(mindmap, "Can not save a null mindmap");
|
||||
@ -164,11 +164,11 @@ mindplot.XMLMindmapSerializer_Beta = new Class({
|
||||
var rootElem = dom.documentElement;
|
||||
|
||||
// Is a wisemap?.
|
||||
$assert(rootElem.tagName == mindplot.XMLMindmapSerializer_Beta.MAP_ROOT_NODE, "This seem not to be a map document.");
|
||||
$assert(rootElem.tagName == mindplot.persistence.XMLSerializer_Beta.MAP_ROOT_NODE, "This seem not to be a map document.");
|
||||
|
||||
// Start the loading process ...
|
||||
var version = rootElem.getAttribute("version");
|
||||
version = !$defined(version) ? mindplot.ModelCodeName.BETA : version;
|
||||
version = !$defined(version) ? mindplot.persistence.ModelCodeName.BETA : version;
|
||||
var mindmap = new mindplot.model.Mindmap(mapId, version);
|
||||
|
||||
var children = rootElem.childNodes;
|
||||
@ -260,13 +260,13 @@ mindplot.XMLMindmapSerializer_Beta = new Class({
|
||||
childTopic.connectTo(topic);
|
||||
} else if (child.tagName == "icon") {
|
||||
var icon = this._deserializeIcon(child, topic);
|
||||
topic.addIcon(icon);
|
||||
topic.addFeature(icon);
|
||||
} else if (child.tagName == "link") {
|
||||
var link = this._deserializeLink(child, topic);
|
||||
topic.addLink(link);
|
||||
topic.addFeature(link);
|
||||
} else if (child.tagName == "note") {
|
||||
var note = this._deserializeNote(child, topic);
|
||||
topic.addNote(note);
|
||||
topic.addFeature(note);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -277,15 +277,15 @@ mindplot.XMLMindmapSerializer_Beta = new Class({
|
||||
_deserializeIcon : function(domElem, topic) {
|
||||
var icon = domElem.getAttribute("id");
|
||||
icon = icon.replace("images/", "icons/legacy/");
|
||||
return topic.createIcon(icon);
|
||||
return mindplot.TopicFeature.createModel(mindplot.TopicFeature.Icon.id, topic, {id:icon});
|
||||
},
|
||||
|
||||
_deserializeLink : function(domElem, topic) {
|
||||
return topic.createLink(domElem.getAttribute("url"));
|
||||
return mindplot.TopicFeature.createModel(mindplot.TopicFeature.Link.id, topic, {url:domElem.getAttribute("url")});
|
||||
},
|
||||
|
||||
_deserializeNote : function(domElem, topic) {
|
||||
return topic.createNote(domElem.getAttribute("text"));
|
||||
return mindplot.TopicFeature.createModel(mindplot.TopicFeature.Note.id, topic, {text:domElem.getAttribute("url")});
|
||||
}});
|
||||
|
||||
mindplot.XMLMindmapSerializer_Beta.MAP_ROOT_NODE = 'map';
|
||||
mindplot.persistence.XMLSerializer_Beta.MAP_ROOT_NODE = 'map';
|
@ -16,7 +16,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
mindplot.XMLMindmapSerializer_Pela = new Class({
|
||||
mindplot.persistence.XMLSerializer_Pela = new Class({
|
||||
|
||||
toXML : function(mindmap) {
|
||||
$assert(mindmap, "Can not save a null mindmap");
|
||||
@ -47,8 +47,6 @@ mindplot.XMLMindmapSerializer_Pela = new Class({
|
||||
// Create Relationships
|
||||
var relationships = mindmap.getRelationships();
|
||||
if (relationships.length > 0) {
|
||||
// var relationshipDom=document.createElement("relationships");
|
||||
// mapElem.appendChild(relationshipDom);
|
||||
for (var j = 0; j < relationships.length; j++) {
|
||||
var relationDom = this._relationshipToXML(document, relationships[j]);
|
||||
mapElem.appendChild(relationDom);
|
||||
@ -82,6 +80,11 @@ mindplot.XMLMindmapSerializer_Pela = new Class({
|
||||
var shape = topic.getShapeType();
|
||||
if ($defined(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()) {
|
||||
@ -124,60 +127,43 @@ mindplot.XMLMindmapSerializer_Pela = new Class({
|
||||
parentTopic.setAttribute('brColor', brColor);
|
||||
}
|
||||
|
||||
//ICONS
|
||||
var icons = topic.getIcons();
|
||||
for (var i = 0; i < icons.length; i++) {
|
||||
var icon = icons[i];
|
||||
var iconDom = this._iconToXML(document, icon);
|
||||
parentTopic.appendChild(iconDom);
|
||||
var metadata = topic.getMetadata();
|
||||
if ($defined(metadata)) {
|
||||
parentTopic.setAttribute('metadata', metadata);
|
||||
}
|
||||
|
||||
//LINKS
|
||||
var links = topic.getLinks();
|
||||
for (var i = 0; i < links.length; i++) {
|
||||
var link = links[i];
|
||||
var linkDom = this._linkToXML(document, link);
|
||||
parentTopic.appendChild(linkDom);
|
||||
}
|
||||
// Serialize features ...
|
||||
var features = topic.getFeatures();
|
||||
for (var i = 0; i < features.length; i++) {
|
||||
var feature = features[i];
|
||||
|
||||
var notes = topic.getNotes();
|
||||
for (var i = 0; i < notes.length; i++) {
|
||||
var note = notes[i];
|
||||
var noteDom = this._noteToXML(document, note);
|
||||
parentTopic.appendChild(noteDom);
|
||||
var featureType = feature.getType();
|
||||
var featureDom = document.createElement(featureType);
|
||||
var attributes = feature.getAttributes();
|
||||
|
||||
for (var key in attributes) {
|
||||
var value = attributes[key];
|
||||
if (key == 'text') {
|
||||
var cdata = document.createCDATASection(value);
|
||||
featureDom.appendChild(cdata);
|
||||
} else {
|
||||
featureDom.setAttribute(key, value);
|
||||
}
|
||||
}
|
||||
parentTopic.appendChild(featureDom);
|
||||
}
|
||||
|
||||
//CHILDREN TOPICS
|
||||
var childTopics = topic.getChildren();
|
||||
for (var i = 0; i < childTopics.length; i++) {
|
||||
var childTopic = childTopics[i];
|
||||
for (var j = 0; j < childTopics.length; j++) {
|
||||
var childTopic = childTopics[j];
|
||||
var childDom = this._topicToXML(document, childTopic);
|
||||
parentTopic.appendChild(childDom);
|
||||
|
||||
}
|
||||
|
||||
return parentTopic;
|
||||
},
|
||||
|
||||
_iconToXML : function(document, icon) {
|
||||
var iconDom = document.createElement("icon");
|
||||
iconDom.setAttribute('id', icon.getIconType());
|
||||
return iconDom;
|
||||
},
|
||||
|
||||
_linkToXML : function(document, link) {
|
||||
var linkDom = document.createElement("link");
|
||||
linkDom.setAttribute('url', link.getUrl());
|
||||
return linkDom;
|
||||
},
|
||||
|
||||
_noteToXML : function(document, note) {
|
||||
var noteDom = document.createElement("note");
|
||||
var cdata = document.createCDATASection(note.getText());
|
||||
noteDom.appendChild(cdata);
|
||||
return noteDom;
|
||||
},
|
||||
|
||||
_noteTextToXML : function(document, elem, text) {
|
||||
if (text.indexOf('\n') == -1) {
|
||||
elem.setAttribute('text', text);
|
||||
@ -217,7 +203,7 @@ mindplot.XMLMindmapSerializer_Pela = new Class({
|
||||
var rootElem = dom.documentElement;
|
||||
|
||||
// Is a wisemap?.
|
||||
$assert(rootElem.tagName == mindplot.XMLMindmapSerializer_Pela.MAP_ROOT_NODE, "This seem not to be a map document.");
|
||||
$assert(rootElem.tagName == mindplot.persistence.XMLSerializer_Pela.MAP_ROOT_NODE, "This seem not to be a map document.");
|
||||
|
||||
this._idsMap = new Hash();
|
||||
// Start the loading process ...
|
||||
@ -262,25 +248,24 @@ mindplot.XMLMindmapSerializer_Pela = new Class({
|
||||
}
|
||||
|
||||
var topic = mindmap.createNode(type, id);
|
||||
|
||||
var text = domElem.getAttribute('text');
|
||||
if ($defined(text)) {
|
||||
topic.setText(text);
|
||||
}
|
||||
|
||||
var order = domElem.getAttribute('order');
|
||||
if ($defined(order)) {
|
||||
topic.setOrder(parseInt(order));
|
||||
}
|
||||
|
||||
var shape = domElem.getAttribute('shape');
|
||||
if ($defined(shape)) {
|
||||
topic.setShapeType(shape);
|
||||
}
|
||||
|
||||
var isShrink = domElem.getAttribute('shrink');
|
||||
if ($defined(isShrink)) {
|
||||
topic.setChildrenShrunken(isShrink);
|
||||
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');
|
||||
@ -318,51 +303,66 @@ mindplot.XMLMindmapSerializer_Pela = new Class({
|
||||
topic.setBorderColor(borderColor);
|
||||
}
|
||||
|
||||
var order = domElem.getAttribute('order');
|
||||
if ($defined(order)) {
|
||||
topic.setOrder(parseInt(order));
|
||||
}
|
||||
|
||||
var isShrink = domElem.getAttribute('shrink');
|
||||
if ($defined(isShrink)) {
|
||||
topic.setChildrenShrunken(isShrink);
|
||||
}
|
||||
|
||||
var position = domElem.getAttribute('position');
|
||||
if ($defined(position)) {
|
||||
var pos = position.split(',');
|
||||
topic.setPosition(pos[0], pos[1]);
|
||||
}
|
||||
|
||||
var metadata = domElem.getAttribute('metadata');
|
||||
if ($defined(metadata)) {
|
||||
topic.setMetadata(metadata);
|
||||
}
|
||||
|
||||
//Creating icons and children nodes
|
||||
var children = domElem.childNodes;
|
||||
for (var i = 0; i < children.length; i++) {
|
||||
var child = children[i];
|
||||
if (child.nodeType == Node.ELEMENT_NODE) {
|
||||
$assert(child.tagName == "topic" || child.tagName == "icon" || child.tagName == "link" || child.tagName == "note" || child.tagName == "text", 'Illegal node type:' + child.tagName);
|
||||
if (child.tagName == "topic") {
|
||||
var childTopic = this._deserializeNode(child, mindmap);
|
||||
childTopic.connectTo(topic);
|
||||
} else if (child.tagName == "icon") {
|
||||
var icon = this._deserializeIcon(child, topic);
|
||||
topic.addIcon(icon);
|
||||
} else if (child.tagName == "link") {
|
||||
var link = this._deserializeLink(child, topic);
|
||||
topic.addLink(link);
|
||||
} else if (child.tagName == "note") {
|
||||
var note = this._deserializeNote(child, topic);
|
||||
topic.addNote(note);
|
||||
} else if (mindplot.TopicFeature.isSupported(child.tagName)) {
|
||||
|
||||
// Load attributes ...
|
||||
var namedNodeMap = child.attributes;
|
||||
var attributes = {};
|
||||
for (var j = 0; j < namedNodeMap.length; j++) {
|
||||
var attribute = namedNodeMap.item(j);
|
||||
attributes[attribute.name] = attribute.value;
|
||||
}
|
||||
|
||||
// Has text node ?.
|
||||
var textAttr = this._deserializeTextAttr(child);
|
||||
if (textAttr) {
|
||||
attributes['text'] = textAttr;
|
||||
}
|
||||
|
||||
// Create a new element ....
|
||||
var featureType = child.tagName;
|
||||
var feature = mindplot.TopicFeature.createModel(featureType, topic, attributes);
|
||||
topic.addFeature(feature);
|
||||
|
||||
} else if (child.tagName == "text") {
|
||||
var nodeText = this._deserializeNodeText(child);
|
||||
topic.setText(nodeText);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return topic;
|
||||
},
|
||||
|
||||
_deserializeIcon : function(domElem, topic) {
|
||||
var icon = domElem.getAttribute("id");
|
||||
icon = icon.replace("images/", "icons/legacy/");
|
||||
return topic.createIcon(icon);
|
||||
},
|
||||
|
||||
_deserializeLink : function(domElem, topic) {
|
||||
return topic.createLink(domElem.getAttribute("url"));
|
||||
},
|
||||
|
||||
_deserializeNote : function(domElem, topic) {
|
||||
_deserializeTextAttr : function(domElem) {
|
||||
var value = domElem.getAttribute("text");
|
||||
if (!$defined(value)) {
|
||||
var children = domElem.childNodes;
|
||||
@ -373,11 +373,10 @@ mindplot.XMLMindmapSerializer_Pela = new Class({
|
||||
}
|
||||
}
|
||||
}
|
||||
return topic.createNote(value);
|
||||
return value;
|
||||
},
|
||||
|
||||
_deserializeNodeText: function(domElem) {
|
||||
|
||||
var children = domElem.childNodes;
|
||||
var value = null;
|
||||
for (var i = 0; i < children.length; i++) {
|
||||
@ -415,4 +414,4 @@ mindplot.XMLMindmapSerializer_Pela = new Class({
|
||||
}
|
||||
});
|
||||
|
||||
mindplot.XMLMindmapSerializer_Pela.MAP_ROOT_NODE = 'map';
|
||||
mindplot.persistence.XMLSerializer_Pela.MAP_ROOT_NODE = 'map';
|
@ -16,6 +16,6 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
mindplot.XMLMindmapSerializer_Tango = new Class({
|
||||
Extends: mindplot.XMLMindmapSerializer_Pela
|
||||
mindplot.persistence.XMLSerializer_Tango = new Class({
|
||||
Extends: mindplot.persistence.XMLSerializer_Pela
|
||||
});
|
@ -16,24 +16,35 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
mindplot.commands.RemoveIconFromTopicCommand = new Class({
|
||||
Extends:mindplot.Command,
|
||||
initialize: function(topicIds, iconModel) {
|
||||
$assert($defined(topicIds), 'topicIds can not be null');
|
||||
$assert(iconModel, 'iconModel can not be null');
|
||||
this._topicsIds = topicIds;
|
||||
this._iconModel = iconModel;
|
||||
},
|
||||
mindplot.util.FadeEffect = new Class({
|
||||
Extends: Fx,
|
||||
initialize: function(elements, isVisible) {
|
||||
this.parent({duration:3000,frames:15,transition:'linear'});
|
||||
this._isVisible = isVisible;
|
||||
this._element = elements;
|
||||
|
||||
execute: function(commandContext) {
|
||||
var topic = commandContext.findTopics(this._topicsIds)[0];
|
||||
topic.removeIcon(this._iconModel);
|
||||
},
|
||||
|
||||
undoExecute: function(commandContext) {
|
||||
var topic = commandContext.findTopics(this._topicsIds)[0];
|
||||
var iconType = this._iconModel.getIconType();
|
||||
var iconImg = topic.addIcon(iconType, commandContext._designer);
|
||||
this._iconModel = iconImg.getModel();
|
||||
this.addEvent('complete', function() {
|
||||
this._element.forEach(function(elem) {
|
||||
if(elem){
|
||||
elem.setVisibility(isVisible);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
start: function(){
|
||||
this.parent(this._isVisible ? 0 : 1, this._isVisible ? 1 : 0);
|
||||
},
|
||||
|
||||
set: function(now) {
|
||||
this._element.forEach(function(elem) {
|
||||
if(elem){
|
||||
elem.setOpacity(now);
|
||||
}
|
||||
});
|
||||
return this;
|
||||
}
|
||||
});
|
||||
|
@ -22,7 +22,7 @@ mindplot.widget.ColorPalettePanel = new Class({
|
||||
initialize : function(buttonId, model, baseUrl) {
|
||||
this._baseUrl = baseUrl;
|
||||
this.parent(buttonId, model);
|
||||
$assert(baseUrl, "baseUrl can not be null");
|
||||
$assert($defined(baseUrl), "baseUrl can not be null");
|
||||
},
|
||||
|
||||
_load : function() {
|
||||
|
@ -34,6 +34,12 @@ mindplot.widget.IMenu = new Class({
|
||||
});
|
||||
},
|
||||
|
||||
discard: function() {
|
||||
var persistenceManager = mindplot.PersistenceManager.getInstance();
|
||||
var mindmap = designer.getMindmap();
|
||||
persistenceManager.discard(mindmap.getId());
|
||||
},
|
||||
|
||||
save:function (saveElem, designer, saveHistory) {
|
||||
// Load map content ...
|
||||
var mindmap = designer.getMindmap();
|
||||
@ -59,9 +65,9 @@ mindplot.widget.IMenu = new Class({
|
||||
onError: function() {
|
||||
if (saveHistory) {
|
||||
saveElem.setStyle('cursor', 'pointer');
|
||||
$notify("Save could not be completed. Try latter");
|
||||
$notify("Save could not be completed. Try latter.");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
});
|
@ -19,10 +19,11 @@
|
||||
mindplot.widget.Menu = new Class({
|
||||
Extends: mindplot.widget.IMenu,
|
||||
|
||||
initialize : function(designer, containerId, mapId, readOnly) {
|
||||
initialize : function(designer, containerId, mapId, readOnly, baseUrl) {
|
||||
this.parent(designer, containerId, mapId);
|
||||
|
||||
var baseUrl = "../css/widget";
|
||||
baseUrl = !$defined(baseUrl) ? "" : baseUrl;
|
||||
var widgetsBaseUrl = baseUrl + "css/widget";
|
||||
|
||||
// Stop event propagation ...
|
||||
$(this._containerId).addEvent('click', function(event) {
|
||||
@ -130,7 +131,7 @@ mindplot.widget.Menu = new Class({
|
||||
designer.changeBackgroundColor(hex);
|
||||
}
|
||||
};
|
||||
this._toolbarElems.push(new mindplot.widget.ColorPalettePanel('topicColor', topicColorModel, baseUrl));
|
||||
this._toolbarElems.push(new mindplot.widget.ColorPalettePanel('topicColor', topicColorModel, widgetsBaseUrl));
|
||||
|
||||
// Border color item ...
|
||||
var borderColorModel =
|
||||
@ -152,7 +153,7 @@ mindplot.widget.Menu = new Class({
|
||||
designer.changeBorderColor(hex);
|
||||
}
|
||||
};
|
||||
this._toolbarElems.push(new mindplot.widget.ColorPalettePanel('topicBorder', borderColorModel, baseUrl));
|
||||
this._toolbarElems.push(new mindplot.widget.ColorPalettePanel('topicBorder', borderColorModel, widgetsBaseUrl));
|
||||
|
||||
// Font color item ...
|
||||
var fontColorModel =
|
||||
@ -177,7 +178,7 @@ mindplot.widget.Menu = new Class({
|
||||
this._toolbarElems.push(new mindplot.widget.ColorPalettePanel('fontColor', fontColorModel, baseUrl));
|
||||
|
||||
this._addButton('export', false, false, function() {
|
||||
var reqDialog = new MooDialog.Request('../c/export.htm?mapId=' + mapId, null,
|
||||
var reqDialog = new MooDialog.Request('c/export.htm?mapId=' + mapId, null,
|
||||
{'class': 'exportModalDialog',
|
||||
closeButton:true,
|
||||
destroyOnClose:true,
|
||||
@ -265,21 +266,15 @@ mindplot.widget.Menu = new Class({
|
||||
var discardElem = $('discard');
|
||||
if (discardElem) {
|
||||
this._addButton('discard', false, false, function() {
|
||||
|
||||
if (!readOnly) {
|
||||
displayLoading();
|
||||
window.document.location = "mymaps.htm";
|
||||
} else {
|
||||
displayLoading();
|
||||
window.document.location = "home.htm";
|
||||
}
|
||||
});
|
||||
this.discard();
|
||||
window.location.reload();
|
||||
}.bind(this));
|
||||
}
|
||||
|
||||
var tagElem = $('tagIt');
|
||||
if (tagElem) {
|
||||
this._addButton('tagIt', false, false, function() {
|
||||
var reqDialog = new MooDialog.Request('../c/tags.htm?mapId=' + mapId, null,
|
||||
var reqDialog = new MooDialog.Request('c/tags.htm?mapId=' + mapId, null,
|
||||
{'class': 'tagItModalDialog',
|
||||
closeButton:true,
|
||||
destroyOnClose:true,
|
||||
@ -296,7 +291,7 @@ mindplot.widget.Menu = new Class({
|
||||
var shareElem = $('shareIt');
|
||||
if (shareElem) {
|
||||
this._addButton('shareIt', false, false, function() {
|
||||
var reqDialog = new MooDialog.Request('../c/mymaps.htm?action=collaborator&userEmail=paulo%40pveiga.com.ar&mapId=' + mapId, null,
|
||||
var reqDialog = new MooDialog.Request('c/mymaps.htm?action=collaborator&mapId=' + mapId, null,
|
||||
{'class': 'shareItModalDialog',
|
||||
closeButton:true,
|
||||
destroyOnClose:true,
|
||||
@ -314,7 +309,7 @@ mindplot.widget.Menu = new Class({
|
||||
var publishElem = $('publishIt');
|
||||
if (publishElem) {
|
||||
this._addButton('publishIt', false, false, function() {
|
||||
var reqDialog = new MooDialog.Request('../c/publish.htm?mapId=' + mapId, null,
|
||||
var reqDialog = new MooDialog.Request('c/publish.htm?mapId=' + mapId, null,
|
||||
{'class': 'publishModalDialog',
|
||||
closeButton:true,
|
||||
destroyOnClose:true,
|
||||
@ -333,7 +328,7 @@ mindplot.widget.Menu = new Class({
|
||||
if (historyElem) {
|
||||
|
||||
this._addButton('history', false, false, function() {
|
||||
var reqDialog = new MooDialog.Request('../c/history.htm?action=list&goToMindmapList&mapId=' + mapId, null,
|
||||
var reqDialog = new MooDialog.Request('c/history.htm?action=list&goToMindmapList&mapId=' + mapId, null,
|
||||
{'class': 'historyModalDialog',
|
||||
closeButton:true,
|
||||
destroyOnClose:true,
|
||||
|
@ -26,10 +26,10 @@ mindplot.widget.TopicShapePanel = new Class({
|
||||
|
||||
var content = new Element("div", {'class':'toolbarPanel','id':'topicShapePanel'});
|
||||
content.innerHTML = '' +
|
||||
'<div id="rectagle" model="rectagle"><img src="../images/shape-rectangle.png" alt="Rectangle"></div>' +
|
||||
'<div id="rounded_rectagle" model="rounded rectagle" ><img src="../images/shape-rectangle-round.png" alt="Rounded Rectangle"></div>' +
|
||||
'<div id="line" model="line"><img src="../images/shape-line.png" alt="Line"></div>' +
|
||||
'<div id="elipse" model="elipse"><img src="../images/shape-circle.png"></div>';
|
||||
'<div id="rectagle" model="rectagle"><img src="images/shape-rectangle.png" alt="Rectangle"></div>' +
|
||||
'<div id="rounded_rectagle" model="rounded rectagle" ><img src="images/shape-rectangle-round.png" alt="Rounded Rectangle"></div>' +
|
||||
'<div id="line" model="line"><img src="images/shape-line.png" alt="Line"></div>' +
|
||||
'<div id="elipse" model="elipse"><img src="images/shape-circle.png"></div>';
|
||||
|
||||
return content;
|
||||
|
||||
|
@ -6,14 +6,14 @@ TestCase("Model Migration Tests",{
|
||||
ids=[];
|
||||
var domDocument = core.Utils.createDocumentFromText(mapXml);
|
||||
|
||||
var betaSerializer = new mindplot.XMLMindmapSerializer_Beta();
|
||||
var betaSerializer = new mindplot.persistence.XMLSerializer_Beta();
|
||||
var betaMap = betaSerializer.loadFromDom(domDocument);
|
||||
|
||||
var serializer = mindplot.XMLMindmapSerializerFactory.getSerializerFromDocument(domDocument);
|
||||
var serializer = mindplot.persistence.XMLSerializerFactory.getSerializerFromDocument(domDocument);
|
||||
var mindmap = serializer.loadFromDom(domDocument);
|
||||
|
||||
//Assert that the new model is Pela
|
||||
assertEquals(mindplot.ModelCodeName.PELA, mindmap.getVersion());
|
||||
assertEquals(mindplot.persistence.ModelCodeName.PELA, mindmap.getVersion());
|
||||
|
||||
//Assert same number of branches
|
||||
var betaBranches = betaMap.getBranches();
|
||||
|
@ -178,6 +178,13 @@
|
||||
|
||||
<h3>testBalancedFreePredict:</h3>
|
||||
<div id="testBalancedFreePredict1" class="col"></div>
|
||||
|
||||
<h3>testFreeReorder:</h3>
|
||||
<div id="testFreeReorder1" class="col"></div>
|
||||
|
||||
<h3>testFreeOverlap:</h3>
|
||||
<div id="testFreeOverlap1" class="col"></div>
|
||||
<div id="testFreeOverlap2" class="col"></div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
@ -27,6 +27,8 @@ mindplot.layout.FreeTestSuite = new Class({
|
||||
this.testSiblingOverlapping();
|
||||
this.testRootNodeChildrenPositioning();
|
||||
this.testBalancedFreePredict();
|
||||
this.testFreeReorder();
|
||||
this.testFreeOverlap();
|
||||
},
|
||||
|
||||
testFreePosition: function() {
|
||||
@ -362,6 +364,76 @@ mindplot.layout.FreeTestSuite = new Class({
|
||||
console.log("OK!\n\n");
|
||||
},
|
||||
|
||||
testFreeReorder: function() {
|
||||
console.log("testFreeReorder:");
|
||||
var position = {x:0,y:0};
|
||||
var manager = new mindplot.layout.LayoutManager(0, mindplot.layout.TestSuite.ROOT_NODE_SIZE);
|
||||
|
||||
// Prepare a sample graph ...
|
||||
manager.addNode(1, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(0,1,0);
|
||||
manager.addNode(4, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(1,4,0);
|
||||
manager.addNode(5, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(1,5,1);
|
||||
manager.addNode(6, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(1,6,2);
|
||||
|
||||
manager.addNode(2, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(0,2,2);
|
||||
manager.addNode(7, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(2,7,0);
|
||||
manager.addNode(8, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(2,8,1);
|
||||
manager.addNode(9, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(2,9,2);
|
||||
manager.addNode(10, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(2,10,3);
|
||||
|
||||
manager.addNode(3, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(0,3,4);
|
||||
manager.addNode(11, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(3,11,0);
|
||||
manager.addNode(12, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(3,12,1);
|
||||
manager.addNode(13, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(3,13,2);
|
||||
manager.addNode(14, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(3,14,3);
|
||||
manager.addNode(15, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(3,15,4);
|
||||
manager.addNode(16, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(3,16,5);
|
||||
|
||||
manager.layout();
|
||||
manager.moveNode(14, {x:270, y:-160});
|
||||
manager.layout();
|
||||
manager.plot("testFreeReorder1", {width:800, height:1200});
|
||||
$assert(manager.find(14).getPosition().y > manager.find(10).getPosition().y, "Node 14 should be below branch 2");
|
||||
|
||||
console.log("OK!\n\n");
|
||||
},
|
||||
|
||||
testFreeOverlap: function() {
|
||||
console.log("testFreeOverlap:");
|
||||
var position = {x:0,y:0};
|
||||
var manager = new mindplot.layout.LayoutManager(0, mindplot.layout.TestSuite.ROOT_NODE_SIZE);
|
||||
|
||||
// Prepare a sample graph ...
|
||||
manager.addNode(1, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(0,1,0);
|
||||
manager.addNode(4, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(1,4,0);
|
||||
manager.addNode(5, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(1,5,1);
|
||||
manager.addNode(6, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(1,6,2);
|
||||
|
||||
manager.addNode(2, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(0,2,2);
|
||||
manager.addNode(7, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(2,7,0);
|
||||
manager.addNode(8, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(2,8,1);
|
||||
manager.addNode(9, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(2,9,2);
|
||||
manager.addNode(10, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(2,10,3);
|
||||
|
||||
manager.addNode(3, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(0,3,4);
|
||||
manager.addNode(11, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(3,11,0);
|
||||
manager.addNode(12, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(3,12,1);
|
||||
manager.addNode(13, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(3,13,2);
|
||||
manager.addNode(14, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(3,14,3);
|
||||
manager.addNode(15, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(3,15,4);
|
||||
manager.addNode(16, mindplot.layout.TestSuite.NODE_SIZE, position).connectNode(3,16,5);
|
||||
|
||||
manager.layout();
|
||||
manager.plot("testFreeOverlap1", {width:800, height:1200});
|
||||
|
||||
manager.moveNode(14, {x:270, y:7});
|
||||
manager.layout();
|
||||
manager.plot("testFreeOverlap2", {width:800, height:1200});
|
||||
$assert(manager.find(2).getPosition().y > manager.find(1).getPosition().y, "Branches 1 and 2 are overlapping");
|
||||
|
||||
console.log("OK!\n\n");
|
||||
},
|
||||
|
||||
_assertFreePosition: function(manager, id, position) {
|
||||
if (id != null && position.x != null && position.y != null) {
|
||||
var node = manager.find(id);
|
||||
|
113
pom.xml
113
pom.xml
@ -33,16 +33,53 @@
|
||||
|
||||
<organization>
|
||||
<name>WiseMapping</name>
|
||||
<url>http://www.wisemapping.com</url>
|
||||
<url>http://www.wisemapping.org/</url>
|
||||
</organization>
|
||||
|
||||
<build>
|
||||
<pluginManagement>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<inherited>true</inherited>
|
||||
<artifactId>maven-failsafe-plugin</artifactId>
|
||||
<version>2.12</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>2.12</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-resources-plugin</artifactId>
|
||||
<version>2.5</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-site-plugin</artifactId>
|
||||
<version>3.0</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-project-info-reports-plugin</artifactId>
|
||||
<version>2.4</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-dependency-plugin</artifactId>
|
||||
<version>2.4</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.jvnet.jaxb2.maven2</groupId>
|
||||
<artifactId>maven-jaxb2-plugin</artifactId>
|
||||
<version>0.8.1</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</pluginManagement>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-resources-plugin</artifactId>
|
||||
<configuration>
|
||||
<encoding>UTF-8</encoding>
|
||||
</configuration>
|
||||
@ -53,20 +90,10 @@
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>2.3.2</version>
|
||||
<configuration>
|
||||
<source>1.5</source>
|
||||
<source>1.6</source>
|
||||
<target>1.6</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<inherited>true</inherited>
|
||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||
<version>2.8</version>
|
||||
<configuration>
|
||||
<configLocation>config/maven_checks.xml</configLocation>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-assembly-plugin</artifactId>
|
||||
@ -77,9 +104,69 @@
|
||||
</descriptors>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-site-plugin</artifactId>
|
||||
<configuration>
|
||||
<reportPlugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jxr-plugin</artifactId>
|
||||
<version>2.1</version>
|
||||
<configuration>
|
||||
<aggregate>true</aggregate>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-report-plugin</artifactId>
|
||||
<version>2.6</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-dependency-plugin</artifactId>
|
||||
<reports>
|
||||
<report>analyze-report</report>
|
||||
</reports>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-pmd-plugin</artifactId>
|
||||
<version>2.7.1</version>
|
||||
<configuration>
|
||||
<linkXref>true</linkXref>
|
||||
<sourceEncoding>utf-8</sourceEncoding>
|
||||
<minimumTokens>100</minimumTokens>
|
||||
<targetJdk>1.6</targetJdk>
|
||||
<excludeRoots>
|
||||
<excludeRoot>target/</excludeRoot>
|
||||
</excludeRoots>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-project-info-reports-plugin</artifactId>
|
||||
<reports>
|
||||
<report>index</report>
|
||||
<report>summary</report>
|
||||
<report>dependency-management</report>
|
||||
<report>license</report>
|
||||
<report>modules</report>
|
||||
</reports>
|
||||
</plugin>
|
||||
</reportPlugins>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<distributionManagement>
|
||||
<site>
|
||||
<id>www.wisemapping.org</id>
|
||||
<url>scp://www.wisemapping.org/docs/project/</url>
|
||||
</site>
|
||||
</distributionManagement>
|
||||
|
||||
<!-- Module Dependencies -->
|
||||
<modules>
|
||||
<module>web2d</module>
|
||||
|
@ -87,6 +87,10 @@ web2d.Element = new Class({
|
||||
this._peer.addEvent(type, listener);
|
||||
},
|
||||
|
||||
fireEvent : function(type, event) {
|
||||
this._peer.fireEvent(type, event);
|
||||
},
|
||||
|
||||
cloneEvents : function(from) {
|
||||
this._peer.cloneEvents(from);
|
||||
},
|
||||
|
@ -123,5 +123,10 @@ web2d.Group = new Class({
|
||||
}
|
||||
|
||||
this._peer._native.appendChild(DomElement);
|
||||
},
|
||||
|
||||
setOpacity:function(value){
|
||||
this._peer.setOpacity(value);
|
||||
}
|
||||
|
||||
});
|
@ -66,7 +66,7 @@ web2d.Workspace = new Class({
|
||||
_createDivContainer : function(domElement) {
|
||||
var container = window.document.createElement("div");
|
||||
container.id = "workspaceContainer";
|
||||
container.style.overflow = "hidden";
|
||||
// container.style.overflow = "hidden";
|
||||
container.style.position = "relative";
|
||||
container.style.top = "0px";
|
||||
container.style.left = "0px";
|
||||
|
@ -85,6 +85,10 @@ web2d.peer.svg.ElementPeer = new Class({
|
||||
this._native.addEvent(type, listener);
|
||||
},
|
||||
|
||||
fireEvent : function(type) {
|
||||
this._native.fireEvent(type, event);
|
||||
},
|
||||
|
||||
cloneEvents : function(from) {
|
||||
this._native.cloneEvents(from);
|
||||
},
|
||||
|
@ -73,6 +73,10 @@ web2d.peer.svg.GroupPeer = new Class({
|
||||
this._native.setAttribute("transform", "translate(" + cx + "," + cy + ") scale(" + sx + "," + sy + ")");
|
||||
},
|
||||
|
||||
setOpacity : function(value) {
|
||||
this._native.setAttribute("opacity", value);
|
||||
},
|
||||
|
||||
setCoordOrigin : function(x, y) {
|
||||
var change = x != this._coordOrigin.x || y != this._coordOrigin.y;
|
||||
if ($defined(x)) {
|
||||
|
@ -23,6 +23,7 @@ web2d.peer.svg.ImagePeer = new Class({
|
||||
this.parent(svgElement);
|
||||
this._position = {x:0,y:0};
|
||||
this._href = "";
|
||||
this._native.setAttribute("preserveAspectRatio", "none");
|
||||
},
|
||||
|
||||
setPosition : function(x, y) {
|
||||
|
@ -155,14 +155,25 @@ web2d.peer.svg.TextPeer = new Class({
|
||||
},
|
||||
|
||||
getWidth : function () {
|
||||
// Firefox hack for this issue:http://stackoverflow.com/questions/6390065/doing-ajax-updates-in-svg-breaks-getbbox-is-there-a-workaround
|
||||
try {
|
||||
var computedWidth = this._native.getBBox().width;
|
||||
} catch(e) {
|
||||
computedWidth = 10;
|
||||
}
|
||||
|
||||
var width = parseInt(computedWidth);
|
||||
width = width + this._font.getWidthMargin();
|
||||
return width;
|
||||
},
|
||||
|
||||
getHeight : function () {
|
||||
// Firefox hack for this issue:http://stackoverflow.com/questions/6390065/doing-ajax-updates-in-svg-breaks-getbbox-is-there-a-workaround
|
||||
try {
|
||||
var computedHeight = this._native.getBBox().height;
|
||||
} catch(e) {
|
||||
computedHeight = 10;
|
||||
}
|
||||
return parseInt(computedHeight);
|
||||
},
|
||||
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 658 B |
@ -1,24 +1,18 @@
|
||||
<div class="modalDialog">
|
||||
<!-- Header can be customized -->
|
||||
|
||||
|
||||
<h1>
|
||||
Export
|
||||
'sss'</h1>
|
||||
<h1>Export</h1>
|
||||
|
||||
<div>
|
||||
<form method="post" id="exportForm" name="exportForm" action="export.bin" style="height:100%;">
|
||||
<input type="hidden" name="action" value="export">
|
||||
<input type="hidden" name="mapId" value="3">
|
||||
<input type="hidden" name="mapSvg" value="">
|
||||
<form method="POST" id="exportForm" name="exportForm" action="http://localhost:8080/service/transform"
|
||||
style="height:100%;" enctype="application/x-www-form-urlencoded">
|
||||
<input name="svgXml" value="" type="hidden"/>
|
||||
<input name="mapXml" value="" type="hidden"/>
|
||||
<input name="filename" value="welcome" type="hidden"/>
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<input type="radio" id="svg" name="exportFormat" value="SVG">
|
||||
<b>
|
||||
Scalable Vector Graphics (SVG)
|
||||
</b>
|
||||
<input type="radio" id="svg" name="exportFormat" value="svg">
|
||||
<b> Scalable Vector Graphics (SVG)</b>
|
||||
|
||||
<p>
|
||||
Scalable Vector Graphics (SVG) is an XML markup language for describing two-dimensional
|
||||
@ -30,9 +24,7 @@
|
||||
<tr>
|
||||
<td>
|
||||
<input type="radio" name="exportFormat" value="PDF" id="pdf">
|
||||
<b>
|
||||
Portable Document Format (PDF)
|
||||
</b>
|
||||
<b>Portable Document Format (PDF)</b>
|
||||
|
||||
<p>
|
||||
Get your map as Portable Document Format(PDF) to share use in your presentations.
|
||||
@ -42,9 +34,7 @@
|
||||
<tr>
|
||||
<td>
|
||||
<input type="radio" id="freemind" name="exportFormat" value="FREEMIND" checked="checked">
|
||||
<b>
|
||||
Freemind (version 0.9.0)
|
||||
</b>
|
||||
<b>Freemind (version 0.9.0)</b>
|
||||
|
||||
<p>
|
||||
FreeMind is a nice desktop mind mapping application that has the great benefit of being
|
||||
@ -55,9 +45,8 @@
|
||||
<tr>
|
||||
<td>
|
||||
<input type="radio" name="exportFormat" id="img" value="IMG_EXPORT_FORMAT">
|
||||
<b>
|
||||
Image File
|
||||
</b><select name="imgFormat" id="imgFormat" style="visibility:hidden;margin-left:5px;">
|
||||
<b>Image File</b>
|
||||
<select name="imgFormat" id="imgFormat" style="visibility:hidden;margin-left:5px;">
|
||||
<option>PNG</option>
|
||||
<option>JPEG</option>
|
||||
</select>
|
||||
@ -71,7 +60,8 @@
|
||||
<tr>
|
||||
<td style="text-align:center;margin-top:10px;">
|
||||
<input type="button" id="ok" value="Ok" class="btn-primary">
|
||||
<input type="button" value="Cancel" class="btn-secondary" onclick="MOOdalBox.close();">
|
||||
<input type="button" value="Cancel" class="btn-secondary"
|
||||
onclick="MooDialog.Request.active.close();">
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@ -92,9 +82,36 @@
|
||||
});
|
||||
|
||||
$('ok').addEvent('click', function(event) {
|
||||
$('exportForm').submit();
|
||||
|
||||
var form = $('exportForm');
|
||||
|
||||
// Look for the selected format and append export suffix...
|
||||
var value = $$('input[name=exportFormat]:checked')[0].get('value');
|
||||
var suffix;
|
||||
if (value == 'IMG_EXPORT_FORMAT') {
|
||||
var selected = $('imgFormat');
|
||||
suffix = selected.options[selected.selectedIndex].value;
|
||||
} else {
|
||||
suffix = value;
|
||||
}
|
||||
suffix = suffix.toLowerCase();
|
||||
form.action = form.action + "." + suffix;
|
||||
|
||||
// Store SVG o native map...
|
||||
if (suffix == "freemind") {
|
||||
var mindmap = designer.getMindmap();
|
||||
var serializer = mindplot.persistence.XMLSerializerFactory.getSerializerFromMindmap(mindmap);
|
||||
var domMap = serializer.toXML(mindmap);
|
||||
form.mapXml.value = core.Utils.innerXML(domMap);
|
||||
} else {
|
||||
form.svgXml.value = $("workspaceContainer").innerHTML;
|
||||
}
|
||||
|
||||
// Finally, submit map ...
|
||||
form.submit();
|
||||
|
||||
|
||||
MooDialog.Request.active.close();
|
||||
});
|
||||
document.exportForm.mapSvg.value = $("workspaceContainer").innerHTML;
|
||||
|
||||
</script>
|
@ -1,91 +1,21 @@
|
||||
@import "compatibility.less";
|
||||
@import "../css/libraries/moodialog/css/MooDialog.css";
|
||||
|
||||
|
||||
/**********************************************************/
|
||||
/* Error Dialog ... */
|
||||
/**********************************************************/
|
||||
|
||||
#waitDialog {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 10px;
|
||||
height: 200px;
|
||||
}
|
||||
|
||||
#waitingContainer, #errorContainer {
|
||||
position: relative;
|
||||
top: 80px;
|
||||
height: 120px; /*background: whitesmoke;*/
|
||||
background: #FEFEFE;
|
||||
opacity: .99;
|
||||
padding: 15px;
|
||||
width: 100%;
|
||||
border: 1px solid;
|
||||
border-color: #a9a9a9;
|
||||
|
||||
}
|
||||
|
||||
#errorContainer {
|
||||
width: 400px;
|
||||
border: 1px solid red;
|
||||
}
|
||||
|
||||
#waitingContainer .loadingText {
|
||||
position: relative;
|
||||
top: 50%;
|
||||
margin-top: -35px;
|
||||
font-size: 30px;
|
||||
font-weight: bold;
|
||||
vertical-align: text-bottom;
|
||||
height: 30px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
#errorContainer .loadingText {
|
||||
position: relative;
|
||||
top: 50%;
|
||||
margin-top: -80px;
|
||||
font-size: 15px;
|
||||
font-weight: bold;
|
||||
vertical-align: text-bottom;
|
||||
height: 30px;
|
||||
float: right;
|
||||
padding-left: 120px;
|
||||
}
|
||||
|
||||
#waitingContainer .loadingIcon {
|
||||
position: relative;
|
||||
background: url(../images/rebota.gif) no-repeat;
|
||||
top: 50%;
|
||||
margin-top: -65px;
|
||||
height: 100px;
|
||||
width: 121px;
|
||||
float: left;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
#errorContainer .loadingIcon {
|
||||
position: relative;
|
||||
background: url(../images/errorIcon.png) no-repeat;
|
||||
top: 50%;
|
||||
margin-top: -65px;
|
||||
height: 100px;
|
||||
width: 121px;
|
||||
float: left;
|
||||
clear: both;
|
||||
}
|
||||
@import "css/libraries/moodialog/css/MooDialog.css";
|
||||
|
||||
/********************************************************************************/
|
||||
/* Header & Toolbar Styles */
|
||||
/********************************************************************************/
|
||||
@import "header.less";
|
||||
|
||||
body {
|
||||
overflow:hidden;
|
||||
}
|
||||
|
||||
div#mindplot {
|
||||
position: relative;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height:100%;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
|
@ -0,0 +1 @@
|
||||
../../../../../../../../mindplot/src/main/javascript/libraries/moodialog/css/dialog-close.png
|
@ -41,7 +41,7 @@
|
||||
This is a simple example of how WiseMapping can be embedded in a page.
|
||||
Embedding WiseMapping editor is such simple as copying this line in your page:
|
||||
</p>
|
||||
<div id="code"><iframe src="embedded.html?confUrl=../html/container.json" width="800" height="600"></iframe></div>
|
||||
<div id="code"><iframe src="embedded.html?confUrl=html/container.json" width="800" height="600"></iframe></div>
|
||||
<p>
|
||||
The container.json file contains a set of properties that must be configured. Properties:
|
||||
</p>
|
||||
@ -61,7 +61,7 @@
|
||||
|
||||
</div>
|
||||
<div id="editor">
|
||||
<iframe src="embedded.html?confUrl=../html/container.json" width="800" height="400"></iframe>
|
||||
<iframe src="embedded.html?confUrl=html/container.json" width="800" height="400"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
@ -2,20 +2,23 @@
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<base href="../">
|
||||
<title>WiseMapping - Editor </title>
|
||||
<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>
|
||||
<meta http-equiv="Content-type" content="text/html; char
|
||||
set=UTF-8"/>
|
||||
|
||||
<!--[if lt IE 9]>
|
||||
<meta http-equiv="X-UA-Compatible" content="chrome=1">
|
||||
<![endif]-->
|
||||
<link rel="stylesheet/less" type="text/css" href="../css/editor.less"/>
|
||||
<link rel="stylesheet/less" type="text/css" href="css/editor.less"/>
|
||||
|
||||
<script type='text/javascript' src='../js/mootools-core.js'></script>
|
||||
<script type='text/javascript' src='../js/mootools-more.js'></script>
|
||||
<script type='text/javascript' src='../js/core.js'></script>
|
||||
<script type='text/javascript' src='../js/less.js'></script>
|
||||
<script type='text/javascript' src='js/mootools-core.js'></script>
|
||||
<script type='text/javascript' src='js/mootools-more.js'></script>
|
||||
<script type='text/javascript' src='js/core.js'></script>
|
||||
<script type='text/javascript' src='js/less.js'></script>
|
||||
|
||||
<link rel="icon" href="../images/favicon.ico" type="image/x-icon">
|
||||
<link rel="shortcut icon" href="../images/favicon.ico" type="image/x-icon">
|
||||
<link rel="icon" href="images/favicon.ico" type="image/x-icon">
|
||||
<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
@ -26,17 +29,10 @@
|
||||
|
||||
// Load map from XML file persisted on disk...
|
||||
var persistence = mindplot.PersistenceManager.getInstance();
|
||||
var mindmap;
|
||||
try {
|
||||
mindmap = persistence.load(mapId);
|
||||
} catch(e) {
|
||||
// If the map could not be loaded, create a new empty map...
|
||||
mindmap = mindplot.model.Mindmap.buildEmpty(mapId);
|
||||
}
|
||||
var mindmap = mindmap = persistence.load(mapId);
|
||||
designer.loadMap(mindmap);
|
||||
});
|
||||
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
@ -52,72 +48,75 @@
|
||||
<div id="editTab" class="tabContent">
|
||||
<div id="persist" class="buttonContainer">
|
||||
<div id="save" class="buttonOn" title="Save">
|
||||
<img src="../images/save.png"/>
|
||||
<img src="images/save.png"/>
|
||||
</div>
|
||||
<div id="discard" class="buttonOn" title="Discard">
|
||||
<img src="../images/discard.png"/>
|
||||
<img src="images/discard.png"/>
|
||||
</div>
|
||||
<div id="export" class="buttonOn" title="Export">
|
||||
<img src="images/export.png"/>
|
||||
</div>
|
||||
</div>
|
||||
<div id="edit" class="buttonContainer">
|
||||
<div id="undoEdition" class="buttonOn" title="Undo Edition">
|
||||
<img src="../images/undo.png"/>
|
||||
<img src="images/undo.png"/>
|
||||
</div>
|
||||
<div id="redoEdition" class="buttonOn" title="Redo Edition">
|
||||
<img src="../images/redo.png"/>
|
||||
<img src="images/redo.png"/>
|
||||
</div>
|
||||
</div>
|
||||
<div id="zoom" class="buttonContainer">
|
||||
<div id="zoomIn" class="buttonOn" title="Zoom In">
|
||||
<img src="../images/zoom-in.png"/>
|
||||
<img src="images/zoom-in.png"/>
|
||||
</div>
|
||||
<div id="zoomOut" class="buttonOn" title="Zoom Out">
|
||||
<img src="../images/zoom-out.png"/>
|
||||
<img src="images/zoom-out.png"/>
|
||||
</div>
|
||||
</div>
|
||||
<div id="node" class="buttonContainer">
|
||||
<div id="topicShape" class="buttonExtOn" title="Topic Shape">
|
||||
<img src="../images/topic-shape.png"/>
|
||||
<img src="images/topic-shape.png"/>
|
||||
</div>
|
||||
<div id="addTopic" class="buttonOn" title="Add Topic">
|
||||
<img src="../images/topic-add.png"/>
|
||||
<img src="images/topic-add.png"/>
|
||||
</div>
|
||||
<div id="deleteTopic" class="buttonOn" title="Delete">
|
||||
<img src="../images/topic-delete.png"/>
|
||||
<img src="images/topic-delete.png"/>
|
||||
</div>
|
||||
<div id="topicBorder" class="buttonExtOn" title="Border Color">
|
||||
<img src="../images/topic-border.png"/>
|
||||
<img src="images/topic-border.png"/>
|
||||
</div>
|
||||
<div id="topicColor" class="buttonExtOn" title="Background Color">
|
||||
<img src="../images/topic-color.png"/>
|
||||
<img src="images/topic-color.png"/>
|
||||
</div>
|
||||
<div id="topicIcon" class="buttonExtOn" title="Add Icon">
|
||||
<img src="../images/topic-icon.png"/>
|
||||
<img src="images/topic-icon.png"/>
|
||||
</div>
|
||||
<div id="topicNote" class="buttonOn" title="Add Note">
|
||||
<img src="../images/topic-note.png"/>
|
||||
<img src="images/topic-note.png"/>
|
||||
</div>
|
||||
<div id="topicLink" class="buttonOn" title="Add Link">
|
||||
<img src="../images/topic-link.png"/>
|
||||
<img src="images/topic-link.png"/>
|
||||
</div>
|
||||
<div id="topicRelation" class="buttonOn" title="Add Relationship">
|
||||
<img src="../images/topic-relation.png"/>
|
||||
<img src="images/topic-relation.png"/>
|
||||
</div>
|
||||
</div>
|
||||
<div id="font" class="buttonContainer">
|
||||
<div id="fontFamily" class="buttonExtOn" title="Font Style">
|
||||
<img src="../images/font-type.png"/>
|
||||
<img src="images/font-type.png"/>
|
||||
</div>
|
||||
<div id="fontSize" class="buttonExtOn" title="Font Size">
|
||||
<img src="../images/font-size.png"/>
|
||||
<img src="images/font-size.png"/>
|
||||
</div>
|
||||
<div id="fontBold" class="buttonOn" title="Bold Style">
|
||||
<img src="../images/font-bold.png"/>
|
||||
<img src="images/font-bold.png"/>
|
||||
</div>
|
||||
<div id="fontItalic" class="buttonOn" title="Italic Style">
|
||||
<img src="../images/font-italic.png"/>
|
||||
<img src="images/font-italic.png"/>
|
||||
</div>
|
||||
<div id="fontColor" class="buttonExtOn" title="Fond Color" style="padding-top:4px">
|
||||
<img src="../images/font-color.png"/>
|
||||
<div id="fontColor" class="buttonExtOn" title="Font Color" style="padding-top:4px">
|
||||
<img src="images/font-color.png"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -128,7 +127,26 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--<div style="position: absolute;align:left;background: gray;width: 100px;height: 300px;z-index: 100" id="dragPanel">-->
|
||||
<!--<div id="dragIcon" style="">-->
|
||||
<!--<img src="images/logo-small.png"/>-->
|
||||
<!--</div>-->
|
||||
<!--</div>-->
|
||||
|
||||
<!--<script type="text/javascript">-->
|
||||
<!--$("dragIcon").addEvent('mousedown', function(event) {-->
|
||||
<!--event.preventDefault();-->
|
||||
|
||||
<!--var options = {imageUrl:"images/logo-small.png",-->
|
||||
<!--imageWidth:80,-->
|
||||
<!--imageHeight:43,-->
|
||||
<!--metadata: "{'media':'video,'url':'http://www.youtube.com/watch?v=P3FrXftyuzw&feature=g-vrec&context=G2b4ab69RVAAAAAAAAAA'}"-->
|
||||
<!--};-->
|
||||
<!--designer.addDraggedNode(event, options);-->
|
||||
<!--});-->
|
||||
<!--</script>-->
|
||||
|
||||
<div id="mindplot"></div>
|
||||
<script type="text/javascript" src="../js/editor.js"></script>
|
||||
<script type="text/javascript" src="js/editor.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -2,20 +2,21 @@
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<base href="../">
|
||||
<title>WiseMapping - Editor </title>
|
||||
<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>
|
||||
<!--[if lt IE 9]>
|
||||
<meta http-equiv="X-UA-Compatible" content="chrome=1">
|
||||
<![endif]-->
|
||||
<link rel="stylesheet/less" type="text/css" href="../css/embedded.less"/>
|
||||
<link rel="stylesheet/less" type="text/css" href="css/embedded.less"/>
|
||||
|
||||
<script type='text/javascript' src='../js/mootools-core.js'></script>
|
||||
<script type='text/javascript' src='../js/mootools-more.js'></script>
|
||||
<script type='text/javascript' src='../js/core.js'></script>
|
||||
<script type='text/javascript' src='../js/less.js'></script>
|
||||
<script type='text/javascript' src='js/mootools-core.js'></script>
|
||||
<script type='text/javascript' src='js/mootools-more.js'></script>
|
||||
<script type='text/javascript' src='js/core.js'></script>
|
||||
<script type='text/javascript' src='js/less.js'></script>
|
||||
|
||||
<link rel="icon" href="../images/favicon.ico" type="image/x-icon">
|
||||
<link rel="shortcut icon" href="../images/favicon.ico" type="image/x-icon">
|
||||
<link rel="icon" href="images/favicon.ico" type="image/x-icon">
|
||||
<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
@ -57,72 +58,72 @@
|
||||
<div id="editTab" class="tabContent">
|
||||
<div id="persist" class="buttonContainer">
|
||||
<div id="save" class="buttonOn" title="Save">
|
||||
<img src="../images/save.png"/>
|
||||
<img src="images/save.png"/>
|
||||
</div>
|
||||
<div id="discard" class="buttonOn" title="Discard">
|
||||
<img src="../images/discard.png"/>
|
||||
<img src="images/discard.png"/>
|
||||
</div>
|
||||
</div>
|
||||
<div id="edit" class="buttonContainer">
|
||||
<div id="undoEdition" class="buttonOn" title="Undo Edition">
|
||||
<img src="../images/undo.png"/>
|
||||
<img src="images/undo.png"/>
|
||||
</div>
|
||||
<div id="redoEdition" class="buttonOn" title="Redo Edition">
|
||||
<img src="../images/redo.png"/>
|
||||
<img src="images/redo.png"/>
|
||||
</div>
|
||||
</div>
|
||||
<div id="zoom" class="buttonContainer">
|
||||
<div id="zoomIn" class="buttonOn" title="Zoom In">
|
||||
<img src="../images/zoom-in.png"/>
|
||||
<img src="images/zoom-in.png"/>
|
||||
</div>
|
||||
<div id="zoomOut" class="buttonOn" title="Zoom Out">
|
||||
<img src="../images/zoom-out.png"/>
|
||||
<img src="images/zoom-out.png"/>
|
||||
</div>
|
||||
</div>
|
||||
<div id="node" class="buttonContainer">
|
||||
<div id="topicShape" class="buttonExtOn" title="Topic Shape">
|
||||
<img src="../images/topic-shape.png"/>
|
||||
<img src="images/topic-shape.png"/>
|
||||
</div>
|
||||
<div id="addTopic" class="buttonOn" title="Add Topic">
|
||||
<img src="../images/topic-add.png"/>
|
||||
<img src="images/topic-add.png"/>
|
||||
</div>
|
||||
<div id="deleteTopic" class="buttonOn" title="Delete">
|
||||
<img src="../images/topic-delete.png"/>
|
||||
<img src="images/topic-delete.png"/>
|
||||
</div>
|
||||
<div id="topicBorder" class="buttonOn" title="Border Color">
|
||||
<img src="../images/topic-border.png"/>
|
||||
<img src="images/topic-border.png"/>
|
||||
</div>
|
||||
<div id="topicColor" class="buttonExtOn" title="Background Color">
|
||||
<img src="../images/topic-color.png"/>
|
||||
<img src="images/topic-color.png"/>
|
||||
</div>
|
||||
<div id="topicIcon" class="buttonExtOn" title="Add Icon">
|
||||
<img src="../images/topic-icon.png"/>
|
||||
<img src="images/topic-icon.png"/>
|
||||
</div>
|
||||
<div id="topicNote" class="buttonOn" title="Add Note">
|
||||
<img src="../images/topic-note.png"/>
|
||||
<img src="images/topic-note.png"/>
|
||||
</div>
|
||||
<div id="topicLink" class="buttonOn" title="Add Link">
|
||||
<img src="../images/topic-link.png"/>
|
||||
<img src="images/topic-link.png"/>
|
||||
</div>
|
||||
<div id="topicRelation" class="buttonOn" title="Add Relationship">
|
||||
<img src="../images/topic-relation.png"/>
|
||||
<img src="images/topic-relation.png"/>
|
||||
</div>
|
||||
</div>
|
||||
<div id="font" class="buttonContainer">
|
||||
<div id="fontFamily" class="buttonOn" title="Font Style">
|
||||
<img src="../images/font-type.png"/>
|
||||
<img src="images/font-type.png"/>
|
||||
</div>
|
||||
<div id="fontSize" class="buttonExtOn" title="Font Size">
|
||||
<img src="../images/font-size.png"/>
|
||||
<img src="images/font-size.png"/>
|
||||
</div>
|
||||
<div id="fontBold" class="buttonOn" title="Bold Style">
|
||||
<img src="../images/font-bold.png"/>
|
||||
<img src="images/font-bold.png"/>
|
||||
</div>
|
||||
<div id="fontItalic" class="buttonOn" title="Italic Style">
|
||||
<img src="../images/font-italic.png"/>
|
||||
<img src="images/font-italic.png"/>
|
||||
</div>
|
||||
<div id="fontColor" class="buttonExtOn" title="Fond Color" style="padding-top:4px">
|
||||
<img src="../images/font-color.png"/>
|
||||
<img src="images/font-color.png"/>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@ -135,6 +136,6 @@
|
||||
</div>
|
||||
|
||||
<div id="mindplot"></div>
|
||||
<script type="text/javascript" src="../js/editor.js"></script>
|
||||
<script type="text/javascript" src="js/editor.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -2,20 +2,21 @@
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<base href="../">
|
||||
<title>WiseMapping - Editor </title>
|
||||
<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>
|
||||
<!--[if lt IE 9]>
|
||||
<meta http-equiv="X-UA-Compatible" content="chrome=1">
|
||||
<![endif]-->
|
||||
<link rel="stylesheet/less" type="text/css" href="../css/embedded.less"/>
|
||||
<link rel="stylesheet/less" type="text/css" href="css/embedded.less"/>
|
||||
|
||||
<script type='text/javascript' src='../js/mootools-core.js'></script>
|
||||
<script type='text/javascript' src='../js/mootools-more.js'></script>
|
||||
<script type='text/javascript' src='../js/core.js'></script>
|
||||
<script type='text/javascript' src='../js/less.js'></script>
|
||||
<script type='text/javascript' src='js/mootools-core.js'></script>
|
||||
<script type='text/javascript' src='js/mootools-more.js'></script>
|
||||
<script type='text/javascript' src='js/core.js'></script>
|
||||
<script type='text/javascript' src='js/less.js'></script>
|
||||
|
||||
<link rel="icon" href="../images/favicon.ico" type="image/x-icon">
|
||||
<link rel="shortcut icon" href="../images/favicon.ico" type="image/x-icon">
|
||||
<link rel="icon" href="images/favicon.ico" type="image/x-icon">
|
||||
<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
@ -51,6 +52,6 @@
|
||||
</div>
|
||||
|
||||
<div id="mindplot"></div>
|
||||
<script type="text/javascript" src="../js/editor.js"></script>
|
||||
<script type="text/javascript" src="js/editor.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
BIN
wise-editor/src/main/webapp/icons/legacy/links.png
Normal file
BIN
wise-editor/src/main/webapp/icons/legacy/links.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 957 B |
Binary file not shown.
Before Width: | Height: | Size: 6.6 KiB |
BIN
wise-editor/src/main/webapp/images/alert-sign.png
Normal file
BIN
wise-editor/src/main/webapp/images/alert-sign.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.9 KiB |
@ -30,17 +30,23 @@ function buildDesigner(options) {
|
||||
window.waitDialog.destroy();
|
||||
});
|
||||
|
||||
designer.addEvent('loadError', function(e) {
|
||||
window.onerror = function()
|
||||
{
|
||||
window.waitDialog.close();
|
||||
window.waitDialog.destroy();
|
||||
errorDialog.show();
|
||||
console.log(e);
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
// Configure default persistence manager ...
|
||||
var persistence;
|
||||
if (options.persistenceManager) {
|
||||
if (options.persistenceManager instanceof String) {
|
||||
persistence = eval("new " + options.persistenceManager + "()");
|
||||
}
|
||||
else {
|
||||
persistence = options.persistenceManager;
|
||||
}
|
||||
|
||||
} else {
|
||||
persistence = new mindplot.LocalStorageManager();
|
||||
@ -49,7 +55,7 @@ function buildDesigner(options) {
|
||||
|
||||
// Register toolbar event ...
|
||||
if ($('toolbar')) {
|
||||
var menu = new mindplot.widget.Menu(designer, 'toolbar');
|
||||
var menu = new mindplot.widget.Menu(designer, 'toolbar', "");
|
||||
|
||||
// If a node has focus, focus can be move to another node using the keys.
|
||||
designer._cleanScreen = function() {
|
||||
@ -90,6 +96,7 @@ function loadDesignerOptions(jsonConf) {
|
||||
};
|
||||
result = {readOnly:false,zoom:0.85,saveOnLoad:true,size:containerSize,viewPort:viewPort,container:'mindplot'};
|
||||
}
|
||||
console.log("result:" + JSON.encode(result));
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -104,6 +111,70 @@ editor.WaitDialog = new Class({
|
||||
autoOpen:true,
|
||||
useEscKey:false,
|
||||
title:'Loading ...',
|
||||
onInitialize: function(wrapper) {
|
||||
wrapper.setStyle('opacity', 0);
|
||||
this.fx = new Fx.Morph(wrapper, {
|
||||
duration: 100,
|
||||
transition: Fx.Transitions.Bounce.easeOut
|
||||
});
|
||||
this.overlay = new Overlay(this.options.inject, {
|
||||
duration: this.options.duration
|
||||
});
|
||||
if (this.options.closeOnOverlayClick) this.overlay.addEvent('click', this.close.bind(this));
|
||||
},
|
||||
|
||||
onBeforeOpen: function() {
|
||||
this.overlay.open();
|
||||
this.fx.start({
|
||||
'margin-top': [-200, -100],
|
||||
opacity: [0, 1]
|
||||
}).chain(function() {
|
||||
this.fireEvent('show');
|
||||
}.bind(this));
|
||||
},
|
||||
|
||||
onBeforeClose: function() {
|
||||
this.fx.start({
|
||||
'margin-top': [-100, 0],
|
||||
opacity: 0,
|
||||
duration: 200
|
||||
}).chain(function() {
|
||||
this.fireEvent('hide');
|
||||
}.bind(this));
|
||||
this.overlay.close();
|
||||
}}
|
||||
);
|
||||
this.setContent(panel);
|
||||
},
|
||||
|
||||
_buildPanel : function () {
|
||||
var result = new Element('div');
|
||||
result.setStyles({
|
||||
'text-align':'center',
|
||||
width: '400px'
|
||||
});
|
||||
var img = new Element('img', {'src': 'images/ajax-loader.gif'});
|
||||
img.inject(result);
|
||||
return result;
|
||||
},
|
||||
|
||||
show : function() {
|
||||
this.open();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
editor.FatalErrorDialog = new Class({
|
||||
Extends:MooDialog,
|
||||
initialize : function() {
|
||||
var panel = this._buildPanel();
|
||||
this.parent({
|
||||
closeButton:false,
|
||||
destroyOnClose:true,
|
||||
autoOpen:true,
|
||||
useEscKey:false,
|
||||
title:'Outch!!. An unexpected error has occurred',
|
||||
onInitialize: function(wrapper) {
|
||||
wrapper.setStyle('opacity', 0);
|
||||
this.fx = new Fx.Morph(wrapper, {
|
||||
@ -138,8 +209,7 @@ editor.WaitDialog = new Class({
|
||||
}.bind(this));
|
||||
this.overlay.close();
|
||||
}}
|
||||
)
|
||||
;
|
||||
);
|
||||
this.setContent(panel);
|
||||
},
|
||||
|
||||
@ -149,8 +219,12 @@ editor.WaitDialog = new Class({
|
||||
'text-align':'center',
|
||||
width: '400px'
|
||||
});
|
||||
var img = new Element('img', {'src': '../images/ajax-loader.gif'});
|
||||
var p = new Element('p', {'text': 'We\'re sorry, an error has occurred and we can not process your request. Please try again, or go to the home page.'});
|
||||
p.inject(result);
|
||||
|
||||
var img = new Element('img', {'src': 'images/alert-sign.png'});
|
||||
img.inject(result);
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
@ -160,12 +234,16 @@ editor.WaitDialog = new Class({
|
||||
|
||||
});
|
||||
|
||||
|
||||
editor.Help = {
|
||||
buildHelp:function(panel) {
|
||||
var container = new Element('div');
|
||||
container.setStyles({width:'100%', textAlign:'center'});
|
||||
var content1 = Help.buildContentIcon('../images/black-keyboard.png', 'Keyboard Shortcuts', function(){MOOdalBox.open('keyboard.htm','KeyBoard Shortcuts', '500px 400px', false);panel.hidePanel();});
|
||||
var content2 = Help.buildContentIcon('../images/firstSteps.png', 'Editor First Steps', function(){
|
||||
var content1 = Help.buildContentIcon('images/black-keyboard.png', 'Keyboard Shortcuts', function() {
|
||||
MOOdalBox.open('keyboard.htm', 'KeyBoard Shortcuts', '500px 400px', false);
|
||||
panel.hidePanel();
|
||||
});
|
||||
var content2 = Help.buildContentIcon('images/firstSteps.png', 'Editor First Steps', function() {
|
||||
var wOpen;
|
||||
var sOptions;
|
||||
|
||||
@ -183,7 +261,9 @@ editor.Help = {
|
||||
|
||||
container.addEvent('show', function() {
|
||||
content1.effect('opacity', {duration:800}).start(0, 100);
|
||||
var eff = function(){content2.effect('opacity',{duration:800}).start(0,100);};
|
||||
var eff = function() {
|
||||
content2.effect('opacity', {duration:800}).start(0, 100);
|
||||
};
|
||||
eff.delay(150);
|
||||
});
|
||||
container.addEvent('hide', function() {
|
||||
@ -208,11 +288,11 @@ editor.Help = {
|
||||
textContainer.innerHTML = text;
|
||||
textContainer.inject(container);
|
||||
|
||||
container.addEvent('mouseover', function(event){
|
||||
container.addEvent('mouseover', function() {
|
||||
$(this).setStyle('border-top', '1px solid #BBB4D6');
|
||||
$(this).setStyle('border-bottom', '1px solid #BBB4D6');
|
||||
}.bindWithEvent(container));
|
||||
container.addEvent('mouseout', function(event){
|
||||
container.addEvent('mouseout', function() {
|
||||
$(this).setStyle('border-top', '1px solid transparent');
|
||||
$(this).setStyle('border-bottom', '1px solid transparent');
|
||||
|
||||
@ -225,6 +305,7 @@ editor.Help = {
|
||||
// Show loading dialog ...
|
||||
waitDialog = new editor.WaitDialog();
|
||||
waitDialog.show();
|
||||
errorDialog = new editor.FatalErrorDialog();
|
||||
|
||||
// Loading libraries ...
|
||||
Asset.javascript("../js/mindplot-min.js");
|
||||
Asset.javascript("js/mindplot-min.js");
|
||||
|
48
wise-editor/src/main/webapp/samples/welcome-reloaded.xml
Normal file
48
wise-editor/src/main/webapp/samples/welcome-reloaded.xml
Normal file
@ -0,0 +1,48 @@
|
||||
<map name="welcome" version="tango">
|
||||
<topic central="true" text="Welcome To WiseMapping" id="1" fontStyle=";;#dfcfe6;;;" bgColor="#0a0a08">
|
||||
<topic position="178,-130" order="0" text="Try it Now!" id="11" fontStyle=";;#ffffff;;;" bgColor="#250be3"
|
||||
brColor="#080559">
|
||||
<topic position="272,-156" order="0" text="Double Click" id="12" fontStyle=";;#001be6;;italic;"/>
|
||||
<topic position="274,-130" order="1" text=" INS to insert" id="13" fontStyle=";;#001be6;;italic;"/>
|
||||
<topic position="285,-104" order="2" text="Drag map to move" id="14" fontStyle=";;#001be6;;italic;"/>
|
||||
</topic>
|
||||
<topic position="-189,-52" order="1" text="Productivity" id="2" fontStyle=";;#104f11;;;" bgColor="#d9b518">
|
||||
<icon id="chart_bar"/>
|
||||
<topic position="-310,-104" order="0" text="Share your ideas" id="3">
|
||||
<icon id="bulb_light_on"/>
|
||||
</topic>
|
||||
<topic position="-299,-25" order="2" text="Brainstorming" id="4"/>
|
||||
<topic position="-283,1" order="3" text="Visual " id="5"/>
|
||||
<topic position="-307,-65" order="1" shape="image" image="80,43:images/logo-small.png" id="27"
|
||||
metadata="{'media':'video,'url':'http://www.youtube.com/watch?v=P3FrXftyuzw&feature=g-vrec&context=G2b4ab69RVAAAAAAAAAA'}"/>
|
||||
</topic>
|
||||
<topic position="185,-39" order="2" text="Mind Mapping" id="6" fontStyle=";;#602378;;;" bgColor="#edabff">
|
||||
<topic position="303,-78" order="0" text="Share with Collegues" id="7"/>
|
||||
<topic position="275,-52" order="1" text="Online" id="8"/>
|
||||
<topic position="299,-26" order="2" text="Anyplace, Anytime" id="9"/>
|
||||
<topic position="277,0" order="3" text="Free!!!" id="10"/>
|
||||
</topic>
|
||||
<topic position="-183,66" order="3" text="Web 2.0 Tool" id="22" fontStyle=";;#0c1d6b;;;" bgColor="#add1f7">
|
||||
<topic position="-281,27" order="0" text="Collaborate" id="23"/>
|
||||
<topic position="-302,53" order="1" text="No plugin required" id="24">
|
||||
<icon id="conn_disconnect"/>
|
||||
</topic>
|
||||
<topic position="-271,79" order="2" text="Share" id="25"/>
|
||||
<topic position="-282,105" order="3" text="Easy to use" id="26"/>
|
||||
</topic>
|
||||
<topic position="171,91" order="4" text="Features" id="15">
|
||||
<topic position="266,26" order="0" text="Links to Sites" id="16" fontStyle=";6;;;;">
|
||||
<link url="http://www.digg.com" type="url"/>
|
||||
</topic>
|
||||
<topic position="245,52" order="1" text="Fonts" id="17"/>
|
||||
<topic position="255,78" order="2" text="Topic Color" id="18"/>
|
||||
<topic position="260,104" order="3" text="Topic Shapes" shape="line" id="19"/>
|
||||
<topic position="252,130" order="4" text="Icons" id="20">
|
||||
<icon id="object_rainbow"/>
|
||||
</topic>
|
||||
<topic position="272,156" order="5" text="History Changes" id="21">
|
||||
<icon id="arrowc_turn_left"/>
|
||||
</topic>
|
||||
</topic>
|
||||
</topic>
|
||||
</map>
|
@ -77,6 +77,24 @@
|
||||
<version>${org.springframework.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-beans</artifactId>
|
||||
<version>${org.springframework.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-tx</artifactId>
|
||||
<version>${org.springframework.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-context</artifactId>
|
||||
<version>${org.springframework.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-web</artifactId>
|
||||
@ -94,10 +112,32 @@
|
||||
<artifactId>jaxb-api</artifactId>
|
||||
<version>2.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-logging</groupId>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
<version>1.0.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax.xml.bind</groupId>
|
||||
<artifactId>jsr173_api</artifactId>
|
||||
<version>1.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.xmlgraphics</groupId>
|
||||
<artifactId>fop</artifactId>
|
||||
<version>0.94</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-oxm</artifactId>
|
||||
<version>${org.springframework.version}</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-context-support</artifactId>
|
||||
<version>${org.springframework.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>antlr</groupId>
|
||||
@ -133,19 +173,25 @@
|
||||
<groupId>org.springframework.security</groupId>
|
||||
<artifactId>spring-security-web</artifactId>
|
||||
<version>${org.springframework.version}</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.security</groupId>
|
||||
<artifactId>spring-security-core</artifactId>
|
||||
<version>${org.springframework.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.security</groupId>
|
||||
<artifactId>spring-security-config</artifactId>
|
||||
<version>${org.springframework.version}</version>
|
||||
<scope>compile</scope>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax.transaction</groupId>
|
||||
<artifactId>jta</artifactId>
|
||||
<version>1.0.1B</version>
|
||||
<scope>compile</scope>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.octo.captcha</groupId>
|
||||
@ -157,37 +203,25 @@
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-jdbc</artifactId>
|
||||
<version>${org.springframework.version}</version>
|
||||
<scope>compile</scope>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hibernate</groupId>
|
||||
<artifactId>hibernate-entitymanager</artifactId>
|
||||
<version>3.6.0.Final</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.xmlgraphics</groupId>
|
||||
<artifactId>batik-codec</artifactId>
|
||||
<version>1.7</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.directwebremoting</groupId>
|
||||
<artifactId>dwr</artifactId>
|
||||
<version>2.0.3</version>
|
||||
<groupId>org.hibernate</groupId>
|
||||
<artifactId>hibernate-core</artifactId>
|
||||
<version>3.6.0.Final</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.xmlgraphics</groupId>
|
||||
<artifactId>batik-svg-dom</artifactId>
|
||||
<version>1.7</version>
|
||||
<groupId>aopalliance</groupId>
|
||||
<artifactId>aopalliance</artifactId>
|
||||
<version>1.0</version>
|
||||
<scope>compile</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>xalan</groupId>
|
||||
<artifactId>xalan</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.xmlgraphics</groupId>
|
||||
@ -211,7 +245,7 @@
|
||||
<groupId>javax.servlet</groupId>
|
||||
<artifactId>jstl</artifactId>
|
||||
<version>1.2</version>
|
||||
<scope>runtime</scope>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax.mail</groupId>
|
||||
@ -245,9 +279,9 @@
|
||||
</dependency>
|
||||
<!-- Only for test purposes -->
|
||||
<dependency>
|
||||
<groupId>hsqldb</groupId>
|
||||
<groupId>org.hsqldb</groupId>
|
||||
<artifactId>hsqldb</artifactId>
|
||||
<version>1.8.0.10</version>
|
||||
<version>2.2.8</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@ -260,24 +294,31 @@
|
||||
<groupId>org.codehaus.jackson</groupId>
|
||||
<artifactId>jackson-mapper-asl</artifactId>
|
||||
<version>1.9.4</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.thoughtworks.xstream</groupId>
|
||||
<artifactId>xstream</artifactId>
|
||||
<version>1.3.1</version>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
<version>1.6.4</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>xerces</groupId>
|
||||
<artifactId>xercesImpl</artifactId>
|
||||
<version>2.10.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>sql-maven-plugin</artifactId>
|
||||
<version>1.2</version>
|
||||
<version>1.5</version>
|
||||
|
||||
<configuration>
|
||||
<driver>org.hsqldb.jdbcDriver</driver>
|
||||
<driver>org.hsqldb.jdbc.JDBCDriver</driver>
|
||||
<url>jdbc:hsqldb:file:${basedir}/target/db/wisemapping</url>
|
||||
<username>sa</username>
|
||||
<!--all executions are ignored if -Dmaven.test.skipDB=true
|
||||
@ -293,9 +334,9 @@
|
||||
<version>5.1.5</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>hsqldb</groupId>
|
||||
<groupId>org.hsqldb</groupId>
|
||||
<artifactId>hsqldb</artifactId>
|
||||
<version>1.8.0.1</version>
|
||||
<version>2.2.8</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
@ -317,6 +358,7 @@
|
||||
</fileset>
|
||||
</configuration>
|
||||
</execution>
|
||||
|
||||
<execution>
|
||||
<id>create-schema</id>
|
||||
<phase>test</phase>
|
||||
@ -419,25 +461,94 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>2.7.2</version>
|
||||
<configuration>
|
||||
<parallel>true</parallel>
|
||||
<suiteXmlFiles>
|
||||
<suiteXmlFile>testng.xml</suiteXmlFile>
|
||||
</suiteXmlFiles>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
|
||||
<plugin>
|
||||
<groupId>org.mortbay.jetty</groupId>
|
||||
<artifactId>jetty-maven-plugin</artifactId>
|
||||
<version>8.1.0.v20120127</version>
|
||||
<configuration>
|
||||
<stopKey>foo</stopKey>
|
||||
<stopPort>9999</stopPort>
|
||||
<war>${project.build.directory}/wisemapping.war</war>
|
||||
<reload>automatic</reload>
|
||||
<scanIntervalSeconds>10</scanIntervalSeconds>
|
||||
<!--<scanIntervalSeconds>10</scanIntervalSeconds>-->
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>start-jetty</id>
|
||||
<phase>pre-integration-test</phase>
|
||||
<goals>
|
||||
<goal>run-war</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<scanIntervalSeconds>0</scanIntervalSeconds>
|
||||
<daemon>true</daemon>
|
||||
</configuration>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>stop-jetty</id>
|
||||
<phase>post-integration-test</phase>
|
||||
<goals>
|
||||
<goal>stop</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.jvnet.jaxb2.maven2</groupId>
|
||||
<artifactId>maven-jaxb2-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>mindmap-generate</id>
|
||||
<goals>
|
||||
<goal>generate</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<schemaDirectory>src/main/resources/</schemaDirectory>
|
||||
<schemaIncludes>
|
||||
<include>mindmap.xsd</include>
|
||||
</schemaIncludes>
|
||||
<bindingDirectory>src/main/resources/</bindingDirectory>
|
||||
<bindingIncludes>
|
||||
<include>mindmap.xjb</include>
|
||||
</bindingIncludes>
|
||||
<generatePackage>com.wisemapping.jaxb.wisemap</generatePackage>
|
||||
<generateDirectory>${project.build.directory}/generated-sources/xjc1</generateDirectory>
|
||||
</configuration>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>freemind-generate</id>
|
||||
<goals>
|
||||
<goal>generate</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<schemaDirectory>src/main/resources/</schemaDirectory>
|
||||
<schemaIncludes>
|
||||
<include>freemind_0.9.0.xsd</include>
|
||||
</schemaIncludes>
|
||||
<bindingDirectory>src/main/resources/</bindingDirectory>
|
||||
<bindingIncludes>
|
||||
<include>freemind_0.9.0.xjb</include>
|
||||
</bindingIncludes>
|
||||
<generatePackage>com.wisemapping.jaxb.freemind</generatePackage>
|
||||
<generateDirectory>${project.build.directory}/generated-sources/xjc2</generateDirectory>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-failsafe-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>integration-test</goal>
|
||||
<goal>verify</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
@ -43,7 +43,7 @@ public class ActivationController
|
||||
try
|
||||
{
|
||||
final String code = request.getParameter("code");
|
||||
userService.activateAcount(Long.parseLong(code));
|
||||
userService.activateAccount(Long.parseLong(code));
|
||||
modelAndView = new ModelAndView("activationAccountConfirmation");
|
||||
}
|
||||
catch (Throwable exc)
|
||||
|
@ -48,7 +48,7 @@ public class EmbeddedViewController extends BaseMultiActionController {
|
||||
if (userAgent.isBrowserSupported()) {
|
||||
view = new ModelAndView("embeddedView");
|
||||
view.addObject("mindmap", mindmap);
|
||||
final String xmlMap = mindmap.getNativeXmlAsJsLiteral();
|
||||
final String xmlMap = mindmap.getXmlAsJsLiteral();
|
||||
view.addObject("mapXml", xmlMap);
|
||||
|
||||
final String zoomStr = httpServletRequest.getParameter("zoom");
|
||||
|
@ -1,214 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package com.wisemapping.controller;
|
||||
|
||||
import com.wisemapping.exporter.ExportException;
|
||||
import com.wisemapping.exporter.ExportFormat;
|
||||
import com.wisemapping.exporter.ExporterFactory;
|
||||
import com.wisemapping.model.MindMap;
|
||||
import com.wisemapping.service.MindmapService;
|
||||
import com.wisemapping.view.MindMapBean;
|
||||
import com.wisemapping.exporter.ExportProperties;
|
||||
import com.wisemapping.filter.UserAgent;
|
||||
import org.apache.batik.transcoder.TranscoderException;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException;
|
||||
import org.xml.sax.SAXException;
|
||||
import sun.misc.BASE64Encoder;
|
||||
|
||||
import javax.servlet.ServletOutputStream;
|
||||
import javax.servlet.ServletContext;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.xml.bind.JAXBException;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.stream.XMLStreamException;
|
||||
import javax.xml.transform.TransformerException;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
|
||||
public class ExportController extends BaseMultiActionController {
|
||||
private static final String IMG_EXPORT_FORMAT = "IMG_EXPORT_FORMAT";
|
||||
private static final String MAP_ID_PARAMETER = "mapId";
|
||||
private static final String MAP_SVG_PARAMETER = "mapSvg";
|
||||
private static final String EXPORT_FORMAT_PARAMETER = "exportFormat";
|
||||
private static final String IMG_SIZE_PARAMETER = "imgSize";
|
||||
private static final String MAP_XML_PARAM = "mapXml";
|
||||
|
||||
|
||||
public ModelAndView handleNoSuchRequestHandlingMethod(NoSuchRequestHandlingMethodException noSuchRequestHandlingMethodException, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
|
||||
logger.info("Mindmap Controller: EXPORT action");
|
||||
final MindMap mindmap = getMindmapFromRequest(httpServletRequest);
|
||||
return new ModelAndView("mindmapExport", "mindmap", new MindMapBean(mindmap));
|
||||
}
|
||||
|
||||
public ModelAndView export(HttpServletRequest request, HttpServletResponse response) throws TranscoderException, IOException, JAXBException {
|
||||
logger.info("Export Controller: exporting WiseMap action");
|
||||
|
||||
final String mapIdStr = request.getParameter(MAP_ID_PARAMETER);
|
||||
if (mapIdStr != null) {
|
||||
final String mapSvg = request.getParameter(MAP_SVG_PARAMETER);
|
||||
try {
|
||||
|
||||
int mindmapId = Integer.parseInt(mapIdStr);
|
||||
|
||||
logger.debug("SVG Map to export:" + mapSvg);
|
||||
if (mapSvg == null || mapSvg.isEmpty()) {
|
||||
throw new IllegalArgumentException("SVG map could not be null");
|
||||
}
|
||||
|
||||
String formatStr = request.getParameter(EXPORT_FORMAT_PARAMETER);
|
||||
if (IMG_EXPORT_FORMAT.endsWith(formatStr)) {
|
||||
formatStr = request.getParameter("imgFormat");
|
||||
}
|
||||
|
||||
final MindmapService service = getMindmapService();
|
||||
final MindMap mindMap = service.getMindmapById(mindmapId);
|
||||
|
||||
// Build format properties ...
|
||||
final ExportFormat format = ExportFormat.valueOf(formatStr);
|
||||
final ExportProperties properties = ExportProperties.create(format);
|
||||
if (properties instanceof ExportProperties.ImageProperties) {
|
||||
final String sizeStr = request.getParameter(IMG_SIZE_PARAMETER);
|
||||
final ExportProperties.ImageProperties imageProperties = (ExportProperties.ImageProperties) properties;
|
||||
if (sizeStr != null) {
|
||||
final ExportProperties.ImageProperties.Size size = ExportProperties.ImageProperties.Size.valueOf(sizeStr);
|
||||
imageProperties.setSize(size);
|
||||
} else {
|
||||
imageProperties.setSize(ExportProperties.ImageProperties.Size.LARGE);
|
||||
}
|
||||
}
|
||||
|
||||
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||
|
||||
// Change image link URL.
|
||||
setBaseBaseImgUrl(format, properties);
|
||||
ExporterFactory.export(properties, mindMap.getUnzippedXml(), bos, mapSvg);
|
||||
|
||||
// If the export goes ok, write the map to the stream ...
|
||||
|
||||
// Set format content type...
|
||||
final String contentType = format.getContentType();
|
||||
response.setContentType(contentType);
|
||||
|
||||
// Set file name...
|
||||
final String fileName = mindMap.getTitle() + "." + format.getFileExtension();
|
||||
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
|
||||
|
||||
// Write content ...
|
||||
final ServletOutputStream outputStream = response.getOutputStream();
|
||||
outputStream.write(bos.toByteArray());
|
||||
|
||||
|
||||
} catch (Throwable e) {
|
||||
logger.error("Unexpexted error during export process", e);
|
||||
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
|
||||
logger.error("map: " + mapSvg);
|
||||
}
|
||||
} else {
|
||||
logger.warn("mapIdStr is null.Image could not be imported. UserAgent:" + request.getHeaders(UserAgent.USER_AGENT_HEADER));
|
||||
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void setBaseBaseImgUrl(@NotNull ExportFormat format, @NotNull ExportProperties properties) {
|
||||
|
||||
final String baseUrl;
|
||||
if (format == ExportFormat.SVG) {
|
||||
baseUrl = "http://www.wisemapping.com/images";
|
||||
} else {
|
||||
final ServletContext servletContext = this.getServletContext();
|
||||
baseUrl = "file://" + servletContext.getRealPath("/icons/") + "/";
|
||||
}
|
||||
properties.setBaseImagePath(baseUrl);
|
||||
}
|
||||
|
||||
public ModelAndView print(HttpServletRequest request, HttpServletResponse response) throws TranscoderException, IOException, JAXBException {
|
||||
logger.info("Export Controller: printing WiseMap action");
|
||||
|
||||
final String mapIdStr = request.getParameter(MAP_ID_PARAMETER);
|
||||
int mindmapId = Integer.parseInt(mapIdStr);
|
||||
final MindmapService service = getMindmapService();
|
||||
final MindMap mindmap = service.getMindmapById(mindmapId);
|
||||
final String mapSvg = request.getParameter(MAP_SVG_PARAMETER);
|
||||
|
||||
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||
try {
|
||||
exportImage(response, mapSvg, bos, false);
|
||||
} catch (Throwable e) {
|
||||
logger.error("Unexpexted error generating the image", e);
|
||||
logger.error("map: " + mapSvg);
|
||||
}
|
||||
|
||||
BASE64Encoder encoder = new BASE64Encoder();
|
||||
String content = encoder.encode(bos.toByteArray());
|
||||
final String exportContent = "data:image/png;base64," + content;
|
||||
bos.close();
|
||||
|
||||
ModelAndView view = new ModelAndView("mindmapPrint", "mindmap", new MindMapBean(mindmap));
|
||||
final String xmlMap = mindmap.getNativeXmlAsJsLiteral();
|
||||
view.addObject(MAP_XML_PARAM, xmlMap);
|
||||
view.addObject(MAP_SVG_PARAMETER, exportContent);
|
||||
|
||||
return view;
|
||||
|
||||
}
|
||||
|
||||
public ModelAndView image(HttpServletRequest request, HttpServletResponse response) throws TranscoderException, IOException, JAXBException {
|
||||
logger.info("Export Controller: generating image WiseMap action");
|
||||
|
||||
final String mapIdStr = request.getParameter(MAP_ID_PARAMETER);
|
||||
final String mapSvg = request.getParameter(MAP_SVG_PARAMETER);
|
||||
try {
|
||||
final ServletOutputStream outputStream = response.getOutputStream();
|
||||
|
||||
exportImage(response, mapSvg, outputStream, true);
|
||||
|
||||
|
||||
} catch (Throwable e) {
|
||||
logger.error("Unexpexted error generating the image", e);
|
||||
logger.error("map: " + mapSvg);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void exportImage(HttpServletResponse response, String mapSvg, OutputStream outputStream, boolean setOutput) throws TranscoderException, IOException, ParserConfigurationException, SAXException, XMLStreamException, TransformerException, JAXBException, ExportException {
|
||||
|
||||
//Image Format
|
||||
ExportFormat imageFormat = ExportFormat.PNG;
|
||||
|
||||
// Build format properties ...
|
||||
final ExportProperties.ImageProperties imageProperties = new ExportProperties.ImageProperties(imageFormat);
|
||||
imageProperties.setSize(ExportProperties.ImageProperties.Size.XMEDIUM);
|
||||
|
||||
// Change image link URL.
|
||||
setBaseBaseImgUrl(imageFormat, imageProperties);
|
||||
|
||||
// Set format content type...
|
||||
if (setOutput)
|
||||
response.setContentType(imageFormat.getContentType());
|
||||
|
||||
// Write content ...
|
||||
ExporterFactory.export(imageProperties, null, outputStream, mapSvg);
|
||||
}
|
||||
}
|
@ -50,8 +50,8 @@ public class MindmapCooker extends BaseMultiActionController {
|
||||
final int mapId = Integer.parseInt(mindmapId);
|
||||
final MindMap mindmap = getMindmapService().getMindmapById(mapId);
|
||||
|
||||
String nativeXml = httpServletRequest.getParameter("nativeXml");
|
||||
mindmap.setNativeXml(nativeXml);
|
||||
String xml = httpServletRequest.getParameter("xml");
|
||||
mindmap.setXmlStr(xml);
|
||||
|
||||
getMindmapService().updateMindmap(mindmap, false);
|
||||
|
||||
|
@ -58,7 +58,7 @@ public class MindmapEditorController extends BaseMultiActionController {
|
||||
view.addObject("editorTryMode", false);
|
||||
final boolean showHelp = isWelcomeMap(mindmap);
|
||||
view.addObject("showHelp", showHelp);
|
||||
final String xmlMap = mindmap.getNativeXmlAsJsLiteral();
|
||||
final String xmlMap = mindmap.getXmlAsJsLiteral();
|
||||
view.addObject(MAP_XML_PARAM, xmlMap);
|
||||
view.addObject("user", Utils.getUser());
|
||||
}
|
||||
|
@ -85,7 +85,7 @@ public class MindmapSharingController extends BaseMultiActionController {
|
||||
final ColaborationEmail email = new ColaborationEmail();
|
||||
email.setSubject(request.getParameter("subject"));
|
||||
email.setMessage(request.getParameter("message"));
|
||||
getMindmapService().addColaborators(mindMap, emails, role, email);
|
||||
getMindmapService().addCollaborators(mindMap, emails, role, email);
|
||||
|
||||
return new MindMapBean(mindMap);
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user