Salome HOME
*** empty log message ***
[modules/gui.git] / src / SUIT / SUIT_DataObject.cxx
index 952c2d399bd7021a2fdb0db1ff12255da1610ac5..c4f31bb0e0cc4c64f4b47e1a9a1201eb4295ced0 100755 (executable)
@@ -13,6 +13,7 @@
 SUIT_DataObject::SUIT_DataObject( SUIT_DataObject* p )
 : myParent( 0 ),
   mySignal( 0 ),
+  myOpen( false ),
   myCheck( false )
 {
   myChildren.setAutoDelete( true );
@@ -26,6 +27,14 @@ SUIT_DataObject::SUIT_DataObject( SUIT_DataObject* p )
 
 SUIT_DataObject::~SUIT_DataObject()
 {
+  if ( mySignal )
+  {
+    mySignal->emitSignal();
+    mySignal->setOwner( 0 );
+  }
+
+  delete mySignal;
+
   SUIT_DataObject* p = myParent;
 
   myParent = 0;
@@ -35,8 +44,6 @@ SUIT_DataObject::~SUIT_DataObject()
 
   for ( QPtrListIterator<SUIT_DataObject> it( myChildren ); it.current(); ++it )
     it.current()->myParent = 0;
-
-  delete mySignal;
 }
 
 /*!
@@ -242,11 +249,23 @@ bool SUIT_DataObject::replaceChild( SUIT_DataObject* src, SUIT_DataObject* trg,
   removeChild( src );
 
   if ( del )
-    delete src;
+    src->deleteLater();
 
   return true;
 }
 
+/*!
+    Transfer the all children from specified object 'obj' to self.
+*/
+
+void SUIT_DataObject::reparentChildren( const SUIT_DataObject* obj )
+{
+  DataObjectList lst;
+  obj->children( lst );
+  for ( DataObjectListIterator it( lst ); it.current(); ++it )
+    it.current()->setParent( this );
+}
+
 /*!
     Set the parent object. Remove itself from current parent children
     and append itself to the new parent children list.
@@ -311,6 +330,19 @@ bool SUIT_DataObject::disconnect( QObject* reciever, const char* slot )
     Returns object name
 */
 
+void SUIT_DataObject::deleteLater()
+{
+  if ( !mySignal )
+    mySignal = new Signal( this );
+  
+  mySignal->emitSignal();
+  mySignal->deleteLater();
+}
+
+/*!
+    Returns object name
+*/
+
 QString SUIT_DataObject::name() const
 {
   return QString::null;
@@ -397,6 +429,16 @@ void SUIT_DataObject::setOn( const bool on )
   myCheck = on;
 }
 
+bool SUIT_DataObject::isOpen() const
+{
+  return myOpen;
+}
+
+void SUIT_DataObject::setOpen( const bool on )
+{
+  myOpen = on;
+}
+
 /*!
     Returns object personal indentification key.
 */
@@ -416,3 +458,35 @@ void SUIT_DataObject::dump( const int indent ) const
   for ( DataObjectListIterator it( myChildren ); it.current(); ++it ) // iterate all children
     it.current()->dump( indent + 2 );  // dump every child with indent + 2 spaces
 }
+
+/*!
+  Class: SUIT_DataObject::Signal [Internal]
+*/
+
+SUIT_DataObject::Signal::Signal( SUIT_DataObject* o )
+: QObject(),
+myOwner( o )
+{
+}
+
+SUIT_DataObject::Signal::~Signal()
+{
+  SUIT_DataObject* o = myOwner;
+  myOwner = 0;
+  if ( o )
+  {
+    o->mySignal = 0;
+    delete o;
+  }
+}
+
+void SUIT_DataObject::Signal::setOwner( SUIT_DataObject* o )
+{
+  myOwner = o;
+}
+
+void SUIT_DataObject::Signal::emitSignal()
+{
+  if ( myOwner )
+    emit destroyed( myOwner );
+}