79 lines
2.3 KiB
C++
79 lines
2.3 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: wx/private/wordwrap.h
|
|
// Purpose: Simple helper for string word wrapping.
|
|
// Author: Vadim Zeitlin
|
|
// Created: 2024-11-22
|
|
// Copyright: (c) 2024 Vadim Zeitlin <vadim@wxwidgets.org>
|
|
// Licence: wxWindows licence
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _WX_PRIVATE_WORDWRAP_H_
|
|
#define _WX_PRIVATE_WORDWRAP_H_
|
|
|
|
#include "wx/string.h"
|
|
|
|
#include <vector>
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxWordWrap helper for wxCmdLineParser
|
|
// ----------------------------------------------------------------------------
|
|
|
|
inline std::vector<wxString> wxWordWrap(const wxString& text, int widthMax)
|
|
{
|
|
std::vector<wxString> lines;
|
|
|
|
wxString line;
|
|
int lastSpace = -1; // No space in the current line yet.
|
|
for ( auto ch : text )
|
|
{
|
|
// Always honour explicit line breaks.
|
|
if ( ch == '\n' )
|
|
{
|
|
lines.push_back(line);
|
|
line.clear();
|
|
lastSpace = -1;
|
|
}
|
|
else
|
|
{
|
|
const int lineLength = line.length();
|
|
if ( lineLength == widthMax )
|
|
{
|
|
// Can't continue this line.
|
|
if ( lastSpace == -1 )
|
|
{
|
|
// No space in the line, just break it.
|
|
lines.push_back(line);
|
|
line.clear();
|
|
}
|
|
else
|
|
{
|
|
// Break at the last space.
|
|
lines.push_back(line.substr(0, lastSpace));
|
|
|
|
// Also skip all the spaces following it, we don't want to
|
|
// start the new line with spaces.
|
|
while ( lastSpace < lineLength && line[lastSpace] == ' ' )
|
|
lastSpace++;
|
|
|
|
line = line.substr(lastSpace);
|
|
lastSpace = -1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( ch == ' ' )
|
|
lastSpace = line.length();
|
|
}
|
|
|
|
line += ch;
|
|
}
|
|
}
|
|
|
|
if ( !line.empty() )
|
|
lines.push_back(line);
|
|
|
|
return lines;
|
|
}
|
|
|
|
#endif // _WX_PRIVATE_WORDWRAP_H_
|