18f400a12SAxel Dörfler /* 28f400a12SAxel Dörfler * Copyright 2009, Axel Dörfler, axeld@pinc-software.de. 38f400a12SAxel Dörfler * Distributed under the terms of the MIT License. 48f400a12SAxel Dörfler */ 58f400a12SAxel Dörfler 68f400a12SAxel Dörfler 78f400a12SAxel Dörfler #include "UnicodeBlockView.h" 88f400a12SAxel Dörfler 98f400a12SAxel Dörfler #include <stdio.h> 108f400a12SAxel Dörfler #include <string.h> 118f400a12SAxel Dörfler 128f400a12SAxel Dörfler #include "UnicodeBlocks.h" 138f400a12SAxel Dörfler 148f400a12SAxel Dörfler 158f400a12SAxel Dörfler BlockListItem::BlockListItem(const char* label, uint32 blockIndex) 168f400a12SAxel Dörfler : BStringItem(label), 178f400a12SAxel Dörfler fBlockIndex(blockIndex) 188f400a12SAxel Dörfler { 198f400a12SAxel Dörfler } 208f400a12SAxel Dörfler 218f400a12SAxel Dörfler 228f400a12SAxel Dörfler // #pragma mark - 238f400a12SAxel Dörfler 248f400a12SAxel Dörfler 258f400a12SAxel Dörfler UnicodeBlockView::UnicodeBlockView(const char* name) 268f400a12SAxel Dörfler : BListView(name), 278f400a12SAxel Dörfler fBlocks(kNumUnicodeBlocks, true), 288f400a12SAxel Dörfler fShowPrivateBlocks(false), 298f400a12SAxel Dörfler fShowContainedBlocksOnly(false) 308f400a12SAxel Dörfler { 31ad491b43SAxel Dörfler _CreateBlocks(); 328f400a12SAxel Dörfler } 338f400a12SAxel Dörfler 348f400a12SAxel Dörfler 358f400a12SAxel Dörfler UnicodeBlockView::~UnicodeBlockView() 368f400a12SAxel Dörfler { 378f400a12SAxel Dörfler } 388f400a12SAxel Dörfler 398f400a12SAxel Dörfler 408f400a12SAxel Dörfler void 418f400a12SAxel Dörfler UnicodeBlockView::SetFilter(const char* filter) 428f400a12SAxel Dörfler { 438f400a12SAxel Dörfler fFilter = filter; 448f400a12SAxel Dörfler _UpdateBlocks(); 458f400a12SAxel Dörfler } 468f400a12SAxel Dörfler 478f400a12SAxel Dörfler 488f400a12SAxel Dörfler void 498f400a12SAxel Dörfler UnicodeBlockView::ShowPrivateBlocks(bool show) 508f400a12SAxel Dörfler { 518f400a12SAxel Dörfler if (fShowPrivateBlocks == show) 528f400a12SAxel Dörfler return; 538f400a12SAxel Dörfler 548f400a12SAxel Dörfler fShowPrivateBlocks = show; 558f400a12SAxel Dörfler _UpdateBlocks(); 568f400a12SAxel Dörfler } 578f400a12SAxel Dörfler 588f400a12SAxel Dörfler 598f400a12SAxel Dörfler void 608f400a12SAxel Dörfler UnicodeBlockView::ShowContainedBlocksOnly(bool show) 618f400a12SAxel Dörfler { 628f400a12SAxel Dörfler if (fShowContainedBlocksOnly == show) 638f400a12SAxel Dörfler return; 648f400a12SAxel Dörfler 658f400a12SAxel Dörfler fShowContainedBlocksOnly = show; 668f400a12SAxel Dörfler _UpdateBlocks(); 678f400a12SAxel Dörfler } 688f400a12SAxel Dörfler 698f400a12SAxel Dörfler 708f400a12SAxel Dörfler bool 718f400a12SAxel Dörfler UnicodeBlockView::IsShowingBlock(int32 blockIndex) const 728f400a12SAxel Dörfler { 738f400a12SAxel Dörfler if (blockIndex < 0 || blockIndex >= (int32)kNumUnicodeBlocks) 748f400a12SAxel Dörfler return false; 758f400a12SAxel Dörfler 768f400a12SAxel Dörfler if (!fShowPrivateBlocks && kUnicodeBlocks[blockIndex].private_block) 778f400a12SAxel Dörfler return false; 788f400a12SAxel Dörfler 798f400a12SAxel Dörfler return true; 808f400a12SAxel Dörfler } 818f400a12SAxel Dörfler 828f400a12SAxel Dörfler 838f400a12SAxel Dörfler void 848f400a12SAxel Dörfler UnicodeBlockView::_UpdateBlocks() 858f400a12SAxel Dörfler { 868f400a12SAxel Dörfler MakeEmpty(); 878f400a12SAxel Dörfler 888f400a12SAxel Dörfler for (int32 i = 0; i < fBlocks.CountItems(); i++) { 898f400a12SAxel Dörfler if (fFilter.Length() != 0) { 908f400a12SAxel Dörfler if (strcasestr(kUnicodeBlocks[i].name, fFilter.String()) == NULL) 918f400a12SAxel Dörfler continue; 928f400a12SAxel Dörfler } 938f400a12SAxel Dörfler 948f400a12SAxel Dörfler if (!IsShowingBlock(i)) 958f400a12SAxel Dörfler continue; 968f400a12SAxel Dörfler 978f400a12SAxel Dörfler AddItem(fBlocks.ItemAt(i)); 988f400a12SAxel Dörfler } 998f400a12SAxel Dörfler } 1008f400a12SAxel Dörfler 1018f400a12SAxel Dörfler 1028f400a12SAxel Dörfler void 1038f400a12SAxel Dörfler UnicodeBlockView::_CreateBlocks() 1048f400a12SAxel Dörfler { 1058f400a12SAxel Dörfler float minWidth = 0; 1068f400a12SAxel Dörfler for (uint32 i = 0; i < kNumUnicodeBlocks; i++) { 1078f400a12SAxel Dörfler BlockListItem* item = new BlockListItem(kUnicodeBlocks[i].name, i); 1088f400a12SAxel Dörfler fBlocks.AddItem(item); 1098f400a12SAxel Dörfler 1108f400a12SAxel Dörfler float width = StringWidth(item->Text()); 1118f400a12SAxel Dörfler if (minWidth < width) 1128f400a12SAxel Dörfler minWidth = width; 1138f400a12SAxel Dörfler } 1148f400a12SAxel Dörfler 1158f400a12SAxel Dörfler SetExplicitMinSize(BSize(minWidth / 2, 32)); 1168f400a12SAxel Dörfler SetExplicitMaxSize(BSize(minWidth, B_SIZE_UNSET)); 1178f400a12SAxel Dörfler 1188f400a12SAxel Dörfler _UpdateBlocks(); 1198f400a12SAxel Dörfler } 1208f400a12SAxel Dörfler 12174d9b875Sdsizzle 12274d9b875Sdsizzle void 12374d9b875Sdsizzle UnicodeBlockView::SelectBlockForCharacter(uint32 character) 12474d9b875Sdsizzle { 12574d9b875Sdsizzle // find block containing the character 126*19390213SDale Cieslak int32 blockNumber = BlockForCharacter(character); 12774d9b875Sdsizzle 128*19390213SDale Cieslak if (blockNumber > 0) { 129*19390213SDale Cieslak BlockListItem* block = fBlocks.ItemAt(blockNumber); 13074d9b875Sdsizzle 131*19390213SDale Cieslak int32 blockIndex = IndexOf(block); 1320340e4b3Sdsizzle 133*19390213SDale Cieslak if (blockIndex >= 0) { 134*19390213SDale Cieslak Select(blockIndex); 13574d9b875Sdsizzle ScrollToSelection(); 13674d9b875Sdsizzle } 13774d9b875Sdsizzle } 1380340e4b3Sdsizzle } 139