Xcos MVC: add a default explorer view 00/17000/4
Clément DAVID [Thu, 20 Aug 2015 14:32:34 +0000 (16:32 +0200)]
Implement a Treeshow-like Java view. This also check that everything is
fine while implementing a view with a state in the Event Dispatch
Thread.

Synchronization on Model object creation / deletion should be managed
and a reference have to be stored on the Java side for all used object.
Any access on Controller::getProperty / Controller::setProperty with
invalid uid will return an error status that is passed through the
caller.

As the C -> Java calls are slow, the view is installed on demand. A huge
diagram can be loaded in seconds and the view retrieve data and track
all changes reducing performance once installed.

Change-Id: I79b474aa81db5eb365e2b755e757ccf4bebb0a68

24 files changed:
scilab/modules/scicos/includes/Controller.hxx
scilab/modules/scicos/includes/Model.hxx
scilab/modules/scicos/includes/View.hxx
scilab/modules/scicos/src/cpp/Controller.cpp
scilab/modules/scicos/src/cpp/LoggerView.cpp
scilab/modules/scicos/src/cpp/LoggerView.hxx
scilab/modules/scicos/src/cpp/Model.cpp
scilab/modules/scicos/src/cpp/Model_getObjectProperties.cpp
scilab/modules/scicos/src/cpp/Model_setObjectProperties.cpp
scilab/modules/xcos/src/java/org/scilab/modules/xcos/BrowserView.java [new file with mode: 0644]
scilab/modules/xcos/src/java/org/scilab/modules/xcos/Controller.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/JavaController.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/JavaControllerJNI.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/View.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/Xcos.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/XcosView.java [deleted file]
scilab/modules/xcos/src/java/org/scilab/modules/xcos/actions/ViewDiagramBrowserAction.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/explorer/BrowserTab.java [new file with mode: 0644]
scilab/modules/xcos/src/java/org/scilab/modules/xcos/explorer/BrowserTreeNodeData.java [new file with mode: 0644]
scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/XcosDiagram.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/modelica/Modelica.java
scilab/modules/xcos/src/jni/JavaController.i
scilab/modules/xcos/src/jni/JavaController_wrap.cxx
scilab/modules/xcos/src/jni/JavaController_wrap.h

index 7e6fff0..5fb2411 100644 (file)
@@ -53,6 +53,8 @@ public:
     void deleteObject(ScicosID uid);
     ScicosID cloneObject(ScicosID uid, bool cloneChildren);
 
+    kind_t getKind(ScicosID uid) const;
+    std::vector<ScicosID> getAll(kind_t k) const;
     model::BaseObject* getObject(ScicosID uid) const;
     template<typename T>
     T* getObject(ScicosID uid) const
@@ -70,13 +72,6 @@ public:
     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, T v)
     {
         update_status_t status = m_instance.model.setObjectProperty(uid, k, p, v);
-        if (status == SUCCESS)
-        {
-            for (view_set_t::iterator iter = m_instance.allViews.begin(); iter != m_instance.allViews.end(); ++iter)
-            {
-                (*iter)->propertyUpdated(uid, k, p);
-            }
-        }
         for (view_set_t::iterator iter = m_instance.allViews.begin(); iter != m_instance.allViews.end(); ++iter)
         {
             (*iter)->propertyUpdated(uid, k, p, status);
index d7a1ec7..c5e0be9 100644 (file)
@@ -64,6 +64,8 @@ public:
      * Model custom methods
      */
 
+    kind_t getKind(ScicosID uid) const;
+    std::vector<ScicosID> getAll(kind_t k) const;
     model::BaseObject* getObject(ScicosID uid) const;
     template<typename T>
     T* getObject(ScicosID uid) const
index 6327819..1f717e7 100644 (file)
@@ -26,13 +26,11 @@ public:
     View() {};
     virtual ~View() {};
 
-    virtual void objectCreated(const ScicosID& uid, kind_t k) = 0;
-    virtual void objectDeleted(const ScicosID& uid, kind_t k) = 0;
-    virtual void objectUpdated(const ScicosID& uid, kind_t k) = 0;
-    virtual void propertyUpdated(const ScicosID& uid, kind_t k, object_properties_t p) = 0;
-    virtual void propertyUpdated(const ScicosID& /*uid*/, kind_t /*k*/, object_properties_t /*p*/, update_status_t /*u*/)
-    {
-    };
+    virtual void objectCreated(const ScicosID& uid, kind_t kind) = 0;
+    virtual void objectReferenced(const ScicosID& uid, kind_t kind) = 0;
+    virtual void objectUnreferenced(const ScicosID& uid, kind_t kind) = 0;
+    virtual void objectDeleted(const ScicosID& uid, kind_t kind) = 0;
+    virtual void propertyUpdated(const ScicosID& uid, kind_t kind, object_properties_t property, update_status_t status) = 0;
 };
 
 } /* namespace org_scilab_modules_scicos */
index aef2c39..e6860e8 100644 (file)
@@ -143,6 +143,13 @@ unsigned Controller::referenceObject(const ScicosID uid) const
 {
     unsigned refCount = m_instance.model.referenceObject(uid);
     REF_PRINT(uid, refCount);
+
+    auto o = getObject(uid);
+    for (view_set_t::iterator iter = m_instance.allViews.begin(); iter != m_instance.allViews.end(); ++iter)
+    {
+        (*iter)->objectReferenced(uid, o->kind());
+    }
+
     return refCount;
 }
 
@@ -154,18 +161,24 @@ void Controller::deleteObject(ScicosID uid)
         return;
     }
 
+    auto initial = getObject(uid);
+    const kind_t k = initial->kind();
+
     // if this object has been referenced somewhere else do not delete it but decrement the reference counter
     unsigned& refCount = m_instance.model.referenceCount(uid);
     if (refCount > 0)
     {
         --refCount;
         UNREF_PRINT(uid, refCount);
+
+        for (view_set_t::iterator iter = m_instance.allViews.begin(); iter != m_instance.allViews.end(); ++iter)
+        {
+            (*iter)->objectUnreferenced(uid, k);
+        }
         return;
     }
 
     // We need to delete this object and cleanup all the referenced model object
-    auto initial = getObject(uid);
-    const kind_t k = initial->kind();
 
     // disconnect / remove references of weak connected objects and decrement the reference count of all strongly connected objects.
     if (k == ANNOTATION)
@@ -421,6 +434,16 @@ ScicosID Controller::cloneObject(ScicosID uid, bool cloneChildren)
     return clone;
 }
 
+kind_t Controller::getKind(ScicosID uid) const
+{
+    return m_instance.model.getKind(uid);
+}
+
+std::vector<ScicosID> Controller::getAll(kind_t k) const
+{
+    return m_instance.model.getAll(k);
+}
+
 model::BaseObject* Controller::getObject(ScicosID uid) const
 {
     return m_instance.model.getObject(uid);
index fcaf8c2..937189b 100644 (file)
@@ -409,27 +409,24 @@ void LoggerView::objectCreated(const ScicosID& uid, kind_t k)
     log(LOG_DEBUG, ss);
 }
 
-void LoggerView::objectDeleted(const ScicosID& uid, kind_t k)
+void LoggerView::objectReferenced(const ScicosID& uid, kind_t k)
 {
-    std::stringstream ss;
-    ss << __FUNCTION__ << "( " << uid << " , " << k << " )" << std::endl;
-    log(LOG_DEBUG, ss);
+    // NOT LOGGED YET
 }
 
-void LoggerView::objectUpdated(const ScicosID& uid, kind_t k)
+void LoggerView::objectUnreferenced(const ScicosID& uid, kind_t k)
 {
-    std::stringstream ss;
-    ss << __FUNCTION__ << "( " << uid << " , " << k << " )" << std::endl;
-    log(LOG_DEBUG, ss);
+    // NOT LOGGED YET
 }
 
-void LoggerView::propertyUpdated(const ScicosID& /*uid*/, kind_t /*k*/, object_properties_t /*p*/)
+void LoggerView::objectDeleted(const ScicosID& uid, kind_t k)
 {
-    // do not log anything on success; the message has already been logged
+    std::stringstream ss;
+    ss << __FUNCTION__ << "( " << uid << " , " << k << " )" << std::endl;
+    log(LOG_DEBUG, ss);
 }
 
-void LoggerView::propertyUpdated(const ScicosID& uid, kind_t k, object_properties_t p,
-                                 update_status_t u)
+void LoggerView::propertyUpdated(const ScicosID& uid, kind_t k, object_properties_t p, update_status_t u)
 {
     std::stringstream ss;
     ss << __FUNCTION__ << "( " << uid << " , " << k << " , " << p << " ) : " << u << std::endl;
index 35f0f07..3612586 100644 (file)
@@ -68,9 +68,9 @@ public:
      */
 
     void objectCreated(const ScicosID& uid, kind_t k);
+    void objectReferenced(const ScicosID& uid, kind_t k);
+    void objectUnreferenced(const ScicosID& uid, kind_t k);
     void objectDeleted(const ScicosID& uid, kind_t k);
-    void objectUpdated(const ScicosID& uid, kind_t k);
-    void propertyUpdated(const ScicosID& uid, kind_t k, object_properties_t p);
     void propertyUpdated(const ScicosID& uid, kind_t k, object_properties_t p, update_status_t u);
 
 private:
index 4dc5184..cfb3ba7 100644 (file)
@@ -162,12 +162,32 @@ void Model::deleteObject(ScicosID uid)
     }
 }
 
