//----------------------------------------------------------------------------//
void BasicRenderedStringParser::appendRenderedText(RenderedString& rs,
                                                   const String& text) const
{
    size_t cpos = 0;
    // split the given string into lines based upon the newline character
    while (text.length() > cpos)
    {
        // find next newline
        const size_t nlpos = text.find('\n', cpos);
        // calculate length of this substring
        const size_t len =
            ((nlpos != String::npos) ? nlpos : text.length()) - cpos;

        // construct new text component and append it.
        RenderedStringTextComponent rtc(text.substr(cpos, len), d_fontName);
        rtc.setPadding(d_padding);
        rtc.setColours(d_colours);
        rtc.setVerticalFormatting(d_vertAlignment);
        rtc.setAspectLock(d_aspectLock);
        rs.appendComponent(rtc);

        // break line if needed
        if (nlpos != String::npos)
            rs.appendLineBreak();

        // advance current position.  +1 to skip the \n char
        cpos += len + 1;
    }
}
//----------------------------------------------------------------------------//
void BasicRenderedStringParser::handleWindow(RenderedString& rs, const String& value)
{
    RenderedStringWidgetComponent rwc(value);
    rwc.setPadding(d_padding);
    rwc.setVerticalFormatting(d_vertAlignment);
    rwc.setAspectLock(d_aspectLock);
    rs.appendComponent(rwc);
}
//----------------------------------------------------------------------------//
void BasicRenderedStringParser::handleImage(RenderedString& rs, const String& value)
{
    RenderedStringImageComponent ric(
        PropertyHelper<Image*>::fromString(value));
    ric.setPadding(d_padding);
    ric.setColours(d_colours);
    ric.setVerticalFormatting(d_vertAlignment);
    ric.setSize(d_imageSize);
    ric.setAspectLock(d_aspectLock);
    rs.appendComponent(ric);
}
//----------------------------------------------------------------------------//
void appendSubstring(RenderedString& rs,
                     const String& string,
                     const Font* initial_font,
                     const ColourRect* initial_colours)
{
    RenderedStringTextComponent rstc(string, initial_font);

    if (initial_colours)
        rstc.setColours(*initial_colours);

    rs.appendComponent(rstc);
}
//----------------------------------------------------------------------------//
RenderedString DefaultRenderedStringParser::parse(
                                        const String& input_string,
                                        Font* initial_font,
                                        const ColourRect* initial_colours)
{
    RenderedString rs;
    RenderedStringTextComponent rstc(input_string, initial_font);

    if (initial_colours)
        rstc.setColours(*initial_colours);

    rs.appendComponent(rstc);
    return rs;
}