]> SALOME platform Git repositories - modules/smesh.git/blobdiff - src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx
Salome HOME
Merge with version on tag OCC-V2_1_0d
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_FilterLibraryDlg.cxx
diff --git a/src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx b/src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx
new file mode 100644 (file)
index 0000000..c5db402
--- /dev/null
@@ -0,0 +1,1159 @@
+//  SMESH SMESHGUI : GUI for SMESH component
+//
+//  Copyright (C) 2003  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. 
+// 
+//  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+//
+//
+//
+//  File   : SMESHGUI_FilterLibraryDlg.cxx
+//  Author : Sergey LITONIN
+//  Module : SMESH
+
+#include "SMESHGUI_FilterLibraryDlg.h"
+#include "SMESHGUI.h"
+#include "SMESHGUI_Utils.h"
+#include "SMESHGUI_FilterUtils.h"
+
+#include <QAD_Desktop.h>
+#include <QAD_FileDlg.h>
+
+#include <qapplication.h>
+#include <qmessagebox.h>
+#include <qframe.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qlistbox.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qdir.h>
+
+#define SPACING 5
+#define MARGIN  10
+
+/*
+  Class       : SMESHGUI_FilterLibraryDlg::Dialog
+  Description : Dialog for opening filter library
+*/
+
+class SMESHGUI_FilterLibraryDlg::Dialog : public QAD_FileDlg
+{
+public:
+  Dialog( QWidget* theParent, const bool theToOpen );
+  virtual ~Dialog();
+  
+protected:
+  virtual bool acceptData();
+};
+
+SMESHGUI_FilterLibraryDlg::Dialog::Dialog( QWidget*                 theParent,
+                                           const bool               theToOpen )
+: QAD_FileDlg( theParent, theToOpen )
+{
+}
+
+SMESHGUI_FilterLibraryDlg::Dialog::~Dialog()
+{
+}
+
+bool SMESHGUI_FilterLibraryDlg::Dialog::acceptData()
+{
+  if ( mode() != QFileDialogP::AnyFile )
+    return QAD_FileDlg::acceptData();
+  else
+    return true;
+}
+
+
+/*
+  Class       : SMESHGUI_FilterLibraryDlg
+  Description : Dialog to specify filters for VTK viewer
+*/
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg
+// Purpose : Constructor
+//=======================================================================
+SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg( QWidget*               theParent,
+                                                      const QValueList<int>& theTypes,
+                                                      const int              theMode,
+                                                      const char*            theName )
+: QDialog( theParent, theName, true,
+           WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu )
+{
+  construct( theTypes, theMode );
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg
+// Purpose : Constructor
+//=======================================================================
+SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg( QWidget*    theParent,
+                                                      const int   theType,
+                                                      const int   theMode,
+                                                      const char* theName )
+: QDialog( theParent, theName, true,
+           WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu )
+{
+  QValueList<int> aTypes;
+  aTypes.append( theType );
+  construct( aTypes, theMode );
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::construct
+// Purpose : Construct dialog ( called by constructor )
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::construct( const QValueList<int>& theTypes, const int theMode )
+{
+  myTypes = theTypes;
+  myMode  = theMode;
+
+  QVBoxLayout* aDlgLay = new QVBoxLayout( this, MARGIN, SPACING );
+
+  myMainFrame        = createMainFrame  ( this );
+  QFrame* aBtnFrame  = createButtonFrame( this );
+
+  aDlgLay->addWidget( myMainFrame );
+  aDlgLay->addWidget( aBtnFrame );
+
+  aDlgLay->setStretchFactor( myMainFrame, 1 );
+
+  Init( myTypes, myMode );
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::createMainFrame
+// Purpose : Create frame containing dialog's input fields
+//=======================================================================
+QFrame* SMESHGUI_FilterLibraryDlg::createMainFrame( QWidget* theParent )
+{
+  QGroupBox* aMainFrame = new QGroupBox( 1, Qt::Horizontal, theParent );
+  aMainFrame->setFrameStyle( QFrame::NoFrame );
+  aMainFrame->setInsideMargin( 0 );
+
+  // library name
+  
+  QGroupBox* aGrp = new QGroupBox( 1, Qt::Vertical, aMainFrame );
+  aGrp->setFrameStyle( QFrame::NoFrame );
+  aGrp->setInsideMargin( 0 );
+  
+  new QLabel( tr( "LIBRARY_FILE" ), aGrp );
+  myFileName = new QLineEdit( aGrp );
+  myOpenBtn = new QPushButton( aGrp );
+  myOpenBtn->setPixmap( QAD_Desktop::getResourceManager()->loadPixmap( 
+    "QAD", tr("ICON_FILE_OPEN") ) );
+  
+  // filters list box
+  
+  aGrp = new QGroupBox( 1, Qt::Vertical, tr( "FILTER_NAMES" ), aMainFrame );
+  QFrame* aFrame = new QFrame( aGrp );
+  myListBox = new QListBox( aFrame );
+  myAddBtn = new QPushButton( tr( "ADD" ), aFrame );
+  myDeleteBtn = new QPushButton( tr( "DELETE" ), aFrame );
+
+  QGridLayout* aLay = new QGridLayout( aFrame, 3, 2, 0, 5 );
+  aLay->addMultiCellWidget( myListBox, 0, 2, 0, 0 );
+  aLay->addWidget( myAddBtn, 0, 1 );
+  aLay->addWidget( myDeleteBtn, 1, 1 );
+  QSpacerItem* aVSpacer = new QSpacerItem( 0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding );
+  aLay->addItem( aVSpacer, 2, 1 );
+
+  // filter name
+  
+  myNameGrp = new QGroupBox( 1, Qt::Vertical, aMainFrame );
+  myNameGrp->setFrameStyle( QFrame::NoFrame );
+  myNameGrp->setInsideMargin( 0 );
+  new QLabel( tr( "FILTER_NAME" ), myNameGrp );
+  myName = new QLineEdit( myNameGrp );
+
+  // table
+  
+  myTable = new SMESHGUI_FilterTable( aMainFrame, myTypes );
+  myTable->SetEditable( myMode == EDIT );
+  myTable->SetLibsEnabled( false );
+
+  myListBox->setMinimumHeight( ( int )( myTable->sizeHint().height() * 0.5 ) );
+  myListBox->setRowMode( QListBox::FitToWidth );
+  myListBox->setSelectionMode( QListBox::Single );
+
+  myOpenBtn->setAutoDefault( false );
+  myAddBtn->setAutoDefault( false );
+  myDeleteBtn->setAutoDefault( false );
+
+  // connect signals and slots
+  
+  connect( myFileName, SIGNAL( returnPressed() ), this, SLOT( onReturnPressed() ) );
+  connect( myOpenBtn , SIGNAL( clicked() ), this, SLOT( onBrowse() ) );
+
+  connect( myListBox, SIGNAL( highlighted( const QString& ) ),
+           this, SLOT( onFilterChanged( const QString& ) ) );
+
+  connect( myAddBtn, SIGNAL( clicked() ), this, SLOT( onAddBtnPressed() ) );
+  connect( myDeleteBtn, SIGNAL( clicked() ), this, SLOT( onDeleteBtnPressed() ) );
+
+  connect( myName, SIGNAL( textChanged( const QString& ) ),
+           this, SLOT( onFilterNameChanged( const QString& ) ) );
+
+  connect( myTable, SIGNAL( EntityTypeChanged( const int ) ),
+           this, SLOT( onEntityTypeChanged( const int ) ) );
+
+  connect( myTable, SIGNAL( NeedValidation() ), this, SLOT( onNeedValidation() ) );
+           
+  return aMainFrame;
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::createButtonFrame
+// Purpose : Create frame containing buttons
+//=======================================================================
+QFrame* SMESHGUI_FilterLibraryDlg::createButtonFrame( QWidget* theParent )
+{
+  QGroupBox* aGrp = new QGroupBox( 1, Qt::Vertical, theParent );
+
+  myButtons[ BTN_OK    ] = new QPushButton( tr( "SMESH_BUT_OK"    ), aGrp );
+  myButtons[ BTN_Apply ] = new QPushButton( tr( "SMESH_BUT_APPLY" ), aGrp );
+
+  QLabel* aLbl = new QLabel( aGrp );
+  aLbl->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  myButtons[ BTN_Cancel ] = new QPushButton( tr( "SMESH_BUT_CANCEL" ), aGrp );
+  myButtons[ BTN_Close  ] = new QPushButton( tr( "SMESH_BUT_CLOSE" ), aGrp );
+
+  connect( myButtons[ BTN_OK     ], SIGNAL( clicked() ), SLOT( onOk() ) );
+  connect( myButtons[ BTN_Cancel ], SIGNAL( clicked() ), SLOT( onClose() ) ) ;
+  connect( myButtons[ BTN_Close  ], SIGNAL( clicked() ), SLOT( onClose() ) ) ;
+  connect( myButtons[ BTN_Apply  ], SIGNAL( clicked() ), SLOT( onApply() ) );
+
+  QMap<int, QPushButton*>::iterator anIter;
+  for ( anIter = myButtons.begin(); anIter != myButtons.end(); ++anIter )
+    anIter.data()->setAutoDefault( false );
+
+  updateMainButtons();
+
+  return aGrp;
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::updateMainButtons
+// Purpose : Update visibility of main buttons ( OK, Cancel, Close ... )
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::updateMainButtons()
+{
+  if ( myTypes.count() == 1 )
+  {
+    myButtons[ BTN_Cancel ]->show();
+    myButtons[ BTN_Apply  ]->hide();
+    myButtons[ BTN_Close  ]->hide();
+  }
+  else
+  {
+    myButtons[ BTN_Cancel ]->hide();
+    myButtons[ BTN_Apply  ]->show();
+    myButtons[ BTN_Close  ]->show();
+  }
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::~SMESHGUI_FilterLibraryDlg
+// Purpose : Destructor
+//=======================================================================
+SMESHGUI_FilterLibraryDlg::~SMESHGUI_FilterLibraryDlg()
+{
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::Init
+// Purpose : Init dialog fields, connect signals and slots, show dialog
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::Init( const int type, const int theMode )
+{
+  QValueList<int> aTypes;
+  aTypes.append( type );
+  Init( aTypes, theMode );
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::Init
+// Purpose : Init dialog fields, connect signals and slots, show dialog
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::Init( const QValueList<int>& theTypes, const int theMode )
+{
+  myMode = theMode;
+  myTypes = theTypes;
+  myTable->Init( theTypes );
+  myCurrFilterName = "";
+  myCurrFilter = -1;
+  myListBox->clear();
+  myName->clear();
+  myTable->Clear();
+  
+  updateControlsVisibility();
+  setEnabled( true );
+
+  SMESHGUI* aModeler = SMESHGUI::GetSMESHGUI();
+
+  connect( aModeler, SIGNAL( SignalDeactivateActiveDialog() ), SLOT( onDeactivate() ) );
+  connect( aModeler, SIGNAL( SignalCloseAllDialogs() ), SLOT( onClose() ) );
+
+  if ( myMode == ADD_TO )
+  {
+    setCaption( tr( "ADD_TO_TLT" ) );
+    if ( myFileName->text().isEmpty() )
+      myFileName->setText( getDefaultLibraryName() );
+    processNewLibrary();
+  }
+  else if ( myMode == COPY_FROM )
+  {
+    setCaption( tr( "COPY_FROM_TLT" ) );
+    if ( myFileName->text().isEmpty() )
+      myFileName->setText( getDefaultLibraryName() );
+    processNewLibrary();
+    if ( myListBox->count() > 0 )
+      myListBox->setCurrentItem( 0 );
+  }
+  else
+  {
+    setCaption( tr( "EDIT_LIB_TLT" ) );
+    if ( myFileName->text().isEmpty() )
+      myFileName->setText( getDefaultLibraryName() );
+    processNewLibrary();
+    if ( myListBox->count() > 0 )
+      myListBox->setCurrentItem( 0 );
+  }
+
+  int x, y ;
+  aModeler->DefineDlgPosition( this, x, y );
+  this->move( x, y );
+
+  this->show();
+
+  updateMainButtons();
+  isPermissionValid( false );
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::updateControlsVisibility
+// Purpose : Update visibility of controls in accordance with myMode
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::updateControlsVisibility()
+{
+  if ( myMode == ADD_TO )
+  {
+    myNameGrp->show();
+    myNameGrp->setEnabled( true );
+    myAddBtn->hide();
+    myDeleteBtn->hide();
+    myTable->SetEditable( false );
+  }
+  else if ( myMode == COPY_FROM )
+  {
+    myNameGrp->hide();
+    myNameGrp->setEnabled( false );
+    myAddBtn->hide();
+    myDeleteBtn->hide();
+    myTable->SetEditable( false );
+  }
+  else if ( myMode == EDIT )
+  {
+    myNameGrp->show();
+    myNameGrp->setEnabled( true );
+    myAddBtn->show();
+    myDeleteBtn->show();
+    myTable->SetEditable( true );
+  }
+
+  qApp->processEvents();
+  updateGeometry();
+  adjustSize();
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::onApply
+// Purpose : SLOT called when "Apply" button pressed.
+//=======================================================================
+bool SMESHGUI_FilterLibraryDlg::onApply()
+{
+  if ( !isValid( true ) || !isPermissionValid( false ) )
+    return false;
+
+  if ( myLibrary->_is_nil() )
+  {
+    QMessageBox::information( SMESHGUI::GetSMESHGUI()->GetDesktop(),
+      tr( "SMESH_WRN_WARNING" ), tr( "LIBRARY_IS_NOT_LOADED" ), QMessageBox::Ok );
+    return false;
+  }
+
+  const char* aName = myFileName->text().latin1();
+  if ( strcmp( myLibrary->GetFileName(), aName ) != 0 )
+    myLibrary->SetFileName( aName );
+
+  bool aResult = false;
+
+  if ( myMode == COPY_FROM || myListBox->count() == 0 )
+  {
+    aResult = true;
+  }
+  else if ( myMode == EDIT || myMode == ADD_TO )
+  {
+    SMESH::Filter_var aFilter = createFilter();
+    if ( !myLibrary->Replace( myCurrFilterName, myName->text(), aFilter.in() ) )
+    {
+      QMessageBox::information( SMESHGUI::GetSMESHGUI()->GetDesktop(),
+        tr( "SMESH_ERROR" ), tr( "ERROR_OF_EDITING" ), QMessageBox::Ok );
+      aResult = false;
+    }
+    else
+      aResult = true;
+  }
+
+  if ( aResult && myMode != COPY_FROM )
+    aResult = myLibrary->Save();
+
+  if ( aResult )
+  {
+    char* aFileName = myLibrary->GetFileName();
+    getDefaultLibraryName() = QString( aFileName );
+    delete aFileName;
+  }
+  else if ( myMode != COPY_FROM )
+    QMessageBox::information( SMESHGUI::GetSMESHGUI()->GetDesktop(),
+      tr( "SMESH_ERROR" ), tr( "ERROR_OF_SAVING" ), QMessageBox::Ok );
+  
+
+  return aResult;
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::onOk
+// Purpose : SLOT called when "Ok" button pressed.
+//           Assign filters VTK viewer and close dialog
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::onOk()
+{
+  if ( onApply() )
+  {
+    disconnect( SMESHGUI::GetSMESHGUI(), 0, this, 0 );
+    SMESHGUI::GetSMESHGUI()->ResetState() ;
+    accept();
+  }
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::onClose
+// Purpose : SLOT called when "Close" button pressed. Close dialog
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::onClose()
+{
+  disconnect( SMESHGUI::GetSMESHGUI(), 0, this, 0 );
+  SMESHGUI::GetSMESHGUI()->ResetState() ;
+  reject() ;
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::onDeactivate
+// Purpose : SLOT called when dialog must be deativated
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::onDeactivate()
+{
+  setEnabled( false );
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::enterEvent
+// Purpose : Event filter
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::enterEvent( QEvent* )
+{
+  setEnabled( true );
+}
+
+//=================================================================================
+// function : closeEvent()
+// purpose  : Close dialog
+//=================================================================================
+void SMESHGUI_FilterLibraryDlg::closeEvent( QCloseEvent* e )
+{
+  onClose() ;
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::getFileName
+// Purpose : Get file name
+//=======================================================================
+QString SMESHGUI_FilterLibraryDlg::getFileName() const
+{
+  return myFileName != 0 ? myFileName->text() : QString("");
+}
+
+//================================================================
+// Function : setFileName
+// Purpose  : Set file name to line edit
+//================================================================
+void SMESHGUI_FilterLibraryDlg::setFileName( const QString& txt, const bool autoExt )
+{
+  if ( myFileName == 0 )
+    return;
+  myFileName->setText( autoExt ? autoExtension( txt ) : txt );
+}
+
+//================================================================
+// Function : autoExtension
+// Purpose  : Append extension to the file name
+//================================================================
+QString SMESHGUI_FilterLibraryDlg::autoExtension( const QString& theFileName ) const
+{
+  QString anExt = theFileName.section( '.', -1 );
+  return anExt != "xml" && anExt != "XML" ? theFileName + ".xml" : theFileName;
+}
+
+//================================================================
+// Function : filterWildCards
+// Purpose  :
+//================================================================
+QStringList SMESHGUI_FilterLibraryDlg::filterWildCards( const QString& theFilter ) const
+{
+  QStringList res;
+
+  int b = theFilter.findRev( "(" );
+  int e = theFilter.findRev( ")" );
+  if ( b != -1 && e != -1 )
+  {
+    QString content = theFilter.mid( b + 1, e - b - 1 ).stripWhiteSpace();
+    QStringList lst = QStringList::split( " ", content );
+    for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
+      if ( (*it).find( "." ) != -1 )
+        res.append( (*it).stripWhiteSpace() );
+  }
+  return res;
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::prepareFilters
+// Purpose : Prepare filters for dialog
+//=======================================================================
+QStringList SMESHGUI_FilterLibraryDlg::prepareFilters() const
+{
+  static QStringList aList;
+  if ( aList.isEmpty() )
+  {
+    aList.append( tr( "XML_FILT" ) );
+    //aList.append( tr( "ALL_FILES_FILTER" ) );
+  }
+
+  return aList;
+}
+
+//================================================================
+// Function : onBrowse
+// Purpose  : SLOT. Display "Open file" dialog for chosing library name
+//================================================================
+void SMESHGUI_FilterLibraryDlg::onBrowse()
+{
+  Dialog* aDlg = new Dialog( this, true );
+  aDlg->setCaption( tr( "OPEN_LIBRARY" ) );
+
+  aDlg->setMode( myMode == COPY_FROM ? QFileDialogP::ExistingFile : QFileDialogP::AnyFile );
+  aDlg->setFilters( prepareFilters() );
+  aDlg->setSelection( getFileName() );
+
+  QPushButton* anOkBtn = ( QPushButton* )aDlg->child( "OK", "QPushButton" );
+  if ( anOkBtn != 0 )
+    anOkBtn->setText( tr( "SMESH_BUT_OK" ) );
+
+  if ( aDlg->exec() != Accepted )
+    return;
+
+  QString fName = aDlg->selectedFile();
+
+  if ( fName.isEmpty() )
+    return;
+
+  if ( QFileInfo( fName ).extension().isEmpty() )
+    fName = autoExtension( fName );
+
+  fName = QDir::convertSeparators( fName );
+  QString prev = QDir::convertSeparators( getFileName() );
+
+  if ( prev == fName )
+    return;
+
+  setFileName( fName );
+
+  QString aName = myListBox->text( myListBox->count() - 1 );
+  processNewLibrary();
+
+  if ( myMode == ADD_TO )
+  {
+    myTable->Copy( (SMESHGUI_FilterTable*)parentWidget() );
+    myCurrFilterName = "";
+    myCurrFilter = -1;
+    addFilterToLib( aName );
+  }
+
+  isPermissionValid( false );
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::processNewLibrary
+// Purpose : SLOT. Calleds when file name changed
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::processNewLibrary()
+{
+  SMESH::FilterManager_var aFilterMgr = SMESH::GetFilterManager();
+  if ( aFilterMgr->_is_nil() )
+    return;
+
+  myLibrary = aFilterMgr->LoadLibrary( autoExtension( getFileName() ) );
+  if ( myLibrary->_is_nil() )
+  {
+    if ( myMode == COPY_FROM )
+    {
+      QMessageBox::information( SMESHGUI::GetSMESHGUI()->GetDesktop(),
+        tr( "SMESH_ERROR" ), tr( "ERROR_LOAD" ), QMessageBox::Ok );
+      return;
+    }
+    else
+    {
+      myLibrary = aFilterMgr->CreateLibrary();
+      myLibrary->SetFileName( getFileName().latin1() );
+    }
+  }
+
+  updateList();
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::updateList
+// Purpose : Fill list box with filter names
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::updateList()
+{
+  QStringList aList;
+  SMESH::string_array_var aNames = myLibrary->GetNames( (SMESH::ElementType)myTable->GetType() );
+  for ( int i = 0, n = aNames->length(); i < n; i++ )
+    aList.append( QString( aNames[ i ] ) );
+  myListBox->clear();
+  myListBox->insertStringList( aList );
+  if ( myListBox->count() == 0 )
+  {
+    myTable->Clear( myTable->GetType() );
+    myName->clear();
+    myName->setEnabled( false );
+    myTable->SetEnabled( false );
+  }
+  else
+  {
+    myName->setEnabled( true );
+    myTable->SetEnabled( true );
+    if ( myListBox->count() )
+    {
+      myCurrFilterName = "";
+      myListBox->setCurrentItem( 0 );
+    }
+  }
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::isNameValid
+// Purpose : Verify validity if entered data
+//=======================================================================
+bool SMESHGUI_FilterLibraryDlg::isNameValid( const bool theMess ) const
+{
+  // verify validity of filter name
+  if ( myName->isEnabled() && !myCurrFilterName.isEmpty() )
+  {
+    QString aCurrName = myName->text();
+    if ( aCurrName.isEmpty() )
+    {
+      if ( theMess )
+        QMessageBox::information( SMESHGUI::GetSMESHGUI()->GetDesktop(),
+          tr( "SMESH_INSUFFICIENT_DATA" ), tr( "EMPTY_FILTER_NAME" ), QMessageBox::Ok );
+      return false;
+    }
+
+    SMESH::string_array_var aNames = myLibrary->GetAllNames();
+    for ( int f = 0, n = aNames->length(); f < n; f++ )
+    {
+      if ( aNames[ f ] == aCurrName && aNames[ f ] != myCurrFilterName )
+      {
+        if ( theMess )
+          QMessageBox::information( SMESHGUI::GetSMESHGUI()->GetDesktop(),
+            tr( "SMESH_INSUFFICIENT_DATA" ), tr( "ERROR_FILTER_NAME" ), QMessageBox::Ok );
+        return false;
+      }
+    }
+  }
+
+  return true;
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::isPermissionValid
+// Purpose : Verify write permission on file
+//=======================================================================
+bool SMESHGUI_FilterLibraryDlg::isPermissionValid( const bool theIsExistingOnly )
+{
+  if ( myMode == COPY_FROM )
+    return true;
+  
+  // Verify write permission
+  bool isWritable = false;
+
+  QString fName( myFileName->text() );
+  if ( QFileInfo( fName ).extension().isEmpty() )
+    fName = autoExtension( fName );
+
+  fName = QDir::convertSeparators( fName );
+
+  if ( QFileInfo( fName ).exists() )
+    isWritable = QFileInfo( fName ).isWritable();
+  else if ( !theIsExistingOnly )
+  {
+    QFileInfo aDirInfo( QFileInfo( fName ).dirPath( true ) );
+    isWritable = aDirInfo.isWritable();
+    /*if ( QDir( QFileInfo( fName ).dirPath( true ) ).exists() ||
+         QDir().mkdir( QFileInfo( fName ).dirPath( true ) ) )
+    {
+      QFile aFile( fName );
+      if ( aFile.open( IO_WriteOnly ) )
+        isWritable = true;
+      else
+        aFile.close();
+    }
+    */
+  }
+  else
+    isWritable = true;
+
+  if ( !isWritable )
+  {
+    QMessageBox::information( SMESHGUI::GetSMESHGUI()->GetDesktop(),
+      tr( "SMESH_WRN_WARNING" ), tr( "NO_PERMISSION" ), QMessageBox::Ok );
+    return false;
+  }
+
+  return true;
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::isValid
+// Purpose : Verify validity if entered data
+//=======================================================================
+bool SMESHGUI_FilterLibraryDlg::isValid( const bool theMess ) const
+{
+  // verify validity of table
+  if ( !myTable->IsValid( theMess ) || !isNameValid( theMess ) )
+    return false;
+  else
+    return true;
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::onFilterChanged
+// Purpose : SLOT. Called when selected filter of library  changed
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::onFilterChanged( const QString& theName )
+{
+  if ( myLibrary->_is_nil() )
+    return;
+
+  // Save parameters of filter if it was changed
+
+  if ( !myCurrFilterName.isEmpty() && myTable->IsEditable() )
+  {
+    if ( !isValid( true ) )
+    {
+      myListBox->blockSignals( true );
+      myListBox->setCurrentItem( myCurrFilter );
+      myListBox->blockSignals( false );
+      return;
+    }
+
+    SMESH::Filter_var aFilter = createFilter();
+    myLibrary->Replace( myCurrFilterName.latin1(), myName->text().latin1(), aFilter );
+  }
+
+  // Fill table with filter parameters
+
+  SMESH::Filter_var aFilter = myLibrary->Copy( theName );
+  myCurrFilterName = theName;
+  myCurrFilter = myListBox->currentItem();
+  myName->setText( theName );
+
+  
+  SMESH::Filter::Criteria_var aCriteria;
+
+  myTable->Clear( myTable->GetType() );
+
+  if ( !aFilter->GetCriteria( aCriteria ) )
+    return;
+
+  for ( int i = 0, n = aCriteria->length(); i < n; i++ )
+    myTable->AddCriterion( aCriteria[ i ], myTable->GetType() );
+
+  myTable->Update();
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::onReturnPressed
+// Purpose : SLOT. Called when enter button is pressed in library name field
+//           Reload library
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::onReturnPressed()
+{
+  QString aName = myListBox->text( myListBox->count() - 1 );
+  
+  processNewLibrary();
+
+  if ( myMode == ADD_TO )
+  {
+    myTable->Copy( (SMESHGUI_FilterTable*)parentWidget() );
+    myCurrFilterName = "";
+    myCurrFilter = -1;
+    addFilterToLib( aName );
+  }
+
+  isPermissionValid( false );
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::enableMainButtons
+// Purpose : Update state of "OK", "Cancel" buttons
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::enableMainButtons()
+{
+  /*bool isEnabled = isValid( false );
+  if ( myButtons.contains( BTN_OK ) )
+    myButtons[ BTN_OK ]->setEnabled( isEnabled );
+  else if ( myButtons.contains( BTN_Apply ) )
+    myButtons[ BTN_OK ]->setEnabled( isEnabled );
+  if ( myButtons.contains( BTN_Cancel ) )
+    myButtons[ BTN_Cancel ]->setEnabled( isEnabled );
+  else if ( myButtons.contains( BTN_Close ) )
+    myButtons[ BTN_Cancel ]->setEnabled( isEnabled );
+    */
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::createFilter
+// Purpose : Cerate filter in accordance with library
+//=======================================================================
+SMESH::Filter_ptr SMESHGUI_FilterLibraryDlg::createFilter( const int theType )
+{
+  int n = myTable->NumRows( theType );
+
+  SMESH::Filter::Criteria_var aCriteria = new SMESH::Filter::Criteria;
+  aCriteria->length( n );
+
+  for ( int i = 0; i < n; i++ )
+  {
+    SMESH::Filter::Criterion aCriterion = SMESHGUI_FilterDlg::createCriterion();
+    myTable->GetCriterion( i, aCriterion );
+    aCriteria[ i ] = aCriterion;
+  }
+
+  SMESH::FilterManager_var aFilterMgr = SMESH::GetFilterManager();
+  SMESH::Filter_var aFilter = aFilterMgr->CreateFilter();
+  aFilter->SetCriteria( aCriteria.inout() );
+
+  return aFilter._retn();
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::onAddBtnPressed
+// Purpose : SLOT. Called when "Add" button pressed
+//           Add new filter to the end of library
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::onAddBtnPressed()
+{
+  // Save parameters of filter if it was changed
+  if ( !myCurrFilterName.isEmpty() && myTable->IsEditable() )
+  {
+    if ( !isValid( true ) )
+      return;
+
+    SMESH::Filter_var aFilter = createFilter();
+    myLibrary->Replace( myCurrFilterName.latin1(), myName->text().latin1(), aFilter );
+  }
+
+  addFilterToLib( getDefaultFilterName() );
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::onAddBtnPressed
+// Purpose : SLOT. Called when "Add" button pressed
+//           Add new filter to the end of library
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::addFilterToLib( const QString& theName )
+{
+  if ( myLibrary->_is_nil() )
+  {
+    QMessageBox::information( SMESHGUI::GetSMESHGUI()->GetDesktop(),
+      tr( "SMESH_WRN_WARNING" ), tr( "LIBRARY_IS_NOT_LOADED" ), QMessageBox::Ok );
+    return;
+  }
+
+  // create filter
+  SMESH::Filter_var aFilter = createFilter();
+
+  // if name of filter already exist in the library assign default name for the filter
+  QString aName( theName );
+  SMESH::string_array_var aNames = myLibrary->GetAllNames();
+  for ( int i = 0, n = aNames->length(); i < n; i++ )
+    if ( aName == QString( aNames[ i ] ) )
+    {
+      aName = getDefaultFilterName();
+      break;
+    }
+
+  // add new filter in library
+  bool aResult = !aFilter->GetPredicate()->_is_nil()
+    ? myLibrary->Add( aName.latin1(), aFilter )
+    : myLibrary->AddEmpty( aName.latin1(), (SMESH::ElementType)myTable->GetType() );
+    
+  if ( !aResult ) 
+  {
+    QMessageBox::information( SMESHGUI::GetSMESHGUI()->GetDesktop(),
+      tr( "SMESH_ERROR" ), tr( "ERROR_OF_ADDING" ), QMessageBox::Ok );
+  }
+
+  updateList();
+  myCurrFilterName = "";
+  myCurrFilter = -1;
+  setSelected( aName );
+
+  if ( theName != aName )
+    QMessageBox::information( SMESHGUI::GetSMESHGUI()->GetDesktop(), tr( "SMESH_WARNING" ),
+      tr( "ASSIGN_NEW_NAME" ).arg( theName ).arg( aName ) , QMessageBox::Ok );
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::getDefaultLibraryName
+// Purpose : Get default library name
+//=======================================================================
+QString& SMESHGUI_FilterLibraryDlg::getDefaultLibraryName() const
+{
+  static QString aName;
+  if ( aName.isEmpty() )
+  {
+    QString aHomeDir = QDir( QDir::home() ).absPath();
+    aName = aHomeDir + "/" + tr ( "LIB_NAME" );
+  }
+  return aName;
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::getDefaultFilterName
+// Purpose : Create default filter name
+//=======================================================================
+QString SMESHGUI_FilterLibraryDlg::getDefaultFilterName() const
+{
+  QString aName;
+
+  if ( myTable->GetType() == SMESH::NODE )
+    aName = tr( "NODE" );
+  else if ( myTable->GetType() == SMESH::EDGE )
+    aName = tr( "EDGE" );
+  else if ( myTable->GetType() == SMESH::FACE )
+    aName = tr( "FACE" );
+  else if ( myTable->GetType() == SMESH::VOLUME )
+    aName = tr( "VOLUME" );
+  else if ( myTable->GetType() == SMESH::ALL )
+    aName = tr( "ELEMENT" );
+  else 
+    aName = tr( "SELECTION" );
+
+  aName += tr( "FILTER" );
+
+
+  QMap< QString, int > anAllNames;
+  SMESH::string_array_var aNames = myLibrary->GetAllNames();
+  for( int i = 0, n = aNames->length(); i < n; i++ )
+    anAllNames[ QString( aNames[ i ] ) ] = -1;
+
+  bool isNotValid = true;
+  int k = 1;
+  QString aNewName;
+  while ( isNotValid )
+  {
+    isNotValid = false;
+    aNewName = aName + "_" + QString( "%1" ).arg( k );
+    if ( anAllNames.contains( aNewName ) )
+    {
+      isNotValid = true;
+      k++;
+    }
+  }
+
+  return aNewName;
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::setSelected
+// Purpose : set selected item in list box containing filters
+//=======================================================================
+bool SMESHGUI_FilterLibraryDlg::setSelected( const QString& theName )
+{
+  int anIndex = getIndex( theName );
+  if ( anIndex != -1 )
+  {
+    myListBox->setCurrentItem( anIndex );
+    myCurrFilterName = theName;
+    myCurrFilter = anIndex;
+  }
+  return anIndex != -1;
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::getIndex
+// Purpose : Get index of the filter in list box
+//=======================================================================
+int SMESHGUI_FilterLibraryDlg::getIndex( const QString& theName ) const
+{
+  for ( int i = 0, n = myListBox->count(); i < n; i++ )
+    if ( myListBox->text( i ) == theName)
+      return i;
+  return -1;
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::onDeleteBtnPressed
+// Purpose : SLOT. Called when "Delete" button pressed
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::onDeleteBtnPressed()
+{
+  if ( myLibrary->_is_nil() )
+  {
+    QMessageBox::information( SMESHGUI::GetSMESHGUI()->GetDesktop(),
+      tr( "SMESH_WRN_WARNING" ), tr( "LIBRARY_IS_NOT_LOADED" ), QMessageBox::Ok );
+    return;
+  }
+
+  int anIndex = getIndex( myCurrFilterName );
+
+  if ( anIndex == -1 || !myLibrary->Delete( myCurrFilterName.latin1() ) )
+  {
+    QMessageBox::information( SMESHGUI::GetSMESHGUI()->GetDesktop(),
+      tr( "SMESH_ERROR" ), tr( "ERROR_OF_DELETING" ), QMessageBox::Ok );
+  }
+  else
+  {
+    myCurrFilterName = "";
+    myCurrFilterName = -1;
+    myListBox->removeItem( anIndex );
+    
+    if ( anIndex >= 1 )
+      myListBox->setSelected( anIndex - 1, true );
+    else if ( anIndex == 0 && myListBox->count() > 0 )
+      myListBox->setSelected( 0, true );
+    else
+      myTable->Clear();
+  }
+
+  myTable->SetEnabled( myListBox->count() > 0 );
+  if ( myListBox->count() == 0 )
+  {
+    myName->setText( "" );
+    myName->setEnabled( false );
+  }
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::onFilterNameChanged
+// Purpose : SLOT. Called when name of filter changed
+//           Change filter name in list box
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::onFilterNameChanged( const QString& theName )
+{
+  int aCurrItem = myListBox->currentItem();
+  if ( aCurrItem == -1 )
+    return;
+
+  myListBox->blockSignals( true );
+  myListBox->changeItem( theName, aCurrItem );
+  myListBox->blockSignals( false );
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::SetTable
+// Purpose : Set table
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::SetTable( const SMESHGUI_FilterTable* theTable )
+{
+  myTable->Copy( theTable );
+  myName->setText( getDefaultFilterName() );
+  addFilterToLib( myName->text() );
+  myTable->Update();
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::GetTable
+// Purpose : Get table
+//=======================================================================
+const SMESHGUI_FilterTable* SMESHGUI_FilterLibraryDlg::GetTable() const
+{
+  return myTable;
+}
+
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::onEntityTypeChanged
+// Purpose : SLOT. Called when entiyt type changed
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::onEntityTypeChanged( const int theType )
+{
+  if ( myLibrary->_is_nil() )
+    return;
+
+  myName->clear();
+  myCurrFilterName = "";
+  myCurrFilter = -1;
+  updateList();
+  if ( myListBox->count() )
+    myListBox->setCurrentItem( 0 );
+}
+
+//=======================================================================
+// name    : SMESHGUI_FilterLibraryDlg::onNeedValidation
+// Purpose : 
+//=======================================================================
+void SMESHGUI_FilterLibraryDlg::onNeedValidation()
+{
+  if ( !myCurrFilterName.isEmpty() )
+  {
+    bool valid = isValid( true );
+    myTable->SetValidity( valid );
+
+    if ( valid )
+    {
+      SMESH::Filter_var aFilter = createFilter( myTable->GetType() );
+      myLibrary->Replace( myCurrFilterName.latin1(), myName->text().latin1(), aFilter );
+    }
+  }
+}
+
+
+
+
+
+
+