// --------------------------------------------------------------- // GetDefaultSettings // // Attempts to find the translator settings for // the translator named kTranslatorName with a version of // translatorVersion. // // Preconditions: // // Parameters: kTranslatorName, the name of the translator // the settings are for // translatorVersion, the version of the translator // to retrieve // // Postconditions: // // Returns: NULL, if anything went wrong // BMessage * of configuration data for kTranslatorName // --------------------------------------------------------------- BMessage * BTranslationUtils::GetDefaultSettings(const char *kTranslatorName, int32 translatorVersion) { BTranslatorRoster *roster = BTranslatorRoster::Default(); translator_id *translators = NULL; int32 numTranslators = 0; if (roster == NULL || roster->GetAllTranslators(&translators, &numTranslators) != B_OK) return NULL; // Cycle through all of the default translators // looking for a translator that matches the name and version // that I was given BMessage *pMessage = NULL; const char *currentTranName = NULL, *currentTranInfo = NULL; int32 currentTranVersion = 0; for (int i = 0; i < numTranslators; i++) { if (roster->GetTranslatorInfo(translators[i], ¤tTranName, ¤tTranInfo, ¤tTranVersion) == B_OK) { if (currentTranVersion == translatorVersion && strcmp(currentTranName, kTranslatorName) == 0) { pMessage = GetDefaultSettings(translators[i], roster); break; } } } delete[] translators; return pMessage; }
// Reads the installed translators and adds them to our BListView status_t DataTranslationsWindow::_PopulateListView() { BTranslatorRoster* roster = BTranslatorRoster::Default(); // Get all Translators on the system. Gives us the number of translators // installed in num_translators and a reference to the first one int32 numTranslators; translator_id* translators = NULL; roster->GetAllTranslators(&translators, &numTranslators); float maxWidth = 0; for (int32 i = 0; i < numTranslators; i++) { // Getting the first three Infos: Name, Info & Version int32 version; const char* name; const char* info; roster->GetTranslatorInfo(translators[i], &name, &info, &version); fTranslatorListView->AddItem(new TranslatorItem(translators[i], name)); maxWidth = std::max(maxWidth, fTranslatorListView->StringWidth(name)); } fTranslatorListView->SortItems(); fTranslatorListView->SetExplicitSize(BSize(maxWidth + 20, B_SIZE_UNSET)); delete[] translators; return B_OK; }
// Reads the installed translators and adds them to our BListView status_t DataTranslationsWindow::_PopulateListView() { BTranslatorRoster *roster = BTranslatorRoster::Default(); // Get all Translators on the system. Gives us the number of translators // installed in num_translators and a reference to the first one int32 numTranslators; translator_id *translators = NULL; roster->GetAllTranslators(&translators, &numTranslators); for (int32 i = 0; i < numTranslators; i++) { // Getting the first three Infos: Name, Info & Version int32 version; const char *name, *info; roster->GetTranslatorInfo(translators[i], &name, &info, &version); fTranslatorListView->AddItem(new TranslatorItem(translators[i], name)); } delete[] translators; return B_OK; }
status_t DataTranslationsWindow::_GetTranslatorInfo(int32 id, const char*& name, const char*& info, int32& version, BPath& path) { // Returns information about the translator with the given id if (id < 0) return B_BAD_VALUE; BTranslatorRoster* roster = BTranslatorRoster::Default(); if (roster->GetTranslatorInfo(id, &name, &info, &version) != B_OK) return B_ERROR; // Get the translator's path entry_ref ref; if (roster->GetRefFor(id, &ref) == B_OK) { BEntry entry(&ref); path.SetTo(&entry); } else path.Unset(); return B_OK; }
void SketchApp::ReadyToRun() { // Build a menu into your filepanel for fun and profit! SketchWindow *mainWindow = ((SketchWindow *)FindWindow("Etch-A-Sketch"B_UTF8_REGISTERED)); //BFilePanel *saver = NULL; BMenuField *formatMenu = NULL; BMenu *menu = NULL; BView *saverView = NULL; BRect rect, bounds; menu_info m_info; int32 menubarheight=0; // get some menu measurements get_menu_info(&m_info); menubarheight = (int32)m_info.font_size + 8; // make the filepanel saver = new BFilePanel(B_SAVE_PANEL, NULL, NULL, B_FILE_NODE, false); // _ctor if(saver->Window()->Lock()) { // get a pointer to a view saverView = (BView *)saver->Window()->ChildAt(0); // get a rect for the filepanel's window bounds = saverView->Bounds(); // make a menu menu = new BMenu("Format"); // construct the BMenuFeild for the menu rect.Set(bounds.right - 100, bounds.top + menubarheight, bounds.right - 40, bounds.top + menubarheight + 15); formatMenu = new BMenuField(rect, "format menu", "", menu); formatMenu->SetDivider(0); // Below was ganked from the BeBook //find all the translators BTranslatorRoster *roster = BTranslatorRoster::Default(); int32 num_translators, i; translator_id *translators; const char *translator_name, *translator_info; int32 translator_version; roster->GetAllTranslators(&translators, &num_translators); // function allocates the memory for translators for (i=0;i<num_translators;i++) { const translation_format *fmts; int32 num_fmts; roster->GetTranslatorInfo(translators[i], &translator_name, &translator_info, &translator_version); roster->GetOutputFormats(translators[i], &fmts, &num_fmts); if(fmts[0].group == B_TRANSLATOR_BITMAP) // make sure we only get bitmap translators { BMessage *message = new BMessage(TRANSLATOR); message->AddString("save format", fmts[0].MIME); if(i == 0) mainWindow->PostMessage(message); // this will init 'format' for us menu->AddItem(new BMenuItem(translator_name, message)); } //printf("%s: %s (%.2f)\n", translator_name, translator_info, translator_version/100.); } delete [] translators; // clean up our droppings // found em all menu->SetRadioMode(true); menu->ItemAt(0)->SetMarked(true); menu->SetTargetForItems(mainWindow); saverView->AddChild(formatMenu); saver->Window()->Unlock(); } }
// 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; } }