16af4da5dSStephan Aßmus // Copyright 1999, Be Incorporated. All Rights Reserved. 26af4da5dSStephan Aßmus // Copyright 2000-2004, Jun Suzuki. All Rights Reserved. 37730c846SStephan Aßmus // Copyright 2007, 2010 Stephan Aßmus. All Rights Reserved. 4dd55ed1aSAlex Wilson // Copyright 2010, Haiku, Inc. All Rights Reserved. 56af4da5dSStephan Aßmus // This file may be used under the terms of the Be Sample Code License. 67730c846SStephan Aßmus 76af4da5dSStephan Aßmus #include "MediaConverterWindow.h" 86af4da5dSStephan Aßmus 96af4da5dSStephan Aßmus #include <stdio.h> 106af4da5dSStephan Aßmus #include <string.h> 116af4da5dSStephan Aßmus 12*b97c5149SJonas Sundström #include <AboutMenuItem.h> 136af4da5dSStephan Aßmus #include <Alert.h> 146af4da5dSStephan Aßmus #include <Application.h> 156af4da5dSStephan Aßmus #include <Box.h> 166af4da5dSStephan Aßmus #include <Button.h> 17ae0f70fcSAdrien Destugues #include <Catalog.h> 18dd55ed1aSAlex Wilson #include <ControlLook.h> 196af4da5dSStephan Aßmus #include <FilePanel.h> 20dd55ed1aSAlex Wilson #include <LayoutBuilder.h> 21ae0f70fcSAdrien Destugues #include <Locale.h> 226af4da5dSStephan Aßmus #include <Menu.h> 236af4da5dSStephan Aßmus #include <MenuBar.h> 246af4da5dSStephan Aßmus #include <MenuField.h> 256af4da5dSStephan Aßmus #include <MenuItem.h> 266af4da5dSStephan Aßmus #include <Path.h> 276af4da5dSStephan Aßmus #include <PopUpMenu.h> 286af4da5dSStephan Aßmus #include <Roster.h> 296af4da5dSStephan Aßmus #include <ScrollBar.h> 306af4da5dSStephan Aßmus #include <ScrollView.h> 316af4da5dSStephan Aßmus #include <Slider.h> 326af4da5dSStephan Aßmus #include <StringView.h> 336af4da5dSStephan Aßmus #include <TextControl.h> 346af4da5dSStephan Aßmus 356af4da5dSStephan Aßmus #include "MediaFileInfoView.h" 366af4da5dSStephan Aßmus #include "MediaFileListView.h" 376af4da5dSStephan Aßmus #include "MessageConstants.h" 38ae0f70fcSAdrien Destugues 39ae0f70fcSAdrien Destugues 40ae0f70fcSAdrien Destugues #undef B_TRANSLATE_CONTEXT 41ae0f70fcSAdrien Destugues #define B_TRANSLATE_CONTEXT "MediaConverter" 42ae0f70fcSAdrien Destugues #define VERSION "1.3.0" 436af4da5dSStephan Aßmus 446af4da5dSStephan Aßmus 456af4da5dSStephan Aßmus // #pragma mark - DirectoryFilter 466af4da5dSStephan Aßmus 476af4da5dSStephan Aßmus 4860b6f368SStephan Aßmus class DirectoryFilter : public BRefFilter { 496af4da5dSStephan Aßmus public: 506af4da5dSStephan Aßmus DirectoryFilter() {}; 516af4da5dSStephan Aßmus virtual bool Filter(const entry_ref* ref, 5260b6f368SStephan Aßmus BNode* node, struct stat_beos* st, const char* filetype) 536af4da5dSStephan Aßmus { 546af4da5dSStephan Aßmus return node->IsDirectory(); 556af4da5dSStephan Aßmus } 566af4da5dSStephan Aßmus }; 576af4da5dSStephan Aßmus 586af4da5dSStephan Aßmus 596af4da5dSStephan Aßmus // #pragma mark - FileFormatMenuItem 606af4da5dSStephan Aßmus 616af4da5dSStephan Aßmus 626af4da5dSStephan Aßmus class FileFormatMenuItem : public BMenuItem { 636af4da5dSStephan Aßmus public: 646af4da5dSStephan Aßmus FileFormatMenuItem(media_file_format* format); 656af4da5dSStephan Aßmus virtual ~FileFormatMenuItem(); 666af4da5dSStephan Aßmus 676af4da5dSStephan Aßmus media_file_format fFileFormat; 686af4da5dSStephan Aßmus }; 696af4da5dSStephan Aßmus 706af4da5dSStephan Aßmus 716af4da5dSStephan Aßmus FileFormatMenuItem::FileFormatMenuItem(media_file_format *format) 72dd55ed1aSAlex Wilson : 73dd55ed1aSAlex Wilson BMenuItem(format->pretty_name, new BMessage(FORMAT_SELECT_MESSAGE)) 746af4da5dSStephan Aßmus { 756af4da5dSStephan Aßmus memcpy(&fFileFormat, format, sizeof(fFileFormat)); 766af4da5dSStephan Aßmus } 776af4da5dSStephan Aßmus 786af4da5dSStephan Aßmus 796af4da5dSStephan Aßmus FileFormatMenuItem::~FileFormatMenuItem() 806af4da5dSStephan Aßmus { 816af4da5dSStephan Aßmus } 826af4da5dSStephan Aßmus 836af4da5dSStephan Aßmus 846af4da5dSStephan Aßmus // #pragma mark - CodecMenuItem 856af4da5dSStephan Aßmus 866af4da5dSStephan Aßmus 876af4da5dSStephan Aßmus class CodecMenuItem : public BMenuItem { 886af4da5dSStephan Aßmus public: 896af4da5dSStephan Aßmus CodecMenuItem(media_codec_info *ci, uint32 msg_type); 906af4da5dSStephan Aßmus virtual ~CodecMenuItem(); 916af4da5dSStephan Aßmus 926af4da5dSStephan Aßmus media_codec_info fCodecInfo; 936af4da5dSStephan Aßmus }; 946af4da5dSStephan Aßmus 956af4da5dSStephan Aßmus 966af4da5dSStephan Aßmus CodecMenuItem::CodecMenuItem(media_codec_info *ci, uint32 msg_type) 97dd55ed1aSAlex Wilson : 98dd55ed1aSAlex Wilson BMenuItem(ci->pretty_name, new BMessage(msg_type)) 996af4da5dSStephan Aßmus { 1006af4da5dSStephan Aßmus memcpy(&fCodecInfo, ci, sizeof(fCodecInfo)); 1016af4da5dSStephan Aßmus } 1026af4da5dSStephan Aßmus 1036af4da5dSStephan Aßmus 1046af4da5dSStephan Aßmus CodecMenuItem::~CodecMenuItem() 1056af4da5dSStephan Aßmus { 1066af4da5dSStephan Aßmus } 1076af4da5dSStephan Aßmus 1086af4da5dSStephan Aßmus 1096af4da5dSStephan Aßmus // #pragma mark - MediaConverterWindow 1106af4da5dSStephan Aßmus 1116af4da5dSStephan Aßmus 1126af4da5dSStephan Aßmus MediaConverterWindow::MediaConverterWindow(BRect frame) 113dd55ed1aSAlex Wilson : 114*b97c5149SJonas Sundström BWindow(frame, B_TRANSLATE_APP_NAME("MediaConverter"), B_TITLED_WINDOW_LOOK, 115007d8a0cSSiarzhuk Zharski B_NORMAL_WINDOW_FEEL, B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS | 116007d8a0cSSiarzhuk Zharski B_AUTO_UPDATE_SIZE_LIMITS), 117dd55ed1aSAlex Wilson fVideoQuality(75), 118dd55ed1aSAlex Wilson fAudioQuality(75), 119dd55ed1aSAlex Wilson fSaveFilePanel(NULL), 120dd55ed1aSAlex Wilson fOpenFilePanel(NULL), 121dd55ed1aSAlex Wilson fOutputDirSpecified(false), 122dd55ed1aSAlex Wilson fEnabled(true), 123dd55ed1aSAlex Wilson fConverting(false), 124dd55ed1aSAlex Wilson fCancelling(false) 1256af4da5dSStephan Aßmus { 1260a81944dSStephan Aßmus const char* defaultDirectory = "/boot/home"; 1270a81944dSStephan Aßmus fOutputDir.SetTo(defaultDirectory); 1286af4da5dSStephan Aßmus 129dd55ed1aSAlex Wilson fMenuBar = new BMenuBar("menubar"); 1306af4da5dSStephan Aßmus _CreateMenu(); 1316af4da5dSStephan Aßmus 132dd55ed1aSAlex Wilson fListView = new MediaFileListView(); 133dd55ed1aSAlex Wilson fListView->SetExplicitMinSize(BSize(100, B_SIZE_UNSET)); 134dd55ed1aSAlex Wilson BScrollView* scroller = new BScrollView(NULL, fListView, 0, false, true); 1356af4da5dSStephan Aßmus 1366af4da5dSStephan Aßmus // file list view box 137dd55ed1aSAlex Wilson fSourcesBox = new BBox(B_FANCY_BORDER, scroller); 138dd55ed1aSAlex Wilson fSourcesBox->SetLayout(new BGroupLayout(B_HORIZONTAL, 0)); 139dd55ed1aSAlex Wilson // We give fSourcesBox a layout to provide insets for the sources list 140dd55ed1aSAlex Wilson // said insets are adjusted in _UpdateLabels 1416af4da5dSStephan Aßmus 142dd55ed1aSAlex Wilson fInfoView = new MediaFileInfoView(); 143dd55ed1aSAlex Wilson fInfoBox = new BBox(B_FANCY_BORDER, fInfoView); 144dd55ed1aSAlex Wilson fInfoBox->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH, 145dd55ed1aSAlex Wilson B_ALIGN_USE_FULL_HEIGHT)); 1467730c846SStephan Aßmus fInfoBox->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET)); 1477730c846SStephan Aßmus 1487730c846SStephan Aßmus float padding = be_control_look->DefaultItemSpacing(); 1496af4da5dSStephan Aßmus 150dd55ed1aSAlex Wilson // Output format box 151dd55ed1aSAlex Wilson fOutputBox = new BBox(B_FANCY_BORDER, NULL); 1520a81944dSStephan Aßmus BGridLayout* outputGrid = new BGridLayout(padding, padding); 1530a81944dSStephan Aßmus fOutputBox->SetLayout(outputGrid); 154dd55ed1aSAlex Wilson // fOutputBox's layout is also adjusted in _UpdateLabels 1557730c846SStephan Aßmus outputGrid->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH, 1567730c846SStephan Aßmus B_ALIGN_USE_FULL_HEIGHT)); 1577730c846SStephan Aßmus fOutputBox->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED)); 1586af4da5dSStephan Aßmus 159ae0f70fcSAdrien Destugues fFormatMenu = new BMenuField(NULL, B_TRANSLATE("File format:"), 160ae0f70fcSAdrien Destugues new BPopUpMenu("")); 161ae0f70fcSAdrien Destugues fAudioMenu = new BMenuField(NULL, B_TRANSLATE("Audio encoding:"), 162ae0f70fcSAdrien Destugues new BPopUpMenu("")); 163ae0f70fcSAdrien Destugues fVideoMenu = new BMenuField(NULL, B_TRANSLATE("Video encoding:"), 164ae0f70fcSAdrien Destugues new BPopUpMenu("")); 1656af4da5dSStephan Aßmus 1666af4da5dSStephan Aßmus // output folder 167ae0f70fcSAdrien Destugues fDestButton = new BButton(B_TRANSLATE("Output folder"), 168dd55ed1aSAlex Wilson new BMessage(OUTPUT_FOLDER_MESSAGE)); 169dd55ed1aSAlex Wilson BAlignment labelAlignment(be_control_look->DefaultLabelAlignment()); 1700a81944dSStephan Aßmus fOutputFolder = new BStringView(NULL, defaultDirectory); 171dd55ed1aSAlex Wilson fOutputFolder->SetExplicitAlignment(labelAlignment); 1726af4da5dSStephan Aßmus 1736af4da5dSStephan Aßmus // start/end duration 174dd55ed1aSAlex Wilson fStartDurationTC = new BTextControl(NULL, NULL, NULL); 1756af4da5dSStephan Aßmus fStartDurationTC->SetText("0"); 1766af4da5dSStephan Aßmus 177dd55ed1aSAlex Wilson fEndDurationTC = new BTextControl(NULL, NULL, NULL); 1786af4da5dSStephan Aßmus fEndDurationTC->SetText("0"); 1796af4da5dSStephan Aßmus 1806af4da5dSStephan Aßmus // Video Quality 181dd55ed1aSAlex Wilson fVideoQualitySlider = new BSlider("VSlider", "" , 182dd55ed1aSAlex Wilson new BMessage(VIDEO_QUALITY_CHANGED_MESSAGE), 1, 100, B_HORIZONTAL); 1836af4da5dSStephan Aßmus fVideoQualitySlider->SetValue(fVideoQuality); 1846af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(false); 1856af4da5dSStephan Aßmus 1866af4da5dSStephan Aßmus // Audio Quality 187dd55ed1aSAlex Wilson fAudioQualitySlider = new BSlider("ASlider", "" , 188dd55ed1aSAlex Wilson new BMessage(AUDIO_QUALITY_CHANGED_MESSAGE), 1, 100, B_HORIZONTAL); 1896af4da5dSStephan Aßmus fAudioQualitySlider->SetValue(fAudioQuality); 1906af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(false); 191dd55ed1aSAlex Wilson 1920a81944dSStephan Aßmus BLayoutBuilder::Grid<>(outputGrid) 193dd55ed1aSAlex Wilson .SetInsets(padding, padding, padding, padding) 194dd55ed1aSAlex Wilson .AddMenuField(fFormatMenu, 0, 0) 195dd55ed1aSAlex Wilson .AddMenuField(fAudioMenu, 0, 1) 196dd55ed1aSAlex Wilson .AddMenuField(fVideoMenu, 0, 2) 197dd55ed1aSAlex Wilson .Add(fDestButton, 0, 3) 198dd55ed1aSAlex Wilson .Add(fOutputFolder, 1, 3) 199dd55ed1aSAlex Wilson .AddTextControl(fStartDurationTC, 0, 4) 200dd55ed1aSAlex Wilson .AddTextControl(fEndDurationTC, 0, 5) 201dd55ed1aSAlex Wilson .Add(fVideoQualitySlider, 0, 6, 2, 1) 202dd55ed1aSAlex Wilson .Add(fAudioQualitySlider, 0, 7, 2, 1); 2036af4da5dSStephan Aßmus 2046af4da5dSStephan Aßmus // buttons 205ae0f70fcSAdrien Destugues fPreviewButton = new BButton(B_TRANSLATE("Preview"), 206dd55ed1aSAlex Wilson new BMessage(PREVIEW_MESSAGE)); 2076af4da5dSStephan Aßmus fPreviewButton->SetEnabled(false); 2086af4da5dSStephan Aßmus 209ae0f70fcSAdrien Destugues fConvertButton = new BButton(B_TRANSLATE("Convert"), 210dd55ed1aSAlex Wilson new BMessage(CONVERT_BUTTON_MESSAGE)); 2116af4da5dSStephan Aßmus 212dd55ed1aSAlex Wilson // Status views 213dd55ed1aSAlex Wilson fStatus = new BStringView(NULL, NULL); 214dd55ed1aSAlex Wilson fStatus->SetExplicitAlignment(labelAlignment); 215dd55ed1aSAlex Wilson fFileStatus = new BStringView(NULL, NULL); 216dd55ed1aSAlex Wilson fFileStatus->SetExplicitAlignment(labelAlignment); 2176af4da5dSStephan Aßmus 2186af4da5dSStephan Aßmus SetStatusMessage(""); 2196af4da5dSStephan Aßmus _UpdateLabels(); 2206af4da5dSStephan Aßmus 221dd55ed1aSAlex Wilson BLayoutBuilder::Group<>(this, B_VERTICAL, 0) 222dd55ed1aSAlex Wilson .SetInsets(0, 0, 0, 0) 223dd55ed1aSAlex Wilson .Add(fMenuBar) 2247730c846SStephan Aßmus .AddSplit(B_HORIZONTAL, padding / 2) 225dd55ed1aSAlex Wilson .SetInsets(padding, padding, padding, padding) 2267730c846SStephan Aßmus .Add(fSourcesBox, 0.4) 2277730c846SStephan Aßmus .AddGroup(B_VERTICAL, padding, 0.6) 2287730c846SStephan Aßmus .Add(fInfoBox) 2297730c846SStephan Aßmus .Add(fOutputBox) 2307730c846SStephan Aßmus .End() 2317730c846SStephan Aßmus .End() 2327730c846SStephan Aßmus .AddGrid(padding, padding) 2337730c846SStephan Aßmus .SetInsets(padding, 0, padding, padding) 234dd55ed1aSAlex Wilson .Add(fStatus, 0, 0) 235dd55ed1aSAlex Wilson .Add(fFileStatus, 0, 1) 236dd55ed1aSAlex Wilson .Add(fPreviewButton, 2, 0) 2377730c846SStephan Aßmus .Add(fConvertButton, 3, 0) 2387730c846SStephan Aßmus .End() 2397730c846SStephan Aßmus ; 2406af4da5dSStephan Aßmus } 2416af4da5dSStephan Aßmus 2426af4da5dSStephan Aßmus 2436af4da5dSStephan Aßmus MediaConverterWindow::~MediaConverterWindow() 2446af4da5dSStephan Aßmus { 2453c0f9a7cSKarsten Heimrich delete fSaveFilePanel; 2463c0f9a7cSKarsten Heimrich delete fOpenFilePanel; 2476af4da5dSStephan Aßmus } 2486af4da5dSStephan Aßmus 2496af4da5dSStephan Aßmus 2506af4da5dSStephan Aßmus // #pragma mark - 2516af4da5dSStephan Aßmus 2526af4da5dSStephan Aßmus 2536af4da5dSStephan Aßmus void 2546af4da5dSStephan Aßmus MediaConverterWindow::MessageReceived(BMessage* msg) 2556af4da5dSStephan Aßmus { 2566af4da5dSStephan Aßmus entry_ref inRef; 2576af4da5dSStephan Aßmus 2586af4da5dSStephan Aßmus char buffer[40]; 259f086ada7SStephan Aßmus BEntry inEntry; 2606af4da5dSStephan Aßmus 2616af4da5dSStephan Aßmus switch (msg->what) { 2626af4da5dSStephan Aßmus #if B_BEOS_VERSION <= B_BEOS_VERSION_6 2636af4da5dSStephan Aßmus case B_LANGUAGE_CHANGED: 2646af4da5dSStephan Aßmus LanguageChanged(); 2656af4da5dSStephan Aßmus break; 2666af4da5dSStephan Aßmus #endif 2676af4da5dSStephan Aßmus 2686af4da5dSStephan Aßmus case INIT_FORMAT_MENUS: 2696af4da5dSStephan Aßmus BuildFormatMenu(); 2706af4da5dSStephan Aßmus if (CountSourceFiles() == 0) 2716af4da5dSStephan Aßmus SetEnabled(false, false); 2726af4da5dSStephan Aßmus break; 2736af4da5dSStephan Aßmus 2746af4da5dSStephan Aßmus case B_SIMPLE_DATA: 275f086ada7SStephan Aßmus if (msg->WasDropped()) { 2766af4da5dSStephan Aßmus DetachCurrentMessage(); 2776af4da5dSStephan Aßmus msg->what = B_REFS_RECEIVED; 2786af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(msg); 2796af4da5dSStephan Aßmus delete msg; 2806af4da5dSStephan Aßmus } 2816af4da5dSStephan Aßmus break; 2826af4da5dSStephan Aßmus 2836af4da5dSStephan Aßmus case FORMAT_SELECT_MESSAGE: 2846af4da5dSStephan Aßmus BuildAudioVideoMenus(); 2856af4da5dSStephan Aßmus break; 2866af4da5dSStephan Aßmus case AUDIO_CODEC_SELECT_MESSAGE: 2876af4da5dSStephan Aßmus break; 2886af4da5dSStephan Aßmus case VIDEO_CODEC_SELECT_MESSAGE: 2896af4da5dSStephan Aßmus break; 2906af4da5dSStephan Aßmus 2916af4da5dSStephan Aßmus case CONVERT_BUTTON_MESSAGE: 2926af4da5dSStephan Aßmus if (!fConverting) { 293ae0f70fcSAdrien Destugues fConvertButton->SetLabel(B_TRANSLATE("Cancel")); 2946af4da5dSStephan Aßmus fConverting = true; 295ae0f70fcSAdrien Destugues SetStatusMessage(B_TRANSLATE("Convert")); 2966af4da5dSStephan Aßmus SetEnabled(false, true); 2976af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(START_CONVERSION_MESSAGE); 2986af4da5dSStephan Aßmus } else if (!fCancelling) { 2996af4da5dSStephan Aßmus fCancelling = true; 300ae0f70fcSAdrien Destugues SetStatusMessage(B_TRANSLATE("Cancelling" B_UTF8_ELLIPSIS)); 3016af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE); 3026af4da5dSStephan Aßmus } 3036af4da5dSStephan Aßmus break; 3046af4da5dSStephan Aßmus 3056af4da5dSStephan Aßmus case CONVERSION_DONE_MESSAGE: 306f086ada7SStephan Aßmus { 307ae0f70fcSAdrien Destugues SetStatusMessage(fCancelling ? B_TRANSLATE("Conversion cancelled") 308ae0f70fcSAdrien Destugues : B_TRANSLATE("Conversion completed")); 3096af4da5dSStephan Aßmus fConverting = false; 3106af4da5dSStephan Aßmus fCancelling = false; 3116af4da5dSStephan Aßmus bool enable = CountSourceFiles() > 0; 3126af4da5dSStephan Aßmus SetEnabled(enable, enable); 313ae0f70fcSAdrien Destugues fConvertButton->SetLabel(B_TRANSLATE("Convert")); 3146af4da5dSStephan Aßmus break; 315f086ada7SStephan Aßmus } 3166af4da5dSStephan Aßmus 3176af4da5dSStephan Aßmus case OUTPUT_FOLDER_MESSAGE: 3186af4da5dSStephan Aßmus // Execute Save Panel 319f086ada7SStephan Aßmus if (fSaveFilePanel == NULL) { 320f086ada7SStephan Aßmus BButton* selectThisDir; 3216af4da5dSStephan Aßmus 3223c0f9a7cSKarsten Heimrich BMessage message(FOLDER_SELECT_MESSAGE); 3233c0f9a7cSKarsten Heimrich fSaveFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL, 3243c0f9a7cSKarsten Heimrich B_DIRECTORY_NODE, true, &message, NULL, false, true); 325ae0f70fcSAdrien Destugues fSaveFilePanel->SetButtonLabel(B_DEFAULT_BUTTON, 326ae0f70fcSAdrien Destugues B_TRANSLATE("Select")); 3276af4da5dSStephan Aßmus fSaveFilePanel->SetTarget(this); 3286af4da5dSStephan Aßmus 3296af4da5dSStephan Aßmus fSaveFilePanel->Window()->Lock(); 330ae0f70fcSAdrien Destugues fSaveFilePanel->Window()->SetTitle( 331ae0f70fcSAdrien Destugues B_TRANSLATE("MediaConverter+:SaveDirectory")); 332f086ada7SStephan Aßmus BRect buttonRect 333f086ada7SStephan Aßmus = fSaveFilePanel->Window()->ChildAt(0)->FindView( 334f086ada7SStephan Aßmus "cancel button")->Frame(); 335f086ada7SStephan Aßmus buttonRect.right = buttonRect.left - 20; 336f086ada7SStephan Aßmus buttonRect.left = buttonRect.right - 130; 337ae0f70fcSAdrien Destugues selectThisDir = new BButton(buttonRect, NULL, 338ae0f70fcSAdrien Destugues B_TRANSLATE("Select this folder"), 339f086ada7SStephan Aßmus new BMessage(SELECT_THIS_DIR_MESSAGE), 340f086ada7SStephan Aßmus B_FOLLOW_BOTTOM | B_FOLLOW_RIGHT); 341f086ada7SStephan Aßmus selectThisDir->SetTarget(this); 342f086ada7SStephan Aßmus fSaveFilePanel->Window()->ChildAt(0)->AddChild(selectThisDir); 3436af4da5dSStephan Aßmus fSaveFilePanel->Window()->Unlock(); 3446af4da5dSStephan Aßmus 345f086ada7SStephan Aßmus fSaveFilePanel->SetRefFilter(new DirectoryFilter); 3466af4da5dSStephan Aßmus } 3476af4da5dSStephan Aßmus fSaveFilePanel->Show(); 3486af4da5dSStephan Aßmus break; 3496af4da5dSStephan Aßmus 3506af4da5dSStephan Aßmus case FOLDER_SELECT_MESSAGE: 3516af4da5dSStephan Aßmus // "SELECT" Button at Save Panel Pushed 3526af4da5dSStephan Aßmus fSaveFilePanel->GetNextSelectedRef(&inRef); 353f086ada7SStephan Aßmus inEntry.SetTo(&inRef, true); 354f086ada7SStephan Aßmus _SetOutputFolder(inEntry); 3556af4da5dSStephan Aßmus fOutputDirSpecified = true; 3566af4da5dSStephan Aßmus break; 3576af4da5dSStephan Aßmus 3586af4da5dSStephan Aßmus case SELECT_THIS_DIR_MESSAGE: 3596af4da5dSStephan Aßmus // "THIS DIR" Button at Save Panel Pushed 3606af4da5dSStephan Aßmus fSaveFilePanel->GetPanelDirectory(&inRef); 3616af4da5dSStephan Aßmus fSaveFilePanel->Hide(); 362f086ada7SStephan Aßmus inEntry.SetTo(&inRef, true); 363f086ada7SStephan Aßmus _SetOutputFolder(inEntry); 3646af4da5dSStephan Aßmus fOutputDirSpecified = true; 3656af4da5dSStephan Aßmus break; 3666af4da5dSStephan Aßmus 3676af4da5dSStephan Aßmus case OPEN_FILE_MESSAGE: 3686af4da5dSStephan Aßmus // Execute Open Panel 3696af4da5dSStephan Aßmus if (!fOpenFilePanel) { 3703c0f9a7cSKarsten Heimrich fOpenFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL, 3713c0f9a7cSKarsten Heimrich B_FILE_NODE, true, NULL, NULL, false, true); 3726af4da5dSStephan Aßmus fOpenFilePanel->SetTarget(this); 3736af4da5dSStephan Aßmus } 3746af4da5dSStephan Aßmus fOpenFilePanel->Show(); 3756af4da5dSStephan Aßmus break; 3766af4da5dSStephan Aßmus 3776af4da5dSStephan Aßmus case B_REFS_RECEIVED: 3786af4da5dSStephan Aßmus // Media Files Seleced by Open Panel 3796af4da5dSStephan Aßmus DetachCurrentMessage(); 3806af4da5dSStephan Aßmus msg->what = B_REFS_RECEIVED; 3816af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(msg); 3826af4da5dSStephan Aßmus // fall through 3836af4da5dSStephan Aßmus 3846af4da5dSStephan Aßmus case B_CANCEL: 3856af4da5dSStephan Aßmus break; 3866af4da5dSStephan Aßmus 387*b97c5149SJonas Sundström case B_ABOUT_REQUESTED: 388f086ada7SStephan Aßmus { 389ae0f70fcSAdrien Destugues BString title(B_TRANSLATE("About" B_UTF8_ELLIPSIS)); 390ae0f70fcSAdrien Destugues (new BAlert(title, 391007d8a0cSSiarzhuk Zharski B_TRANSLATE("MediaConverter\n" 3926af4da5dSStephan Aßmus VERSION"\n" 3936af4da5dSStephan Aßmus B_UTF8_COPYRIGHT" 1999, Be Incorporated.\n" 3946af4da5dSStephan Aßmus B_UTF8_COPYRIGHT" 2000-2004 Jun Suzuki\n" 3951fa65454SJoachim Seemer B_UTF8_COPYRIGHT" 2007 Stephan Aßmus\n" 396007d8a0cSSiarzhuk Zharski B_UTF8_COPYRIGHT" 2010 Haiku, Inc."), 397ae0f70fcSAdrien Destugues B_TRANSLATE("OK")))->Go(); 3986af4da5dSStephan Aßmus break; 3996af4da5dSStephan Aßmus } 4006af4da5dSStephan Aßmus 4016af4da5dSStephan Aßmus case QUIT_MESSAGE: 4026af4da5dSStephan Aßmus MediaConverterWindow::QuitRequested(); 4036af4da5dSStephan Aßmus break; 4046af4da5dSStephan Aßmus 4056af4da5dSStephan Aßmus case PREVIEW_MESSAGE: 406f086ada7SStephan Aßmus { 407f086ada7SStephan Aßmus // Build the command line to launch the preview application. 408f086ada7SStephan Aßmus // TODO: Launch the default app instead of hardcoded MediaPlayer! 409f086ada7SStephan Aßmus int32 srcIndex = fListView->CurrentSelection(); 410f086ada7SStephan Aßmus BMediaFile* inFile = NULL; 411f086ada7SStephan Aßmus status_t status = GetSourceFileAt(srcIndex, &inFile, &inRef); 4126af4da5dSStephan Aßmus 413f086ada7SStephan Aßmus const char* argv[3]; 414f086ada7SStephan Aßmus BString startPosString; 415f086ada7SStephan Aßmus BPath path; 416f086ada7SStephan Aßmus 4176af4da5dSStephan Aßmus if (status == B_OK) { 418f086ada7SStephan Aßmus argv[0] = "-pos"; 419f086ada7SStephan Aßmus // NOTE: -pos argument is currently not supported by Haiku 420f086ada7SStephan Aßmus // MediaPlayer. 421f086ada7SStephan Aßmus startPosString << fStartDurationTC->Text(); 422f086ada7SStephan Aßmus startPosString << "000"; 423f086ada7SStephan Aßmus argv[1] = startPosString.String(); 4246af4da5dSStephan Aßmus 425f086ada7SStephan Aßmus status = inEntry.SetTo(&inRef); 4266af4da5dSStephan Aßmus } 4276af4da5dSStephan Aßmus 428f086ada7SStephan Aßmus if (status == B_OK) { 429f086ada7SStephan Aßmus status = inEntry.GetPath(&path); 430f086ada7SStephan Aßmus if (status == B_OK) 431f086ada7SStephan Aßmus argv[2] = path.Path(); 432f086ada7SStephan Aßmus } 4336af4da5dSStephan Aßmus 434f086ada7SStephan Aßmus if (status == B_OK) { 435f086ada7SStephan Aßmus status = be_roster->Launch( 436f086ada7SStephan Aßmus "application/x-vnd.Haiku-MediaPlayer", 437f086ada7SStephan Aßmus 3, (char**)argv, NULL); 438f086ada7SStephan Aßmus } 439f086ada7SStephan Aßmus 440f086ada7SStephan Aßmus if (status != B_OK && status != B_ALREADY_RUNNING) { 441007d8a0cSSiarzhuk Zharski BString errorString(B_TRANSLATE("Error launching: %strError%")); 442007d8a0cSSiarzhuk Zharski errorString.ReplaceFirst("%strError%", strerror(status)); 443007d8a0cSSiarzhuk Zharski (new BAlert(B_TRANSLATE("Error"), errorString.String(), 444ae0f70fcSAdrien Destugues B_TRANSLATE("OK")))->Go(); 4456af4da5dSStephan Aßmus } 4466af4da5dSStephan Aßmus break; 447f086ada7SStephan Aßmus } 4486af4da5dSStephan Aßmus 4496af4da5dSStephan Aßmus case VIDEO_QUALITY_CHANGED_MESSAGE: 450f086ada7SStephan Aßmus { 451f086ada7SStephan Aßmus int32 value; 4526af4da5dSStephan Aßmus msg->FindInt32("be:value", &value); 453ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), 454ae0f70fcSAdrien Destugues B_TRANSLATE("Video quality: %3d%%"), (int8)value); 4556af4da5dSStephan Aßmus fVideoQualitySlider->SetLabel(buffer); 4566af4da5dSStephan Aßmus fVideoQuality = value; 4576af4da5dSStephan Aßmus break; 458f086ada7SStephan Aßmus } 4596af4da5dSStephan Aßmus 4606af4da5dSStephan Aßmus case AUDIO_QUALITY_CHANGED_MESSAGE: 461f086ada7SStephan Aßmus { 462f086ada7SStephan Aßmus int32 value; 4636af4da5dSStephan Aßmus msg->FindInt32("be:value", &value); 464ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), 465ae0f70fcSAdrien Destugues B_TRANSLATE("Audio quality: %3d%%"), (int8)value); 4666af4da5dSStephan Aßmus fAudioQualitySlider->SetLabel(buffer); 4676af4da5dSStephan Aßmus fAudioQuality = value; 4686af4da5dSStephan Aßmus break; 469f086ada7SStephan Aßmus } 4706af4da5dSStephan Aßmus 4716af4da5dSStephan Aßmus default: 4726af4da5dSStephan Aßmus BWindow::MessageReceived(msg); 4736af4da5dSStephan Aßmus } 4746af4da5dSStephan Aßmus } 4756af4da5dSStephan Aßmus 4766af4da5dSStephan Aßmus 4776af4da5dSStephan Aßmus bool 4786af4da5dSStephan Aßmus MediaConverterWindow::QuitRequested() 4796af4da5dSStephan Aßmus { 4806af4da5dSStephan Aßmus if (!fConverting) { 4816af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(B_QUIT_REQUESTED); 4826af4da5dSStephan Aßmus return true; 4836af4da5dSStephan Aßmus } else if (!fCancelling) { 4846af4da5dSStephan Aßmus fCancelling = true; 485ae0f70fcSAdrien Destugues SetStatusMessage(B_TRANSLATE("Cancelling")); 4866af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE); 4876af4da5dSStephan Aßmus } 4886af4da5dSStephan Aßmus return false; 4896af4da5dSStephan Aßmus } 4906af4da5dSStephan Aßmus 4916af4da5dSStephan Aßmus 4926af4da5dSStephan Aßmus // #pragma mark - 4936af4da5dSStephan Aßmus 4946af4da5dSStephan Aßmus 4956af4da5dSStephan Aßmus void 4966af4da5dSStephan Aßmus MediaConverterWindow::LanguageChanged() 4976af4da5dSStephan Aßmus { 4986af4da5dSStephan Aßmus _DestroyMenu(); 4996af4da5dSStephan Aßmus _CreateMenu(); 5006af4da5dSStephan Aßmus _UpdateLabels(); 5016af4da5dSStephan Aßmus BuildAudioVideoMenus(); 5026af4da5dSStephan Aßmus Lock(); 5036af4da5dSStephan Aßmus fInfoView->Invalidate(); 5046af4da5dSStephan Aßmus Unlock(); 5056af4da5dSStephan Aßmus } 5066af4da5dSStephan Aßmus 5076af4da5dSStephan Aßmus 5086af4da5dSStephan Aßmus void 5096af4da5dSStephan Aßmus MediaConverterWindow::BuildAudioVideoMenus() 5106af4da5dSStephan Aßmus { 5116af4da5dSStephan Aßmus BMenu* menu = fAudioMenu->Menu(); 5126af4da5dSStephan Aßmus BMenuItem* item; 5136af4da5dSStephan Aßmus // clear out old audio codec menu items 5147730c846SStephan Aßmus while ((item = menu->RemoveItem(0L)) != NULL) 5156af4da5dSStephan Aßmus delete item; 5166af4da5dSStephan Aßmus 5176af4da5dSStephan Aßmus bool separator = true; 5186af4da5dSStephan Aßmus 5196af4da5dSStephan Aßmus // get selected file format 5207730c846SStephan Aßmus FileFormatMenuItem* ffmi 5217730c846SStephan Aßmus = (FileFormatMenuItem*)fFormatMenu->Menu()->FindMarked(); 5226af4da5dSStephan Aßmus media_file_format* mf_format = &(ffmi->fFileFormat); 5236af4da5dSStephan Aßmus 5246af4da5dSStephan Aßmus media_format format, outfmt; 5256af4da5dSStephan Aßmus memset(&format, 0, sizeof(format)); 5266af4da5dSStephan Aßmus media_codec_info codec_info; 5276af4da5dSStephan Aßmus int32 cookie = 0; 5286af4da5dSStephan Aßmus CodecMenuItem* cmi; 5296af4da5dSStephan Aßmus 5306af4da5dSStephan Aßmus // add available audio encoders to menu 5316af4da5dSStephan Aßmus format.type = B_MEDIA_RAW_AUDIO; 5326af4da5dSStephan Aßmus format.u.raw_audio = media_raw_audio_format::wildcard; 5337730c846SStephan Aßmus while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info) 5347730c846SStephan Aßmus == B_OK) { 5356af4da5dSStephan Aßmus if (separator) { 536ae0f70fcSAdrien Destugues menu->AddItem(new BMenuItem( 537ae0f70fcSAdrien Destugues B_TRANSLATE_WITH_CONTEXT("No audio", "Audio codecs list"), 5386af4da5dSStephan Aßmus new BMessage(AUDIO_CODEC_SELECT_MESSAGE))); 5396af4da5dSStephan Aßmus menu->AddSeparatorItem(); 5406af4da5dSStephan Aßmus separator = false; 5416af4da5dSStephan Aßmus } 5426af4da5dSStephan Aßmus 5436af4da5dSStephan Aßmus cmi = new CodecMenuItem(&codec_info, AUDIO_CODEC_SELECT_MESSAGE); 5446af4da5dSStephan Aßmus menu->AddItem(cmi); 5456af4da5dSStephan Aßmus // reset media format struct 5466af4da5dSStephan Aßmus /* 5476af4da5dSStephan Aßmus format.type = B_MEDIA_RAW_AUDIO; 5486af4da5dSStephan Aßmus format.u.raw_audio = media_raw_audio_format::wildcard; 5496af4da5dSStephan Aßmus */ 5506af4da5dSStephan Aßmus } 5516af4da5dSStephan Aßmus 5526af4da5dSStephan Aßmus // mark first audio encoder 5536af4da5dSStephan Aßmus item = menu->ItemAt(0); 5546af4da5dSStephan Aßmus if (item != NULL) { 5556af4da5dSStephan Aßmus fAudioMenu->SetEnabled(fEnabled); 5566af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(fEnabled); 5576af4da5dSStephan Aßmus item->SetMarked(true); 5586af4da5dSStephan Aßmus ((BInvoker *)item)->Invoke(); 5596af4da5dSStephan Aßmus } else { 560ae0f70fcSAdrien Destugues item = new BMenuItem( 561ae0f70fcSAdrien Destugues B_TRANSLATE_WITH_CONTEXT("None available", "Audio codecs"), 562ae0f70fcSAdrien Destugues NULL); 5636af4da5dSStephan Aßmus menu->AddItem(item); 5646af4da5dSStephan Aßmus item->SetMarked(true); 5656af4da5dSStephan Aßmus fAudioMenu->SetEnabled(false); 5666af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(false); 5676af4da5dSStephan Aßmus } 5686af4da5dSStephan Aßmus 5696af4da5dSStephan Aßmus // clear out old video codec menu items 5706af4da5dSStephan Aßmus menu = fVideoMenu->Menu(); 5717730c846SStephan Aßmus while ((item = menu->RemoveItem(0L)) != NULL) 5726af4da5dSStephan Aßmus delete item; 5736af4da5dSStephan Aßmus 5746af4da5dSStephan Aßmus separator = true; 5756af4da5dSStephan Aßmus 5766af4da5dSStephan Aßmus // construct a generic video format. Some of these parameters 5776af4da5dSStephan Aßmus // seem silly, but are needed for R4.5.x, which is more picky 5786af4da5dSStephan Aßmus // than subsequent BeOS releases will be. 5796af4da5dSStephan Aßmus memset(&format, 0, sizeof(format)); 5806af4da5dSStephan Aßmus format.type = B_MEDIA_RAW_VIDEO; 5816af4da5dSStephan Aßmus format.u.raw_video.last_active = (uint32)(240 - 1); 5826af4da5dSStephan Aßmus format.u.raw_video.orientation = B_VIDEO_TOP_LEFT_RIGHT; 5836af4da5dSStephan Aßmus format.u.raw_video.display.format = B_RGB32; 5846af4da5dSStephan Aßmus format.u.raw_video.display.line_width = (int32)320; 5856af4da5dSStephan Aßmus format.u.raw_video.display.line_count = (int32)240; 5866af4da5dSStephan Aßmus format.u.raw_video.display.bytes_per_row = 4 * 320; 5876af4da5dSStephan Aßmus 5886af4da5dSStephan Aßmus // add available video encoders to menu 5896af4da5dSStephan Aßmus cookie = 0; 5906af4da5dSStephan Aßmus while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info) == B_OK) { 5916af4da5dSStephan Aßmus if (separator) { 592ae0f70fcSAdrien Destugues menu->AddItem(new BMenuItem( 593ae0f70fcSAdrien Destugues B_TRANSLATE_WITH_CONTEXT("No video", "Video codecs list"), 5946af4da5dSStephan Aßmus new BMessage(VIDEO_CODEC_SELECT_MESSAGE))); 5956af4da5dSStephan Aßmus menu->AddSeparatorItem(); 5966af4da5dSStephan Aßmus separator = false; 5976af4da5dSStephan Aßmus } 5986af4da5dSStephan Aßmus 5996af4da5dSStephan Aßmus cmi = new CodecMenuItem(&codec_info, VIDEO_CODEC_SELECT_MESSAGE); 6006af4da5dSStephan Aßmus menu->AddItem(cmi); 6016af4da5dSStephan Aßmus } 6026af4da5dSStephan Aßmus 6036af4da5dSStephan Aßmus // mark first video encoder 6046af4da5dSStephan Aßmus item = menu->ItemAt(0); 6056af4da5dSStephan Aßmus if (item != NULL) { 6066af4da5dSStephan Aßmus fVideoMenu->SetEnabled(fEnabled); 6076af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(fEnabled); 6086af4da5dSStephan Aßmus item->SetMarked(true); 6096af4da5dSStephan Aßmus ((BInvoker *)item)->Invoke(); 6106af4da5dSStephan Aßmus } else { 611ae0f70fcSAdrien Destugues item = new BMenuItem( 612ae0f70fcSAdrien Destugues B_TRANSLATE_WITH_CONTEXT("None available", "Video codecs"), 613ae0f70fcSAdrien Destugues NULL); 6146af4da5dSStephan Aßmus menu->AddItem(item); 6156af4da5dSStephan Aßmus item->SetMarked(true); 6166af4da5dSStephan Aßmus fVideoMenu->SetEnabled(false); 6176af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(false); 6186af4da5dSStephan Aßmus } 6196af4da5dSStephan Aßmus } 6206af4da5dSStephan Aßmus 6216af4da5dSStephan Aßmus void 6226af4da5dSStephan Aßmus MediaConverterWindow::GetSelectedFormatInfo(media_file_format** format, 6236af4da5dSStephan Aßmus media_codec_info** audio, media_codec_info** video) 6246af4da5dSStephan Aßmus { 6256af4da5dSStephan Aßmus *audio = NULL; 6266af4da5dSStephan Aßmus *video = NULL; 6276af4da5dSStephan Aßmus *format = NULL; 6286af4da5dSStephan Aßmus 6296af4da5dSStephan Aßmus FileFormatMenuItem *formatItem = 6306af4da5dSStephan Aßmus dynamic_cast<FileFormatMenuItem *>(fFormatMenu->Menu()->FindMarked()); 6316af4da5dSStephan Aßmus if (formatItem != NULL) { 6326af4da5dSStephan Aßmus *format = &(formatItem->fFileFormat); 6336af4da5dSStephan Aßmus } 6346af4da5dSStephan Aßmus 6356af4da5dSStephan Aßmus *audio = *video = NULL; 6366af4da5dSStephan Aßmus CodecMenuItem *codecItem = 6376af4da5dSStephan Aßmus dynamic_cast<CodecMenuItem *>(fAudioMenu->Menu()->FindMarked()); 6386af4da5dSStephan Aßmus if (codecItem != NULL) { 6396af4da5dSStephan Aßmus *audio = &(codecItem->fCodecInfo); 6406af4da5dSStephan Aßmus } 6416af4da5dSStephan Aßmus 6426af4da5dSStephan Aßmus codecItem = dynamic_cast<CodecMenuItem *>(fVideoMenu->Menu()->FindMarked()); 6436af4da5dSStephan Aßmus if (codecItem != NULL) { 6446af4da5dSStephan Aßmus *video = &(codecItem->fCodecInfo); 6456af4da5dSStephan Aßmus } 6466af4da5dSStephan Aßmus } 6476af4da5dSStephan Aßmus 6486af4da5dSStephan Aßmus 6496af4da5dSStephan Aßmus void 6506af4da5dSStephan Aßmus MediaConverterWindow::BuildFormatMenu() 6516af4da5dSStephan Aßmus { 6526af4da5dSStephan Aßmus BMenu *menu = fFormatMenu->Menu(); 6536af4da5dSStephan Aßmus BMenuItem *item; 6546af4da5dSStephan Aßmus // clear out old format menu items 6556af4da5dSStephan Aßmus while ((item = menu->RemoveItem((int32)0)) != NULL) { 6566af4da5dSStephan Aßmus delete item; 6576af4da5dSStephan Aßmus } 6586af4da5dSStephan Aßmus 6596af4da5dSStephan Aßmus // add menu items for each file format 6606af4da5dSStephan Aßmus media_file_format mfi; 6616af4da5dSStephan Aßmus int32 cookie = 0; 6626af4da5dSStephan Aßmus FileFormatMenuItem *ff_item; 6636af4da5dSStephan Aßmus while (get_next_file_format(&cookie, &mfi) == B_OK) { 6646af4da5dSStephan Aßmus ff_item = new FileFormatMenuItem(&mfi); 6656af4da5dSStephan Aßmus menu->AddItem(ff_item); 6666af4da5dSStephan Aßmus } 6676af4da5dSStephan Aßmus 6686af4da5dSStephan Aßmus // mark first item 6696af4da5dSStephan Aßmus item = menu->ItemAt(0); 6706af4da5dSStephan Aßmus if (item != NULL) { 6716af4da5dSStephan Aßmus item->SetMarked(true); 6726af4da5dSStephan Aßmus ((BInvoker *)item)->Invoke(); 6736af4da5dSStephan Aßmus } 6746af4da5dSStephan Aßmus } 6756af4da5dSStephan Aßmus 676dd55ed1aSAlex Wilson 6776af4da5dSStephan Aßmus void 6786af4da5dSStephan Aßmus MediaConverterWindow::SetFileMessage(const char *message) 6796af4da5dSStephan Aßmus { 680dd55ed1aSAlex Wilson fFileStatus->SetText(message); 6816af4da5dSStephan Aßmus } 6826af4da5dSStephan Aßmus 683dd55ed1aSAlex Wilson 6846af4da5dSStephan Aßmus void 6856af4da5dSStephan Aßmus MediaConverterWindow::SetStatusMessage(const char *message) 6866af4da5dSStephan Aßmus { 687dd55ed1aSAlex Wilson fStatus->SetText(message); 6886af4da5dSStephan Aßmus } 6896af4da5dSStephan Aßmus 6906af4da5dSStephan Aßmus 6916af4da5dSStephan Aßmus // #pragma mark - 6926af4da5dSStephan Aßmus 6936af4da5dSStephan Aßmus 6941c992a52SStephan Aßmus bool 6956af4da5dSStephan Aßmus MediaConverterWindow::AddSourceFile(BMediaFile* file, const entry_ref& ref) 6966af4da5dSStephan Aßmus { 6971c992a52SStephan Aßmus if (!fListView->AddMediaItem(file, ref)) 6981c992a52SStephan Aßmus return false; 6996af4da5dSStephan Aßmus 7006af4da5dSStephan Aßmus if (!fOutputDirSpecified) { 7016af4da5dSStephan Aßmus BEntry entry(&ref); 7026af4da5dSStephan Aßmus entry.GetParent(&entry); 7036af4da5dSStephan Aßmus _SetOutputFolder(entry); 7046af4da5dSStephan Aßmus } 7051c992a52SStephan Aßmus 7061c992a52SStephan Aßmus return true; 7076af4da5dSStephan Aßmus } 7086af4da5dSStephan Aßmus 7096af4da5dSStephan Aßmus 7106af4da5dSStephan Aßmus void 7116af4da5dSStephan Aßmus MediaConverterWindow::RemoveSourceFile(int32 index) 7126af4da5dSStephan Aßmus { 7136af4da5dSStephan Aßmus delete fListView->RemoveItem(index); 7146af4da5dSStephan Aßmus fStartDurationTC->SetText("0"); 7156af4da5dSStephan Aßmus fEndDurationTC->SetText("0"); 7166af4da5dSStephan Aßmus } 7176af4da5dSStephan Aßmus 7186af4da5dSStephan Aßmus 7196af4da5dSStephan Aßmus int32 7206af4da5dSStephan Aßmus MediaConverterWindow::CountSourceFiles() 7216af4da5dSStephan Aßmus { 7226af4da5dSStephan Aßmus return fListView->CountItems(); 7236af4da5dSStephan Aßmus } 7246af4da5dSStephan Aßmus 7256af4da5dSStephan Aßmus 7266af4da5dSStephan Aßmus status_t 7276af4da5dSStephan Aßmus MediaConverterWindow::GetSourceFileAt(int32 index, BMediaFile** _file, 7286af4da5dSStephan Aßmus entry_ref* ref) 7296af4da5dSStephan Aßmus { 7306af4da5dSStephan Aßmus MediaFileListItem* item = dynamic_cast<MediaFileListItem*>( 7316af4da5dSStephan Aßmus fListView->ItemAt(index)); 7326af4da5dSStephan Aßmus if (item != NULL) { 7336af4da5dSStephan Aßmus *_file = item->fMediaFile; 7346af4da5dSStephan Aßmus *ref = item->fRef; 7356af4da5dSStephan Aßmus return B_OK; 7366af4da5dSStephan Aßmus } else { 7376af4da5dSStephan Aßmus return B_ERROR; 7386af4da5dSStephan Aßmus } 7396af4da5dSStephan Aßmus } 7406af4da5dSStephan Aßmus 7416af4da5dSStephan Aßmus 7426af4da5dSStephan Aßmus void 7436af4da5dSStephan Aßmus MediaConverterWindow::SourceFileSelectionChanged() 7446af4da5dSStephan Aßmus { 7456af4da5dSStephan Aßmus int32 selected = fListView->CurrentSelection(); 7466af4da5dSStephan Aßmus BMediaFile* file = NULL; 7476af4da5dSStephan Aßmus entry_ref ref; 7487730c846SStephan Aßmus bool enabled = GetSourceFileAt(selected, &file, &ref) == B_OK; 7496af4da5dSStephan Aßmus 7506af4da5dSStephan Aßmus fPreviewButton->SetEnabled(enabled); 7516af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(enabled); 7526af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(enabled); 7536af4da5dSStephan Aßmus fStartDurationTC->SetEnabled(enabled); 7546af4da5dSStephan Aßmus fEndDurationTC->SetEnabled(enabled); 7556af4da5dSStephan Aßmus 7567730c846SStephan Aßmus BString duration; 7577730c846SStephan Aßmus if (enabled) { 7587730c846SStephan Aßmus fInfoView->Update(file, &ref); 7596af4da5dSStephan Aßmus // HACK: get the fInfoView to update the duration "synchronously" 7606af4da5dSStephan Aßmus UpdateIfNeeded(); 7617730c846SStephan Aßmus duration << fInfoView->Duration() / 1000; 7627730c846SStephan Aßmus } else 7637730c846SStephan Aßmus duration = "0"; 7646af4da5dSStephan Aßmus 7656af4da5dSStephan Aßmus // update duration text controls 7666af4da5dSStephan Aßmus fStartDurationTC->SetText("0"); 7676af4da5dSStephan Aßmus fEndDurationTC->SetText(duration.String()); 7686af4da5dSStephan Aßmus } 7696af4da5dSStephan Aßmus 7706af4da5dSStephan Aßmus 7716af4da5dSStephan Aßmus // #pragma mark - 7726af4da5dSStephan Aßmus 7736af4da5dSStephan Aßmus 7746af4da5dSStephan Aßmus void 7756af4da5dSStephan Aßmus MediaConverterWindow::SetEnabled(bool enabled, bool convertEnabled) 7766af4da5dSStephan Aßmus { 7776af4da5dSStephan Aßmus fConvertButton->SetEnabled(convertEnabled); 7786af4da5dSStephan Aßmus if (enabled == fEnabled) 7796af4da5dSStephan Aßmus return; 7806af4da5dSStephan Aßmus 7816af4da5dSStephan Aßmus fFormatMenu->SetEnabled(enabled); 7826af4da5dSStephan Aßmus fAudioMenu->SetEnabled(enabled); 7836af4da5dSStephan Aßmus fVideoMenu->SetEnabled(enabled); 7846af4da5dSStephan Aßmus fListView->SetEnabled(enabled); 7856af4da5dSStephan Aßmus fStartDurationTC->SetEnabled(enabled); 7866af4da5dSStephan Aßmus fEndDurationTC->SetEnabled(enabled); 7876af4da5dSStephan Aßmus 7886af4da5dSStephan Aßmus fEnabled = enabled; 7896af4da5dSStephan Aßmus } 7906af4da5dSStephan Aßmus 7916af4da5dSStephan Aßmus 7926af4da5dSStephan Aßmus bool 7936af4da5dSStephan Aßmus MediaConverterWindow::IsEnabled() 7946af4da5dSStephan Aßmus { 7956af4da5dSStephan Aßmus return fEnabled; 7966af4da5dSStephan Aßmus } 7976af4da5dSStephan Aßmus 7986af4da5dSStephan Aßmus 7996af4da5dSStephan Aßmus const char* 8006af4da5dSStephan Aßmus MediaConverterWindow::StartDuration() const 8016af4da5dSStephan Aßmus { 8026af4da5dSStephan Aßmus return fStartDurationTC->Text(); 8036af4da5dSStephan Aßmus } 8046af4da5dSStephan Aßmus 8056af4da5dSStephan Aßmus 8066af4da5dSStephan Aßmus const char* 8076af4da5dSStephan Aßmus MediaConverterWindow::EndDuration() const 8086af4da5dSStephan Aßmus { 8096af4da5dSStephan Aßmus return fEndDurationTC->Text(); 8106af4da5dSStephan Aßmus } 8116af4da5dSStephan Aßmus 8126af4da5dSStephan Aßmus 8136af4da5dSStephan Aßmus BDirectory 8146af4da5dSStephan Aßmus MediaConverterWindow::OutputDirectory() const 8156af4da5dSStephan Aßmus { 8166af4da5dSStephan Aßmus return fOutputDir; 8176af4da5dSStephan Aßmus } 8186af4da5dSStephan Aßmus 8196af4da5dSStephan Aßmus 8206af4da5dSStephan Aßmus void 8216af4da5dSStephan Aßmus MediaConverterWindow::SetAudioQualityLabel(const char* label) 8226af4da5dSStephan Aßmus { 8236af4da5dSStephan Aßmus fAudioQualitySlider->SetLabel(label); 8246af4da5dSStephan Aßmus } 8256af4da5dSStephan Aßmus 8266af4da5dSStephan Aßmus 8276af4da5dSStephan Aßmus void 8286af4da5dSStephan Aßmus MediaConverterWindow::SetVideoQualityLabel(const char* label) 8296af4da5dSStephan Aßmus { 8306af4da5dSStephan Aßmus fVideoQualitySlider->SetLabel(label); 8316af4da5dSStephan Aßmus } 8326af4da5dSStephan Aßmus 8336af4da5dSStephan Aßmus 8346af4da5dSStephan Aßmus // #pragma mark - 8356af4da5dSStephan Aßmus 8366af4da5dSStephan Aßmus 8376af4da5dSStephan Aßmus void 8386af4da5dSStephan Aßmus MediaConverterWindow::_UpdateLabels() 8396af4da5dSStephan Aßmus { 840dd55ed1aSAlex Wilson if (fSourcesBox != NULL) { 841ae0f70fcSAdrien Destugues fSourcesBox->SetLabel(B_TRANSLATE("Source files")); 842dd55ed1aSAlex Wilson _UpdateBBoxLayoutInsets(fSourcesBox); 843dd55ed1aSAlex Wilson } 8446af4da5dSStephan Aßmus 845dd55ed1aSAlex Wilson if (fInfoBox != NULL) 846ae0f70fcSAdrien Destugues fInfoBox->SetLabel(B_TRANSLATE("File details")); 8476af4da5dSStephan Aßmus 848dd55ed1aSAlex Wilson if (fOutputBox != NULL) { 849ae0f70fcSAdrien Destugues fOutputBox->SetLabel(B_TRANSLATE("Output format")); 850dd55ed1aSAlex Wilson _UpdateBBoxLayoutInsets(fOutputBox); 851dd55ed1aSAlex Wilson } 8526af4da5dSStephan Aßmus 853dd55ed1aSAlex Wilson if (fConvertButton != NULL) 854ae0f70fcSAdrien Destugues fConvertButton->SetLabel(B_TRANSLATE("Convert")); 8556af4da5dSStephan Aßmus 856dd55ed1aSAlex Wilson if (fPreviewButton != NULL) 857ae0f70fcSAdrien Destugues fPreviewButton->SetLabel(B_TRANSLATE("Preview")); 8586af4da5dSStephan Aßmus 859dd55ed1aSAlex Wilson if (fDestButton != NULL) 860ae0f70fcSAdrien Destugues fDestButton->SetLabel(B_TRANSLATE("Output folder")); 8616af4da5dSStephan Aßmus 8626af4da5dSStephan Aßmus if (fVideoQualitySlider != NULL) { 863dd55ed1aSAlex Wilson char buffer[40]; 864ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), B_TRANSLATE("Video quality: %3d%%"), 865f086ada7SStephan Aßmus (int8)fVideoQuality); 8666af4da5dSStephan Aßmus fVideoQualitySlider->SetLabel(buffer); 867ae0f70fcSAdrien Destugues fVideoQualitySlider->SetLimitLabels(B_TRANSLATE("Low"), 868ae0f70fcSAdrien Destugues B_TRANSLATE("High")); 8696af4da5dSStephan Aßmus } 8706af4da5dSStephan Aßmus 8716af4da5dSStephan Aßmus if (fAudioQualitySlider != NULL) { 872dd55ed1aSAlex Wilson char buffer[40]; 873ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), B_TRANSLATE("Audio quality: %3d%%"), 874f086ada7SStephan Aßmus (int8)fAudioQuality); 8756af4da5dSStephan Aßmus fAudioQualitySlider->SetLabel(buffer); 876ae0f70fcSAdrien Destugues fAudioQualitySlider->SetLimitLabels(B_TRANSLATE("Low"), 877ae0f70fcSAdrien Destugues B_TRANSLATE("High")); 8786af4da5dSStephan Aßmus } 8796af4da5dSStephan Aßmus 880dd55ed1aSAlex Wilson if (fStartDurationTC != NULL) 881ae0f70fcSAdrien Destugues fStartDurationTC->SetLabel(B_TRANSLATE("Start [ms]: ")); 882dd55ed1aSAlex Wilson 883dd55ed1aSAlex Wilson if (fEndDurationTC != NULL) 884ae0f70fcSAdrien Destugues fEndDurationTC->SetLabel(B_TRANSLATE("End [ms]: ")); 8856af4da5dSStephan Aßmus 8866af4da5dSStephan Aßmus if (fFormatMenu != NULL) 887ae0f70fcSAdrien Destugues fFormatMenu->SetLabel(B_TRANSLATE("File format:")); 888dd55ed1aSAlex Wilson 8896af4da5dSStephan Aßmus if (fAudioMenu != NULL) 890ae0f70fcSAdrien Destugues fAudioMenu->SetLabel(B_TRANSLATE("Audio encoding:")); 891dd55ed1aSAlex Wilson 8926af4da5dSStephan Aßmus if (fVideoMenu != NULL) 893ae0f70fcSAdrien Destugues fVideoMenu->SetLabel(B_TRANSLATE("Video encoding:")); 8946af4da5dSStephan Aßmus 895ae0f70fcSAdrien Destugues SetFileMessage(B_TRANSLATE("Drop media files onto this window")); 8966af4da5dSStephan Aßmus } 8976af4da5dSStephan Aßmus 8986af4da5dSStephan Aßmus 8996af4da5dSStephan Aßmus void 900dd55ed1aSAlex Wilson MediaConverterWindow::_UpdateBBoxLayoutInsets(BBox* box) 901dd55ed1aSAlex Wilson { 902dd55ed1aSAlex Wilson BTwoDimensionalLayout* layout 903dd55ed1aSAlex Wilson = dynamic_cast<BTwoDimensionalLayout*>(box->GetLayout()); 9047730c846SStephan Aßmus if (layout != NULL) { 905dd55ed1aSAlex Wilson float padding = be_control_look->DefaultItemSpacing(); 906dd55ed1aSAlex Wilson layout->SetInsets(padding, box->TopBorderOffset() + padding, padding, 907dd55ed1aSAlex Wilson padding); 908dd55ed1aSAlex Wilson } 909dd55ed1aSAlex Wilson } 910dd55ed1aSAlex Wilson 911dd55ed1aSAlex Wilson 912dd55ed1aSAlex Wilson void 9136af4da5dSStephan Aßmus MediaConverterWindow::_DestroyMenu() 9146af4da5dSStephan Aßmus { 9156af4da5dSStephan Aßmus BMenu* Menu; 9166af4da5dSStephan Aßmus 9176af4da5dSStephan Aßmus while ((Menu = fMenuBar->SubmenuAt(0)) != NULL) { 9186af4da5dSStephan Aßmus fMenuBar->RemoveItem(Menu); 9196af4da5dSStephan Aßmus delete Menu; 9206af4da5dSStephan Aßmus } 9216af4da5dSStephan Aßmus } 9226af4da5dSStephan Aßmus 9236af4da5dSStephan Aßmus 9246af4da5dSStephan Aßmus void 9256af4da5dSStephan Aßmus MediaConverterWindow::_CreateMenu() 9266af4da5dSStephan Aßmus { 9276af4da5dSStephan Aßmus BMenuItem* item; 9286af4da5dSStephan Aßmus BMenu* menu; 9296af4da5dSStephan Aßmus 930ae0f70fcSAdrien Destugues menu = new BMenu(B_TRANSLATE_WITH_CONTEXT("File", "Menu")); 931ae0f70fcSAdrien Destugues item = new BMenuItem(B_TRANSLATE_WITH_CONTEXT( 932ae0f70fcSAdrien Destugues "Open" B_UTF8_ELLIPSIS, "Menu"), 933dd55ed1aSAlex Wilson new BMessage(OPEN_FILE_MESSAGE), 'O'); 9346af4da5dSStephan Aßmus menu->AddItem(item); 9356af4da5dSStephan Aßmus menu->AddSeparatorItem(); 936*b97c5149SJonas Sundström item = new BAboutMenuItem(), 9376af4da5dSStephan Aßmus menu->AddItem(item); 9386af4da5dSStephan Aßmus menu->AddSeparatorItem(); 939ae0f70fcSAdrien Destugues item = new BMenuItem(B_TRANSLATE_WITH_CONTEXT("Quit", "Menu"), 940ae0f70fcSAdrien Destugues new BMessage(QUIT_MESSAGE), 'Q'); 9416af4da5dSStephan Aßmus menu->AddItem(item); 9426af4da5dSStephan Aßmus 9436af4da5dSStephan Aßmus fMenuBar->AddItem(menu); 9446af4da5dSStephan Aßmus } 9456af4da5dSStephan Aßmus 9466af4da5dSStephan Aßmus 9476af4da5dSStephan Aßmus void 9486af4da5dSStephan Aßmus MediaConverterWindow::_SetOutputFolder(BEntry entry) 9496af4da5dSStephan Aßmus { 9506af4da5dSStephan Aßmus BPath path; 9516af4da5dSStephan Aßmus entry.GetPath(&path); 9526af4da5dSStephan Aßmus fOutputFolder->SetText(path.Path()); 9536af4da5dSStephan Aßmus fOutputFolder->ResizeToPreferred(); 9546af4da5dSStephan Aßmus fOutputDir.SetTo(path.Path()); 9556af4da5dSStephan Aßmus } 9566af4da5dSStephan Aßmus 9576af4da5dSStephan Aßmus 958