Hmm, do we want this here where it affects both the multiple-label controls case as well as the textbox, or just for the textbox?

I don't really have a preference to be honest - at worse it'll mean slightly "bad" spacing in the multiple-label controls case, but as we're removing that anyway, it's not really an issue?

I'd also be tempted to factor out the code in SetText() to a new function SetText(const std::string &text); that does the cleanup to save doing it in two spots (i.e. the current SetText/SetLine would call the new SetText() which sets m_text, performs a Trim() and then SetInvalid())