+#ifdef DEBUG_TAB_WIDGETS
+ if (theDebug) {
+ QStringList aWidgetTypes;
+ QList<QWidget*>::const_iterator anIt = theWidgets.begin(), aLast = theWidgets.end();
+ for (; anIt != aLast; anIt++) {
+ QWidget* aWidget = *anIt;
+ if (aWidget)
+ aWidgetTypes.append(aWidget->objectName());
+ }
+ QString anInfo = QString("theWidgets[%1]: %2")
+ .arg(theWidgets.count()).arg(aWidgetTypes.join(","));
+ qDebug(anInfo.toStdString().c_str());
+ }
+#endif
+}
+
+bool XGUI_PropertyPanel::setFocusNextPrevChild(bool theIsNext)
+{
+ return focusNextPrevChild(theIsNext);
+}
+
+bool XGUI_PropertyPanel::focusNextPrevChild(bool theIsNext)
+{
+ // it wraps the Tabs clicking to follow in the chain:
+ // controls, last control, Apply, Cancel, first control, controls
+ bool isChangedFocus = false;
+
+ QWidget* aFocusWidget = focusWidget();
+#ifdef DEBUG_TAB_WIDGETS
+ if (aFocusWidget) {
+ QString anInfo = QString("focus Widget: %1").arg(aFocusWidget->objectName());
+ qDebug(anInfo.toStdString().c_str());
+ }
+#endif
+ ModuleBase_ModelWidget* aFocusMWidget = ModuleBase_ModelWidget::findModelWidget(this,
+ aFocusWidget);
+ if (aFocusMWidget)
+ aFocusMWidget->setHighlighted(false);
+
+ QWidget* aNewFocusWidget = 0;
+ if (aFocusWidget) {
+ QList<QWidget*> aChildren;
+ findDirectChildren(this, aChildren, true);
+ int aChildrenCount = aChildren.count();
+ int aFocusWidgetIndex = aChildren.indexOf(aFocusWidget);
+ if (aFocusWidgetIndex >= 0) {
+ if (theIsNext) {
+ if (aFocusWidgetIndex == aChildrenCount-1) {
+ // after the last widget focus should be set to "Apply"
+ QToolButton* anOkBtn = findButton(PROP_PANEL_OK);
+ if (anOkBtn->isEnabled())
+ aNewFocusWidget = anOkBtn;
+ else {
+ QToolButton* aCancelBtn = findButton(PROP_PANEL_CANCEL);
+ if (aCancelBtn->isEnabled())
+ aNewFocusWidget = aCancelBtn;
+ }
+ }
+ else {
+ aNewFocusWidget = aChildren[aFocusWidgetIndex+1];
+ }
+ }
+ else {
+ if (aFocusWidgetIndex == 0) {
+ // before the first widget, the last should accept focus
+ aNewFocusWidget = aChildren[aChildrenCount - 1];
+ }
+ else {
+ // before the "Apply" button, the last should accept focus for consistency with "Next"
+ QToolButton* anOkBtn = findButton(PROP_PANEL_OK);
+ if (aFocusWidget == anOkBtn) {
+ aNewFocusWidget = aChildren[aChildrenCount - 1];
+ }
+ else {
+ aNewFocusWidget = aChildren[aFocusWidgetIndex-1];
+ }
+ }
+ }
+ }
+ }
+ if (aNewFocusWidget) {
+ if (myActiveWidget) {
+ bool isFirstControl = !theIsNext;
+ QWidget* aLastFocusControl = myActiveWidget->getControlAcceptingFocus(isFirstControl);
+ if (aFocusWidget == aLastFocusControl) {
+ setActiveWidget(NULL, false);
+ }
+ }
+
+ // we want to have property panel as an active window to enter values in double control
+ ModuleBase_Tools::setFocus(aNewFocusWidget, "XGUI_PropertyPanel::focusNextPrevChild()");
+
+ ModuleBase_ModelWidget* aNewFocusMWidget = ModuleBase_ModelWidget::findModelWidget(this,
+ aNewFocusWidget);
+ if (aNewFocusMWidget)
+ aNewFocusMWidget->emitFocusInWidget();
+ isChangedFocus = true;
+ }
+ return isChangedFocus;
+}
+
+void XGUI_PropertyPanel::activateNextWidget()
+{
+ activateNextWidget(myActiveWidget);
+}
+
+void XGUI_PropertyPanel::activateWidget(ModuleBase_ModelWidget* theWidget, const bool theEmitSignal)
+{
+ std::string aPreviosAttributeID;
+ if(myActiveWidget)
+ aPreviosAttributeID = myActiveWidget->attributeID();
+
+ // Avoid activation of already actve widget. It could happen on focusIn event many times
+ setActiveWidget(theWidget, theEmitSignal);
+}
+
+bool XGUI_PropertyPanel::setActiveWidget(ModuleBase_ModelWidget* theWidget, const bool isEmitSignal)
+{
+ // Avoid activation of already actve widget. It could happen on focusIn event many times
+ if (theWidget == myActiveWidget) {
+ return false;
+ }
+ std::string aPreviosAttributeID;
+ if(myActiveWidget) {
+ aPreviosAttributeID = myActiveWidget->attributeID();
+ myActiveWidget->processValueState();
+ myActiveWidget->deactivate();
+ myActiveWidget->setHighlighted(false);
+ }
+ if(theWidget) {
+ emit beforeWidgetActivated(theWidget);
+ theWidget->setHighlighted(true);
+ theWidget->activate();
+ }
+ myActiveWidget = theWidget;
+
+#ifdef DEBUG_ACTIVE_WIDGET
+ std::cout << "myActiveWidget = " << (theWidget ? theWidget->context().c_str() : "") << std::endl;
+#endif
+ static Events_ID anEvent = Events_Loop::eventByName(EVENT_UPDATE_BY_WIDGET_SELECTION);
+ Events_Loop::loop()->flush(anEvent);
+
+ if (isEmitSignal) {
+ //emit widgetActivated(myActiveWidget);
+ if (!myActiveWidget && !isEditingMode()) {
+ emit noMoreWidgets(aPreviosAttributeID);
+ }
+ }
+ if (myActiveWidget)
+ emit propertyPanelActivated();
+ else
+ emit propertyPanelDeactivated();
+ myOperationMgr->workshop()->selectionActivate()->updateSelectionModes();
+ myOperationMgr->workshop()->selectionActivate()->updateSelectionFilters();
+ return true;
+}
+
+void XGUI_PropertyPanel::setFocusOnOkButton()
+{
+ QToolButton* anOkBtn = findButton(PROP_PANEL_OK);
+ ModuleBase_Tools::setFocus(anOkBtn, "XGUI_PropertyPanel::setFocusOnOkButton()");
+}
+
+void XGUI_PropertyPanel::setCancelEnabled(bool theEnabled)
+{
+ QToolButton* anCancelBtn = findButton(PROP_PANEL_CANCEL);
+ anCancelBtn->setEnabled(theEnabled);
+}
+
+bool XGUI_PropertyPanel::isCancelEnabled() const
+{
+ QToolButton* anCancelBtn = findButton(PROP_PANEL_CANCEL);
+ return anCancelBtn->isEnabled();
+}
+
+void XGUI_PropertyPanel::setEditingMode(bool isEditing)
+{
+ ModuleBase_IPropertyPanel::setEditingMode(isEditing);
+ foreach(ModuleBase_ModelWidget* aWgt, myWidgets) {
+ aWgt->setEditingMode(isEditing);
+ }
+}
+
+void XGUI_PropertyPanel::setupActions(XGUI_ActionsMgr* theMgr)
+{
+ QStringList aButtonNames;
+ aButtonNames << PROP_PANEL_OK << PROP_PANEL_CANCEL << PROP_PANEL_HELP << PROP_PANEL_PREVIEW;
+ QList<XGUI_ActionsMgr::OperationStateActionId> aActionIds;
+ aActionIds << XGUI_ActionsMgr::Accept << XGUI_ActionsMgr::Abort << XGUI_ActionsMgr::Help
+ << XGUI_ActionsMgr::Preview;
+ for (int i = 0; i < aButtonNames.size(); ++i) {
+ QToolButton* aBtn = findButton(aButtonNames.at(i).toStdString().c_str());
+ QAction* anAct = theMgr->operationStateAction(aActionIds.at(i));
+ aBtn->setDefaultAction(anAct);
+ }
+}
+
+ModuleBase_ModelWidget* XGUI_PropertyPanel::preselectionWidget() const
+{
+ return myPreselectionWidget;
+}
+
+void XGUI_PropertyPanel::setPreselectionWidget(ModuleBase_ModelWidget* theWidget)
+{
+ myPreselectionWidget = theWidget;
+}
+
+
+void XGUI_PropertyPanel::closeEvent(QCloseEvent* theEvent)
+{
+ ModuleBase_Operation* aOp = myOperationMgr->currentOperation();
+ if (aOp) {
+ if (myOperationMgr->canStopOperation(aOp)) {
+ myOperationMgr->abortOperation(aOp);
+ if (myOperationMgr->hasOperation())
+ theEvent->ignore();
+ else
+ theEvent->accept();
+ } else
+ theEvent->ignore();
+ } else
+ ModuleBase_IPropertyPanel::closeEvent(theEvent);