17 #include <QtGui/QLabel>
18 #include <QtGui/QComboBox>
20 #include <QtGui/QKeyEvent>
43 std::ostream &
operator<<(std::ostream &os,
const QTextCursor & d)
45 os <<
"Position: " << d.position() << std::endl;
46 os <<
"Selection Start: " << d.selectionStart() << std::endl;
47 os <<
"Selection End: " << d.selectionEnd() << std::endl;
48 os <<
"Anchor: " << d.anchor() << std::endl;
49 os <<
"Selected Text: " <<
TO_UTF8(d.selectedText()) << std::endl;
56 : QSyntaxHighlighter(ew),
81 CQValidator< QTextEdit >(parent, &QTextEdit::toPlainText, name),
85 assert(pDataModel != NULL);
103 if (pExpressionWidget != NULL)
106 const_cast< CExpression * >(&
mExpression)->compile())
133 CQValidator< QTextEdit >(parent, &QTextEdit::toPlainText, name),
137 assert(pDataModel != NULL);
151 State CurrentState = Invalid;
156 if (pExpressionWidget != NULL)
158 std::string Infix = pExpressionWidget->
getFunction();
162 (const_cast< CFunction * >(&
mFunction)->setInfix(Infix) &&
163 const_cast< CFunction * >(&
mFunction)->compile()))
170 if (CurrentState != Acceptable)
173 CurrentState = Intermediate;
196 mpValidatorExpression(NULL),
197 mpValidatorFunction(NULL),
198 mObjectClasses(TransientExpression),
199 mpCurrentObject(NULL)
201 setObjectName(QString::fromUtf8(name));
202 setTabChangesFocus(
true);
215 connect(
this, SIGNAL(textChanged()),
243 std::vector<std::vector<std::string> > params;
251 std::vector<std::vector<std::string> > params;
258 std::vector<std::vector<std::string> > params;
269 QTextEdit::mouseReleaseEvent(e);
280 mCursor.setPosition(Left, QTextCursor::KeepAnchor);
289 mCursor.setPosition(Right, QTextCursor::KeepAnchor);
297 QString SelectedText = textCursor().selectedText();
299 QTextEdit::dropEvent(e);
304 if (
objectBoundaries(textCursor().position() - SelectedText.length(), Left, Right))
309 mCursor.setPosition(
mCursor.position() - SelectedText.length(), QTextCursor::KeepAnchor);
312 int CurrentPosition =
mCursor.position();
317 if (CurrentPosition - Left < Right - CurrentPosition)
326 mCursor.insertText(SelectedText);
337 if (e == QKeySequence::SelectNextChar && !isAdvancedEditing)
340 mCursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor);
344 mCursor.setPosition(Right - 1, QTextCursor::KeepAnchor);
348 QTextEdit::keyPressEvent(e);
353 if (e == QKeySequence::SelectPreviousChar && !isAdvancedEditing)
356 mCursor.movePosition(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor);
360 mCursor.setPosition(Left + 1, QTextCursor::KeepAnchor);
364 QTextEdit::keyPressEvent(e);
371 case Qt::Key_Backspace:
373 if (isAdvancedEditing)
break;
377 if (
mCursor.selectedText().isEmpty())
379 mCursor.movePosition(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor);
383 mCursor.setPosition(Left + 1, QTextCursor::KeepAnchor);
390 QTextEdit::keyPressEvent(e);
397 if (isAdvancedEditing)
break;
401 if (
mCursor.selectedText().isEmpty())
403 mCursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor);
407 mCursor.setPosition(Right - 1, QTextCursor::KeepAnchor);
414 QTextEdit::keyPressEvent(e);
421 if (isAdvancedEditing)
break;
426 mCursor.movePosition(QTextCursor::PreviousCharacter);
430 mCursor.setPosition(Left + 1, QTextCursor::KeepAnchor);
434 QTextEdit::keyPressEvent(e);
441 if (isAdvancedEditing)
break;
446 mCursor.movePosition(QTextCursor::NextCharacter);
450 mCursor.setPosition(Right - 1, QTextCursor::KeepAnchor);
454 QTextEdit::keyPressEvent(e);
459 case Qt::Key_BraceLeft:
460 case Qt::Key_BraceRight:
462 if (isAdvancedEditing)
break;
469 if (!e->text().isEmpty())
473 f.setForeground(QColor(0, 0, 0));
475 setCurrentCharFormat(f);
476 QTextEdit::keyPressEvent(e);
481 QTextEdit::keyPressEvent(e);
499 QString Input = toPlainText();
501 emit
valid(pValidator->
validate(Input, pos) == QValidator::Acceptable);
508 int Index = ObjectDisplayPattern.indexIn(toPlainText());
510 while (0 <= Index && Index <= position)
513 Index += ObjectDisplayPattern.matchedLength();
516 if (left < position && position < right)
521 Index = ObjectDisplayPattern.indexIn(toPlainText(), Index);
544 f1.setForeground(QColor(0, 0, 0));
546 setCurrentCharFormat(f1);
571 assert(pDataModel != NULL);
572 std::vector<CCopasiContainer*> containers;
573 containers.push_back(pDataModel);
574 containers.push_back(pFunDB);
576 const QString Infix(
FROM_UTF8(expression));
582 QString::const_iterator it = Infix.begin();
583 QString::const_iterator end;
587 Index = InfixObjectPattern.indexIn(Infix, Index);
595 end = Infix.begin() + Index;
599 for (; it != end; ++it)
604 if (InfixObjectPattern.matchedLength() < 0)
607 Index += InfixObjectPattern.matchedLength();
608 it += InfixObjectPattern.matchedLength();
618 std::string::size_type pos = DisplayName.find_first_of(
"\\}");
620 while (pos != std::string::npos)
622 DisplayName.insert(pos,
"\\");
624 pos = DisplayName.find_first_of(
"\\}", pos);
629 Display +=
'{' +
FROM_UTF8(DisplayName) +
'}';
633 std::string DisplayName = InfixName;
636 std::string::size_type pos = DisplayName.find_first_of(
"\\}");
638 while (pos != std::string::npos)
640 DisplayName.insert(pos,
"\\");
642 pos = DisplayName.find_first_of(
"\\}", pos);
645 Display +=
'{' +
FROM_UTF8(DisplayName) +
'}';
657 if (dataModel == NULL || displayString.empty())
return NULL;
661 if (displayString ==
"Time")
return model;
663 if (displayString ==
"Avogadro Constant")
return dynamic_cast<const CCopasiObject*
>(model->
getObject(
"Reference=" + displayString));
665 if (displayString ==
"Quantity Conversion Factor")
return dynamic_cast<const CCopasiObject*
>(model->
getObject(
"Reference=" + displayString));
667 size_t pos = displayString.find(
"Compartments[");
669 if (pos != std::string::npos)
699 pos = displayString.find(
"Values[");
701 if (pos != std::string::npos)
737 const CMetab *current = *it;
782 const QString Display(toPlainText());
787 QString::const_iterator it = Display.begin();
788 QString::const_iterator end;
792 Index = DisplayObjectPattern.indexIn(Display, Index);
800 end = Display.begin() + Index;
804 for (; it != end; ++it)
809 if (DisplayObjectPattern.matchedLength() < 0)
812 Index += DisplayObjectPattern.matchedLength();
813 it += DisplayObjectPattern.matchedLength();
815 std::string DisplayName(
TO_UTF8(DisplayObjectPattern.cap(1)));
816 std::map< std::string, const CCopasiObject *>::const_iterator itObject =
mParseList.find(DisplayName);
824 std::string::size_type bsPos = DisplayName.find(
"\\}");
826 if (bsPos != std::string::npos)
827 DisplayName.erase(bsPos, 1);
842 Infix +=
"<" +
FROM_UTF8(itObject->second->getCN()) +
">";
848 std::string CN =
TO_UTF8(DisplayObjectPattern.cap(1));
849 std::string::const_iterator it = CN.begin();
850 std::string::const_iterator end = CN.end();
852 for (; it < end; ++it)
906 "The use of the selected object is not allowed in this type of expression.");
913 std::string::size_type pos = Insert.find_first_of(
"}");
915 while (pos != std::string::npos)
917 Insert.insert(pos,
"\\");
919 pos = Insert.find_first_of(
"}", pos);
925 f1.setForeground(QColor(0, 0, 0));
930 setCurrentCharFormat(f);
931 insertPlainText(
FROM_UTF8(
"{" + Insert +
"}"));
932 setCurrentCharFormat(f1);
Header file of class CExpression.
CCopasiDataModel * getObjectDataModel()
virtual bool setObjectParent(const CCopasiContainer *pParent)
CQValidatorFunction(QTextEdit *parent, const char *name=0)
virtual std::string getObjectDisplayName(bool regular=true, bool richtext=false) const
CQExpressionHighlighter(CQExpressionWidget *ew)
static const char * Infix[]
void highlightBlock(const QString &text)
const CCopasiVector< CMetab > & getMetabolites() const
virtual std::string writeMathML(const std::vector< std::vector< std::string > > &variables, bool expand=true, bool fullExpand=true) const
const CCopasiVectorN< CModelValue > & getModelValues() const
CCopasiObject * getInitialValueReference() const
virtual CExpression * getExpression()
QRegExp mObjectDisplayPattern
virtual ~CQExpressionHighlighter()
virtual CFunction * getFunction()
virtual State validate(QString &input, int &pos) const
void setIsBoolean(const bool &booleanRequired)
The class for highlighting the expression syntax.
static bool filter(const ObjectClasses &classes, const CCopasiObject *pObject)
static CConfigurationFile * getConfiguration()
virtual void saved() const
bool useAdvancedEditing() const
virtual State revalidate()
virtual std::string getObjectDisplayName(bool regular=true, bool richtext=false) const
void stateChanged(bool) const
virtual void writeMathML(std::ostream &out, size_t l=0) const
QString(QTextEdit::* mRetrieve)(void) const
QTextCharFormat mObjectDisplayFormat
static CCopasiVector< CCopasiDataModel > * getDatamodelList()
void createListOfParametersForMathML(std::vector< std::vector< std::string > > &env)
static CFunctionDB * getFunctionList()
CCopasiVectorNS< CCompartment > & getCompartments()
Header file of class CArrayAnnotation.
virtual State validate(QString &input, int &pos) const
void setBooleanRequired(bool booleanRequired)
static StandardButton critical(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons=Ok, StandardButton defaultButton=NoButton)
CQValidatorExpression(QTextEdit *parent, const char *name=0, bool isBoolean=false)
The class for handling a chemical kinetic function.
void writeMathML(std::ostream &out, bool fullExpand, size_t l) const
virtual const CObjectInterface * getObject(const CCopasiObjectName &cn) const
virtual State validate(QString &input, int &) const
CCopasiObject * getRateReference() const
CCopasiObject * ObjectFromName(const std::vector< CCopasiContainer * > &listOfContainer, const CCopasiObjectName &CN) const
State setColor(const State &state) const
static const CCopasiObject * getObjectSingle(QWidget *pParent, const CQSimpleSelectionTree::ObjectClasses &classes, const CCopasiObject *pCurrentObject=NULL)
CCopasiObject * getValueReference() const