/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) b) the Affero GPL v3 Details of these licenses can be found at: www.gnu.org/licenses JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ------------------------------------------------------------------------------ To release a closed-source product which uses JUCE, commercial licenses are available: visit www.juce.com for more information. ============================================================================== */ class TextPropertyComponent::LabelComp : public Label, public FileDragAndDropTarget { public: LabelComp (TextPropertyComponent& tpc, const int charLimit, const bool multiline) : Label (String(), String()), owner (tpc), maxChars (charLimit), isMultiline (multiline) { setEditable (true, true, false); updateColours(); } bool isInterestedInFileDrag (const StringArray&) override { return true; } void filesDropped (const StringArray& files, int, int) override { setText (getText() + files.joinIntoString (isMultiline ? "\n" : ", "), sendNotificationSync); showEditor(); } TextEditor* createEditorComponent() override { TextEditor* const ed = Label::createEditorComponent(); ed->setInputRestrictions (maxChars); if (isMultiline) { ed->setMultiLine (true, true); ed->setReturnKeyStartsNewLine (true); } return ed; } void textWasEdited() override { owner.textWasEdited(); } void updateColours() { setColour (backgroundColourId, owner.findColour (TextPropertyComponent::backgroundColourId)); setColour (outlineColourId, owner.findColour (TextPropertyComponent::outlineColourId)); setColour (textColourId, owner.findColour (TextPropertyComponent::textColourId)); repaint(); } private: TextPropertyComponent& owner; int maxChars; bool isMultiline; }; //============================================================================== TextPropertyComponent::TextPropertyComponent (const String& name, const int maxNumChars, const bool isMultiLine) : PropertyComponent (name) { createEditor (maxNumChars, isMultiLine); } TextPropertyComponent::TextPropertyComponent (const Value& valueToControl, const String& name, const int maxNumChars, const bool isMultiLine) : PropertyComponent (name) { createEditor (maxNumChars, isMultiLine); textEditor->getTextValue().referTo (valueToControl); } TextPropertyComponent::~TextPropertyComponent() { } void TextPropertyComponent::setText (const String& newText) { textEditor->setText (newText, sendNotificationSync); } String TextPropertyComponent::getText() const { return textEditor->getText(); } Value& TextPropertyComponent::getValue() const { return textEditor->getTextValue(); } void TextPropertyComponent::createEditor (const int maxNumChars, const bool isMultiLine) { addAndMakeVisible (textEditor = new LabelComp (*this, maxNumChars, isMultiLine)); if (isMultiLine) { textEditor->setJustificationType (Justification::topLeft); preferredHeight = 100; } } void TextPropertyComponent::refresh() { textEditor->setText (getText(), dontSendNotification); } void TextPropertyComponent::textWasEdited() { const String newText (textEditor->getText()); if (getText() != newText) setText (newText); callListeners(); } void TextPropertyComponent::addListener (TextPropertyComponentListener* const listener) { listenerList.add (listener); } void TextPropertyComponent::removeListener (TextPropertyComponentListener* const listener) { listenerList.remove (listener); } void TextPropertyComponent::callListeners() { Component::BailOutChecker checker (this); listenerList.callChecked (checker, &TextPropertyComponentListener::textPropertyComponentChanged, this); } void TextPropertyComponent::colourChanged() { PropertyComponent::colourChanged(); textEditor->updateColours(); }