Index: boost/program_options/options_description.hpp =================================================================== --- boost/program_options/options_description.hpp (revision 75427) +++ boost/program_options/options_description.hpp (working copy) @@ -189,6 +189,10 @@ */ options_description& add(const options_description& desc); + /** Find the maximum width of the option column, including options in groups + */ + unsigned get_option_column_width() const; + public: /** Returns an object of implementation-defined type suitable for adding options to options_description. The returned object will @@ -219,8 +223,10 @@ /** Outputs 'desc' to the specified stream, calling 'f' to output each option_description element. */ - void print(std::ostream& os) const; + void print(std::ostream& os, unsigned width = 0) const; + + private: typedef std::map::const_iterator name2index_iterator; typedef std::pair Index: libs/program_options/src/options_description.cpp =================================================================== --- libs/program_options/src/options_description.cpp (revision 75427) +++ libs/program_options/src/options_description.cpp (working copy) @@ -581,12 +581,9 @@ } } - void - options_description::print(std::ostream& os) const + unsigned + options_description::get_option_column_width() const { - if (!m_caption.empty()) - os << m_caption << ":\n"; - /* Find the maximum width of the option column */ unsigned width(23); unsigned i; // vc6 has broken for loop scoping @@ -597,6 +594,11 @@ ss << " " << opt.format_name() << ' ' << opt.format_parameter(); width = (max)(width, static_cast(ss.str().size())); } + + /* Get width of groups as well*/ + for (unsigned j = 0; j < groups.size(); ++j) + width =max(width, groups[j]->get_option_column_width()); + /* this is the column were description should start, if first column is longer, we go to a new line */ const unsigned start_of_description_column = m_line_length - m_min_description_length; @@ -605,6 +607,18 @@ /* add an additional space to improve readability */ ++width; + return width; + } + + void + options_description::print(std::ostream& os, unsigned width) const + { + if (!m_caption.empty()) + os << m_caption << ":\n"; + + if (!width) + width = get_option_column_width(); + /* The options formatting style is stolen from Subversion. */ for (i = 0; i < m_options.size(); ++i) @@ -620,7 +634,8 @@ } for (unsigned j = 0; j < groups.size(); ++j) { - os << "\n" << *groups[j]; + os << "\n"; + groups[j]->print(os, width); } }