+kind_t Model::getKind(ScicosID uid) const
+{
+    return getObject(uid)->kind();
+}
+
+std::vector<ScicosID> Model::getAll(kind_t k) const
+{
+    std::vector<ScicosID> all;
+
+    for (objects_map_t::const_iterator it = allObjects.begin(); it != allObjects.end(); ++it)
+    {
+        if (it->second.m_o->kind() == k)
+        {
+            all.push_back(it->second.m_o->id());
+        }
+    }
+
+    return all;
+}
+
 model::BaseObject* Model::getObject(ScicosID uid) const
 {
     objects_map_t::const_iterator iter = allObjects.find(uid);
     if (iter == allObjects.end())
     {
-        throw std::string("key has not been found");
+        return nullptr;
     }
 
     return iter->second.m_o;
index 4fe1001..dee9fc2 100644 (file)
@@ -28,6 +28,11 @@ namespace org_scilab_modules_scicos
 
 bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, double& v)  const
 {
+    model::BaseObject* baseObject = getObject(uid);
+    if (baseObject == nullptr)
+    {
+        return false;
+    }
 
     if (k == ANNOTATION)
     {
@@ -63,7 +68,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, dou
     }
     else if (k == PORT)
     {
-        model::Port* o = getObject<model::Port>(uid);
+        model::Port* o = static_cast<model::Port*>(baseObject);
         switch (p)
         {
             case FIRING:
@@ -78,6 +83,11 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, dou
 
 bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, int& v) const
 {
+    model::BaseObject* baseObject = getObject(uid);
+    if (baseObject == nullptr)
+    {
+        return false;
+    }
 
     if (k == ANNOTATION)
     {
@@ -89,7 +99,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, int
     }
     else if (k == BLOCK)
     {
-        model::Block* o = getObject<model::Block>(uid);
+        model::Block* o = static_cast<model::Block*>(baseObject);
         switch (p)
         {
             case SIM_FUNCTION_API:
@@ -109,7 +119,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, int
     }
     else if (k == LINK)
     {
-        model::Link* o = getObject<model::Link>(uid);
+        model::Link* o = static_cast<model::Link*>(baseObject);
         switch (p)
         {
             case COLOR:
@@ -124,7 +134,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, int
     }
     else if (k == PORT)
     {
-        model::Port* o = getObject<model::Port>(uid);
+        model::Port* o = static_cast<model::Port*>(baseObject);
         switch (p)
         {
             case PORT_KIND:
@@ -139,6 +149,11 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, int
 
 bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, bool& v) const
 {
+    model::BaseObject* baseObject = getObject(uid);
+    if (baseObject == nullptr)
+    {
+        return false;
+    }
 
     if (k == ANNOTATION)
     {
@@ -174,7 +189,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, boo
     }
     else if (k == PORT)
     {
-        model::Port* o = getObject<model::Port>(uid);
+        model::Port* o = static_cast<model::Port*>(baseObject);
         switch (p)
         {
             case IMPLICIT:
@@ -189,10 +204,15 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, boo
 
 bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std::string& v) const
 {
+    model::BaseObject* baseObject = getObject(uid);
+    if (baseObject == nullptr)
+    {
+        return false;
+    }
 
     if (k == ANNOTATION)
     {
-        model::Annotation* o = getObject<model::Annotation>(uid);
+        model::Annotation* o = static_cast<model::Annotation*>(baseObject);
         switch (p)
         {
             case DESCRIPTION:
@@ -210,7 +230,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
     }
     else if (k == BLOCK)
     {
-        model::Block* o = getObject<model::Block>(uid);
+        model::Block* o = static_cast<model::Block*>(baseObject);
         switch (p)
         {
             case INTERFACE_FUNCTION:
@@ -237,7 +257,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
     }
     else if (k == DIAGRAM)
     {
-        model::Diagram* o = getObject<model::Diagram>(uid);;
+        model::Diagram* o = static_cast<model::Diagram*>(baseObject);
         switch (p)
         {
             case TITLE:
@@ -255,7 +275,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
     }
     else if (k == LINK)
     {
-        model::Link* o = getObject<model::Link>(uid);
+        model::Link* o = static_cast<model::Link*>(baseObject);
         switch (p)
         {
             case LABEL:
@@ -267,7 +287,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
     }
     else if (k == PORT)
     {
-        model::Port* o = getObject<model::Port>(uid);
+        model::Port* o = static_cast<model::Port*>(baseObject);
         switch (p)
         {
             case STYLE:
@@ -285,10 +305,15 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
 
 bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, ScicosID& v) const
 {
+    model::BaseObject* baseObject = getObject(uid);
+    if (baseObject == nullptr)
+    {
+        return false;
+    }
 
     if (k == ANNOTATION)
     {
-        model::Annotation* o = getObject<model::Annotation>(uid);
+        model::Annotation* o = static_cast<model::Annotation*>(baseObject);
         switch (p)
         {
             case PARENT_DIAGRAM:
@@ -306,7 +331,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, Sci
     }
     else if (k == BLOCK)
     {
-        model::Block* o = getObject<model::Block>(uid);
+        model::Block* o = static_cast<model::Block*>(baseObject);
         switch (p)
         {
             case PARENT_DIAGRAM:
@@ -328,7 +353,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, Sci
     }
     else if (k == LINK)
     {
-        model::Link* o = getObject<model::Link>(uid);
+        model::Link* o = static_cast<model::Link*>(baseObject);
         switch (p)
         {
             case PARENT_DIAGRAM:
@@ -349,7 +374,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, Sci
     }
     else if (k == PORT)
     {
-        model::Port* o = getObject<model::Port>(uid);
+        model::Port* o = static_cast<model::Port*>(baseObject);
         switch (p)
         {
             case SOURCE_BLOCK:
@@ -367,10 +392,15 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, Sci
 
 bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std::vector<double>& v) const
 {
+    model::BaseObject* baseObject = getObject(uid);
+    if (baseObject == nullptr)
+    {
+        return false;
+    }
 
     if (k == ANNOTATION)
     {
-        model::Annotation* o = getObject<model::Annotation>(uid);
+        model::Annotation* o = static_cast<model::Annotation*>(baseObject);
         switch (p)
         {
             case GEOMETRY:
@@ -382,7 +412,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
     }
     else if (k == BLOCK)
     {
-        model::Block* o = getObject<model::Block>(uid);
+        model::Block* o = static_cast<model::Block*>(baseObject);
         switch (p)
         {
             case GEOMETRY:
@@ -415,7 +445,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
     }
     else if (k == DIAGRAM)
     {
-        model::Diagram* o = getObject<model::Diagram>(uid);;
+        model::Diagram* o = static_cast<model::Diagram*>(baseObject);
         switch (p)
         {
             case PROPERTIES:
@@ -427,7 +457,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
     }
     else if (k == LINK)
     {
-        model::Link* o = getObject<model::Link>(uid);
+        model::Link* o = static_cast<model::Link*>(baseObject);
         switch (p)
         {
             case CONTROL_POINTS:
@@ -453,6 +483,11 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
 
 bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std::vector<int>& v) const
 {
+    model::BaseObject* baseObject = getObject(uid);
+    if (baseObject == nullptr)
+    {
+        return false;
+    }
 
     if (k == ANNOTATION)
     {
@@ -464,7 +499,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
     }
     else if (k == BLOCK)
     {
-        model::Block* o = getObject<model::Block>(uid);
+        model::Block* o = static_cast<model::Block*>(baseObject);
         switch (p)
         {
             case SIM_DEP_UT:
@@ -501,7 +536,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
     }
     else if (k == PORT)
     {
-        model::Port* o = getObject<model::Port>(uid);
+        model::Port* o = static_cast<model::Port*>(baseObject);
         switch (p)
         {
             case DATATYPE:
@@ -516,6 +551,11 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
 
 bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std::vector<std::string>& v) const
 {
+    model::BaseObject* baseObject = getObject(uid);
+    if (baseObject == nullptr)
+    {
+        return false;
+    }
 
     if (k == ANNOTATION)
     {
@@ -527,7 +567,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
     }
     else if (k == BLOCK)
     {
-        model::Block* o = getObject<model::Block>(uid);
+        model::Block* o = static_cast<model::Block*>(baseObject);
         switch (p)
         {
             case EQUATIONS:
@@ -539,7 +579,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
     }
     else if (k == DIAGRAM)
     {
-        model::Diagram* o = getObject<model::Diagram>(uid);
+        model::Diagram* o = static_cast<model::Diagram*>(baseObject);
         switch (p)
         {
             case DIAGRAM_CONTEXT:
@@ -570,6 +610,11 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
 
 bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std::vector<ScicosID>& v) const
 {
+    model::BaseObject* baseObject = getObject(uid);
+    if (baseObject == nullptr)
+    {
+        return false;
+    }
 
     if (k == ANNOTATION)
     {
@@ -581,7 +626,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
     }
     else if (k == BLOCK)
     {
-        model::Block* o = getObject<model::Block>(uid);
+        model::Block* o = static_cast<model::Block*>(baseObject);
         switch (p)
         {
             case INPUTS:
@@ -605,7 +650,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
     }
     else if (k == DIAGRAM)
     {
-        model::Diagram* o = getObject<model::Diagram>(uid);
+        model::Diagram* o = static_cast<model::Diagram*>(baseObject);
         switch (p)
         {
             case CHILDREN:
@@ -625,7 +670,7 @@ bool Model::getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std
     }
     else if (k == PORT)
     {
-        model::Port* o = getObject<model::Port>(uid);
+        model::Port* o = static_cast<model::Port*>(baseObject);
         switch (p)
         {
             case CONNECTED_SIGNALS:
index 517ce39..5aaaa2b 100644 (file)
@@ -28,6 +28,11 @@ namespace org_scilab_modules_scicos
 
 update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, double v)
 {
+    model::BaseObject* baseObject = getObject(uid);
+    if (baseObject == nullptr)
+    {
+        return FAIL;
+    }
 
     if (k == ANNOTATION)
     {
@@ -63,7 +68,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == PORT)
     {
-        model::Port* o = getObject<model::Port>(uid);
+        model::Port* o = static_cast<model::Port*>(baseObject);
         switch (p)
         {
             case FIRING:
@@ -77,6 +82,11 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
 
 update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, int v)
 {
+    model::BaseObject* baseObject = getObject(uid);
+    if (baseObject == nullptr)
+    {
+        return FAIL;
+    }
 
     if (k == ANNOTATION)
     {
@@ -88,7 +98,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == BLOCK)
     {
-        model::Block* o = getObject<model::Block>(uid);
+        model::Block* o = static_cast<model::Block*>(baseObject);
         switch (p)
         {
             case SIM_FUNCTION_API:
@@ -107,7 +117,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == LINK)
     {
-        model::Link* o = getObject<model::Link>(uid);
+        model::Link* o = static_cast<model::Link*>(baseObject);
         switch (p)
         {
             case COLOR:
@@ -120,7 +130,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == PORT)
     {
-        model::Port* o = getObject<model::Port>(uid);
+        model::Port* o = static_cast<model::Port*>(baseObject);
         switch (p)
         {
             case PORT_KIND:
@@ -134,6 +144,11 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
 
 update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, bool v)
 {
+    model::BaseObject* baseObject = getObject(uid);
+    if (baseObject == nullptr)
+    {
+        return FAIL;
+    }
 
     if (k == ANNOTATION)
     {
@@ -169,7 +184,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == PORT)
     {
-        model::Port* o = getObject<model::Port>(uid);
+        model::Port* o = static_cast<model::Port*>(baseObject);
         switch (p)
         {
             case IMPLICIT:
@@ -183,10 +198,15 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
 
 update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, ScicosID v)
 {
+    model::BaseObject* baseObject = getObject(uid);
+    if (baseObject == nullptr)
+    {
+        return FAIL;
+    }
 
     if (k == ANNOTATION)
     {
-        model::Annotation* o = getObject<model::Annotation>(uid);
+        model::Annotation* o = static_cast<model::Annotation*>(baseObject);
         switch (p)
         {
             case PARENT_DIAGRAM:
@@ -199,7 +219,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == BLOCK)
     {
-        model::Block* o = getObject<model::Block>(uid);
+        model::Block* o = static_cast<model::Block*>(baseObject);
         switch (p)
         {
             case PARENT_DIAGRAM:
@@ -222,7 +242,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == LINK)
     {
-        model::Link* o = getObject<model::Link>(uid);
+        model::Link* o = static_cast<model::Link*>(baseObject);
         switch (p)
         {
             case PARENT_DIAGRAM:
@@ -239,7 +259,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == PORT)
     {
-        model::Port* o = getObject<model::Port>(uid);
+        model::Port* o = static_cast<model::Port*>(baseObject);
         switch (p)
         {
             case SOURCE_BLOCK:
@@ -255,10 +275,15 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
 
 update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std::string v)
 {
+    model::BaseObject* baseObject = getObject(uid);
+    if (baseObject == nullptr)
+    {
+        return FAIL;
+    }
 
     if (k == ANNOTATION)
     {
-        model::Annotation* o = getObject<model::Annotation>(uid);
+        model::Annotation* o = static_cast<model::Annotation*>(baseObject);
         switch (p)
         {
             case DESCRIPTION:
@@ -273,7 +298,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == BLOCK)
     {
-        model::Block* o = getObject<model::Block>(uid);
+        model::Block* o = static_cast<model::Block*>(baseObject);
         switch (p)
         {
             case INTERFACE_FUNCTION:
@@ -294,7 +319,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == DIAGRAM)
     {
-        model::Diagram* o = getObject<model::Diagram>(uid);
+        model::Diagram* o = static_cast<model::Diagram*>(baseObject);
         switch (p)
         {
             case TITLE:
@@ -309,7 +334,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == LINK)
     {
-        model::Link* o = getObject<model::Link>(uid);
+        model::Link* o = static_cast<model::Link*>(baseObject);
         switch (p)
         {
             case LABEL:
@@ -320,7 +345,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == PORT)
     {
-        model::Port* o = getObject<model::Port>(uid);
+        model::Port* o = static_cast<model::Port*>(baseObject);
         switch (p)
         {
             case STYLE:
@@ -336,10 +361,15 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
 
 update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, const std::vector<double>& v)
 {
+    model::BaseObject* baseObject = getObject(uid);
+    if (baseObject == nullptr)
+    {
+        return FAIL;
+    }
 
     if (k == ANNOTATION)
     {
-        model::Annotation* o = getObject<model::Annotation>(uid);
+        model::Annotation* o = static_cast<model::Annotation*>(baseObject);
         switch (p)
         {
             case GEOMETRY:
@@ -350,7 +380,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == BLOCK)
     {
-        model::Block* o = getObject<model::Block>(uid);
+        model::Block* o = static_cast<model::Block*>(baseObject);
         switch (p)
         {
             case GEOMETRY:
@@ -375,7 +405,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == DIAGRAM)
     {
-        model::Diagram* o = getObject<model::Diagram>(uid);
+        model::Diagram* o = static_cast<model::Diagram*>(baseObject);
         switch (p)
         {
             case PROPERTIES:
@@ -386,7 +416,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == LINK)
     {
-        model::Link* o = getObject<model::Link>(uid);
+        model::Link* o = static_cast<model::Link*>(baseObject);
         switch (p)
         {
             case CONTROL_POINTS:
@@ -410,6 +440,11 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
 
 update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, const std::vector<int>& v)
 {
+    model::BaseObject* baseObject = getObject(uid);
+    if (baseObject == nullptr)
+    {
+        return FAIL;
+    }
 
     if (k == ANNOTATION)
     {
@@ -421,7 +456,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == BLOCK)
     {
-        model::Block* o = getObject<model::Block>(uid);
+        model::Block* o = static_cast<model::Block*>(baseObject);
         switch (p)
         {
             case SIM_DEP_UT:
@@ -454,7 +489,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == PORT)
     {
-        model::Port* o = getObject<model::Port>(uid);
+        model::Port* o = static_cast<model::Port*>(baseObject);
         switch (p)
         {
             case DATATYPE:
@@ -468,6 +503,11 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
 
 update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, const std::vector<std::string>& v)
 {
+    model::BaseObject* baseObject = getObject(uid);
+    if (baseObject == nullptr)
+    {
+        return FAIL;
+    }
 
     if (k == ANNOTATION)
     {
@@ -479,7 +519,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == BLOCK)
     {
-        model::Block* o = getObject<model::Block>(uid);
+        model::Block* o = static_cast<model::Block*>(baseObject);
         switch (p)
         {
             case EQUATIONS:
@@ -490,7 +530,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == DIAGRAM)
     {
-        model::Diagram* o = getObject<model::Diagram>(uid);
+        model::Diagram* o = static_cast<model::Diagram*>(baseObject);
         switch (p)
         {
             case DIAGRAM_CONTEXT:
@@ -520,6 +560,11 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
 
 update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, const std::vector<ScicosID>& v)
 {
+    model::BaseObject* baseObject = getObject(uid);
+    if (baseObject == nullptr)
+    {
+        return FAIL;
+    }
 
     if (k == ANNOTATION)
     {
@@ -531,7 +576,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == BLOCK)
     {
-        model::Block* o = getObject<model::Block>(uid);
+        model::Block* o = static_cast<model::Block*>(baseObject);
         switch (p)
         {
             case INPUTS:
@@ -550,7 +595,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == DIAGRAM)
     {
-        model::Diagram* o = getObject<model::Diagram>(uid);
+        model::Diagram* o = static_cast<model::Diagram*>(baseObject);
         switch (p)
         {
             case CHILDREN:
@@ -569,7 +614,7 @@ update_status_t Model::setObjectProperty(ScicosID uid, kind_t k, object_properti
     }
     else if (k == PORT)
     {
-        model::Port* o = getObject<model::Port>(uid);
+        model::Port* o = static_cast<model::Port*>(baseObject);
         switch (p)
         {
             case CONNECTED_SIGNALS:
diff --git a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/BrowserView.java b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/BrowserView.java
new file mode 100644 (file)
index 0000000..bf215d8
--- /dev/null
@@ -0,0 +1,263 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2014 - Scilab Enterprises - Clement DAVID
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
+ *
+ */
+
+package org.scilab.modules.xcos;
+
+import java.util.Enumeration;
+import java.util.LinkedList;
+
+import javax.swing.SwingUtilities;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeModel;
+
+import org.scilab.modules.xcos.explorer.BrowserTreeNodeData;
+
+
+/**
+ * Implement a basic model explorer using a tree view
+ */
+public class BrowserView extends View {
+    private final DefaultTreeModel model;
+
+    /**
+     * Default constructor
+     */
+    public BrowserView() {
+        DefaultMutableTreeNode root = new DefaultMutableTreeNode(new BrowserTreeNodeData(), true);
+
+        model = new DefaultTreeModel(root);
+
+        /*
+         * retrieve all the existing objects and append them to the model.
+         */
+        fillModel();
+        model.reload();
+    }
+
+    private void fillModel() {
+        Controller controller = new Controller();
+        DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
+
+        // first create all the diagrams
+        VectorOfScicosID o = controller.getAll(Kind.DIAGRAM);
+        int length = (int) o.size();
+        for (int i = 0; i < length; i++) {
+            long uid = o.get(i);
+
+            controller.referenceObject(uid);
+            DefaultMutableTreeNode current = new DefaultMutableTreeNode(new BrowserTreeNodeData(uid, Kind.DIAGRAM));
+            root.add(current);
+        }
+
+        // fill each diagram node with its block hierarchy
+        LinkedList<DefaultMutableTreeNode> stash = new LinkedList<DefaultMutableTreeNode>();
+        for (int i = 0; i < root.getChildCount(); i++) {
+            DefaultMutableTreeNode node = (DefaultMutableTreeNode) root.getChildAt(i);
+            stash.add(node);
+        }
+
+        VectorOfScicosID children = new VectorOfScicosID(256);
+        while (!stash.isEmpty()) {
+            DefaultMutableTreeNode node = stash.pop();
+            BrowserTreeNodeData data = (BrowserTreeNodeData) node.getUserObject();
+
+            controller.getObjectProperty(data.getId(), data.getKind(), ObjectProperties.CHILDREN, children);
+            int childrenLen = (int) children.size();
+            for (int j = 0 ; j < childrenLen; j++) {
+                long childUID = children.get(j);
+                Kind childKind = controller.getKind(childUID);
+
+                controller.referenceObject(childUID);
+                DefaultMutableTreeNode child = new DefaultMutableTreeNode(new BrowserTreeNodeData(childUID, childKind));
+
+                node.add(child);
+                // manage the children only if this is a block
+                if (childKind == Kind.BLOCK) {
+                    stash.add(child);
+                }
+            }
+        }
+    }
+
+    public DefaultTreeModel getModel() {
+        return model;
+    }
+
+    /*
+     * Implement some View methods on the Event Dispatch Thread
+     */
+
+    @Override
+    public void objectCreated(final long uid, final Kind kind) {
+        if (model == null) {
+            return;
+        }
+        if (kind == Kind.PORT) {
+            return;
+        }
+
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                objectCreatedOnEDT(uid, kind);
+            }
+        });
+
+        // reference on the caller Thread to avoid synchronization later
+        new Controller().referenceObject(uid);
+    }
+
+    @Override
+    public void objectReferenced(final long uid, final Kind kind) {
+        if (model == null) {
+            return;
+        }
+        if (kind == Kind.PORT) {
+            return;
+        }
+
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                objectReferencedOnEDT(uid, kind);
+            }
+        });
+    }
+
+    public void objectUnreferenced(final long uid, final Kind kind) {
+        if (model == null) {
+            return;
+        }
+        if (kind == Kind.PORT) {
+            return;
+        }
+
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                objectUnreferencedOnEDT(uid, kind);
+            }
+        });
+    };
+
+    @Override
+    public void objectDeleted(final long uid, final Kind kind) {
+    }
+
+    @Override
+    public void propertyUpdated(final long uid, final Kind kind, final ObjectProperties property, final UpdateStatus status) {
+        if (model == null) {
+            return;
+        }
+        if (status != UpdateStatus.SUCCESS) {
+            return;
+        }
+
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                propertyUpdatedOnEDT(uid, kind, property, status);
+            }
+        });
+    }
+
+    public void objectCreatedOnEDT(final long uid, final Kind kind) {
+        DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
+        int position = model.getChildCount(root);
+
+        final DefaultMutableTreeNode node = new DefaultMutableTreeNode(new BrowserTreeNodeData(uid, kind), true);
+        model.insertNodeInto(node, root, position);
+    }
+
+    public void objectReferencedOnEDT(final long uid, final Kind kind) {
+        DefaultMutableTreeNode node = lookupForUID(uid);
+        BrowserTreeNodeData data = (BrowserTreeNodeData) node.getUserObject();
+
+        data.incRefCount();
+    }
+
+    public void objectUnreferencedOnEDT(final long uid, final Kind kind) {
+        DefaultMutableTreeNode node = lookupForUID(uid);
+        if (node == null) {
+            return;
+        }
+        BrowserTreeNodeData data = (BrowserTreeNodeData) node.getUserObject();
+
+        if (data.decRefCount() < 1) {
+            model.removeNodeFromParent(node);
+
+            // This is a deletion request, other views synchronization will be done on another event
+            new Controller().deleteObject(uid);
+        }
+    }
+
+    public void propertyUpdatedOnEDT(final long uid, final Kind kind, final ObjectProperties property, final UpdateStatus status) {
+
+        /* Manage the children case to append them to associated diagram */
+        if (property == ObjectProperties.PARENT_DIAGRAM || property == ObjectProperties.PARENT_BLOCK) {
+            switch (kind) {
+                case ANNOTATION:
+                case BLOCK:
+                case LINK: {
+                    final Controller controller = new Controller();
+                    long[] v = { 0 };
+                    if (!controller.getObjectProperty(uid, kind, property, v)) {
+                        return;
+                    }
+
+                    final DefaultMutableTreeNode parent = lookupForUID(v[0]);
+                    final DefaultMutableTreeNode current = lookupForUID(uid);
+                    if (current == null || current.getParent() == parent) {
+                        return;
+                    }
+
+                    model.removeNodeFromParent(current);
+
+                    // current parent is re-set'ed and its old parent is also
+                    // updated
+                    int position = parent.getChildCount();
+                    model.insertNodeInto(current, parent, position);
+                }
+                break;
+
+                default:
+                    break;
+            }
+        }
+
+    }
+
+    /*
+     * Utilities
+     */
+
+    /**
+     * Lookup for the UID in the TreeModel and return the result or null if not found
+     * @param uid the uid to look for
+     * @return the found {@link DefaultMutableTreeNode} or <code>null</code> if not found
+     */
+    private DefaultMutableTreeNode lookupForUID(final long uid) {
+        final DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
+
+        DefaultMutableTreeNode node;
+        for (Enumeration<DefaultMutableTreeNode> e = root.depthFirstEnumeration(); e.hasMoreElements();) {
+            node = e.nextElement();
+            BrowserTreeNodeData data = (BrowserTreeNodeData) node.getUserObject();
+            if (data.getId() == uid) {
+                return node;
+            }
+        }
+
+        return null;
+    }
+
+}
index ac3d30c..ad87f94 100644 (file)
@@ -35,6 +35,11 @@ public class Controller {
     }
   }
 
+  public static View look_for_view(String name) {
+    long cPtr = JavaControllerJNI.Controller_look_for_view(name);
+    return (cPtr == 0) ? null : new View(cPtr, false);
+  }
+
   public Controller() {
     this(JavaControllerJNI.new_Controller(), true);
   }
@@ -55,6 +60,14 @@ public class Controller {
     return JavaControllerJNI.Controller_cloneObject(swigCPtr, this, uid, cloneChildren);
   }
 
+  public Kind getKind(long uid) {
+    return Kind.class.getEnumConstants()[JavaControllerJNI.Controller_getKind(swigCPtr, this, uid)];
+  }
+
+  public VectorOfScicosID getAll(Kind k) {
+    return new VectorOfScicosID(JavaControllerJNI.Controller_getAll(swigCPtr, this, k.ordinal()), true);
+  }
+
   public boolean getObjectProperty(long uid, Kind k, ObjectProperties p, int[] v) {
     return JavaControllerJNI.Controller_getObjectProperty__SWIG_1(swigCPtr, this, uid, k.ordinal(), p.ordinal(), v);
   }
index 6b8c72a..32e0b52 100644 (file)
@@ -12,16 +12,26 @@ import java.util.ArrayList;
 
 public class JavaController extends Controller {
 
-    // will contains all registered JavaViews to prevent garbage-collection 
-    private static ArrayList<View> references = new ArrayList<View>();
-    
-    private static long add_reference(View v) {
-        references.add(v);
-        return View.getCPtr(v);
-    }
+  // will contains all registered JavaViews to prevent garbage-collection 
+  private static ArrayList<View> references = new ArrayList<View>();
+  
+  private static long add_reference(View v) {
+    references.add(v);
+    return View.getCPtr(v);
+  }
+
+  private static View remove_reference(View v) {
+    references.remove(v);
+    return v;
+  }
 
   public static void register_view(String name, View view) {
     JavaControllerJNI.register_view(name, add_reference(view), view);
   }
 
+  public static void unregister_view(View view) {
+    JavaControllerJNI.unregister_view(View.getCPtr(view), view);
+    remove_reference(view);
+  }
+
 }
index 22d4845..65be6ca 100644 (file)
@@ -12,18 +12,21 @@ public class JavaControllerJNI {
   public final static native long new_View();
   public final static native void delete_View(long jarg1);
   public final static native void View_objectCreated(long jarg1, View jarg1_, long jarg2, int jarg3);
+  public final static native void View_objectReferenced(long jarg1, View jarg1_, long jarg2, int jarg3);
+  public final static native void View_objectUnreferenced(long jarg1, View jarg1_, long jarg2, int jarg3);
   public final static native void View_objectDeleted(long jarg1, View jarg1_, long jarg2, int jarg3);
-  public final static native void View_objectUpdated(long jarg1, View jarg1_, long jarg2, int jarg3);
-  public final static native void View_propertyUpdated__SWIG_0(long jarg1, View jarg1_, long jarg2, int jarg3, int jarg4);
-  public final static native void View_propertyUpdated__SWIG_1(long jarg1, View jarg1_, long jarg2, int jarg3, int jarg4, int jarg5);
+  public final static native void View_propertyUpdated(long jarg1, View jarg1_, long jarg2, int jarg3, int jarg4, int jarg5);
   public final static native void View_director_connect(View obj, long cptr, boolean mem_own, boolean weak_global);
   public final static native void View_change_ownership(View obj, long cptr, boolean take_or_release);
+  public final static native long Controller_look_for_view(String jarg1);
   public final static native long new_Controller();
   public final static native void delete_Controller(long jarg1);
   public final static native long Controller_createObject(long jarg1, Controller jarg1_, int jarg2);
   public final static native long Controller_referenceObject(long jarg1, Controller jarg1_, long jarg2);
   public final static native void Controller_deleteObject(long jarg1, Controller jarg1_, long jarg2);
   public final static native long Controller_cloneObject(long jarg1, Controller jarg1_, long jarg2, boolean jarg3);
+  public final static native int Controller_getKind(long jarg1, Controller jarg1_, long jarg2);
+  public final static native long Controller_getAll(long jarg1, Controller jarg1_, int jarg2);
   public final static native boolean Controller_getObjectProperty__SWIG_1(long jarg1, Controller jarg1_, long jarg2, int jarg3, int jarg4, int[] jarg5);
   public final static native boolean Controller_getObjectProperty__SWIG_2(long jarg1, Controller jarg1_, long jarg2, int jarg3, int jarg4, double[] jarg5);
   public final static native boolean Controller_getObjectProperty__SWIG_3(long jarg1, Controller jarg1_, long jarg2, int jarg3, int jarg4, String[] jarg5);
@@ -96,6 +99,7 @@ public class JavaControllerJNI {
   public final static native void VectorOfScicosID_set(long jarg1, VectorOfScicosID jarg1_, int jarg2, long jarg3);
   public final static native void delete_VectorOfScicosID(long jarg1);
   public final static native void register_view(String jarg1, long jarg2, View jarg2_);
+  public final static native void unregister_view(long jarg1, View jarg1_);
 
   static {
     try {
@@ -117,17 +121,20 @@ public class JavaControllerJNI {
   }
 
 
-  public static void SwigDirector_View_objectCreated(View jself, long uid, int k) {
-    jself.objectCreated(uid, Kind.class.getEnumConstants()[k]);
+  public static void SwigDirector_View_objectCreated(View jself, long uid, int kind) {
+    jself.objectCreated(uid, Kind.class.getEnumConstants()[kind]);
   }
-  public static void SwigDirector_View_objectDeleted(View jself, long uid, int k) {
-    jself.objectDeleted(uid, Kind.class.getEnumConstants()[k]);
+  public static void SwigDirector_View_objectReferenced(View jself, long uid, int kind) {
+    jself.objectReferenced(uid, Kind.class.getEnumConstants()[kind]);
   }
-  public static void SwigDirector_View_objectUpdated(View jself, long uid, int k) {
-    jself.objectUpdated(uid, Kind.class.getEnumConstants()[k]);
+  public static void SwigDirector_View_objectUnreferenced(View jself, long uid, int kind) {
+    jself.objectUnreferenced(uid, Kind.class.getEnumConstants()[kind]);
   }
-  public static void SwigDirector_View_propertyUpdated__SWIG_0(View jself, long uid, int k, int p) {
-    jself.propertyUpdated(uid, Kind.class.getEnumConstants()[k], ObjectProperties.class.getEnumConstants()[p]);
+  public static void SwigDirector_View_objectDeleted(View jself, long uid, int kind) {
+    jself.objectDeleted(uid, Kind.class.getEnumConstants()[kind]);
+  }
+  public static void SwigDirector_View_propertyUpdated(View jself, long uid, int kind, int property, int status) {
+    jself.propertyUpdated(uid, Kind.class.getEnumConstants()[kind], ObjectProperties.class.getEnumConstants()[property], UpdateStatus.class.getEnumConstants()[status]);
   }
 
   private final static native void swig_module_init();
index 33f4854..65d9dc2 100644 (file)
@@ -55,24 +55,24 @@ public class View {
     JavaControllerJNI.View_director_connect(this, swigCPtr, swigCMemOwn, true);
   }
 
-  public void objectCreated(long uid, Kind k) {
-    JavaControllerJNI.View_objectCreated(swigCPtr, this, uid, k.ordinal());
+  public void objectCreated(long uid, Kind kind) {
+    JavaControllerJNI.View_objectCreated(swigCPtr, this, uid, kind.ordinal());
   }
 
-  public void objectDeleted(long uid, Kind k) {
-    JavaControllerJNI.View_objectDeleted(swigCPtr, this, uid, k.ordinal());
+  public void objectReferenced(long uid, Kind kind) {
+    JavaControllerJNI.View_objectReferenced(swigCPtr, this, uid, kind.ordinal());
   }
 
-  public void objectUpdated(long uid, Kind k) {
-    JavaControllerJNI.View_objectUpdated(swigCPtr, this, uid, k.ordinal());
+  public void objectUnreferenced(long uid, Kind kind) {
+    JavaControllerJNI.View_objectUnreferenced(swigCPtr, this, uid, kind.ordinal());
   }
 
-  public void propertyUpdated(long uid, Kind k, ObjectProperties p) {
-    JavaControllerJNI.View_propertyUpdated__SWIG_0(swigCPtr, this, uid, k.ordinal(), p.ordinal());
+  public void objectDeleted(long uid, Kind kind) {
+    JavaControllerJNI.View_objectDeleted(swigCPtr, this, uid, kind.ordinal());
   }
 
-  public void propertyUpdated(long arg0, Kind arg1, ObjectProperties arg2, UpdateStatus arg3) {
-    JavaControllerJNI.View_propertyUpdated__SWIG_1(swigCPtr, this, arg0, arg1.ordinal(), arg2.ordinal(), arg3.ordinal());
+  public void propertyUpdated(long uid, Kind kind, ObjectProperties property, UpdateStatus status) {
+    JavaControllerJNI.View_propertyUpdated(swigCPtr, this, uid, kind.ordinal(), property.ordinal(), status.ordinal());
   }
 
 }
index bebf717..a6f7c1b 100644 (file)
@@ -127,6 +127,7 @@ public final class Xcos {
      * Instance data
      */
     private final Map<File, Collection<XcosDiagram>> diagrams;
+    private BrowserView browser;
     private boolean onDiagramIteration = false;
     private String lastError = null;
 
@@ -168,6 +169,9 @@ public final class Xcos {
         // null is used for not saved diagrams
         addDiagram(null, null);
 
+        // allocate and install the view on demand to avoid any cost
+        browser = null;
+
         /*
          * get the handlers instance
          */
@@ -193,6 +197,12 @@ public final class Xcos {
         ScilabTabFactory.getInstance().addTabFactory(this.factory);
     }
 
+    protected void finalize() throws Throwable {
+        if (browser != null) {
+            JavaController.unregister_view(browser);
+        }
+    };
+
     /**
      * Check the dependencies and the version dependencies.
      *
@@ -467,6 +477,27 @@ public final class Xcos {
     }
 
     /**
+     * @return the Browser view
+     */
+    public BrowserView getBrowser() {
+        if (browser == null) {
+            browser = new BrowserView();
+            JavaController.register_view(BrowserView.class.getName(), browser);
+        }
+        return browser;
+    }
+
+    /**
+     * Clear the browser state and unregister the current view.
+     */
+    public void clearBrowser()  {
+        if (browser != null) {
+            JavaController.unregister_view(browser);
+            browser = null;
+        }
+    }
+
+    /**
      * Get an unmodifiable view of the diagrams for a specific file
      *
      * @param f
diff --git a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/XcosView.java b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/XcosView.java
deleted file mode 100644 (file)
index 8eb8a53..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2014 - Scilab Enterprises - Clement DAVID
- *
- * This file must be used under the terms of the CeCILL.
- * This source file is licensed as described in the file COPYING, which
- * you should have received as part of this distribution.  The terms
- * are also available at
- * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
- *
- */
-
-package org.scilab.modules.xcos;
-
-/**
- * Default view for the Xcos java side.
- */
-public class XcosView extends View {
-
-    public XcosView() {
-    }
-
-    public void objectCreated(long uid, Kind k) {
-        System.err.println("XcosView::objectCreated(" + uid + ", " + k + ")");
-    }
-
-    public void objectDeleted(long uid) {
-        System.err.println("XcosView::objectDeleted(" + uid + ")");
-    }
-
-    public void objectUpdated(long uid, Kind k) {
-        System.err.println("XcosView::objectUpdated(" + uid + ", " + k + ")");
-    }
-
-    public void propertyUpdated(long uid, Kind k, ObjectProperties p) {
-        System.err.println("XcosView::propertyUpdated(" + uid + ", " + k + ", " + p + ")");
-    }
-}
index c0ee2a7..fbff957 100644 (file)
@@ -16,21 +16,20 @@ package org.scilab.modules.xcos.actions;
 
 import java.awt.event.ActionEvent;
 
-import org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement;
-import org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement.InterpreterException;
 import org.scilab.modules.graph.ScilabComponent;
 import org.scilab.modules.graph.ScilabGraph;
-import org.scilab.modules.graph.actions.base.OneBlockDependantAction;
+import org.scilab.modules.graph.actions.base.DefaultAction;
 import org.scilab.modules.gui.menuitem.MenuItem;
+import org.scilab.modules.xcos.Xcos;
+import org.scilab.modules.xcos.explorer.BrowserTab;
 import org.scilab.modules.xcos.graph.XcosDiagram;
-import org.scilab.modules.xcos.io.scicos.ScilabDirectHandler;
 import org.scilab.modules.xcos.utils.XcosMessages;
 
 /**
  * View the diagram as a scilab tree
  */
 @SuppressWarnings(value = { "serial" })
-public final class ViewDiagramBrowserAction extends OneBlockDependantAction {
+public final class ViewDiagramBrowserAction extends DefaultAction {
     /** Name of the action */
     public static final String NAME = XcosMessages.DIAGRAM_BROWSER;
     /** Icon name of the action */
@@ -76,19 +75,6 @@ public final class ViewDiagramBrowserAction extends OneBlockDependantAction {
             return;
         }
 
-        final ScilabDirectHandler handler = ScilabDirectHandler.acquire();
-        if (handler == null) {
-            return;
-        }
-
-        handler.writeDiagram(graph);
-        try {
-            final String cmd = "tree_show(scs_m); ";
-            ScilabInterpreterManagement.synchronousScilabExec(cmd);
-        } catch (InterpreterException e2) {
-            e2.printStackTrace();
-        } finally {
-            handler.release();
-        }
+        BrowserTab.restore(Xcos.getInstance().getBrowser(), null);
     }
 }
diff --git a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/explorer/BrowserTab.java b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/explorer/BrowserTab.java
new file mode 100644 (file)
index 0000000..f7e6903
--- /dev/null
@@ -0,0 +1,217 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2014 - Scilab Enterprises - Clement DAVID
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
+ *
+ */
+
+package org.scilab.modules.xcos.explorer;
+
+import java.awt.Dimension;
+import java.io.IOException;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.UUID;
+
+import javax.swing.JEditorPane;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.JTree;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.event.TreeModelEvent;
+import javax.swing.event.TreeModelListener;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.event.TreeSelectionListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.html.HTMLDocument;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.TreePath;
+
+import org.scilab.modules.gui.bridge.tab.SwingScilabDockablePanel;
+import org.scilab.modules.gui.bridge.window.SwingScilabWindow;
+import org.scilab.modules.gui.tab.SimpleTab;
+import org.scilab.modules.gui.tabfactory.ScilabTabFactory;
+import org.scilab.modules.gui.utils.ClosingOperationsManager;
+import org.scilab.modules.gui.utils.ClosingOperationsManager.ClosingOperation;
+import org.scilab.modules.gui.utils.WindowsConfigurationManager;
+import org.scilab.modules.xcos.BrowserView;
+import org.scilab.modules.xcos.Xcos;
+import org.scilab.modules.xcos.utils.XcosMessages;
+
+/**
+ * Tab of the Xcos Browser
+ */
+public class BrowserTab extends SwingScilabDockablePanel implements SimpleTab {
+    public static final String DEFAULT_WIN_UUID = "xcos-browser-default-window";
+    public static final String DEFAULT_TAB_UUID = "xcos-browser-default-tab";
+
+    private final BrowserView view;
+
+    /**
+     * Construct a new tab for the explorer
+     *
+     * @param id
+     *            The diagram ID to browse
+     */
+    public BrowserTab(BrowserView view, String uuid) {
+        super(XcosMessages.DIAGRAM_BROWSER, uuid);
+
+        this.view = view;
+
+        initComponents();
+    }
+
+    /*
+     * Static API for Tabs
+     */
+
+    public static void restore(final BrowserView view, String uuid) {
+        if (uuid == null) {
+            uuid = UUID.randomUUID().toString();
+        }
+
+        BrowserTab tab = new BrowserTab(view, uuid);
+        tab.createDefaultWindow().setVisible(true);
+        tab.setCurrent();
+
+        ScilabTabFactory.getInstance().addToCache(tab);
+        ClosingOperationsManager.addDependencyWithRoot(tab);
+        ClosingOperationsManager.registerClosingOperation(tab, new ClosingOperation() {
+
+            @Override
+            public void updateDependencies(List<SwingScilabDockablePanel> list, ListIterator<SwingScilabDockablePanel> it) { }
+
+            @Override
+            public void destroy() {
+                Xcos.getInstance().clearBrowser();
+            }
+
+            @Override
+            public int canClose() {
+                return 1;
+            }
+
+            @Override
+            public String askForClosing(List<SwingScilabDockablePanel> list) {
+                return null;
+            }
+        });
+    }
+
+    /*
+     * Utilities inner classes
+     */
+    static private class UpdateEditorContentListener implements TreeSelectionListener {
+        final HTMLDocument doc;
+
+        public UpdateEditorContentListener(HTMLDocument doc) {
+            this.doc = doc;
+        }
+
+        @Override
+        public void valueChanged(TreeSelectionEvent e) {
+            final TreePath p = e.getPath();
+            BrowserTreeNodeData node = (BrowserTreeNodeData) ((DefaultMutableTreeNode) p.getLastPathComponent()).getUserObject();
+
+            try {
+                node.fillOrUpdateContent(doc);
+            } catch (BadLocationException e1) {
+                // TODO Auto-generated catch block
+                e1.printStackTrace();
+            } catch (IOException e1) {
+                // TODO Auto-generated catch block
+                e1.printStackTrace();
+            }
+        }
+    }
+
+    static private class ExplorerModelListener implements TreeModelListener {
+        final private JTree tree;
+        final HTMLDocument doc;
+
+        public ExplorerModelListener(HTMLDocument doc, JTree tree) {
+            this.tree = tree;
+            this.doc = doc;
+        }
+
+        @Override
+        public void treeNodesChanged(TreeModelEvent e) {
+            if (tree.getSelectionModel().isPathSelected(e.getTreePath())) {
+                final TreePath p = e.getTreePath();
+                BrowserTreeNodeData node = (BrowserTreeNodeData) ((DefaultMutableTreeNode) p.getLastPathComponent()).getUserObject();
+
+                try {
+                    node.fillOrUpdateContent(doc);
+                } catch (BadLocationException e1) {
+                    // TODO Auto-generated catch block
+                    e1.printStackTrace();
+                } catch (IOException e1) {
+                    // TODO Auto-generated catch block
+                    e1.printStackTrace();
+                }
+            }
+        }
+
+        @Override
+        public void treeNodesInserted(TreeModelEvent e) {
+            if (e.getTreePath().getLastPathComponent() == tree.getModel().getRoot()) {
+                tree.expandPath(e.getTreePath());
+            }
+        }
+
+        @Override
+        public void treeNodesRemoved(TreeModelEvent e) {
+            // TODO Auto-generated method stub
+
+        }
+
+        @Override
+        public void treeStructureChanged(TreeModelEvent e) {
+            // TODO Auto-generated method stub
+
+        }
+
+    }
+
+    /*
+     * Specific implementation
+     */
+
+    private void initComponents() {
+        final JTree tree = new JTree(view.getModel());
+        tree.setRootVisible(false);
+
+        final JEditorPane editor = new JEditorPane("text/html", "<html><head><style type=\"text/css\">table { width: 100%; }\ncaption { text-align: center;\nfont: bold; }\ntd { text-align: left; }\n</style></head><body /></html>");
+        editor.setEditable(false);
+
+        tree.addTreeSelectionListener(new UpdateEditorContentListener((HTMLDocument) editor.getDocument()));
+        tree.getModel().addTreeModelListener(new ExplorerModelListener((HTMLDocument) editor.getDocument(), tree));
+
+        JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JScrollPane(tree, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), new JScrollPane(editor, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED));
+        setContentPane(pane);
+
+        // default size
+        Dimension preferredSize = new Dimension(161, 100);
+        pane.getLeftComponent().setPreferredSize(preferredSize);
+        pane.getRightComponent().setPreferredSize(preferredSize);
+    }
+
+    private SwingScilabWindow createDefaultWindow() {
+        final SwingScilabWindow win;
+
+        final SwingScilabWindow configuration = WindowsConfigurationManager.createWindow(DEFAULT_WIN_UUID, false);
+        if (configuration != null) {
+            win = configuration;
+        } else {
+            win = SwingScilabWindow.createWindow(true);
+        }
+
+        win.addTab(this);
+        return win;
+    }
+}
diff --git a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/explorer/BrowserTreeNodeData.java b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/explorer/BrowserTreeNodeData.java
new file mode 100644 (file)
index 0000000..ba6ba25
--- /dev/null
@@ -0,0 +1,329 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2014 - Scilab Enterprises - Clement DAVID
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
+ *
+ */
+
+package org.scilab.modules.xcos.explorer;
+
+import java.io.IOException;
+import java.text.NumberFormat;
+import java.util.Locale;
+
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Element;
+import javax.swing.text.html.HTMLDocument;
+
+import org.scilab.modules.xcos.Controller;
+import org.scilab.modules.xcos.JavaController;
+import org.scilab.modules.xcos.Kind;
+import org.scilab.modules.xcos.ObjectProperties;
+import org.scilab.modules.xcos.VectorOfDouble;
+import org.scilab.modules.xcos.VectorOfString;
+
+public class BrowserTreeNodeData {
+    private static final NumberFormat CURRENT_FORMAT = NumberFormat.getNumberInstance(Locale.ENGLISH);
+
+    private final long uid;
+    private final Kind kind;
+    private int refCount;
+
+    public BrowserTreeNodeData() {
+        // root TreeNode, set a default value but kind should not be used
+        this.uid = 0;
+        kind = Kind.DIAGRAM;
+    }
+
+    public BrowserTreeNodeData(long id, Kind kind) {
+        this.uid = id;
+        this.kind = kind;
+        refCount = 0;
+    }
+
+
+    /*
+     * Getters and Setters
+     */
+
+    /**
+     * @return the id
+     */
+    public long getId() {
+        return uid;
+    }
+
+    /**
+     * @return the kind
+     */
+    public Kind getKind() {
+        return kind;
+    }
+
+    /**
+     * @return the decremented reference counter
+     */
+    public int decRefCount() {
+        return --refCount;
+    }
+
+    /**
+     * @return the incremented reference counter
+     */
+    public int incRefCount() {
+        return ++refCount;
+    }
+
+    /**
+     * Compute and fill in the HTML data for node's parameters
+     * @param document the currently rendered document
+     * @throws IOException
+     * @throws BadLocationException
+     */
+
+    public void fillOrUpdateContent(HTMLDocument document) throws BadLocationException, IOException {
+        final Element html = document.getDefaultRootElement();
+        final Element body = html.getElement(html.getElementCount() - 1);
+
+        if (uid == 0) {
+            // the root element is selected on delete, the rendering cleanup all content
+            document.setOuterHTML(body, "<body />");
+            return;
+        }
+
+        final StringBuilder str = new StringBuilder();
+        final Controller controller = new Controller();
+        switch (kind) {
+            case ANNOTATION:
+                htmlAnnotation(str, controller);
+                break;
+            case BLOCK:
+                htmlBlock(str, controller);
+                break;
+            case DIAGRAM:
+                htmlDiagram(str, controller);
+                break;
+            case LINK:
+                htmlLink(str, controller);
+                break;
+            default:
+                break;
+        }
+        document.setInnerHTML(body, str.toString());
+    }
+
+    private void htmlAnnotation(final StringBuilder str, final Controller controller) {
+        tag(str, "h1", "Annotation");
+    }
+
+    private void htmlBlock(final StringBuilder str, final Controller controller) {
+        VectorOfDouble angle = new VectorOfDouble(2);
+        controller.getObjectProperty(uid, kind, ObjectProperties.ANGLE, angle);
+        VectorOfString exprs = new VectorOfString();
+        controller.getObjectProperty(uid, kind, ObjectProperties.EXPRS, exprs);
+        VectorOfDouble geom = new VectorOfDouble(4);
+        controller.getObjectProperty(uid, kind, ObjectProperties.GEOMETRY, geom);
+        String interf[] = { "" };
+        controller.getObjectProperty(uid, kind, ObjectProperties.INTERFACE_FUNCTION, interf);
+        String title[] = { "" };
+        controller.getObjectProperty(uid, kind, ObjectProperties.TITLE, title);
+        String uuid[] = { "" };
+        controller.getObjectProperty(uid, kind, ObjectProperties.UID, uuid);
+
+        tag(str, "h1", "Block " + interf[0] + " : " + title[0]);
+
+        /*
+         * Render some graphics elements
+         */
+        StringBuilder htmlTable = new StringBuilder();
+        tag(htmlTable, "caption", "Graphics");
+        tag(htmlTable, "tr", tag("td", "orig").append(tag("td", escapeVector(',', geom.get(0), geom.get(1)))));
+        tag(htmlTable, "tr", tag("td", "sz").append(tag("td", escapeVector(',', geom.get(2), geom.get(3)))));
+        tag(htmlTable, "tr", tag("td", "flip").append(tag("td", (angle.get(0) == 0.0) ? "%f" : "%t")));
+        tag(htmlTable, "tr", tag("td", "theta").append(tag("td", CURRENT_FORMAT.format(angle.get(1)))));
+        tag(htmlTable, "tr", tag("td", "exprs").append(tag("td", escapeVector(';', exprs))));
+        tag(htmlTable, "tr", tag("td", "id").append(tag("td", title[0])));
+        tag(htmlTable, "tr", tag("td", "style").append(tag("td", CURRENT_FORMAT.format(angle.get(1)))));
+
+        tag(str, "table", htmlTable);
+
+        /*
+         * Render some model elements
+         */
+        htmlTable = new StringBuilder();
+        tag(htmlTable, "caption", "Model");
+        tag(htmlTable, "tr", tag("td", "UID").append(tag("td", uuid[0])));
+
+        tag(str, "table", htmlTable);
+    }
+
+    private void htmlDiagram(final StringBuilder str, final Controller controller) {
+        String title[] = { "" };
+        controller.getObjectProperty(uid, kind, ObjectProperties.TITLE, title);
+        String version[] = { "" };
+        controller.getObjectProperty(uid, kind, ObjectProperties.VERSION_NUMBER, version);
+        String path[] = { "" };
+        controller.getObjectProperty(uid, kind, ObjectProperties.PATH, path);
+        String context[] = { "" };
+        controller.getObjectProperty(uid, kind, ObjectProperties.DIAGRAM_CONTEXT, context);
+
+        tag(str, "h1", "Diagram: " + title[0]);
+
+        StringBuilder htmlList = new StringBuilder();
+        tag(htmlList, "li", "Version: " + version[0]);
+        tag(htmlList, "li", "File: " + path[0]);
+
+        tag(str, "div", tag("ul", htmlList));
+        tag(str, "div", tag("p", context[0]));
+    }
+
+    private void htmlLink(final StringBuilder str, final Controller controller) {
+        tag(str, "h1", "Link");
+    }
+
+    private static StringBuilder tag(StringBuilder str, String tag, CharSequence content) {
+        str.append("<").append(tag).append(">");
+        str.append(content);
+        str.append("</").append(tag).append(">");
+        return str;
+    }
+
+    private static StringBuilder tag(String tag, CharSequence content) {
+        return tag(new StringBuilder(), tag, content);
+    }
+
+    private static CharSequence escapeVector(char sep, double... v) {
+        StringBuilder str = new StringBuilder();
+        if (v.length > 1) {
+            str.append('[');
+        }
+
+        for (int i = 0; i < v.length - 1; i++) {
+            str.append(CURRENT_FORMAT.format(v[i]));
+            str.append(sep);
+        }
+        if (v.length > 0) {
+            str.append(CURRENT_FORMAT.format(v[v.length - 1]));
+        }
+
+        if (v.length > 1) {
+            str.append(']');
+        }
+        return str;
+    }
+
+    private static CharSequence escapeVector(char sep, String... v) {
+        StringBuilder str = new StringBuilder();
+        if (v.length > 1) {
+            str.append('[');
+        }
+
+        for (int i = 0; i < v.length - 1; i++) {
+            str.append('"').append(v[i]).append('"');
+            str.append(sep);
+        }
+        if (v.length > 0) {
+            str.append('"').append(v[v.length - 1]).append('"');
+        }
+
+
+        if (v.length > 1) {
+            str.append(']');
+        }
+        return str;
+    }
+
+    private static CharSequence escapeVector(char sep, VectorOfString v) {
+        final int length = (int) v.size();
+
+        StringBuilder str = new StringBuilder();
+        if (length > 1) {
+            str.append('[');
+        }
+
+        for (int i = 0; i < length - 1; i++) {
+            str.append('"').append(v.get(i)).append('"');
+            str.append(sep);
+        }
+        if (length > 0) {
+            str.append('"').append(v.get(length - 1)).append('"');
+        }
+
+        if (length > 1) {
+            str.append(']');
+        }
+        return str;
+    }
+
+    /*
+     * Utilities
+     */
+    @Override
+    public String toString() {
+        if (uid == 0) {
+            // root TreeNode
+            return "Root";
+        }
+
+        final boolean ALWAYS_DISPLAY_ID = true;
+        JavaController controller = new JavaController();
+        switch (kind) {
+            case ANNOTATION:
+                return "Annotation" + " : " + uid;
+            case BLOCK: {
+                String[] interf = { "" };
+                boolean status = controller.getObjectProperty(uid, kind, ObjectProperties.INTERFACE_FUNCTION, interf);
+                if (!status || interf[0].isEmpty() || ALWAYS_DISPLAY_ID) {
+                    return "Block" + " : " + uid;
+                }
+                return interf[0];
+            }
+            case DIAGRAM: {
+                String[] name = { "" };
+                boolean status = controller.getObjectProperty(uid, kind, ObjectProperties.TITLE, name);
+                if (!status || name[0].isEmpty() || ALWAYS_DISPLAY_ID) {
+                    return "Untitled" + " : " + uid;
+                }
+                return name[0];
+            }
+            case LINK:
+                return "Link" + " : " + uid;
+            default:
+                return "";
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#hashCode()
+     */
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + (int) (uid ^ (uid >>> 32));
+        return result;
+    }
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        BrowserTreeNodeData other = (BrowserTreeNodeData) obj;
+        if (uid != other.uid) {
+            return false;
+        }
+        return true;
+    }
+}
index 830eeea..36d1d77 100644 (file)
@@ -152,14 +152,26 @@ public class XcosDiagram extends ScilabGraph {
     // the scicos engine current status
     private final transient CompilationEngineStatus engine;
 
+    // the associated object uid
+    private long id;
+
+
     /**
-     * Default constructor for a visible diagram
+     * FIXME:: do not commit
      */
     public XcosDiagram() {
         this(true);
     }
 
     /**
+     * Default constructor for a visible diagram
+     */
+    public XcosDiagram(long id) {
+        this(true);
+        this.id = id;
+    }
+
+    /**
      * Constructor
      *
      * @param withVisibleFeatures true if the visible features should be activated, false otherwise. Disable it on encode/decode leads to a huge performance gain.
@@ -1876,6 +1888,13 @@ public class XcosDiagram extends ScilabGraph {
     }
 
     /**
+     * @return the model ID
+     */
+    public long getId() {
+        return id;
+    }
+
+    /**
      * @param finalIntegrationTime
      *            set integration time
      * @throws PropertyVetoException
index 21c5636..8a6adad 100644 (file)
@@ -198,7 +198,7 @@ public final class Modelica {
     /**
      * Unmerge the model
      *
-     * @param model
+     * @param tree
      *            the model
      * @return the unmerged model
      */
index 10b2225..6a66f9b 100644 (file)
@@ -28,7 +28,7 @@
 
 %include <enums.swg>
 %include <typemaps.i>
-       %include <std_vector.i>
+%include <std_vector.i>
 %include <std_string.i>
 
 /*
@@ -92,8 +92,7 @@
 /*
  * Generate the View interface
  */
-%feature("director", assumeoverride=1) org_scilab_modules_scicos::View;
-%feature("nodirector") org_scilab_modules_scicos::View::propertyUpdated(const ScicosID& uid, kind_t k, object_properties_t p, update_status_t u);
+%feature("director", assumeoverride=0) org_scilab_modules_scicos::View;
 %include "../scicos/includes/View.hxx";
 
 
 %ignore org_scilab_modules_scicos::Controller::getObject;
 %ignore org_scilab_modules_scicos::Controller::unregister_view;
 %ignore org_scilab_modules_scicos::Controller::register_view;
-%ignore org_scilab_modules_scicos::Controller::look_for_view;
-%ignore org_scilab_modules_scicos::Controller::delete_all_instances;
 %include "../scicos/includes/Controller.hxx";
 
 // Instanciate templates mapped to Java
  */
 %{
 static void register_view(const std::string& name, org_scilab_modules_scicos::View* view) {
-       org_scilab_modules_scicos::Controller::register_view(name, view);
+  org_scilab_modules_scicos::Controller::register_view(name, view);
+};
+static void unregister_view(org_scilab_modules_scicos::View* view) {
+  org_scilab_modules_scicos::Controller::unregister_view(view);
 };
 %}
 
@@ -153,18 +153,27 @@ import java.util.ArrayList;
 %pragma(java) modulebase="Controller"
 
 %pragma(java) modulecode=%{
-    // will contains all registered JavaViews to prevent garbage-collection 
-    private static ArrayList<View> references = new ArrayList<View>();
-    
-    private static long add_reference(View v) {
-        references.add(v);
-        return View.getCPtr(v);
-    }
+  // will contains all registered JavaViews to prevent garbage-collection 
+  private static ArrayList<View> references = new ArrayList<View>();
+  
+  private static long add_reference(View v) {
+    references.add(v);
+    return View.getCPtr(v);
+  }
+
+  private static View remove_reference(View v) {
+    references.remove(v);
+    return v;
+  }
 %}
 
 %typemap(javain) org_scilab_modules_scicos::View* "add_reference($javainput)"
-
 void register_view(const std::string& name, org_scilab_modules_scicos::View* view);
+%typemap(javaout) void "{
+    JavaControllerJNI.unregister_view(View.getCPtr(view), view);
+    remove_reference(view);
+  }"
+void unregister_view(org_scilab_modules_scicos::View* view);
 
 /*
  * Static load of library
index 25e547f..6fe7407 100644 (file)
@@ -655,7 +655,7 @@ namespace Swig {
 namespace Swig {
   namespace {
     jclass jclass_JavaControllerJNI = NULL;
-    jmethodID director_method_ids[4];
+    jmethodID director_method_ids[5];
   }
 }
 
@@ -748,7 +748,10 @@ SWIGINTERN void std_vector_Sl_ScicosID_Sg__set(std::vector< ScicosID > *self,int
             }
 
 static void register_view(const std::string& name, org_scilab_modules_scicos::View* view) {
-       org_scilab_modules_scicos::Controller::register_view(name, view);
+  org_scilab_modules_scicos::Controller::register_view(name, view);
+};
+static void unregister_view(org_scilab_modules_scicos::View* view) {
+  org_scilab_modules_scicos::Controller::unregister_view(view);
 };
 
 
@@ -767,12 +770,12 @@ SwigDirector_View::~SwigDirector_View() {
 }
 
 
-void SwigDirector_View::objectCreated(ScicosID const &uid, kind_t k) {
+void SwigDirector_View::objectCreated(ScicosID const &uid, kind_t kind) {
   JNIEnvWrapper swigjnienv(this) ;
   JNIEnv * jenv = swigjnienv.getJNIEnv() ;
   jobject swigjobj = (jobject) NULL ;
   jlong juid = 0 ;
-  jint jk  ;
+  jint jkind  ;
   
   if (!swig_override[0]) {
     SWIG_JavaThrowException(JNIEnvWrapper(this).getJNIEnv(), SWIG_JavaDirectorPureVirtual, "Attempted to invoke pure virtual method org_scilab_modules_scicos::View::objectCreated.");
@@ -781,8 +784,8 @@ void SwigDirector_View::objectCreated(ScicosID const &uid, kind_t k) {
   swigjobj = swig_get_self(jenv);
   if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) {
     juid = (jlong)uid;
-    jk = (jint) k;
-    jenv->CallStaticVoidMethod(Swig::jclass_JavaControllerJNI, Swig::director_method_ids[0], swigjobj, juid, jk);
+    jkind = (jint) kind;
+    jenv->CallStaticVoidMethod(Swig::jclass_JavaControllerJNI, Swig::director_method_ids[0], swigjobj, juid, jkind);
     jthrowable swigerror = jenv->ExceptionOccurred();
     if (swigerror) {
       jenv->ExceptionClear();
@@ -795,22 +798,22 @@ void SwigDirector_View::objectCreated(ScicosID const &uid, kind_t k) {
   if (swigjobj) jenv->DeleteLocalRef(swigjobj);
 }
 
-void SwigDirector_View::objectDeleted(ScicosID const &uid, kind_t k) {
+void SwigDirector_View::objectReferenced(ScicosID const &uid, kind_t kind) {
   JNIEnvWrapper swigjnienv(this) ;
   JNIEnv * jenv = swigjnienv.getJNIEnv() ;
   jobject swigjobj = (jobject) NULL ;
   jlong juid = 0 ;
-  jint jk  ;
+  jint jkind  ;
   
   if (!swig_override[1]) {
-    SWIG_JavaThrowException(JNIEnvWrapper(this).getJNIEnv(), SWIG_JavaDirectorPureVirtual, "Attempted to invoke pure virtual method org_scilab_modules_scicos::View::objectDeleted.");
+    SWIG_JavaThrowException(JNIEnvWrapper(this).getJNIEnv(), SWIG_JavaDirectorPureVirtual, "Attempted to invoke pure virtual method org_scilab_modules_scicos::View::objectReferenced.");
     return;
   }
   swigjobj = swig_get_self(jenv);
   if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) {
     juid = (jlong)uid;
-    jk = (jint) k;
-    jenv->CallStaticVoidMethod(Swig::jclass_JavaControllerJNI, Swig::director_method_ids[1], swigjobj, juid, jk);
+    jkind = (jint) kind;
+    jenv->CallStaticVoidMethod(Swig::jclass_JavaControllerJNI, Swig::director_method_ids[1], swigjobj, juid, jkind);
     jthrowable swigerror = jenv->ExceptionOccurred();
     if (swigerror) {
       jenv->ExceptionClear();
@@ -818,27 +821,27 @@ void SwigDirector_View::objectDeleted(ScicosID const &uid, kind_t k) {
     }
     
   } else {
-    SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object in org_scilab_modules_scicos::View::objectDeleted ");
+    SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object in org_scilab_modules_scicos::View::objectReferenced ");
   }
   if (swigjobj) jenv->DeleteLocalRef(swigjobj);
 }
 
-void SwigDirector_View::objectUpdated(ScicosID const &uid, kind_t k) {
+void SwigDirector_View::objectUnreferenced(ScicosID const &uid, kind_t kind) {
   JNIEnvWrapper swigjnienv(this) ;
   JNIEnv * jenv = swigjnienv.getJNIEnv() ;
   jobject swigjobj = (jobject) NULL ;
   jlong juid = 0 ;
-  jint jk  ;
+  jint jkind  ;
   
   if (!swig_override[2]) {
-    SWIG_JavaThrowException(JNIEnvWrapper(this).getJNIEnv(), SWIG_JavaDirectorPureVirtual, "Attempted to invoke pure virtual method org_scilab_modules_scicos::View::objectUpdated.");
+    SWIG_JavaThrowException(JNIEnvWrapper(this).getJNIEnv(), SWIG_JavaDirectorPureVirtual, "Attempted to invoke pure virtual method org_scilab_modules_scicos::View::objectUnreferenced.");
     return;
   }
   swigjobj = swig_get_self(jenv);
   if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) {
     juid = (jlong)uid;
-    jk = (jint) k;
-    jenv->CallStaticVoidMethod(Swig::jclass_JavaControllerJNI, Swig::director_method_ids[2], swigjobj, juid, jk);
+    jkind = (jint) kind;
+    jenv->CallStaticVoidMethod(Swig::jclass_JavaControllerJNI, Swig::director_method_ids[2], swigjobj, juid, jkind);
     jthrowable swigerror = jenv->ExceptionOccurred();
     if (swigerror) {
       jenv->ExceptionClear();
@@ -846,29 +849,59 @@ void SwigDirector_View::objectUpdated(ScicosID const &uid, kind_t k) {
     }
     
   } else {
-    SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object in org_scilab_modules_scicos::View::objectUpdated ");
+    SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object in org_scilab_modules_scicos::View::objectUnreferenced ");
   }
   if (swigjobj) jenv->DeleteLocalRef(swigjobj);
 }
 
-void SwigDirector_View::propertyUpdated(ScicosID const &uid, kind_t k, object_properties_t p) {
+void SwigDirector_View::objectDeleted(ScicosID const &uid, kind_t kind) {
   JNIEnvWrapper swigjnienv(this) ;
   JNIEnv * jenv = swigjnienv.getJNIEnv() ;
   jobject swigjobj = (jobject) NULL ;
   jlong juid = 0 ;
-  jint jk  ;
-  jint jp  ;
+  jint jkind  ;
   
   if (!swig_override[3]) {
+    SWIG_JavaThrowException(JNIEnvWrapper(this).getJNIEnv(), SWIG_JavaDirectorPureVirtual, "Attempted to invoke pure virtual method org_scilab_modules_scicos::View::objectDeleted.");
+    return;
+  }
+  swigjobj = swig_get_self(jenv);
+  if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) {
+    juid = (jlong)uid;
+    jkind = (jint) kind;
+    jenv->CallStaticVoidMethod(Swig::jclass_JavaControllerJNI, Swig::director_method_ids[3], swigjobj, juid, jkind);
+    jthrowable swigerror = jenv->ExceptionOccurred();
+    if (swigerror) {
+      jenv->ExceptionClear();
+      throw Swig::DirectorException(jenv, swigerror);
+    }
+    
+  } else {
+    SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object in org_scilab_modules_scicos::View::objectDeleted ");
+  }
+  if (swigjobj) jenv->DeleteLocalRef(swigjobj);
+}
+
+void SwigDirector_View::propertyUpdated(ScicosID const &uid, kind_t kind, object_properties_t property, update_status_t status) {
+  JNIEnvWrapper swigjnienv(this) ;
+  JNIEnv * jenv = swigjnienv.getJNIEnv() ;
+  jobject swigjobj = (jobject) NULL ;
+  jlong juid = 0 ;
+  jint jkind  ;
+  jint jproperty  ;
+  jint jstatus  ;
+  
+  if (!swig_override[4]) {
     SWIG_JavaThrowException(JNIEnvWrapper(this).getJNIEnv(), SWIG_JavaDirectorPureVirtual, "Attempted to invoke pure virtual method org_scilab_modules_scicos::View::propertyUpdated.");
     return;
   }
   swigjobj = swig_get_self(jenv);
   if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) {
     juid = (jlong)uid;
-    jk = (jint) k;
-    jp = (jint) p;
-    jenv->CallStaticVoidMethod(Swig::jclass_JavaControllerJNI, Swig::director_method_ids[3], swigjobj, juid, jk, jp);
+    jkind = (jint) kind;
+    jproperty = (jint) property;
+    jstatus = (jint) status;
+    jenv->CallStaticVoidMethod(Swig::jclass_JavaControllerJNI, Swig::director_method_ids[4], swigjobj, juid, jkind, jproperty, jstatus);
     jthrowable swigerror = jenv->ExceptionOccurred();
     if (swigerror) {
       jenv->ExceptionClear();
@@ -891,13 +924,16 @@ void SwigDirector_View::swig_connect_director(JNIEnv *jenv, jobject jself, jclas
       "objectCreated", "(JLorg/scilab/modules/xcos/Kind;)V", NULL 
     },
     {
-      "objectDeleted", "(JLorg/scilab/modules/xcos/Kind;)V", NULL 
+      "objectReferenced", "(JLorg/scilab/modules/xcos/Kind;)V", NULL 
     },
     {
-      "objectUpdated", "(JLorg/scilab/modules/xcos/Kind;)V", NULL 
+      "objectUnreferenced", "(JLorg/scilab/modules/xcos/Kind;)V", NULL 
+    },
+    {
+      "objectDeleted", "(JLorg/scilab/modules/xcos/Kind;)V", NULL 
     },
     {
-      "propertyUpdated", "(JLorg/scilab/modules/xcos/Kind;Lorg/scilab/modules/xcos/ObjectProperties;)V", NULL 
+      "propertyUpdated", "(JLorg/scilab/modules/xcos/Kind;Lorg/scilab/modules/xcos/ObjectProperties;Lorg/scilab/modules/xcos/UpdateStatus;)V", NULL 
     }
   };
   
@@ -910,12 +946,17 @@ void SwigDirector_View::swig_connect_director(JNIEnv *jenv, jobject jself, jclas
       baseclass = (jclass) jenv->NewGlobalRef(baseclass);
     }
     bool derived = (jenv->IsSameObject(baseclass, jcls) ? false : true);
-    for (int i = 0; i < 4; ++i) {
+    for (int i = 0; i < 5; ++i) {
       if (!methods[i].base_methid) {
         methods[i].base_methid = jenv->GetMethodID(baseclass, methods[i].mname, methods[i].mdesc);
         if (!methods[i].base_methid) return;
       }
-      swig_override[i] = derived;
+      swig_override[i] = false;
+      if (derived) {
+        jmethodID methid = jenv->GetMethodID(jcls, methods[i].mname, methods[i].mdesc);
+        swig_override[i] = (methid != methods[i].base_methid);
+        jenv->ExceptionClear();
+      }
     }
   }
 }
@@ -965,7 +1006,7 @@ SWIGEXPORT void JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_View_1obj
 }
 
 
-SWIGEXPORT void JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_View_1objectDeleted(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jint jarg3) {
+SWIGEXPORT void JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_View_1objectReferenced(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jint jarg3) {
   org_scilab_modules_scicos::View *arg1 = (org_scilab_modules_scicos::View *) 0 ;
   ScicosID *arg2 = 0 ;
   kind_t arg3 ;
@@ -978,11 +1019,11 @@ SWIGEXPORT void JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_View_1obj
   temp2 = (ScicosID)jarg2; 
   arg2 = &temp2; 
   arg3 = (kind_t)jarg3; 
-  (arg1)->objectDeleted((ScicosID const &)*arg2,arg3);
+  (arg1)->objectReferenced((ScicosID const &)*arg2,arg3);
 }
 
 
-SWIGEXPORT void JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_View_1objectUpdated(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jint jarg3) {
+SWIGEXPORT void JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_View_1objectUnreferenced(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jint jarg3) {
   org_scilab_modules_scicos::View *arg1 = (org_scilab_modules_scicos::View *) 0 ;
   ScicosID *arg2 = 0 ;
   kind_t arg3 ;
@@ -995,15 +1036,14 @@ SWIGEXPORT void JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_View_1obj
   temp2 = (ScicosID)jarg2; 
   arg2 = &temp2; 
   arg3 = (kind_t)jarg3; 
-  (arg1)->objectUpdated((ScicosID const &)*arg2,arg3);
+  (arg1)->objectUnreferenced((ScicosID const &)*arg2,arg3);
 }
 
 
-SWIGEXPORT void JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_View_1propertyUpdated_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jint jarg3, jint jarg4) {
+SWIGEXPORT void JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_View_1objectDeleted(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jint jarg3) {
   org_scilab_modules_scicos::View *arg1 = (org_scilab_modules_scicos::View *) 0 ;
   ScicosID *arg2 = 0 ;
   kind_t arg3 ;
-  object_properties_t arg4 ;
   ScicosID temp2 ;
   
   (void)jenv;
@@ -1013,12 +1053,11 @@ SWIGEXPORT void JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_View_1pro
   temp2 = (ScicosID)jarg2; 
   arg2 = &temp2; 
   arg3 = (kind_t)jarg3; 
-  arg4 = (object_properties_t)jarg4; 
-  (arg1)->propertyUpdated((ScicosID const &)*arg2,arg3,arg4);
+  (arg1)->objectDeleted((ScicosID const &)*arg2,arg3);
 }
 
 
-SWIGEXPORT void JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_View_1propertyUpdated_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jint jarg3, jint jarg4, jint jarg5) {
+SWIGEXPORT void JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_View_1propertyUpdated(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jint jarg3, jint jarg4, jint jarg5) {
   org_scilab_modules_scicos::View *arg1 = (org_scilab_modules_scicos::View *) 0 ;
   ScicosID *arg2 = 0 ;
   kind_t arg3 ;
@@ -1059,6 +1098,28 @@ SWIGEXPORT void JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_View_1cha
 }
 
 
+SWIGEXPORT jlong JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_Controller_1look_1for_1view(JNIEnv *jenv, jclass jcls, jstring jarg1) {
+  jlong jresult = 0 ;
+  std::string *arg1 = 0 ;
+  org_scilab_modules_scicos::View *result = 0 ;
+  
+  (void)jenv;
+  (void)jcls;
+  if(!jarg1) {
+    SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string");
+    return 0;
+  }
+  const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); 
+  if (!arg1_pstr) return 0;
+  std::string arg1_str(arg1_pstr);
+  arg1 = &arg1_str;
+  jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); 
+  result = (org_scilab_modules_scicos::View *)org_scilab_modules_scicos::Controller::look_for_view((std::string const &)*arg1);
+  *(org_scilab_modules_scicos::View **)&jresult = result; 
+  return jresult;
+}
+
+
 SWIGEXPORT jlong JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_new_1Controller(JNIEnv *jenv, jclass jcls) {
   jlong jresult = 0 ;
   org_scilab_modules_scicos::Controller *result = 0 ;
@@ -1147,6 +1208,40 @@ SWIGEXPORT jlong JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_Controll
 }
 
 
+SWIGEXPORT jint JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_Controller_1getKind(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) {
+  jint jresult = 0 ;
+  org_scilab_modules_scicos::Controller *arg1 = (org_scilab_modules_scicos::Controller *) 0 ;
+  ScicosID arg2 ;
+  kind_t result;
+  
+  (void)jenv;
+  (void)jcls;
+  (void)jarg1_;
+  arg1 = *(org_scilab_modules_scicos::Controller **)&jarg1; 
+  arg2 = (ScicosID)jarg2; 
+  result = (kind_t)((org_scilab_modules_scicos::Controller const *)arg1)->getKind(arg2);
+  jresult = (jint)result; 
+  return jresult;
+}
+
+
+SWIGEXPORT jlong JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_Controller_1getAll(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2) {
+  jlong jresult = 0 ;
+  org_scilab_modules_scicos::Controller *arg1 = (org_scilab_modules_scicos::Controller *) 0 ;
+  kind_t arg2 ;
+  std::vector< ScicosID > result;
+  
+  (void)jenv;
+  (void)jcls;
+  (void)jarg1_;
+  arg1 = *(org_scilab_modules_scicos::Controller **)&jarg1; 
+  arg2 = (kind_t)jarg2; 
+  result = ((org_scilab_modules_scicos::Controller const *)arg1)->getAll(arg2);
+  *(std::vector< ScicosID > **)&jresult = new std::vector< ScicosID >((const std::vector< ScicosID > &)result); 
+  return jresult;
+}
+
+
 SWIGEXPORT jboolean JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_Controller_1getObjectProperty_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jint jarg3, jint jarg4, jintArray jarg5) {
   jboolean jresult = 0 ;
   org_scilab_modules_scicos::Controller *arg1 = (org_scilab_modules_scicos::Controller *) 0 ;
@@ -2513,24 +2608,38 @@ SWIGEXPORT void JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_register_
 }
 
 
+SWIGEXPORT void JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_unregister_1view(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) {
+  org_scilab_modules_scicos::View *arg1 = (org_scilab_modules_scicos::View *) 0 ;
+  
+  (void)jenv;
+  (void)jcls;
+  (void)jarg1_;
+  arg1 = *(org_scilab_modules_scicos::View **)&jarg1; 
+  unregister_view(arg1);
+}
+
+
 SWIGEXPORT void JNICALL Java_org_scilab_modules_xcos_JavaControllerJNI_swig_1module_1init(JNIEnv *jenv, jclass jcls) {
   int i;
   
   static struct {
     const char *method;
     const char *signature;
-  } methods[4] = {
+  } methods[5] = {
     {
       "SwigDirector_View_objectCreated", "(Lorg/scilab/modules/xcos/View;JI)V" 
     },
     {
-      "SwigDirector_View_objectDeleted", "(Lorg/scilab/modules/xcos/View;JI)V" 
+      "SwigDirector_View_objectReferenced", "(Lorg/scilab/modules/xcos/View;JI)V" 
     },
     {
-      "SwigDirector_View_objectUpdated", "(Lorg/scilab/modules/xcos/View;JI)V" 
+      "SwigDirector_View_objectUnreferenced", "(Lorg/scilab/modules/xcos/View;JI)V" 
+    },
+    {
+      "SwigDirector_View_objectDeleted", "(Lorg/scilab/modules/xcos/View;JI)V" 
     },
     {
-      "SwigDirector_View_propertyUpdated__SWIG_0", "(Lorg/scilab/modules/xcos/View;JII)V" 
+      "SwigDirector_View_propertyUpdated", "(Lorg/scilab/modules/xcos/View;JIII)V" 
     }
   };
   Swig::jclass_JavaControllerJNI = (jclass) jenv->NewGlobalRef(jcls);
index bd96001..df0294d 100644 (file)
@@ -17,16 +17,17 @@ public:
     void swig_connect_director(JNIEnv *jenv, jobject jself, jclass jcls, bool swig_mem_own, bool weak_global);
     SwigDirector_View(JNIEnv *jenv);
     virtual ~SwigDirector_View();
-    virtual void objectCreated(ScicosID const &uid, kind_t k);
-    virtual void objectDeleted(ScicosID const &uid, kind_t k);
-    virtual void objectUpdated(ScicosID const &uid, kind_t k);
-    virtual void propertyUpdated(ScicosID const &uid, kind_t k, object_properties_t p);
+    virtual void objectCreated(ScicosID const &uid, kind_t kind);
+    virtual void objectReferenced(ScicosID const &uid, kind_t kind);
+    virtual void objectUnreferenced(ScicosID const &uid, kind_t kind);
+    virtual void objectDeleted(ScicosID const &uid, kind_t kind);
+    virtual void propertyUpdated(ScicosID const &uid, kind_t kind, object_properties_t property, update_status_t status);
 public:
     bool swig_overrides(int n) {
-      return (n < 4 ? swig_override[n] : false);
+      return (n < 5 ? swig_override[n] : false);
     }
 protected:
-    Swig::BoolArray<4> swig_override;
+    Swig::BoolArray<5> swig_override;
 };