Salome HOME
Remove QT4 compatibility.
[modules/yacs.git] / src / genericgui / EditionScript.cxx
index 55860cb5bdad35f481d8f9c6ec63d1247542278d..220b895f6717c68aa9b96872384067a872fe2b1e 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2006-2014  CEA/DEN, EDF R&D
+// Copyright (C) 2006-2019  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 #include "FormContainer.hxx"
 #include "Message.hxx"
 
-#if HAS_QSCI4>0
-#include <qsciscintilla.h>
-#include <qscilexerpython.h>
+#ifdef HAS_PYEDITOR
+#include <PyEditor_Editor.h>
+#include <PyEditor_Settings.h>
 #endif
 
+#include <QToolButton>
 #include <QSplitter>
 #include <QTemporaryFile>
 #include <QTextStream>
@@ -45,31 +46,6 @@ using namespace std;
 using namespace YACS;
 using namespace YACS::HMI;
 
-#if HAS_QSCI4>0
-class myQsciScintilla: public QsciScintilla
-{
-public:
-  myQsciScintilla(QWidget *parent=0)
-    : QsciScintilla(parent) {};
-  ~myQsciScintilla(){};
-  virtual QSize sizeHint() const { return QSize(350, 150); };
-protected:
-  virtual bool event(QEvent *e);
-};
-
-bool myQsciScintilla::event(QEvent *e)
-{
-  if (e->type() == QEvent::ShortcutOverride)
-    {
-      e->accept();
-      return true;
-    }
-  return QsciScintilla::event(e);
-}
-
-#endif
-
-
 EditionScript::EditionScript(Subject* subject,
                          QWidget* parent,
                          const char* name)
