Salome HOME
Revert "Synchronize adm files"
[modules/gui.git] / src / SPlot2d / SPlot2d_ViewModel.cxx
index 1e84a8d91bb61d8ab294db291bfefe23f4ab1d64..4bb3a4c033cbaea56c4a36fc308cb39e5b038603 100644 (file)
@@ -1,34 +1,63 @@
+// Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
 //  File   : SPlot2d_Viewer.cxx
 //  Author : Sergey RUIN
 //  Module : SUIT
-
+//
 #include "SPlot2d_ViewModel.h"
 
+#include "SPlot2d_ViewWindow.h"
+
 #include "SPlot2d_Prs.h"
+#include "SPlot2d_Histogram.h"
 #include "SUIT_Session.h"
 #include "SUIT_Application.h"
+#include "SUIT_ViewManager.h"
+
+#include "SALOME_ListIO.hxx"
+#include "SALOME_ListIteratorOfListIO.hxx"
+
+#include <QApplication>
+#include <QToolBar>
+#include <QToolButton>
+#include <QCursor>
+#include <QColorDialog>
 
-#include "utilities.h"
-#include "qapplication.h"
-#include <qtoolbar.h>
-#include <qtoolbutton.h>
-#include <qcursor.h>
-#include <qcolordialog.h>
-#include <qwt_math.h>
+//#include <qwt_math>
 #include <qwt_plot_canvas.h>
+#include <qwt_plot_curve.h>
 #include <stdlib.h>
-#include "utilities.h"
 
-using namespace std;
+//ASL: Temporary commented in order to avoir dependency on SALOMEDS
 
-#include "SALOMEDSClient.hxx"
-#include "SALOMEDS_StudyManager.hxx"
+//#include "SALOMEDSClient.hxx"
+//#include "SALOMEDS_StudyManager.hxx"
 
 // in order NOT TO link with SalomeApp, here the code returns SALOMEDS_Study.
 // SalomeApp_Study::studyDS() does it as well, but -- here it is retrieved from
 // SALOMEDS::StudyManager - no linkage with SalomeApp.  
 
-static _PTR(Study) getStudyDS()
+/*static _PTR(Study) getStudyDS()
 {
   SALOMEDSClient_Study* aStudy = NULL;
   _PTR(StudyManager) aMgr( new SALOMEDS_StudyManager() );
@@ -42,17 +71,14 @@ static _PTR(Study) getStudyDS()
   const int id = stud->id(); // virtual method, must return SALOMEDS_Study id
   // get SALOMEDS_Study with this id from StudyMgr
   return aMgr->GetStudyByID( id );
-}                
-
-//=================================================================================
-// SPlot2d_Viewer implementation
-//=================================================================================
+} */               
 
 /*!
   Constructor
 */
 SPlot2d_Viewer::SPlot2d_Viewer(  bool theAutoDel )
-: Plot2d_Viewer( theAutoDel )    
+: Plot2d_Viewer( theAutoDel ),
+  myDeselectAnalytical(true)
 {
 }
 
@@ -66,17 +92,46 @@ SPlot2d_Viewer::~SPlot2d_Viewer()
 /*!
   Renames curve if it is found
 */
