/* _______________________________________________________________________________ TableGenerator v1.3 ------------------------------------------------------------------------------- Copyright (c) 2007-2010 Kai Braaten Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------- */ #ifndef _TABLESTRATEGY_HPP_ #define _TABLESTRATEGY_HPP_ #include <string> #include <vector> #include <sys/types.h> namespace TableGen { class TableRow; class TableStrategy { public: virtual ~TableStrategy() { }; virtual std::string render( const std::vector< TableRow >&, const std::vector< size_t >& ) = 0; protected: TableStrategy() { }; private: // Disallow copying and assigning TableStrategy( const TableStrategy& ); TableStrategy &operator=( const TableStrategy& ); }; class SimpleTable : public TableStrategy { public: SimpleTable( const int fieldspace = 1, // Padding between fields const int columns = 1, // Number of tables horizontally const int columnspace = 1, // Space between tables const std::string &nl = "\r\n" ); // newline marker virtual std::string render( const std::vector< TableRow >&, const std::vector< size_t >& ); private: int _fieldspace; int _columns; int _columnspace; std::string _newline; }; // Notes: // First row is used for headers. // Numeric fields are justified to the right, others to the left class FramedTable : public TableStrategy { public: FramedTable( int columns = 1, // Number of TABLES stacked horizontally int space = 0, // Add extra padding const std::string &vcol = "", // Field data colour token const std::string &fcol = "", // Frame colour token const std::string &hcol = "", // Header colour token const std::string &fg = "+-|", // Frame graphics characters const std::string &nl = "\r\n" ); // Newline marker virtual std::string render( const std::vector< TableRow >&, const std::vector< size_t >& ); private: int _columns; int _space; std::string _vColour; // values std::string _fColour; // frames std::string _hColour; // headers std::string _frameGfx; std::string _newline; }; class Space3Table : public TableStrategy { public: Space3Table( const std::string &h = "", // Header text const std::string &hcol = "", // Header colour const std::string &vcol = "", // Field data colour const std::string &nl = "\r\n" ); virtual std::string render( const std::vector< TableRow >&, const std::vector< size_t >& ); private: std::string _head; std::string _hColour; std::string _vColour; std::string _newline; }; class ShadowTable : public TableStrategy { public: ShadowTable( const std::string &ht, // Header text const std::string &tc, // Text colour const std::string &fc, // Background fill colour const std::string &sc, // Shadow colour const std::string &st, // Stop colour size_t p = 0, // Inner padding size_t fp = 1, // Field padding size_t ind = 0, // Left border indentation const std::string &cc = "", // Closing colour tag const std::string &nl = "\r\n" ); // newline character(s) virtual std::string render( const std::vector< TableRow >&, const std::vector< size_t >& ); private: ShadowTable(); // Makes no sense to allow default constructor here. const std::string &addColour( const std::string& ); std::string balanceColourTags(); std::string _header; std::string _textColour; std::string _fillColour; std::string _shadowColour; std::string _stopColour; std::string _closeColour; std::string _newline; size_t _padding; size_t _columnPadding; size_t _indentation; unsigned long _depth; }; class HtmlTable : public TableStrategy { public: HtmlTable( bool useHeader = true, // Make first row header unsigned long borderWidth = 0, // Width of table border // Title of HTML page const std::string &pageTitle = "TableGenerator 1.3" ); std::string render( const std::vector< TableRow >&, const std::vector< size_t >& ); private: bool _useHeader; unsigned long _borderWidth; std::string _pageTitle; }; } #endif //include guard