Salome HOME
Issue #1157: Using parameters in point coordinates
[modules/shaper.git] / src / ModuleBase / ModuleBase_WidgetFactory.cpp
index 25f3c1979f87c9ecbfb1ddf35c780104317705a8..f32f0aca8dc7ce29cba19c7777daedfb0be209b5 100644 (file)
 
 #include <ModuleBase_Operation.h>
 #include <ModuleBase_OperationDescription.h>
-//#include <ModuleBase_WidgetFeatureOrAttribute.h>
-//#include <ModuleBase_WidgetFeature.h>
 #include <ModuleBase_WidgetEditor.h>
 #include <ModuleBase_WidgetSwitch.h>
 #include <ModuleBase_WidgetShapeSelector.h>
 #include <ModuleBase_WidgetDoubleValue.h>
+#include <ModuleBase_WidgetIntValue.h>
 #include <ModuleBase_WidgetBoolValue.h>
-//#include <ModuleBase_WidgetPoint2dDistance.h>
 #include <ModuleBase_WidgetFileSelector.h>
 #include <ModuleBase_WidgetChoice.h>
 #include <ModuleBase_IWorkshop.h>
 #include <ModuleBase_WidgetLineEdit.h>
 #include <ModuleBase_WidgetMultiSelector.h>
 #include <ModuleBase_WidgetLabel.h>
+#include <ModuleBase_WidgetErrorLabel.h>
 #include <ModuleBase_WidgetToolbox.h>
 #include <ModuleBase_PageBase.h>
 #include <ModuleBase_PageGroupBox.h>
+#include <ModuleBase_WidgetCheckGroupBox.h>
 #include <ModuleBase_PageWidget.h>
+#include <ModuleBase_WidgetExprEditor.h>
+#include <ModuleBase_WidgetCreatorFactory.h>
 
 #include <ModelAPI_Validator.h>
 #include <ModelAPI_Session.h>
@@ -73,26 +75,20 @@ void ModuleBase_WidgetFactory::createWidget(ModuleBase_PageBase* thePage)
   if (!myWidgetApi->toChildWidget())
     return;
 
