* Bug #15024 fixed : Xcos labels were not preserved . 00/19200/6
Clément DAVID [Fri, 17 Mar 2017 05:54:44 +0000 (06:54 +0100)]
This commit upgrade the Xcos metamodel for BLOCK and LINK labels. An
owned ANNOTATION is associated as an HTML label and allow each label to be
move-able on the user-interface and a DESCRIPTION field is available
for oneliner (eg. Scilab variable compatible).

XMI serialization has been updated accordingly.
ZCOS format upgrade (backward compatible) the Scilab 5 encoding (as an mxCell).

NOTE: PORT label is still a string

Change-Id: I65f2d628e5359b7b5bdaf093b053d201177057f5

29 files changed:
scilab/CHANGES.md
scilab/modules/scicos/includes/Controller.hxx
scilab/modules/scicos/includes/XMIResource.hxx
scilab/modules/scicos/src/cpp/Controller.cpp
scilab/modules/scicos/src/cpp/Model_getObjectProperties.cpp
scilab/modules/scicos/src/cpp/Model_setObjectProperties.cpp
scilab/modules/scicos/src/cpp/XMIResource_load.cpp
scilab/modules/scicos/src/cpp/XMIResource_save.cpp
scilab/modules/scicos/src/cpp/model/Block.hxx
scilab/modules/scicos/src/cpp/model/Link.hxx
scilab/modules/scicos/src/cpp/view_scilab/LinkAdapter.cpp
scilab/modules/scicos/src/cpp/view_scilab/ModelAdapter.cpp
scilab/modules/scicos/src/cpp/view_scilab/ParamsAdapter.cpp
scilab/modules/xcos/model/Xcos.genmodel
scilab/modules/xcos/model/xcos.ecore
scilab/modules/xcos/src/java/org/scilab/modules/xcos/JavaController.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/actions/EditFormatAction.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/actions/RecentFileAction.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/XcosDiagram.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/model/XcosCell.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/model/XcosCellFactory.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/sax/BlockHandler.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/sax/JGraphXHandler.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/writer/BlockWriter.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/writer/LinkWriter.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/writer/ScilabWriter.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/utils/XcosMessages.java
scilab/modules/xcos/tests/nonreg_tests/bug_15024.tst [new file with mode: 0644]
scilab/modules/xcos/tests/nonreg_tests/bug_15024.zcos [new file with mode: 0644]

