From c87a2794449b69eec4489b5f291188938e8e3d3c Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Sun, 18 Aug 2013 17:54:18 +0200 Subject: [PATCH] added error reporting in the filter edit widget (change the text colour for now) --- apps/opencs/model/filter/parser.cpp | 50 ++++++++++++++++++++++++-- apps/opencs/model/filter/parser.hpp | 8 +++++ apps/opencs/view/filter/editwidget.cpp | 10 +++++- apps/opencs/view/filter/editwidget.hpp | 2 ++ 4 files changed, 66 insertions(+), 4 deletions(-) diff --git a/apps/opencs/model/filter/parser.cpp b/apps/opencs/model/filter/parser.cpp index 46052cec67..06a974bbe8 100644 --- a/apps/opencs/model/filter/parser.cpp +++ b/apps/opencs/model/filter/parser.cpp @@ -5,6 +5,37 @@ #include "booleannode.hpp" +namespace CSMFilter +{ + struct Token + { + enum Type + { + Type_EOS, + Type_None + }; + + Type mType; + + Token (Type type); + }; + + Token::Token (Type type) : mType (type) {} +} + +CSMFilter::Token CSMFilter::Parser::getNextToken (const std::string& filter, int& index) const +{ + if (index>=static_cast (filter.size())) + return Token (Token::Type_EOS); + + return Token (Token::Type_None); +} + +bool CSMFilter::Parser::isEndState() const +{ + return mState==State_End || mState==State_UnexpectedCharacter; +} + CSMFilter::Parser::Parser() : mState (State_Begin) {} void CSMFilter::Parser::parse (const std::string& filter) @@ -12,11 +43,24 @@ void CSMFilter::Parser::parse (const std::string& filter) // reset mState = State_Begin; mFilter.reset(); + int index = 0; + while (!isEndState()) + { + Token token = getNextToken (filter, index); - // for now we ignore the filter string - mFilter.reset (new BooleanNode (false)); - mState = State_End; + switch (token.mType) + { + case Token::Type_None: mState = State_UnexpectedCharacter; break; + case Token::Type_EOS: mState = State_End; break; + } + } + + if (mState==State_End && !mFilter) + { + // Empty filter string equals to filter "true". + mFilter.reset (new BooleanNode (true)); + } } CSMFilter::Parser::State CSMFilter::Parser::getState() const diff --git a/apps/opencs/model/filter/parser.hpp b/apps/opencs/model/filter/parser.hpp index 72dc7d507d..2d616b9e1b 100644 --- a/apps/opencs/model/filter/parser.hpp +++ b/apps/opencs/model/filter/parser.hpp @@ -7,6 +7,8 @@ namespace CSMFilter { + struct Token; + class Parser { public: @@ -14,6 +16,7 @@ namespace CSMFilter enum State { State_Begin, + State_UnexpectedCharacter, State_End }; @@ -22,6 +25,11 @@ namespace CSMFilter State mState; boost::shared_ptr mFilter; + Token getNextToken (const std::string& filter, int& index) const; + + bool isEndState() const; + ///< This includes error states. + public: Parser(); diff --git a/apps/opencs/view/filter/editwidget.cpp b/apps/opencs/view/filter/editwidget.cpp index b8853ffa35..79cbc1dcea 100644 --- a/apps/opencs/view/filter/editwidget.cpp +++ b/apps/opencs/view/filter/editwidget.cpp @@ -4,6 +4,7 @@ CSVFilter::EditWidget::EditWidget (QWidget *parent) : QLineEdit (parent) { + mPalette = palette(); connect (this, SIGNAL (textChanged (const QString&)), this, SLOT (textChanged (const QString&))); } @@ -12,9 +13,16 @@ void CSVFilter::EditWidget::textChanged (const QString& text) mParser.parse (text.toUtf8().constData()); if (mParser.getState()==CSMFilter::Parser::State_End) + { + setPalette (mPalette); emit filterChanged (mParser.getFilter(), ""); + } else { - /// \todo error handling + QPalette palette (mPalette); + palette.setColor (QPalette::Text, Qt::red); + setPalette (palette); + + /// \todo improve error reporting; mark only the faulty part } } \ No newline at end of file diff --git a/apps/opencs/view/filter/editwidget.hpp b/apps/opencs/view/filter/editwidget.hpp index 9c4b1fa161..4e692fc4d8 100644 --- a/apps/opencs/view/filter/editwidget.hpp +++ b/apps/opencs/view/filter/editwidget.hpp @@ -4,6 +4,7 @@ #include #include +#include #include "../../model/filter/parser.hpp" #include "../../model/filter/node.hpp" @@ -15,6 +16,7 @@ namespace CSVFilter Q_OBJECT CSMFilter::Parser mParser; + QPalette mPalette; public: