]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
functionality for search of object in the object browser by it's name
authorasl <asl@opencascade.com>
Mon, 19 Nov 2007 07:49:35 +0000 (07:49 +0000)
committerasl <asl@opencascade.com>
Mon, 19 Nov 2007 07:49:35 +0000 (07:49 +0000)
src/LightApp/LightApp_Application.cxx
src/LightApp/LightApp_Application.h
src/LightApp/resources/LightApp_msg_en.po
src/ObjBrowser/Makefile.am
src/ObjBrowser/OB_Browser.cxx
src/ObjBrowser/OB_Browser.h
src/ObjBrowser/OB_FindDlg.cxx [new file with mode: 0644]
src/ObjBrowser/OB_FindDlg.h [new file with mode: 0644]
src/ObjBrowser/OB_ObjSearch.cxx [new file with mode: 0644]
src/ObjBrowser/OB_ObjSearch.h [new file with mode: 0644]
src/ObjBrowser/resources/OB_msg_en.po

index ccebcbedea6293af78a4d7b0988d955fc484d7ed..c60c1b53e1649a42b375f22ebfc865fc8cb012ef 100644 (file)
@@ -64,6 +64,7 @@
 #include <LogWindow.h>
 #include <OB_Browser.h>
 #include <OB_ListView.h>
+#include <OB_ObjSearch.h>
 
 #ifndef DISABLE_GLVIEWER
   #include <GLViewer_Viewer.h>
