From f9649c1d7583b0e1af1c91f1f1518323921e6a47 Mon Sep 17 00:00:00 2001 From: Bowon Ryu Date: Fri, 30 Jun 2023 11:03:14 +0900 Subject: [PATCH] Apply new clipboard to text component and remove legacy text clipboard https://review.tizen.org/gerrit/#/c/platform/core/uifw/dali-adaptor/+/294862/ Change-Id: I13f25936c230afe97185796c3b366ef8fca229d6 Signed-off-by: Bowon Ryu --- .../src/dali-toolkit-internal/CMakeLists.txt | 1 - .../utc-Dali-Text-Controller.cpp | 12 +- .../src/dali-toolkit-styling/CMakeLists.txt | 1 - .../src/dali-toolkit-third-party/CMakeLists.txt | 1 - automated-tests/src/dali-toolkit/CMakeLists.txt | 1 - .../dali-toolkit-test-suite-utils.h | 1 - .../toolkit-clipboard-event-notifier.cpp | 192 --------------------- .../toolkit-clipboard-event-notifier.h | 62 ------- .../dali-toolkit-test-utils/toolkit-clipboard.cpp | 162 +++++++++-------- .../dali-toolkit-test-utils/toolkit-clipboard.h | 103 ++++++++--- .../src/dali-toolkit/utc-Dali-TextEditor.cpp | 4 +- .../src/dali-toolkit/utc-Dali-TextField.cpp | 5 +- .../controls/text-controls/text-editor-impl.cpp | 17 -- .../controls/text-controls/text-editor-impl.h | 7 - .../controls/text-controls/text-field-impl.cpp | 17 -- .../controls/text-controls/text-field-impl.h | 7 - .../controller/text-controller-event-handler.cpp | 9 +- .../controller/text-controller-event-handler.h | 16 +- .../text/controller/text-controller-impl.cpp | 18 +- .../text/controller/text-controller-impl.h | 15 +- .../internal/text/controller/text-controller.cpp | 34 +++- .../internal/text/controller/text-controller.h | 11 +- 22 files changed, 250 insertions(+), 446 deletions(-) delete mode 100644 automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard-event-notifier.cpp delete mode 100644 automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard-event-notifier.h diff --git a/automated-tests/src/dali-toolkit-internal/CMakeLists.txt b/automated-tests/src/dali-toolkit-internal/CMakeLists.txt index f903fbe..ee58ab6 100755 --- a/automated-tests/src/dali-toolkit-internal/CMakeLists.txt +++ b/automated-tests/src/dali-toolkit-internal/CMakeLists.txt @@ -61,7 +61,6 @@ SET(TEST_HARNESS_SOURCES ../dali-toolkit/dali-toolkit-test-utils/toolkit-adaptor.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-application.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard.cpp - ../dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard-event-notifier.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-event-thread-callback.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-environment-variable.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-feedback-player.cpp diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Controller.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Controller.cpp index 7c4636d..6a3a84a 100644 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Controller.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Controller.cpp @@ -44,12 +44,6 @@ const char* const OPTION_CLIPBOARD("optionClipboard"); // "Clipboard" popup o const Size CONTROL_SIZE(300.f, 60.f); -std::string gClipboardText; -void ContentSelectedCallback(TextClipboardEventNotifier& notifier) -{ - gClipboardText = notifier.GetContent(); -} - // Generate a KeyEvent to send to Core. Dali::KeyEvent GenerateKey(const std::string& keyName, const std::string& keyString, @@ -547,9 +541,6 @@ int UtcDaliTextControllerTextPopupButtonTouched(void) controller->GetText(text); DALI_TEST_CHECK(text.empty()); - TextClipboardEventNotifier clipboardEventNotifier = TextClipboardEventNotifier::Get(); - clipboardEventNotifier.ContentSelectedSignal().Connect(&ContentSelectedCallback); - // Paste the text. button = PushButton::DownCast(textPopup.FindChildByName(OPTION_PASTE)); DALI_TEST_CHECK(button); @@ -558,8 +549,9 @@ int UtcDaliTextControllerTextPopupButtonTouched(void) // Call relayout to process the input events. controller->Relayout(CONTROL_SIZE); + controller->GetText(text); - DALI_TEST_EQUALS("Hello world", gClipboardText, TEST_LOCATION); + DALI_TEST_EQUALS("Hello world", text.c_str(), TEST_LOCATION); // Show the clipboard. button = PushButton::DownCast(textPopup.FindChildByName(OPTION_CLIPBOARD)); diff --git a/automated-tests/src/dali-toolkit-styling/CMakeLists.txt b/automated-tests/src/dali-toolkit-styling/CMakeLists.txt index 4c211d1..814a4de 100644 --- a/automated-tests/src/dali-toolkit-styling/CMakeLists.txt +++ b/automated-tests/src/dali-toolkit-styling/CMakeLists.txt @@ -31,7 +31,6 @@ SET(TEST_HARNESS_SOURCES ../dali-toolkit/dali-toolkit-test-utils/toolkit-test-application.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-text-abstraction.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-timer.cpp - ../dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard-event-notifier.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-tts-player.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-video-player.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-virtual-keyboard.cpp diff --git a/automated-tests/src/dali-toolkit-third-party/CMakeLists.txt b/automated-tests/src/dali-toolkit-third-party/CMakeLists.txt index aa881bc..994ec67 100644 --- a/automated-tests/src/dali-toolkit-third-party/CMakeLists.txt +++ b/automated-tests/src/dali-toolkit-third-party/CMakeLists.txt @@ -14,7 +14,6 @@ SET(TC_SOURCES SET(TEST_HARNESS_SOURCES ../dali-toolkit/dali-toolkit-test-utils/toolkit-application.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard.cpp - ../dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard-event-notifier.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-event-thread-callback.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-environment-variable.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-input-method-context.cpp diff --git a/automated-tests/src/dali-toolkit/CMakeLists.txt b/automated-tests/src/dali-toolkit/CMakeLists.txt index 85a1439..1ddb118 100755 --- a/automated-tests/src/dali-toolkit/CMakeLists.txt +++ b/automated-tests/src/dali-toolkit/CMakeLists.txt @@ -103,7 +103,6 @@ SET(TEST_HARNESS_SOURCES dali-toolkit-test-utils/toolkit-application.cpp dali-toolkit-test-utils/toolkit-canvas-renderer.cpp dali-toolkit-test-utils/toolkit-clipboard.cpp - dali-toolkit-test-utils/toolkit-clipboard-event-notifier.cpp dali-toolkit-test-utils/toolkit-event-thread-callback.cpp dali-toolkit-test-utils/toolkit-environment-variable.cpp dali-toolkit-test-utils/toolkit-input-method-context.cpp diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/dali-toolkit-test-suite-utils.h b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/dali-toolkit-test-suite-utils.h index da96fac..96f0acd 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/dali-toolkit-test-suite-utils.h +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/dali-toolkit-test-suite-utils.h @@ -31,6 +31,5 @@ std::ostream& operator<<( std::ostream& ostream, Dali::Toolkit::Visual::Resource #include "toolkit-test-application.h" #include "toolkit-application.h" #include "toolkit-input-method-context.h" -#include "toolkit-clipboard-event-notifier.h" #endif // DALI_TOOLKIT_TEST_SUITE_UTILS_H diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard-event-notifier.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard-event-notifier.cpp deleted file mode 100644 index cfc2a96..0000000 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard-event-notifier.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include "toolkit-clipboard-event-notifier.h" - -#include -#include -#include - -namespace Dali -{ - -namespace Internal -{ - -namespace Adaptor -{ - -class TextClipboardEventNotifier : public Dali::BaseObject -{ -public: - - typedef Dali::TextClipboardEventNotifier::TextClipboardEventSignalType TextClipboardEventSignalType; - - // Creation - static Dali::TextClipboardEventNotifier New(); - static Dali::TextClipboardEventNotifier Get(); - - // Public API - const std::string& GetContent() const; - void SetContent( const std::string& content ); - void ClearContent(); - void EmitContentSelectedSignal(); - - // Signals - TextClipboardEventSignalType& ContentSelectedSignal() - { - return mContentSelectedSignal; - } - -private: - // Construction & Destruction - TextClipboardEventNotifier(); - virtual ~TextClipboardEventNotifier(); - - // Undefined - TextClipboardEventNotifier( const TextClipboardEventNotifier& ); - TextClipboardEventNotifier& operator=( TextClipboardEventNotifier& ); - -private: - - std::string mContent; ///< The current selected content. - TextClipboardEventSignalType mContentSelectedSignal; - - static Dali::TextClipboardEventNotifier mToolkitClipboardEventNotifier; - -public: - - // Helpers for public-api forwarding methods - - inline static Internal::Adaptor::TextClipboardEventNotifier& GetImplementation(Dali::TextClipboardEventNotifier& detector) - { - DALI_ASSERT_ALWAYS( detector && "TextClipboardEventNotifier handle is empty" ); - - BaseObject& handle = detector.GetBaseObject(); - - return static_cast(handle); - } - - inline static const Internal::Adaptor::TextClipboardEventNotifier& GetImplementation(const Dali::TextClipboardEventNotifier& detector) - { - DALI_ASSERT_ALWAYS( detector && "TextClipboardEventNotifier handle is empty" ); - - const BaseObject& handle = detector.GetBaseObject(); - - return static_cast(handle); - } - -}; - -Dali::TextClipboardEventNotifier TextClipboardEventNotifier::mToolkitClipboardEventNotifier; - -Dali::TextClipboardEventNotifier TextClipboardEventNotifier::New() -{ - return Get(); -} - -Dali::TextClipboardEventNotifier TextClipboardEventNotifier::Get() -{ - if ( !mToolkitClipboardEventNotifier ) - { - mToolkitClipboardEventNotifier = Dali::TextClipboardEventNotifier( new TextClipboardEventNotifier ); - } - return mToolkitClipboardEventNotifier; -} - -const std::string& TextClipboardEventNotifier::GetContent() const -{ - return mContent; -} - -void TextClipboardEventNotifier::SetContent( const std::string& content ) -{ - mContent = content; -} - -void TextClipboardEventNotifier::ClearContent() -{ - mContent.clear(); -} - -void TextClipboardEventNotifier::EmitContentSelectedSignal() -{ - if ( !mContentSelectedSignal.Empty() ) - { - Dali::TextClipboardEventNotifier handle( this ); - mContentSelectedSignal.Emit( handle ); - } -} - -TextClipboardEventNotifier::TextClipboardEventNotifier() -: mContent() -{ -} - -TextClipboardEventNotifier::~TextClipboardEventNotifier() -{ -} - -} // namespace Adaptor -} // namespace Internal - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -TextClipboardEventNotifier::TextClipboardEventNotifier() -{ -} - -TextClipboardEventNotifier TextClipboardEventNotifier::Get() -{ - return Internal::Adaptor::TextClipboardEventNotifier::Get(); -} - -TextClipboardEventNotifier::~TextClipboardEventNotifier() -{ -} - -const std::string& TextClipboardEventNotifier::GetContent() const -{ - return Internal::Adaptor::TextClipboardEventNotifier::GetImplementation(*this).GetContent(); -} - -void TextClipboardEventNotifier::SetContent( const std::string& content ) -{ - Internal::Adaptor::TextClipboardEventNotifier::GetImplementation(*this).SetContent(content); -} - -void TextClipboardEventNotifier::ClearContent() -{ - Internal::Adaptor::TextClipboardEventNotifier::GetImplementation(*this).ClearContent(); -} - -void TextClipboardEventNotifier::EmitContentSelectedSignal() -{ - Internal::Adaptor::TextClipboardEventNotifier::GetImplementation(*this).EmitContentSelectedSignal(); -} - -TextClipboardEventNotifier::TextClipboardEventSignalType& TextClipboardEventNotifier::ContentSelectedSignal() -{ - return Internal::Adaptor::TextClipboardEventNotifier::GetImplementation(*this).ContentSelectedSignal(); -} - -TextClipboardEventNotifier::TextClipboardEventNotifier( Internal::Adaptor::TextClipboardEventNotifier* notifier ) -: BaseHandle( notifier ) -{ -} - -} // namespace Dali diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard-event-notifier.h b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard-event-notifier.h deleted file mode 100644 index b2aabe4..0000000 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard-event-notifier.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef DALI_TOOLKIT_CLIPBOARD_EVENT_NOTIFIER_H -#define DALI_TOOLKIT_CLIPBOARD_EVENT_NOTIFIER_H - -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// EXTERNAL INCLUDES -#include - -// PUBLIC INCLUDES -#define DALI_TEXT_CLIPBOARD_EVENT_NOTIFIER_H -#include -#include - - -namespace Dali -{ - -namespace Internal -{ -namespace Adaptor -{ -class TextClipboardEventNotifier; -} -} - -class TextClipboardEventNotifier : public BaseHandle -{ -public: - typedef Signal< void ( TextClipboardEventNotifier& ) > TextClipboardEventSignalType; - - TextClipboardEventNotifier(); - static TextClipboardEventNotifier Get(); - ~TextClipboardEventNotifier(); - - const std::string& GetContent() const; - void SetContent( const std::string& content ); - void ClearContent(); - - void EmitContentSelectedSignal(); - TextClipboardEventSignalType& ContentSelectedSignal(); - - TextClipboardEventNotifier( Internal::Adaptor::TextClipboardEventNotifier* notifier ); -}; - -} // namespace Dali - -#endif // DALI_TOOLKIT_TOOLKIT_CLIPBOARD_EVENT_NOTIFIER_H diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard.cpp index 177dc95..39d04e3 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard.cpp +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard.cpp @@ -19,7 +19,6 @@ // EXTERNAL INCLUDES #include -#include namespace Dali { @@ -31,94 +30,110 @@ namespace Adaptor { /** - * Implementation of the Clip Board + * Implementation of the Clipboard */ -class TextClipboard : public Dali::BaseObject +class Clipboard : public Dali::BaseObject { public: /** - * @copydoc Dali::TextClipboardEventNotifier::Get() + * @copydoc Dali::ClipboardEventNotifier::Get() */ - static Dali::TextClipboard Get(); + static Dali::Clipboard Get(); /** * Constructor * @param[in] ecoreXwin, The window is created by application. */ - TextClipboard(/*Ecore_X_Window ecoreXwin*/); - virtual ~TextClipboard(); + Clipboard(/*Ecore_X_Window ecoreXwin*/); + virtual ~Clipboard(); /** - * @copydoc Dali::TextClipboard::IsAvailable() + * @copydoc Dali::Clipboard::IsAvailable() */ static bool IsAvailable(); /** - * @copydoc Dali::TextClipboard::SetItem() + * @copydoc Dali::Clipboard::DataSentSignal() */ - bool SetItem(const std::string &itemData); + Dali::Clipboard::DataSentSignalType& DataSentSignal(); /** - * @copydoc Dali::TextClipboard::RequestItem() + * @copydoc Dali::Clipboard::DataReceivedSignal() */ - void RequestItem(); + Dali::Clipboard::DataReceivedSignalType& DataReceivedSignal(); /** - * @copydoc Dali::TextClipboard::NumberOfClipboardItems() + * @copydoc Dali::Clipboard::SetData() */ - unsigned int NumberOfItems(); + bool SetData(const Dali::Clipboard::ClipData& clipData); /** - * @copydoc Dali::TextClipboard::ShowClipboard() + * @copydoc Dali::Clipboard::GetData() + */ + uint32_t GetData(const std::string &mimeType); + + /** + * @copydoc Dali::Clipboard::NumberOfClipboardItems() + */ + size_t NumberOfItems(); + + /** + * @copydoc Dali::Clipboard::ShowClipboard() */ void ShowClipboard(); /** - * @copydoc Dali::TextClipboard::HideClipboard() + * @copydoc Dali::Clipboard::HideClipboard() */ void HideClipboard(); /** - * @copydoc Dali::TextClipboard::IsVisible() + * @copydoc Dali::Clipboard::IsVisible() */ bool IsVisible() const; private: - TextClipboard( const TextClipboard& ); - TextClipboard& operator=( TextClipboard& ); + Clipboard( const Clipboard& ); + Clipboard& operator=( Clipboard& ); - static Dali::TextClipboard mToolkitClipboard; - bool mVisible; - std::string mItem; - int mCount; -}; // class TextClipboard + static Dali::Clipboard mToolkitClipboard; + bool mVisible; + std::string mMimeType; + std::string mData; + uint32_t mDataId{0}; + size_t mCount; -Dali::TextClipboard Dali::Internal::Adaptor::TextClipboard::mToolkitClipboard; + Dali::Clipboard::DataSentSignalType mDataSentSignal; + Dali::Clipboard::DataReceivedSignalType mDataReceivedSignal; +}; // class clipboard -TextClipboard::TextClipboard() +Dali::Clipboard Dali::Internal::Adaptor::Clipboard::mToolkitClipboard; + + +Clipboard::Clipboard() { mVisible = false; - mCount = 0; + mCount = 0u; } -TextClipboard::~TextClipboard() +Clipboard::~Clipboard() { } -Dali::TextClipboard TextClipboard::Get() +Dali::Clipboard Clipboard::Get() { - if( ! mToolkitClipboard ) + if(!mToolkitClipboard) { - mToolkitClipboard = Dali::TextClipboard( new Dali::Internal::Adaptor::TextClipboard() ); + mToolkitClipboard = Dali::Clipboard(new Dali::Internal::Adaptor::Clipboard()); } return mToolkitClipboard; } -bool TextClipboard::IsAvailable() +bool Clipboard::IsAvailable() { if(mToolkitClipboard) { @@ -127,39 +142,59 @@ bool TextClipboard::IsAvailable() return false; } -bool TextClipboard::SetItem(const std::string &itemData ) +Dali::Clipboard::DataSentSignalType& Clipboard::DataSentSignal() +{ + return mDataSentSignal; +} + +Dali::Clipboard::DataReceivedSignalType& Clipboard::DataReceivedSignal() +{ + return mDataReceivedSignal; +} + +bool Clipboard::SetData(const Dali::Clipboard::ClipData& clipData) { - mItem = itemData; - mCount = 1; + mMimeType = clipData.GetMimeType(); + mData = clipData.GetData(); + mCount = 1u; + + if(mData.empty()) + { + return false; + } + + mDataSentSignal.Emit(mMimeType.c_str(), mData.c_str()); + return true; } -void TextClipboard::RequestItem() +uint32_t Clipboard::GetData(const std::string &mimeType) { - Dali::TextClipboardEventNotifier clipboardEventNotifier(Dali::TextClipboardEventNotifier::Get()); - if ( clipboardEventNotifier ) + if(!mMimeType.compare(mimeType.c_str())) { - clipboardEventNotifier.SetContent( mItem ); - clipboardEventNotifier.EmitContentSelectedSignal(); + mDataId++; + mDataReceivedSignal.Emit(mDataId, mMimeType.c_str(), mData.c_str()); + return mDataId; } + return 0u; } -unsigned int TextClipboard::NumberOfItems() +size_t Clipboard::NumberOfItems() { return mCount; } -void TextClipboard::ShowClipboard() +void Clipboard::ShowClipboard() { mVisible = true; } -void TextClipboard::HideClipboard() +void Clipboard::HideClipboard() { mVisible = false; } -bool TextClipboard::IsVisible() const +bool Clipboard::IsVisible() const { return mVisible; } @@ -169,64 +204,55 @@ bool TextClipboard::IsVisible() const } // namespace Internal -inline static Internal::Adaptor::TextClipboard& GetImplementation(Dali::TextClipboard& clipboard) +inline static Internal::Adaptor::Clipboard& GetImplementation(Dali::Clipboard& clipboard) { // Bypass any passed in clipboard handle - it probably won't be initialized - Dali::TextClipboard theClipboard = Dali::TextClipboard::Get(); + Dali::Clipboard theClipboard = Dali::Clipboard::Get(); BaseObject& object = theClipboard.GetBaseObject(); - return static_cast(object); + return static_cast(object); } -inline static const Internal::Adaptor::TextClipboard& GetImplementation(const Dali::TextClipboard& clipboard) +inline static const Internal::Adaptor::Clipboard& GetImplementation(const Dali::Clipboard& clipboard) { // Bypass any passed in clipboard handle - it probably won't be initialized - Dali::TextClipboard theClipboard = Dali::TextClipboard::Get(); + Dali::Clipboard theClipboard = Dali::Clipboard::Get(); const BaseObject& object = theClipboard.GetBaseObject(); - return static_cast(object); + return static_cast(object); } -TextClipboard::TextClipboard() +Clipboard::Clipboard() { } -TextClipboard::~TextClipboard() +Clipboard::~Clipboard() { } -TextClipboard::TextClipboard(Internal::Adaptor::TextClipboard *impl) +Clipboard::Clipboard(Internal::Adaptor::Clipboard *impl) : BaseHandle(impl) { } -TextClipboard TextClipboard::Get() -{ - return Internal::Adaptor::TextClipboard::Get(); -} -bool TextClipboard::SetItem( const std::string &itemData) -{ - return GetImplementation(*this).SetItem( itemData ); -} - -void TextClipboard::RequestItem() +Clipboard Clipboard::Get() { - GetImplementation(*this).RequestItem(); + return Internal::Adaptor::Clipboard::Get(); } -unsigned int TextClipboard::NumberOfItems() +size_t Clipboard::NumberOfItems() { return GetImplementation(*this).NumberOfItems(); } -void TextClipboard::ShowClipboard() +void Clipboard::ShowClipboard() { GetImplementation(*this).ShowClipboard(); } -void TextClipboard::HideClipboard() +void Clipboard::HideClipboard() { GetImplementation(*this).HideClipboard(); } -bool TextClipboard::IsVisible() const +bool Clipboard::IsVisible() const { return GetImplementation(*this).IsVisible(); } diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard.h b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard.h index 5757cff..7ad3187 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard.h +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard.h @@ -1,5 +1,5 @@ -#ifndef TOOLKIT_TEXT_CLIPBOARD_H -#define TOOLKIT_TEXT_CLIPBOARD_H +#ifndef TOOLKIT_CLIPBOARD_H +#define TOOLKIT_CLIPBOARD_H /* * Copyright (c) 2019 Samsung Electronics Co., Ltd. @@ -18,11 +18,12 @@ * */ -#define DALI_TEXT_CLIPBOARD_H +#define DALI_CLIPBOARD_H // EXTERNAL INCLUDES #include #include +#include namespace Dali DALI_IMPORT_API { @@ -32,7 +33,7 @@ namespace Internal DALI_INTERNAL namespace Adaptor { -class TextClipboard; +class Clipboard; } } @@ -40,56 +41,114 @@ class TextClipboard; * The Clipboard can operate using various funtion. * Clipboard can manage it's item and set show / hide status. */ -class TextClipboard : public BaseHandle +class Clipboard : public BaseHandle { public: /** + * @brief Structure that contains information about the clipboard data information. + */ + struct ClipData + { + ClipData(const char* mimeType = nullptr, const char* data = nullptr) + { + this->mimeType = mimeType; + this->data = data; + } + void SetMimeType(const char* mimeType) + { + this->mimeType = mimeType; + } + const char* GetMimeType() const + { + return mimeType; + } + void SetData(const char* data) + { + this->data = data; + } + const char* GetData() const + { + return data; + } + + private: + const char* mimeType {nullptr}; ///< The mime type of clip data. + const char* data {nullptr}; ///< The clip data. + }; + + /// @brief Data send completed signal. + typedef Signal DataSentSignalType; + + /// @brief Data receive completed signal. + typedef Signal DataReceivedSignalType; + + + /** * Create an uninitialized Clipboard; * this can be initialized with one of the derived Clipboard' New() methods */ - TextClipboard(); + Clipboard(); /** * Non virtual destructor. */ - ~TextClipboard(); + ~Clipboard(); /** * This constructor is used by Adaptor::GetClipboard(). * @param[in] clipboard A pointer to the clipboard. */ - TextClipboard( Internal::Adaptor::TextClipboard* clipboard ); + Clipboard(Internal::Adaptor::Clipboard* clipboard); /** - * Retrieve a handle to the TextClipboardEventNotifier instance - * @return A handle to the TextClipboard + * Retrieve a handle to the ClipboardEventNotifier instance + * @return A handle to the Clipboard */ - static TextClipboard Get(); + static Clipboard Get(); /** * @brief Checks whether the clipboard is available. - * * @return true, if it is available, false otherwise. */ static bool IsAvailable(); /** - * Send the given string to the clipboard - * @param[in] itemData string to send to clip board - * @return bool true if the internal clip board sending was successful. + * @brief This signal is emitted when the data send complete. + * @note + * SetData() opertion does not follow a synchronous call. + * It follows the sequence below. + * SetData() -> EcoreEventDataSend() -> SendData() -> DataSentSignal() Emit + */ + DataSentSignalType& DataSentSignal(); + + /** + * @brief This signal is emitted when the data receive complete. + * @note + * GetData() opertion does not follow a synchronous call. + * It follows the sequence below. + * GetData() -> EcoreEventOfferDataReady() -> ReceiveData() -> DataReceivedSignal() Emit + */ + DataReceivedSignalType& DataReceivedSignal(); + + /** + * @brief Send the given data to the clipboard. + * @param[in] clipData data to send to the clipboard + * @return bool true if the internal clipboard sending was successful. */ - bool SetItem( const std::string& itemData ); + bool SetData(const ClipData& clipData); /** - * Request clipboard service to retrieve an item + * @brief Request data from the clipboard. + * @param[in] mimeType mime type of data to request. + * @return uint32_t Returns the data request id. */ - void RequestItem(); + uint32_t GetData(const std::string& mimeType); /** - * Returns the number of item currently in the clipboard - * @return unsigned int number of clipboard items + * @brief Returns the number of item currently in the clipboard. + * @return size_t number of clipboard items. */ - unsigned int NumberOfItems(); + size_t NumberOfItems(); /** * Show the clipboard window @@ -110,4 +169,4 @@ public: }; } // namespace Dali -#endif // TOOLKIT_TextCLIPBOARD_H +#endif // TOOLKIT_CLIPBOARD_H diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp index 81f69a7..557be57 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include #include @@ -2166,7 +2166,7 @@ int utcDaliTextEditorEvent03(void) application.Render(); // Send some taps and check text controller with clipboard window - Dali::TextClipboard clipboard = TextClipboard::Get(); + Dali::Clipboard clipboard = Clipboard::Get(); clipboard.ShowClipboard(); TestGenerateTap(application, 3.0f, 25.0f, 100); clipboard.HideClipboard(); diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp index 5375a59..5f33099 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp @@ -2981,8 +2981,9 @@ int utcDaliTextFieldEvent08(void) ToolkitTestApplication application; tet_infoline(" utcDaliTextFieldEvent08"); - Dali::TextClipboard clipboard = TextClipboard::Get(); - clipboard.SetItem("testTextFieldEvent"); + Dali::Clipboard clipboard = Clipboard::Get(); + Dali::Clipboard::ClipData data("text/plain;charset=utf-8", "testTextFieldEvent"); + clipboard.SetData(data); // Checks Longpress when only place holder text diff --git a/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp index 6ae5aa0..3fc19f2 100644 --- a/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp @@ -858,12 +858,6 @@ void TextEditor::OnKeyInputFocusGained() // When window gain lost focus, the InputMethodContext is deactivated. Thus when window gain focus again, the InputMethodContext must be activated. mInputMethodContext.SetRestoreAfterFocusLost(true); } - TextClipboardEventNotifier notifier(TextClipboardEventNotifier::Get()); - - if(notifier) - { - notifier.ContentSelectedSignal().Connect(this, &TextEditor::OnClipboardTextSelected); - } if(IsEditable() && mController->IsUserInteractionEnabled()) { @@ -888,12 +882,6 @@ void TextEditor::OnKeyInputFocusLost() mInputMethodContext.EventReceivedSignal().Disconnect(this, &TextEditor::OnInputMethodContextEvent); } - TextClipboardEventNotifier notifier(TextClipboardEventNotifier::Get()); - - if(notifier) - { - notifier.ContentSelectedSignal().Disconnect(this, &TextEditor::OnClipboardTextSelected); - } mController->KeyboardFocusLostEvent(); @@ -1286,11 +1274,6 @@ void TextEditor::GetHandleImagePropertyValue(Property::Value& value, Text::Handl } } -void TextEditor::OnClipboardTextSelected(TextClipboardEventNotifier& clipboard) -{ - mController->PasteClipboardItemEvent(); -} - void TextEditor::KeyboardStatusChanged(bool keyboardShown) { DALI_LOG_INFO(gTextEditorLogFilter, Debug::Verbose, "TextEditor::KeyboardStatusChanged %p keyboardShown %d\n", mController.Get(), keyboardShown); diff --git a/dali-toolkit/internal/controls/text-controls/text-editor-impl.h b/dali-toolkit/internal/controls/text-controls/text-editor-impl.h index a4491e1..7b30c17 100644 --- a/dali-toolkit/internal/controls/text-controls/text-editor-impl.h +++ b/dali-toolkit/internal/controls/text-controls/text-editor-impl.h @@ -20,7 +20,6 @@ // EXTERNAL INCLUDES #include -#include #include #include #include @@ -448,12 +447,6 @@ private: // Implementation InputMethodContext::CallbackData OnInputMethodContextEvent(InputMethodContext& inputMethodContext, const InputMethodContext::EventData& inputMethodContextEvent); /** - * @brief Callback when Clipboard signals an item should be pasted - * @param[in] clipboard handle to TextClipboard Event Notifier - */ - void OnClipboardTextSelected(TextClipboardEventNotifier& clipboard); - - /** * @brief Get a Property Map for the image used for the required Handle Image * @param[out] value the returned image property * @param[in] handleType the type of handle diff --git a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp index 658bb9a..93c436e 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp @@ -765,12 +765,6 @@ void TextField::OnKeyInputFocusGained() // When window gain lost focus, the inputMethodContext is deactivated. Thus when window gain focus again, the inputMethodContext must be activated. mInputMethodContext.SetRestoreAfterFocusLost(true); } - TextClipboardEventNotifier notifier(TextClipboardEventNotifier::Get()); - - if(notifier) - { - notifier.ContentSelectedSignal().Connect(this, &TextField::OnClipboardTextSelected); - } if(IsEditable() && mController->IsUserInteractionEnabled()) { @@ -794,12 +788,6 @@ void TextField::OnKeyInputFocusLost() mInputMethodContext.EventReceivedSignal().Disconnect(this, &TextField::OnInputMethodContextEvent); } - TextClipboardEventNotifier notifier(TextClipboardEventNotifier::Get()); - - if(notifier) - { - notifier.ContentSelectedSignal().Disconnect(this, &TextField::OnClipboardTextSelected); - } mController->KeyboardFocusLostEvent(); @@ -1118,11 +1106,6 @@ void TextField::EnableClipping() } } -void TextField::OnClipboardTextSelected(TextClipboardEventNotifier& clipboard) -{ - mController->PasteClipboardItemEvent(); -} - void TextField::KeyboardStatusChanged(bool keyboardShown) { DALI_LOG_INFO(gTextFieldLogFilter, Debug::Verbose, "TextField::KeyboardStatusChanged %p keyboardShown %d\n", mController.Get(), keyboardShown); diff --git a/dali-toolkit/internal/controls/text-controls/text-field-impl.h b/dali-toolkit/internal/controls/text-controls/text-field-impl.h index 36fe57f..afaed24 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.h +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.h @@ -19,7 +19,6 @@ */ // EXTERNAL INCLUDES -#include #include #include #include @@ -420,12 +419,6 @@ private: // Implementation InputMethodContext::CallbackData OnInputMethodContextEvent(InputMethodContext& inputMethodContext, const InputMethodContext::EventData& inputMethodContextEvent); /** - * @brief Callback when Clipboard signals an item should be pasted - * @param[in] clipboard handle to TextClipboard Event Notifier - */ - void OnClipboardTextSelected(TextClipboardEventNotifier& clipboard); - - /** * @brief Get a Property Map for the image used for the required Handle Image * @param[out] value the returned image property * @param[in] handleType the type of handle diff --git a/dali-toolkit/internal/text/controller/text-controller-event-handler.cpp b/dali-toolkit/internal/text/controller/text-controller-event-handler.cpp index 4cff878..12fcd69 100644 --- a/dali-toolkit/internal/text/controller/text-controller-event-handler.cpp +++ b/dali-toolkit/internal/text/controller/text-controller-event-handler.cpp @@ -19,7 +19,6 @@ #include // EXTERNAL INCLUDES -#include #include #include #include @@ -892,12 +891,8 @@ InputMethodContext::CallbackData Controller::EventHandler::OnInputMethodContextE return callbackData; } -void Controller::EventHandler::PasteClipboardItemEvent(Controller& controller) +void Controller::EventHandler::PasteClipboardItemEvent(Controller& controller, const std::string& text) { - // Retrieve the clipboard contents first - TextClipboardEventNotifier notifier(TextClipboardEventNotifier::Get()); - std::string stringToPaste(notifier.GetContent()); - // Commit the current pre-edit text; the contents of the clipboard should be appended controller.mImpl->ResetInputMethodContext(); @@ -905,7 +900,7 @@ void Controller::EventHandler::PasteClipboardItemEvent(Controller& controller) controller.mImpl->SetClipboardHideEnable(false); // Paste - TextUpdater::PasteText(controller, stringToPaste); + TextUpdater::PasteText(controller, text); controller.mImpl->SetClipboardHideEnable(true); } diff --git a/dali-toolkit/internal/text/controller/text-controller-event-handler.h b/dali-toolkit/internal/text/controller/text-controller-event-handler.h index 3be57c2..48ab1d5 100644 --- a/dali-toolkit/internal/text/controller/text-controller-event-handler.h +++ b/dali-toolkit/internal/text/controller/text-controller-event-handler.h @@ -115,12 +115,26 @@ struct Controller::EventHandler */ static bool DeleteEvent(Controller& controller, int keyCode); + /// @copydoc Text::Controller::OnInputMethodContextEvent + /// @param[in] controller A reference to the controller class static InputMethodContext::CallbackData OnInputMethodContextEvent(Controller& controller, InputMethodContext& inputMethodContext, const InputMethodContext::EventData& inputMethodContextEvent); - static void PasteClipboardItemEvent(Controller& controller); + /** + * @brief This function executes the actual text update when a clipboard paste event occurs. + * + * @param[in] controller A reference to the controller class. + * @param[in] text The text data to be pasted into the text controller. + */ + static void PasteClipboardItemEvent(Controller& controller, const std::string& text); + + /// @copydoc Text::Controller::DecorationEvent + /// @param[in] controller A reference to the controller class static void DecorationEvent(Controller& controller, HandleType handleType, HandleState state, float x, float y); + + /// @copydoc Text::Controller::TextPopupButtonTouched + /// @param[in] controller A reference to the controller class static void TextPopupButtonTouched(Controller& controller, Dali::Toolkit::TextSelectionPopup::Buttons button); }; diff --git a/dali-toolkit/internal/text/controller/text-controller-impl.cpp b/dali-toolkit/internal/text/controller/text-controller-impl.cpp index 0385fd9..a84509f 100644 --- a/dali-toolkit/internal/text/controller/text-controller-impl.cpp +++ b/dali-toolkit/internal/text/controller/text-controller-impl.cpp @@ -52,6 +52,7 @@ Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, true, "LOG_TEXT constexpr float MAX_FLOAT = std::numeric_limits::max(); const char* EMPTY_STRING = ""; +const char* MIME_TYPE_TEXT_PLAIN = "text/plain;charset=utf-8"; } // namespace @@ -1072,8 +1073,13 @@ void Controller::Impl::SetClipboardHideEnable(bool enable) bool Controller::Impl::CopyStringToClipboard(const std::string& source) { - //Send string to clipboard - return (EnsureClipboardCreated() && mClipboard.SetItem(source)); + if(EnsureClipboardCreated()) + { + Dali::Clipboard::ClipData data(MIME_TYPE_TEXT_PLAIN, source.c_str()); + return mClipboard.SetData(data); // Send clipboard data to clipboard. + } + + return false; } void Controller::Impl::SendSelectionToClipboard(bool deleteAfterSending) @@ -1084,14 +1090,6 @@ void Controller::Impl::SendSelectionToClipboard(bool deleteAfterSending) ChangeState(EventData::EDITING); } -void Controller::Impl::RequestGetTextFromClipboard() -{ - if(EnsureClipboardCreated()) - { - mClipboard.RequestItem(); - } -} - void Controller::Impl::RepositionSelectionHandles() { SelectionHandleController::Reposition(*this); diff --git a/dali-toolkit/internal/text/controller/text-controller-impl.h b/dali-toolkit/internal/text/controller/text-controller-impl.h index f4dc169..97010cc 100644 --- a/dali-toolkit/internal/text/controller/text-controller-impl.h +++ b/dali-toolkit/internal/text/controller/text-controller-impl.h @@ -19,7 +19,6 @@ */ // EXTERNAL INCLUDES -#include #include #include @@ -371,9 +370,9 @@ struct Controller::Impl mModel = Model::New(); mFontClient = TextAbstraction::FontClient::Get(); - if(mEditableControlInterface != nullptr && TextClipboard::IsAvailable()) + if(mEditableControlInterface != nullptr && Clipboard::IsAvailable()) { - mClipboard = TextClipboard::Get(); + mClipboard = Clipboard::Get(); } mView.SetVisualModel(mModel->mVisualModel); @@ -567,7 +566,7 @@ struct Controller::Impl { if(!mClipboard) { - mClipboard = TextClipboard::Get(); + mClipboard = Clipboard::Get(); } return mClipboard != nullptr ? true : false; @@ -575,13 +574,13 @@ struct Controller::Impl bool IsClipboardEmpty() { - bool result(TextClipboard::IsAvailable() && EnsureClipboardCreated() && mClipboard.NumberOfItems()); + bool result(Clipboard::IsAvailable() && EnsureClipboardCreated() && mClipboard.NumberOfItems()); return !result; // If NumberOfItems greater than 0, return false } bool IsClipboardVisible() { - bool result(TextClipboard::IsAvailable() && EnsureClipboardCreated() && mClipboard.IsVisible()); + bool result(Clipboard::IsAvailable() && EnsureClipboardCreated() && mClipboard.IsVisible()); return result; } @@ -733,8 +732,6 @@ struct Controller::Impl void SendSelectionToClipboard(bool deleteAfterSending); - void RequestGetTextFromClipboard(); - void RepositionSelectionHandles(); void RepositionSelectionHandles(float visualX, float visualY, Controller::NoTextTap::Action action); @@ -1015,7 +1012,7 @@ public: OutlineDefaults* mOutlineDefaults; ///< Avoid allocating this when the user does not specify outline parameters. EventData* mEventData; ///< Avoid allocating everything for text input until EnableTextInput(). TextAbstraction::FontClient mFontClient; ///< Handle to the font client. - TextClipboard mClipboard; ///< Handle to the system clipboard + Clipboard mClipboard; ///< Handle to the system clipboard View mView; ///< The view interface to the rendering back-end. MetricsPtr mMetrics; ///< A wrapper around FontClient used to get metrics & potentially down-scaled Emoji metrics. Layout::Engine mLayoutEngine; ///< The layout engine. diff --git a/dali-toolkit/internal/text/controller/text-controller.cpp b/dali-toolkit/internal/text/controller/text-controller.cpp index f376551..f61a037 100644 --- a/dali-toolkit/internal/text/controller/text-controller.cpp +++ b/dali-toolkit/internal/text/controller/text-controller.cpp @@ -46,6 +46,7 @@ Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, true, "LOG_TEXT #endif const char* EMPTY_STRING = ""; +const char* MIME_TYPE_TEXT_PLAIN = "text/plain;charset=utf-8"; template void EnsureCreated(Type*& object) @@ -1613,19 +1614,40 @@ string Controller::CutText() return mImpl->CutText(); } -void Controller::PasteText() +void Controller::PasteClipboardItemEvent(uint32_t id, const char* mimeType, const char* data) { - mImpl->RequestGetTextFromClipboard(); // Request clipboard service to retrieve an item + // Upon receiving the data, it is important to disconnect the signal + // to avoid potential unintended pasting caused by subsequent requests. + mImpl->mClipboard.DataReceivedSignal().Disconnect(this, &Controller::PasteClipboardItemEvent); + + // If the id is 0u, it is an invalid response. + // text-controller allows only plain text type. + if(id != 0u && !strncmp(mimeType, MIME_TYPE_TEXT_PLAIN, strlen(MIME_TYPE_TEXT_PLAIN))) + { + EventHandler::PasteClipboardItemEvent(*this, data); + } } -InputMethodContext::CallbackData Controller::OnInputMethodContextEvent(InputMethodContext& inputMethodContext, const InputMethodContext::EventData& inputMethodContextEvent) +void Controller::PasteText() { - return EventHandler::OnInputMethodContextEvent(*this, inputMethodContext, inputMethodContextEvent); + if(mImpl->EnsureClipboardCreated()) + { + // Connect the signal before calling GetData() of the clipboard. + mImpl->mClipboard.DataReceivedSignal().Connect(this, &Controller::PasteClipboardItemEvent); + + // Request clipboard service to retrieve an item. + uint id = mImpl->mClipboard.GetData(MIME_TYPE_TEXT_PLAIN); + if(id == 0u) + { + // If the return id is 0u, the signal is not emitted, we must disconnect signal here. + mImpl->mClipboard.DataReceivedSignal().Disconnect(this, &Controller::PasteClipboardItemEvent); + } + } } -void Controller::PasteClipboardItemEvent() +InputMethodContext::CallbackData Controller::OnInputMethodContextEvent(InputMethodContext& inputMethodContext, const InputMethodContext::EventData& inputMethodContextEvent) { - EventHandler::PasteClipboardItemEvent(*this); + return EventHandler::OnInputMethodContextEvent(*this, inputMethodContext, inputMethodContextEvent); } void Controller::GetTargetSize(Vector2& targetSize) diff --git a/dali-toolkit/internal/text/controller/text-controller.h b/dali-toolkit/internal/text/controller/text-controller.h index db9d6cf..4932cec 100644 --- a/dali-toolkit/internal/text/controller/text-controller.h +++ b/dali-toolkit/internal/text/controller/text-controller.h @@ -20,6 +20,7 @@ // EXTERNAL INCLUDES #include +#include #include #include @@ -69,7 +70,7 @@ typedef IntrusivePtr ControllerPtr; * * The text selection popup button callbacks are as well handled via the TextSelectionPopupCallbackInterface interface. */ -class Controller : public RefObject, public Decorator::ControllerInterface, public TextSelectionPopupCallbackInterface, public HiddenText::Observer +class Controller : public RefObject, public Decorator::ControllerInterface, public TextSelectionPopupCallbackInterface, public HiddenText::Observer, public ConnectionTracker { public: // Enumerated types. /** @@ -2000,8 +2001,14 @@ public: // Text-input Event Queuing. /** * @brief Event from Clipboard notifying an Item has been selected for pasting + * + * @param[in] id The id of the data request. + * @param[in] mimeType The mime type of data received. + * @param[in] data The data received. + * @note + * This event is executed by receiving the Clipboard's DataReceivedSignal. */ - void PasteClipboardItemEvent(); + void PasteClipboardItemEvent(uint32_t id, const char* mimeType, const char* data); /** * @brief Return true when text control should clear key input focus when escape key is pressed. -- 2.7.4