xref: /haiku/src/apps/mediaconverter/MediaConverterWindow.cpp (revision 560ff4478d5c85455ea3e5ed5e392ef93132d545)
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 
12b97c5149SJonas 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*560ff447SJonas Sundström 	BWindow(frame, B_TRANSLATE_SYSTEM_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 
387b97c5149SJonas 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();
936b97c5149SJonas 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