void FileTypeWindow::_AdoptPreferredApp(BMessage* message, bool sameAs) { if (retrieve_preferred_app(message, sameAs, fCommonType.String(), fCommonPreferredApp) == B_OK) { _AdoptPreferredApp(); _UpdatePreferredApps(); } }
void FileTypeWindow::_SetTo(const BMessage& refs) { SetTitle(_Title(refs).String()); // get common info and icons fCommonPreferredApp = ""; fCommonType = ""; entry_ref ref; for (int32 i = 0; refs.FindRef("refs", i, &ref) == B_OK; i++) { BNode node(&ref); if (node.InitCheck() != B_OK) continue; BNodeInfo info(&node); if (info.InitCheck() != B_OK) continue; // TODO: watch entries? entry_ref* copiedRef = new entry_ref(ref); fEntries.AddItem(copiedRef); char type[B_MIME_TYPE_LENGTH]; if (info.GetType(type) != B_OK) type[0] = '\0'; if (i > 0) { if (fCommonType != type) fCommonType = ""; } else fCommonType = type; char preferredApp[B_MIME_TYPE_LENGTH]; if (info.GetPreferredApp(preferredApp) != B_OK) preferredApp[0] = '\0'; if (i > 0) { if (fCommonPreferredApp != preferredApp) fCommonPreferredApp = ""; } else fCommonPreferredApp = preferredApp; if (i == 0) fIconView->SetTo(ref); } fTypeControl->SetText(fCommonType.String()); _UpdatePreferredApps(); fIconView->ShowIconHeap(fEntries.CountItems() != 1); }
void FileTypeWindow::MessageReceived(BMessage* message) { switch (message->what) { // File Type group case kMsgTypeEntered: fCommonType = fTypeControl->Text(); _AdoptType(); break; case kMsgSelectType: { BWindow* window = new TypeListWindow(fCommonType.String(), kMsgTypeSelected, this); window->Show(); break; } case kMsgTypeSelected: { const char* type; if (message->FindString("type", &type) == B_OK) { fCommonType = type; fTypeControl->SetText(type); _AdoptType(); } break; } case kMsgSameTypeAs: { BMessage panel(kMsgOpenFilePanel); panel.AddString("title", B_TRANSLATE("Select same type as")); panel.AddInt32("message", kMsgSameTypeAsOpened); panel.AddMessenger("target", this); be_app_messenger.SendMessage(&panel); break; } case kMsgSameTypeAsOpened: _AdoptType(message); break; // Preferred Application group case kMsgPreferredAppChosen: { const char* signature; if (message->FindString("signature", &signature) == B_OK) fCommonPreferredApp = signature; else fCommonPreferredApp = ""; _AdoptPreferredApp(); break; } case kMsgSelectPreferredApp: { BMessage panel(kMsgOpenFilePanel); panel.AddString("title", B_TRANSLATE("Select preferred application")); panel.AddInt32("message", kMsgPreferredAppOpened); panel.AddMessenger("target", this); be_app_messenger.SendMessage(&panel); break; } case kMsgPreferredAppOpened: _AdoptPreferredApp(message, false); break; case kMsgSamePreferredAppAs: { BMessage panel(kMsgOpenFilePanel); panel.AddString("title", B_TRANSLATE("Select same preferred application as")); panel.AddInt32("message", kMsgSamePreferredAppAsOpened); panel.AddMessenger("target", this); be_app_messenger.SendMessage(&panel); break; } case kMsgSamePreferredAppAsOpened: _AdoptPreferredApp(message, true); break; // Other case B_SIMPLE_DATA: { entry_ref ref; if (message->FindRef("refs", &ref) != B_OK) break; BFile file(&ref, B_READ_ONLY); if (is_application(file)) _AdoptPreferredApp(message, false); else _AdoptType(message); break; } case B_META_MIME_CHANGED: const char* type; int32 which; if (message->FindString("be:type", &type) != B_OK || message->FindInt32("be:which", &which) != B_OK) break; if (which == B_MIME_TYPE_DELETED || which == B_SUPPORTED_TYPES_CHANGED) { _UpdatePreferredApps(); } break; default: BWindow::MessageReceived(message); } }
void FileTypesWindow::MessageReceived(BMessage* message) { switch (message->what) { case B_SIMPLE_DATA: type_code type; if (message->GetInfo("refs", &type) == B_OK && type == B_REF_TYPE) { be_app->PostMessage(message); } break; case kMsgToggleIcons: { BMenuItem* item; if (message->FindPointer("source", (void **)&item) != B_OK) break; item->SetMarked(!fTypeListView->IsShowingIcons()); fTypeListView->ShowIcons(item->IsMarked()); // update settings BMessage update(kMsgSettingsChanged); update.AddBool("show_icons", item->IsMarked()); be_app_messenger.SendMessage(&update); break; } case kMsgToggleRule: { BMenuItem* item; if (message->FindPointer("source", (void **)&item) != B_OK) break; item->SetMarked(fRuleControl->IsHidden()); _ShowSnifferRule(item->IsMarked()); // update settings BMessage update(kMsgSettingsChanged); update.AddBool("show_rule", item->IsMarked()); be_app_messenger.SendMessage(&update); break; } case kMsgTypeSelected: { int32 index; if (message->FindInt32("index", &index) == B_OK) { MimeTypeItem* item = (MimeTypeItem*)fTypeListView->ItemAt(index); if (item != NULL) { BMimeType type(item->Type()); _SetType(&type); } else _SetType(NULL); } break; } case kMsgAddType: { if (fNewTypeWindow == NULL) { fNewTypeWindow = new NewFileTypeWindow(this, fCurrentType.Type()); fNewTypeWindow->Show(); } else fNewTypeWindow->Activate(); break; } case kMsgNewTypeWindowClosed: fNewTypeWindow = NULL; break; case kMsgRemoveType: { if (fCurrentType.Type() == NULL) break; BAlert* alert; if (fCurrentType.IsSupertypeOnly()) { alert = new BPrivate::OverrideAlert("FileTypes Request", "Removing a super type cannot be reverted.\n" "All file types that belong to this super type " "will be lost!\n\n" "Are you sure you want to do this? To remove the whole " "group, hold down the Shift key and press \"Remove\".", "Remove", B_SHIFT_KEY, "Cancel", 0, NULL, 0, B_WIDTH_AS_USUAL, B_STOP_ALERT); } else { alert = new BAlert("FileTypes Request", "Removing a file type cannot be reverted.\n" "Are you sure you want to remove it?", "Remove", "Cancel", NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT); } if (alert->Go()) break; status_t status = fCurrentType.Delete(); if (status != B_OK) fprintf(stderr, "Could not remove file type: %s\n", strerror(status)); break; } case kMsgSelectNewType: { const char* type; if (message->FindString("type", &type) == B_OK) fTypeListView->SelectNewType(type); break; } // File Recognition group case kMsgExtensionSelected: { int32 index; if (message->FindInt32("index", &index) == B_OK) { BStringItem* item = (BStringItem*)fExtensionListView->ItemAt(index); fRemoveExtensionButton->SetEnabled(item != NULL); } break; } case kMsgExtensionInvoked: { if (fCurrentType.Type() == NULL) break; int32 index; if (message->FindInt32("index", &index) == B_OK) { BStringItem* item = (BStringItem*)fExtensionListView->ItemAt(index); if (item == NULL) break; BWindow* window = new ExtensionWindow(this, fCurrentType, item->Text()); window->Show(); } break; } case kMsgAddExtension: { if (fCurrentType.Type() == NULL) break; BWindow* window = new ExtensionWindow(this, fCurrentType, NULL); window->Show(); break; } case kMsgRemoveExtension: { int32 index = fExtensionListView->CurrentSelection(); if (index < 0 || fCurrentType.Type() == NULL) break; BMessage extensions; if (fCurrentType.GetFileExtensions(&extensions) == B_OK) { extensions.RemoveData("extensions", index); fCurrentType.SetFileExtensions(&extensions); } break; } case kMsgRuleEntered: { // check rule BString parseError; if (BMimeType::CheckSnifferRule(fRuleControl->Text(), &parseError) != B_OK) { parseError.Prepend("Recognition rule is not valid:\n\n"); error_alert(parseError.String()); } else fCurrentType.SetSnifferRule(fRuleControl->Text()); break; } // Description group case kMsgTypeEntered: { fCurrentType.SetShortDescription(fTypeNameControl->Text()); break; } case kMsgDescriptionEntered: { fCurrentType.SetLongDescription(fDescriptionControl->Text()); break; } // Preferred Application group case kMsgPreferredAppChosen: { const char* signature; if (message->FindString("signature", &signature) != B_OK) signature = NULL; fCurrentType.SetPreferredApp(signature); break; } case kMsgSelectPreferredApp: { BMessage panel(kMsgOpenFilePanel); panel.AddString("title", "Select preferred application"); panel.AddInt32("message", kMsgPreferredAppOpened); panel.AddMessenger("target", this); be_app_messenger.SendMessage(&panel); break; } case kMsgPreferredAppOpened: _AdoptPreferredApplication(message, false); break; case kMsgSamePreferredAppAs: { BMessage panel(kMsgOpenFilePanel); panel.AddString("title", "Select same preferred application as"); panel.AddInt32("message", kMsgSamePreferredAppAsOpened); panel.AddMessenger("target", this); be_app_messenger.SendMessage(&panel); break; } case kMsgSamePreferredAppAsOpened: _AdoptPreferredApplication(message, true); break; // Extra Attributes group case kMsgAttributeSelected: { int32 index; if (message->FindInt32("index", &index) == B_OK) { AttributeItem* item = (AttributeItem*)fAttributeListView->ItemAt(index); fRemoveAttributeButton->SetEnabled(item != NULL); } break; } case kMsgAttributeInvoked: { if (fCurrentType.Type() == NULL) break; int32 index; if (message->FindInt32("index", &index) == B_OK) { AttributeItem* item = (AttributeItem*)fAttributeListView->ItemAt(index); if (item == NULL) break; BWindow* window = new AttributeWindow(this, fCurrentType, item); window->Show(); } break; } case kMsgAddAttribute: { if (fCurrentType.Type() == NULL) break; BWindow* window = new AttributeWindow(this, fCurrentType, NULL); window->Show(); break; } case kMsgRemoveAttribute: { int32 index = fAttributeListView->CurrentSelection(); if (index < 0 || fCurrentType.Type() == NULL) break; BMessage attributes; if (fCurrentType.GetAttrInfo(&attributes) == B_OK) { const char* kAttributeNames[] = { "attr:public_name", "attr:name", "attr:type", "attr:editable", "attr:viewable", "attr:extra", "attr:alignment", "attr:width", "attr:display_as" }; for (uint32 i = 0; i < sizeof(kAttributeNames) / sizeof(kAttributeNames[0]); i++) { attributes.RemoveData(kAttributeNames[i], index); } fCurrentType.SetAttrInfo(&attributes); } break; } case B_META_MIME_CHANGED: { const char* type; int32 which; if (message->FindString("be:type", &type) != B_OK || message->FindInt32("be:which", &which) != B_OK) break; if (fCurrentType.Type() == NULL) break; if (!strcasecmp(fCurrentType.Type(), type)) { if (which != B_MIME_TYPE_DELETED) _SetType(&fCurrentType, which); else _SetType(NULL); } else { // this change could still affect our current type if (which == B_MIME_TYPE_DELETED #ifdef __ANTARES__ || which == B_SUPPORTED_TYPES_CHANGED #endif || which == B_PREFERRED_APP_CHANGED) _UpdatePreferredApps(&fCurrentType); } break; } default: BWindow::MessageReceived(message); } }
void FileTypesWindow::_SetType(BMimeType* type, int32 forceUpdate) { bool enabled = type != NULL; // update controls if (type != NULL) { if (fCurrentType == *type) { if (!forceUpdate) return; } else forceUpdate = B_EVERYTHING_CHANGED; if (&fCurrentType != type) fCurrentType.SetTo(type->Type()); fInternalNameView->SetText(type->Type()); char description[B_MIME_TYPE_LENGTH]; if ((forceUpdate & B_SHORT_DESCRIPTION_CHANGED) != 0) { if (type->GetShortDescription(description) != B_OK) description[0] = '\0'; fTypeNameControl->SetText(description); } if ((forceUpdate & B_LONG_DESCRIPTION_CHANGED) != 0) { if (type->GetLongDescription(description) != B_OK) description[0] = '\0'; fDescriptionControl->SetText(description); } if ((forceUpdate & B_SNIFFER_RULE_CHANGED) != 0) { BString rule; if (type->GetSnifferRule(&rule) != B_OK) rule = ""; fRuleControl->SetText(rule.String()); } fExtensionListView->SetType(&fCurrentType); } else { fCurrentType.Unset(); fInternalNameView->SetText(NULL); fTypeNameControl->SetText(NULL); fDescriptionControl->SetText(NULL); fRuleControl->SetText(NULL); fPreferredField->Menu()->ItemAt(0)->SetMarked(true); fExtensionListView->SetType(NULL); } if ((forceUpdate & B_FILE_EXTENSIONS_CHANGED) != 0) _UpdateExtensions(type); if ((forceUpdate & B_PREFERRED_APP_CHANGED) != 0) _UpdatePreferredApps(type); if ((forceUpdate & (B_ICON_CHANGED | B_PREFERRED_APP_CHANGED)) != 0) _UpdateIcon(type); if ((forceUpdate & B_ATTR_INFO_CHANGED) != 0) fAttributeListView->SetTo(type); // enable/disable controls fIconView->SetEnabled(enabled); fInternalNameView->SetEnabled(enabled); fTypeNameControl->SetEnabled(enabled); fDescriptionControl->SetEnabled(enabled); fPreferredField->SetEnabled(enabled); fRemoveTypeButton->SetEnabled(enabled); fSelectButton->SetEnabled(enabled); fSameAsButton->SetEnabled(enabled); fExtensionLabel->SetEnabled(enabled); fAddExtensionButton->SetEnabled(enabled); fRemoveExtensionButton->SetEnabled(false); fRuleControl->SetEnabled(enabled); fAddAttributeButton->SetEnabled(enabled); fRemoveAttributeButton->SetEnabled(false); }