X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_FilterDlg.cxx;h=9fdc3f71996e087995d068a33c65490e6d332f07;hp=873c5f68816618332dd27a6699b8e9c064c6c2f9;hb=9d11375af40826e967ab2c3bcb77d1f9d439c90c;hpb=c38c10811a065cf5b13e8807ed71864d92ca7d80 diff --git a/src/SMESHGUI/SMESHGUI_FilterDlg.cxx b/src/SMESHGUI/SMESHGUI_FilterDlg.cxx index 873c5f688..9fdc3f719 100755 --- a/src/SMESHGUI/SMESHGUI_FilterDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_FilterDlg.cxx @@ -17,7 +17,7 @@ // 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 +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // // @@ -44,8 +44,10 @@ #include "SUIT_Desktop.h" #include "SUIT_ResourceMgr.h" +#include "SUIT_Session.h" +#include "SUIT_MessageBox.h" -#include "SalomeApp_Application.h" +#include "LightApp_Application.h" #include "SalomeApp_Tools.h" #include "SalomeApp_Study.h" @@ -396,7 +398,7 @@ void SMESHGUI_FilterTable::Table::insertRows (int row, int count) if (anEditRow >= 0 && anEditCol >= 0) endEdit(anEditRow, anEditCol, true, false); - QTable::insertRows(row, count); + QTable::insertRows( row, count ); } //======================================================================= @@ -427,9 +429,12 @@ QString SMESHGUI_FilterTable::Table::text (int row, int col) const // name : SMESHGUI_FilterTable::SMESHGUI_FilterTable // Purpose : Constructor //======================================================================= -SMESHGUI_FilterTable::SMESHGUI_FilterTable (QWidget* parent, +SMESHGUI_FilterTable::SMESHGUI_FilterTable( SMESHGUI* theModule, + QWidget* parent, const int type) -: QFrame(parent) +: QFrame(parent), + myIsLocked( false ), + mySMESHGUI( theModule ) { myEntityType = -1; Init(type); @@ -439,9 +444,12 @@ SMESHGUI_FilterTable::SMESHGUI_FilterTable (QWidget* parent, // name : SMESHGUI_FilterTable::SMESHGUI_FilterTable // Purpose : Constructor //======================================================================= -SMESHGUI_FilterTable::SMESHGUI_FilterTable (QWidget* parent, +SMESHGUI_FilterTable::SMESHGUI_FilterTable( SMESHGUI* theModule, + QWidget* parent, const QValueList& types) -: QFrame(parent) +: QFrame(parent), + myIsLocked( false ), + mySMESHGUI( theModule ) { myEntityType = -1; Init(types); @@ -668,7 +676,7 @@ bool SMESHGUI_FilterTable::IsValid (const bool theMess, const int theEntityType) aCriterion == FT_BelongToGeom || aCriterion == FT_BelongToPlane || aCriterion == FT_BelongToCylinder || - aCriterion == FT_LyingOnGeom) { + aCriterion == FT_LyingOnGeom) { if (aTable->text(i, 2).isEmpty()) { if (theMess) QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"), @@ -784,7 +792,11 @@ void SMESHGUI_FilterTable::GetCriterion (const int theRow, theCriterion.Threshold = aTable->item(theRow, 2)->text().toDouble(); } else - theCriterion.ThresholdStr = aTable->text(theRow, 2).latin1(); + { + theCriterion.ThresholdStr = aTable->text(theRow, 2).latin1(); + if ( aCriterionType != FT_RangeOfIds ) + theCriterion.ThresholdID = aTable->text( theRow, 5 ).latin1(); + } QTableItem* anItem = aTable->item(theRow, 0); if (myAddWidgets.contains(anItem)) @@ -821,13 +833,20 @@ void SMESHGUI_FilterTable::SetCriterion (const int theRow, aTable->SetEditable(false, theRow, 4); if (theCriterion.Type != FT_RangeOfIds && - theCriterion.Type != FT_BelongToGeom && - theCriterion.Type != FT_BelongToPlane && - theCriterion.Type != FT_BelongToCylinder && - theCriterion.Type != FT_LyingOnGeom) + theCriterion.Type != FT_BelongToGeom && + theCriterion.Type != FT_BelongToPlane && + theCriterion.Type != FT_BelongToCylinder && + theCriterion.Type != FT_LyingOnGeom && + theCriterion.Type != FT_FreeBorders && + theCriterion.Type != FT_FreeEdges && + theCriterion.Type != FT_BadOrientedVolume) aTable->setText(theRow, 2, QString("%1").arg(theCriterion.Threshold, 0, 'g', 15)); else - aTable->setText(theRow, 2, QString(theCriterion.ThresholdStr)); + { + aTable->setText(theRow, 2, QString(theCriterion.ThresholdStr)); + if ( theCriterion.Type != FT_RangeOfIds ) + aTable->setText( theRow, 5, QString( theCriterion.ThresholdID ) ); + } if (theCriterion.Compare == FT_EqualTo || theCriterion.Type == FT_BelongToPlane || @@ -842,7 +861,7 @@ void SMESHGUI_FilterTable::SetCriterion (const int theRow, myAddWidgets[ anItem ]->SetDouble(AdditionalWidget::Tolerance, theCriterion.Tolerance); } - emit CretarionChanged(theRow, aType); + emit CriterionChanged(theRow, aType); } @@ -944,7 +963,7 @@ void SMESHGUI_FilterTable::onRemoveBtn() if (aTable->isRowSelected(i)) { aRows.resize(aRows.size() + 1); - aRows[ aRows.size() - 1 ] = i; + aRows[ (int)(aRows.size() - 1) ] = i; removeAdditionalWidget(aTable, i); } } @@ -978,7 +997,7 @@ void SMESHGUI_FilterTable::updateAdditionalWidget() GetCriterionType(aRow) != FT_LyingOnGeom && GetCriterionType(aRow) != FT_RangeOfIds && GetCriterionType(aRow) != FT_FreeEdges && - GetCriterionType(aRow) != FT_BadOrientedVolume; + GetCriterionType(aRow) != FT_BadOrientedVolume; if (!myAddWidgets.contains(anItem)) { myAddWidgets[ anItem ] = new AdditionalWidget(myWgStack); @@ -1033,7 +1052,8 @@ void SMESHGUI_FilterTable::onClearBtn() //======================================================================= void SMESHGUI_FilterTable::onCurrentChanged (int theRow, int theCol) { - updateAdditionalWidget(); + if( !myIsLocked ) + updateAdditionalWidget(); emit CurrentChanged(theRow, theCol); } @@ -1058,10 +1078,10 @@ void SMESHGUI_FilterTable::onCriterionChanged (const int row, const int col, con aTable->SetEditable(false, row, 2); } else if (aCriterionType == SMESH::FT_RangeOfIds || - aCriterionType == SMESH::FT_BelongToGeom || - aCriterionType == SMESH::FT_BelongToPlane || - aCriterionType == SMESH::FT_BelongToCylinder || - aCriterionType == SMESH::FT_LyingOnGeom) + aCriterionType == SMESH::FT_BelongToGeom || + aCriterionType == SMESH::FT_BelongToPlane || + aCriterionType == SMESH::FT_BelongToCylinder || + aCriterionType == SMESH::FT_LyingOnGeom) { QMap aMap; aMap[ FT_EqualTo ] = tr("EQUAL_TO"); @@ -1087,7 +1107,7 @@ void SMESHGUI_FilterTable::onCriterionChanged (const int row, const int col, con updateAdditionalWidget(); - emit CretarionChanged(row, entityType); + emit CriterionChanged(row, entityType); } //======================================================================= @@ -1125,6 +1145,7 @@ void SMESHGUI_FilterTable::addRow (Table* theTable, const int theType, const boo int aSelectedRow = getFirstSelectedRow(); int aCurrCol = theTable->currentColumn(); + myIsLocked = true; if (toTheEnd || aSelectedRow == -1) { theTable->insertRows(theTable->numRows()); @@ -1135,6 +1156,7 @@ void SMESHGUI_FilterTable::addRow (Table* theTable, const int theType, const boo theTable->insertRows(aSelectedRow); aCurrRow = aSelectedRow; } + myIsLocked = false; // Criteria theTable->setItem(aCurrRow, 0, getCriterionItem(theTable, theType)); @@ -1305,6 +1327,7 @@ const QMap& SMESHGUI_FilterTable::getCriteria (const int theType) aCriteria[ SMESH::FT_BelongToGeom ] = tr("BELONG_TO_GEOM"); aCriteria[ SMESH::FT_LyingOnGeom ] = tr("LYING_ON_GEOM"); aCriteria[ SMESH::FT_BadOrientedVolume ] = tr("BAD_ORIENTED_VOLUME"); + aCriteria[ SMESH::FT_Volume3D ] = tr("VOLUME_3D"); } return aCriteria; } @@ -1342,7 +1365,7 @@ SMESHGUI_FilterTable::Table* SMESHGUI_FilterTable::createTable (QWidget* thePar const int theType) { // create table - Table* aTable= new Table(0, 5, theParent); + Table* aTable= new Table(0, 6, theParent); QHeader* aHeaders = aTable->horizontalHeader(); @@ -1373,11 +1396,15 @@ SMESHGUI_FilterTable::Table* SMESHGUI_FilterTable::createTable (QWidget* thePar aHeaders->setLabel(2, tr("THRESHOLD_VALUE")); aHeaders->setLabel(3, tr("UNARY")); aHeaders->setLabel(4, tr("BINARY") + " "); + aHeaders->setLabel( 5, tr( "ID" ) ); // set geometry of the table for (int i = 0; i <= 4; i++) aTable->adjustColumn(i); + // set the ID column invisible + aTable->hideColumn( 5 ); + aTable->updateGeometry(); QSize aSize = aTable->sizeHint(); int aWidth = aSize.width(); @@ -1490,7 +1517,7 @@ void SMESHGUI_FilterTable::onCopyFromBtn() { if (myLibDlg == 0) myLibDlg = new SMESHGUI_FilterLibraryDlg( - this, GetType(), SMESHGUI_FilterLibraryDlg::COPY_FROM); + mySMESHGUI, this, GetType(), SMESHGUI_FilterLibraryDlg::COPY_FROM); else myLibDlg->Init(GetType(), SMESHGUI_FilterLibraryDlg::COPY_FROM); @@ -1512,7 +1539,7 @@ void SMESHGUI_FilterTable::onAddToBtn() return; if (myLibDlg == 0) myLibDlg = new SMESHGUI_FilterLibraryDlg( - this, GetType(), SMESHGUI_FilterLibraryDlg::ADD_TO); + mySMESHGUI, this, GetType(), SMESHGUI_FilterLibraryDlg::ADD_TO); else myLibDlg->Init(GetType(), SMESHGUI_FilterLibraryDlg::ADD_TO); @@ -1579,6 +1606,37 @@ bool SMESHGUI_FilterTable::GetThreshold (const int theRow, return false; } +//======================================================================= +// name : SMESHGUI_FilterTable::SetID +// Purpose : Set text and internal value in cell of ID value +//======================================================================= +void SMESHGUI_FilterTable::SetID( const int theRow, + const QString& theText, + const int theEntityType ) +{ + Table* aTable = myTables[ theEntityType == -1 ? GetType() : theEntityType ]; + aTable->setText( theRow, 5, theText ); +} + +//======================================================================= +// name : SMESHGUI_FilterTable::GetID +// Purpose : Get text and internal value from cell of ID value +//======================================================================= +bool SMESHGUI_FilterTable::GetID( const int theRow, + QString& theText, + const int theEntityType ) +{ + Table* aTable = myTables[ theEntityType == -1 ? GetType() : theEntityType ]; + QTableItem* anItem = aTable->item( theRow, 5 ); + if ( anItem != 0 ) + { + theText = anItem->text(); + return true; + } + else + return false; +} + /* Class : SMESHGUI_FilterDlg Description : Dialog to specify filters for VTK viewer @@ -1595,10 +1653,11 @@ SMESHGUI_FilterDlg::SMESHGUI_FilterDlg( SMESHGUI* theModule, : QDialog( SMESH::GetDesktop( theModule ), theName, false, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), mySMESHGUI( theModule ), - mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), - myViewWindow( SMESH::GetViewWindow( theModule ) ), - mySelector( myViewWindow->GetSelector() ) + mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ) { + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + mySelector = aViewWindow->GetSelector(); + construct(theTypes); } @@ -1612,10 +1671,10 @@ SMESHGUI_FilterDlg::SMESHGUI_FilterDlg( SMESHGUI* theModule, : QDialog( SMESH::GetDesktop( theModule ), theName, false, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), mySMESHGUI( theModule ), - mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), - myViewWindow( SMESH::GetViewWindow( theModule ) ), - mySelector( myViewWindow->GetSelector() ) + mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ) { + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + mySelector = aViewWindow->GetSelector(); QValueList aTypes; aTypes.append(theType); construct(aTypes); @@ -1641,6 +1700,8 @@ void SMESHGUI_FilterDlg::construct (const QValueList& theTypes) aDlgLay->setStretchFactor(myMainFrame, 1); + myHelpFileName = "selection_filter_library.htm"; + Init(myTypes); } @@ -1656,7 +1717,7 @@ QFrame* SMESHGUI_FilterDlg::createMainFrame (QWidget* theParent) // filter frame - myTable = new SMESHGUI_FilterTable(aMainFrame, myTypes); + myTable = new SMESHGUI_FilterTable( mySMESHGUI, aMainFrame, myTypes ); myTable->SetLibsEnabled(true); QFrame* aLine = new QFrame(myTable->GetTableGrp()); @@ -1668,7 +1729,7 @@ QFrame* SMESHGUI_FilterDlg::createMainFrame (QWidget* theParent) // other controls mySourceGrp = createSourceGroup(aMainFrame); - connect(myTable, SIGNAL(CretarionChanged(const int, const int)), + connect(myTable, SIGNAL(CriterionChanged(const int, const int)), SLOT(onCriterionChanged(const int, const int))); connect(myTable, SIGNAL(CurrentChanged(int, int)), @@ -1736,11 +1797,13 @@ QFrame* SMESHGUI_FilterDlg::createButtonFrame (QWidget* theParent) myButtons[ BTN_Cancel ] = new QPushButton(tr("SMESH_BUT_CANCEL"), aGrp); myButtons[ BTN_Close ] = new QPushButton(tr("SMESH_BUT_CLOSE"), aGrp); + myButtons[ BTN_Help ] = new QPushButton(tr("SMESH_BUT_HELP"), 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())); + connect(myButtons[ BTN_Help ], SIGNAL(clicked()), SLOT(onHelp())); updateMainButtons(); @@ -1801,11 +1864,7 @@ void SMESHGUI_FilterDlg::Init (const QValueList& theTypes) connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), SLOT(onDeactivate())); connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(onClose())); - - int x, y; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); - + updateMainButtons(); updateSelection(); @@ -1876,7 +1935,8 @@ void SMESHGUI_FilterDlg::onClose() aResMap.Add(anIndMap(i)); mySelector->AddOrRemoveIndex( anIter.Key(), aResMap, false); - myViewWindow->highlight( anIter.Key(), true, true ); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->highlight( anIter.Key(), true, true ); } mySelectionMgr->setSelectedObjects(aList, false); } @@ -1888,6 +1948,29 @@ void SMESHGUI_FilterDlg::onClose() return; } +//================================================================================= +// function : onHelp() +// purpose : +//================================================================================= +void SMESHGUI_FilterDlg::onHelp() +{ + LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication()); + if (app) + app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName); + else { + QString platform; +#ifdef WIN32 + platform = "winapplication"; +#else + platform = "application"; +#endif + SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"), + QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(myHelpFileName), + QObject::tr("BUT_OK")); + } +} + //======================================================================= // name : SMESHGUI_FilterDlg::onDeactivate // Purpose : SLOT called when dialog must be deativated @@ -2027,9 +2110,9 @@ bool SMESHGUI_FilterDlg::isValid() const { int aType = myTable->GetCriterionType(i); if (aType == FT_BelongToGeom || - aType == FT_BelongToPlane || - aType == FT_BelongToCylinder || - aType == FT_LyingOnGeom) { + aType == FT_BelongToPlane || + aType == FT_BelongToCylinder || + aType == FT_LyingOnGeom) { QString aName; myTable->GetThreshold(i, aName); @@ -2181,15 +2264,10 @@ bool SMESHGUI_FilterDlg::createFilter (const int theType) aCriteria->length(n); long aPrecision = -1; - SUIT_ResourceMgr* mgr = SMESHGUI::resourceMgr(); + SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( mySMESHGUI ); - if (mgr && mgr->hasValue("SMESH", "ControlsPrecision")) { - QString aStr = mgr->stringValue("SMESH", "ControlsPrecision"); - bool isOk = false; - int aVal = aStr.toInt(&isOk); - if (isOk) - aPrecision = aVal; - } + if ( mgr && mgr->booleanValue( "SMESH", "use_precision", false ) ) + aPrecision = mgr->integerValue( "SMESH", "controls_precision", aPrecision ); for (CORBA::ULong i = 0; i < n; i++) { SMESH::Filter::Criterion aCriterion = createCriterion(); @@ -2210,17 +2288,19 @@ bool SMESHGUI_FilterDlg::createFilter (const int theType) //======================================================================= void SMESHGUI_FilterDlg::insertFilterInViewer() { - if (SVTK_InteractorStyle* aStyle = SMESH::GetInteractorStyle()) { + if (SVTK_Selector* aSelector = SMESH::GetSelector()) { SMESH::ElementType anEntType = (SMESH::ElementType)myTable->GetType(); if (myFilter[ myTable->GetType() ]->_is_nil() || myFilter[ myTable->GetType() ]->GetPredicate()->_is_nil() || !mySetInViewer->isChecked()) { - SMESH::RemoveFilter(getFilterId(anEntType), aStyle); - } else { + SMESH::RemoveFilter(getFilterId(anEntType), aSelector); + } + else { Handle(SMESHGUI_PredicateFilter) aFilter = new SMESHGUI_PredicateFilter(); aFilter->SetPredicate(myFilter[ myTable->GetType() ]->GetPredicate()); - SMESH::SetFilter(aFilter, aStyle); + SMESH::RemoveFilter(getFilterId(anEntType), aSelector); //skl for IPAL12631 + SMESH::SetFilter(aFilter, aSelector); } } } @@ -2357,12 +2437,13 @@ void SMESHGUI_FilterDlg::selectInViewer (const int theType, const QValueListSelectionMode()!=aSelMode) { + SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ); + if ( aViewWindow && aViewWindow->SelectionMode()!=aSelMode) { mySelectionMgr->clearSelected(); mySelectionMgr->clearFilters(); if (aSelMode == NodeSelection) SMESH::SetPointRepresentation(true); - myViewWindow->SetSelectionMode(aSelMode); + aViewWindow->SetSelectionMode(aSelMode); } // Clear selection @@ -2395,7 +2476,8 @@ void SMESHGUI_FilterDlg::selectInViewer (const int theType, const QValueListAddOrRemoveIndex(anIO, aMap, false); - myViewWindow->highlight( anIO, true, true ); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->highlight( anIO, true, true ); // insert previously stored filter in viewer if necessary if (!aFilter.IsNull()) @@ -2416,6 +2498,7 @@ SMESH::Filter::Criterion SMESHGUI_FilterDlg::createCriterion() aCriterion.UnaryOp = FT_Undefined; aCriterion.BinaryOp = FT_Undefined; aCriterion.ThresholdStr = ""; + aCriterion.ThresholdID = ""; aCriterion.TypeOfElement = SMESH::ALL; return aCriterion; @@ -2443,7 +2526,10 @@ void SMESHGUI_FilterDlg::onSelectionDone() Handle(SALOME_InteractiveObject) anIO = aList.First(); GEOM::GEOM_Object_var anObj = SMESH::IObjectToInterface(anIO); if (!anObj->_is_nil()) - myTable->SetThreshold(aRow, GEOMBase::GetName(anObj)); + { + myTable->SetThreshold(aRow, GEOMBase::GetName(anObj)); + myTable->SetID( aRow, GEOMBase::GetIORFromObject(anObj)); + } } //======================================================================= @@ -2486,15 +2572,15 @@ void SMESHGUI_FilterDlg::updateSelection() int aRow, aCol; if (myTable->CurrentCell(aRow, aCol) && - (myTable->GetCriterionType(aRow) == FT_BelongToGeom || - myTable->GetCriterionType(aRow) == FT_BelongToPlane || - myTable->GetCriterionType(aRow) == FT_BelongToCylinder || - myTable->GetCriterionType(aRow) == FT_LyingOnGeom)) { + (myTable->GetCriterionType(aRow) == FT_BelongToGeom || + myTable->GetCriterionType(aRow) == FT_BelongToPlane || + myTable->GetCriterionType(aRow) == FT_BelongToCylinder || + myTable->GetCriterionType(aRow) == FT_LyingOnGeom)) { if (myTable->GetCriterionType(aRow) == FT_BelongToGeom || myTable->GetCriterionType(aRow) == FT_LyingOnGeom) { - mySelectionMgr->installFilter(new SMESH_NumberFilter("GEOM",TopAbs_SHAPE,0,allTypes)); + mySelectionMgr->installFilter(new GEOM_SelectionFilter( aStudy, true )); } else if (myTable->GetCriterionType(aRow) == FT_BelongToPlane) { mySelectionMgr->installFilter(new GEOM_FaceFilter( aStudy, StdSelect_Plane ) ); @@ -2506,7 +2592,25 @@ void SMESHGUI_FilterDlg::updateSelection() } else { if (myIsSelectionChanged) { - mySelectionMgr->installFilter(new SMESH_NumberFilter ("This filter deactivates selection",TopAbs_SHAPE,0,allTypes)); + mySelectionMgr->installFilter( new GEOM_TypeFilter( aStudy, -1 ) ); // This filter deactivates selection } } } + +//================================================================================= +// function : keyPressEvent() +// purpose : +//================================================================================= +void SMESHGUI_FilterDlg::keyPressEvent( QKeyEvent* e ) +{ + QDialog::keyPressEvent( e ); + if ( e->isAccepted() ) + return; + + if ( e->key() == Key_F1 ) + { + e->accept(); + onHelp(); + } +} +