Salome HOME
Modify creation of curves: 1) using QDockWidget instead of QDialog; 2) selection...
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_Tool.cxx
index 991dff2564ed7865717bc2d6fad8e44ae9f42eaf..4650f24e36a5c2bd2115d005c9576c8ea7762f70 100644 (file)
 #include "HYDROGUI_Tool.h"
 
 #include "HYDROGUI_DataModel.h"
+#include "HYDROGUI_DataObject.h"
 #include "HYDROGUI_Module.h"
 #include "HYDROGUI_Prs.h"
 
 #include <HYDROData_Document.h>
 #include <HYDROData_Iterator.h>
+#include <HYDROData_Zone.h>
 
 #include <GraphicsView_Viewer.h>
 
@@ -44,6 +46,7 @@
 #include <SUIT_ViewWindow.h>
 
 #include <QTextCodec>
+#include <QDockWidget>
 
 // Definition of this id allows to use 'latin1' (Qt alias for 'ISO-8859-1')
 // encoding instead of default 'System'
@@ -192,6 +195,14 @@ void HYDROGUI_Tool::GetPrsSubObjects( HYDROGUI_Module* theModule,
     if( !anObject.IsNull() )
       theSeq.Append( anObject );
   }
+
+  anIterator = HYDROData_Iterator( aDocument, KIND_ZONE );
+  for( ; anIterator.More(); anIterator.Next() )
+  {
+    Handle(HYDROData_Object) anObject = anIterator.Current();
+    if( !anObject.IsNull() )
+      theSeq.Append( anObject );
+  }
 }
 
 HYDROGUI_Prs* HYDROGUI_Tool::GetPresentation( const Handle(HYDROData_Object)& theObj,
@@ -264,31 +275,89 @@ Handle(HYDROData_Object) HYDROGUI_Tool::GetSelectedObject( HYDROGUI_Module* theM
   return NULL;
 }
 
+ObjectKind HYDROGUI_Tool::GetSelectedPartition( HYDROGUI_Module* theModule )
+{
+  HYDROGUI_DataModel* aModel = theModule->getDataModel();
+
+  SUIT_SelectionMgr* aSelectionMgr = theModule->getApp()->selectionMgr();
+  SUIT_DataOwnerPtrList anOwners;
+  aSelectionMgr->selected( anOwners );
+
+  if( anOwners.size() != 1 )
+    return KIND_UNKNOWN;
+
+  if( LightApp_DataOwner* anOwner = dynamic_cast<LightApp_DataOwner*>( anOwners.first().operator->() ) )
+  {
+    QString anEntry = anOwner->entry();
+    QString aPrefix = HYDROGUI_DataObject::entryPrefix();
+    if( anEntry.left( aPrefix.length() ) == aPrefix )
+    {
+      anEntry.remove( aPrefix );
+      for( ObjectKind anObjectKind = KIND_UNKNOWN + 1; anObjectKind <= KIND_LAST; anObjectKind++ )
+        if( HYDROGUI_DataModel::partitionName( anObjectKind ) == anEntry )
+          return anObjectKind;
+    }
+  }
+  return KIND_UNKNOWN;
+}
+
 Handle(HYDROData_Object) HYDROGUI_Tool::FindObjectByName( HYDROGUI_Module* theModule,
-                                                          const QString& theName,
+                                                          const QString&   theName,
                                                           const ObjectKind theObjectKind )
 {
   Handle(HYDROData_Object) anObject;
+  if ( theName.isEmpty() )
+    return anObject;
+
+  QStringList aNamesList;
+  aNamesList << theName;
+
+  HYDROData_SequenceOfObjects aSeqOfObjs = FindObjectsByNames( theModule, aNamesList, theObjectKind );
+  if( aSeqOfObjs.IsEmpty() )
+    return anObject;
+  
+  anObject = aSeqOfObjs.First();
+  return anObject;
+}
+
+HYDROData_SequenceOfObjects HYDROGUI_Tool::FindObjectsByNames( HYDROGUI_Module*   theModule,
+                                                               const QStringList& theNames,
+                                                               const ObjectKind   theObjectKind )
+{
+  HYDROData_SequenceOfObjects aResSeq;
+  if ( theNames.isEmpty() )
+    return aResSeq;
 
   Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( theModule->getStudyId() );
   if( aDocument.IsNull() )
-    return anObject;
+    return aResSeq;
+
+  QStringList aNamesList = theNames;
 
   HYDROData_Iterator anIter( aDocument, theObjectKind );
   for( ; anIter.More(); anIter.Next() )
   {
     Handle(HYDROData_Object) anObjectRef = anIter.Current();
-    if( !anObjectRef.IsNull() && anObjectRef->GetName() == theName )
-    {
-      anObject = anObjectRef;
+    if( anObjectRef.IsNull() )
+      continue;
+
+    QString anObjName = anObjectRef->GetName();
+    if ( anObjName.isEmpty() || !aNamesList.contains( anObjName ) )
+      continue;
+
+    aResSeq.Append( anObjectRef );
+
+    aNamesList.removeAll( anObjName );
+    if ( aNamesList.isEmpty() )
       break;
-    }
   }
-  return anObject;
+
+  return aResSeq;
 }
 
-QString HYDROGUI_Tool::GenerateObjectName( HYDROGUI_Module* theModule,
-                                           const QString& thePrefix )
+QString HYDROGUI_Tool::GenerateObjectName( HYDROGUI_Module*   theModule,
+                                           const QString&     thePrefix,
+                                           const QStringList& theUsedNames )
 {
   QString aName;
   int anId = 1;
@@ -296,6 +365,9 @@ QString HYDROGUI_Tool::GenerateObjectName( HYDROGUI_Module* theModule,
   {
     aName = QString( "%1_%2" ).arg( thePrefix ).arg( QString::number( anId++ ) );
 
+    if ( theUsedNames.contains( aName ) )
+      continue;
+
     // check that there are no other objects with the same name in the document
     Handle(HYDROData_Object) anObject = FindObjectByName( theModule, aName, KIND_UNKNOWN );
     if( anObject.IsNull() )
@@ -342,15 +414,20 @@ void HYDROGUI_Tool::GetObjectReferences( const Handle(HYDROData_Image)& theImage
 
   for( int anIndex = 0, aNbRef = theImage->NbReferences(); anIndex < aNbRef; anIndex++ )
   {
-    Handle(HYDROData_Image) aRefImage = theImage->Reference( anIndex );
-    if( !aRefImage.IsNull() && !aRefImage->IsRemoved() )
+    Handle(HYDROData_Object) aRefObj = theImage->Reference( anIndex );
+    if( !aRefObj.IsNull() && !aRefObj->IsRemoved() )
     {
-      QString aName = aRefImage->GetName();
+      QString aName = aRefObj->GetName();
       if( !theRefNames.contains( aName ) )
       {
-        theRefObjects.Append( aRefImage );
-        theRefNames.append( aRefImage->GetName() );
-        GetObjectReferences( aRefImage, theRefObjects, theRefNames );
+        theRefObjects.Append( aRefObj );
+        theRefNames.append( aRefObj->GetName() );
+        if( aRefObj->GetKind() == KIND_IMAGE )
+        {
+          Handle(HYDROData_Image) aRefImage = Handle(HYDROData_Image)::DownCast( aRefObj );
+          if( !aRefImage.IsNull() )
+            GetObjectReferences( aRefImage, theRefObjects, theRefNames );
+        }
       }
     }
   }
@@ -387,3 +464,51 @@ void HYDROGUI_Tool::GetObjectBackReferences( HYDROGUI_Module* theModule,
     }
   }
 }
+
+
+QDockWidget* HYDROGUI_Tool::WindowDock( QWidget* wid )
+{
+  if ( !wid )
+    return 0;
+
+  QDockWidget* dock = 0;
+  QWidget* w = wid->parentWidget();
+  while ( w && !dock )
+  {
+    dock = ::qobject_cast<QDockWidget*>( w );
+    w = w->parentWidget();
+  }
+  return dock;
+}
+
+QColor HYDROGUI_Tool::GenerateFillingColor( HYDROGUI_Module*   theModule,
+                                            const QStringList& theZoneNames )
+{
+  QColor aFillingColor( HYDROData_Zone::DefaultFillingColor() );
+
+  int aCounter = 0;
+  int aR = 0, aG = 0, aB = 0;
+  QStringListIterator aZoneNameIter( theZoneNames );
+  while( aZoneNameIter.hasNext() )
+  {
+    const QString& aZoneName = aZoneNameIter.next();
+    Handle(HYDROData_Zone) aRefZone = Handle(HYDROData_Zone)::DownCast(
+      FindObjectByName( theModule, aZoneName, KIND_ZONE ) );
+    if( !aRefZone.IsNull() )
+    {
+      QColor aRefColor = aRefZone->GetFillingColor();
+      aR += aRefColor.red();
+      aG += aRefColor.green();
+      aB += aRefColor.blue();
+      aCounter++;
+    }
+  }
+  
+  if( aCounter > 0 )
+  {
+    aFillingColor = QColor( aR / aCounter, aG / aCounter, aB / aCounter );
+  }
+
+  return aFillingColor;
+}
+