// Stuff we can only do when the main view is attached to a window void OutputFormatView::AttachedToWindow() { // Get the window and lock it the_window = Window(); the_window->Lock(); // Set some size limits on the window the_window->SetSizeLimits( 200.0, 32767.0, Bounds().Height() - scroll_view->Bounds().Height() + 50.0, 32767.0); // Set the target for messages sent to this view list_view->SetTarget(this); the_button->SetTarget(this); // Make the list view the keyboard focus list_view->MakeFocus(); // Select the first item in the list, // and make its config view show up if (list_view->CountItems() > 0) list_view->Select(0); else the_button->SetEnabled(false); // Unlock the window the_window->Unlock(); // Call the base class BView::AttachedToWindow(); }
/** * @brief Adds one item to the control. * @param[in] text item text. * @param[in] data associated data of adding item. * @return the index of added item. */ SInt32 BeListViewAdapter::AddItem(ConstAStr text, void* data) { BeGenericDataStringItem* listItem = new BeGenericDataStringItem(text); listItem->SetItemData(data); BListView* listView = getListView(); listView->AddItem(listItem); return listView->CountItems() - 1; }
/** * @brief Removes all item from the control. */ void BeListViewAdapter::RemoveAllItem() { BListView* listView = getListView(); int32 count = listView->CountItems(); int32 index; for (index = count - 1; index >= 0; index--) { BListItem* listItem = listView->RemoveItem(index); if (NULL != listItem) { delete listItem; } } }
/** * @brief Makes the control enabled or disabled. * @param[in] doEnable true to enable the control, or false to disable the control. */ void BeListViewAdapter::Enable(bool doEnable) { BListView* listView = getListView(); int32 count = listView->CountItems(); int32 index; for (index = 0; index < count; index++) { BListItem* listItem = listView->ItemAt(index); listItem->SetEnabled(doEnable); } listView->LockLooper(); listView->Invalidate(); listView->UnlockLooper(); isEnabled = doEnable; }
void MainView::FixupScrollbars() { return; BRect bounds=(Bounds()).InsetBySelf(5, 5); bounds.right -= B_V_SCROLL_BAR_WIDTH; bounds.bottom -= B_H_SCROLL_BAR_HEIGHT; BScrollBar *sb; BListView* listView = (BListView*)this->FindView("list"); float ratio=1, realRectWidth=1, realRectHeight=1; if (!listView || !scrollView) { return; } listView->GetPreferredSize(&realRectWidth, &realRectHeight); realRectHeight = listView->CountItems() * 18; realRectWidth += 15 + B_V_SCROLL_BAR_WIDTH; sb = scrollView->ScrollBar(B_HORIZONTAL); if (sb) { ratio = bounds.Width() / (float)realRectWidth; sb->SetRange(0, realRectWidth-bounds.Width()); if (ratio >= 1) { sb->SetProportion(1); } else { sb->SetProportion(ratio); } } sb = scrollView->ScrollBar(B_VERTICAL); if (sb) { ratio = bounds.Height() / (float)realRectHeight; sb->SetRange(0, realRectHeight+2); if (ratio >= 1) { sb->SetProportion(1); } else { sb->SetProportion(ratio); } } }
status_t PListView::GetProperty(const char *name, PValue *value, const int32 &index) const { if (!name || !value) return B_ERROR; BString str(name); PProperty *prop = FindProperty(name,index); if (!prop) return B_NAME_NOT_FOUND; BListView *backend = (BListView*)fView; if (backend->Window()) backend->Window()->Lock(); if (str.ICompare("PreferredWidth") == 0) { if (backend->CountItems() == 0) ((FloatProperty*)prop)->SetValue(100); else { float pw, ph; backend->GetPreferredSize(&pw, &ph); if (pw < 10) pw = 100; if (ph < 10) ph = 30; ((FloatProperty*)prop)->SetValue(pw); } } else if (str.ICompare("ItemCount") == 0) ((IntProperty*)prop)->SetValue(backend->CountItems()); else if (str.ICompare("SelectionMessage") == 0) ((IntProperty*)prop)->SetValue(backend->SelectionCommand()); else if (str.ICompare("PreferredHeight") == 0) { if (backend->CountItems() == 0) ((FloatProperty*)prop)->SetValue(30); else { float pw, ph; backend->GetPreferredSize(&pw, &ph); if (pw < 10) pw = 100; if (ph < 10) ph = 30; ((FloatProperty*)prop)->SetValue(ph); } } else if (str.ICompare("InvocationMessage") == 0) ((IntProperty*)prop)->SetValue(backend->InvocationCommand()); else if (str.ICompare("SelectionType") == 0) ((EnumProperty*)prop)->SetValue(backend->ListType()); else { if (backend->Window()) backend->Window()->Unlock(); return PView::GetProperty(name, value, index); } if (backend->Window()) backend->Window()->Unlock(); return prop->GetValue(value); }
int iupdrvListGetCount(Ihandle* ih) { BListView* listview = (BListView*)ih->handle; return listview->CountItems(); }
/** * @brief Returns item count in the control. * @return item count. */ SInt32 BeListViewAdapter::GetCount() { BListView* listView = getListView(); return listView->CountItems(); }
LocaleWindow::LocaleWindow() : BWindow(BRect(0, 0, 0, 0), "Locale", B_TITLED_WINDOW, B_QUIT_ON_WINDOW_CLOSE | B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS) { BCountry* defaultCountry; be_locale_roster->GetDefaultCountry(&defaultCountry); SetLayout(new BGroupLayout(B_HORIZONTAL)); float spacing = be_control_look->DefaultItemSpacing(); BTabView* tabView = new BTabView("tabview"); BGroupView* languageTab = new BGroupView(B_TRANSLATE("Language"), B_HORIZONTAL, spacing); // first list: available languages fLanguageListView = new LanguageListView("available", B_MULTIPLE_SELECTION_LIST); BScrollView* scrollView = new BScrollView("scroller", fLanguageListView, B_WILL_DRAW | B_FRAME_EVENTS, false, true); fLanguageListView->SetInvocationMessage(new BMessage(kMsgLanguageInvoked)); fLanguageListView->SetDragMessage(new BMessage(kMsgLanguageDragged)); // Fill the language list from the LocaleRoster data BMessage installedLanguages; if (be_locale_roster->GetInstalledLanguages(&installedLanguages) == B_OK) { BString currentID; LanguageListItem* lastAddedCountryItem = NULL; for (int i = 0; installedLanguages.FindString("langs", i, ¤tID) == B_OK; i++) { // Now get an human-readable, localized name for each language BLanguage* currentLanguage; be_locale_roster->GetLanguage(currentID.String(), ¤tLanguage); BString name; currentLanguage->GetName(name); // TODO: as long as the app_server doesn't support font overlays, // use the translated name if problematic characters are used... const char* string = name.String(); while (uint32 code = BUnicodeChar::FromUTF8(&string)) { if (code > 1424) { currentLanguage->GetTranslatedName(name); break; } } LanguageListItem* item = new LanguageListItem(name, currentID.String(), currentLanguage->Code()); if (currentLanguage->IsCountrySpecific() && lastAddedCountryItem != NULL && lastAddedCountryItem->Code() == item->Code()) { fLanguageListView->AddUnder(item, lastAddedCountryItem); } else { // This is a language variant, add it at top-level fLanguageListView->AddItem(item); if (!currentLanguage->IsCountrySpecific()) { item->SetExpanded(false); lastAddedCountryItem = item; } } delete currentLanguage; } fLanguageListView->FullListSortItems(compare_typed_list_items); } else { BAlert* alert = new BAlert("Error", B_TRANSLATE("Unable to find the available languages! You can't " "use this preflet!"), B_TRANSLATE("OK"), NULL, NULL, B_WIDTH_AS_USUAL, B_OFFSET_SPACING, B_STOP_ALERT); alert->Go(); } // Second list: active languages fPreferredListView = new LanguageListView("preferred", B_MULTIPLE_SELECTION_LIST); BScrollView* scrollViewEnabled = new BScrollView("scroller", fPreferredListView, B_WILL_DRAW | B_FRAME_EVENTS, false, true); fPreferredListView->SetInvocationMessage( new BMessage(kMsgPreferredLanguageInvoked)); fPreferredListView->SetDeleteMessage( new BMessage(kMsgPreferredLanguageDeleted)); fPreferredListView->SetDragMessage( new BMessage(kMsgPreferredLanguageDragged)); BLayoutBuilder::Group<>(languageTab) .AddGroup(B_VERTICAL, spacing) .Add(new BStringView("", B_TRANSLATE("Available languages"))) .Add(scrollView) .End() .AddGroup(B_VERTICAL, spacing) .Add(new BStringView("", B_TRANSLATE("Preferred languages"))) .Add(scrollViewEnabled) .End() .SetInsets(spacing, spacing, spacing, spacing); BView* countryTab = new BView(B_TRANSLATE("Country"), B_WILL_DRAW); countryTab->SetLayout(new BGroupLayout(B_VERTICAL, 0)); BListView* listView = new BListView("country", B_SINGLE_SELECTION_LIST); scrollView = new BScrollView("scroller", listView, B_WILL_DRAW | B_FRAME_EVENTS, false, true); listView->SetSelectionMessage(new BMessage(kMsgCountrySelection)); // get all available countries from ICU // Use DateFormat::getAvailableLocale so we get only the one we can // use. Maybe check the NumberFormat one and see if there is more. int32_t localeCount; const Locale* currentLocale = Locale::getAvailableLocales(localeCount); for (int index = 0; index < localeCount; index++) { UnicodeString countryFullName; BString string; BStringByteSink sink(&string); currentLocale[index].getDisplayName(countryFullName); countryFullName.toUTF8(sink); LanguageListItem* item = new LanguageListItem(string, currentLocale[index].getName(), NULL); listView->AddItem(item); if (!strcmp(currentLocale[index].getName(), defaultCountry->Code())) listView->Select(listView->CountItems() - 1); } // TODO: find a real solution intead of this hack listView->SetExplicitMinSize( BSize(25 * be_plain_font->Size(), B_SIZE_UNSET)); fFormatView = new FormatView(defaultCountry); countryTab->AddChild(BLayoutBuilder::Group<>(B_HORIZONTAL, spacing) .AddGroup(B_VERTICAL, 3) .Add(scrollView) .End() .Add(fFormatView) .SetInsets(spacing, spacing, spacing, spacing)); listView->ScrollToSelection(); tabView->AddTab(languageTab); tabView->AddTab(countryTab); BButton* button = new BButton(B_TRANSLATE("Defaults"), new BMessage(kMsgDefaults)); fRevertButton = new BButton(B_TRANSLATE("Revert"), new BMessage(kMsgRevert)); fRevertButton->SetEnabled(false); BLayoutBuilder::Group<>(this, B_VERTICAL, spacing) .Add(tabView) .AddGroup(B_HORIZONTAL, spacing) .Add(button) .Add(fRevertButton) .AddGlue() .End() .SetInsets(spacing, spacing, spacing, spacing) .End(); _UpdatePreferredFromLocaleRoster(); SettingsReverted(); CenterOnScreen(); }
// Handle messages to the main view void OutputFormatView::MessageReceived(BMessage *msg) { int32 item_index; const char *info_lines[3]; switch (msg->what) { case ITEM_SELECTED: if (msg->FindInt32("index", &item_index) == B_OK && item_index >= 0 && item_index < list_view->CountItems()) { // Store the currently selected item // in the class member 'index' index = item_index; // Update the info view and config view int32 outVersion; the_roster->GetTranslatorInfo( output_list[item_index].translator, &name_line, &info_line, &outVersion); int32 ver = outVersion / 100; int32 rev1 = (outVersion % 100) / 10; int32 rev2 = outVersion % 10; sprintf(version_line, "Version %ld.%ld.%ld", ver, rev1, rev2); info_lines[0] = name_line; info_lines[1] = info_line; info_lines[2] = version_line; info_view->SetInfoLines(info_lines); AddConfigView(); } else { // Reselect the original item if (index >= 0) list_view->Select(index); } break; case INVOKE_LIST: { // The main button was pressed // Find out which item is selected, and invoke it int32 item_count = list_view->CountItems(); for (int32 i = 0; i < item_count; ++i) { if (list_view->IsItemSelected(i)) { list_view->Invoke(); break; } } break; } case SEND_MESSAGE: // An output format has been selected if (!message_sent && msg->FindInt32("index", &item_index) == B_OK && item_index >= 0 && item_index < list_view->CountItems()) { // Get the message from the invoker BMessage *the_message=selected_invoker->Message(); // Add some info about the selected output format to it the_message->AddInt32("translator", output_list[item_index].translator); the_message->AddInt32("type", output_list[item_index].type); // Send the message selected_invoker->Invoke(the_message); message_sent = true; the_window->PostMessage(MESSAGE_SENT); } break; default: BView::MessageReceived(msg); break; } }