// // C++ Interface: expander // // Description: // // // Author: Jonas B�r (C) 2004 // // Copyright: See COPYING file that comes with this distribution // // #ifndef EXPANDER_H #define EXPANDER_H // class TQString; #include #include #include #include "tstring.h" // #include class ListPanel; class Expander; class Error; typedef TagString_t TagString; typedef TQValueList TagStringList; /** * This holds informations about each parameter */ class exp_parameter { public: exp_parameter() {} inline exp_parameter( TQString desc, TQString pre, bool ness) { _description = desc; _preset = pre; _nessesary = ness; } inline TQString description() const ///< A description of the parameter { return _description; } inline TQString preset() const ///< the default of the parameter { return _preset; } inline bool nessesary() const ///< false if the parameter is optional { return _nessesary; } private: TQString _description; TQString _preset; bool _nessesary; }; #define EXP_FUNC virtual TagString expFunc ( const ListPanel*, const TagStringList&, const bool&, Expander& ) const #define SIMPLE_EXP_FUNC virtual TagString expFunc ( const ListPanel*, const TQStringList&, const bool&, Expander& ) const /** * Abstract baseclass for all expander-functions (which replace placeholder). * A Placeholder is an entry containing the expression, its expanding function and Parameter. * * Not to be created on the heap * * @author Jonas B�r (http://www.jonas-baehr.de) */ class exp_placeholder { public: inline TQString expression() const ///< The placeholder (without '%' or panel-prefix) { return _expression; } inline TQString description() const ///< A description of the placeholder { return _description; } inline bool needPanel() const ///< true if the placeholder needs a panel to operate on { return _needPanel; } inline void addParameter( exp_parameter parameter ) ///< adds parameter to the placeholder { _parameter.append(parameter); } inline int parameterCount() const ///< returns the number of placeholders { return _parameter.count(); } inline const exp_parameter& parameter( int id ) const ///< returns a specific parameter { return _parameter[ id ]; } EXP_FUNC = 0; protected: static void setError(Expander& exp,const Error& e) ; static void panelMissingError(const TQString &s, Expander& exp); static TQStringList splitEach(const TagString& s); static TQStringList fileList(const ListPanel* const panel,const TQString& type,const TQString& mask,const bool ommitPath,const bool useUrl,Expander&,const TQString&); exp_placeholder(); exp_placeholder(const exp_placeholder& p); ~exp_placeholder() { } TQString _expression; TQString _description; TQValueList _parameter; bool _needPanel; }; class Error { public: enum Cause { C_USER, C_SYNTAX, C_WORLD, C_ARGUMENT }; enum Severity { S_OK, S_WARNING, S_ERROR, S_FATAL }; Error() : s_(S_OK) {} Error(Severity s,Cause c,TQString d) : s_(s), c_(c), desc_(d) {} Cause cause() const { return c_; } operator bool() const { return s_!=S_OK; } const TQString& what() const { return desc_; } private: Severity s_; Cause c_; TQString desc_; }; /** * The Expander expands the command of an UserAction by replacing all placeholders by thier current values.@n * Each placeholder begins with a '%'-sign, followed by one char indicating the panel, followed by a command which may have some paramenter enclosed in brackets and also ends with a '%'-sign. * Examples are %aPath% or %rBookmark("/home/jonas/src/krusader_trinity", "yes")%.@n * The panel-indicator has to be either 'a' for the active, 'o' for the other, 'r' for the right, 'l' for the left or '_' for panel-independence. * * Currently sopported are these commands can be ordered in three groups (childs are the parameter in the right order): * - Placeholders for Krusaders panel-data (panel-indicator has to be 'a', 'o', 'r' or 'l') * - @em Path is replaced by the panel's path * - @em Count is replaced by a nomber of * -# Either "All", "Files", "Dirs", "Selected" * . * - @em Filter is preplaced by the panels filter-mask (ex: "*.cpp *.h") * - @em Current is replaced by the current item or, in case of onmultiple="call_each", by each selected item. * -# If "yes", only the filename (without path) is returned * . * - @em List isreplaced by a list of * -# Either "All", "Files", "Dirs", "Selected" * -# A seperator between the items (default: " " [one space]) * -# If "yes", only the filename (without path) is returned * -# (for all but "Selected") a filter-mask (default: "*") * . * . * - Access to panel-dependent, krusader-internal, parameter-needed functions (panel-indicator has to be 'a', 'o', 'r' or 'l') * - @em Select manipulates the selection of the panel * -# A filter-mask (nessesary) * -# Either "Add", "Remove", "Set" (default) * . * - @em Bookmark manipulates the selection of the panel * -# A path or URL (nessesary) * -# If "yes", the location is opend in a new tab * . * . * - Access to panel-independent, krusader-internal, parameter-needed functions (panel-indicator doesn't matter but should be set to '_') * - @em Ask displays a lineedit and is replaced by its return * -# The question (nessesary) * -# A default answer * -# A cation for the popup * . * - @em Clipboard manipulates the system-wide clipboard * -# The string copied to clip (ex: "%aCurrent%") (nessesary) * -# A separator. If set, parameter1 is append with this to the current clipboard content * . * . * . * Since all placeholders are expanded in the order they appear in the command, little one-line-scripts are possible * * @author Jonas B�r (http://www.jonas-baehr.de), Shie Erlich */ class Expander { public: inline static int placeholderCount() ///< returns the number of placeholders { return _placeholder().count(); } inline static const exp_placeholder* placeholder( int id ) { return _placeholder()[ id ]; } /** * This expands a whole commandline * * @param stringToExpand the commandline with the placeholder * @param useUrl true iff the path's should be expanded to an URL instead of an local path * @return a list of all commands */ void expand( const TQString& stringToExpand, bool useUrl ); /** * Returns the list of all commands to be executed, provided that #expand was called * before, and there was no error (see #error). Otherwise, calls #abort * * @return The list of commands to be executed */ const TQStringList& result() const { assert(!error()); return resultList; } /** * Returns the error object of this Expander. You can test whether there was * any error by * \code * if(exp.error()) * error behaviour... * else * no error... * \endcode * * @return The error object */ const Error& error() const { return _err; } protected: /** * This expands a whole commandline by calling for each Placeholder the corresponding expander * * @param stringToExpand the commandline with the placeholder * @param useUrl true if the path's should be expanded to an URL instead of an local path * @return the expanded commanline for the current item */ TagString expandCurrent( const TQString& stringToExpand, bool useUrl ); /** * This function searches for "@EACH"-marks to splitt the string in a list for each %_Each%-item * * @param stringToSplit the string which should be splitted * @return the splitted list */ static TQStringList splitEach( TagString stringToSplit ); /** * @param panelIndicator either '_' for panel-independent placeholders, 'a', 'o', 'r', or 'l' for the active, other (inactive), right or left panel * @return a pointer to the right panel or NULL if no panel is needed. */ static ListPanel* getPanel( const char panelIndicator ,const exp_placeholder*,Expander&); /** * This splits the parameter-string into separate parameter and expands each * @param exp the string holding all parameter * @param useUrl true if the path's should be expanded to an URL instead of an local path * @return a list of all parameter */ TagStringList separateParameter( TQString* const exp, bool useUrl ); /** * This finds the end of a placeholder, taking care of the parameter * @return the position where the placeholder ends */ int findEnd( const TQString& str, int start ); void setError(const Error &e) { _err=e; } friend class exp_placeholder; private: static TQValueList & _placeholder(); Error _err; TQStringList resultList; }; inline void exp_placeholder::setError(Expander& exp,const Error& e) { exp.setError(e); } inline TQStringList exp_placeholder::splitEach(const TagString& s) { return Expander::splitEach(s); } inline exp_placeholder::exp_placeholder() { Expander::_placeholder().push_back(this); } #endif // ifndef EXPANDER_H