void CharacterWindow::MessageReceived(BMessage* message) { switch (message->what) { case B_COPY: PostMessage(message, fCharacterView); break; case kMsgUnicodeBlockSelected: { int32 index; if (message->FindInt32("index", &index) != B_OK || index < 0) break; BlockListItem* item = static_cast<BlockListItem*>(fUnicodeBlockView->ItemAt(index)); fCharacterView->ScrollTo(item->BlockIndex()); fFilterControl->MakeFocus(); break; } case kMsgCharacterChanged: { uint32 character; if (message->FindInt32("character", (int32*)&character) != B_OK) break; char utf8[16]; CharacterView::UnicodeToUTF8(character, utf8, sizeof(utf8)); char utf8Hex[32]; CharacterView::UnicodeToUTF8Hex(character, utf8Hex, sizeof(utf8Hex)); char text[128]; snprintf(text, sizeof(text), "'%s' Code: %#lx (%ld), UTF-8: %s", utf8, character, character, utf8Hex); fCodeView->SetText(text); break; } case kMsgFontSelected: { BMenuItem* item; if (message->FindPointer("source", (void**)&item) != B_OK) break; fSelectedFontItem->SetMarked(false); // If it's the family menu, just select the first style if (item->Submenu() != NULL) item = item->Submenu()->ItemAt(0); if (item != NULL) { item->SetMarked(true); fSelectedFontItem = item; _SetFont(item->Menu()->Name(), item->Label()); } break; } case kMsgFontSizeChanged: { int32 size = fFontSizeSlider->Value(); if (size < kMinFontSize) size = kMinFontSize; else if (size > kMaxFontSize) size = kMaxFontSize; BFont font = fCharacterView->CharacterFont(); font.SetSize(size); fCharacterView->SetCharacterFont(font); break; } case kMsgPrivateBlocks: { BMenuItem* item; if (message->FindPointer("source", (void**)&item) != B_OK || item == NULL) break; item->SetMarked(!item->IsMarked()); fCharacterView->ShowPrivateBlocks(item->IsMarked()); fUnicodeBlockView->ShowPrivateBlocks(item->IsMarked()); break; } case kMsgContainedBlocks: { BMenuItem* item; if (message->FindPointer("source", (void**)&item) != B_OK || item == NULL) break; item->SetMarked(!item->IsMarked()); fCharacterView->ShowContainedBlocksOnly(item->IsMarked()); fUnicodeBlockView->ShowContainedBlocksOnly(item->IsMarked()); break; } case kMsgFilterChanged: fUnicodeBlockView->SetFilter(fFilterControl->Text()); fUnicodeBlockView->Select(0); break; case kMsgClearFilter: fFilterControl->SetText(""); fFilterControl->MakeFocus(); break; default: BWindow::MessageReceived(message); break; } }
void CharacterWindow::MessageReceived(BMessage* message) { if (message->WasDropped()) { const char* text; ssize_t size; uint32 c; if (message->FindInt32("character", (int32*)&c) == B_OK) { fCharacterView->ScrollToCharacter(c); return; } else if (message->FindData("text/plain", B_MIME_TYPE, (const void**)&text, &size) == B_OK) { fCharacterView->ScrollToCharacter(BUnicodeChar::FromUTF8(text)); return; } } switch (message->what) { case B_COPY: PostMessage(message, fCharacterView); break; case kMsgUnicodeBlockSelected: { int32 index; if (message->FindInt32("index", &index) != B_OK || index < 0) break; BlockListItem* item = static_cast<BlockListItem*>(fUnicodeBlockView->ItemAt(index)); fCharacterView->ScrollToBlock(item->BlockIndex()); fFilterControl->MakeFocus(); break; } case kMsgCharacterChanged: { uint32 character; if (message->FindInt32("character", (int32*)&character) != B_OK) break; char utf8[16]; CharacterView::UnicodeToUTF8(character, utf8, sizeof(utf8)); char utf8Hex[32]; CharacterView::UnicodeToUTF8Hex(character, utf8Hex, sizeof(utf8Hex)); char text[128]; snprintf(text, sizeof(text), " %s: %#" B_PRIx32 " (%" B_PRId32 "), UTF-8: %s", B_TRANSLATE("Code"), character, character, utf8Hex); char glyph[20]; snprintf(glyph, sizeof(glyph), "'%s'", utf8); fGlyphView->SetText(glyph); fCodeView->SetText(text); fUnicodeBlockView->SelectBlockForCharacter(character); break; } case kMsgFontSelected: { BMenuItem* item; if (message->FindPointer("source", (void**)&item) != B_OK) break; fSelectedFontItem->SetMarked(false); // If it's the family menu, just select the first style if (item->Submenu() != NULL) { item->SetMarked(true); item = item->Submenu()->ItemAt(0); } if (item != NULL) { item->SetMarked(true); fSelectedFontItem = item; _SetFont(item->Menu()->Name(), item->Label()); BString displayName; displayName << item->Menu()->Name() << " " << item->Label(); fFontSizeSlider->SetLabel(displayName); item = item->Menu()->Superitem(); item->SetMarked(true); } break; } case kMsgFontSizeChanged: { int32 size = fFontSizeSlider->Value(); if (size < kMinFontSize) size = kMinFontSize; else if (size > kMaxFontSize) size = kMaxFontSize; BFont font = fCharacterView->CharacterFont(); font.SetSize(size); fCharacterView->SetCharacterFont(font); break; } case kMsgPrivateBlocks: { BMenuItem* item; if (message->FindPointer("source", (void**)&item) != B_OK || item == NULL) break; item->SetMarked(!item->IsMarked()); fCharacterView->ShowPrivateBlocks(item->IsMarked()); fUnicodeBlockView->ShowPrivateBlocks(item->IsMarked()); break; } case kMsgContainedBlocks: { BMenuItem* item; if (message->FindPointer("source", (void**)&item) != B_OK || item == NULL) break; item->SetMarked(!item->IsMarked()); fCharacterView->ShowContainedBlocksOnly(item->IsMarked()); fUnicodeBlockView->ShowContainedBlocksOnly(item->IsMarked()); break; } case kMsgFilterChanged: fUnicodeBlockView->SetFilter(fFilterControl->Text()); fUnicodeBlockView->Select(0); break; case kMsgClearFilter: fFilterControl->SetText(""); fFilterControl->MakeFocus(); break; default: BWindow::MessageReceived(message); break; } }