@@ -1668,6 +1669,7 @@ QWidget* LightApp_Application::createWindow( const int flag )
   if ( flag == WT_ObjectBrowser )
   {
     OB_Browser* ob = new OB_Browser( desktop() );
+    ob->setSearch( new OB_ObjSearch( ob ) );
     ob->setAutoUpdate( true );
     //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
     ob->setCaption( tr( "OBJECT_BROWSER" ) );
@@ -2322,6 +2324,7 @@ void LightApp_Application::contextMenuPopup( const QString& type, QPopupMenu* th
 
   thePopup->insertSeparator();
   thePopup->insertItem( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
+  thePopup->insertItem( tr( "MEN_FIND" ), this, SLOT( onFind() ) );
 }
 
 /*!
@@ -2557,3 +2560,8 @@ bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
 
   return false;
 }
+
+void LightApp_Application::onFind()
+{
+  objectBrowser()->enableSearch( true );
+}
index 9bbecfed717cd8424bdb5498df32902cad27e908..bdabb3ef836332f5d3e11e59b5727fdf3f4c2670 100644 (file)
@@ -217,6 +217,7 @@ protected slots:
 private slots:
   void                                onSelection();
   void                                onRefresh();
+  void                                onFind();
   void                                onPreferences();
   void                                onMRUActivated( QString );
   void                                onPreferenceChanged( QString&, QString&, QString& );
index 1cd5b1e21d7675d0b0b98476e4a765943e446108..6075d309c20dfc6ca5aa1305aefaec624e6a04d2 100644 (file)
@@ -254,6 +254,9 @@ msgstr "Quick directory list"
 msgid "LightApp_Application::MEN_REFRESH"
 msgstr "Refresh"
 
+msgid "LightApp_Application::MEN_FIND"
+msgstr "Find"
+
 msgid "LightApp_Application::PREF_GROUP_SUPERV"
 msgstr "Graph Supervisor"
 
index ff1db50cb6118937120bcaca24bb45cf1751395e..ba4e735b3c8b22ed22da5b2136402152d587ab87 100755 (executable)
@@ -30,17 +30,22 @@ salomeinclude_HEADERS=\
        OB_Browser.h \
        OB_ListItem.h \
        OB_ListView.h \
-       OB_Filter.h
+       OB_Filter.h \
+       OB_FindDlg.h \
+       OB_ObjSearch.h
 
 dist_libObjBrowser_la_SOURCES= \
        OB_Browser.cxx \
        OB_ListItem.cxx \
        OB_ListView.cxx \
-       OB_Filter.cxx
+       OB_Filter.cxx \
+       OB_FindDlg.cxx \
+       OB_ObjSearch.cxx
 
 MOC_FILES= \
        OB_Browser_moc.cxx \
-       OB_ListView_moc.cxx
+       OB_ListView_moc.cxx \
+       OB_FindDlg_moc.cxx
 nodist_libObjBrowser_la_SOURCES= $(MOC_FILES)
 
 nodist_salomeres_DATA = OB_msg_en.qm
index 647cac4cf3191c648f3affdc4b33008da2364049..41232b9a29e95585995e49a6b2f7886b1f6d2530 100755 (executable)
@@ -21,6 +21,7 @@
 #include "OB_Filter.h"
 #include "OB_ListItem.h"
 #include "OB_ListView.h"
+#include "OB_FindDlg.h"
 
 #include <SUIT_DataObjectIterator.h>
 #include <SUIT_TreeSync.h>
@@ -306,8 +307,12 @@ myRootDecorated( true )
   myView->installEventFilter( this );
   myView->viewport()->installEventFilter( this );
 
+  myFindDlg = new OB_FindDlg( this );
+  myFindDlg->hide();
+
   QVBoxLayout* main = new QVBoxLayout( this );
-  main->addWidget( myView );
+  main->addWidget( myView, 1 );
+  main->addWidget( myFindDlg, 0 );
 
   myShowToolTips = true;
   myTooltip = new ToolTip( this, myView->viewport() );
@@ -1651,3 +1656,17 @@ void OB_Browser::setModified()
   myModifiedTime = clock();
 }
 
+OB_ObjSearch* OB_Browser::getSearch() const
+{
+  return myFindDlg->getSearch();
+}
+
+void OB_Browser::setSearch( OB_ObjSearch* s )
+{
+  myFindDlg->setSearch( s );
+}
+
+void OB_Browser::enableSearch( const bool on )
+{
+  myFindDlg->setShown( on );
+}
index 2edf0239cede8fbd4cf50ff14ca4dd5238bfb78c..e7524fb688ecfea314009c2bc5e2543ab66085a9 100755 (executable)
@@ -38,6 +38,8 @@ class QToolTip;
 class OB_Filter;
 class OB_ListView;
 class OB_ListItem;
+class OB_ObjSearch;
+class OB_FindDlg;
 
 class OB_Updater 
 {
@@ -139,6 +141,10 @@ public:
   OB_Updater*       getUpdater() const;
   virtual void      setUpdater( OB_Updater* theUpdate = 0 );
 
+  OB_ObjSearch*     getSearch() const;
+  void              setSearch( OB_ObjSearch* );
+  void              enableSearch( const bool );
+
 signals:
   void              selectionChanged();
   void              doubleClicked( SUIT_DataObject* );
@@ -207,6 +213,7 @@ private:
   bool              myShowToolTips;
   bool              myRootDecorated;
   int               myAutoOpenLevel;
+  OB_FindDlg       *myFindDlg;
 
   friend class OB_Browser::ToolTip;
 
diff --git a/src/ObjBrowser/OB_FindDlg.cxx b/src/ObjBrowser/OB_FindDlg.cxx
new file mode 100644 (file)
index 0000000..07ed30d
--- /dev/null
@@ -0,0 +1,92 @@
+
+#include <OB_FindDlg.h>
+#include <OB_ObjSearch.h>
+#include <OB_Browser.h>
+#include <OB_ListItem.h>
+
+#include <SUIT_DataObject.h>
+#include <SUIT_MessageBox.h>
+
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qcheckbox.h>
+
+OB_FindDlg::OB_FindDlg( QWidget* parent )
+: QGroupBox( 1, Qt::Horizontal, tr( "FIND" ), parent ),
+  mySearch( 0 )
+{
+  QFrame *btns = new QFrame( this ), *checks = new QFrame( this );
+  
+  myData = new QLineEdit( btns );
+  myToFirst = new QPushButton( "|<<", btns );
+  myToLast = new QPushButton( ">>|", btns );
+  myNext = new QPushButton( ">>", btns );
+  myPrev = new QPushButton( "<<", btns );
+  myClose = new QPushButton( tr( "CLOSE" ), checks );
+  myIsCaseSens = new QCheckBox( tr( "CASE_SENSITIVE" ), checks );
+  myIsRegExp = new QCheckBox( tr( "IS_REG_EXP" ), checks );
+  int w = 30, h = myToFirst->height();
+  myToFirst->setMaximumSize( w, h );
+  myToLast->setMaximumSize( w, h );
+  myNext->setMaximumSize( w, h );
+  myPrev->setMaximumSize( w, h );
+
+  QHBoxLayout* l = new QHBoxLayout( btns, 5, 5 );
+  l->addWidget( myToFirst, 0 );
+  l->addWidget( myPrev, 0 );
+  l->addWidget( myData, 1 );
+  l->addWidget( myNext, 0 );
+  l->addWidget( myToLast, 0 );
+
+  QHBoxLayout* c = new QHBoxLayout( checks, 5, 5 );
+  c->addWidget( myIsCaseSens, 0 );
+  c->addWidget( myIsRegExp, 0 );
+  c->addWidget( myClose, 0 );
+
+  connect( myToFirst, SIGNAL( clicked() ), this, SLOT( onFind() ) );
+  connect( myToLast, SIGNAL( clicked() ), this, SLOT( onFind() ) );
+  connect( myNext, SIGNAL( clicked() ), this, SLOT( onFind() ) );
+  connect( myPrev, SIGNAL( clicked() ), this, SLOT( onFind() ) );
+  connect( myClose, SIGNAL( clicked() ), this, SLOT( onClose() ) );
+}
+
+OB_FindDlg::~OB_FindDlg()
+{
+}
+
+void OB_FindDlg::onClose()
+{
+  hide();
+}
+
+void OB_FindDlg::onFind()
+{
+  OB_ListItem* it = 0;
+  mySearch->setPattern( myData->text(), myIsRegExp->isChecked(), myIsCaseSens->isChecked() );
+  if( sender()==myToFirst )
+    it = mySearch->findFirst();
+  else if( sender()==myNext )
+    it = mySearch->findNext();
+  else if( sender()==myPrev )
+    it = mySearch->findPrev();
+  else if( sender()==myToLast )
+    it = mySearch->findLast();
+  if( it )
+  {
+    mySearch->browser()->setSelected( it->dataObject(), false );
+    mySearch->browser()->listView()->ensureItemVisible( it );
+  }
+  else
+    SUIT_MessageBox::info1( this, tr( "FIND" ), tr( "NOT_FOUND" ), tr( "OK" ) );
+}
+
+OB_ObjSearch* OB_FindDlg::getSearch() const
+{
+  return mySearch;
+}
+
+void OB_FindDlg::setSearch( OB_ObjSearch* s )
+{
+  mySearch = s;
+}
diff --git a/src/ObjBrowser/OB_FindDlg.h b/src/ObjBrowser/OB_FindDlg.h
new file mode 100644 (file)
index 0000000..4c8230d
--- /dev/null
@@ -0,0 +1,34 @@
+
+#ifndef OBJECT_BROWSER_FIND_DIALOG_HEADER
+#define OBJECT_BROWSER_FIND_DIALOG_HEADER
+
+#include <qgroupbox.h>
+
+class OB_ObjSearch;
+class QLineEdit;
+class QPushButton;
+class QCheckBox;
+
+class OB_FindDlg : public QGroupBox
+{
+  Q_OBJECT
+
+public:
+  OB_FindDlg( QWidget* = 0 );
+  virtual ~OB_FindDlg();
+
+  OB_ObjSearch* getSearch() const;
+  void setSearch( OB_ObjSearch* );
+
+private slots:
+  void onFind();
+  void onClose();
+
+private:
+  QLineEdit* myData;
+  QPushButton *myToFirst, *myToLast, *myNext, *myPrev, *myClose;
+  QCheckBox *myIsCaseSens, *myIsRegExp;
+  OB_ObjSearch* mySearch;
+};
+
+#endif
diff --git a/src/ObjBrowser/OB_ObjSearch.cxx b/src/ObjBrowser/OB_ObjSearch.cxx
new file mode 100644 (file)
index 0000000..84d9c2c
--- /dev/null
@@ -0,0 +1,107 @@
+
+#include <OB_ObjSearch.h>
+#include <OB_ListItem.h>
+#include <OB_Browser.h>
+
+#include <qregexp.h>
+
+OB_ObjSearch::OB_ObjSearch( OB_Browser* b )
+: myBrowser( b )
+{
+}
+
+OB_ObjSearch::~OB_ObjSearch()
+{
+}
+
+OB_ListItem* OB_ObjSearch::tail( const bool first ) const
+{
+  QListView* lv = myBrowser->listView();
+  return dynamic_cast<OB_ListItem*>( first ? lv->firstChild() : lv->lastItem() );
+}
+
+OB_ListItem* OB_ObjSearch::next( OB_ListItem* i, const bool forward ) const
+{
+  QListViewItemIterator it( i );
+  if( forward )
+    it++;
+  else
+    it--;
+  return dynamic_cast<OB_ListItem*>( *it );
+}
+
+SUIT_DataObject* OB_ObjSearch::data( OB_ListItem* i ) const
+{
+  return i ? i->dataObject() : 0;
+}
+
+void OB_ObjSearch::setPattern( const QString& data, const bool is_reg_exp, const bool is_case_sens )
+{
+  myData = data;
+  myIsRegExp = is_reg_exp;
+  myIsCaseSens = is_case_sens;
+}
+
+bool OB_ObjSearch::matches( SUIT_DataObject* obj ) const
+{
+  if( !obj )
+    return false;
+
+  QString txt = obj->name();
+  if( myIsRegExp )
+  {
+    QRegExp re( myData );
+    re.setCaseSensitive( myIsCaseSens );
+    return txt.contains( re );
+  }
+  else
+    return txt.contains( myData, myIsCaseSens );
+}
+
+OB_Browser* OB_ObjSearch::browser() const
+{
+  return myBrowser;
+}
+
+OB_ListItem* OB_ObjSearch::findFirst() const
+{
+  return find( tail( true ), true, false, false );
+}
+
+OB_ListItem* OB_ObjSearch::findLast() const
+{
+  return find( tail( false ), false, false, false );
+}
+
+OB_ListItem* OB_ObjSearch::findNext() const
+{
+  return find( current(), true, true, true );
+}
+
+OB_ListItem* OB_ObjSearch::findPrev() const
+{
+  return find( current(), false, true, true );
+}
+
+OB_ListItem* OB_ObjSearch::find( OB_ListItem* i, const bool forward,
+                                 const bool ignore_first, const bool cyclic ) const
+{
+  if( !i )
+    i = tail( forward );
+
+  if( ignore_first )
+    i = next( i, forward );
+
+  while( i && !matches( data( i ) ) )
+    i = next( i, forward );
+
+  if( !i && cyclic )
+    return find( tail( forward ), forward, false, false );
+
+  return i;
+}
+
+OB_ListItem* OB_ObjSearch::current() const
+{
+  return dynamic_cast<OB_ListItem*>( myBrowser->listView()->currentItem() );
+}
diff --git a/src/ObjBrowser/OB_ObjSearch.h b/src/ObjBrowser/OB_ObjSearch.h
new file mode 100644 (file)
index 0000000..6106d9f
--- /dev/null
@@ -0,0 +1,39 @@
+
+#ifndef OBJECT_BROWSER_OBJECT_SEARCH_HEADER
+#define OBJECT_BROWSER_OBJECT_SEARCH_HEADER
+
+#include <qstring.h>
+
+class OB_ListItem;
+class OB_Browser;
+class SUIT_DataObject;
+
+class OB_ObjSearch
+{
+public:
+  OB_ObjSearch( OB_Browser* );
+  virtual ~OB_ObjSearch();
+
+  void setPattern( const QString&, const bool, const bool );
+  OB_Browser* browser() const;
+
+  OB_ListItem* findFirst() const;
+  OB_ListItem* findLast() const;
+  OB_ListItem* findNext() const;
+  OB_ListItem* findPrev() const;
+
+protected:
+  virtual OB_ListItem* current() const;
+  virtual OB_ListItem* tail( const bool ) const;
+  virtual OB_ListItem* next( OB_ListItem*, const bool ) const;
+  virtual SUIT_DataObject* data( OB_ListItem* ) const;
+  virtual bool matches( SUIT_DataObject* ) const;
+  OB_ListItem* find( OB_ListItem*, const bool, const bool, const bool ) const;
+
+private:
+  OB_Browser* myBrowser;
+  QString myData;
+  bool myIsRegExp, myIsCaseSens;
+};
+
+#endif
index 4b18212e97b2d274395c82592971121805a62bcd..2209af5a6bdd01989a7a35fd8482d3a48d6e4481 100755 (executable)
@@ -30,3 +30,17 @@ msgstr ""
 msgid "MEN_EXPAND_ALL"
 msgstr "Expand All"
 
+msgid "OB_FindDlg::FIND"
+msgstr "Find"
+
+msgid "OB_FindDlg::CLOSE"
+msgstr "Close"
+
+msgid "OB_FindDlg::CASE_SENSITIVE"
+msgstr "Case sensitive"
+
+msgid "OB_FindDlg::IS_REG_EXP"
+msgstr "Regular expression"
+
+msgid "OB_FindDlg::NOT_FOUND"
+msgstr "There is no object is found"