[RESOLVED] TextEditor::setText and TextEditor::textWasChangedByValue()


So I have class members:

TextEditor                  m_Editor;
bool                        m_bIsDirty;

and in the ctor:

m_bIsDirty = false;

m_Editor.setMultiLine (true);
m_Editor.setReturnKeyStartsNewLine (true);
m_Editor.setTabKeyUsedAsCharacter (true);
m_Editor.setPopupMenuEnabled (true);

addAndMakeVisible (m_Editor);

m_Editor.addListener (this);

then I have a method which contains:

MemoryBlock mb;

// yada yada yada

m_Editor.clear();                         // This doesn't trigger a textChanged

m_Editor.setText (mb.toString(), false);  // Note the second param.

m_bIsDirty = false;

and a callback:

void CMyComponent::textEditorTextChanged (TextEditor&)
    m_bIsDirty = true;

The problem is that I’m getting a TextEditor::textChanged() message from:

 void TextEditor::textWasChangedByValue()
    if (textValue.getValueSource().getReferenceCount() > 1)
        setText (textValue.getValue());

when m_Editor.setText() is called - but not sure why??

Any ideas?



The only way I could think to fix it is:

void TextEditor::setText (const String& newText,
                          const bool sendTextChangeMessage)
    const int newLength = newText.length();

    if (newLength != getTotalNumChars() || getText() != newText || styleChanged)
        if (! sendTextChangeMessage)
            textValue.removeListener (textHolder);   // Added this!

        textValue = newText;

        int oldCursorPos = caretPosition;
        const bool cursorWasAtEnd = oldCursorPos >= getTotalNumChars();

        clearInternal (nullptr);
        insert (newText, 0, currentFont, findColour (textColourId), 0, caretPosition);

        // if you're adding text with line-feeds to a single-line text editor, it
        // ain't gonna look right!
        jassert (multiline || ! newText.containsAnyOf ("\r\n"));

        if (cursorWasAtEnd && ! isMultiLine())
            oldCursorPos = getTotalNumChars();

        moveCaretTo (oldCursorPos, false);

        if (sendTextChangeMessage)
            textChanged();                       //  May not even need this since the Value::Listener will kick in
            textValue.addListener (textHolder);  // Added this!


        styleChanged = false;




Bumping in case this got missed.



Thanks for the commit.