From a9fcf35b9884af24b10eec0bb61615b302473509 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 1 Apr 2009 15:53:53 +0000 Subject: [PATCH] * Added support for copying characters into the clipboard via Command-C, and a popup menu. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29852 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/charactermap/CharacterView.cpp | 90 ++++++++++++++++++++++- src/apps/charactermap/CharacterView.h | 3 + src/apps/charactermap/CharacterWindow.cpp | 4 + 3 files changed, 95 insertions(+), 2 deletions(-) diff --git a/src/apps/charactermap/CharacterView.cpp b/src/apps/charactermap/CharacterView.cpp index 2a374c0807..8ca621d04e 100644 --- a/src/apps/charactermap/CharacterView.cpp +++ b/src/apps/charactermap/CharacterView.cpp @@ -10,12 +10,19 @@ #include #include +#include #include +#include +#include #include +#include #include "UnicodeBlocks.h" +static const uint32 kMsgCopyAsEscapedString = 'cesc'; + + CharacterView::CharacterView(const char* name) : BView(name, B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE | B_FRAME_EVENTS), fTargetCommand(0), @@ -150,9 +157,43 @@ CharacterView::UnicodeToUTF8Hex(uint32 c, char* text, size_t textSize) } +void +CharacterView::MessageReceived(BMessage* message) +{ + switch (message->what) { + case kMsgCopyAsEscapedString: + case B_COPY: + { + uint32 character; + if (message->FindInt32("character", (int32*)&character) != B_OK) { + if (!fHasCharacter) + break; + + character = fCurrentCharacter; + } + + char text[16]; + if (message->what == kMsgCopyAsEscapedString) + UnicodeToUTF8Hex(character, text, sizeof(text)); + else + UnicodeToUTF8(character, text, sizeof(text)); + + _CopyToClipboard(text); + break; + } + + default: + BView::MessageReceived(message); + break; + } +} + + void CharacterView::AttachedToWindow() { + Window()->AddShortcut('C', B_SHIFT_KEY, + new BMessage(kMsgCopyAsEscapedString), this); } @@ -180,7 +221,34 @@ CharacterView::FrameResized(float width, float height) void CharacterView::MouseDown(BPoint where) { - fClickPoint = where; + int32 buttons; + if (!fHasCharacter + || Window()->CurrentMessage() == NULL + || Window()->CurrentMessage()->FindInt32("buttons", &buttons) != B_OK + || (buttons & B_SECONDARY_MOUSE_BUTTON) == 0) { + // Memorize click point for dragging + fClickPoint = where; + return; + } + + // Open pop-up menu + + BPopUpMenu *menu = new BPopUpMenu(B_EMPTY_STRING, false, false); + menu->SetFont(be_plain_font); + + BMessage* message = new BMessage(B_COPY); + message->AddInt32("character", fCurrentCharacter); + menu->AddItem(new BMenuItem("Copy Character", message, 'C')); + + message = new BMessage(kMsgCopyAsEscapedString); + message->AddInt32("character", fCurrentCharacter); + menu->AddItem(new BMenuItem("Copy As Escaped Byte String", + message, 'C', B_SHIFT_KEY)); + + menu->SetTargetForItems(this); + + ConvertToScreen(&where); + menu->Go(where, true, true, true); } @@ -404,7 +472,7 @@ CharacterView::_UpdateSize() font_height fontHeight; GetFontHeight(&fontHeight); fTitleHeight = (int32)ceilf(fontHeight.ascent + fontHeight.descent - + fontHeight.leading); + + fontHeight.leading) + 2; fTitleBase = (int32)ceilf(fontHeight.ascent); // Find widest character @@ -468,3 +536,21 @@ CharacterView::_UpdateSize() Invalidate(); } + + +void +CharacterView::_CopyToClipboard(const char* text) +{ + if (!be_clipboard->Lock()) + return; + + be_clipboard->Clear(); + + BMessage* clip = be_clipboard->Data(); + if (clip != NULL) { + clip->AddData("text/plain", B_MIME_TYPE, text, strlen(text)); + be_clipboard->Commit(); + } + + be_clipboard->Unlock(); +} diff --git a/src/apps/charactermap/CharacterView.h b/src/apps/charactermap/CharacterView.h index 473aa8500d..36d91b82cc 100644 --- a/src/apps/charactermap/CharacterView.h +++ b/src/apps/charactermap/CharacterView.h @@ -38,6 +38,8 @@ public: size_t textSize); protected: + virtual void MessageReceived(BMessage* message); + virtual void AttachedToWindow(); virtual void DetachedFromWindow(); @@ -58,6 +60,7 @@ private: bool _GetCharacterAt(BPoint point, uint32& character, BRect* _frame = NULL); void _UpdateSize(); + void _CopyToClipboard(const char* text); private: BMessenger fTarget; diff --git a/src/apps/charactermap/CharacterWindow.cpp b/src/apps/charactermap/CharacterWindow.cpp index f27fe8c8ab..f4b862a311 100644 --- a/src/apps/charactermap/CharacterWindow.cpp +++ b/src/apps/charactermap/CharacterWindow.cpp @@ -181,6 +181,10 @@ void CharacterWindow::MessageReceived(BMessage* message) { switch (message->what) { + case B_COPY: + PostMessage(message, fCharacterView); + break; + case kMsgUnicodeBlockSelected: { int32 index;