123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- #include <kopano/platform.h>
- #include "ConsoleTable.h"
- #include <algorithm>
- #include <iostream>
- using namespace std;
- namespace KC {
- ConsoleTable::ConsoleTable(size_t rows, size_t columns) : m_iRows(rows), m_iColumns(columns)
- {
- m_nRow = 0;
- m_vTable.resize(rows);
- for (size_t i = 0; i < rows; ++i)
- m_vTable[i].resize(columns);
- m_vMaxLengths.resize(m_iColumns);
- m_vHeader.resize(m_iColumns);
- bHaveHeader = false;
- }
- void ConsoleTable::Clear()
- {
-
- m_vTable.resize(0);
- m_vTable.resize(m_iRows);
- for (size_t i = 0; i < m_iRows; ++i)
- m_vTable[i].resize(m_iColumns);
- m_vMaxLengths.clear();
- m_vHeader.clear();
- m_nRow = 0;
- bHaveHeader = false;
- }
- void ConsoleTable::Resize(size_t rows, size_t columns)
- {
- m_nRow = 0;
- bHaveHeader = false;
- m_iRows = rows;
- m_iColumns = columns;
- m_vTable.resize(rows);
- for (size_t i = 0; i < rows; ++i)
- m_vTable[i].resize(columns);
- m_vMaxLengths.resize(m_iColumns);
- m_vHeader.resize(m_iColumns);
- }
- bool ConsoleTable::SetHeader(size_t col, const string& entry)
- {
- size_t len;
- if (col >= m_iColumns)
- return false;
- m_vHeader[col] = m_converter.convert_to<wstring>(CHARSET_WCHAR, entry, entry.length(), CHARSET_CHAR);
- len = entry.length();
- if (len > m_vMaxLengths[col])
- m_vMaxLengths[col] = len;
- bHaveHeader = true;
- return true;
- }
- bool ConsoleTable::AddColumn(size_t col, const string& entry)
- {
- if (col >= m_iColumns)
- return false;
- if (m_nRow >= m_iRows) {
- PrintTable();
- Clear();
- }
- SetColumn(m_nRow, col, entry);
- return true;
- }
- bool ConsoleTable::SetColumn(size_t row, size_t col, const string& entry)
- {
- size_t len;
- if (col >= m_iColumns || row >= m_iRows)
- return false;
-
- m_vTable[row][col] = m_converter.convert_to<wstring>(CHARSET_WCHAR, entry, entry.length(), CHARSET_CHAR);
- len = m_vTable[row][col].length();
- if (len > m_vMaxLengths[col])
- m_vMaxLengths[col] = len;
- m_nRow = row;
- if (col+1 == m_iColumns)
- ++m_nRow;
- return true;
- }
- void ConsoleTable::PrintRow(const vector<wstring>& vRow)
- {
- size_t nCol = 0;
- size_t longest, ntabs;
- cout << '\t';
- for (const auto &col : vRow) {
-
- printf("%ls\t", col.c_str());
- if (nCol+1 < m_iColumns) {
- longest = ((m_vMaxLengths[nCol] /8) +1);
- ntabs = longest - ((col.length() / 8) + 1);
- cout << string(ntabs, '\t');
- }
- ++nCol;
- }
- cout << endl;
- }
- void ConsoleTable::DumpRow(const vector<wstring>& vRow)
- {
- size_t nCol = 0;
- for (const auto &col : vRow) {
- std::wstring temp = col;
- std::replace(temp.begin(), temp.end(), '\n', ' ');
-
- printf("%ls", temp.c_str());
- if (nCol + 1 < m_iColumns)
- printf(";");
- ++nCol;
- }
- printf("\n");
- }
- void ConsoleTable::PrintTable()
- {
- if (bHaveHeader) {
- PrintRow(m_vHeader);
- size_t total = 0;
- for (size_t nCol = 0; nCol < m_iColumns; ++nCol)
- total += m_vMaxLengths[nCol];
- total += (m_iColumns -1) * 8;
- cout << "\t" << string(total, '-') << endl;
- }
- for (size_t nRow = 0; nRow < m_nRow; ++nRow)
- PrintRow(m_vTable[nRow]);
- }
- void ConsoleTable::DumpTable()
- {
- if (bHaveHeader) {
- DumpRow(m_vHeader);
- }
- for (size_t nRow = 0; nRow < m_nRow; ++nRow)
- DumpRow(m_vTable[nRow]);
- }
- }
|