-void SPlot2d_Viewer::rename( const Handle(SALOME_InteractiveObject)& IObject, QString newName ) 
+void SPlot2d_Viewer::rename( const Handle(SALOME_InteractiveObject)& IObject,
+                             const QString& newName, Plot2d_ViewFrame* fr ) 
 {
-  Plot2d_ViewFrame* aViewFrame = getActiveViewFrame();
-  if(aViewFrame == NULL) return;
+  Plot2d_ViewFrame* aViewFrame = fr ? fr : getActiveViewFrame();
+  if( !aViewFrame )
+    return;
 
-  Plot2d_Curve* curve = getCurveByIO( IObject );
-  if ( curve ) {
-    curve->setVerTitle( newName );
-    int key = aViewFrame->hasCurve( curve );
-    if ( key ) {
-      aViewFrame->setCurveTitle( key, newName );
+  CurveDict aCurves = aViewFrame->getCurves();
+  CurveDict::Iterator it = aCurves.begin();
+  for( ; it != aCurves.end(); ++it )
+  {
+    SPlot2d_Curve* aCurve = dynamic_cast<SPlot2d_Curve*>( it.value() );
+    if( aCurve && aCurve->hasIO() && aCurve->getIO()->isSame( IObject ) )
+    {
+      aCurve->setVerTitle( newName );
+      it.key()->setTitle( newName );
+    }
+
+    if( aCurve && aCurve->hasTableIO() && aCurve->getTableIO()->isSame( IObject ) )
+      aCurve->getTableIO()->setName( newName.toLatin1() );
+  }
+  aViewFrame->updateTitles();
+}
+
+/*!
+  Renames all copies of object in all view windows
+  \param IObj - object to be renamed
+  \param name - new name
+*/
+void SPlot2d_Viewer::renameAll( const Handle(SALOME_InteractiveObject)& IObj, const QString& name )
+{
+  SUIT_ViewManager* vm = getViewManager();
+  if ( vm )
+  {
+    const QVector<SUIT_ViewWindow*>& wnds = vm->getViews();
+
+    for ( uint i = 0; i < wnds.size(); i++ )
+    {
+      Plot2d_ViewWindow* pwnd = dynamic_cast<Plot2d_ViewWindow*>( wnds.at( i ) );
+      rename( IObj, name, pwnd->getViewFrame() );
     }
   }
 }
@@ -93,11 +148,12 @@ bool SPlot2d_Viewer::isInViewer( const Handle(SALOME_InteractiveObject)& IObject
     return 1;
   else{
     if(!IObject.IsNull()){
-      QIntDictIterator<Plot2d_Curve> it(aViewFrame->getCurves());
-      for(; it.current();++it) {
-       SPlot2d_Curve* aCurve = dynamic_cast<SPlot2d_Curve*>(it.current()); 
-       if(aCurve->hasIO() && aCurve->getTableIO()->isSame(IObject))
-         return 1;
+      CurveDict aCurves = aViewFrame->getCurves();
+      CurveDict::Iterator it = aCurves.begin();
+      for( ; it != aCurves.end(); ++it ) {
+        SPlot2d_Curve* aCurve = dynamic_cast<SPlot2d_Curve*>( it.value() );
+        if(aCurve && aCurve->hasIO() && aCurve->getTableIO()->isSame(IObject))
+          return 1;
       }
     }
   }
@@ -128,9 +184,10 @@ void SPlot2d_Viewer::DisplayOnly( const Handle(SALOME_InteractiveObject)& IObjec
   if(aViewFrame == NULL) return;
 
   Plot2d_Curve* curve = getCurveByIO( IObject );
-  QIntDictIterator<Plot2d_Curve> it( aViewFrame->getCurves() );
-  for ( ; it.current(); ++it ) {
-    if(it.current() != curve)
+  CurveDict aCurves = aViewFrame->getCurves();
+  CurveDict::Iterator it = aCurves.begin();
+  for( ; it != aCurves.end(); ++it ) {
+    if(it.value() != curve)
       aViewFrame->eraseCurve( curve );
     else
       aViewFrame->updateCurve( curve, false );
@@ -152,7 +209,8 @@ void SPlot2d_Viewer::Erase( const Handle(SALOME_InteractiveObject)& IObject, boo
     aViewFrame->eraseCurve( curve, update );
 
   // it can be table or container object selected
-  _PTR(Study) aStudy = getStudyDS();
+  //ASL: Temporary commented in order to avoid dependency on SALOMEDS
+/*  _PTR(Study) aStudy = getStudyDS();
   _PTR(SObject) aSO = aStudy->FindObjectID(IObject->getEntry());
   if ( aSO ) {
     _PTR(ChildIterator) aIter = aStudy->NewChildIterator( aSO );
@@ -160,13 +218,13 @@ void SPlot2d_Viewer::Erase( const Handle(SALOME_InteractiveObject)& IObject, boo
       _PTR(SObject) aChildSO = aIter->Value();
       _PTR(SObject) refSO;
       if ( aChildSO->ReferencedObject( refSO ) && refSO )
-       aChildSO = refSO;
+        aChildSO = refSO;
       curve = getCurveByIO( new SALOME_InteractiveObject( aChildSO->GetID().c_str(), "") );
       if ( curve )
-       aViewFrame->eraseCurve( curve, update );
+        aViewFrame->eraseCurve( curve, update );
     }
   }
-
+*/
 
 }
 
@@ -188,12 +246,9 @@ void SPlot2d_Viewer::Repaint()
   if(aViewFrame) aViewFrame->Repaint();
 }
 
-//==========================================================
 /*!
- *  SPlot2d_Viewer::Display
- *  Display presentation
- */
-//==========================================================
+  Display presentation
+*/
 void SPlot2d_Viewer::Display( const SALOME_Prs2d* prs )
 {
   Plot2d_ViewFrame* aViewFrame = getActiveViewFrame();
@@ -201,12 +256,9 @@ void SPlot2d_Viewer::Display( const SALOME_Prs2d* prs )
   if(aViewFrame && aPrs) aViewFrame->Display(aPrs);
 }
 
-//==========================================================
 /*!
- *  SPlot2d_Viewer::Erase
- *  Erase presentation
- */
-//==========================================================
+  Erase presentation
+*/
 void SPlot2d_Viewer::Erase( const SALOME_Prs2d* prs, const bool )
 {
   Plot2d_ViewFrame* aViewFrame = getActiveViewFrame();
@@ -214,45 +266,32 @@ void SPlot2d_Viewer::Erase( const SALOME_Prs2d* prs, const bool )
   if(aViewFrame && aPrs) aViewFrame->Erase(aPrs);
 }
   
-//==========================================================
 /*!
- *  SPlot2d_Viewer::CreatePrs
- *  Create presentation by entry
- */
-//==========================================================
+  Create presentation by entry
+*/
 SALOME_Prs* SPlot2d_Viewer::CreatePrs( const char* entry )
 {
   Plot2d_ViewFrame* aViewFrame = getActiveViewFrame();
+  SPlot2d_Prs *prs = new SPlot2d_Prs();
   if(aViewFrame)
   {
-    Plot2d_Prs* prs = aViewFrame->CreatePrs(entry);
-    if( prs )
-      return new SPlot2d_Prs( prs );
+    CurveDict aCurves = aViewFrame->getCurves();
+    CurveDict::Iterator it = aCurves.begin();
+    for( ; it != aCurves.end(); ++it ) {
+      SPlot2d_Curve* aCurve = dynamic_cast<SPlot2d_Curve*>(it.value());
+      OwnerSet owners = aCurve->getOwners();
+      if(aCurve) {
+       if ( 
+           (aCurve->hasIO() && !strcmp( aCurve->getIO()->getEntry(), entry )) ||
+           (aCurve->hasTableIO() && !strcmp( aCurve->getTableIO()->getEntry(), entry )) ||
+           owners.contains(entry)
+           ) {
+         prs->AddObject(aCurve);
+       }
+      }      
+    }
   }
-
-  return NULL;
-}
-
-//==========================================================
-/*!
- *  SPlot2d_Viewer::BeforeDisplay
- *  Axiluary method called before displaying of objects
- */
-//==========================================================
-void  SPlot2d_Viewer::BeforeDisplay( SALOME_Displayer* d )
-{
-  d->BeforeDisplay( this, SALOME_Plot2dViewType() );
-}
-
-//==========================================================
-/*!
- *  SPlot2d_Viewer::AfterDisplay
- *  Axiluary method called after displaying of objects
- */
-//==========================================================
-void  SPlot2d_Viewer::AfterDisplay( SALOME_Displayer* d )
-{
-  d->AfterDisplay( this, SALOME_Plot2dViewType() );
+  return prs;
 }
 
 /*!
@@ -267,6 +306,23 @@ bool SPlot2d_Viewer::isVisible( const Handle(SALOME_InteractiveObject)& IObject
   return aViewFrame->isVisible( curve );
 }
 
+/*!
+  \Collect objects visible in viewer
+  \param theList - visible objects collection
+*/
+void SPlot2d_Viewer::GetVisible( SALOME_ListIO& theList )
+{
+  Plot2d_ViewFrame* aViewFrame = getActiveViewFrame();
+  if(aViewFrame == NULL) return;
+  CurveDict aCurves = aViewFrame->getCurves();
+  CurveDict::Iterator it = aCurves.begin();
+  for( ; it != aCurves.end(); ++it ) {
+    SPlot2d_Curve* aCurve = dynamic_cast<SPlot2d_Curve*>(it.value()); 
+    if ( aCurve && aCurve->hasIO() && aViewFrame->isVisible( aCurve ) )
+      theList.Append( aCurve->getIO() );
+  }
+}
+
 /*!
   Return interactive obeject if is presented in the viewer
 */
@@ -276,10 +332,11 @@ Handle(SALOME_InteractiveObject) SPlot2d_Viewer::FindIObject( const char* Entry
   Plot2d_ViewFrame* aViewFrame = getActiveViewFrame();
   if(aViewFrame == NULL) return anIO;
 
-  QIntDictIterator<Plot2d_Curve> it( aViewFrame->getCurves() );
-  for ( ; it.current(); ++it ) {
-    SPlot2d_Curve* aCurve = dynamic_cast<SPlot2d_Curve*>(it.current()); 
-    if ( aCurve->hasIO() && !strcmp( aCurve->getIO()->getEntry(), Entry ) ) {
+  CurveDict aCurves = aViewFrame->getCurves();
+  CurveDict::Iterator it = aCurves.begin();
+  for( ; it != aCurves.end(); ++it ) {
+    SPlot2d_Curve* aCurve = dynamic_cast<SPlot2d_Curve*>(it.value()); 
+    if ( aCurve && aCurve->hasIO() && !strcmp( aCurve->getIO()->getEntry(), Entry ) ) {
       anIO = aCurve->getIO();
       break;
     }
@@ -287,12 +344,9 @@ Handle(SALOME_InteractiveObject) SPlot2d_Viewer::FindIObject( const char* Entry
   return anIO;
 }
 
-//==========================================================
 /*!
- *  SPlot2d_Viewer::getActiveViewFrame
- *  Returns an active Plot2d ViewFrame or NULL
- */
-//==========================================================
+  Returns an active Plot2d ViewFrame or NULL
+*/
 Plot2d_ViewFrame* SPlot2d_Viewer::getActiveViewFrame()
 {
   SUIT_ViewManager* aViewMgr = getViewManager();
@@ -305,41 +359,143 @@ Plot2d_ViewFrame* SPlot2d_Viewer::getActiveViewFrame()
   return NULL;
 }
 
-SPlot2d_Curve* SPlot2d_Viewer::getCurveByIO( const Handle(SALOME_InteractiveObject)& theIObject )
+/*!
+  \return curve by object and viewframe
+  \param theIObject - object
+  \param fr - viewframe
+*/
+SPlot2d_Curve* SPlot2d_Viewer::getCurveByIO( const Handle(SALOME_InteractiveObject)& theIObject,
+                                             Plot2d_ViewFrame* fr )
 {
   if ( !theIObject.IsNull() ) {
-    Plot2d_ViewFrame* aViewFrame = getActiveViewFrame();
+    Plot2d_ViewFrame* aViewFrame = fr ? fr : getActiveViewFrame();
     if(aViewFrame) {
-      QIntDictIterator<Plot2d_Curve> it( aViewFrame->getCurves() );
-      for ( ; it.current(); ++it ) {
-       SPlot2d_Curve* aCurve = dynamic_cast<SPlot2d_Curve*>(it.current()); 
-       if(aCurve) {
-         if ( aCurve->hasIO() && aCurve->getIO()->isSame( theIObject ) )
-           return aCurve;
-       }
+      CurveDict aCurves = aViewFrame->getCurves();
+      CurveDict::Iterator it = aCurves.begin();
+      for( ; it != aCurves.end(); ++it ) {
+        SPlot2d_Curve* aCurve = dynamic_cast<SPlot2d_Curve*>( it.value() );
+        if(aCurve) {
+          if ( aCurve->hasIO() && aCurve->getIO()->isSame( theIObject ) )
+            return aCurve;
+        }
       }
     }
   }
   return NULL;
 }
 
-void SPlot2d_Viewer::onCloneView( Plot2d_ViewFrame* clonedVF, Plot2d_ViewFrame* newVF )
+/*!
+  create SPlot2d_ViewWindow
+*/
+SUIT_ViewWindow* SPlot2d_Viewer::createView( SUIT_Desktop* theDesktop )
 {
-  if( !clonedVF || !newVF )
-    return;
+  SPlot2d_ViewWindow* aPlot2dView = new SPlot2d_ViewWindow(theDesktop, this);
+  aPlot2dView->initLayout();
+  if (getPrs())
+    aPlot2dView->getViewFrame()->Display(getPrs());
+  return aPlot2dView;
+}
 
-  // 1) Copy all properties of view
+/*!
+  SLOT: called when action "Legend Clicked" is activated.
+  override "onLegendClicked" method from Plot2d_ViewModel.
+*/
+void SPlot2d_Viewer::onClicked( const QVariant& itemInfo, int index )
+{
+  Plot2d_ViewFrame* aViewFrame = getActiveViewFrame();
+  if(aViewFrame == NULL) return;
 
-  newVF->copyPreferences( clonedVF );
+  QwtPlotItem* plotItem = aViewFrame->getPlot()->infoToItem( itemInfo );
+
+  bool isAnalytical = false;
+  AnalyticalCurveList curves = aViewFrame->getAnalyticalCurves();
+   foreach ( Plot2d_AnalyticalCurve* curve, curves ) {
+          if(plotItem == curve->plotItem()) {
+                 isAnalytical = true;
+                 curve->setSelected(true);
+          } else {
+                 curve->setSelected(false);
+          }
+   }
+  if(isAnalytical) {
+       myDeselectAnalytical = false;
+       emit clearSelected();
+       aViewFrame->updateAnalyticalCurves();
+       myDeselectAnalytical = true;
+       return;
+  }
 
-  // 2) Display all curves displayed in cloned view
+  Plot2d_Object* anObject = aViewFrame->getPlotObject(plotItem);
+  
+  if(anObject) {
+    
+    // Highlight object in Object Browser
+    QString anEntry;
+    if(SPlot2d_Curve* aSCurve = dynamic_cast<SPlot2d_Curve*>(anObject)) {
+      if(aSCurve->hasIO())
+       anEntry = aSCurve->getIO()->getEntry();
+    } else if( SPlot2d_Histogram* aSHisto = dynamic_cast<SPlot2d_Histogram*>(anObject)) {
+      if(aSHisto->hasIO())
+       anEntry = aSHisto->getIO()->getEntry();
+    }
+    
+    if(!anEntry.isEmpty())
+      emit legendSelected( anEntry );
+  }    
+}
 
-  QList<Plot2d_Curve> aCurves;
-  clonedVF->getCurves( aCurves );
-  QList<Plot2d_Curve>::const_iterator anIt = aCurves.begin(), aLast = aCurves.end();
+/*!
+  
+*/
+void SPlot2d_Viewer::setObjectsSelected( SALOME_ListIO& theList ) {
+  Plot2d_ViewFrame* aViewFrame = getActiveViewFrame();
+  if(aViewFrame) {
+
+    objectList allObjects;
+    aViewFrame->getObjects( allObjects );
+    
+    bool isSelected = false;
+    SPlot2d_Histogram* h = 0;
+    SPlot2d_Curve* c =0;
+    
+    foreach ( Plot2d_Object* o, allObjects ) {
+      isSelected = false;
+      
+      Handle(SALOME_InteractiveObject) io;
+      if( (h = dynamic_cast<SPlot2d_Histogram*>(o)) && h->hasIO() ) {
+       io = h->getIO();
+      } else if((c = dynamic_cast<SPlot2d_Curve*>(o)) && c->hasIO()) {
+       io = c->getIO();
+      } else {
+       continue;
+      }
 
-  for( ; anIt!=aLast; anIt++ )
-    if( clonedVF->isVisible( *anIt ) )
-      newVF->displayCurve( *anIt, false );
-  newVF->Repaint();
+      SALOME_ListIteratorOfListIO anIter( theList ); 
+      
+      for( ; anIter.More(); anIter.Next() ) {
+       if ( anIter.Value()->hasEntry() ) {
+         if( io->isSame(anIter.Value()) ) {
+           isSelected = o->isSelected();
+           if( !isSelected ) {
+             o->setSelected(true);
+             aViewFrame->updateObject(o);
+             theList.Remove(anIter);
+             isSelected = true;
+             break;
+           } else 
+             break;
+         }
+       }
+      }
+      if( !isSelected && o->isSelected() != false ) {  
+       o->setSelected(false);
+       aViewFrame->updateObject(o);
+      }
+    }
+       if( myDeselectAnalytical ) {
+               aViewFrame->deselectAnalyticalCurves();
+               aViewFrame->updateAnalyticalCurves(); 
+       }
+    aViewFrame->Repaint();
+  }
 }