16af4da5dSStephan Aßmus // Copyright 1999, Be Incorporated. All Rights Reserved. 26af4da5dSStephan Aßmus // Copyright 2000-2004, Jun Suzuki. All Rights Reserved. 36af4da5dSStephan Aßmus // Copyright 2007, Stephan Aßmus. All Rights Reserved. 46af4da5dSStephan Aßmus // This file may be used under the terms of the Be Sample Code License. 56af4da5dSStephan Aßmus #include "MediaConverterWindow.h" 66af4da5dSStephan Aßmus 76af4da5dSStephan Aßmus #include <stdio.h> 86af4da5dSStephan Aßmus #include <string.h> 96af4da5dSStephan Aßmus 106af4da5dSStephan Aßmus #include <Alert.h> 116af4da5dSStephan Aßmus #include <Application.h> 126af4da5dSStephan Aßmus #include <Box.h> 136af4da5dSStephan Aßmus #include <Button.h> 146af4da5dSStephan Aßmus #include <FilePanel.h> 156af4da5dSStephan Aßmus #include <Menu.h> 166af4da5dSStephan Aßmus #include <MenuBar.h> 176af4da5dSStephan Aßmus #include <MenuField.h> 186af4da5dSStephan Aßmus #include <MenuItem.h> 196af4da5dSStephan Aßmus #include <Path.h> 206af4da5dSStephan Aßmus #include <PopUpMenu.h> 216af4da5dSStephan Aßmus #include <Roster.h> 226af4da5dSStephan Aßmus #include <ScrollBar.h> 236af4da5dSStephan Aßmus #include <ScrollView.h> 246af4da5dSStephan Aßmus #include <Slider.h> 256af4da5dSStephan Aßmus #include <StringView.h> 266af4da5dSStephan Aßmus #include <TextControl.h> 276af4da5dSStephan Aßmus 286af4da5dSStephan Aßmus #include "MediaFileInfoView.h" 296af4da5dSStephan Aßmus #include "MediaFileListView.h" 306af4da5dSStephan Aßmus #include "MessageConstants.h" 316af4da5dSStephan Aßmus #include "StatusView.h" 326af4da5dSStephan Aßmus #include "Strings.h" 336af4da5dSStephan Aßmus 346af4da5dSStephan Aßmus 356af4da5dSStephan Aßmus // #pragma mark - DirectoryFilter 366af4da5dSStephan Aßmus 376af4da5dSStephan Aßmus 3860b6f368SStephan Aßmus class DirectoryFilter : public BRefFilter { 396af4da5dSStephan Aßmus public: 406af4da5dSStephan Aßmus DirectoryFilter() {}; 416af4da5dSStephan Aßmus virtual bool Filter(const entry_ref* ref, 4260b6f368SStephan Aßmus BNode* node, struct stat_beos* st, const char* filetype) 436af4da5dSStephan Aßmus { 446af4da5dSStephan Aßmus return node->IsDirectory(); 456af4da5dSStephan Aßmus } 466af4da5dSStephan Aßmus }; 476af4da5dSStephan Aßmus 486af4da5dSStephan Aßmus 496af4da5dSStephan Aßmus // #pragma mark - FileFormatMenuItem 506af4da5dSStephan Aßmus 516af4da5dSStephan Aßmus 526af4da5dSStephan Aßmus class FileFormatMenuItem : public BMenuItem { 536af4da5dSStephan Aßmus public: 546af4da5dSStephan Aßmus FileFormatMenuItem(media_file_format* format); 556af4da5dSStephan Aßmus virtual ~FileFormatMenuItem(); 566af4da5dSStephan Aßmus 576af4da5dSStephan Aßmus media_file_format fFileFormat; 586af4da5dSStephan Aßmus }; 596af4da5dSStephan Aßmus 606af4da5dSStephan Aßmus 616af4da5dSStephan Aßmus FileFormatMenuItem::FileFormatMenuItem(media_file_format *format) 626af4da5dSStephan Aßmus : BMenuItem(format->pretty_name, new BMessage(FORMAT_SELECT_MESSAGE)) 636af4da5dSStephan Aßmus { 646af4da5dSStephan Aßmus memcpy(&fFileFormat, format, sizeof(fFileFormat)); 656af4da5dSStephan Aßmus } 666af4da5dSStephan Aßmus 676af4da5dSStephan Aßmus 686af4da5dSStephan Aßmus FileFormatMenuItem::~FileFormatMenuItem() 696af4da5dSStephan Aßmus { 706af4da5dSStephan Aßmus } 716af4da5dSStephan Aßmus 726af4da5dSStephan Aßmus 736af4da5dSStephan Aßmus // #pragma mark - CodecMenuItem 746af4da5dSStephan Aßmus 756af4da5dSStephan Aßmus 766af4da5dSStephan Aßmus class CodecMenuItem : public BMenuItem { 776af4da5dSStephan Aßmus public: 786af4da5dSStephan Aßmus CodecMenuItem(media_codec_info *ci, uint32 msg_type); 796af4da5dSStephan Aßmus virtual ~CodecMenuItem(); 806af4da5dSStephan Aßmus 816af4da5dSStephan Aßmus media_codec_info fCodecInfo; 826af4da5dSStephan Aßmus }; 836af4da5dSStephan Aßmus 846af4da5dSStephan Aßmus 856af4da5dSStephan Aßmus CodecMenuItem::CodecMenuItem(media_codec_info *ci, uint32 msg_type) 866af4da5dSStephan Aßmus : BMenuItem(ci->pretty_name, new BMessage(msg_type)) 876af4da5dSStephan Aßmus { 886af4da5dSStephan Aßmus memcpy(&fCodecInfo, ci, sizeof(fCodecInfo)); 896af4da5dSStephan Aßmus } 906af4da5dSStephan Aßmus 916af4da5dSStephan Aßmus 926af4da5dSStephan Aßmus CodecMenuItem::~CodecMenuItem() 936af4da5dSStephan Aßmus { 946af4da5dSStephan Aßmus } 956af4da5dSStephan Aßmus 966af4da5dSStephan Aßmus 976af4da5dSStephan Aßmus // #pragma mark - MediaConverterWindow 986af4da5dSStephan Aßmus 996af4da5dSStephan Aßmus 1006af4da5dSStephan Aßmus MediaConverterWindow::MediaConverterWindow(BRect frame) 1016af4da5dSStephan Aßmus : BWindow(frame, "MediaConverter", B_TITLED_WINDOW_LOOK, 1026af4da5dSStephan Aßmus B_NORMAL_WINDOW_FEEL, B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS) 1036af4da5dSStephan Aßmus 1046af4da5dSStephan Aßmus , fVideoQuality(75) 1056af4da5dSStephan Aßmus , fAudioQuality(75) 1066af4da5dSStephan Aßmus 1076af4da5dSStephan Aßmus , fSaveFilePanel(NULL) 1086af4da5dSStephan Aßmus , fOpenFilePanel(NULL) 1096af4da5dSStephan Aßmus 1106af4da5dSStephan Aßmus , fOutputDirSpecified(false) 1116af4da5dSStephan Aßmus 1126af4da5dSStephan Aßmus , fEnabled(true) 1136af4da5dSStephan Aßmus , fConverting(false) 1146af4da5dSStephan Aßmus , fCancelling(false) 1156af4da5dSStephan Aßmus { 1166af4da5dSStephan Aßmus char defaultdirectory[] = "/boot/home"; 1176af4da5dSStephan Aßmus fOutputDir.SetTo(defaultdirectory); 1186af4da5dSStephan Aßmus 1196af4da5dSStephan Aßmus #if B_BEOS_VERSION >= 0x530 // 0x520 RC2 0x530 RC3 1206af4da5dSStephan Aßmus // load Locale files for ZETA 1216af4da5dSStephan Aßmus entry_ref mypath; 1226af4da5dSStephan Aßmus app_info info; 1236af4da5dSStephan Aßmus 1246af4da5dSStephan Aßmus be_app->GetAppInfo(&info); 1256af4da5dSStephan Aßmus mypath = info.ref; 1266af4da5dSStephan Aßmus 1276af4da5dSStephan Aßmus BPath path(&mypath); 1286af4da5dSStephan Aßmus path.GetParent(&path); 1296af4da5dSStephan Aßmus path.Append("Language/Dictionaries"); 1306af4da5dSStephan Aßmus path.Append("MediaConverter"); 1316af4da5dSStephan Aßmus be_locale.LoadLanguageFile(path.Path()); 1326af4da5dSStephan Aßmus 1336af4da5dSStephan Aßmus #endif 1346af4da5dSStephan Aßmus 1356af4da5dSStephan Aßmus BRect dummyRect(0, 0, 10, 10); 1366af4da5dSStephan Aßmus fMenuBar = new BMenuBar(dummyRect, "menubar"); 1376af4da5dSStephan Aßmus _CreateMenu(); 1386af4da5dSStephan Aßmus AddChild(fMenuBar); 1396af4da5dSStephan Aßmus 1406af4da5dSStephan Aßmus // background 1416af4da5dSStephan Aßmus BRect r(frame); 1426af4da5dSStephan Aßmus r.OffsetTo(0, 0); 1436af4da5dSStephan Aßmus BView *background = new BView(r, NULL, B_FOLLOW_ALL_SIDES, 0); 1446af4da5dSStephan Aßmus rgb_color c = ui_color(B_PANEL_BACKGROUND_COLOR); 1456af4da5dSStephan Aßmus background->SetViewColor(c); 1466af4da5dSStephan Aßmus background->SetLowColor(c); 1476af4da5dSStephan Aßmus r.InsetBy(5, 25); 1486af4da5dSStephan Aßmus 1496af4da5dSStephan Aßmus // file list view box 1506af4da5dSStephan Aßmus BRect r2(r); 1516af4da5dSStephan Aßmus r2.bottom = r2.top + 420; 1526af4da5dSStephan Aßmus r2.right = r2.left + 150; 1536af4da5dSStephan Aßmus fBox1 = new BBox(r2, NULL, B_FOLLOW_ALL); 1546af4da5dSStephan Aßmus 1556af4da5dSStephan Aßmus BRect r3(r2); 1566af4da5dSStephan Aßmus r3.OffsetTo(0, 0); 1576af4da5dSStephan Aßmus r3.InsetBy(8, 8); 1586af4da5dSStephan Aßmus r3.top += be_bold_font->Size() - 3; 1596af4da5dSStephan Aßmus bool useHorizontalScrollBar = false; 1606af4da5dSStephan Aßmus if (useHorizontalScrollBar) 1616af4da5dSStephan Aßmus r3.bottom -= B_H_SCROLL_BAR_HEIGHT; 1626af4da5dSStephan Aßmus r3.right -= B_V_SCROLL_BAR_WIDTH; 1636af4da5dSStephan Aßmus fListView = new MediaFileListView(r3, B_FOLLOW_ALL); 1646af4da5dSStephan Aßmus BScrollView *scroller = new BScrollView(NULL, fListView, 1656af4da5dSStephan Aßmus B_FOLLOW_ALL, 0, useHorizontalScrollBar, true); 1666af4da5dSStephan Aßmus fBox1->AddChild(scroller); 1676af4da5dSStephan Aßmus background->AddChild(fBox1); 1686af4da5dSStephan Aßmus 1696af4da5dSStephan Aßmus // info box 1706af4da5dSStephan Aßmus r2.left = r2.right + 5; 1716af4da5dSStephan Aßmus r2.right = r.right - 5; 1726af4da5dSStephan Aßmus r2.bottom = r2.top + 120; 1736af4da5dSStephan Aßmus fBox2 = new BBox(r2, NULL, B_FOLLOW_RIGHT | B_FOLLOW_TOP); 1746af4da5dSStephan Aßmus 1756af4da5dSStephan Aßmus r3 = r2; 1766af4da5dSStephan Aßmus r3.OffsetTo(0, 0); 1776af4da5dSStephan Aßmus r3.InsetBy(5, 5); 1786af4da5dSStephan Aßmus r3.top += 12; 1796af4da5dSStephan Aßmus fInfoView = new MediaFileInfoView(r3, B_FOLLOW_ALL); 1806af4da5dSStephan Aßmus fBox2->AddChild(fInfoView); 1816af4da5dSStephan Aßmus background->AddChild(fBox2); 1826af4da5dSStephan Aßmus 1836af4da5dSStephan Aßmus r2.top = r2.bottom + 5; 1846af4da5dSStephan Aßmus r2.bottom = r2.top + 295; 1856af4da5dSStephan Aßmus fBox3 = new BBox(r2, NULL, B_FOLLOW_RIGHT | B_FOLLOW_TOP_BOTTOM); 1866af4da5dSStephan Aßmus 1876af4da5dSStephan Aßmus r3 = r2; 1886af4da5dSStephan Aßmus r3.OffsetTo(0, 0); 1896af4da5dSStephan Aßmus r3.InsetBy(8, 8); 1906af4da5dSStephan Aßmus r3.top += be_bold_font->Size() - 3; 1916af4da5dSStephan Aßmus 1926af4da5dSStephan Aßmus BRect r4(r3); 1936af4da5dSStephan Aßmus r4.bottom = r4.top + 20; 1946af4da5dSStephan Aßmus BPopUpMenu* popmenu = new BPopUpMenu(""); 1956af4da5dSStephan Aßmus fFormatMenu = new BMenuField(r4, NULL, FORMAT_LABEL, popmenu, 1966af4da5dSStephan Aßmus B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); 1976af4da5dSStephan Aßmus fBox3->AddChild(fFormatMenu); 1986af4da5dSStephan Aßmus 1996af4da5dSStephan Aßmus r4.top = r4.bottom + 5; 2006af4da5dSStephan Aßmus r4.bottom = r4.top + 20; 2016af4da5dSStephan Aßmus popmenu = new BPopUpMenu(""); 2026af4da5dSStephan Aßmus fAudioMenu = new BMenuField(r4, NULL, AUDIO_LABEL, popmenu, 2036af4da5dSStephan Aßmus B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); 2046af4da5dSStephan Aßmus fBox3->AddChild(fAudioMenu); 2056af4da5dSStephan Aßmus 2066af4da5dSStephan Aßmus r4.top = r4.bottom + 5; 2076af4da5dSStephan Aßmus r4.bottom = r4.top + 20; 2086af4da5dSStephan Aßmus popmenu = new BPopUpMenu(""); 2096af4da5dSStephan Aßmus fVideoMenu = new BMenuField(r4, NULL, VIDEO_LABEL, popmenu, 2106af4da5dSStephan Aßmus B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); 2116af4da5dSStephan Aßmus fBox3->AddChild(fVideoMenu); 2126af4da5dSStephan Aßmus 2136af4da5dSStephan Aßmus // output folder 2146af4da5dSStephan Aßmus r4.top = r4.bottom + 5; 2156af4da5dSStephan Aßmus r4.bottom = r4.top + 20; 2166af4da5dSStephan Aßmus r4.right = 80; 2176af4da5dSStephan Aßmus fDestButton = new BButton(r4, NULL, OUTPUT_FOLDER_LABEL, 2186af4da5dSStephan Aßmus new BMessage(OUTPUT_FOLDER_MESSAGE), 2196af4da5dSStephan Aßmus B_FOLLOW_LEFT | B_FOLLOW_TOP); 2206af4da5dSStephan Aßmus fBox3->AddChild(fDestButton); 2216af4da5dSStephan Aßmus fDestButton->ResizeToPreferred(); 2226af4da5dSStephan Aßmus BRect buttonFrame2(fDestButton->Frame()); 2236af4da5dSStephan Aßmus buttonFrame2.OffsetTo(r.right - buttonFrame2.Width(), 2246af4da5dSStephan Aßmus r.bottom - buttonFrame2.Height()); 2256af4da5dSStephan Aßmus 2266af4da5dSStephan Aßmus fOutputFolder = new BStringView(r4, NULL, defaultdirectory, 2276af4da5dSStephan Aßmus B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP, B_WILL_DRAW); 2286af4da5dSStephan Aßmus fBox3->AddChild(fOutputFolder); 2296af4da5dSStephan Aßmus fOutputFolder->MoveBy(buttonFrame2.Width() + 10, 5); 2306af4da5dSStephan Aßmus fOutputFolder->ResizeToPreferred(); 2316af4da5dSStephan Aßmus 2326af4da5dSStephan Aßmus // start/end duration 2336af4da5dSStephan Aßmus r4.top = r4.bottom + 10; 2346af4da5dSStephan Aßmus r4.bottom = r4.top + 20; 2356af4da5dSStephan Aßmus r4.right = r3.right; 2366af4da5dSStephan Aßmus fStartDurationTC = new BTextControl(r4, NULL, "", "0", NULL, 2376af4da5dSStephan Aßmus B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); 2386af4da5dSStephan Aßmus fBox3->AddChild(fStartDurationTC); 2396af4da5dSStephan Aßmus fStartDurationTC->SetText("0"); 2406af4da5dSStephan Aßmus 2416af4da5dSStephan Aßmus r4.top = r4.bottom + 5; 2426af4da5dSStephan Aßmus r4.bottom = r4.top + 20; 2436af4da5dSStephan Aßmus fEndDurationTC = new BTextControl(r4, NULL, "", "0", NULL, 2446af4da5dSStephan Aßmus B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); 2456af4da5dSStephan Aßmus fBox3->AddChild(fEndDurationTC); 2466af4da5dSStephan Aßmus fEndDurationTC->SetText("0"); 2476af4da5dSStephan Aßmus 2486af4da5dSStephan Aßmus r4.top = r4.bottom + 5; 2496af4da5dSStephan Aßmus r4.bottom = r4.top + 50; 2506af4da5dSStephan Aßmus 2516af4da5dSStephan Aßmus // Video Quality 2526af4da5dSStephan Aßmus fVideoQualitySlider = new BSlider(r4, "VSlider", "" , 2536af4da5dSStephan Aßmus new BMessage(VIDEO_QUALITY_CHANGED_MESSAGE), 1, 100, B_HORIZONTAL, 2546af4da5dSStephan Aßmus B_BLOCK_THUMB, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); 2556af4da5dSStephan Aßmus fVideoQualitySlider->SetValue(fVideoQuality); 2566af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(false); 2576af4da5dSStephan Aßmus fBox3->AddChild(fVideoQualitySlider); 2586af4da5dSStephan Aßmus 2596af4da5dSStephan Aßmus r4.top = r4.bottom + 5; 2606af4da5dSStephan Aßmus r4.bottom = r4.top + 50; 2616af4da5dSStephan Aßmus 2626af4da5dSStephan Aßmus // Audio Quality 2636af4da5dSStephan Aßmus fAudioQualitySlider = new BSlider(r4,"ASlider", "" , 2646af4da5dSStephan Aßmus new BMessage(AUDIO_QUALITY_CHANGED_MESSAGE), 1, 100, B_HORIZONTAL, 2656af4da5dSStephan Aßmus B_BLOCK_THUMB, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); 2666af4da5dSStephan Aßmus fAudioQualitySlider->SetValue(fAudioQuality); 2676af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(false); 2686af4da5dSStephan Aßmus fBox3->AddChild(fAudioQualitySlider); 2696af4da5dSStephan Aßmus background->AddChild(fBox3); 2706af4da5dSStephan Aßmus 2716af4da5dSStephan Aßmus // buttons 2726af4da5dSStephan Aßmus r2.top = r2.bottom + 15; 2736af4da5dSStephan Aßmus r2.bottom = r2.top + 20; 2746af4da5dSStephan Aßmus r2.left = r.left - 120; 2756af4da5dSStephan Aßmus r2.right = r.right; 2766af4da5dSStephan Aßmus 2776af4da5dSStephan Aßmus fPreviewButton = new BButton(r2, NULL, PREVIEW_BUTTON_LABEL, 2786af4da5dSStephan Aßmus new BMessage(PREVIEW_MESSAGE), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM); 2796af4da5dSStephan Aßmus background->AddChild(fPreviewButton); 2806af4da5dSStephan Aßmus fPreviewButton->SetEnabled(false); 2816af4da5dSStephan Aßmus 2826af4da5dSStephan Aßmus fConvertButton = new BButton(r2, NULL, CONVERT_LABEL, 2836af4da5dSStephan Aßmus new BMessage(CONVERT_BUTTON_MESSAGE), 2846af4da5dSStephan Aßmus B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM); 2856af4da5dSStephan Aßmus background->AddChild(fConvertButton); 2866af4da5dSStephan Aßmus 2876af4da5dSStephan Aßmus // Status view 2886af4da5dSStephan Aßmus r2.bottom = r2.top + 20; 2896af4da5dSStephan Aßmus r2.left = r.left; 2906af4da5dSStephan Aßmus r2.right = r.right; 2916af4da5dSStephan Aßmus 2926af4da5dSStephan Aßmus fStatusView2 = new StatusView(r2, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_BOTTOM); 2936af4da5dSStephan Aßmus background->AddChild(fStatusView2); 2946af4da5dSStephan Aßmus 2956af4da5dSStephan Aßmus r2.top += 15; 2966af4da5dSStephan Aßmus r2.bottom += 20; 2976af4da5dSStephan Aßmus 2986af4da5dSStephan Aßmus fStatusView = new StatusView(r2, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_BOTTOM); 2996af4da5dSStephan Aßmus background->AddChild(fStatusView); 3006af4da5dSStephan Aßmus AddChild(background); 3016af4da5dSStephan Aßmus 3026af4da5dSStephan Aßmus SetStatusMessage(""); 3036af4da5dSStephan Aßmus _UpdateLabels(); 3046af4da5dSStephan Aßmus 3056af4da5dSStephan Aßmus SetSizeLimits(frame.Width(), 32000, frame.Height(), 32000); 3066af4da5dSStephan Aßmus } 3076af4da5dSStephan Aßmus 3086af4da5dSStephan Aßmus 3096af4da5dSStephan Aßmus MediaConverterWindow::~MediaConverterWindow() 3106af4da5dSStephan Aßmus { 3113c0f9a7cSKarsten Heimrich delete fSaveFilePanel; 3123c0f9a7cSKarsten Heimrich delete fOpenFilePanel; 3136af4da5dSStephan Aßmus } 3146af4da5dSStephan Aßmus 3156af4da5dSStephan Aßmus 3166af4da5dSStephan Aßmus // #pragma mark - 3176af4da5dSStephan Aßmus 3186af4da5dSStephan Aßmus 3196af4da5dSStephan Aßmus /* 3206af4da5dSStephan Aßmus void 3216af4da5dSStephan Aßmus MediaConverterWindow::DispatchMessage(BMessage *msg, BHandler *handler) 3226af4da5dSStephan Aßmus { 3236af4da5dSStephan Aßmus if (msg->WasDropped() && msg->what == B_SIMPLE_DATA) { 3246af4da5dSStephan Aßmus 3256af4da5dSStephan Aßmus printf("Dispatch 1\n"); 3266af4da5dSStephan Aßmus DetachCurrentMessage(); 3276af4da5dSStephan Aßmus msg->what = B_REFS_RECEIVED; 3286af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(msg); 3296af4da5dSStephan Aßmus delete msg; 3306af4da5dSStephan Aßmus } else { 3316af4da5dSStephan Aßmus BWindow::DispatchMessage(msg, handler); 3326af4da5dSStephan Aßmus } 3336af4da5dSStephan Aßmus } 3346af4da5dSStephan Aßmus */ 3356af4da5dSStephan Aßmus 3366af4da5dSStephan Aßmus 3376af4da5dSStephan Aßmus void 3386af4da5dSStephan Aßmus MediaConverterWindow::MessageReceived(BMessage *msg) 3396af4da5dSStephan Aßmus { 3406af4da5dSStephan Aßmus status_t status; 3416af4da5dSStephan Aßmus entry_ref ref; 3426af4da5dSStephan Aßmus entry_ref inRef; 3436af4da5dSStephan Aßmus 3446af4da5dSStephan Aßmus BString string, string2; 3456af4da5dSStephan Aßmus 346*1c992a52SStephan Aßmus // TODO: For preview, launch the default file app instead of hardcoded 347*1c992a52SStephan Aßmus // MediaPlayer 3487767db5aSPhilippe Houdoin BEntry entry("/boot/system/apps/MediaPlayer", true); 3496af4da5dSStephan Aßmus char buffer[40]; 3506af4da5dSStephan Aßmus char buffer2[B_PATH_NAME_LENGTH]; 351*1c992a52SStephan Aßmus const char* argv[3]; 3526af4da5dSStephan Aßmus argv[0] = "-pos"; 3536af4da5dSStephan Aßmus BMediaFile *inFile(NULL); 3546af4da5dSStephan Aßmus int32 srcIndex = 0; 3556af4da5dSStephan Aßmus BPath name; 3566af4da5dSStephan Aßmus BEntry inentry; 3576af4da5dSStephan Aßmus int32 value; 3586af4da5dSStephan Aßmus BRect ButtonRect; 3596af4da5dSStephan Aßmus 3606af4da5dSStephan Aßmus switch (msg->what) { 3616af4da5dSStephan Aßmus #if B_BEOS_VERSION <= B_BEOS_VERSION_6 3626af4da5dSStephan Aßmus case B_LANGUAGE_CHANGED: 3636af4da5dSStephan Aßmus LanguageChanged(); 3646af4da5dSStephan Aßmus break; 3656af4da5dSStephan Aßmus #endif 3666af4da5dSStephan Aßmus 3676af4da5dSStephan Aßmus case INIT_FORMAT_MENUS: 3686af4da5dSStephan Aßmus BuildFormatMenu(); 3696af4da5dSStephan Aßmus if (CountSourceFiles() == 0) 3706af4da5dSStephan Aßmus SetEnabled(false, false); 3716af4da5dSStephan Aßmus break; 3726af4da5dSStephan Aßmus 3736af4da5dSStephan Aßmus case B_SIMPLE_DATA: 3746af4da5dSStephan Aßmus if (msg->WasDropped()) 3756af4da5dSStephan Aßmus { 3766af4da5dSStephan Aßmus DetachCurrentMessage(); 3776af4da5dSStephan Aßmus msg->what = B_REFS_RECEIVED; 3786af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(msg); 3796af4da5dSStephan Aßmus delete msg; 3806af4da5dSStephan Aßmus } 3816af4da5dSStephan Aßmus break; 3826af4da5dSStephan Aßmus 3836af4da5dSStephan Aßmus case FORMAT_SELECT_MESSAGE: 3846af4da5dSStephan Aßmus BuildAudioVideoMenus(); 3856af4da5dSStephan Aßmus break; 3866af4da5dSStephan Aßmus case AUDIO_CODEC_SELECT_MESSAGE: 3876af4da5dSStephan Aßmus break; 3886af4da5dSStephan Aßmus case VIDEO_CODEC_SELECT_MESSAGE: 3896af4da5dSStephan Aßmus break; 3906af4da5dSStephan Aßmus 3916af4da5dSStephan Aßmus case CONVERT_BUTTON_MESSAGE: 3926af4da5dSStephan Aßmus if (!fConverting) { 3936af4da5dSStephan Aßmus fConvertButton->SetLabel(CANCEL_LABEL); 3946af4da5dSStephan Aßmus fConverting = true; 3956af4da5dSStephan Aßmus SetStatusMessage(CONVERT_LABEL); 3966af4da5dSStephan Aßmus SetEnabled(false, true); 3976af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(START_CONVERSION_MESSAGE); 3986af4da5dSStephan Aßmus } else if (!fCancelling) { 3996af4da5dSStephan Aßmus fCancelling = true; 4006af4da5dSStephan Aßmus SetStatusMessage(CANCELLING_LABEL B_UTF8_ELLIPSIS); 4016af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE); 4026af4da5dSStephan Aßmus } 4036af4da5dSStephan Aßmus break; 4046af4da5dSStephan Aßmus 4056af4da5dSStephan Aßmus case CONVERSION_DONE_MESSAGE: 4066af4da5dSStephan Aßmus SetStatusMessage(fCancelling ? CONV_CANCEL_LABEL : CONV_COMPLETE_LABEL); 4076af4da5dSStephan Aßmus fConverting = false; 4086af4da5dSStephan Aßmus fCancelling = false; 4096af4da5dSStephan Aßmus { 4106af4da5dSStephan Aßmus bool enable = CountSourceFiles() > 0; 4116af4da5dSStephan Aßmus SetEnabled(enable, enable); 4126af4da5dSStephan Aßmus } 4136af4da5dSStephan Aßmus fConvertButton->SetLabel(CONVERT_LABEL); 4146af4da5dSStephan Aßmus 4156af4da5dSStephan Aßmus 4166af4da5dSStephan Aßmus break; 4176af4da5dSStephan Aßmus 4186af4da5dSStephan Aßmus case OUTPUT_FOLDER_MESSAGE: 4196af4da5dSStephan Aßmus // Execute Save Panel 4206af4da5dSStephan Aßmus if (!fSaveFilePanel) { 4216af4da5dSStephan Aßmus BButton *SelectThisDir; 4226af4da5dSStephan Aßmus 4233c0f9a7cSKarsten Heimrich BMessage message(FOLDER_SELECT_MESSAGE); 4243c0f9a7cSKarsten Heimrich fSaveFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL, 4253c0f9a7cSKarsten Heimrich B_DIRECTORY_NODE, true, &message, NULL, false, true); 4266af4da5dSStephan Aßmus fSaveFilePanel->SetButtonLabel(B_DEFAULT_BUTTON, SELECT_LABEL); 4276af4da5dSStephan Aßmus fSaveFilePanel->Window()->SetTitle(SAVE_DIR_LABEL); 4286af4da5dSStephan Aßmus fSaveFilePanel->SetTarget(this); 4296af4da5dSStephan Aßmus 4306af4da5dSStephan Aßmus fSaveFilePanel->Window()->Lock(); 4316af4da5dSStephan Aßmus ButtonRect = fSaveFilePanel->Window()->ChildAt(0)->FindView("cancel button")->Frame(); 4326af4da5dSStephan Aßmus ButtonRect.right = ButtonRect.left - 20; 4336af4da5dSStephan Aßmus ButtonRect.left = ButtonRect.right - 130; 4346af4da5dSStephan Aßmus SelectThisDir = new BButton(ButtonRect, NULL, SELECT_DIR_LABEL, 4356af4da5dSStephan Aßmus new BMessage(SELECT_THIS_DIR_MESSAGE), B_FOLLOW_BOTTOM | B_FOLLOW_RIGHT); 4366af4da5dSStephan Aßmus SelectThisDir->SetTarget(this); 4376af4da5dSStephan Aßmus fSaveFilePanel->Window()->ChildAt(0)->AddChild(SelectThisDir); 4386af4da5dSStephan Aßmus fSaveFilePanel->Window()->Unlock(); 4396af4da5dSStephan Aßmus 4406af4da5dSStephan Aßmus BRefFilter *filter; 4416af4da5dSStephan Aßmus filter = new DirectoryFilter; 4426af4da5dSStephan Aßmus fSaveFilePanel->SetRefFilter(filter); 4436af4da5dSStephan Aßmus } 4446af4da5dSStephan Aßmus fSaveFilePanel->Show(); 4456af4da5dSStephan Aßmus break; 4466af4da5dSStephan Aßmus 4476af4da5dSStephan Aßmus case FOLDER_SELECT_MESSAGE: 4486af4da5dSStephan Aßmus // "SELECT" Button at Save Panel Pushed 4496af4da5dSStephan Aßmus fSaveFilePanel->GetNextSelectedRef(&inRef); 4506af4da5dSStephan Aßmus inentry.SetTo(&inRef, true); 4516af4da5dSStephan Aßmus _SetOutputFolder(inentry); 4526af4da5dSStephan Aßmus fOutputDirSpecified = true; 4536af4da5dSStephan Aßmus break; 4546af4da5dSStephan Aßmus 4556af4da5dSStephan Aßmus case SELECT_THIS_DIR_MESSAGE: 4566af4da5dSStephan Aßmus // "THIS DIR" Button at Save Panel Pushed 4576af4da5dSStephan Aßmus fSaveFilePanel->GetPanelDirectory(&inRef); 4586af4da5dSStephan Aßmus fSaveFilePanel->Hide(); 4596af4da5dSStephan Aßmus inentry.SetTo(&inRef, true); 4606af4da5dSStephan Aßmus _SetOutputFolder(inentry); 4616af4da5dSStephan Aßmus fOutputDirSpecified = true; 4626af4da5dSStephan Aßmus break; 4636af4da5dSStephan Aßmus 4646af4da5dSStephan Aßmus case OPEN_FILE_MESSAGE: 4656af4da5dSStephan Aßmus // Execute Open Panel 4666af4da5dSStephan Aßmus if (!fOpenFilePanel) { 4673c0f9a7cSKarsten Heimrich fOpenFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL, 4683c0f9a7cSKarsten Heimrich B_FILE_NODE, true, NULL, NULL, false, true); 4696af4da5dSStephan Aßmus fOpenFilePanel->SetTarget(this); 4706af4da5dSStephan Aßmus } 4716af4da5dSStephan Aßmus fOpenFilePanel->Show(); 4726af4da5dSStephan Aßmus break; 4736af4da5dSStephan Aßmus 4746af4da5dSStephan Aßmus case B_REFS_RECEIVED: 4756af4da5dSStephan Aßmus // Media Files Seleced by Open Panel 4766af4da5dSStephan Aßmus DetachCurrentMessage(); 4776af4da5dSStephan Aßmus msg->what = B_REFS_RECEIVED; 4786af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(msg); 4796af4da5dSStephan Aßmus // fall through 4806af4da5dSStephan Aßmus 4816af4da5dSStephan Aßmus case B_CANCEL: 4826af4da5dSStephan Aßmus break; 4836af4da5dSStephan Aßmus 4846af4da5dSStephan Aßmus case DISP_ABOUT_MESSAGE: { 4856af4da5dSStephan Aßmus (new BAlert(ABOUT_TITLE_LABEL B_UTF8_ELLIPSIS, 4866af4da5dSStephan Aßmus "MediaConverter\n" 4876af4da5dSStephan Aßmus VERSION"\n" 4886af4da5dSStephan Aßmus B_UTF8_COPYRIGHT" 1999, Be Incorporated.\n" 4896af4da5dSStephan Aßmus B_UTF8_COPYRIGHT" 2000-2004 Jun Suzuki\n" 4906af4da5dSStephan Aßmus B_UTF8_COPYRIGHT" 2007 Stephan Aßmus", 4916af4da5dSStephan Aßmus OK_LABEL))->Go(); 4926af4da5dSStephan Aßmus break; 4936af4da5dSStephan Aßmus } 4946af4da5dSStephan Aßmus 4956af4da5dSStephan Aßmus case QUIT_MESSAGE: 4966af4da5dSStephan Aßmus MediaConverterWindow::QuitRequested(); 4976af4da5dSStephan Aßmus break; 4986af4da5dSStephan Aßmus 4996af4da5dSStephan Aßmus case PREVIEW_MESSAGE: 5006af4da5dSStephan Aßmus entry.GetRef(&ref); 5016af4da5dSStephan Aßmus string = ""; 5026af4da5dSStephan Aßmus string << fStartDurationTC->Text(); 5036af4da5dSStephan Aßmus string << "000"; 5046af4da5dSStephan Aßmus 5056af4da5dSStephan Aßmus strcpy(buffer, string.String()); 5066af4da5dSStephan Aßmus argv[1] = buffer; 5076af4da5dSStephan Aßmus srcIndex = fListView->CurrentSelection(); 5086af4da5dSStephan Aßmus status = GetSourceFileAt(srcIndex, &inFile, &inRef); 5096af4da5dSStephan Aßmus if (status == B_OK) { 5106af4da5dSStephan Aßmus inentry.SetTo(&inRef); 5116af4da5dSStephan Aßmus inentry.GetPath(&name); 5126af4da5dSStephan Aßmus 5136af4da5dSStephan Aßmus strcpy(buffer, string.String()); 5146af4da5dSStephan Aßmus 5156af4da5dSStephan Aßmus strcpy(buffer2, name.Path()); 5166af4da5dSStephan Aßmus argv[2] = buffer2; 5176af4da5dSStephan Aßmus } 5186af4da5dSStephan Aßmus 5196af4da5dSStephan Aßmus status = be_roster->Launch(&ref, 3, argv); 5206af4da5dSStephan Aßmus 5216af4da5dSStephan Aßmus if (status != B_OK) { 5226af4da5dSStephan Aßmus string2 << LAUNCH_ERROR << strerror(status); 5236af4da5dSStephan Aßmus (new BAlert("", string2.String(), OK_LABEL))->Go(); 5246af4da5dSStephan Aßmus } 5256af4da5dSStephan Aßmus break; 5266af4da5dSStephan Aßmus 5276af4da5dSStephan Aßmus case VIDEO_QUALITY_CHANGED_MESSAGE: 5286af4da5dSStephan Aßmus msg->FindInt32("be:value",&value); 5296af4da5dSStephan Aßmus sprintf(buffer, VIDEO_QUALITY_LABEL, (int8)value); 5306af4da5dSStephan Aßmus fVideoQualitySlider->SetLabel(buffer); 5316af4da5dSStephan Aßmus fVideoQuality = value; 5326af4da5dSStephan Aßmus break; 5336af4da5dSStephan Aßmus 5346af4da5dSStephan Aßmus case AUDIO_QUALITY_CHANGED_MESSAGE: 5356af4da5dSStephan Aßmus msg->FindInt32("be:value",&value); 5366af4da5dSStephan Aßmus sprintf(buffer, AUDIO_QUALITY_LABEL, (int8)value); 5376af4da5dSStephan Aßmus fAudioQualitySlider->SetLabel(buffer); 5386af4da5dSStephan Aßmus fAudioQuality = value; 5396af4da5dSStephan Aßmus break; 5406af4da5dSStephan Aßmus 5416af4da5dSStephan Aßmus default: 5426af4da5dSStephan Aßmus BWindow::MessageReceived(msg); 5436af4da5dSStephan Aßmus } 5446af4da5dSStephan Aßmus } 5456af4da5dSStephan Aßmus 5466af4da5dSStephan Aßmus 5476af4da5dSStephan Aßmus bool 5486af4da5dSStephan Aßmus MediaConverterWindow::QuitRequested() 5496af4da5dSStephan Aßmus { 5506af4da5dSStephan Aßmus if (!fConverting) { 5516af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(B_QUIT_REQUESTED); 5526af4da5dSStephan Aßmus return true; 5536af4da5dSStephan Aßmus } else if (!fCancelling) { 5546af4da5dSStephan Aßmus fCancelling = true; 5556af4da5dSStephan Aßmus SetStatusMessage(CANCELLING_LABEL); 5566af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE); 5576af4da5dSStephan Aßmus } 5586af4da5dSStephan Aßmus return false; 5596af4da5dSStephan Aßmus } 5606af4da5dSStephan Aßmus 5616af4da5dSStephan Aßmus 5626af4da5dSStephan Aßmus // #pragma mark - 5636af4da5dSStephan Aßmus 5646af4da5dSStephan Aßmus 5656af4da5dSStephan Aßmus void 5666af4da5dSStephan Aßmus MediaConverterWindow::LanguageChanged() 5676af4da5dSStephan Aßmus { 5686af4da5dSStephan Aßmus _DestroyMenu(); 5696af4da5dSStephan Aßmus _CreateMenu(); 5706af4da5dSStephan Aßmus _UpdateLabels(); 5716af4da5dSStephan Aßmus BuildAudioVideoMenus(); 5726af4da5dSStephan Aßmus Lock(); 5736af4da5dSStephan Aßmus fInfoView->Invalidate(); 5746af4da5dSStephan Aßmus Unlock(); 5756af4da5dSStephan Aßmus } 5766af4da5dSStephan Aßmus 5776af4da5dSStephan Aßmus 5786af4da5dSStephan Aßmus void 5796af4da5dSStephan Aßmus MediaConverterWindow::BuildAudioVideoMenus() 5806af4da5dSStephan Aßmus { 5816af4da5dSStephan Aßmus BMenu *menu = fAudioMenu->Menu(); 5826af4da5dSStephan Aßmus BMenuItem *item; 5836af4da5dSStephan Aßmus // clear out old audio codec menu items 5846af4da5dSStephan Aßmus while ((item = menu->RemoveItem((int32)0)) != NULL) { 5856af4da5dSStephan Aßmus delete item; 5866af4da5dSStephan Aßmus } 5876af4da5dSStephan Aßmus 5886af4da5dSStephan Aßmus bool separator = true; 5896af4da5dSStephan Aßmus 5906af4da5dSStephan Aßmus // get selected file format 5916af4da5dSStephan Aßmus FileFormatMenuItem *ffmi = (FileFormatMenuItem*)fFormatMenu->Menu()->FindMarked(); 5926af4da5dSStephan Aßmus media_file_format *mf_format = &(ffmi->fFileFormat); 5936af4da5dSStephan Aßmus 5946af4da5dSStephan Aßmus media_format format, outfmt; 5956af4da5dSStephan Aßmus memset(&format, 0, sizeof(format)); 5966af4da5dSStephan Aßmus media_codec_info codec_info; 5976af4da5dSStephan Aßmus int32 cookie = 0; 5986af4da5dSStephan Aßmus CodecMenuItem* cmi; 5996af4da5dSStephan Aßmus 6006af4da5dSStephan Aßmus // add available audio encoders to menu 6016af4da5dSStephan Aßmus format.type = B_MEDIA_RAW_AUDIO; 6026af4da5dSStephan Aßmus format.u.raw_audio = media_raw_audio_format::wildcard; 6036af4da5dSStephan Aßmus while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info) == B_OK) { 6046af4da5dSStephan Aßmus if (separator) { 6056af4da5dSStephan Aßmus menu->AddItem(new BMenuItem("No Audio", 6066af4da5dSStephan Aßmus new BMessage(AUDIO_CODEC_SELECT_MESSAGE))); 6076af4da5dSStephan Aßmus menu->AddSeparatorItem(); 6086af4da5dSStephan Aßmus separator = false; 6096af4da5dSStephan Aßmus } 6106af4da5dSStephan Aßmus 6116af4da5dSStephan Aßmus cmi = new CodecMenuItem(&codec_info, AUDIO_CODEC_SELECT_MESSAGE); 6126af4da5dSStephan Aßmus menu->AddItem(cmi); 6136af4da5dSStephan Aßmus // reset media format struct 6146af4da5dSStephan Aßmus /* 6156af4da5dSStephan Aßmus format.type = B_MEDIA_RAW_AUDIO; 6166af4da5dSStephan Aßmus format.u.raw_audio = media_raw_audio_format::wildcard; 6176af4da5dSStephan Aßmus */ 6186af4da5dSStephan Aßmus } 6196af4da5dSStephan Aßmus 6206af4da5dSStephan Aßmus // mark first audio encoder 6216af4da5dSStephan Aßmus item = menu->ItemAt(0); 6226af4da5dSStephan Aßmus if (item != NULL) { 6236af4da5dSStephan Aßmus fAudioMenu->SetEnabled(fEnabled); 6246af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(fEnabled); 6256af4da5dSStephan Aßmus item->SetMarked(true); 6266af4da5dSStephan Aßmus ((BInvoker *)item)->Invoke(); 6276af4da5dSStephan Aßmus } else { 6286af4da5dSStephan Aßmus item = new BMenuItem(NONE_LABEL, NULL); 6296af4da5dSStephan Aßmus menu->AddItem(item); 6306af4da5dSStephan Aßmus item->SetMarked(true); 6316af4da5dSStephan Aßmus fAudioMenu->SetEnabled(false); 6326af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(false); 6336af4da5dSStephan Aßmus } 6346af4da5dSStephan Aßmus 6356af4da5dSStephan Aßmus // clear out old video codec menu items 6366af4da5dSStephan Aßmus menu = fVideoMenu->Menu(); 6376af4da5dSStephan Aßmus while ((item = menu->RemoveItem((int32)0)) != NULL) { 6386af4da5dSStephan Aßmus delete item; 6396af4da5dSStephan Aßmus } 6406af4da5dSStephan Aßmus 6416af4da5dSStephan Aßmus separator = true; 6426af4da5dSStephan Aßmus 6436af4da5dSStephan Aßmus // construct a generic video format. Some of these parameters 6446af4da5dSStephan Aßmus // seem silly, but are needed for R4.5.x, which is more picky 6456af4da5dSStephan Aßmus // than subsequent BeOS releases will be. 6466af4da5dSStephan Aßmus memset(&format, 0, sizeof(format)); 6476af4da5dSStephan Aßmus format.type = B_MEDIA_RAW_VIDEO; 6486af4da5dSStephan Aßmus format.u.raw_video.last_active = (uint32)(240 - 1); 6496af4da5dSStephan Aßmus format.u.raw_video.orientation = B_VIDEO_TOP_LEFT_RIGHT; 6506af4da5dSStephan Aßmus format.u.raw_video.display.format = B_RGB32; 6516af4da5dSStephan Aßmus format.u.raw_video.display.line_width = (int32)320; 6526af4da5dSStephan Aßmus format.u.raw_video.display.line_count = (int32)240; 6536af4da5dSStephan Aßmus format.u.raw_video.display.bytes_per_row = 4 * 320; 6546af4da5dSStephan Aßmus 6556af4da5dSStephan Aßmus // add available video encoders to menu 6566af4da5dSStephan Aßmus cookie = 0; 6576af4da5dSStephan Aßmus while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info) == B_OK) { 6586af4da5dSStephan Aßmus if (separator) { 6596af4da5dSStephan Aßmus menu->AddItem(new BMenuItem("No Video", 6606af4da5dSStephan Aßmus new BMessage(VIDEO_CODEC_SELECT_MESSAGE))); 6616af4da5dSStephan Aßmus menu->AddSeparatorItem(); 6626af4da5dSStephan Aßmus separator = false; 6636af4da5dSStephan Aßmus } 6646af4da5dSStephan Aßmus 6656af4da5dSStephan Aßmus cmi = new CodecMenuItem(&codec_info, VIDEO_CODEC_SELECT_MESSAGE); 6666af4da5dSStephan Aßmus menu->AddItem(cmi); 6676af4da5dSStephan Aßmus } 6686af4da5dSStephan Aßmus 6696af4da5dSStephan Aßmus // mark first video encoder 6706af4da5dSStephan Aßmus item = menu->ItemAt(0); 6716af4da5dSStephan Aßmus if (item != NULL) { 6726af4da5dSStephan Aßmus fVideoMenu->SetEnabled(fEnabled); 6736af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(fEnabled); 6746af4da5dSStephan Aßmus item->SetMarked(true); 6756af4da5dSStephan Aßmus ((BInvoker *)item)->Invoke(); 6766af4da5dSStephan Aßmus } else { 6776af4da5dSStephan Aßmus item = new BMenuItem(NONE_LABEL, NULL); 6786af4da5dSStephan Aßmus menu->AddItem(item); 6796af4da5dSStephan Aßmus item->SetMarked(true); 6806af4da5dSStephan Aßmus fVideoMenu->SetEnabled(false); 6816af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(false); 6826af4da5dSStephan Aßmus } 6836af4da5dSStephan Aßmus } 6846af4da5dSStephan Aßmus 6856af4da5dSStephan Aßmus void 6866af4da5dSStephan Aßmus MediaConverterWindow::GetSelectedFormatInfo(media_file_format** format, 6876af4da5dSStephan Aßmus media_codec_info** audio, media_codec_info** video) 6886af4da5dSStephan Aßmus { 6896af4da5dSStephan Aßmus *audio = NULL; 6906af4da5dSStephan Aßmus *video = NULL; 6916af4da5dSStephan Aßmus *format = NULL; 6926af4da5dSStephan Aßmus 6936af4da5dSStephan Aßmus FileFormatMenuItem *formatItem = 6946af4da5dSStephan Aßmus dynamic_cast<FileFormatMenuItem *>(fFormatMenu->Menu()->FindMarked()); 6956af4da5dSStephan Aßmus if (formatItem != NULL) { 6966af4da5dSStephan Aßmus *format = &(formatItem->fFileFormat); 6976af4da5dSStephan Aßmus } 6986af4da5dSStephan Aßmus 6996af4da5dSStephan Aßmus *audio = *video = NULL; 7006af4da5dSStephan Aßmus CodecMenuItem *codecItem = 7016af4da5dSStephan Aßmus dynamic_cast<CodecMenuItem *>(fAudioMenu->Menu()->FindMarked()); 7026af4da5dSStephan Aßmus if (codecItem != NULL) { 7036af4da5dSStephan Aßmus *audio = &(codecItem->fCodecInfo); 7046af4da5dSStephan Aßmus } 7056af4da5dSStephan Aßmus 7066af4da5dSStephan Aßmus codecItem = dynamic_cast<CodecMenuItem *>(fVideoMenu->Menu()->FindMarked()); 7076af4da5dSStephan Aßmus if (codecItem != NULL) { 7086af4da5dSStephan Aßmus *video = &(codecItem->fCodecInfo); 7096af4da5dSStephan Aßmus } 7106af4da5dSStephan Aßmus } 7116af4da5dSStephan Aßmus 7126af4da5dSStephan Aßmus 7136af4da5dSStephan Aßmus void 7146af4da5dSStephan Aßmus MediaConverterWindow::BuildFormatMenu() 7156af4da5dSStephan Aßmus { 7166af4da5dSStephan Aßmus BMenu *menu = fFormatMenu->Menu(); 7176af4da5dSStephan Aßmus BMenuItem *item; 7186af4da5dSStephan Aßmus // clear out old format menu items 7196af4da5dSStephan Aßmus while ((item = menu->RemoveItem((int32)0)) != NULL) { 7206af4da5dSStephan Aßmus delete item; 7216af4da5dSStephan Aßmus } 7226af4da5dSStephan Aßmus 7236af4da5dSStephan Aßmus // add menu items for each file format 7246af4da5dSStephan Aßmus media_file_format mfi; 7256af4da5dSStephan Aßmus int32 cookie = 0; 7266af4da5dSStephan Aßmus FileFormatMenuItem *ff_item; 7276af4da5dSStephan Aßmus while (get_next_file_format(&cookie, &mfi) == B_OK) { 7286af4da5dSStephan Aßmus ff_item = new FileFormatMenuItem(&mfi); 7296af4da5dSStephan Aßmus menu->AddItem(ff_item); 7306af4da5dSStephan Aßmus } 7316af4da5dSStephan Aßmus 7326af4da5dSStephan Aßmus // mark first item 7336af4da5dSStephan Aßmus item = menu->ItemAt(0); 7346af4da5dSStephan Aßmus if (item != NULL) { 7356af4da5dSStephan Aßmus item->SetMarked(true); 7366af4da5dSStephan Aßmus ((BInvoker *)item)->Invoke(); 7376af4da5dSStephan Aßmus } 7386af4da5dSStephan Aßmus } 7396af4da5dSStephan Aßmus 7406af4da5dSStephan Aßmus void 7416af4da5dSStephan Aßmus MediaConverterWindow::SetFileMessage(const char *message) 7426af4da5dSStephan Aßmus { 7436af4da5dSStephan Aßmus fStatusView->SetStatus(message); 7446af4da5dSStephan Aßmus } 7456af4da5dSStephan Aßmus 7466af4da5dSStephan Aßmus void 7476af4da5dSStephan Aßmus MediaConverterWindow::SetStatusMessage(const char *message) 7486af4da5dSStephan Aßmus { 7496af4da5dSStephan Aßmus fStatusView2->SetStatus(message); 7506af4da5dSStephan Aßmus } 7516af4da5dSStephan Aßmus 7526af4da5dSStephan Aßmus 7536af4da5dSStephan Aßmus // #pragma mark - 7546af4da5dSStephan Aßmus 7556af4da5dSStephan Aßmus 756*1c992a52SStephan Aßmus bool 7576af4da5dSStephan Aßmus MediaConverterWindow::AddSourceFile(BMediaFile* file, const entry_ref& ref) 7586af4da5dSStephan Aßmus { 759*1c992a52SStephan Aßmus if (!fListView->AddMediaItem(file, ref)) 760*1c992a52SStephan Aßmus return false; 7616af4da5dSStephan Aßmus 7626af4da5dSStephan Aßmus if (!fOutputDirSpecified) { 7636af4da5dSStephan Aßmus BEntry entry(&ref); 7646af4da5dSStephan Aßmus entry.GetParent(&entry); 7656af4da5dSStephan Aßmus _SetOutputFolder(entry); 7666af4da5dSStephan Aßmus } 767*1c992a52SStephan Aßmus 768*1c992a52SStephan Aßmus return true; 7696af4da5dSStephan Aßmus } 7706af4da5dSStephan Aßmus 7716af4da5dSStephan Aßmus 7726af4da5dSStephan Aßmus void 7736af4da5dSStephan Aßmus MediaConverterWindow::RemoveSourceFile(int32 index) 7746af4da5dSStephan Aßmus { 7756af4da5dSStephan Aßmus delete fListView->RemoveItem(index); 7766af4da5dSStephan Aßmus fStartDurationTC->SetText("0"); 7776af4da5dSStephan Aßmus fEndDurationTC->SetText("0"); 7786af4da5dSStephan Aßmus } 7796af4da5dSStephan Aßmus 7806af4da5dSStephan Aßmus 7816af4da5dSStephan Aßmus int32 7826af4da5dSStephan Aßmus MediaConverterWindow::CountSourceFiles() 7836af4da5dSStephan Aßmus { 7846af4da5dSStephan Aßmus return fListView->CountItems(); 7856af4da5dSStephan Aßmus } 7866af4da5dSStephan Aßmus 7876af4da5dSStephan Aßmus 7886af4da5dSStephan Aßmus status_t 7896af4da5dSStephan Aßmus MediaConverterWindow::GetSourceFileAt(int32 index, BMediaFile** _file, 7906af4da5dSStephan Aßmus entry_ref* ref) 7916af4da5dSStephan Aßmus { 7926af4da5dSStephan Aßmus MediaFileListItem* item = dynamic_cast<MediaFileListItem*>( 7936af4da5dSStephan Aßmus fListView->ItemAt(index)); 7946af4da5dSStephan Aßmus if (item != NULL) { 7956af4da5dSStephan Aßmus *_file = item->fMediaFile; 7966af4da5dSStephan Aßmus *ref = item->fRef; 7976af4da5dSStephan Aßmus return B_OK; 7986af4da5dSStephan Aßmus } else { 7996af4da5dSStephan Aßmus return B_ERROR; 8006af4da5dSStephan Aßmus } 8016af4da5dSStephan Aßmus } 8026af4da5dSStephan Aßmus 8036af4da5dSStephan Aßmus 8046af4da5dSStephan Aßmus void 8056af4da5dSStephan Aßmus MediaConverterWindow::SourceFileSelectionChanged() 8066af4da5dSStephan Aßmus { 8076af4da5dSStephan Aßmus int32 selected = fListView->CurrentSelection(); 8086af4da5dSStephan Aßmus BMediaFile* file = NULL; 8096af4da5dSStephan Aßmus entry_ref* _ref = NULL; 8106af4da5dSStephan Aßmus entry_ref ref; 8116af4da5dSStephan Aßmus bool enabled = false; 8126af4da5dSStephan Aßmus if (GetSourceFileAt(selected, &file, &ref) == B_OK) { 8136af4da5dSStephan Aßmus _ref = &ref; 8146af4da5dSStephan Aßmus enabled = true; 8156af4da5dSStephan Aßmus } 8166af4da5dSStephan Aßmus 8176af4da5dSStephan Aßmus fPreviewButton->SetEnabled(enabled); 8186af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(enabled); 8196af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(enabled); 8206af4da5dSStephan Aßmus fStartDurationTC->SetEnabled(enabled); 8216af4da5dSStephan Aßmus fEndDurationTC->SetEnabled(enabled); 8226af4da5dSStephan Aßmus 8236af4da5dSStephan Aßmus fInfoView->Update(file, _ref); 8246af4da5dSStephan Aßmus 8256af4da5dSStephan Aßmus // HACK: get the fInfoView to update the duration "synchronously" 8266af4da5dSStephan Aßmus UpdateIfNeeded(); 8276af4da5dSStephan Aßmus 8286af4da5dSStephan Aßmus // update duration text controls 8296af4da5dSStephan Aßmus fStartDurationTC->SetText("0"); 8306af4da5dSStephan Aßmus BString duration; 8316af4da5dSStephan Aßmus duration << fInfoView->Duration() / 1000; 8326af4da5dSStephan Aßmus fEndDurationTC->SetText(duration.String()); 8336af4da5dSStephan Aßmus } 8346af4da5dSStephan Aßmus 8356af4da5dSStephan Aßmus 8366af4da5dSStephan Aßmus // #pragma mark - 8376af4da5dSStephan Aßmus 8386af4da5dSStephan Aßmus 8396af4da5dSStephan Aßmus void 8406af4da5dSStephan Aßmus MediaConverterWindow::SetEnabled(bool enabled, bool convertEnabled) 8416af4da5dSStephan Aßmus { 8426af4da5dSStephan Aßmus fConvertButton->SetEnabled(convertEnabled); 8436af4da5dSStephan Aßmus if (enabled == fEnabled) 8446af4da5dSStephan Aßmus return; 8456af4da5dSStephan Aßmus 8466af4da5dSStephan Aßmus fFormatMenu->SetEnabled(enabled); 8476af4da5dSStephan Aßmus fAudioMenu->SetEnabled(enabled); 8486af4da5dSStephan Aßmus fVideoMenu->SetEnabled(enabled); 8496af4da5dSStephan Aßmus fListView->SetEnabled(enabled); 8506af4da5dSStephan Aßmus fStartDurationTC->SetEnabled(enabled); 8516af4da5dSStephan Aßmus fEndDurationTC->SetEnabled(enabled); 8526af4da5dSStephan Aßmus 8536af4da5dSStephan Aßmus fEnabled = enabled; 8546af4da5dSStephan Aßmus } 8556af4da5dSStephan Aßmus 8566af4da5dSStephan Aßmus 8576af4da5dSStephan Aßmus bool 8586af4da5dSStephan Aßmus MediaConverterWindow::IsEnabled() 8596af4da5dSStephan Aßmus { 8606af4da5dSStephan Aßmus return fEnabled; 8616af4da5dSStephan Aßmus } 8626af4da5dSStephan Aßmus 8636af4da5dSStephan Aßmus 8646af4da5dSStephan Aßmus const char* 8656af4da5dSStephan Aßmus MediaConverterWindow::StartDuration() const 8666af4da5dSStephan Aßmus { 8676af4da5dSStephan Aßmus return fStartDurationTC->Text(); 8686af4da5dSStephan Aßmus } 8696af4da5dSStephan Aßmus 8706af4da5dSStephan Aßmus 8716af4da5dSStephan Aßmus const char* 8726af4da5dSStephan Aßmus MediaConverterWindow::EndDuration() const 8736af4da5dSStephan Aßmus { 8746af4da5dSStephan Aßmus return fEndDurationTC->Text(); 8756af4da5dSStephan Aßmus } 8766af4da5dSStephan Aßmus 8776af4da5dSStephan Aßmus 8786af4da5dSStephan Aßmus BDirectory 8796af4da5dSStephan Aßmus MediaConverterWindow::OutputDirectory() const 8806af4da5dSStephan Aßmus { 8816af4da5dSStephan Aßmus return fOutputDir; 8826af4da5dSStephan Aßmus } 8836af4da5dSStephan Aßmus 8846af4da5dSStephan Aßmus 8856af4da5dSStephan Aßmus void 8866af4da5dSStephan Aßmus MediaConverterWindow::SetAudioQualityLabel(const char* label) 8876af4da5dSStephan Aßmus { 8886af4da5dSStephan Aßmus fAudioQualitySlider->SetLabel(label); 8896af4da5dSStephan Aßmus } 8906af4da5dSStephan Aßmus 8916af4da5dSStephan Aßmus 8926af4da5dSStephan Aßmus void 8936af4da5dSStephan Aßmus MediaConverterWindow::SetVideoQualityLabel(const char* label) 8946af4da5dSStephan Aßmus { 8956af4da5dSStephan Aßmus fVideoQualitySlider->SetLabel(label); 8966af4da5dSStephan Aßmus } 8976af4da5dSStephan Aßmus 8986af4da5dSStephan Aßmus 8996af4da5dSStephan Aßmus // #pragma mark - 9006af4da5dSStephan Aßmus 9016af4da5dSStephan Aßmus 9026af4da5dSStephan Aßmus void 9036af4da5dSStephan Aßmus MediaConverterWindow::_UpdateLabels() 9046af4da5dSStephan Aßmus { 9056af4da5dSStephan Aßmus char buffer[255]; 9066af4da5dSStephan Aßmus 9076af4da5dSStephan Aßmus if (fBox1 != NULL) 9086af4da5dSStephan Aßmus fBox1->SetLabel(SOURCE_BOX_LABEL); 9096af4da5dSStephan Aßmus if (fBox2 != NULL) 9106af4da5dSStephan Aßmus fBox2->SetLabel(INFO_BOX_LABEL); 9116af4da5dSStephan Aßmus if (fBox3 != NULL) 9126af4da5dSStephan Aßmus fBox3->SetLabel(OUTPUT_BOX_LABEL); 9136af4da5dSStephan Aßmus 9146af4da5dSStephan Aßmus BRect r(Bounds()); 9156af4da5dSStephan Aßmus float w = 0; 9166af4da5dSStephan Aßmus 9176af4da5dSStephan Aßmus if (fConvertButton != NULL) { 9186af4da5dSStephan Aßmus fConvertButton->SetLabel(CONVERT_LABEL); 9196af4da5dSStephan Aßmus fConvertButton->ResizeToPreferred(); 9206af4da5dSStephan Aßmus BRect buttonFrame(fConvertButton->Frame()); 9216af4da5dSStephan Aßmus w = buttonFrame.Width(); 9226af4da5dSStephan Aßmus buttonFrame.OffsetTo(r.right - w - 10, r.bottom - buttonFrame.Height() - 25); 9236af4da5dSStephan Aßmus fConvertButton->MoveTo(buttonFrame.LeftTop()); 9246af4da5dSStephan Aßmus } 9256af4da5dSStephan Aßmus 9266af4da5dSStephan Aßmus if (fPreviewButton != NULL) { 9276af4da5dSStephan Aßmus fPreviewButton->SetLabel(PREVIEW_BUTTON_LABEL); 9286af4da5dSStephan Aßmus fPreviewButton->ResizeToPreferred(); 9296af4da5dSStephan Aßmus BRect buttonFrame(fPreviewButton->Frame()); 9306af4da5dSStephan Aßmus w = buttonFrame.Width(); 9316af4da5dSStephan Aßmus buttonFrame.OffsetTo(r.right - w - buttonFrame.Width() - 40, 9326af4da5dSStephan Aßmus r.bottom - buttonFrame.Height() - 25); 9336af4da5dSStephan Aßmus fPreviewButton->MoveTo(buttonFrame.LeftTop()); 9346af4da5dSStephan Aßmus } 9356af4da5dSStephan Aßmus 9366af4da5dSStephan Aßmus if (fDestButton != NULL) { 9376af4da5dSStephan Aßmus fDestButton->SetLabel(OUTPUT_FOLDER_LABEL); 9386af4da5dSStephan Aßmus fDestButton->ResizeToPreferred(); 9396af4da5dSStephan Aßmus } 9406af4da5dSStephan Aßmus 9416af4da5dSStephan Aßmus if (fOutputFolder != NULL) { 9426af4da5dSStephan Aßmus BRect destrect; 9436af4da5dSStephan Aßmus destrect = fDestButton->Frame(); 9446af4da5dSStephan Aßmus fOutputFolder->MoveTo(destrect.right + 10, destrect.top + 5); 9456af4da5dSStephan Aßmus fOutputFolder->ResizeToPreferred(); 9466af4da5dSStephan Aßmus } 9476af4da5dSStephan Aßmus 9486af4da5dSStephan Aßmus sprintf(buffer, VIDEO_QUALITY_LABEL, (int8)fVideoQuality); 9496af4da5dSStephan Aßmus if (fVideoQualitySlider != NULL) { 9506af4da5dSStephan Aßmus fVideoQualitySlider->SetLabel(buffer); 9516af4da5dSStephan Aßmus fVideoQualitySlider->SetLimitLabels(SLIDER_LOW_LABEL, 9526af4da5dSStephan Aßmus SLIDER_HIGH_LABEL); 9536af4da5dSStephan Aßmus } 9546af4da5dSStephan Aßmus 9556af4da5dSStephan Aßmus sprintf(buffer, AUDIO_QUALITY_LABEL, (int8)fAudioQuality); 9566af4da5dSStephan Aßmus 9576af4da5dSStephan Aßmus if (fAudioQualitySlider != NULL) { 9586af4da5dSStephan Aßmus fAudioQualitySlider->SetLabel(buffer); 9596af4da5dSStephan Aßmus fAudioQualitySlider->SetLimitLabels(SLIDER_LOW_LABEL, 9606af4da5dSStephan Aßmus SLIDER_HIGH_LABEL); 9616af4da5dSStephan Aßmus } 9626af4da5dSStephan Aßmus 9636af4da5dSStephan Aßmus float maxLabelLen = 0; 9646af4da5dSStephan Aßmus if (fStartDurationTC != NULL) { 9656af4da5dSStephan Aßmus fStartDurationTC->SetLabel(START_LABEL); 9666af4da5dSStephan Aßmus maxLabelLen = fStartDurationTC->StringWidth(START_LABEL); 9676af4da5dSStephan Aßmus } 9686af4da5dSStephan Aßmus if (fEndDurationTC != NULL) { 9696af4da5dSStephan Aßmus fEndDurationTC->SetLabel(END_LABEL); 9706af4da5dSStephan Aßmus maxLabelLen = MAX(maxLabelLen, fEndDurationTC->StringWidth(END_LABEL)); 9716af4da5dSStephan Aßmus } 9726af4da5dSStephan Aßmus if (fStartDurationTC != NULL) 9736af4da5dSStephan Aßmus fStartDurationTC->SetDivider(maxLabelLen + 5); 9746af4da5dSStephan Aßmus if (fEndDurationTC != NULL) 9756af4da5dSStephan Aßmus fEndDurationTC->SetDivider(maxLabelLen + 5); 9766af4da5dSStephan Aßmus 9776af4da5dSStephan Aßmus if (fFormatMenu != NULL) { 9786af4da5dSStephan Aßmus fFormatMenu->SetLabel(FORMAT_LABEL); 9796af4da5dSStephan Aßmus maxLabelLen = MAX(maxLabelLen, fFormatMenu->StringWidth( 9806af4da5dSStephan Aßmus fFormatMenu->Label())); 9816af4da5dSStephan Aßmus } 9826af4da5dSStephan Aßmus if (fAudioMenu != NULL) { 9836af4da5dSStephan Aßmus fAudioMenu->SetLabel(AUDIO_LABEL); 9846af4da5dSStephan Aßmus maxLabelLen = MAX(maxLabelLen, fAudioMenu->StringWidth( 9856af4da5dSStephan Aßmus fAudioMenu->Label())); 9866af4da5dSStephan Aßmus } 9876af4da5dSStephan Aßmus if (fVideoMenu != NULL) { 9886af4da5dSStephan Aßmus fVideoMenu->SetLabel(VIDEO_LABEL); 9896af4da5dSStephan Aßmus maxLabelLen = MAX(maxLabelLen, fVideoMenu->StringWidth( 9906af4da5dSStephan Aßmus fVideoMenu->Label())); 9916af4da5dSStephan Aßmus } 9926af4da5dSStephan Aßmus maxLabelLen += 10; 9936af4da5dSStephan Aßmus 9946af4da5dSStephan Aßmus if (fStartDurationTC != NULL) 9956af4da5dSStephan Aßmus fStartDurationTC->SetDivider(maxLabelLen); 9966af4da5dSStephan Aßmus if (fEndDurationTC != NULL) 9976af4da5dSStephan Aßmus fEndDurationTC->SetDivider(maxLabelLen); 9986af4da5dSStephan Aßmus if (fFormatMenu != NULL) 9996af4da5dSStephan Aßmus fFormatMenu->SetDivider(maxLabelLen + 3); 10006af4da5dSStephan Aßmus if (fAudioMenu != NULL) 10016af4da5dSStephan Aßmus fAudioMenu->SetDivider(maxLabelLen + 3); 10026af4da5dSStephan Aßmus if (fVideoMenu != NULL) 10036af4da5dSStephan Aßmus fVideoMenu->SetDivider(maxLabelLen + 3); 10046af4da5dSStephan Aßmus 10056af4da5dSStephan Aßmus SetFileMessage(DROP_MEDIA_FILE_LABEL); 10066af4da5dSStephan Aßmus } 10076af4da5dSStephan Aßmus 10086af4da5dSStephan Aßmus 10096af4da5dSStephan Aßmus void 10106af4da5dSStephan Aßmus MediaConverterWindow::_DestroyMenu() 10116af4da5dSStephan Aßmus { 10126af4da5dSStephan Aßmus BMenu* Menu; 10136af4da5dSStephan Aßmus 10146af4da5dSStephan Aßmus while ((Menu = fMenuBar->SubmenuAt(0)) != NULL) { 10156af4da5dSStephan Aßmus fMenuBar->RemoveItem(Menu); 10166af4da5dSStephan Aßmus delete Menu; 10176af4da5dSStephan Aßmus } 10186af4da5dSStephan Aßmus } 10196af4da5dSStephan Aßmus 10206af4da5dSStephan Aßmus 10216af4da5dSStephan Aßmus void 10226af4da5dSStephan Aßmus MediaConverterWindow::_CreateMenu() 10236af4da5dSStephan Aßmus { 10246af4da5dSStephan Aßmus BMenuItem* item; 10256af4da5dSStephan Aßmus BMenu* menu; 10266af4da5dSStephan Aßmus 10276af4da5dSStephan Aßmus menu = new BMenu(FILE_MENU_LABEL); 10286af4da5dSStephan Aßmus item = new BMenuItem(OPEN_MENU_LABEL B_UTF8_ELLIPSIS, 10296af4da5dSStephan Aßmus new BMessage(OPEN_FILE_MESSAGE)); 10306af4da5dSStephan Aßmus menu->AddItem(item); 10316af4da5dSStephan Aßmus menu->AddSeparatorItem(); 10326af4da5dSStephan Aßmus item = new BMenuItem(ABOUT_MENU_LABEL B_UTF8_ELLIPSIS, 10336af4da5dSStephan Aßmus new BMessage(DISP_ABOUT_MESSAGE)); 10346af4da5dSStephan Aßmus menu->AddItem(item); 10356af4da5dSStephan Aßmus menu->AddSeparatorItem(); 10366af4da5dSStephan Aßmus item = new BMenuItem(QUIT_MENU_LABEL, new BMessage(QUIT_MESSAGE)); 10376af4da5dSStephan Aßmus menu->AddItem(item); 10386af4da5dSStephan Aßmus 10396af4da5dSStephan Aßmus fMenuBar->AddItem(menu); 10406af4da5dSStephan Aßmus } 10416af4da5dSStephan Aßmus 10426af4da5dSStephan Aßmus 10436af4da5dSStephan Aßmus void 10446af4da5dSStephan Aßmus MediaConverterWindow::_SetOutputFolder(BEntry entry) 10456af4da5dSStephan Aßmus { 10466af4da5dSStephan Aßmus BPath path; 10476af4da5dSStephan Aßmus entry.GetPath(&path); 10486af4da5dSStephan Aßmus fOutputFolder->SetText(path.Path()); 10496af4da5dSStephan Aßmus fOutputFolder->ResizeToPreferred(); 10506af4da5dSStephan Aßmus fOutputDir.SetTo(path.Path()); 10516af4da5dSStephan Aßmus } 10526af4da5dSStephan Aßmus 10536af4da5dSStephan Aßmus 1054