/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2017 - ROLI Ltd. JUCE is an open source library subject to commercial or open-source licensing. By using JUCE, you agree to the terms of both the JUCE 5 End-User License Agreement and JUCE 5 Privacy Policy (both updated and effective as of the 27th April 2017). End User License Agreement: www.juce.com/juce-5-licence Privacy Policy: www.juce.com/juce-5-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see www.gnu.org/licenses). JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ 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 interestedInFileDrag; } 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(); } void setInterestedInFileDrag (bool isInterested) { interestedInFileDrag = isInterested; } private: TextPropertyComponent& owner; int maxChars; bool isMultiline; bool interestedInFileDrag = true; }; //============================================================================== 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(); } void TextPropertyComponent::setInterestedInFileDrag (bool isInterested) { if (textEditor != nullptr) textEditor->setInterestedInFileDrag (isInterested); }