cwidget 0.5.18
columnify.h
1// columnify.h -*-c++-*-
2//
3// Copyright 2000, 2005 Daniel Burrows
4// Copyright (C) 2019 Manuel A. Fernandez Montecelo
5//
6// This program is free software; you can redistribute it and/or modify
7// it under the terms of the GNU General Public License as published by
8// the Free Software Foundation; either version 2 of the License, or
9// (at your option) any later version.
10//
11// This program is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15//
16// You should have received a copy of the GNU General Public License
17// along with this program; see the file COPYING. If not, write to
18// the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19// Boston, MA 02111-1307, USA.
20//
21// Support for creating column-formatted strings. Columns which exceed their
22// size limit are truncated. Columns are collected into 'groups', each of
23// which starts at a particular location. This allows things such as
24// right-justification of text. If one column group overlaps another, the
25// conflict is resolved by adjusting the column which is situated farthest to
26// the right (by moving it farther to the right).
27//
28// Right-justification is now handled (somewhat hackily) by columnify; to
29// use it, set the start_off to something negative. The group will be aligned
30// so the the right edge of the column is start_off+1 characters from the
31// right-hand screen edge -- so to align something exactly with the right-hand
32// edge of the screen, set start_off to -1.
33
34#ifndef COLUMNIFY_H
35#define COLUMNIFY_H
36
37#include <list>
38#include <string>
39#include <cwidget/generic/util/eassert.h>
40
41namespace cwidget
42{
44 {
46 std::wstring text;
49 int minx;
50
51 column_disposition(const std::wstring &_text, int _minx) : text(_text), minx(_minx) {}
52
54 column_disposition(const std::string &_text, int _minx,
55 const char *encoding = nullptr);
56 };
57
58 struct column
59 {
61 int width;
62 bool expand, shrink;
63
64 column(const column_disposition &_info, int _width, bool _expand, bool _shrink)
65 : info(_info), width(_width), expand(_expand), shrink(_shrink)
66 {
67 eassert(_width>=0);
68 }
69 };
70
71 typedef std::list<column> layout;
72
73 /* \return a string formatted as requested. The string will be no
74 * wider than width columns. I could probably use printf-style
75 * strings, but with the groups it would probably turn into a major
76 * pain..
77 */
78 std::wstring columnify(const layout &format, int width);
79}
80
81#endif
The namespace containing everything defined by cwidget.
Definition columnify.cc:28
Definition columnify.h:44
std::wstring text
The contents of the columns.
Definition columnify.h:46
int minx
The minimum x value to start this column at (useful for indenting stuff in trees)
Definition columnify.h:49
Definition columnify.h:59