1 // Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // SMESH SMESHGUI : GUI for SMESH component
24 // File : SMESHGUI_FilterLibraryDlg.cxx
25 // Author : Sergey LITONIN, Open CASCADE S.A.S.
28 #include "SMESHGUI_FilterLibraryDlg.h"
31 #include "SMESHGUI_FilterUtils.h"
32 #include "SMESHGUI_FilterDlg.h"
34 // SALOME GUI includes
35 #include <SUIT_Session.h>
36 #include <SUIT_Desktop.h>
37 #include <SUIT_FileDlg.h>
38 #include <SUIT_MessageBox.h>
39 #include <SUIT_ResourceMgr.h>
41 #include <LightApp_Application.h>
44 #include <QApplication>
45 #include <QVBoxLayout>
46 #include <QHBoxLayout>
47 #include <QGridLayout>
49 #include <QPushButton>
52 #include <QListWidget>
61 * Class : SMESHGUI_FilterLibraryDlg::Dialog
62 * Description : Dialog for opening filter library
65 class SMESHGUI_FilterLibraryDlg::Dialog : public SUIT_FileDlg
68 Dialog(QWidget* theParent, const bool theToOpen);
72 virtual bool acceptData();
75 SMESHGUI_FilterLibraryDlg::Dialog::Dialog (QWidget* theParent,
77 : SUIT_FileDlg(theParent, theToOpen)
81 SMESHGUI_FilterLibraryDlg::Dialog::~Dialog()
85 bool SMESHGUI_FilterLibraryDlg::Dialog::acceptData()
87 // if (mode() != QFileDialogP::AnyFile)
88 // return SUIT_FileDlg::acceptData();
94 * Class : SMESHGUI_FilterLibraryDlg
95 * Description : Dialog to specify filters for VTK viewer
98 //=======================================================================
99 // name : SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg
100 // Purpose : Constructor
101 //=======================================================================
102 SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg (SMESHGUI* theModule,
104 const QList<int>& theTypes,
107 mySMESHGUI( theModule )
110 construct(theTypes, theMode);
113 //=======================================================================
114 // name : SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg
115 // Purpose : Constructor
116 //=======================================================================
117 SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg (SMESHGUI* theModule,
122 mySMESHGUI( theModule )
126 aTypes.append(theType);
127 construct(aTypes, theMode);
130 //=======================================================================
131 // name : SMESHGUI_FilterLibraryDlg::construct
132 // Purpose : Construct dialog (called by constructor)
133 //=======================================================================
134 void SMESHGUI_FilterLibraryDlg::construct (const QList<int>& theTypes,
140 QVBoxLayout* aDlgLay = new QVBoxLayout(this);
141 aDlgLay->setMargin(MARGIN);
142 aDlgLay->setSpacing(SPACING);
144 myMainFrame = createMainFrame (this);
145 QWidget* aBtnFrame = createButtonFrame(this);
147 aDlgLay->addWidget(myMainFrame);
148 aDlgLay->addWidget(aBtnFrame);
150 aDlgLay->setStretchFactor(myMainFrame, 1);
152 myHelpFileName = "selection_filter_library_page.html";
154 Init(myTypes, myMode);
157 //=======================================================================
158 // name : SMESHGUI_FilterLibraryDlg::createMainFrame
159 // Purpose : Create frame containing dialog's input fields
160 //=======================================================================
161 QWidget* SMESHGUI_FilterLibraryDlg::createMainFrame (QWidget* theParent)
163 QWidget* aMainFrame = new QWidget(theParent);
164 QGridLayout* aMainLay = new QGridLayout(aMainFrame);
165 aMainLay->setMargin(0);
166 aMainLay->setSpacing(SPACING);
170 QLabel* aFileLab = new QLabel(tr("LIBRARY_FILE"), aMainFrame);
171 myFileName = new QLineEdit(aMainFrame);
172 myOpenBtn = new QPushButton(aMainFrame);
173 myOpenBtn->setIcon(SUIT_Session::session()->resourceMgr()->loadPixmap(
174 "SUIT", tr("ICON_FILE_OPEN")));
178 QGroupBox* aFiltersGrp = new QGroupBox(tr("FILTER_NAMES"), aMainFrame);
179 QGridLayout* aLay = new QGridLayout(aFiltersGrp);
180 aLay->setMargin(MARGIN);
181 aLay->setSpacing(SPACING);
183 myListBox = new QListWidget(aFiltersGrp);
185 myAddBtn = new QPushButton(tr("ADD"), aFiltersGrp);
186 myDeleteBtn = new QPushButton(tr("DELETE"), aFiltersGrp);
188 aLay->addWidget(myListBox, 0, 0, 3, 1);
189 aLay->addWidget(myAddBtn, 0, 1);
190 aLay->addWidget(myDeleteBtn, 1, 1);
191 aLay->setRowStretch(2, 5);
195 myNameGrp = new QWidget(aMainFrame);
196 QHBoxLayout* myNameGrpLayout = new QHBoxLayout(myNameGrp);
197 myNameGrpLayout->setMargin(0);
198 myNameGrpLayout->setSpacing(SPACING);
200 myNameGrpLayout->addWidget( new QLabel(tr("FILTER_NAME"), myNameGrp) );
201 myNameGrpLayout->addWidget( myName = new QLineEdit(myNameGrp) );
205 myTable = new SMESHGUI_FilterTable( mySMESHGUI, aMainFrame, myTypes);
206 myTable->SetEditable(myMode == EDIT);
207 myTable->SetLibsEnabled(false);
209 myListBox->setMinimumHeight((int)(myTable->sizeHint().height() * 0.5));
210 //myListBox->setRowMode(QListWidget::FitToWidth); //VSR : TODO ???
211 myListBox->setSelectionMode(QListWidget::SingleSelection);
213 myOpenBtn->setAutoDefault(false);
214 myAddBtn->setAutoDefault(false);
215 myDeleteBtn->setAutoDefault(false);
217 aMainLay->addWidget(aFileLab, 0, 0);
218 aMainLay->addWidget(myFileName, 0, 1);
219 aMainLay->addWidget(myOpenBtn, 0, 2);
220 aMainLay->addWidget(aFiltersGrp, 1, 0, 1, 3);
221 aMainLay->addWidget(myNameGrp, 2, 0, 1, 3);
222 aMainLay->addWidget(myTable, 3, 0, 1, 3);
224 // connect signals and slots
226 connect(myFileName, SIGNAL(returnPressed()), this, SLOT(onReturnPressed()));
227 connect(myOpenBtn, SIGNAL(clicked()), this, SLOT(onBrowse()));
229 connect(myListBox, SIGNAL(itemSelectionChanged()),
230 this, SLOT(onFilterChanged()));
232 connect(myAddBtn, SIGNAL(clicked()), this, SLOT(onAddBtnPressed()));
233 connect(myDeleteBtn, SIGNAL(clicked()), this, SLOT(onDeleteBtnPressed()));
235 connect(myName, SIGNAL(textChanged(const QString&)),
236 this, SLOT(onFilterNameChanged(const QString&)));
238 connect(myTable, SIGNAL(EntityTypeChanged(const int)),
239 this, SLOT(onEntityTypeChanged(const int)));
241 connect(myTable, SIGNAL(NeedValidation()), this, SLOT(onNeedValidation()));
246 //=======================================================================
247 // name : SMESHGUI_FilterLibraryDlg::createButtonFrame
248 // Purpose : Create frame containing buttons
249 //=======================================================================
250 QWidget* SMESHGUI_FilterLibraryDlg::createButtonFrame (QWidget* theParent)
252 QGroupBox* aGrp = new QGroupBox(theParent);
253 QHBoxLayout* aLay = new QHBoxLayout(aGrp);
254 aLay->setMargin(MARGIN);
255 aLay->setSpacing(SPACING);
257 myButtons[ BTN_OK ] = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), aGrp);
258 myButtons[ BTN_Apply ] = new QPushButton(tr("SMESH_BUT_APPLY"), aGrp);
260 myButtons[ BTN_Close ] = new QPushButton(tr("SMESH_BUT_CLOSE"), aGrp);
261 myButtons[ BTN_Help ] = new QPushButton(tr("SMESH_BUT_HELP"), aGrp);
263 aLay->addWidget(myButtons[ BTN_OK ]);
264 aLay->addSpacing(10);
265 aLay->addWidget(myButtons[ BTN_Apply ]);
266 aLay->addSpacing(10);
268 aLay->addWidget(myButtons[ BTN_Close ]);
269 aLay->addWidget(myButtons[ BTN_Help ]);
271 connect(myButtons[ BTN_OK ], SIGNAL(clicked()), SLOT(onOk()));
272 connect(myButtons[ BTN_Close ], SIGNAL(clicked()), SLOT(onClose()));
273 connect(myButtons[ BTN_Apply ], SIGNAL(clicked()), SLOT(onApply()));
274 connect(myButtons[ BTN_Help ], SIGNAL(clicked()), SLOT(onHelp()));
276 QMap<int, QPushButton*>::iterator anIter;
277 for (anIter = myButtons.begin(); anIter != myButtons.end(); ++anIter)
278 anIter.value()->setAutoDefault(false);
285 //=======================================================================
286 // name : SMESHGUI_FilterLibraryDlg::updateMainButtons
287 // Purpose : Update visibility of main buttons (OK, Cancel, Close ...)
288 //=======================================================================
289 void SMESHGUI_FilterLibraryDlg::updateMainButtons()
291 myButtons[ BTN_Close ]->show();
292 if (myTypes.count() == 1) {
293 myButtons[ BTN_Apply ]->hide();
295 myButtons[ BTN_Apply ]->show();
299 //=======================================================================
300 // name : SMESHGUI_FilterLibraryDlg::~SMESHGUI_FilterLibraryDlg
301 // Purpose : Destructor
302 //=======================================================================
303 SMESHGUI_FilterLibraryDlg::~SMESHGUI_FilterLibraryDlg()
307 //=======================================================================
308 // name : SMESHGUI_FilterLibraryDlg::Init
309 // Purpose : Init dialog fields, connect signals and slots, show dialog
310 //=======================================================================
311 void SMESHGUI_FilterLibraryDlg::Init (const int type, const int theMode)
315 Init(aTypes, theMode);
318 //=======================================================================
319 // name : SMESHGUI_FilterLibraryDlg::Init
320 // Purpose : Init dialog fields, connect signals and slots, show dialog
321 //=======================================================================
322 void SMESHGUI_FilterLibraryDlg::Init (const QList<int>& theTypes,
327 myTable->Init(theTypes);
328 myCurrFilterName = "";
330 myListBox->blockSignals(true);
332 myListBox->blockSignals(false);
336 updateControlsVisibility();
339 connect( mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), SLOT(onDeactivate()));
340 connect( mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(onClose()));
342 if (myMode == ADD_TO)
344 setWindowTitle(tr("ADD_TO_TLT"));
345 if (myFileName->text().isEmpty())
346 myFileName->setText(getDefaultLibraryName());
349 else if (myMode == COPY_FROM)
351 setWindowTitle(tr("COPY_FROM_TLT"));
352 if (myFileName->text().isEmpty())
353 myFileName->setText(getDefaultLibraryName());
355 if (myListBox->count() > 0)
356 myListBox->setCurrentItem(0);
360 setWindowTitle(tr("EDIT_LIB_TLT"));
361 if (myFileName->text().isEmpty())
362 myFileName->setText(getDefaultLibraryName());
364 if (myListBox->count() > 0)
365 myListBox->setCurrentItem(0);
371 isPermissionValid(false);
374 //=======================================================================
375 // name : SMESHGUI_FilterLibraryDlg::updateControlsVisibility
376 // Purpose : Update visibility of controls in accordance with myMode
377 //=======================================================================
378 void SMESHGUI_FilterLibraryDlg::updateControlsVisibility()
380 if (myMode == ADD_TO)
383 myNameGrp->setEnabled(true);
386 myTable->SetEditable(false);
388 else if (myMode == COPY_FROM)
391 myNameGrp->setEnabled(false);
394 myTable->SetEditable(false);
396 else if (myMode == EDIT)
399 myNameGrp->setEnabled(true);
402 myTable->SetEditable(true);
405 qApp->processEvents();
410 //=======================================================================
411 // name : SMESHGUI_FilterLibraryDlg::onApply
412 // Purpose : SLOT called when "Apply" button pressed.
413 //=======================================================================
414 bool SMESHGUI_FilterLibraryDlg::onApply()
416 if (!isValid(true) || !isPermissionValid(false))
419 if (myLibrary->_is_nil()) {
420 SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"),
421 tr("LIBRARY_IS_NOT_LOADED"));
425 if (myFileName->text() != myLibrary->GetFileName())
426 myLibrary->SetFileName( myFileName->text().toLatin1().constData() );
428 bool aResult = false;
430 if (myMode == COPY_FROM || myListBox->count() == 0) {
432 } else if (myMode == EDIT || myMode == ADD_TO) {
433 SMESH::Filter_var aFilter = createFilter();
434 if (!myListBox->selectedItems().empty() &&
435 !myLibrary->Replace(myCurrFilterName.toLatin1().constData(),
436 myName->text().toLatin1().constData(),
438 SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"),
439 tr("ERROR_OF_EDITING"));
446 if (aResult && myMode != COPY_FROM)
447 aResult = myLibrary->Save();
450 char* aFileName = myLibrary->GetFileName();
451 getDefaultLibraryName() = QString(aFileName);
453 } else if (myMode != COPY_FROM) {
454 SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"),
455 tr("ERROR_OF_SAVING"));
462 //=======================================================================
463 // name : SMESHGUI_FilterLibraryDlg::onOk
464 // Purpose : SLOT called when "Ok" button pressed.
465 // Assign filters VTK viewer and close dialog
466 //=======================================================================
467 void SMESHGUI_FilterLibraryDlg::onOk()
471 disconnect( mySMESHGUI, 0, this, 0);
472 mySMESHGUI->ResetState();
477 //=======================================================================
478 // name : SMESHGUI_FilterLibraryDlg::onClose
479 // Purpose : SLOT called when "Close" button pressed. Close dialog
480 //=======================================================================
481 void SMESHGUI_FilterLibraryDlg::onClose()
483 disconnect( mySMESHGUI, 0, this, 0);
484 mySMESHGUI->ResetState();
488 //=================================================================================
489 // function : onHelp()
491 //=================================================================================
492 void SMESHGUI_FilterLibraryDlg::onHelp()
494 LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
496 app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
500 platform = "winapplication";
502 platform = "application";
504 SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
505 tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
506 arg(app->resourceMgr()->stringValue("ExternalBrowser",
508 arg(myHelpFileName));
512 //=======================================================================
513 // name : SMESHGUI_FilterLibraryDlg::onDeactivate
514 // Purpose : SLOT called when dialog must be deativated
515 //=======================================================================
516 void SMESHGUI_FilterLibraryDlg::onDeactivate()
521 //=======================================================================
522 // name : SMESHGUI_FilterLibraryDlg::enterEvent
523 // Purpose : Event filter
524 //=======================================================================
525 void SMESHGUI_FilterLibraryDlg::enterEvent(QEvent*)
530 //=================================================================================
531 // function : closeEvent()
532 // purpose : Close dialog
533 //=================================================================================
534 void SMESHGUI_FilterLibraryDlg::closeEvent(QCloseEvent* e)
539 //=======================================================================
540 // name : SMESHGUI_FilterLibraryDlg::getFileName
541 // Purpose : Get file name
542 //=======================================================================
543 QString SMESHGUI_FilterLibraryDlg::getFileName() const
545 return myFileName != 0 ? myFileName->text() : QString("");
548 //================================================================
549 // Function : setFileName
550 // Purpose : Set file name to line edit
551 //================================================================
552 void SMESHGUI_FilterLibraryDlg::setFileName(const QString& txt, const bool autoExt)
556 myFileName->setText(autoExt ? autoExtension(txt) : txt);
559 //================================================================
560 // Function : autoExtension
561 // Purpose : Append extension to the file name
562 //================================================================
563 QString SMESHGUI_FilterLibraryDlg::autoExtension(const QString& theFileName) const
565 QString anExt = theFileName.section('.', -1);
566 return anExt != "xml" && anExt != "XML" ? theFileName + ".xml" : theFileName;
569 //================================================================
570 // Function : filterWildCards
572 //================================================================
573 QStringList SMESHGUI_FilterLibraryDlg::filterWildCards(const QString& theFilter) const
577 int b = theFilter.lastIndexOf("(");
578 int e = theFilter.lastIndexOf(")");
579 if (b != -1 && e != -1)
581 QString content = theFilter.mid(b + 1, e - b - 1).trimmed();
582 QStringList lst = content.split(" ", QString::SkipEmptyParts);
583 for (QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it)
584 if ((*it).indexOf(".") != -1)
585 res.append((*it).trimmed());
590 //=======================================================================
591 // name : SMESHGUI_FilterLibraryDlg::prepareFilters
592 // Purpose : Prepare filters for dialog
593 //=======================================================================
594 QStringList SMESHGUI_FilterLibraryDlg::prepareFilters() const
596 static QStringList aList;
599 aList.append(tr("XML_FILT"));
600 //aList.append(tr("ALL_FILES_FILTER"));
606 //================================================================
607 // Function : onBrowse
608 // Purpose : SLOT. Display "Open file" dialog for chosing library name
609 //================================================================
610 void SMESHGUI_FilterLibraryDlg::onBrowse()
612 Dialog* aDlg = new Dialog(this, true);
613 aDlg->setWindowTitle(tr("OPEN_LIBRARY"));
615 //aDlg->setMode(myMode == COPY_FROM ? QFileDialogP::ExistingFile : QFileDialogP::AnyFile);
616 aDlg->setFileMode(myMode == COPY_FROM ? QFileDialog::ExistingFile : QFileDialog::AnyFile);
617 aDlg->setFilters(prepareFilters());
618 aDlg->selectFile(getFileName());
620 QPushButton* anOkBtn = (QPushButton*)aDlg->findChild<QPushButton*>("OK");
622 anOkBtn->setText(tr("SMESH_BUT_OK"));
624 if (aDlg->exec() != Accepted)
627 QString fName = aDlg->selectedFile();
632 if (QFileInfo(fName).suffix().isEmpty())
633 fName = autoExtension(fName);
635 fName = QDir::convertSeparators(fName);
636 QString prev = QDir::convertSeparators(getFileName());
643 QListWidgetItem* item = myListBox->item( myListBox->count()-1 );
644 QString aName = item ? item->text() : QString::null;
647 if (myMode == ADD_TO)
649 myTable->Copy((SMESHGUI_FilterTable*)parentWidget());
650 myCurrFilterName = "";
652 addFilterToLib(aName);
655 isPermissionValid(false);
658 //=======================================================================
659 // name : SMESHGUI_FilterLibraryDlg::processNewLibrary
660 // Purpose : SLOT. Calleds when file name changed
661 //=======================================================================
662 void SMESHGUI_FilterLibraryDlg::processNewLibrary()
664 SMESH::FilterManager_var aFilterMgr = SMESH::GetFilterManager();
665 if (aFilterMgr->_is_nil())
668 myLibrary = aFilterMgr->LoadLibrary(autoExtension(getFileName()).toLatin1().constData());
669 if (myLibrary->_is_nil()) {
670 if (myMode == COPY_FROM) {
671 SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"),
675 myLibrary = aFilterMgr->CreateLibrary();
676 myLibrary->SetFileName(getFileName().toLatin1().constData());
683 //=======================================================================
684 // name : SMESHGUI_FilterLibraryDlg::updateList
685 // Purpose : Fill list box with filter names
686 //=======================================================================
687 void SMESHGUI_FilterLibraryDlg::updateList()
690 SMESH::string_array_var aNames = myLibrary->GetNames((SMESH::ElementType)myTable->GetType());
691 for (int i = 0, n = aNames->length(); i < n; i++)
692 aList.append(QString(aNames[ i ]));
693 myListBox->blockSignals(true);
695 myListBox->blockSignals(false);
696 myListBox->addItems(aList);
697 if (myListBox->count() == 0)
699 myTable->Clear(myTable->GetType());
701 myName->setEnabled(false);
702 myTable->SetEnabled(false);
706 myName->setEnabled(true);
707 myTable->SetEnabled(true);
708 if (myListBox->count())
710 myCurrFilterName = "";
711 myListBox->setCurrentItem(0);
716 //=======================================================================
717 // name : SMESHGUI_FilterLibraryDlg::isNameValid
718 // Purpose : Verify validity if entered data
719 //=======================================================================
720 bool SMESHGUI_FilterLibraryDlg::isNameValid(const bool theMess) const
722 // verify validity of filter name
723 if (myName->isEnabled() && !myCurrFilterName.isEmpty()) {
724 QString aCurrName = myName->text();
725 if (aCurrName.isEmpty()) {
727 SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"),
728 tr("EMPTY_FILTER_NAME"));
732 SMESH::string_array_var aNames = myLibrary->GetAllNames();
733 for (int f = 0, n = aNames->length(); f < n; f++) {
734 if (aNames[ f ] == aCurrName && aNames[ f ] != myCurrFilterName) {
736 SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"),
737 tr("ERROR_FILTER_NAME"));
746 //=======================================================================
747 // name : SMESHGUI_FilterLibraryDlg::isPermissionValid
748 // Purpose : Verify write permission on file
749 //=======================================================================
750 bool SMESHGUI_FilterLibraryDlg::isPermissionValid(const bool theIsExistingOnly)
752 if (myMode == COPY_FROM)
755 // Verify write permission
756 bool isWritable = false;
758 QString fName(myFileName->text());
759 if (QFileInfo(fName).suffix().isEmpty())
760 fName = autoExtension(fName);
762 fName = QDir::convertSeparators(fName);
764 if (QFileInfo(fName).exists()) {
765 isWritable = QFileInfo(fName).isWritable();
766 } else if (!theIsExistingOnly) {
767 QFileInfo aDirInfo(QFileInfo(fName).absolutePath());
768 isWritable = aDirInfo.isWritable();
769 /*if (QDir(QFileInfo(fName).dirPath(true)).exists() ||
770 QDir().mkdir(QFileInfo(fName).dirPath(true)))
773 if (aFile.open(IO_WriteOnly))
784 SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"),
785 tr("NO_PERMISSION"));
792 //=======================================================================
793 // name : SMESHGUI_FilterLibraryDlg::isValid
794 // Purpose : Verify validity if entered data
795 //=======================================================================
796 bool SMESHGUI_FilterLibraryDlg::isValid(const bool theMess) const
798 // verify validity of table
799 if (!myTable->IsValid(theMess) || !isNameValid(theMess))
805 //=======================================================================
806 // name : SMESHGUI_FilterLibraryDlg::onFilterChanged
807 // Purpose : SLOT. Called when selected filter of library is changed
808 //=======================================================================
809 void SMESHGUI_FilterLibraryDlg::onFilterChanged()
811 QString theName = myListBox->currentItem() ? myListBox->currentItem()->text() : QString::null;
812 if (myLibrary->_is_nil())
815 // Save parameters of filter if it was changed
817 if (!myCurrFilterName.isEmpty() && myTable->IsEditable())
821 myListBox->blockSignals(true);
822 myListBox->setCurrentRow(myCurrFilter);
823 myListBox->blockSignals(false);
827 SMESH::Filter_var aFilter = createFilter();
828 myLibrary->Replace(myCurrFilterName.toLatin1().constData(),
829 myName->text().toLatin1().constData(),
833 // Fill table with filter parameters
835 SMESH::Filter_var aFilter = myLibrary->Copy(theName.toLatin1().constData());
836 myCurrFilterName = theName;
837 myCurrFilter = myListBox->currentRow();
838 myName->setText(theName);
841 SMESH::Filter::Criteria_var aCriteria;
843 myTable->Clear(myTable->GetType());
845 if (CORBA::is_nil( aFilter ) || !aFilter->GetCriteria(aCriteria))
848 for (int i = 0, n = aCriteria->length(); i < n; i++)
849 myTable->AddCriterion(aCriteria[ i ], myTable->GetType());
852 updateControlsVisibility(); // IPAL19974
855 //=======================================================================
856 // name : SMESHGUI_FilterLibraryDlg::onReturnPressed
857 // Purpose : SLOT. Called when enter button is pressed in library name field
859 //=======================================================================
860 void SMESHGUI_FilterLibraryDlg::onReturnPressed()
862 QListWidgetItem* item = myListBox->item( myListBox->count()-1 );
863 QString aName = item ? item->text() : QString::null;
867 if (myMode == ADD_TO)
869 myTable->Copy((SMESHGUI_FilterTable*)parentWidget());
870 myCurrFilterName = "";
872 addFilterToLib(aName);
875 isPermissionValid(false);
878 //=======================================================================
879 // name : SMESHGUI_FilterLibraryDlg::enableMainButtons
880 // Purpose : Update state of "OK", "Cancel" buttons
881 //=======================================================================
882 void SMESHGUI_FilterLibraryDlg::enableMainButtons()
884 /*bool isEnabled = isValid(false);
885 if (myButtons.contains(BTN_OK))
886 myButtons[ BTN_OK ]->setEnabled(isEnabled);
887 else if (myButtons.contains(BTN_Apply))
888 myButtons[ BTN_OK ]->setEnabled(isEnabled);
889 if (myButtons.contains(BTN_Cancel))
890 myButtons[ BTN_Cancel ]->setEnabled(isEnabled);
891 else if (myButtons.contains(BTN_Close))
892 myButtons[ BTN_Cancel ]->setEnabled(isEnabled);
896 //=======================================================================
897 // name : SMESHGUI_FilterLibraryDlg::createFilter
898 // Purpose : Cerate filter in accordance with library
899 //=======================================================================
900 SMESH::Filter_ptr SMESHGUI_FilterLibraryDlg::createFilter(const int theType)
902 int n = myTable->NumRows(theType);
904 SMESH::Filter::Criteria_var aCriteria = new SMESH::Filter::Criteria;
905 aCriteria->length(n);
907 for (int i = 0; i < n; i++)
909 SMESH::Filter::Criterion aCriterion = SMESHGUI_FilterDlg::createCriterion();
910 myTable->GetCriterion(i, aCriterion);
911 aCriteria[ i ] = aCriterion;
914 SMESH::FilterManager_var aFilterMgr = SMESH::GetFilterManager();
915 SMESH::Filter_var aFilter = aFilterMgr->CreateFilter();
916 aFilter->SetCriteria(aCriteria.in());
918 return aFilter._retn();
921 //=======================================================================
922 // name : SMESHGUI_FilterLibraryDlg::onAddBtnPressed
923 // Purpose : SLOT. Called when "Add" button pressed
924 // Add new filter to the end of library
925 //=======================================================================
926 void SMESHGUI_FilterLibraryDlg::onAddBtnPressed()
928 // Save parameters of filter if it was changed
929 if (!myCurrFilterName.isEmpty() && myTable->IsEditable())
934 SMESH::Filter_var aFilter = createFilter();
935 myLibrary->Replace(myCurrFilterName.toLatin1().constData(),
936 myName->text().toLatin1().constData(),
939 myTable->Clear(myTable->GetType());
941 addFilterToLib(getDefaultFilterName());
944 //=======================================================================
945 // name : onAddBtnPressed()
946 // Purpose : SLOT. Called when "Add" button pressed
947 // Add new filter to the end of library
948 //=======================================================================
949 void SMESHGUI_FilterLibraryDlg::addFilterToLib (const QString& theName)
951 if (myLibrary->_is_nil()) {
952 SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"),
953 tr("LIBRARY_IS_NOT_LOADED"));
958 SMESH::Filter_var aFilter = createFilter();
960 // if name of filter already exist in the library assign default name for the filter
961 QString aName(theName);
962 SMESH::string_array_var aNames = myLibrary->GetAllNames();
963 for (int i = 0, n = aNames->length(); i < n; i++)
964 if (aName == QString(aNames[ i ]))
966 aName = getDefaultFilterName();
970 // add new filter in library
971 bool aResult = !aFilter->GetPredicate()->_is_nil()
972 ? myLibrary->Add(aName.toLatin1().constData(), aFilter)
973 : myLibrary->AddEmpty(aName.toLatin1().constData(), (SMESH::ElementType)myTable->GetType());
976 SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"),
977 tr("ERROR_OF_ADDING"));
981 myCurrFilterName = "";
985 if (theName != aName)
986 SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_WARNING"),
987 tr("ASSIGN_NEW_NAME").arg(theName).arg(aName));
990 //=======================================================================
991 // name : SMESHGUI_FilterLibraryDlg::getDefaultLibraryName
992 // Purpose : Get default library name
993 //=======================================================================
994 QString& SMESHGUI_FilterLibraryDlg::getDefaultLibraryName() const
996 static QString aName;
999 QString aHomeDir = QDir(QDir::home()).absolutePath();
1000 aName = aHomeDir + "/" + tr ("LIB_NAME");
1005 //=======================================================================
1006 // name : SMESHGUI_FilterLibraryDlg::getDefaultFilterName
1007 // Purpose : Create default filter name
1008 //=======================================================================
1009 QString SMESHGUI_FilterLibraryDlg::getDefaultFilterName() const
1013 if (myTable->GetType() == SMESH::NODE)
1015 else if (myTable->GetType() == SMESH::EDGE)
1017 else if (myTable->GetType() == SMESH::FACE)
1019 else if (myTable->GetType() == SMESH::VOLUME)
1020 aName = tr("VOLUME");
1021 else if (myTable->GetType() == SMESH::ALL)
1022 aName = tr("ELEMENT");
1024 aName = tr("SELECTION");
1026 aName += tr("FILTER");
1029 QMap< QString, int > anAllNames;
1030 SMESH::string_array_var aNames = myLibrary->GetAllNames();
1031 for(int i = 0, n = aNames->length(); i < n; i++)
1032 anAllNames[ QString(aNames[ i ]) ] = -1;
1034 bool isNotValid = true;
1040 aNewName = aName + "_" + QString("%1").arg(k);
1041 if (anAllNames.contains(aNewName))
1051 //=======================================================================
1052 // name : SMESHGUI_FilterLibraryDlg::setSelected
1053 // Purpose : set selected item in list box containing filters
1054 //=======================================================================
1055 bool SMESHGUI_FilterLibraryDlg::setSelected(const QString& theName)
1057 int anIndex = getIndex(theName);
1060 myListBox->setCurrentRow(anIndex);
1061 myCurrFilterName = theName;
1062 myCurrFilter = anIndex;
1064 return anIndex != -1;
1067 //=======================================================================
1068 // name : SMESHGUI_FilterLibraryDlg::getIndex
1069 // Purpose : Get index of the filter in list box
1070 //=======================================================================
1071 int SMESHGUI_FilterLibraryDlg::getIndex(const QString& theName) const
1073 for (int i = 0, n = myListBox->count(); i < n; i++)
1074 if (myListBox->item(i)->text() == theName)
1079 //=======================================================================
1080 // name : SMESHGUI_FilterLibraryDlg::onDeleteBtnPressed
1081 // Purpose : SLOT. Called when "Delete" button pressed
1082 //=======================================================================
1083 void SMESHGUI_FilterLibraryDlg::onDeleteBtnPressed()
1085 if (myLibrary->_is_nil()) {
1086 SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"),
1087 tr("LIBRARY_IS_NOT_LOADED"));
1091 int anIndex = getIndex(myCurrFilterName);
1093 if (anIndex == -1 || !myLibrary->Delete(myCurrFilterName.toLatin1().constData())) {
1094 SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"),
1095 tr("ERROR_OF_DELETING"));
1097 myCurrFilterName = "";
1099 delete myListBox->item(anIndex);
1102 myListBox->item(anIndex - 1)->setSelected(true);
1103 else if (anIndex == 0 && myListBox->count() > 0)
1104 myListBox->item(0)->setSelected(true);
1109 myTable->SetEnabled(myListBox->count() > 0);
1110 if (myListBox->count() == 0) {
1111 myName->setText("");
1112 myName->setEnabled(false);
1116 //=======================================================================
1117 // name : onFilterNameChanged()
1118 // Purpose : SLOT. Called when name of filter changed
1119 // Change filter name in list box
1120 //=======================================================================
1121 void SMESHGUI_FilterLibraryDlg::onFilterNameChanged (const QString& theName)
1123 int aCurrItem = myListBox->currentRow();
1124 if (aCurrItem == -1)
1127 myListBox->blockSignals(true);
1128 myListBox->item(aCurrItem)->setText(theName);
1129 myListBox->blockSignals(false);
1132 //=======================================================================
1133 // name : SMESHGUI_FilterLibraryDlg::SetTable
1134 // Purpose : Set table
1135 //=======================================================================
1136 void SMESHGUI_FilterLibraryDlg::SetTable(const SMESHGUI_FilterTable* theTable)
1138 myTable->Copy(theTable);
1139 myName->setText(getDefaultFilterName());
1140 addFilterToLib(myName->text());
1144 //=======================================================================
1145 // name : SMESHGUI_FilterLibraryDlg::GetTable
1146 // Purpose : Get table
1147 //=======================================================================
1148 const SMESHGUI_FilterTable* SMESHGUI_FilterLibraryDlg::GetTable() const
1154 //=======================================================================
1155 // name : SMESHGUI_FilterLibraryDlg::onEntityTypeChanged
1156 // Purpose : SLOT. Called when entiyt type changed
1157 //=======================================================================
1158 void SMESHGUI_FilterLibraryDlg::onEntityTypeChanged(const int theType)
1160 if (myLibrary->_is_nil())
1164 myCurrFilterName = "";
1167 if (myListBox->count())
1168 myListBox->setCurrentItem(0);
1171 //=======================================================================
1172 // name : SMESHGUI_FilterLibraryDlg::onNeedValidation
1174 //=======================================================================
1175 void SMESHGUI_FilterLibraryDlg::onNeedValidation()
1177 if (!myCurrFilterName.isEmpty())
1179 bool valid = isValid(true);
1180 myTable->SetValidity(valid);
1184 SMESH::Filter_var aFilter = createFilter(myTable->GetType());
1185 myLibrary->Replace(myCurrFilterName.toLatin1().constData(),
1186 myName->text().toLatin1().constData(),
1192 //=================================================================================
1193 // function : keyPressEvent()
1195 //=================================================================================
1196 void SMESHGUI_FilterLibraryDlg::keyPressEvent( QKeyEvent* e )
1198 QDialog::keyPressEvent( e );
1199 if ( e->isAccepted() )
1202 if ( e->key() == Qt::Key_F1 ) {