* 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
This commit is contained in:
@@ -10,12 +10,19 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <Bitmap.h>
|
#include <Bitmap.h>
|
||||||
|
#include <Clipboard.h>
|
||||||
#include <LayoutUtils.h>
|
#include <LayoutUtils.h>
|
||||||
|
#include <MenuItem.h>
|
||||||
|
#include <PopUpMenu.h>
|
||||||
#include <ScrollBar.h>
|
#include <ScrollBar.h>
|
||||||
|
#include <Window.h>
|
||||||
|
|
||||||
#include "UnicodeBlocks.h"
|
#include "UnicodeBlocks.h"
|
||||||
|
|
||||||
|
|
||||||
|
static const uint32 kMsgCopyAsEscapedString = 'cesc';
|
||||||
|
|
||||||
|
|
||||||
CharacterView::CharacterView(const char* name)
|
CharacterView::CharacterView(const char* name)
|
||||||
: BView(name, B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE | B_FRAME_EVENTS),
|
: BView(name, B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE | B_FRAME_EVENTS),
|
||||||
fTargetCommand(0),
|
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
|
void
|
||||||
CharacterView::AttachedToWindow()
|
CharacterView::AttachedToWindow()
|
||||||
{
|
{
|
||||||
|
Window()->AddShortcut('C', B_SHIFT_KEY,
|
||||||
|
new BMessage(kMsgCopyAsEscapedString), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -180,7 +221,34 @@ CharacterView::FrameResized(float width, float height)
|
|||||||
void
|
void
|
||||||
CharacterView::MouseDown(BPoint where)
|
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;
|
font_height fontHeight;
|
||||||
GetFontHeight(&fontHeight);
|
GetFontHeight(&fontHeight);
|
||||||
fTitleHeight = (int32)ceilf(fontHeight.ascent + fontHeight.descent
|
fTitleHeight = (int32)ceilf(fontHeight.ascent + fontHeight.descent
|
||||||
+ fontHeight.leading);
|
+ fontHeight.leading) + 2;
|
||||||
fTitleBase = (int32)ceilf(fontHeight.ascent);
|
fTitleBase = (int32)ceilf(fontHeight.ascent);
|
||||||
|
|
||||||
// Find widest character
|
// Find widest character
|
||||||
@@ -468,3 +536,21 @@ CharacterView::_UpdateSize()
|
|||||||
|
|
||||||
Invalidate();
|
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();
|
||||||
|
}
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ public:
|
|||||||
size_t textSize);
|
size_t textSize);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
virtual void MessageReceived(BMessage* message);
|
||||||
|
|
||||||
virtual void AttachedToWindow();
|
virtual void AttachedToWindow();
|
||||||
virtual void DetachedFromWindow();
|
virtual void DetachedFromWindow();
|
||||||
|
|
||||||
@@ -58,6 +60,7 @@ private:
|
|||||||
bool _GetCharacterAt(BPoint point, uint32& character,
|
bool _GetCharacterAt(BPoint point, uint32& character,
|
||||||
BRect* _frame = NULL);
|
BRect* _frame = NULL);
|
||||||
void _UpdateSize();
|
void _UpdateSize();
|
||||||
|
void _CopyToClipboard(const char* text);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
BMessenger fTarget;
|
BMessenger fTarget;
|
||||||
|
|||||||
@@ -181,6 +181,10 @@ void
|
|||||||
CharacterWindow::MessageReceived(BMessage* message)
|
CharacterWindow::MessageReceived(BMessage* message)
|
||||||
{
|
{
|
||||||
switch (message->what) {
|
switch (message->what) {
|
||||||
|
case B_COPY:
|
||||||
|
PostMessage(message, fCharacterView);
|
||||||
|
break;
|
||||||
|
|
||||||
case kMsgUnicodeBlockSelected:
|
case kMsgUnicodeBlockSelected:
|
||||||
{
|
{
|
||||||
int32 index;
|
int32 index;
|
||||||
|
|||||||
Reference in New Issue
Block a user