index a37fd09..d776000 100644 (file)
@@ -360,6 +360,7 @@ the [development mailing list](dev@lists.scilab.org) for a particular toolbox.
 * [#15015](http://bugzilla.scilab.org/show_bug.cgi?id=15015): Xcos blocks using the `ascii` didn't work
 * [#15019](http://bugzilla.scilab.org/show_bug.cgi?id=15019): Add 'csci6' in the calling of ilib_build in 'Getting started with API_Scilab' help page.
 * [#15023](http://bugzilla.scilab.org/show_bug.cgi?id=15023): `clf()` wrongly reset `figure_id`.
+* [#15024](http://bugzilla.scilab.org/show_bug.cgi?id=15024): Xcos labels were not preserved at diagram compilation.
 * [#15039](http://bugzilla.scilab.org/show_bug.cgi?id=15039): Added demos to showcase Xcos' new graphical features
 * [#15046](http://bugzilla.scilab.org/show_bug.cgi?id=15046): `call` couldn't mix inputs and outputs
 * [#15052](http://bugzilla.scilab.org/show_bug.cgi?id=15052): `getpid` wasn't available anymore
index 2d9893f..df8c42c 100644 (file)
@@ -1,6 +1,7 @@
 /*
- *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- *  Copyright (C) 2014-2016 - Scilab Enterprises - Clement DAVID
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2014-2016 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -176,6 +177,7 @@ private:
     void unlinkVector(model::BaseObject* o, object_properties_t uid_prop, object_properties_t ref_prop);
     void unlink(model::BaseObject* o, object_properties_t uid_prop, object_properties_t ref_prop);
     void deleteVector(model::BaseObject* o, object_properties_t uid_prop);
+    void deleteOwnedReference(model::BaseObject* o, object_properties_t uid_prop);
 };
 
 } /* namespace org_scilab_modules_scicos */
index 488ef69..5c115b9 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2016-2016 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * This file is hereby licensed under the terms of the GNU GPL v2.0,
  * pursuant to article 5.3.4 of the CeCILL v.2.1.
@@ -53,7 +54,7 @@ private:
     int writeBlock(xmlTextWriterPtr writer, ScicosID id);
     int writePort(xmlTextWriterPtr writer, enum object_properties_t container, ScicosID id);
     int writeLink(xmlTextWriterPtr writer, ScicosID id);
-    int writeAnnotation(xmlTextWriterPtr writer, ScicosID id);
+    int writeAnnotation(xmlTextWriterPtr writer, ScicosID id, bool isLabel);
 
     /*
      * Load helpers
index 4b97df0..1d00597 100644 (file)
@@ -1,6 +1,7 @@
 /*
- *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- *  Copyright (C) 2014-2016 - Scilab Enterprises - Clement DAVID
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2014-2016 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -221,12 +222,13 @@ void Controller::deleteObject(ScicosID uid)
         unlinkVector(initial, PARENT_DIAGRAM, CHILDREN);
         unlinkVector(initial, PARENT_BLOCK, CHILDREN);
 
+        deleteOwnedReference(initial, LABEL);
+
         deleteVector(initial, INPUTS);
         deleteVector(initial, OUTPUTS);
         deleteVector(initial, EVENT_INPUTS);
         deleteVector(initial, EVENT_OUTPUTS);
 
-        unlink(initial, CHILDREN, PARENT_BLOCK);
         deleteVector(initial, CHILDREN);
         // FIXME what about REFERENCED_PORT ?
     }
@@ -240,6 +242,8 @@ void Controller::deleteObject(ScicosID uid)
         unlinkVector(initial, PARENT_DIAGRAM, CHILDREN);
         unlinkVector(initial, PARENT_BLOCK, CHILDREN);
 
+        deleteOwnedReference(initial, LABEL);
+
         unlinkVector(initial, SOURCE_PORT, CONNECTED_SIGNALS);
         unlinkVector(initial, DESTINATION_PORT, CONNECTED_SIGNALS);
     }
@@ -328,6 +332,14 @@ void Controller::deleteVector(model::BaseObject* initial, object_properties_t ui
     }
 }
 
+void Controller::deleteOwnedReference(model::BaseObject* o, object_properties_t uid_prop)
+{
+    ScicosID ref;
+    getObjectProperty(o->id(), o->kind(), uid_prop, ref);
+
+    deleteObject(ref);
+}
+
 template<typename T>
 void Controller::cloneProperties(model::BaseObject* initial, model::BaseObject* clone)
 {
index ef4ea3c..d4fb9e2 100644 (file)
@@ -1,6 +1,7 @@
 /*
- *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- *  Copyright (C) 2014-2016 - Scilab Enterprises - Clement DAVID
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2014-2016 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -269,9 +270,6 @@ bool Model::getObjectProperty(model::BaseObject* object, object_properties_t p,
             case DESCRIPTION:
                 o->getDescription(v);
                 return true;
-            case LABEL:
-                o->getLabel(v);
-                return true;
             case UID:
                 o->getUID(v);
                 return true;
@@ -302,12 +300,12 @@ bool Model::getObjectProperty(model::BaseObject* object, object_properties_t p,
         model::Link* o = static_cast<model::Link*>(baseObject);
         switch (p)
         {
+            case DESCRIPTION:
+                o->getDescription(v);
+                return true;
             case STYLE:
                 o->getStyle(v);
                 return true;
-            case LABEL:
-                o->getLabel(v);
-                return true;
             case UID:
                 o->getUID(v);
                 return true;
@@ -374,6 +372,9 @@ bool Model::getObjectProperty(model::BaseObject* object, object_properties_t p,
             case PARENT_BLOCK:
                 o->getParentBlock(v);
                 return true;
+            case LABEL:
+                o->getLabel(v);
+                return true;
             case PORT_REFERENCE:
                 o->getPortReference(v);
                 return true;
@@ -396,6 +397,9 @@ bool Model::getObjectProperty(model::BaseObject* object, object_properties_t p,
             case PARENT_BLOCK:
                 o->getParentBlock(v);
                 return true;
+            case LABEL:
+                o->getLabel(v);
+                return true;
             case SOURCE_PORT:
                 o->getSourcePort(v);
                 return true;
index dec7aba..a4a5413 100644 (file)
@@ -1,6 +1,7 @@
 /*
- *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- *  Copyright (C) 2014-2016 - Scilab Enterprises - Clement DAVID
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2014-2016 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -231,6 +232,8 @@ update_status_t Model::setObjectProperty(model::BaseObject* object, object_prope
                 return o->setParentDiagram(v);
             case PARENT_BLOCK:
                 return o->setParentBlock(v);
+            case RELATED_TO:
+                return o->setRelatedTo(v);
             default:
                 break;
         }
@@ -244,6 +247,8 @@ update_status_t Model::setObjectProperty(model::BaseObject* object, object_prope
                 return o->setParentDiagram(v);
             case PARENT_BLOCK:
                 return o->setParentBlock(v);
+            case LABEL:
+                return o->setLabel(v);
             case PORT_REFERENCE:
                 return o->setPortReference(v);
             default:
@@ -267,6 +272,8 @@ update_status_t Model::setObjectProperty(model::BaseObject* object, object_prope
                 return o->setParentDiagram(v);
             case PARENT_BLOCK:
                 return o->setParentBlock(v);
+            case LABEL:
+                return o->setLabel(v);
             case SOURCE_PORT:
                 return o->setSourcePort(v);
             case DESTINATION_PORT:
@@ -334,8 +341,6 @@ update_status_t Model::setObjectProperty(model::BaseObject* object, object_prope
                 return o->setStyle(v);
             case DESCRIPTION:
                 return o->setDescription(v);
-            case LABEL:
-                return o->setLabel(v);
             case UID:
                 return o->setUID(v);
             default:
@@ -364,8 +369,8 @@ update_status_t Model::setObjectProperty(model::BaseObject* object, object_prope
         {
             case STYLE:
                 return o->setStyle(v);
-            case LABEL:
-                return o->setLabel(v);
+            case DESCRIPTION:
+                return o->setDescription(v);
             case UID:
                 return o->setUID(v);
             default:
index acd3f92..bb7b834 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2016-2016 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * This file is hereby licensed under the terms of the GNU GPL v2.0,
  * pursuant to article 5.3.4 of the CeCILL v.2.1.
@@ -714,6 +715,7 @@ int XMIResource::loadBlock(xmlTextReaderPtr reader, const model::BaseObject& o)
 
     // Layer has no attribute so there is no need to decode it there
     // Geometry is handled as an element
+    // Label is handled as an element
 
     // iterate on attributes
     for (int rc = xmlTextReaderMoveToFirstAttribute(reader); rc > 0; rc = xmlTextReaderMoveToNextAttribute(reader))
@@ -725,9 +727,6 @@ int XMIResource::loadBlock(xmlTextReaderPtr reader, const model::BaseObject& o)
             case e_description:
                 controller.setObjectProperty(o.id(), o.kind(), DESCRIPTION, to_string(xmlTextReaderConstValue(reader)));
                 break;
-            case e_label:
-                controller.setObjectProperty(o.id(), o.kind(), LABEL, to_string(xmlTextReaderConstValue(reader)));
-                break;
             case e_style:
                 controller.setObjectProperty(o.id(), o.kind(), STYLE, to_string(xmlTextReaderConstValue(reader)));
                 break;
@@ -873,6 +872,7 @@ int XMIResource::loadLink(xmlTextReaderPtr reader, const model::BaseObject& o)
 
     // geometry is handled as in independent node
     // controlPoint is handled as in independent node
+    // Label is handled as an element
 
     // iterate on attributes
     for (int rc = xmlTextReaderMoveToFirstAttribute(reader); rc > 0; rc = xmlTextReaderMoveToNextAttribute(reader))
@@ -881,6 +881,9 @@ int XMIResource::loadLink(xmlTextReaderPtr reader, const model::BaseObject& o)
         enum xcosNames current = static_cast<enum xcosNames>(std::distance(constXcosNames.begin(), found));
         switch (current)
         {
+            case e_description:
+                controller.setObjectProperty(o.id(), o.kind(), DESCRIPTION, to_string(xmlTextReaderConstValue(reader)));
+                break;
             case e_uid:
             {
                 std::string uid = to_string(xmlTextReaderConstValue(reader));
@@ -902,9 +905,6 @@ int XMIResource::loadLink(xmlTextReaderPtr reader, const model::BaseObject& o)
             case e_style:
                 controller.setObjectProperty(o.id(), o.kind(), STYLE, to_string(xmlTextReaderConstValue(reader)));
                 break;
-            case e_label:
-                controller.setObjectProperty(o.id(), o.kind(), LABEL, to_string(xmlTextReaderConstValue(reader)));
-                break;
             case e_lineWidth:
             {
                 std::vector<double> thick;
@@ -1242,6 +1242,21 @@ int XMIResource::processElement(xmlTextReaderPtr reader)
                 parent = current;
             }
             return 1;
+        case e_label:
+        {
+            // label is used for attaching an Annotation to its parent
+            ScicosID o = controller.createObject(ANNOTATION);
+
+            // assign the child
+            model::BaseObject parent = processed.back();
+
+            controller.setObjectProperty(o, ANNOTATION, RELATED_TO, parent.id());
+            controller.setObjectProperty(parent.id(), parent.kind(), LABEL, o);
+
+            model::BaseObject child(o, ANNOTATION);
+            processed.push_back(child);
+            return loadAnnotation(reader, child);
+        }
         case e_opar:
             // ipar is a Block property
             return loadBase64(reader, OPAR, processed.back());
index ec58021..fe44aa6 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2016-2016 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * This file is hereby licensed under the terms of the GNU GPL v2.0,
  * pursuant to article 5.3.4 of the CeCILL v.2.1.
@@ -350,7 +351,7 @@ int XMIResource::writeAbstractLayer(xmlTextWriterPtr writer, ScicosID id, kind_t
                 status = writeLink(writer, child);
                 break;
             case ANNOTATION:
-                status = writeAnnotation(writer, child);
+                status = writeAnnotation(writer, child, false);
                 break;
             default:
                 status =  -1;
@@ -605,14 +606,6 @@ int XMIResource::writeBlock(xmlTextWriterPtr writer, ScicosID id)
     }
 
     strValue.clear();
-    controller.getObjectProperty(id, BLOCK, LABEL, strValue);
-    status = xmlTextWriterWriteAttribute(writer, BAD_CAST("label"), BAD_CAST(strValue.c_str()));
-    if (status == -1)
-    {
-        return status;
-    }
-
-    strValue.clear();
     controller.getObjectProperty(id, BLOCK, STYLE, strValue);
     status = xmlTextWriterWriteAttribute(writer, BAD_CAST("style"), BAD_CAST(strValue.c_str()));
     if (status == -1)
@@ -685,6 +678,17 @@ int XMIResource::writeBlock(xmlTextWriterPtr writer, ScicosID id)
         return status;
     }
 
+    ScicosID label;
+    controller.getObjectProperty(id, BLOCK, LABEL, label);
+    if (label != ScicosID())
+    {
+        status = writeAnnotation(writer, label, true);
+        if (status == -1)
+        {
+            return status;
+        }
+    }
+
     std::vector<double> doubleArrayValue;
     controller.getObjectProperty(id, BLOCK, EXPRS, doubleArrayValue);
     if (is_empty_matrix(doubleArrayValue))
@@ -1011,8 +1015,15 @@ int XMIResource::writeLink(xmlTextWriterPtr writer, ScicosID id)
         return status;
     }
 
-    ScicosID idValue;
     std::string strValue;
+    controller.getObjectProperty(id, BLOCK, DESCRIPTION, strValue);
+    status = xmlTextWriterWriteAttribute(writer, BAD_CAST("description"), BAD_CAST(strValue.c_str()));
+    if (status == -1)
+    {
+        return status;
+    }
+
+    ScicosID idValue;
     controller.getObjectProperty(id, LINK, SOURCE_PORT, idValue);
     if (idValue != 0)
     {
@@ -1047,14 +1058,6 @@ int XMIResource::writeLink(xmlTextWriterPtr writer, ScicosID id)
         return status;
     }
 
-    strValue.clear();
-    controller.getObjectProperty(id, LINK, LABEL, strValue);
-    status = xmlTextWriterWriteAttribute(writer, BAD_CAST("label"), BAD_CAST(strValue.c_str()));
-    if (status == -1)
-    {
-        return status;
-    }
-
     int intValue;
     controller.getObjectProperty(id, LINK, COLOR, intValue);
     status = xmlTextWriterWriteAttribute(writer, BAD_CAST("color"), BAD_CAST(to_string(intValue).c_str()));
@@ -1090,6 +1093,17 @@ int XMIResource::writeLink(xmlTextWriterPtr writer, ScicosID id)
         return status;
     }
 
+    ScicosID label;
+    controller.getObjectProperty(id, BLOCK, LABEL, label);
+    if (label != ScicosID())
+    {
+        status = writeAnnotation(writer, label, true);
+        if (status == -1)
+        {
+            return status;
+        }
+    }
+
     std::vector<double> dblArrayValue;
     controller.getObjectProperty(id, LINK, CONTROL_POINTS, dblArrayValue);
     for (unsigned int i = 0; i < dblArrayValue.size(); i += 2)
@@ -1110,11 +1124,18 @@ int XMIResource::writeLink(xmlTextWriterPtr writer, ScicosID id)
     return status;
 }
 
-int XMIResource::writeAnnotation(xmlTextWriterPtr writer, ScicosID id)
+int XMIResource::writeAnnotation(xmlTextWriterPtr writer, ScicosID id, bool asLabel)
 {
     int status;
 
-    status = xmlTextWriterStartElement(writer, BAD_CAST("child"));
+    if (asLabel)
+    {
+        status = xmlTextWriterStartElement(writer, BAD_CAST("label"));
+    }
+    else
+    {
+        status = xmlTextWriterStartElement(writer, BAD_CAST("child"));
+    }
     if (status == -1)
     {
         return status;
index 35a3113..00a461b 100644 (file)
@@ -1,6 +1,7 @@
 /*
- *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- *  Copyright (C) 2014-2016 - Scilab Enterprises - Clement DAVID
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2014-2016 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -201,12 +202,12 @@ private:
         return SUCCESS;
     }
 
-    void getLabel(std::string& data) const
+    void getLabel(ScicosID& data) const
     {
         data = m_label;
     }
 
-    update_status_t setLabel(const std::string& data)
+    update_status_t setLabel(const ScicosID data)
     {
         if (data == m_label)
         {
@@ -686,7 +687,7 @@ private:
     Geometry m_geometry;
     std::vector<double> m_exprs;
     std::string m_description;
-    std::string m_label;
+    ScicosID m_label;
     std::string m_style;
     std::vector<int> m_nzcross;
     std::vector<int> m_nmode;
index 1b06382..fb9967b 100644 (file)
@@ -1,6 +1,7 @@
 /*
- *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- *  Copyright (C) 2014-2016 - Scilab Enterprises - Clement DAVID
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2014-2016 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -97,12 +98,28 @@ private:
         return SUCCESS;
     }
 
-    void getLabel(std::string& data) const
+    void getDescription(std::string& data) const
+    {
+        data = m_description;
+    }
+
+    update_status_t setDescription(const std::string& data)
+    {
+        if (data == m_description)
+        {
+            return NO_CHANGES;
+        }
+
+        m_description = data;
+        return SUCCESS;
+    }
+
+    void getLabel(ScicosID& data) const
     {
         data = m_label;
     }
 
-    update_status_t setLabel(const std::string& data)
+    update_status_t setLabel(const ScicosID data)
     {
         if (data == m_label)
         {
@@ -255,7 +272,9 @@ private:
     // used to store, user-defined control points
     std::vector<double> m_controlPoints;
 
-    std::string m_label;
+    std::string m_description;
+    ScicosID m_label;
+
     std::string m_style;
     std::vector<double> m_thick;
     int m_color;
index 252e2c2..77f8b35 100644 (file)
@@ -1,6 +1,7 @@
 /*
- *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- *  Copyright (C) 2014-2016 - Scilab Enterprises - Clement DAVID
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2014-2016 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -185,11 +186,9 @@ struct id
         ScicosID adaptee = adaptor.getAdaptee()->id();
 
         std::string id;
-        controller.getObjectProperty(adaptee, LINK, LABEL, id);
-
-        types::String* o = new types::String(1, 1);
-        o->set(0, id.data());
+        controller.getObjectProperty(adaptee, LINK, DESCRIPTION, id);
 
+        types::String* o = new types::String(id.data());
         return o;
     }
 
@@ -211,10 +210,10 @@ struct id
         ScicosID adaptee = adaptor.getAdaptee()->id();
 
         char* c_str = wide_string_to_UTF8(current->get(0));
-        std::string id(c_str);
+        std::string description(c_str);
         FREE(c_str);
 
-        controller.setObjectProperty(adaptee, LINK, LABEL, id);
+        controller.setObjectProperty(adaptee, LINK, DESCRIPTION, description);
         return true;
     }
 };
@@ -948,7 +947,7 @@ void LinkAdapter::add_partial_links_information(Controller& controller, model::B
 
     switch (original->kind())
     {
-            // add the from / to information if applicable
+        // add the from / to information if applicable
         case LINK:
         {
             auto it = partial_links.find(original->id());
index 944bf96..75cc7d1 100644 (file)
@@ -1,6 +1,7 @@
 /*
- *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- *  Copyright (C) 2014-2016 - Scilab Enterprises - Clement DAVID
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2014-2016 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -1176,15 +1177,25 @@ struct label
     {
         ScicosID adaptee = adaptor.getAdaptee()->id();
 
-        std::string label;
+        ScicosID label;
+        std::string description;
+
         controller.getObjectProperty(adaptee, BLOCK, LABEL, label);
+        if (label != ScicosID())
+        {
+            controller.getObjectProperty(label, ANNOTATION, DESCRIPTION, description);
+        }
+        else
+        {
+            controller.getObjectProperty(adaptee, BLOCK, DESCRIPTION, description);
+        }
 
         types::String* o = new types::String(1, 1);
 
         // safety check ; the returned value should always be a valid C / modelica identifier
-        if (isValidCIdentifier(label))
+        if (isValidCIdentifier(description))
         {
-            o->set(0, label.data());
+            o->set(0, description.data());
         }
         else
         {
@@ -1211,7 +1222,7 @@ struct label
         ScicosID adaptee = adaptor.getAdaptee()->id();
 
         char* c_str = wide_string_to_UTF8(current->get(0));
-        std::string label(c_str);
+        std::string description(c_str);
         FREE(c_str);
 
         // TODO: validate a C/Scilab identifier only
@@ -1221,7 +1232,7 @@ struct label
         //            return false;
         //        }
 
-        controller.setObjectProperty(adaptee, BLOCK, LABEL, label);
+        controller.setObjectProperty(adaptee, BLOCK, DESCRIPTION, description);
         return true;
     }
 };
index 67d70a3..ea8dd9f 100644 (file)
@@ -1,6 +1,7 @@
 /*
- *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- *  Copyright (C) 2014-2016 - Scilab Enterprises - Clement DAVID
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2014-2016 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -102,7 +103,7 @@ struct title
         }
         else
         {
-            controller.getObjectProperty(adaptee, BLOCK, LABEL, title);
+            controller.getObjectProperty(adaptee, BLOCK, DESCRIPTION, title);
         }
 
         types::String* o = new types::String(2, 1);
@@ -153,7 +154,7 @@ struct title
         }
         else
         {
-            controller.setObjectProperty(adaptee, BLOCK, TITLE, title);
+            controller.setObjectProperty(adaptee, BLOCK, DESCRIPTION, title);
         }
         return true;
     }
index a01ecbd..274f03e 100644 (file)
@@ -71,7 +71,7 @@
     <genClasses ecoreClass="xcos.ecore#//Block">
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference xcos.ecore#//Block/geometry"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute xcos.ecore#//Block/description"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute xcos.ecore#//Block/label"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference xcos.ecore#//Block/label"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute xcos.ecore#//Block/style"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute xcos.ecore#//Block/interfaceFunction"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute xcos.ecore#//Block/expression"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference xcos.ecore#//Link/geometry"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference xcos.ecore#//Link/controlPoint"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute xcos.ecore#//Link/style"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute xcos.ecore#//Link/label"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute xcos.ecore#//Link/description"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference xcos.ecore#//Block/label"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute xcos.ecore#//Link/lineWidth"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute xcos.ecore#//Link/lineHeight"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute xcos.ecore#//Link/color"/>
index a607e6c..0a05a6e 100644 (file)
         containment="true" resolveProxies="false"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="description" unique="false"
         eType="ecore:EDataType ../../../org.eclipse.emf.ecore/model/Ecore.ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="label" unique="false" eType="ecore:EDataType ../../../org.eclipse.emf.ecore/model/Ecore.ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="label" eType="#//Annotation"
+        containment="true" resolveProxies="false"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="style" unique="false" eType="ecore:EDataType ../../../org.eclipse.emf.ecore/model/Ecore.ecore#//EString"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="interfaceFunction" unique="false"
         eType="ecore:EDataType ../../../org.eclipse.emf.ecore/model/Ecore.ecore#//EString"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="controlPoint" upperBound="-1"
         eType="#//Point" containment="true" resolveProxies="false"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="style" unique="false" eType="ecore:EDataType ../../../org.eclipse.emf.ecore/model/Ecore.ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="label" unique="false" eType="ecore:EDataType ../../../org.eclipse.emf.ecore/model/Ecore.ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="label" eType="#//Annotation"
+        containment="true" resolveProxies="false"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="description" unique="false"
+        eType="ecore:EDataType ../../../org.eclipse.emf.ecore/model/Ecore.ecore#//EString"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="lineWidth" unique="false"
         eType="ecore:EDataType ../../../org.eclipse.emf.ecore/model/Ecore.ecore#//EDouble"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="lineHeight" unique="false"
index 9396d0b..481cf99 100644 (file)
@@ -46,5 +46,4 @@ public class JavaController extends Controller {
     JavaControllerJNI.unregister_view(View.getCPtr(view), view);
     remove_reference(view);
   }
-
 }
index f4d1ab1..93a4e69 100644 (file)
@@ -2,6 +2,7 @@
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2010-2011 - DIGITEO - Clement DAVID
  * Copyright (C) 2011-2015 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -53,6 +54,9 @@ import com.mxgraph.util.mxConstants;
 import com.mxgraph.util.mxEvent;
 import com.mxgraph.util.mxEventObject;
 import com.mxgraph.util.mxUtils;
+import javax.swing.AbstractAction;
+import org.scilab.modules.localization.Messages;
+import org.scilab.modules.xcos.block.BasicBlock;
 
 /**
  * Customize the block representation.
@@ -153,6 +157,7 @@ public final class EditFormatAction extends DefaultAction {
         int fontSize;
         int fontStyle;
         Color textColor;
+        String description;
         String text;
         String image = null;
 
@@ -238,6 +243,16 @@ public final class EditFormatAction extends DefaultAction {
         }
 
         /*
+         * Description
+         */
+        final Object currentValue = model.getValue(cell);
+        if (currentValue == null) {
+            description = "";
+        } else {
+            description = currentValue.toString();
+        }
+
+        /*
          * Text
          */
         final Object current = model.getValue(identifier);
@@ -248,7 +263,7 @@ public final class EditFormatAction extends DefaultAction {
         }
 
         EditFormatDialog dialog = new EditFormatDialog(window);
-        dialog.setValues(border, fill, font, fontSize, fontStyle, textColor, text, image);
+        dialog.setValues(border, fill, font, fontSize, fontStyle, textColor, description, text, image);
         dialog.setGraph(graph);
         dialog.setCell(cell);
         return dialog;
@@ -276,6 +291,8 @@ public final class EditFormatAction extends DefaultAction {
      *            is the text italic ?
      * @param textColor
      *            the selected color
+     * @param oneliner
+     *            the one-line description text
      * @param text
      *            the typed text
      * @param image
@@ -283,7 +300,7 @@ public final class EditFormatAction extends DefaultAction {
      */
     // CSOFF: NPathComplexity
     private static void updateFromDialog(EditFormatDialog dialog, Color borderColor, Color backgroundColor, String fontName, int fontSize, Color textColor,
-                                         boolean isBold, boolean isItalic, String text, String image) {
+                                         boolean isBold, boolean isItalic, String oneliner, String text, String image) {
         final XcosDiagram graph = dialog.getGraph();
         final mxGraphModel model = (mxGraphModel) graph.getModel();
 
@@ -339,15 +356,11 @@ public final class EditFormatAction extends DefaultAction {
             model.setStyle(identifier, identifierStyle.toString());
         }
 
+        graph.cellLabelChanged(cell, oneliner, false);
+        graph.fireEvent(new mxEventObject(mxEvent.LABEL_CHANGED, "cell", cell, "value", text, "parent", cell.getParent()));
+
         graph.cellLabelChanged(identifier, text, false);
         graph.fireEvent(new mxEventObject(mxEvent.LABEL_CHANGED, "cell", identifier, "value", text, "parent", cell));
-
-        /*
-         * Should also update diagram title
-         */
-        if (cell instanceof SuperBlock) {
-            graph.cellLabelChanged(cell, text, false);
-        }
     }
 
     // CSON: NPathComplexity
@@ -377,7 +390,7 @@ public final class EditFormatAction extends DefaultAction {
 
         cellStyle.clear();
 
-        dialog.setValues(DEFAULT_BORDERCOLOR, DEFAULT_FILLCOLOR, mxConstants.DEFAULT_FONTFAMILY, mxConstants.DEFAULT_FONTSIZE, 0, DEFAULT_BORDERCOLOR, "", null);
+        dialog.setValues(DEFAULT_BORDERCOLOR, DEFAULT_FILLCOLOR, mxConstants.DEFAULT_FONTFAMILY, mxConstants.DEFAULT_FONTSIZE, 0, DEFAULT_BORDERCOLOR, "", "", null);
 
         dialog.updateFont();
     }
@@ -494,6 +507,7 @@ public final class EditFormatAction extends DefaultAction {
         private javax.swing.JPanel jPanel2;
         private javax.swing.JScrollPane jScrollPane1;
         private javax.swing.JTabbedPane mainTab;
+        private javax.swing.JTextField labelArea;
         private javax.swing.JTextArea textArea;
         private javax.swing.JPanel textFormat;
 
@@ -569,7 +583,7 @@ public final class EditFormatAction extends DefaultAction {
          *            the current URL of the image (may be null, absolute or
          *            relative)
          */
-        public void setValues(Color borderColor, Color backgroundColor, String fontName, int fontSize, int fontStyle, Color textColor, String text, String image) {
+        public void setValues(Color borderColor, Color backgroundColor, String fontName, int fontSize, int fontStyle, Color textColor, String description, String text, String image) {
             borderColorChooser.setColor(borderColor);
             backgroundColorChooser.setColor(backgroundColor);
             textColorChooser.setColor(textColor);
@@ -580,6 +594,7 @@ public final class EditFormatAction extends DefaultAction {
             fontStyleBold.setSelected((fontStyle & mxConstants.FONT_BOLD) != 0);
             fontStyleItalic.setSelected((fontStyle & mxConstants.FONT_ITALIC) != 0);
 
+            labelArea.setText(description);
             textArea.setText(text);
             if (image != null) {
                 imagePath.setText(image);
@@ -663,8 +678,12 @@ public final class EditFormatAction extends DefaultAction {
             imagePath = new javax.swing.JTextField(TEXT_AREA_COLUMNS);
             backgroundPane = new javax.swing.JPanel();
 
+            labelArea = new javax.swing.JTextField();
+            labelArea.setToolTipText(XcosMessages.ONELINE_DESCRIPTION_TOOLTIP);
+
             jScrollPane1 = new javax.swing.JScrollPane();
             textArea = new javax.swing.JTextArea();
+            textArea.setToolTipText(XcosMessages.MULTILINE_DESCRIPTION_TOOLTIP);
 
             textArea.setColumns(TEXT_AREA_COLUMNS);
             textArea.setRows(TEXT_AREA_ROWS);
@@ -673,6 +692,7 @@ public final class EditFormatAction extends DefaultAction {
 
             cancelButton = new javax.swing.JButton(XcosMessages.CANCEL);
             okButton = new javax.swing.JButton(XcosMessages.OK);
+            okButton.setMnemonic(KeyEvent.VK_ENTER);
             resetButton = new javax.swing.JButton(XcosMessages.RESET);
             buttonPane = new javax.swing.JPanel();
 
@@ -762,6 +782,7 @@ public final class EditFormatAction extends DefaultAction {
             jScrollPane1.setViewportView(textArea);
             jScrollPane1.setBackground(Color.WHITE);
 
+            textFormat.add(labelArea, java.awt.BorderLayout.PAGE_START);
             textFormat.add(jScrollPane1, java.awt.BorderLayout.CENTER);
 
             backgroundPane.add(backgroundColorChooser, java.awt.BorderLayout.CENTER);
@@ -808,7 +829,7 @@ public final class EditFormatAction extends DefaultAction {
                     graph.getModel().beginUpdate();
                     EditFormatAction.updateFromDialog(getDialog(), borderColorChooser.getColor(), backgroundColorChooser.getColor(),
                                                       (String) fontNameComboBox.getSelectedItem(), (Integer) fontSizeSpinner.getValue(), textColorChooser.getColor(),
-                                                      fontStyleBold.isSelected(), fontStyleItalic.isSelected(), textArea.getText(), imagePath.getText());
+                                                      fontStyleBold.isSelected(), fontStyleItalic.isSelected(), labelArea.getText(), textArea.getText(), imagePath.getText());
                     graph.getModel().endUpdate();
                     getDialog().dispose();
                 }
@@ -873,6 +894,7 @@ public final class EditFormatAction extends DefaultAction {
             });
 
             getRootPane().setDefaultButton(okButton);
+            labelArea.requestFocusInWindow();
 
             buttonPane.setLayout(new javax.swing.BoxLayout(buttonPane, javax.swing.BoxLayout.LINE_AXIS));
             buttonPane.setBorder(javax.swing.BorderFactory.createEmptyBorder(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE));
index 2ce4d28..be5ce1f 100644 (file)
@@ -36,6 +36,7 @@ import org.scilab.modules.xcos.Xcos;
 import org.scilab.modules.xcos.configuration.ConfigurationManager;
 import org.scilab.modules.xcos.configuration.model.DocumentType;
 import org.scilab.modules.xcos.configuration.utils.ConfigurationConstants;
+import org.scilab.modules.xcos.utils.XcosMessages;
 
 /**
  * Implement the recent file actions.
@@ -45,7 +46,7 @@ import org.scilab.modules.xcos.configuration.utils.ConfigurationConstants;
 @SuppressWarnings(value = { "serial" })
 public final class RecentFileAction extends DefaultAction implements PropertyChangeListener {
     /** Name of the action */
-    public static final String NAME = "";
+    public static final String NAME = XcosMessages.RECENT_FILES;
     /** Icon name of the action */
     public static final String SMALL_ICON = "";
     /** Mnemonic key of the action */
index bb88456..c46045b 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (C) 2009-2010 - DIGITEO - Clement DAVID
  * Copyright (C) 2011-2017 - Scilab Enterprises - Clement DAVID
  * Copyright (C) 2015 - Marcos Cardinot
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -142,12 +143,6 @@ public class XcosDiagram extends ScilabGraph {
     public static final String HASH_IDENTIFIER = "#identifier";
 
     /**
-     * Default geometry used while adding a label to a block (on the middle and
-     * below the bottom of the parent block)
-     */
-    private static final mxGeometry DEFAULT_LABEL_GEOMETRY = new mxGeometry(0.5, 1.1, 0.0, 0.0);
-
-    /**
      * Constructor
      *
      * @param controller the shared controller
@@ -1657,14 +1652,28 @@ public class XcosDiagram extends ScilabGraph {
      * @return the cell identifier.
      */
     public mxCell createCellIdentifier(final mxCell cell) {
-        final mxCell identifier;
+        final XcosCell identifier;
         final String cellId = cell.getId() + HASH_IDENTIFIER;
 
-        identifier = new mxCell(null, (mxGeometry) DEFAULT_LABEL_GEOMETRY.clone(), "noLabel=0;opacity=0;");
-        identifier.getGeometry().setRelative(true);
+        JavaController controller = new JavaController();
+        long uid = controller.createObject(Kind.ANNOTATION);
+
+        final mxGeometry geom;
+        if (cell.isVertex()) {
+            // the vertex label position is relative to its parent
+            geom = new mxGeometry(cell.getGeometry().getWidth() * 0.5, cell.getGeometry().getHeight() * 1.1, 0., 0.);
+        } else {
+            // the edge label position is absolute, its initial position should be computed
+            mxPoint src = cell.getGeometry().getSourcePoint();
+            mxPoint trgt = cell.getGeometry().getTargetPoint();
+
+            geom = new mxGeometry(src.getX(), src.getY(), 0., 0.);
+            geom.translate((trgt.getX() - src.getX()) / 2, (trgt.getY() - src.getY()) / 2);
+        }
+
+        identifier = new XcosCell(new JavaController(), uid, Kind.ANNOTATION, null, geom, "noLabel=0;opacity=0;", cellId);
         identifier.setVertex(true);
         identifier.setConnectable(false);
-        identifier.setId(cellId);
 
         return identifier;
     }
index 4860d7e..d7bf176 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2015-2015 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2015-2017 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -31,6 +32,8 @@ import com.mxgraph.model.mxICell;
 import com.mxgraph.util.mxPoint;
 import java.rmi.server.UID;
 import java.util.regex.Pattern;
+import org.scilab.modules.xcos.block.BasicBlock;
+import org.scilab.modules.xcos.block.TextBlock;
 
 /**
  * An Xcos cell is a JGraphX cell that store most of its information into the
@@ -43,7 +46,7 @@ import java.util.regex.Pattern;
  */
 public class XcosCell extends mxCell {
     private static final long serialVersionUID = 1L;
-    private static Pattern validCIdentifier = Pattern.compile("[a-zA-Z][a-zA-Z0-9_]+");
+    private static final Pattern validCIdentifier = Pattern.compile("[a-zA-Z][a-zA-Z0-9_]+");
 
     private transient ScicosObjectOwner owner;
 
@@ -105,6 +108,7 @@ public class XcosCell extends mxCell {
         setMVCValue(controller, value);
     }
 
+    @SuppressWarnings("fallthrough")
     private void setMVCValue(JavaController controller, Object value) {
         if (value == null) {
             return;
@@ -112,14 +116,14 @@ public class XcosCell extends mxCell {
 
         switch (getKind()) {
             case BLOCK:
-                if (validCIdentifier.matcher(String.valueOf(value)).matches()) {
-                    controller.setObjectProperty(getUID(), getKind(), ObjectProperties.LABEL, String.valueOf(value));
+                if (!(validCIdentifier.matcher(String.valueOf(value)).matches())) {
+                    // a block description should be a valid C / Scilab identifier to ease codegeneration
+                    break;
                 }
-            // no break on purpose
             case ANNOTATION:
+            case LINK:
                 controller.setObjectProperty(getUID(), getKind(), ObjectProperties.DESCRIPTION, String.valueOf(value));
                 break;
-            case LINK:
             case PORT:
                 controller.setObjectProperty(getUID(), getKind(), ObjectProperties.LABEL, String.valueOf(value));
                 break;
@@ -391,6 +395,18 @@ public class XcosCell extends mxCell {
             JavaController controller = new JavaController();
             switch (getKind()) {
                 case ANNOTATION:
+                    if (this instanceof TextBlock) {
+                        // a TEXT_f block inside a superblock diagram
+                        controller.setObjectProperty(getUID(), getKind(), ObjectProperties.PARENT_BLOCK, p.getUID());
+
+                        long[] root = new long[1];
+                        controller.getObjectProperty(p.getUID(), p.getKind(), ObjectProperties.PARENT_DIAGRAM, root);
+                        controller.setObjectProperty(getUID(), getKind(), ObjectProperties.PARENT_DIAGRAM, root[0]);
+                    } else {
+                        // an annotation attached to the block
+                        controller.setObjectProperty(getUID(), getKind(), ObjectProperties.RELATED_TO, p.getUID());
+                    }
+                    break;
                 case BLOCK:
                 case LINK:
                     if (p.getKind() == Kind.DIAGRAM) {
@@ -451,23 +467,41 @@ public class XcosCell extends mxCell {
     public mxICell insert(mxICell child, int index) {
         mxICell inserted = super.insert(child, index);
 
-        // the child might not be an XcosCell but just an mxCell label
-        if (child instanceof XcosCell) {
-            XcosCell c = (XcosCell) child;
-            switch (getKind()) {
-                case BLOCK:
-                    if (c.getKind() == Kind.PORT) {
-                        insertPort(c, index);
-                    } else {
+        // the child might not be an XcosCell but just an mxCell for whatever reason
+        // it will not be stored on the MVC nor saved on purpose.
+        if (!(child instanceof XcosCell)) {
+            return inserted;
+        }
+
+        XcosCell c = (XcosCell) child;
+
+        // the child is a regular object to add in the Diagram / Superblock hierarchy
+        switch (getKind()) {
+            case BLOCK:
+                switch (c.getKind()) {
+                    case ANNOTATION:
+                        if (c instanceof TextBlock) {
+                            // a TEXT_f block inside a superblock
+                            insertChild(c, index);
+                        } else {
+                            // an annotation attached to the block
+                            insertLabel(c);
+                        }
+                        break;
+                    case BLOCK:
+                    case LINK:
                         insertChild(c, index);
-                    }
-                    break;
-                case DIAGRAM:
-                    insertChild(c, index);
-                    break;
-                default:
-                    break;
-            }
+                        break;
+                    case PORT:
+                        insertPort(c, index);
+                        break;
+                }
+                break;
+            case DIAGRAM:
+                insertChild(c, index);
+                break;
+            default:
+                break;
         }
 
         return inserted;
@@ -494,10 +528,16 @@ public class XcosCell extends mxCell {
         VectorOfScicosID children = new VectorOfScicosID();
 
         controller.getObjectProperty(getUID(), getKind(), ObjectProperties.CHILDREN, children);
-        children.add(index, c.getUID());
+        children.add(c.getUID());
         controller.setObjectProperty(getUID(), getKind(), ObjectProperties.CHILDREN, children);
     }
 
+    private void insertLabel(XcosCell c) {
+        JavaController controller = new JavaController();
+
+        controller.setObjectProperty(getUID(), getKind(), ObjectProperties.LABEL, c.getUID());
+    }
+
     /*
      * (non-Javadoc)
      *
@@ -507,23 +547,39 @@ public class XcosCell extends mxCell {
     public mxICell remove(mxICell child) {
         mxICell removed = super.remove(child);
 
-        // the child might not be an XcosCell but just an mxCell label
-        if (child instanceof XcosCell) {
-            XcosCell c = (XcosCell) child;
-            switch (getKind()) {
-                case BLOCK:
-                    if (c.getKind() == Kind.PORT) {
-                        removePort(c);
-                    } else {
+        // the child might not be an XcosCell but just an mxCell for whatever reason
+        // it will not be stored on the MVC nor saved on purpose.
+        if (!(child instanceof XcosCell)) {
+            return removed;
+        }
+
+        XcosCell c = (XcosCell) child;
+        switch (getKind()) {
+            case BLOCK:
+                switch (c.getKind()) {
+                    case ANNOTATION:
+                        if (c instanceof TextBlock) {
+                            // a TEXT_f block inside a superblock
+                            removeChild(c);
+                        } else {
+                            // an annotation attached to the block
+                            removeLabel(c);
+                        }
+                        break;
+                    case BLOCK:
+                    case LINK:
                         removeChild(c);
-                    }
-                    break;
-                case DIAGRAM:
-                    removeChild(c);
-                    break;
-                default:
-                    break;
-            }
+                        break;
+                    case PORT:
+                        removePort(c);
+                        break;
+                }
+                break;
+            case DIAGRAM:
+                removeChild(c);
+                break;
+            default:
+                break;
         }
         return removed;
     }
@@ -567,6 +623,13 @@ public class XcosCell extends mxCell {
         controller.setObjectProperty(getUID(), getKind(), ObjectProperties.CHILDREN, children);
     }
 
+    private void removeLabel(XcosCell c) {
+        JavaController controller = new JavaController();
+
+        controller.setObjectProperty(getUID(), getKind(), ObjectProperties.LABEL, 0);
+        controller.setObjectProperty(c.getUID(), c.getKind(), ObjectProperties.RELATED_TO, 0);
+    }
+
     /*
      * Override methods from Object
      */
index 972f6be..283d1f4 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2015-2015 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2015-2017 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -238,6 +239,13 @@ public final class XcosCellFactory {
                 default:
                     break;
             }
+
+            // add the optionnal label
+            long[] label = { 0 };
+            controller.getObjectProperty(uid, kind, ObjectProperties.LABEL, label);
+            if (label[0] != 0) {
+                cells[i].insert(createAnnotation(controller, label[0], Kind.ANNOTATION));
+            }
         }
 
         /*
@@ -405,7 +413,7 @@ public final class XcosCellFactory {
         }
 
         String value;
-        String[] description = new String[] { "" };
+        String[] description = { null };
         controller.getObjectProperty(uid, kind, ObjectProperties.DESCRIPTION, description);
         value = description[0];
 
@@ -643,8 +651,10 @@ public final class XcosCellFactory {
          * Synchronize model information back to the JGraphX data
          */
 
-        String[] value = new String[] { "" };
-        controller.getObjectProperty(uid, kind, ObjectProperties.LABEL, value);
+        String value;
+        String[] description = { null };
+        controller.getObjectProperty(uid, kind, ObjectProperties.DESCRIPTION, description);
+        value = description[0];
 
         String[] style = new String[] { "" };
         controller.getObjectProperty(uid, kind, ObjectProperties.STYLE, style);
@@ -678,13 +688,13 @@ public final class XcosCellFactory {
         BasicLink link;
         switch (type[0]) {
             case -1:
-                link = new CommandControlLink(controller, uid, kind, value[0], geom, style[0], strUID[0]);
+                link = new CommandControlLink(controller, uid, kind, value, geom, style[0], strUID[0]);
                 break;
             case 1:
-                link = new ExplicitLink(controller, uid, kind, value[0], geom, style[0], strUID[0]);
+                link = new ExplicitLink(controller, uid, kind, value, geom, style[0], strUID[0]);
                 break;
             case 2:
-                link = new ImplicitLink(controller, uid, kind, value[0], geom, style[0], strUID[0]);
+                link = new ImplicitLink(controller, uid, kind, value, geom, style[0], strUID[0]);
                 break;
             default:
                 return null;
@@ -692,4 +702,34 @@ public final class XcosCellFactory {
 
         return link;
     }
+
+    /*
+     * Annotation management
+     */
+
+    private static XcosCell createAnnotation(JavaController controller, long uid, Kind kind) {
+        String[] description = new String[] { "" };
+        controller.getObjectProperty(uid, kind, ObjectProperties.DESCRIPTION, description);
+
+        VectorOfDouble geom = new VectorOfDouble(4);
+        controller.getObjectProperty(uid, kind, ObjectProperties.GEOMETRY, geom);
+
+        double x = geom.get(0);
+        double y = geom.get(1);
+        double w = geom.get(2);
+        double h = geom.get(3);
+        mxGeometry geometry = new mxGeometry(x, y, w, h);
+
+        String[] strUID = new String[1];
+        controller.getObjectProperty(uid, kind, ObjectProperties.UID, strUID);
+
+        String[] style = new String[1];
+        controller.getObjectProperty(uid, kind, ObjectProperties.STYLE, style);
+
+        XcosCell label = new XcosCell(controller, uid, kind, description[0], geometry, style[0], strUID[0]);
+        label.setConnectable(false);
+        label.setVertex(true);
+
+        return label;
+    }
 }
index 3df4513..aa79150 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2015-2015 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -69,9 +70,6 @@ class BlockHandler implements ScilabHandler {
         String value = atts.getValue("value");
         if (value != null) {
             saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.DESCRIPTION, value);
-            if (kind == Kind.BLOCK && saxHandler.validCIdentifier.matcher(value).matches()) {
-                saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.LABEL, value);
-            }
         }
 
         String style = atts.getValue("style");
@@ -194,4 +192,4 @@ class BlockHandler implements ScilabHandler {
     @Override
     public void endElement(HandledElement found) {
     }
-}
\ No newline at end of file
+}
index e709639..8c9b92c 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2015-2015 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2015-2017 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -33,6 +34,8 @@ class JGraphXHandler implements ScilabHandler {
         this.saxHandler = saxHandler;
     }
 
+
+
     @Override
     public Object startElement(HandledElement found, Attributes atts) {
         String v;
@@ -43,14 +46,17 @@ class JGraphXHandler implements ScilabHandler {
                 if (v != null) {
                     long parentUID = saxHandler.allChildren.peek().getOrDefault(v, 0l);
                     if (parentUID != 0) {
-                        v = atts.getValue("value");
-                        if (v != null && saxHandler.validCIdentifier.matcher(v).matches()) {
-                            Kind kind = saxHandler.controller.getKind(parentUID);
-                            saxHandler.controller.setObjectProperty(parentUID, kind, ObjectProperties.LABEL, v);
+                        return decodeCellAnnotation(parentUID, saxHandler.controller.getKind(parentUID), atts);
+                    }
+                } else {
+                    Object parent = saxHandler.parents.peek();
+                    if (parent instanceof XcosCell) {
+                        XcosCell cell = ((XcosCell) parent);
+                        if (cell.getUID() != 0) {
+                            return decodeCellAnnotation(cell.getUID(), cell.getKind(), atts);
                         }
                     }
                 }
-
                 return null;
             }
             case mxGeometry: {
@@ -106,6 +112,29 @@ class JGraphXHandler implements ScilabHandler {
         }
     }
 
+    private XcosCell decodeCellAnnotation(long parentUID, Kind parentKind, Attributes atts) {
+        Kind kind = Kind.ANNOTATION;
+        final long uid = saxHandler.controller.createObject(kind);
+        String value = atts.getValue("value");
+        if (value != null) {
+            saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.DESCRIPTION, value);
+        }
+        String style = atts.getValue("style");
+        if (style != null) {
+            saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.STYLE, style);
+        }
+        String id = atts.getValue("id");
+        if (id != null) {
+            saxHandler.allChildren.peek().put(id, uid);
+        }
+
+        XcosCell label = new XcosCell(saxHandler.controller, uid, kind, value, null, style, id);
+        saxHandler.controller.setObjectProperty(parentUID, parentKind, ObjectProperties.LABEL, label.getUID());
+        saxHandler.controller.setObjectProperty(label.getUID(), label.getKind(), ObjectProperties.RELATED_TO, parentUID);
+
+        return label;
+    }
+
     @Override
     public void endElement(HandledElement found) {
         switch (found) {
index f02fa57..7e0fe22 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2015-2015 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2015-2017 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -93,6 +94,7 @@ public class BlockWriter extends ScilabWriter {
         // delegate the sub-elements to their writers
         shared.rawDataWriter.write(uid, kind);
         new JGraphXWriter(shared).write(uid, kind);
+        writeAnnotationCell(uid, kind);
         new CustomWriter(shared).write(uid, kind);
 
         shared.stream.writeEndElement(); // Block name
index a031272..b3eeef0 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2015-2015 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2015-2017 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -68,7 +69,7 @@ public class LinkWriter extends ScilabWriter {
         shared.controller.getObjectProperty(scicosId[0], Kind.PORT, ObjectProperties.UID, dst);
 
         shared.controller.getObjectProperty(uid, kind, ObjectProperties.STYLE, style);
-        shared.controller.getObjectProperty(uid, kind, ObjectProperties.LABEL, value);
+        shared.controller.getObjectProperty(uid, kind, ObjectProperties.DESCRIPTION, value);
 
         /*
          * Only serialized a fully connected link
@@ -92,6 +93,7 @@ public class LinkWriter extends ScilabWriter {
             shared.stream.writeAttribute("value", escaped);
 
             new JGraphXWriter(shared).write(uid, kind);
+            writeAnnotationCell(uid, kind);
 
             shared.stream.writeEndElement(); // localName
         }
index 2e2bf7e..c626b48 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2015 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2015-2017 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -18,6 +19,7 @@ package org.scilab.modules.xcos.io.writer;
 import javax.xml.stream.XMLStreamException;
 
 import org.scilab.modules.xcos.Kind;
+import org.scilab.modules.xcos.ObjectProperties;
 
 abstract class ScilabWriter {
     protected final XcosWriter shared;
@@ -34,4 +36,40 @@ abstract class ScilabWriter {
      * @throws XMLStreamException on write error
      */
     public abstract void write(long uid, Kind kind) throws XMLStreamException;
+
+    /**
+     * Write the label annotation of an object
+     * @param parentUID the uid to serialize (object with a label).
+     * @param parentKind the kind of uid
+     */
+    public final void writeAnnotationCell(long parentUID, Kind parentKind) throws XMLStreamException {
+        String[] v = {""};
+
+        // write the label as a custom mxCell
+        long[] label = { 0 };
+        shared.controller.getObjectProperty(parentUID, parentKind, ObjectProperties.LABEL, label);
+        if (label[0] != 0) {
+            shared.stream.writeStartElement("mxCell");
+
+            shared.stream.writeAttribute("connectable", "0");
+
+            shared.controller.getObjectProperty(label[0], Kind.ANNOTATION, ObjectProperties.UID, v);
+            shared.stream.writeAttribute("id", v[0]);
+
+            shared.controller.getObjectProperty(label[0],  Kind.ANNOTATION, ObjectProperties.STYLE, v);
+            shared.stream.writeAttribute("style", v[0]);
+
+            shared.controller.getObjectProperty(label[0],  Kind.ANNOTATION, ObjectProperties.DESCRIPTION, v);
+            if (!v[0].isEmpty()) {
+                // remove any '\n' character that will not be preserved by the XML Handlers on re-load
+                String escaped = v[0].replace('\n', ' ');
+                shared.stream.writeAttribute("value", escaped);
+            }
+
+            shared.stream.writeAttribute("vertex", "1");
+
+            new JGraphXWriter(shared).write(label[0], Kind.ANNOTATION);
+            shared.stream.writeEndElement();
+        }
+    }
 }
index 191d31c..594ce6f 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (C) 2009 - DIGITEO - Clement DAVID
  * Copyright (C) 2011-2017 - Scilab Enterprises - Clement DAVID
  * Copyright (C) 2015 - Marcos CARDINOT
+ * Copyright (C) 2017 - ESI Group - Clement DAVID
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -332,6 +333,9 @@ public final class XcosMessages {
     public static final String BLOCK_AUTO_POSITION_SPLIT_BLOCK = Messages.gettext("Split Block");
     public static final String BLOCK_AUTO_POSITION_SPLIT_BLOCK_CONTEXTUAL = Messages.gettext("Auto-Position Split Block");
 
+    public static final String ONELINE_DESCRIPTION_TOOLTIP = Messages.gettext("A one-line description of the block");
+    public static final String MULTILINE_DESCRIPTION_TOOLTIP = Messages.gettext("Annotation (or comment) attached to the object");
+
     // CSON: JavadocVariable
     // CSON: LineLength
     // CSON: MultipleStringLiterals
diff --git a/scilab/modules/xcos/tests/nonreg_tests/bug_15024.tst b/scilab/modules/xcos/tests/nonreg_tests/bug_15024.tst
new file mode 100644 (file)
index 0000000..f44708f
--- /dev/null
@@ -0,0 +1,46 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - ESI Group - Clement DAVID
+//
+// This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- XCOS TEST -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 15024 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=15024
+//
+// <-- Short Description -->
+// the labels were not preserved when reloading a block
+//
+
+loadXcosLibs();
+scicos_log("TRACE");
+
+scs_m = xcosDiagramToScilab(SCI + "/modules/xcos/tests/nonreg_tests/bug_15024.zcos");
+
+// link labels
+assert_checkequal(scs_m.objs(4).id, "link1");
+assert_checkequal(scs_m.objs(5).id, "link2");
+
+// labels inside the superblock
+assert_checkequal(scs_m.objs(3).model.rpar.objs(1).model.label, "bigsom_label")
+assert_checkequal(scs_m.objs(3).model.rpar.objs(2).model.label, "input1")
+assert_checkequal(scs_m.objs(3).model.rpar.objs(3).model.label, "input2")
+
+// save a copy and recheck
+xcosDiagramToScilab(TMPDIR + "/bug_15024.zcos", scs_m);
+scs_m = xcosDiagramToScilab(TMPDIR + "/bug_15024.zcos");
+
+// link labels
+assert_checkequal(scs_m.objs(4).id, "link1");
+assert_checkequal(scs_m.objs(5).id, "link2");
+
+// labels inside the superblock
+assert_checkequal(scs_m.objs(3).model.rpar.objs(1).model.label, "bigsom_label")
+assert_checkequal(scs_m.objs(3).model.rpar.objs(2).model.label, "input1")
+assert_checkequal(scs_m.objs(3).model.rpar.objs(3).model.label, "input2")
+
diff --git a/scilab/modules/xcos/tests/nonreg_tests/bug_15024.zcos b/scilab/modules/xcos/tests/nonreg_tests/bug_15024.zcos
new file mode 100644 (file)
index 0000000..c360a1d
Binary files /dev/null and b/scilab/modules/xcos/tests/nonreg_tests/bug_15024.zcos differ