Salome HOME
refs #669, #677: selection of land covers in extended mode without pressing Shift...
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_DataBrowser.cxx
index 2c16b0c6383c3efdc03373dc493ce0ad033d9aab..eb5f2539e9528b890fa1fa61dd49f6743b6bd33f 100644 (file)
@@ -1,12 +1,8 @@
-// Copyright (C) 2007-2013  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
-//
+// Copyright (C) 2014-2015  EDF-R&D
 // 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.
+// 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
         
 #define VISIBILITY_COLUMN_WIDTH 25
 
-HYDROGUI_DataBrowser::HYDROGUI_DataBrowser( HYDROGUI_Module* theModule, SUIT_DataObject* theRoot, QWidget* theParent )
+
+#include <SUIT_Selector.h>
+#include <SUIT_DataOwner.h>
+
+#include <QObject>
+#include <QShortcut>
+#include <QMenu>
+
+class SUIT_DataBrowser;
+class LightApp_DataObject;
+
+
+#include "LightApp_DataOwner.h"
+#include "LightApp_DataObject.h"
+#include "LightApp_Application.h"
+#include <SUIT_DataBrowser.h>
+#include <SUIT_Session.h>
+#include <SUIT_DataObjectIterator.h>
+#include <QTime>
+#include <time.h>
+
+
+// The selector is redefined in order to correct the selection in the browser.
+// The main modification is to call fillEntries without the selector modified
+// time compare. The modified time is result of the clock() method.
+// On Linux, the method clock() returns the same values with some delay. So, it is possible,
+// that time has the same value, but the browser has already other objects.
+// So, the obsole entries can be in the saved entries by the filled method.
+// May be it will be improved in the latest version of GUI_SRC.
+// This redefinition is done for tag V7_3_0 of GUI_SRC.
+class HYDROGUI_OBSelector : public LightApp_OBSelector
+{
+public:
+  HYDROGUI_OBSelector( SUIT_DataBrowser*, SUIT_SelectionMgr* );
+  virtual ~HYDROGUI_OBSelector();
+
+protected:
+  virtual void       getSelection( SUIT_DataOwnerPtrList& ) const;
+  virtual void       setSelection( const SUIT_DataOwnerPtrList& );
+
+private:
+  void               fillEntries( QMap<QString, LightApp_DataObject*>& );
+
+private:
+  SUIT_DataOwnerPtrList               mySelectedList;
+  QMap<QString, LightApp_DataObject*> myEntries;
+};
+
+HYDROGUI_OBSelector::HYDROGUI_OBSelector( SUIT_DataBrowser* ob, SUIT_SelectionMgr* mgr )
+: LightApp_OBSelector( ob, mgr )
+{
+}
+
+/*!
+  \brief Destructor.
+*/
+HYDROGUI_OBSelector::~HYDROGUI_OBSelector()
+{
+}
+
+/*!
+  \brief Get list of currently selected objects.
+  \param theList list to be filled with the selected objects owners
+  \ This method is necessary to fill the cach containter mySelectedList
+  \ It is the same as in LightApp_OBSelector
+*/
+void HYDROGUI_OBSelector::getSelection( SUIT_DataOwnerPtrList& theList ) const
+{
+  SUIT_DataBrowser* aBrowser = browser();
+
+  if ( mySelectedList.count() == 0 ) {
+    SUIT_Session* session = SUIT_Session::session();
+    SUIT_Application* sapp = session ? session->activeApplication() : 0;
+    LightApp_Application* app = dynamic_cast<LightApp_Application*>( sapp );
+    if( !app || !aBrowser )
+      return;
+
+    DataObjectList objlist;
+    aBrowser->getSelected( objlist );
+    HYDROGUI_OBSelector* that = (HYDROGUI_OBSelector*)this;
+    QListIterator<SUIT_DataObject*> it( objlist );
+    while ( it.hasNext() ) {
+      LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>( it.next() );
+      if ( obj && app->checkDataObject( obj) ) {
+#ifndef DISABLE_SALOMEOBJECT
+        Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
+          ( obj->entry().toLatin1().constData(),
+            obj->componentDataType().toLatin1().constData(),
+            obj->name().toLatin1().constData() );
+        LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj  );
+#else
+        LightApp_DataOwner* owner = new LightApp_DataOwner( obj->entry() );
+#endif
+        that->mySelectedList.append( SUIT_DataOwnerPtr( owner ) );
+      }
+    }
+  }
+  theList = mySelectedList;
+}
+
+/*!
+  \brief Set selection.
+  \param theList list of the object owners to be set selected
+  \ It is the same as in LightApp_OBSelector. The difference is in the row with
+  \ the modification time check.
+*/
+void HYDROGUI_OBSelector::setSelection( const SUIT_DataOwnerPtrList& theList )
+{
+  SUIT_DataBrowser* aBrowser = browser();
+  if ( !aBrowser )
+    return;
+
+  // this is the difference to LightApp_OBSelector. For this, this class is redefined
+  //if( myEntries.count() == 0 || myModifiedTime < aBrowser->getModifiedTime() )
+  {
+    fillEntries( myEntries );
+  }
+
+  DataObjectList objList;
+  for ( SUIT_DataOwnerPtrList::const_iterator it = theList.begin(); 
+        it != theList.end(); ++it ) {
+    const LightApp_DataOwner* owner = dynamic_cast<const LightApp_DataOwner*>( (*it).operator->() );
+
+    if ( owner && myEntries.contains( owner->entry() ) )
+      objList.append( myEntries[owner->entry()] );
+  }
+
+  aBrowser->setSelected( objList );
+  mySelectedList.clear();
+}
+
+/*!
+  \brief Fill map of the data objects currently shown in the Object Browser.
+  \param entries map to be filled
+  \ It is the same as in LightApp_OBSelector
+*/
+void HYDROGUI_OBSelector::fillEntries( QMap<QString, LightApp_DataObject*>& entries )
+{
+  entries.clear();
+
+  SUIT_DataBrowser* aBrowser = browser();
+  if ( !aBrowser )
+    return;
+
+  for ( SUIT_DataObjectIterator it( aBrowser->root(),
+                                    SUIT_DataObjectIterator::DepthLeft ); it.current(); ++it ) {
+    LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>( it.current() );
+    if ( obj )
+      entries.insert( obj->entry(), obj );
+  }
+
+  setModified();
+}
+
+
+HYDROGUI_DataBrowser::HYDROGUI_DataBrowser( HYDROGUI_Module* theModule,
+                                            SUIT_DataObject* theRoot,
+                                            QWidget* theParent,
+                                            bool theLandCover/* = false*/)
 : SUIT_DataBrowser( theRoot, theParent ), myModule( theModule )
 {
   SUIT_ResourceMgr* resMgr = theModule->getApp()->resourceMgr();
@@ -60,7 +214,11 @@ HYDROGUI_DataBrowser::HYDROGUI_DataBrowser( HYDROGUI_Module* theModule, SUIT_Dat
 
   QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
   QString RefObjCol = tr( "REF_OBJECT_COLUMN" );
-  QString AltitudeCol = tr( "ALTITUDE_COLUMN" );
+  QString AltitudeCol;
+  if ( theLandCover )
+    AltitudeCol = tr( "LAND_COVER_COLUMN" );
+  else
+    AltitudeCol = tr( "ALTITUDE_COLUMN" );
 
   SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( model() );
   //RKV: treeModel->setSearcher( theModule->getApp() );
@@ -117,14 +275,14 @@ HYDROGUI_DataBrowser::HYDROGUI_DataBrowser( HYDROGUI_Module* theModule, SUIT_Dat
   */
 
   // Create OBSelector
-  new LightApp_OBSelector( this, theModule->getApp()->selectionMgr() );
+  new HYDROGUI_OBSelector( this, theModule->getApp()->selectionMgr() );
 
   treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
   treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
   treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
   treeView()->hideColumn( SUIT_DataObject::VisibilityId );
   treeView()->hideColumn( LightApp_DataObject::EntryId );
-  //RKV: connectPopupRequest( theModule->getApp(), SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
+  connectPopupRequest( theModule->getApp(), SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
 }
 
 HYDROGUI_DataBrowser::~HYDROGUI_DataBrowser()
@@ -141,3 +299,71 @@ SUIT_DataObject* HYDROGUI_DataBrowser::findObject( const QString& theEntry ) con
   }
   return NULL;
 }
+
+/*!
+  \brief Switch read only mode for the Object Browser.
+  \param theIsReadOnly if true - read only mode will be turned on
+*/
+void HYDROGUI_DataBrowser::setReadOnly( const bool theIsReadOnly )
+{
+  //TODO: to be reimplemented
+
+  // Enable/disable edit triggers
+  foreach ( QTreeView* aView, findChildren<QTreeView*>() ) {
+    aView->setDragEnabled ( !theIsReadOnly );
+    aView->setEditTriggers ( theIsReadOnly ?
+                             QAbstractItemView::NoEditTriggers :
+                             QAbstractItemView::DoubleClicked );
+  }
+
+  // Enable/disable rename shortcut
+  QList<QShortcut*> aShortcuts = findChildren<QShortcut*>();
+  QShortcut* aShortcut;
+  foreach( aShortcut, aShortcuts ) {
+    if ( aShortcut->key() == QKeySequence( shortcutKey( RenameShortcut ) ) ) {
+      aShortcut->setEnabled( !theIsReadOnly );
+    }
+  }
+}
+
+void HYDROGUI_DataBrowser::createPopupMenu( QMenu* theMenu )
+{
+  theMenu->clear();
+  DataObjectList aSelection = getSelected();
+  bool isOnlyZones = aSelection.size() > 0;
+  foreach( SUIT_DataObject* anObj, aSelection )
+  {
+    HYDROGUI_DataObject* aHydroObj = dynamic_cast<HYDROGUI_DataObject*>( anObj );
+    if( aHydroObj )
+    {
+      Handle(HYDROData_Entity) aModelObj = aHydroObj->modelObject();
+      if( !aModelObj.IsNull() )
+      {
+        isOnlyZones = aModelObj->GetKind()==KIND_ZONE;
+        if( !isOnlyZones )
+          break;
+
+        SUIT_DataObject* aParentObj = aHydroObj->parent();
+        if ( aParentObj )
+        {
+          isOnlyZones = aParentObj->childCount() > 1;
+          if( !isOnlyZones )
+            break;
+        }
+      }
+      else
+      {
+        isOnlyZones = false;
+        break;
+      }
+    }
+    else
+    {
+      isOnlyZones = false;
+      break;
+    }
+  }
+
+  if( isOnlyZones )
+    theMenu->addAction( tr( "ZONE_TO_NEW_REGION" ), this, SIGNAL( newRegion() ) );
+}