@@ -97,6 +73,36 @@ EditionScript::EditionScript(Subject* subject,
   _glayout->setMargin(1);
   splitter->addWidget(window);
 
+  //add an options section in ports layout for execution mode (local or remote)
+  QHBoxLayout* hboxLayout = new QHBoxLayout();
+  hboxLayout->setMargin(0);
+  QToolButton* tb_options = new QToolButton();
+  tb_options->setCheckable(true);
+  QIcon icon;
+  icon.addFile("icons:icon_down.png");
+  icon.addFile("icons:icon_up.png", QSize(), QIcon::Normal, QIcon::On);
+  tb_options->setIcon(icon);
+  hboxLayout->addWidget(tb_options);
+
+  QLabel* label = new QLabel("Execution Mode");
+  QFont font;
+  font.setBold(true);
+  font.setWeight(75);
+  label->setFont(font);
+  hboxLayout->addWidget(label);
+
+  _portslayout->addLayout(hboxLayout);
+
+  fr_options = new QFrame();
+  QHBoxLayout* hboxLayout1 = new QHBoxLayout(fr_options);
+  hboxLayout1->setMargin(0);
+  radiolocal= new QRadioButton("YACS");
+  radioremote= new QRadioButton("Container");
+  radiolocal->setChecked(true);
+  hboxLayout1->addWidget(radiolocal);
+  hboxLayout1->addWidget(radioremote);
+  hboxLayout->addWidget(fr_options);
+
   fr_container = new QFrame();
   QHBoxLayout* hboxLayout2 = new QHBoxLayout(fr_container);
   hboxLayout2->setMargin(0);
@@ -106,17 +112,20 @@ EditionScript::EditionScript(Subject* subject,
   hboxLayout2->addWidget(cb_container);
   _portslayout->addWidget(fr_container);
 
-  formcontainer = new FormContainer(this);
-  formcontainer->on_tb_container_toggled(false);
+  //
+  YACS::ENGINE::InlineNode *pyNode(dynamic_cast<YACS::ENGINE::InlineNode*>(_subInlineNode->getNode()));
+  YACS::ENGINE::Container *cont(pyNode->getContainer());
+  formcontainer = new FormContainerDecorator(cont,this);
   _portslayout->addWidget(formcontainer);
+  //_portslayout->addWidget(formcontainer->getWidget());
   //end of insertion of execution mode
 
   createTablePorts(_portslayout);
   setEditablePorts(true);
 
   _haveScript = true;
-#if HAS_QSCI4>0
-  _sci = new myQsciScintilla(this);
+#ifdef HAS_PYEDITOR
+  _sci = new PyEditor_Editor(this);
 #else
   _sci = new QTextEdit(this);
 #endif
@@ -130,22 +139,6 @@ EditionScript::EditionScript(Subject* subject,
     }
   _glayout->addWidget( _sci );
 
-#if HAS_QSCI4>0
-  _sci->setUtf8(1);
-  QsciLexerPython *lex = new QsciLexerPython(_sci);
-  lex->setFont(Resource::pythonfont);
-  _sci->setLexer(lex);
-  _sci->setBraceMatching(QsciScintilla::SloppyBraceMatch);
-  _sci->setAutoIndent(1);
-  _sci->setIndentationWidth(4);
-  _sci->setIndentationGuides(1);
-  _sci->setIndentationsUseTabs(0);
-  _sci->setAutoCompletionThreshold(2);
-  //_sci->setMarginLineNumbers(1,true);
-  _sci->setMarginWidth(1,0);
-  _sci->setFolding(QsciScintilla::PlainFoldStyle);
-#endif
-
   if (!QtGuiContext::getQtCurrent()->isEdition())
     _sci->setReadOnly(true);
 
@@ -156,11 +149,13 @@ EditionScript::EditionScript(Subject* subject,
     }
   connect(_sci, SIGNAL(textChanged()), this, SLOT(onScriptModified()));
 
+  connect(tb_options, SIGNAL(toggled(bool)), this, SLOT(on_tb_options_toggled(bool)));
+  connect(radioremote, SIGNAL(toggled(bool)), this, SLOT(on_remote_toggled(bool)));
   connect(cb_container, SIGNAL(mousePressed()), this, SLOT(fillContainerPanel()));
   connect(cb_container, SIGNAL(activated(int)), this, SLOT(changeContainer(int)));
 
   update(UPDATE,0,0);
-  changeContainer(0);
+  on_tb_options_toggled(false);
 }
 
 EditionScript::~EditionScript()
@@ -186,8 +181,10 @@ void EditionScript::onApply()
 {
   DEBTRACE("EditionScript::onApply");
   bool scriptEdited = false;
-#if HAS_QSCI4>0
-  _sci->lexer()->setFont(Resource::pythonfont);
+#ifdef HAS_PYEDITOR
+  PyEditor_Settings settings = _sci->settings();
+  settings.setFont(Resource::pythonfont);
+  _sci->setSettings(settings);
 #endif
 
   if(Resource::pythonExternalEditor.isEmpty())
@@ -204,17 +201,6 @@ void EditionScript::onApply()
 
   if (_haveScript)
     {
-#if HAS_QSCI4>0
-      if (_sci->isModified())
-        {
-          scriptEdited = true;
-          std::string text=_sci->text().toStdString();
-          if(text[text.length()-1] != '\n')
-            text=text+'\n';
-          bool ret = _subInlineNode->setScript(text);
-          if (ret) scriptEdited = false;
-        }
-#else
       if (_sci->document()->isModified())
         {
           scriptEdited = true;
@@ -224,7 +210,6 @@ void EditionScript::onApply()
           bool ret = _subInlineNode->setScript(text);
           if (ret) scriptEdited = false;
         }
-#endif
     }
 
   bool containerEdited = true;
@@ -264,11 +249,7 @@ void EditionScript::onEdit()
     return;
   QString fileName = outFile.fileName();
   QTextStream out(&outFile);
-#if HAS_QSCI4>0
-  out << _sci->text();
-#else
   out << _sci->toPlainText();
-#endif
   outFile.close();
 
   QStringList options=Resource::pythonExternalEditor.split(" ");
@@ -279,14 +260,58 @@ void EditionScript::onEdit()
   if (!inFile.open(QIODevice::ReadOnly))
     return;
   QTextStream in(&inFile);
-#if HAS_QSCI4>0
-  _sci->setText(in.readAll());
-#else
   _sci->setPlainText(in.readAll());
-#endif
   onApply();
 }
 
+void EditionScript::on_tb_options_toggled(bool checked)
+{
+  DEBTRACE("EditionScript::on_tb_options_toggled " << checked);
+  _checked = checked;
+  if(_checked)
+    {
+      fr_options->show();
+      if(_remote)
+        {
+          fr_container->show();
+          formcontainer->show();
+        }
+    }
+  else
+    {
+      fr_options->hide();
+      fr_container->hide();
+      formcontainer->hide();
+    }
+}
+
+void EditionScript::on_remote_toggled(bool checked)
+{
+  DEBTRACE("EditionScript::on_remote_toggled " << checked);
+  _remote=checked;
+  YACS::ENGINE::InlineNode *pyNode = dynamic_cast<YACS::ENGINE::InlineNode*>(_subInlineNode->getNode());
+  std::string mode = pyNode->getExecutionMode();
+  DEBTRACE(mode);
+
+  if(checked)
+    {
+      //remote radio button is checked
+      if(mode != "remote")
+        _subInlineNode->setExecutionMode("remote");
+      fr_container->show();
+      formcontainer->show();
+      fillContainerPanel();
+    }
+  else
+    {
+      //remote radio button is unchecked
+      if(mode != "local")
+        _subInlineNode->setExecutionMode("local");
+      fr_container->hide();
+      formcontainer->hide();
+    }
+}
+
 void EditionScript::fillContainerPanel()
 {
   DEBTRACE("EditionScript::fillContainerPanel ");
@@ -305,7 +330,10 @@ void EditionScript::fillContainerPanel()
       int index = cb_container->findText(cont->getName().c_str());
       cb_container->setCurrentIndex(index);
       formcontainer->FillPanel(cont);
-    }
+    } 
+  else if (cb_container->count()) {
+    changeContainer(0);
+  }
 }
 
 void EditionScript::changeContainer(int index)
@@ -326,7 +354,7 @@ void EditionScript::changeContainer(int index)
       return;
     }
   YASSERT(GuiContext::getCurrent()->_mapOfSubjectContainer.count(newContainer));
-  SubjectContainer *scnt = GuiContext::getCurrent()->_mapOfSubjectContainer[newContainer];
+  SubjectContainerBase *scnt(GuiContext::getCurrent()->_mapOfSubjectContainer[newContainer]);
 
   _subInlineNode->setContainer(scnt);
   
@@ -347,6 +375,19 @@ void EditionScript::update(GuiEvent event, int type, Subject* son)
     }
   else if(event == UPDATE)
     {
+      YACS::ENGINE::InlineNode *pyNode = dynamic_cast<YACS::ENGINE::InlineNode*>(_subInlineNode->getNode());
+      std::string mode = pyNode->getExecutionMode();
+      if(mode == "remote")
+        {
+          _remote=true;
+          radioremote->setChecked(true);
+        }
+      else if(mode == "local")
+        {
+          _remote=false;
+          radiolocal->setChecked(true);
+        }
+
       fillContainerPanel();
     }
 }