diff --git a/src/columns/ColUDA.cpp b/src/columns/ColUDA.cpp index fb003c8bb..9f00cc895 100644 --- a/src/columns/ColUDA.cpp +++ b/src/columns/ColUDA.cpp @@ -57,6 +57,23 @@ ColumnUDA::~ColumnUDA () { } +//////////////////////////////////////////////////////////////////////////////// +bool ColumnUDA::validate (std::string& value) +{ + // No restrictions. + if (_values.size () == 0) + return true; + + // Look for exact match value. + std::vector ::iterator i; + for (i = _values.begin (); i != _values.end (); ++i) + if (*i == value) + return true; + + // Fail if not found. + return false; +} + //////////////////////////////////////////////////////////////////////////////// // Set the minimum and maximum widths for the value. // diff --git a/src/columns/ColUDA.h b/src/columns/ColUDA.h index 7a8e13e12..29ff9a80b 100644 --- a/src/columns/ColUDA.h +++ b/src/columns/ColUDA.h @@ -41,9 +41,13 @@ public: ColumnUDA (); ~ColumnUDA (); + bool validate (std::string&); void measure (Task&, int&, int&); void render (std::vector &, Task&, int, Color&); +public: + std::vector _values; + private: bool _hyphenate; }; diff --git a/src/columns/Column.cpp b/src/columns/Column.cpp index ba131f3bf..599116e28 100644 --- a/src/columns/Column.cpp +++ b/src/columns/Column.cpp @@ -181,7 +181,7 @@ void Column::uda (std::map & all) //////////////////////////////////////////////////////////////////////////////// Column* Column::uda (const std::string& name) { - Column* c = new ColumnUDA (); + ColumnUDA* c = new ColumnUDA (); c->_name = name; std::string key = "uda." + name + ".type"; @@ -195,6 +195,11 @@ Column* Column::uda (const std::string& name) key = "uda." + name + ".label"; if (context.config.get (key) != "") c->_label = context.config.get (key); + + key = "uda." + name + ".values"; + if (context.config.get (key) != "") + split (c->_values, context.config.get (key), ','); + return c; } diff --git a/src/commands/Command.cpp b/src/commands/Command.cpp index cc29f234a..61b83b7f2 100644 --- a/src/commands/Command.cpp +++ b/src/commands/Command.cpp @@ -596,7 +596,12 @@ void Command::modify_task ( // By default, just add/remove it. else - task.set (name, value); + { + if (column->validate (value)) + task.set (name, value); + else + throw format (STRING_INVALID_MOD, name, value); + } // Warn about deprecated/obsolete attribute usage. legacyAttributeCheck (name); diff --git a/src/en-US.h b/src/en-US.h index 0b63168fb..104168c31 100644 --- a/src/en-US.h +++ b/src/en-US.h @@ -683,6 +683,7 @@ #define STRING_INFINITE_LOOP "Terminated substitution because more than {1} changes were made - infinite loop protection." #define STRING_UDA_TYPE "User defined attributes may only be of type 'string', 'date', 'duration' or 'numeric'." #define STRING_UDA_NUMERIC "The value '{1}' is not a valid numeric value." +#define STRING_INVALID_MOD "The '{1}' attribute does not allow a value of '{2}'." // Feedback #define STRING_FEEDBACK_NO_TASKS "No tasks."