// // aegis - project change supervisor // Copyright (C) 1999, 2002, 2005, 2006, 2008, 2012 Peter Miller // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see // . // #ifndef LIBAEGIS_COL_PRETTY_H #define LIBAEGIS_COL_PRETTY_H #include #include #include /** * The col_pretty class is used to represent multi-column output with * line wrap around the column values, and formatting across multiple * lines. */ class col_pretty: public col { public: /** * The destructor. */ virtual ~col_pretty(); private: /** * The constructor. Its is private on pupose, use the #create * class method instead. * * @param deeper * The output stream upon which to write the columnar output. */ col_pretty(const wide_output::pointer &deeper); public: /** * The create class method is used to create new dynamically * allocated instances of this class. * * @param deeper * The output stream upon which to write the columnar output. */ static pointer create(const wide_output::pointer &deeper); protected: // See base class for documentation. output::pointer create(int left, int right, const char *title); // See base class for documentation. void title(const nstring &first, const nstring &second); // See base class for documentation. void eoln(); // See base class for documentation. void need(int n); // See base class for documentation. void eject(); // See base class for documentation. void flush(); // See base class for documentation. void forget(const output::pointer &op); private: wide_output::pointer deeper; bool need_to_emit_headers; size_t ncolumns; size_t ncolumns_max; struct column_ty { ~column_ty(); column_ty(); column_ty(const column_ty &); column_ty &operator=(const column_ty &); wide_output_column::cpointer header; wide_output_column::cpointer content; output::pointer content_filter; int left; int right; void clear(); }; column_ty *column; struct emit_ty { emit_ty() : left(0) { } wide_output_column::cpointer content; int left; }; /** * The emit method is used to emit the given values of text out * of the deeper output stream. The emitting is factored into this * common method, rather than reproduce the code twice, once * for the headers and again for the content. */ void emit(size_t argc, emit_ty *argv, int minlines, bool is_the_header); /** * The emit_header method is used to emit column headers when * necessary. It clears the flag which controls emitting the * headers, too. */ void emit_header(); /** * The emit_content method is used to generate the output, given * the content written and formatted via the wide output streams * privide by create (below). * * Usually, the column headers are handled by the top-of-page * callback, however if new columns with headers are created in the * middle of the page, this method also causes the new column * headings to be emitted, before the content. */ void emit_content(); /** * The default constructor. Do not use. */ col_pretty(); /** * The copy constructor. Do not use. */ col_pretty(const col_pretty &); /** * The assignment operator. Do not use. */ col_pretty &operator=(const col_pretty &); }; #endif // LIBAEGIS_COL_PRETTY_H // vim: set ts=8 sw=4 et :