From 70295117a6c9e974e844927613ad97f41d98f10e Mon Sep 17 00:00:00 2001 From: Duncan Ogilvie Date: Tue, 23 Jul 2019 18:15:56 +0200 Subject: [PATCH 1/4] Implement Application::copyToClipboard for iOS --- docs/docs/reference/foundation/application.md | 4 ++++ framework/foundation/include/bdn/Application.h | 1 + framework/foundation/include/bdn/GenericApplication.h | 2 ++ framework/ui/platforms/ios/include/bdn/ios/UIApplication.hh | 2 ++ framework/ui/platforms/ios/src/UIApplication.mm | 6 ++++++ 5 files changed, 15 insertions(+) diff --git a/docs/docs/reference/foundation/application.md b/docs/docs/reference/foundation/application.md index 431fff31..eaf77a07 100644 --- a/docs/docs/reference/foundation/application.md +++ b/docs/docs/reference/foundation/application.md @@ -74,6 +74,10 @@ namespace bdn { Opens the given URL in a suitable external application. Web URLs will be opened in the system's standard web browser. Application-specific URLs will open in the respective application. +* **virtual void copyToClipboard(const String &str)** + + Copies the given string to the clipboard. + ## Resources * **virtual String uriToBundledFileUri(const String &uri)** diff --git a/framework/foundation/include/bdn/Application.h b/framework/foundation/include/bdn/Application.h index 39707475..b09f24f9 100644 --- a/framework/foundation/include/bdn/Application.h +++ b/framework/foundation/include/bdn/Application.h @@ -53,6 +53,7 @@ namespace bdn public: virtual void openURL(const String &url) = 0; virtual String uriToBundledFileUri(const String &uri) { return uri; } + virtual void copyToClipboard(const String &str) = 0; protected: virtual void platformSpecificInit() {} diff --git a/framework/foundation/include/bdn/GenericApplication.h b/framework/foundation/include/bdn/GenericApplication.h index ead0984b..790ef11d 100644 --- a/framework/foundation/include/bdn/GenericApplication.h +++ b/framework/foundation/include/bdn/GenericApplication.h @@ -70,6 +70,8 @@ namespace bdn void openURL(const String &url) override {} + void copyToClipboard(const String &str) override {} + protected: virtual bool shouldExit() const { diff --git a/framework/ui/platforms/ios/include/bdn/ios/UIApplication.hh b/framework/ui/platforms/ios/include/bdn/ios/UIApplication.hh index 6d8e4fa2..0ef7ab85 100644 --- a/framework/ui/platforms/ios/include/bdn/ios/UIApplication.hh +++ b/framework/ui/platforms/ios/include/bdn/ios/UIApplication.hh @@ -22,6 +22,8 @@ namespace bdn::ui::ios String uriToBundledFileUri(const String &uri) override; + void copyToClipboard(const String &str) override; + public: bool _applicationWillFinishLaunching(NSDictionary *launchOptions); bool _applicationDidFinishLaunching(NSDictionary *launchOptions); diff --git a/framework/ui/platforms/ios/src/UIApplication.mm b/framework/ui/platforms/ios/src/UIApplication.mm index be60b027..9782ab18 100644 --- a/framework/ui/platforms/ios/src/UIApplication.mm +++ b/framework/ui/platforms/ios/src/UIApplication.mm @@ -150,6 +150,12 @@ - (void)applicationWillTerminate:(UIApplication *)application return "file:///" + result; } + void UIApplication::copyToClipboard(const String &str) + { + UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; + pasteboard.string = [NSString stringWithUTF8String:str.c_str()]; + } + bool UIApplication::_applicationWillFinishLaunching(NSDictionary *launchOptions) { bdn::platformEntryWrapper( From 3dc89883f7ea1fe26e5a4e39552217858e20fce6 Mon Sep 17 00:00:00 2001 From: Duncan Ogilvie Date: Thu, 25 Jul 2019 12:22:11 +0200 Subject: [PATCH 2/4] Implement Application::copyToClipboard for mac --- .../ui/platforms/mac/include/bdn/mac/UIApplication.hh | 1 + framework/ui/platforms/mac/src/UIApplication.mm | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/framework/ui/platforms/mac/include/bdn/mac/UIApplication.hh b/framework/ui/platforms/mac/include/bdn/mac/UIApplication.hh index e8e2e8c9..7cdc1534 100644 --- a/framework/ui/platforms/mac/include/bdn/mac/UIApplication.hh +++ b/framework/ui/platforms/mac/include/bdn/mac/UIApplication.hh @@ -19,6 +19,7 @@ namespace bdn::ui::mac void disposeMainDispatcher() override; void openURL(const String &url) override; String uriToBundledFileUri(const String &uri) override; + void copyToClipboard(const String &str) override; public: void _applicationWillFinishLaunching(NSNotification *notification); diff --git a/framework/ui/platforms/mac/src/UIApplication.mm b/framework/ui/platforms/mac/src/UIApplication.mm index a3dbdf6e..472be664 100644 --- a/framework/ui/platforms/mac/src/UIApplication.mm +++ b/framework/ui/platforms/mac/src/UIApplication.mm @@ -137,6 +137,13 @@ - (void)applicationWillTerminate:(NSNotification *)aNotification return "file:///" + result; } + void UIApplication::copyToClipboard(const String &str) + { + NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; + [pasteboard declareTypes:[NSArray arrayWithObjects:NSPasteboardTypeString, nil] owner:nil]; + [pasteboard setString:[NSString stringWithUTF8String:str.c_str()] forType:NSPasteboardTypeString]; + } + void UIApplication::_applicationWillFinishLaunching(NSNotification *notification) { bdn::platformEntryWrapper( From cfdae65186b785469eec3a060d8cecd267af89ca Mon Sep 17 00:00:00 2001 From: Duncan Ogilvie Date: Wed, 7 Aug 2019 19:36:32 +0200 Subject: [PATCH 3/4] Implement Application::copyToClipboard for Android --- .../platforms/android/include/bdn/android/UIApplication.h | 1 + .../include/bdn/android/wrapper/NativeRootActivity.h | 3 +++ .../android/java/io/boden/android/NativeRootActivity.java | 7 +++++++ framework/ui/platforms/android/src/UIApplication.cpp | 5 +++++ 4 files changed, 16 insertions(+) diff --git a/framework/ui/platforms/android/include/bdn/android/UIApplication.h b/framework/ui/platforms/android/include/bdn/android/UIApplication.h index f1806121..a4f6da05 100644 --- a/framework/ui/platforms/android/include/bdn/android/UIApplication.h +++ b/framework/ui/platforms/android/include/bdn/android/UIApplication.h @@ -23,6 +23,7 @@ namespace bdn::ui::android void initiateExitIfPossible(int exitCode) override; void openURL(const String &url) override; String uriToBundledFileUri(const String &uri) override; + void copyToClipboard(const String &str) override; protected: void disposeMainDispatcher() override; diff --git a/framework/ui/platforms/android/include/bdn/android/wrapper/NativeRootActivity.h b/framework/ui/platforms/android/include/bdn/android/wrapper/NativeRootActivity.h index ccf4d107..a6e3d241 100644 --- a/framework/ui/platforms/android/include/bdn/android/wrapper/NativeRootActivity.h +++ b/framework/ui/platforms/android/include/bdn/android/wrapper/NativeRootActivity.h @@ -16,6 +16,9 @@ namespace bdn::android::wrapper constexpr static const JTObject::StaticMethod getResourceURIFromURI{"getResourceURIFromURI"}; + constexpr static const JTObject::StaticMethod copyToClipboard{ + "copyToClipboard"}; + // JavaMethod setTitle{this, "setTitle"}; // JavaMethod enableBackButton{this, "enableBackButton"}; }; diff --git a/framework/ui/platforms/android/java/io/boden/android/NativeRootActivity.java b/framework/ui/platforms/android/java/io/boden/android/NativeRootActivity.java index 25bba46c..4d499257 100644 --- a/framework/ui/platforms/android/java/io/boden/android/NativeRootActivity.java +++ b/framework/ui/platforms/android/java/io/boden/android/NativeRootActivity.java @@ -3,6 +3,7 @@ import io.boden.android.NativeInit; import io.boden.android.NativeRootView; +import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; @@ -292,6 +293,12 @@ public static final String getResourceURIFromURI(String uri) { return uri; } + public static final void copyToClipboard(String str) + { + ClipboardManager clipboard = (ClipboardManager)getRootActivity().getSystemService(Context.CLIPBOARD_SERVICE); + clipboard.setText(str); + } + @Override public void onConfigurationChanged (Configuration newConfig) { super.onConfigurationChanged(newConfig); diff --git a/framework/ui/platforms/android/src/UIApplication.cpp b/framework/ui/platforms/android/src/UIApplication.cpp index 2308af70..70d6f5d7 100644 --- a/framework/ui/platforms/android/src/UIApplication.cpp +++ b/framework/ui/platforms/android/src/UIApplication.cpp @@ -75,6 +75,11 @@ namespace bdn::ui::android { return bdn::android::wrapper::NativeRootActivity::getResourceURIFromURI(uri); } + + void UIApplication::copyToClipboard(const String &str) + { + return bdn::android::wrapper::NativeRootActivity::copyToClipboard(str); + } } extern "C" JNIEXPORT void JNICALL Java_io_boden_android_NativeInit_nativeDestroy(JNIEnv *env, jclass cls, From a244ba05edb6bb7c9793e2ea5cb8257250c1472c Mon Sep 17 00:00:00 2001 From: Duncan Ogilvie Date: Mon, 19 Aug 2019 21:41:21 +0200 Subject: [PATCH 4/4] Add MiscPage with copyToClipboard test button --- examples/BodenDemo/src/BodenDemo.cpp | 4 +++- examples/BodenDemo/src/MiscPage.cpp | 21 +++++++++++++++++++++ examples/BodenDemo/src/MiscPage.h | 13 +++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 examples/BodenDemo/src/MiscPage.cpp create mode 100644 examples/BodenDemo/src/MiscPage.h diff --git a/examples/BodenDemo/src/BodenDemo.cpp b/examples/BodenDemo/src/BodenDemo.cpp index c1ce3199..48d8fd3a 100644 --- a/examples/BodenDemo/src/BodenDemo.cpp +++ b/examples/BodenDemo/src/BodenDemo.cpp @@ -8,6 +8,7 @@ #include "FontPage.h" #include "ImagesPage.h" #include "ListViewPage.h" +#include "MiscPage.h" #include "PropertiesPage.h" #include "StyledTextPage.h" #include "TimersPage.h" @@ -23,7 +24,7 @@ using namespace bdn; class PagesDataSource : public ListViewDataSource { public: - std::array()>>, 10> pages = { + std::array()>>, 11> pages = { std::make_pair("UI Demo", [=]() { return std::make_shared(needsInit, _window); }), std::make_pair("Timer demo", [=]() { return std::make_shared(needsInit); }), std::make_pair("WebView demo", [=]() { return std::make_shared(needsInit); }), @@ -34,6 +35,7 @@ class PagesDataSource : public ListViewDataSource std::make_pair("Fonts", [=]() { return std::make_shared(needsInit); }), std::make_pair("Styled Text", [=]() { return std::make_shared(needsInit); }), std::make_pair("Focus", [=]() { return std::make_shared(needsInit); }), + std::make_pair("Misc", [=]() { return std::make_shared(needsInit); }), }; public: diff --git a/examples/BodenDemo/src/MiscPage.cpp b/examples/BodenDemo/src/MiscPage.cpp new file mode 100644 index 00000000..1622ee5d --- /dev/null +++ b/examples/BodenDemo/src/MiscPage.cpp @@ -0,0 +1,21 @@ +#include +#include +#include +#include +#include + +#include "MiscPage.h" +#include + +namespace bdn +{ + void MiscPage::init() + { + stylesheet = FlexJsonStringify({"flexGrow" : 1.0}); + + auto buttonCopy = std::make_shared