-  //bool isStretchLayout = false;
-  QWidget* aPageWidget = dynamic_cast<QWidget*>(thePage);
-  if(!aPageWidget) {
-    #ifdef _DEBUG
-    std::cout << "ModuleBase_WidgetFactory::createWidget: can not reinterpret_cast thePage" << std::endl;
-    #endif
-  }
   do {  //Iterate over each node
     std::string aWdgType = myWidgetApi->widgetType();
     // Create PageGroup TODO: extract
-    if (myWidgetApi->isGroupBoxWidget()) {
+    if (myWidgetApi->isGroupBoxWidget() ||
+        ModuleBase_WidgetCreatorFactory::get()->hasPageWidget(aWdgType)) {
+
       //if current widget is groupbox (container) process it's children recursively
-      QString aGroupName = qs(myWidgetApi->getProperty(CONTAINER_PAGE_NAME));
-      ModuleBase_PageGroupBox* aPage = new ModuleBase_PageGroupBox(aPageWidget);
-      aPage->setTitle(aGroupName);
+      ModuleBase_PageBase* aPage = createPageByType(aWdgType, thePage->pageWidget());
+
       createWidget(aPage);
       thePage->addPageWidget(aPage);
     } else {
       // Create a ModelWidget
-      ModuleBase_ModelWidget* aWidget = createWidgetByType(aWdgType, aPageWidget);
+      ModuleBase_ModelWidget* aWidget = createWidgetByType(aWdgType, thePage->pageWidget());
       if (aWidget) {
         if (!myWidgetApi->getBooleanAttribute(ATTR_INTERNAL, false)) {
           thePage->addModelWidget(aWidget);
@@ -110,96 +106,102 @@ void ModuleBase_WidgetFactory::createWidget(ModuleBase_PageBase* thePage)
           QString aCaseId = qs(myWidgetApi->getProperty(_ID));
           ModuleBase_PageBase* aPage = new ModuleBase_PageWidget(aWidget);
           createWidget(aPage);
-          QWidget* aCasePageWidget = dynamic_cast<QWidget*>(aPage);
-          if (aWdgType == WDG_SWITCH) {
-            ModuleBase_WidgetSwitch* aSwitch = qobject_cast<ModuleBase_WidgetSwitch*>(aWidget);
-            aSwitch->addPage(aCasePageWidget, aPageName);
-          } else if (aWdgType == WDG_TOOLBOX) {
-            ModuleBase_WidgetToolbox* aToolbox = qobject_cast<ModuleBase_WidgetToolbox*>(aWidget);
-            aToolbox->addPage(aCasePageWidget, aPageName, aCaseId);
+          if (aWdgType == WDG_SWITCH || aWdgType == WDG_TOOLBOX) {
+            ModuleBase_PagedContainer* aContainer = qobject_cast<ModuleBase_PagedContainer*>(aWidget);
+
+            QString anIconPath = qs( myWidgetApi->getProperty( CONTAINER_PAGE_ICON ) );
+            QPixmap anIcon( anIconPath );
+            aContainer->addPage( aPage, aPageName, aCaseId, anIcon );
           }
         } while (myWidgetApi->toNextWidget());
       }
     }
-//    if (aWidget && !isStretchLayout) {
-//      isStretchLayout = !hasExpandingControls(aWidget);
-//    }
   } while (myWidgetApi->toNextWidget());
-//  if (isStretchLayout) {
-//    aWidgetLay->addStretch(1);
-//  }
+
+  thePage->alignToTop();
 }
 
-bool ModuleBase_WidgetFactory::hasExpandingControls(QWidget* theParent)
+ModuleBase_PageBase* ModuleBase_WidgetFactory::createPageByType(const std::string& theType,
+                                                                QWidget* theParent)
 {
-  bool result = false;
-  QList<QWidget *> aListToCheck;
-  aListToCheck << theParent;
-  ModuleBase_ModelWidget* aModelWidget = qobject_cast<ModuleBase_ModelWidget*>(theParent);
-  if(aModelWidget) {
-    aListToCheck << aModelWidget->getControls();
+  ModuleBase_PageBase* aResult = NULL;
+
+  if (theType == WDG_GROUP) {
+    QString aGroupName = qs(myWidgetApi->getProperty(CONTAINER_PAGE_NAME));
+    ModuleBase_PageGroupBox* aPage = new ModuleBase_PageGroupBox(theParent);
+    aPage->setTitle(aGroupName);
+    aResult = aPage;
   }
-  foreach(QWidget* eachWidget, aListToCheck) {
-    QSizePolicy::Policy aVPolicy = eachWidget->sizePolicy().verticalPolicy();
-    if(aVPolicy & QSizePolicy::ExpandFlag) {
-      result = true;
-    }
+  else if (theType == WDG_CHECK_GROUP) {
+    QString aGroupName = qs(myWidgetApi->getProperty(CONTAINER_PAGE_NAME));
+    ModuleBase_WidgetCheckGroupBox* aPage = new ModuleBase_WidgetCheckGroupBox(theParent,
+                                                                myWidgetApi, myParentId);
+    aPage->setTitle(aGroupName);
+    aResult = aPage;
   }
-  return result;
+  if (!aResult)
+    aResult = ModuleBase_WidgetCreatorFactory::get()->createPageByType(theType, theParent,
+                                                                       myWidgetApi, myParentId);
+
+  ModuleBase_ModelWidget* aWidget = dynamic_cast<ModuleBase_ModelWidget*>(aResult);
+  if (aWidget)
+    myModelWidgets.append(aWidget);
+
+  return aResult;
 }
 
-ModuleBase_ModelWidget* ModuleBase_WidgetFactory
-::createWidgetByType(const std::string& theType, QWidget* theParent)
+ModuleBase_ModelWidget* ModuleBase_WidgetFactory::createWidgetByType(const std::string& theType,
+                                                                     QWidget* theParent)
 {
   ModuleBase_ModelWidget* result = NULL;
 
   if (theType == WDG_INFO) {
     result = new ModuleBase_WidgetLabel(theParent, myWidgetApi, myParentId);
-
+  } else if (theType == WDG_ERRORINFO) {
+    result = new ModuleBase_WidgetErrorLabel(theParent, myWidgetApi, myParentId);
   } else if (theType == WDG_DOUBLEVALUE) {
     result = new ModuleBase_WidgetDoubleValue(theParent, myWidgetApi, myParentId);
-
+  } else if (theType == WDG_INTEGERVALUE) {
+    result = new ModuleBase_WidgetIntValue(theParent, myWidgetApi, myParentId);
   } else if (theType == WDG_SHAPE_SELECTOR) {
-    result =  new ModuleBase_WidgetShapeSelector(theParent, myWorkshop, myWidgetApi, myParentId);
-
+    result = new ModuleBase_WidgetShapeSelector(theParent, myWorkshop, myWidgetApi, myParentId);
   } else if (theType == WDG_BOOLVALUE) {
     result = new ModuleBase_WidgetBoolValue(theParent, myWidgetApi, myParentId);
-
-  } else if (theType == WDG_DOUBLEVALUE_EDITOR) {
-    result = new ModuleBase_WidgetEditor(theParent, myWidgetApi, myParentId);
-
+  //} else if (theType == WDG_DOUBLEVALUE_EDITOR) {
+  //  result = new ModuleBase_WidgetEditor(theParent, myWidgetApi, myParentId);
   } else if (theType == WDG_FILE_SELECTOR) {
     result = new ModuleBase_WidgetFileSelector(theParent, myWidgetApi, myParentId);
-
   } else if (theType == WDG_CHOICE) {
-    result = new ModuleBase_WidgetChoice(theParent, myWidgetApi,myParentId);
-
+    result = new ModuleBase_WidgetChoice(theParent, myWidgetApi, myParentId);
   } else if (theType == WDG_STRINGVALUE) {
-    result = new ModuleBase_WidgetLineEdit(theParent, myWidgetApi,myParentId);
-
+    std::string aPlaceHolder = myWidgetApi->getProperty( WDG_PLACE_HOLDER );
+    result = new ModuleBase_WidgetLineEdit( theParent, myWidgetApi, myParentId, aPlaceHolder );
+  } else if (theType == WDG_EXPR_EDITOR) {
+    std::string aPlaceHolder = myWidgetApi->getProperty( WDG_PLACE_HOLDER );
+    result = new ModuleBase_WidgetExprEditor( theParent, myWidgetApi, myParentId, aPlaceHolder );
   } else if (theType == WDG_MULTISELECTOR) {
-    result = new ModuleBase_WidgetMultiSelector(theParent, myWorkshop, myWidgetApi,myParentId);
-
+    result = new ModuleBase_WidgetMultiSelector(theParent, myWorkshop, myWidgetApi, myParentId);
   } else if (theType == WDG_TOOLBOX) {
     result = new ModuleBase_WidgetToolbox(theParent, myWidgetApi, myParentId);
-
   } else if (theType == WDG_SWITCH) {
     result = new ModuleBase_WidgetSwitch(theParent, myWidgetApi, myParentId);
-    return result;
-
-  } else if (theType == WDG_TOOLBOX_BOX || theType == WDG_SWITCH_CASE) {
+  } else if (theType == WDG_TOOLBOX_BOX || theType == WDG_SWITCH_CASE ||
+             theType == NODE_VALIDATOR) {
     // Do nothing for "box" and "case"
     result = NULL;
   } else {
-    result = myWorkshop->module()->createWidgetByType(theType, theParent, myWidgetApi,
-                                                      myParentId);
-#ifdef _DEBUG
-    if (!result) {qDebug("ModuleBase_WidgetFactory::fillWidget: find bad widget type");}
-#endif
+    result = myWorkshop->module()->createWidgetByType(theType, theParent, myWidgetApi, myParentId);
+    if (!result)
+      result = ModuleBase_WidgetCreatorFactory::get()->createWidgetByType(theType, theParent,
+                                                              myWidgetApi, myParentId, myWorkshop);
+    #ifdef _DEBUG
+    if (!result) {
+      qDebug("ModuleBase_WidgetFactory::fillWidget: find bad widget type %s", theType.c_str());
+    }
+    #endif
   }
-  if (result) {
+  if (result)
     myModelWidgets.append(result);
-  }
   return result;
 }