+ myWorkshop->deactivateSubShapesSelection();
+ }
+
+ // the initial code is moved here in order to clear filters, it is possible, that it is excessive and
+ // is performed outside
+ if (myIsActive && !myObjectTypes.isEmpty()) {
+ aViewer->clearSelectionFilters();
+ }
+ SelectMgr_ListOfFilter aFilters;
+ selectionFilters(aFilters);
+ SelectMgr_ListIteratorOfListOfFilter aIt(aFilters);
+ for (; aIt.More(); aIt.Next()) {
+ const Handle(SelectMgr_Filter)& aSelFilter = aIt.Value();
+ if (myIsActive)
+ aViewer->addSelectionFilter(aSelFilter);
+ else
+ aViewer->removeSelectionFilter(aSelFilter);
+ }
+ // the internal filter should be removed by the widget deactivation, it is done historically
+ if (!myIsActive && !myObjTypeFilter.IsNull()) {
+ myObjTypeFilter.Nullify();
+ }
+}
+
+//********************************************************************
+void ModuleBase_WidgetShapeSelector::selectionFilters(SelectMgr_ListOfFilter& theFilters)
+{
+ if (!myObjectTypes.isEmpty()) {
+ myObjTypeFilter = new ModuleBase_ObjectTypesFilter(myWorkshop, myObjectTypes);
+ theFilters.Append(myObjTypeFilter);
+ }
+ // apply filters loaded from the XML definition of the widget
+ ModuleBase_FilterFactory* aFactory = myWorkshop->selectionFilters();
+ SelectMgr_ListOfFilter aFilters;
+ aFactory->filters(parentID(), attributeID(), aFilters);
+ SelectMgr_ListIteratorOfListOfFilter aIt(aFilters);
+ for (; aIt.More(); aIt.Next()) {
+ Handle(SelectMgr_Filter) aSelFilter = aIt.Value();
+ if (aSelFilter.IsNull())
+ continue;
+
+ theFilters.Append(aSelFilter);