xref: /haiku/src/apps/mediaconverter/MediaConverterWindow.cpp (revision b78760b964a5be4a9453a02c74ba742f87150908)
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 
126af4da5dSStephan Aßmus #include <Alert.h>
136af4da5dSStephan Aßmus #include <Application.h>
146af4da5dSStephan Aßmus #include <Box.h>
156af4da5dSStephan Aßmus #include <Button.h>
16ae0f70fcSAdrien Destugues #include <Catalog.h>
17dd55ed1aSAlex Wilson #include <ControlLook.h>
186af4da5dSStephan Aßmus #include <FilePanel.h>
19dd55ed1aSAlex Wilson #include <LayoutBuilder.h>
20ae0f70fcSAdrien Destugues #include <Locale.h>
216af4da5dSStephan Aßmus #include <Menu.h>
226af4da5dSStephan Aßmus #include <MenuBar.h>
236af4da5dSStephan Aßmus #include <MenuField.h>
246af4da5dSStephan Aßmus #include <MenuItem.h>
256af4da5dSStephan Aßmus #include <Path.h>
266af4da5dSStephan Aßmus #include <PopUpMenu.h>
276af4da5dSStephan Aßmus #include <Roster.h>
286af4da5dSStephan Aßmus #include <ScrollBar.h>
296af4da5dSStephan Aßmus #include <ScrollView.h>
306af4da5dSStephan Aßmus #include <Slider.h>
316af4da5dSStephan Aßmus #include <StringView.h>
326af4da5dSStephan Aßmus #include <TextControl.h>
336af4da5dSStephan Aßmus 
34*b78760b9SPhilippe Saint-Pierre #include <storage/FindDirectory.h>
35*b78760b9SPhilippe Saint-Pierre 
366af4da5dSStephan Aßmus #include "MediaFileInfoView.h"
376af4da5dSStephan Aßmus #include "MediaFileListView.h"
386af4da5dSStephan Aßmus #include "MessageConstants.h"
39ae0f70fcSAdrien Destugues 
40ae0f70fcSAdrien Destugues 
41546208a5SOliver Tappe #undef B_TRANSLATION_CONTEXT
42546208a5SOliver Tappe #define B_TRANSLATION_CONTEXT "MediaConverter"
43ae0f70fcSAdrien Destugues #define VERSION "1.3.0"
446af4da5dSStephan Aßmus 
456af4da5dSStephan Aßmus 
466af4da5dSStephan Aßmus // #pragma mark - DirectoryFilter
476af4da5dSStephan Aßmus 
486af4da5dSStephan Aßmus 
4960b6f368SStephan Aßmus class DirectoryFilter : public BRefFilter {
506af4da5dSStephan Aßmus public:
516af4da5dSStephan Aßmus 	DirectoryFilter() {};
526af4da5dSStephan Aßmus 	virtual bool Filter(const entry_ref* ref,
5360b6f368SStephan Aßmus 		BNode* node, struct stat_beos* st, const char* filetype)
546af4da5dSStephan Aßmus 	{
556af4da5dSStephan Aßmus 		return node->IsDirectory();
566af4da5dSStephan Aßmus 	}
576af4da5dSStephan Aßmus };
586af4da5dSStephan Aßmus 
596af4da5dSStephan Aßmus 
606af4da5dSStephan Aßmus // #pragma mark - FileFormatMenuItem
616af4da5dSStephan Aßmus 
626af4da5dSStephan Aßmus 
636af4da5dSStephan Aßmus class FileFormatMenuItem : public BMenuItem {
646af4da5dSStephan Aßmus public:
656af4da5dSStephan Aßmus 	FileFormatMenuItem(media_file_format* format);
666af4da5dSStephan Aßmus 	virtual ~FileFormatMenuItem();
676af4da5dSStephan Aßmus 
686af4da5dSStephan Aßmus 	media_file_format fFileFormat;
696af4da5dSStephan Aßmus };
706af4da5dSStephan Aßmus 
716af4da5dSStephan Aßmus 
726af4da5dSStephan Aßmus FileFormatMenuItem::FileFormatMenuItem(media_file_format *format)
73dd55ed1aSAlex Wilson 	:
74dd55ed1aSAlex Wilson 	BMenuItem(format->pretty_name, new BMessage(FORMAT_SELECT_MESSAGE))
756af4da5dSStephan Aßmus {
766af4da5dSStephan Aßmus 	memcpy(&fFileFormat, format, sizeof(fFileFormat));
776af4da5dSStephan Aßmus }
786af4da5dSStephan Aßmus 
796af4da5dSStephan Aßmus 
806af4da5dSStephan Aßmus FileFormatMenuItem::~FileFormatMenuItem()
816af4da5dSStephan Aßmus {
826af4da5dSStephan Aßmus }
836af4da5dSStephan Aßmus 
846af4da5dSStephan Aßmus 
856af4da5dSStephan Aßmus // #pragma mark - CodecMenuItem
866af4da5dSStephan Aßmus 
876af4da5dSStephan Aßmus 
886af4da5dSStephan Aßmus class CodecMenuItem : public BMenuItem {
896af4da5dSStephan Aßmus 	public:
906af4da5dSStephan Aßmus 				CodecMenuItem(media_codec_info *ci, uint32 msg_type);
916af4da5dSStephan Aßmus 	virtual		~CodecMenuItem();
926af4da5dSStephan Aßmus 
936af4da5dSStephan Aßmus 	media_codec_info fCodecInfo;
946af4da5dSStephan Aßmus };
956af4da5dSStephan Aßmus 
966af4da5dSStephan Aßmus 
976af4da5dSStephan Aßmus CodecMenuItem::CodecMenuItem(media_codec_info *ci, uint32 msg_type)
98dd55ed1aSAlex Wilson 	:
99dd55ed1aSAlex Wilson 	BMenuItem(ci->pretty_name, new BMessage(msg_type))
1006af4da5dSStephan Aßmus {
1016af4da5dSStephan Aßmus 	memcpy(&fCodecInfo, ci, sizeof(fCodecInfo));
1026af4da5dSStephan Aßmus }
1036af4da5dSStephan Aßmus 
1046af4da5dSStephan Aßmus 
1056af4da5dSStephan Aßmus CodecMenuItem::~CodecMenuItem()
1066af4da5dSStephan Aßmus {
1076af4da5dSStephan Aßmus }
1086af4da5dSStephan Aßmus 
1096af4da5dSStephan Aßmus 
1106af4da5dSStephan Aßmus // #pragma mark - MediaConverterWindow
1116af4da5dSStephan Aßmus 
1126af4da5dSStephan Aßmus 
1136af4da5dSStephan Aßmus MediaConverterWindow::MediaConverterWindow(BRect frame)
114dd55ed1aSAlex Wilson 	:
115560ff447SJonas Sundström 	BWindow(frame, B_TRANSLATE_SYSTEM_NAME("MediaConverter"), B_TITLED_WINDOW_LOOK,
116007d8a0cSSiarzhuk Zharski 		B_NORMAL_WINDOW_FEEL, B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS |
117007d8a0cSSiarzhuk Zharski 		B_AUTO_UPDATE_SIZE_LIMITS),
118dd55ed1aSAlex Wilson 	fVideoQuality(75),
119dd55ed1aSAlex Wilson 	fAudioQuality(75),
120dd55ed1aSAlex Wilson 	fSaveFilePanel(NULL),
121dd55ed1aSAlex Wilson 	fOpenFilePanel(NULL),
122dd55ed1aSAlex Wilson 	fOutputDirSpecified(false),
123dd55ed1aSAlex Wilson 	fEnabled(true),
124dd55ed1aSAlex Wilson 	fConverting(false),
125dd55ed1aSAlex Wilson 	fCancelling(false)
1266af4da5dSStephan Aßmus {
127*b78760b9SPhilippe Saint-Pierre 	BPath outputDir;
128*b78760b9SPhilippe Saint-Pierre 	if (find_directory(B_USER_DIRECTORY, &outputDir) != B_OK)
129*b78760b9SPhilippe Saint-Pierre 		outputDir.SetTo("/boot/home");
130*b78760b9SPhilippe Saint-Pierre 	fOutputDir.SetTo(outputDir.Path());
1316af4da5dSStephan Aßmus 
132dd55ed1aSAlex Wilson 	fMenuBar = new BMenuBar("menubar");
1336af4da5dSStephan Aßmus 	_CreateMenu();
1346af4da5dSStephan Aßmus 
135dd55ed1aSAlex Wilson 	fListView = new MediaFileListView();
136dd55ed1aSAlex Wilson 	fListView->SetExplicitMinSize(BSize(100, B_SIZE_UNSET));
137dd55ed1aSAlex Wilson 	BScrollView* scroller = new BScrollView(NULL, fListView, 0, false, true);
1386af4da5dSStephan Aßmus 
1396af4da5dSStephan Aßmus 	// file list view box
140dd55ed1aSAlex Wilson 	fSourcesBox = new BBox(B_FANCY_BORDER, scroller);
141dd55ed1aSAlex Wilson 	fSourcesBox->SetLayout(new BGroupLayout(B_HORIZONTAL, 0));
142dd55ed1aSAlex Wilson 	// We give fSourcesBox a layout to provide insets for the sources list
143dd55ed1aSAlex Wilson 	// said insets are adjusted in _UpdateLabels
1446af4da5dSStephan Aßmus 
145dd55ed1aSAlex Wilson 	fInfoView = new MediaFileInfoView();
146dd55ed1aSAlex Wilson 	fInfoBox = new BBox(B_FANCY_BORDER, fInfoView);
147dd55ed1aSAlex Wilson 	fInfoBox->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH,
148dd55ed1aSAlex Wilson 			B_ALIGN_USE_FULL_HEIGHT));
1497730c846SStephan Aßmus 
1507730c846SStephan Aßmus 	float padding = be_control_look->DefaultItemSpacing();
1516af4da5dSStephan Aßmus 
152dd55ed1aSAlex Wilson 	// Output format box
153dd55ed1aSAlex Wilson 	fOutputBox = new BBox(B_FANCY_BORDER, NULL);
1540a81944dSStephan Aßmus 	BGridLayout* outputGrid = new BGridLayout(padding, padding);
1550a81944dSStephan Aßmus 	fOutputBox->SetLayout(outputGrid);
156dd55ed1aSAlex Wilson 		// fOutputBox's layout is also adjusted in _UpdateLabels
1577730c846SStephan Aßmus 	outputGrid->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH,
1587730c846SStephan Aßmus 			B_ALIGN_USE_FULL_HEIGHT));
1597730c846SStephan Aßmus 	fOutputBox->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED));
1606af4da5dSStephan Aßmus 
161ae0f70fcSAdrien Destugues 	fFormatMenu = new BMenuField(NULL, B_TRANSLATE("File format:"),
162ae0f70fcSAdrien Destugues 		new BPopUpMenu(""));
163ae0f70fcSAdrien Destugues 	fAudioMenu = new BMenuField(NULL, B_TRANSLATE("Audio encoding:"),
164ae0f70fcSAdrien Destugues 		new BPopUpMenu(""));
165ae0f70fcSAdrien Destugues 	fVideoMenu = new BMenuField(NULL, B_TRANSLATE("Video encoding:"),
166ae0f70fcSAdrien Destugues 		new BPopUpMenu(""));
1676af4da5dSStephan Aßmus 
1686af4da5dSStephan Aßmus 	// output folder
169ae0f70fcSAdrien Destugues 	fDestButton = new BButton(B_TRANSLATE("Output folder"),
170dd55ed1aSAlex Wilson 		new BMessage(OUTPUT_FOLDER_MESSAGE));
171dd55ed1aSAlex Wilson 	BAlignment labelAlignment(be_control_look->DefaultLabelAlignment());
172*b78760b9SPhilippe Saint-Pierre 	fOutputFolder = new BStringView(NULL, outputDir.Path());
173dd55ed1aSAlex Wilson 	fOutputFolder->SetExplicitAlignment(labelAlignment);
1746af4da5dSStephan Aßmus 
1756af4da5dSStephan Aßmus 	// start/end duration
176dd55ed1aSAlex Wilson 	fStartDurationTC = new BTextControl(NULL, NULL, NULL);
1776af4da5dSStephan Aßmus 	fStartDurationTC->SetText("0");
1786af4da5dSStephan Aßmus 
179dd55ed1aSAlex Wilson 	fEndDurationTC = new BTextControl(NULL, NULL, NULL);
1806af4da5dSStephan Aßmus 	fEndDurationTC->SetText("0");
1816af4da5dSStephan Aßmus 
1826af4da5dSStephan Aßmus 	// Video Quality
183dd55ed1aSAlex Wilson 	fVideoQualitySlider = new BSlider("VSlider", "" ,
184dd55ed1aSAlex Wilson 		new BMessage(VIDEO_QUALITY_CHANGED_MESSAGE), 1, 100, B_HORIZONTAL);
1856af4da5dSStephan Aßmus 	fVideoQualitySlider->SetValue(fVideoQuality);
1866af4da5dSStephan Aßmus 	fVideoQualitySlider->SetEnabled(false);
1876af4da5dSStephan Aßmus 
1886af4da5dSStephan Aßmus 	// Audio Quality
189dd55ed1aSAlex Wilson 	fAudioQualitySlider = new BSlider("ASlider", "" ,
190dd55ed1aSAlex Wilson 		new BMessage(AUDIO_QUALITY_CHANGED_MESSAGE), 1, 100, B_HORIZONTAL);
1916af4da5dSStephan Aßmus 	fAudioQualitySlider->SetValue(fAudioQuality);
1926af4da5dSStephan Aßmus 	fAudioQualitySlider->SetEnabled(false);
193dd55ed1aSAlex Wilson 
1940a81944dSStephan Aßmus 	BLayoutBuilder::Grid<>(outputGrid)
195dd55ed1aSAlex Wilson 		.SetInsets(padding, padding, padding, padding)
196dd55ed1aSAlex Wilson 		.AddMenuField(fFormatMenu, 0, 0)
197dd55ed1aSAlex Wilson 		.AddMenuField(fAudioMenu, 0, 1)
198dd55ed1aSAlex Wilson 		.AddMenuField(fVideoMenu, 0, 2)
199dd55ed1aSAlex Wilson 		.Add(fDestButton, 0, 3)
200dd55ed1aSAlex Wilson 		.Add(fOutputFolder, 1, 3)
201dd55ed1aSAlex Wilson 		.AddTextControl(fStartDurationTC, 0, 4)
202dd55ed1aSAlex Wilson 		.AddTextControl(fEndDurationTC, 0, 5)
203dd55ed1aSAlex Wilson 		.Add(fVideoQualitySlider, 0, 6, 2, 1)
204dd55ed1aSAlex Wilson 		.Add(fAudioQualitySlider, 0, 7, 2, 1);
2056af4da5dSStephan Aßmus 
2066af4da5dSStephan Aßmus 	// buttons
207ae0f70fcSAdrien Destugues 	fPreviewButton = new BButton(B_TRANSLATE("Preview"),
208dd55ed1aSAlex Wilson 		new BMessage(PREVIEW_MESSAGE));
2096af4da5dSStephan Aßmus 	fPreviewButton->SetEnabled(false);
2106af4da5dSStephan Aßmus 
211ae0f70fcSAdrien Destugues 	fConvertButton = new BButton(B_TRANSLATE("Convert"),
212dd55ed1aSAlex Wilson 		new BMessage(CONVERT_BUTTON_MESSAGE));
2136af4da5dSStephan Aßmus 
214dd55ed1aSAlex Wilson 	// Status views
215dd55ed1aSAlex Wilson 	fStatus = new BStringView(NULL, NULL);
216dd55ed1aSAlex Wilson 	fStatus->SetExplicitAlignment(labelAlignment);
217dd55ed1aSAlex Wilson 	fFileStatus = new BStringView(NULL, NULL);
218dd55ed1aSAlex Wilson 	fFileStatus->SetExplicitAlignment(labelAlignment);
2196af4da5dSStephan Aßmus 
2206af4da5dSStephan Aßmus 	SetStatusMessage("");
2216af4da5dSStephan Aßmus 	_UpdateLabels();
2226af4da5dSStephan Aßmus 
223dd55ed1aSAlex Wilson 	BLayoutBuilder::Group<>(this, B_VERTICAL, 0)
224dd55ed1aSAlex Wilson 		.SetInsets(0, 0, 0, 0)
225dd55ed1aSAlex Wilson 		.Add(fMenuBar)
2267730c846SStephan Aßmus 		.AddSplit(B_HORIZONTAL, padding / 2)
227dd55ed1aSAlex Wilson 			.SetInsets(padding, padding, padding, padding)
2287730c846SStephan Aßmus 			.Add(fSourcesBox, 0.4)
2297730c846SStephan Aßmus 			.AddGroup(B_VERTICAL, padding, 0.6)
2307730c846SStephan Aßmus 				.Add(fInfoBox)
2317730c846SStephan Aßmus 				.Add(fOutputBox)
2327730c846SStephan Aßmus 			.End()
2337730c846SStephan Aßmus 		.End()
2347730c846SStephan Aßmus 		.AddGrid(padding, padding)
2357730c846SStephan Aßmus 			.SetInsets(padding, 0, padding, padding)
236dd55ed1aSAlex Wilson 			.Add(fStatus, 0, 0)
237dd55ed1aSAlex Wilson 			.Add(fFileStatus, 0, 1)
2389b2ea762SAlex Wilson 			.Add(BSpaceLayoutItem::CreateGlue(), 1, 0)
239dd55ed1aSAlex Wilson 			.Add(fPreviewButton, 2, 0)
2407730c846SStephan Aßmus 			.Add(fConvertButton, 3, 0)
2417730c846SStephan Aßmus 		.End()
2427730c846SStephan Aßmus 	;
2436af4da5dSStephan Aßmus }
2446af4da5dSStephan Aßmus 
2456af4da5dSStephan Aßmus 
2466af4da5dSStephan Aßmus MediaConverterWindow::~MediaConverterWindow()
2476af4da5dSStephan Aßmus {
2483c0f9a7cSKarsten Heimrich 	delete fSaveFilePanel;
2493c0f9a7cSKarsten Heimrich 	delete fOpenFilePanel;
2506af4da5dSStephan Aßmus }
2516af4da5dSStephan Aßmus 
2526af4da5dSStephan Aßmus 
2536af4da5dSStephan Aßmus // #pragma mark -
2546af4da5dSStephan Aßmus 
2556af4da5dSStephan Aßmus 
2566af4da5dSStephan Aßmus void
2576af4da5dSStephan Aßmus MediaConverterWindow::MessageReceived(BMessage* msg)
2586af4da5dSStephan Aßmus {
2596af4da5dSStephan Aßmus 	entry_ref inRef;
2606af4da5dSStephan Aßmus 
2616af4da5dSStephan Aßmus 	char buffer[40];
262f086ada7SStephan Aßmus 	BEntry inEntry;
2636af4da5dSStephan Aßmus 
2646af4da5dSStephan Aßmus 	switch (msg->what) {
2656af4da5dSStephan Aßmus 		#if B_BEOS_VERSION <= B_BEOS_VERSION_6
2666af4da5dSStephan Aßmus 		case B_LANGUAGE_CHANGED:
2676af4da5dSStephan Aßmus 			LanguageChanged();
2686af4da5dSStephan Aßmus 			break;
2696af4da5dSStephan Aßmus 		#endif
2706af4da5dSStephan Aßmus 
2716af4da5dSStephan Aßmus 		case INIT_FORMAT_MENUS:
2726af4da5dSStephan Aßmus 			BuildFormatMenu();
2736af4da5dSStephan Aßmus 			if (CountSourceFiles() == 0)
2746af4da5dSStephan Aßmus 				SetEnabled(false, false);
2756af4da5dSStephan Aßmus 			break;
2766af4da5dSStephan Aßmus 
2776af4da5dSStephan Aßmus 		case B_SIMPLE_DATA:
278f086ada7SStephan Aßmus 			if (msg->WasDropped()) {
2796af4da5dSStephan Aßmus 				DetachCurrentMessage();
2806af4da5dSStephan Aßmus 				msg->what = B_REFS_RECEIVED;
2816af4da5dSStephan Aßmus 				BMessenger(be_app).SendMessage(msg);
2826af4da5dSStephan Aßmus 				delete msg;
2836af4da5dSStephan Aßmus 			}
2846af4da5dSStephan Aßmus 			break;
2856af4da5dSStephan Aßmus 
2866af4da5dSStephan Aßmus 		case FORMAT_SELECT_MESSAGE:
2876af4da5dSStephan Aßmus 			BuildAudioVideoMenus();
2886af4da5dSStephan Aßmus 			break;
2896af4da5dSStephan Aßmus 		case AUDIO_CODEC_SELECT_MESSAGE:
2906af4da5dSStephan Aßmus 			break;
2916af4da5dSStephan Aßmus 		case VIDEO_CODEC_SELECT_MESSAGE:
2926af4da5dSStephan Aßmus 			break;
2936af4da5dSStephan Aßmus 
2946af4da5dSStephan Aßmus 		case CONVERT_BUTTON_MESSAGE:
2956af4da5dSStephan Aßmus 			if (!fConverting) {
296ae0f70fcSAdrien Destugues 				fConvertButton->SetLabel(B_TRANSLATE("Cancel"));
2976af4da5dSStephan Aßmus 				fConverting = true;
298ae0f70fcSAdrien Destugues 				SetStatusMessage(B_TRANSLATE("Convert"));
2996af4da5dSStephan Aßmus 				SetEnabled(false, true);
3006af4da5dSStephan Aßmus 				BMessenger(be_app).SendMessage(START_CONVERSION_MESSAGE);
3016af4da5dSStephan Aßmus 			} else if (!fCancelling) {
3026af4da5dSStephan Aßmus 				fCancelling = true;
303ae0f70fcSAdrien Destugues 				SetStatusMessage(B_TRANSLATE("Cancelling" B_UTF8_ELLIPSIS));
3046af4da5dSStephan Aßmus 				BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE);
3056af4da5dSStephan Aßmus 			}
3066af4da5dSStephan Aßmus 			break;
3076af4da5dSStephan Aßmus 
3086af4da5dSStephan Aßmus 		case CONVERSION_DONE_MESSAGE:
309f086ada7SStephan Aßmus 		{
310ae0f70fcSAdrien Destugues 			SetStatusMessage(fCancelling ? B_TRANSLATE("Conversion cancelled")
311ae0f70fcSAdrien Destugues 				: B_TRANSLATE("Conversion completed"));
3126af4da5dSStephan Aßmus 			fConverting = false;
3136af4da5dSStephan Aßmus 			fCancelling = false;
3146af4da5dSStephan Aßmus 			bool enable = CountSourceFiles() > 0;
3156af4da5dSStephan Aßmus 			SetEnabled(enable, enable);
316ae0f70fcSAdrien Destugues 			fConvertButton->SetLabel(B_TRANSLATE("Convert"));
3176af4da5dSStephan Aßmus 			break;
318f086ada7SStephan Aßmus 		}
3196af4da5dSStephan Aßmus 
3206af4da5dSStephan Aßmus 		case OUTPUT_FOLDER_MESSAGE:
3216af4da5dSStephan Aßmus 			// Execute Save Panel
322f086ada7SStephan Aßmus 			if (fSaveFilePanel == NULL) {
323f086ada7SStephan Aßmus 				BButton* selectThisDir;
3246af4da5dSStephan Aßmus 
3253c0f9a7cSKarsten Heimrich 				BMessage message(FOLDER_SELECT_MESSAGE);
3263c0f9a7cSKarsten Heimrich 				fSaveFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL,
3273c0f9a7cSKarsten Heimrich 					B_DIRECTORY_NODE, true, &message, NULL, false, true);
328ae0f70fcSAdrien Destugues 				fSaveFilePanel->SetButtonLabel(B_DEFAULT_BUTTON,
329ae0f70fcSAdrien Destugues 					B_TRANSLATE("Select"));
3306af4da5dSStephan Aßmus 				fSaveFilePanel->SetTarget(this);
3316af4da5dSStephan Aßmus 
3326af4da5dSStephan Aßmus 				fSaveFilePanel->Window()->Lock();
333ae0f70fcSAdrien Destugues 				fSaveFilePanel->Window()->SetTitle(
334ae0f70fcSAdrien Destugues 					B_TRANSLATE("MediaConverter+:SaveDirectory"));
335f086ada7SStephan Aßmus 				BRect buttonRect
336f086ada7SStephan Aßmus 					= fSaveFilePanel->Window()->ChildAt(0)->FindView(
337f086ada7SStephan Aßmus 						"cancel button")->Frame();
338f086ada7SStephan Aßmus 				buttonRect.right  = buttonRect.left - 20;
339f086ada7SStephan Aßmus 				buttonRect.left = buttonRect.right - 130;
340ae0f70fcSAdrien Destugues 				selectThisDir = new BButton(buttonRect, NULL,
341ae0f70fcSAdrien Destugues 					B_TRANSLATE("Select this folder"),
342f086ada7SStephan Aßmus 					new BMessage(SELECT_THIS_DIR_MESSAGE),
343f086ada7SStephan Aßmus 					B_FOLLOW_BOTTOM | B_FOLLOW_RIGHT);
344f086ada7SStephan Aßmus 				selectThisDir->SetTarget(this);
345f086ada7SStephan Aßmus 				fSaveFilePanel->Window()->ChildAt(0)->AddChild(selectThisDir);
3466af4da5dSStephan Aßmus 				fSaveFilePanel->Window()->Unlock();
3476af4da5dSStephan Aßmus 
348f086ada7SStephan Aßmus 				fSaveFilePanel->SetRefFilter(new DirectoryFilter);
3496af4da5dSStephan Aßmus 			}
3506af4da5dSStephan Aßmus 			fSaveFilePanel->Show();
3516af4da5dSStephan Aßmus 			break;
3526af4da5dSStephan Aßmus 
3536af4da5dSStephan Aßmus 		case FOLDER_SELECT_MESSAGE:
3546af4da5dSStephan Aßmus 			// "SELECT" Button at Save Panel Pushed
3556af4da5dSStephan Aßmus 			fSaveFilePanel->GetNextSelectedRef(&inRef);
356f086ada7SStephan Aßmus 			inEntry.SetTo(&inRef, true);
357f086ada7SStephan Aßmus 			_SetOutputFolder(inEntry);
3586af4da5dSStephan Aßmus 			fOutputDirSpecified = true;
3596af4da5dSStephan Aßmus 			break;
3606af4da5dSStephan Aßmus 
3616af4da5dSStephan Aßmus 		case SELECT_THIS_DIR_MESSAGE:
3626af4da5dSStephan Aßmus 			// "THIS DIR" Button at Save Panel Pushed
3636af4da5dSStephan Aßmus 			fSaveFilePanel->GetPanelDirectory(&inRef);
3646af4da5dSStephan Aßmus 			fSaveFilePanel->Hide();
365f086ada7SStephan Aßmus 			inEntry.SetTo(&inRef, true);
366f086ada7SStephan Aßmus 			_SetOutputFolder(inEntry);
3676af4da5dSStephan Aßmus 			fOutputDirSpecified = true;
3686af4da5dSStephan Aßmus 			break;
3696af4da5dSStephan Aßmus 
3706af4da5dSStephan Aßmus 		case OPEN_FILE_MESSAGE:
3716af4da5dSStephan Aßmus 			// Execute Open Panel
3726af4da5dSStephan Aßmus 			if (!fOpenFilePanel) {
3733c0f9a7cSKarsten Heimrich 				fOpenFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL,
3743c0f9a7cSKarsten Heimrich 					B_FILE_NODE, true, NULL, NULL, false, true);
3756af4da5dSStephan Aßmus 				fOpenFilePanel->SetTarget(this);
3766af4da5dSStephan Aßmus 			}
3776af4da5dSStephan Aßmus 			fOpenFilePanel->Show();
3786af4da5dSStephan Aßmus 			break;
3796af4da5dSStephan Aßmus 
3806af4da5dSStephan Aßmus 		case B_REFS_RECEIVED:
3816af4da5dSStephan Aßmus 			// Media Files Seleced by Open Panel
3826af4da5dSStephan Aßmus 			DetachCurrentMessage();
3836af4da5dSStephan Aßmus 			msg->what = B_REFS_RECEIVED;
3846af4da5dSStephan Aßmus 			BMessenger(be_app).SendMessage(msg);
3856af4da5dSStephan Aßmus 			// fall through
3866af4da5dSStephan Aßmus 
3876af4da5dSStephan Aßmus 		case B_CANCEL:
3886af4da5dSStephan Aßmus 			break;
3896af4da5dSStephan Aßmus 
3906af4da5dSStephan Aßmus 		case QUIT_MESSAGE:
3916af4da5dSStephan Aßmus 			MediaConverterWindow::QuitRequested();
3926af4da5dSStephan Aßmus 			break;
3936af4da5dSStephan Aßmus 
3946af4da5dSStephan Aßmus 		case PREVIEW_MESSAGE:
395f086ada7SStephan Aßmus 		{
396f086ada7SStephan Aßmus 			// Build the command line to launch the preview application.
397f086ada7SStephan Aßmus 			// TODO: Launch the default app instead of hardcoded MediaPlayer!
398f086ada7SStephan Aßmus 			int32 srcIndex = fListView->CurrentSelection();
399f086ada7SStephan Aßmus 			BMediaFile* inFile = NULL;
400f086ada7SStephan Aßmus 			status_t status = GetSourceFileAt(srcIndex, &inFile, &inRef);
4016af4da5dSStephan Aßmus 
402f086ada7SStephan Aßmus 			const char* argv[3];
403f086ada7SStephan Aßmus 			BString startPosString;
404f086ada7SStephan Aßmus 			BPath path;
405f086ada7SStephan Aßmus 
4066af4da5dSStephan Aßmus 			if (status == B_OK) {
407f086ada7SStephan Aßmus 				argv[0] = "-pos";
408f086ada7SStephan Aßmus 					// NOTE: -pos argument is currently not supported by Haiku
409f086ada7SStephan Aßmus 					// MediaPlayer.
410f086ada7SStephan Aßmus 				startPosString << fStartDurationTC->Text();
411f086ada7SStephan Aßmus 				startPosString << "000";
412f086ada7SStephan Aßmus 				argv[1] = startPosString.String();
4136af4da5dSStephan Aßmus 
414f086ada7SStephan Aßmus 				status = inEntry.SetTo(&inRef);
4156af4da5dSStephan Aßmus 			}
4166af4da5dSStephan Aßmus 
417f086ada7SStephan Aßmus 			if (status == B_OK) {
418f086ada7SStephan Aßmus 				status = inEntry.GetPath(&path);
419f086ada7SStephan Aßmus 				if (status == B_OK)
420f086ada7SStephan Aßmus 					argv[2] = path.Path();
421f086ada7SStephan Aßmus 			}
4226af4da5dSStephan Aßmus 
423f086ada7SStephan Aßmus 			if (status == B_OK) {
424f086ada7SStephan Aßmus 				status = be_roster->Launch(
425f086ada7SStephan Aßmus 					"application/x-vnd.Haiku-MediaPlayer",
426f086ada7SStephan Aßmus 					3, (char**)argv, NULL);
427f086ada7SStephan Aßmus 			}
428f086ada7SStephan Aßmus 
429f086ada7SStephan Aßmus 			if (status != B_OK && status != B_ALREADY_RUNNING) {
430007d8a0cSSiarzhuk Zharski 				BString errorString(B_TRANSLATE("Error launching: %strError%"));
431007d8a0cSSiarzhuk Zharski 				errorString.ReplaceFirst("%strError%", strerror(status));
432007d8a0cSSiarzhuk Zharski 				(new BAlert(B_TRANSLATE("Error"), errorString.String(),
433ae0f70fcSAdrien Destugues 					B_TRANSLATE("OK")))->Go();
4346af4da5dSStephan Aßmus 			}
4356af4da5dSStephan Aßmus 			break;
436f086ada7SStephan Aßmus 		}
4376af4da5dSStephan Aßmus 
4386af4da5dSStephan Aßmus 		case VIDEO_QUALITY_CHANGED_MESSAGE:
439f086ada7SStephan Aßmus 		{
440f086ada7SStephan Aßmus 			int32 value;
4416af4da5dSStephan Aßmus 			msg->FindInt32("be:value", &value);
442ae0f70fcSAdrien Destugues 			snprintf(buffer, sizeof(buffer),
443ae0f70fcSAdrien Destugues 				B_TRANSLATE("Video quality: %3d%%"), (int8)value);
4446af4da5dSStephan Aßmus 			fVideoQualitySlider->SetLabel(buffer);
4456af4da5dSStephan Aßmus 			fVideoQuality = value;
4466af4da5dSStephan Aßmus 			break;
447f086ada7SStephan Aßmus 		}
4486af4da5dSStephan Aßmus 
4496af4da5dSStephan Aßmus 		case AUDIO_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("Audio quality: %3d%%"), (int8)value);
4556af4da5dSStephan Aßmus 			fAudioQualitySlider->SetLabel(buffer);
4566af4da5dSStephan Aßmus 			fAudioQuality = value;
4576af4da5dSStephan Aßmus 			break;
458f086ada7SStephan Aßmus 		}
4596af4da5dSStephan Aßmus 
4606af4da5dSStephan Aßmus 		default:
4616af4da5dSStephan Aßmus 			BWindow::MessageReceived(msg);
4626af4da5dSStephan Aßmus 	}
4636af4da5dSStephan Aßmus }
4646af4da5dSStephan Aßmus 
4656af4da5dSStephan Aßmus 
4666af4da5dSStephan Aßmus bool
4676af4da5dSStephan Aßmus MediaConverterWindow::QuitRequested()
4686af4da5dSStephan Aßmus {
4696af4da5dSStephan Aßmus 	if (!fConverting) {
4706af4da5dSStephan Aßmus 		BMessenger(be_app).SendMessage(B_QUIT_REQUESTED);
4716af4da5dSStephan Aßmus 		return true;
4726af4da5dSStephan Aßmus 	} else if (!fCancelling) {
4736af4da5dSStephan Aßmus 		fCancelling = true;
474ae0f70fcSAdrien Destugues 		SetStatusMessage(B_TRANSLATE("Cancelling"));
4756af4da5dSStephan Aßmus 		BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE);
4766af4da5dSStephan Aßmus 	}
4776af4da5dSStephan Aßmus 	return false;
4786af4da5dSStephan Aßmus }
4796af4da5dSStephan Aßmus 
4806af4da5dSStephan Aßmus 
4816af4da5dSStephan Aßmus // #pragma mark -
4826af4da5dSStephan Aßmus 
4836af4da5dSStephan Aßmus 
4846af4da5dSStephan Aßmus void
4856af4da5dSStephan Aßmus MediaConverterWindow::LanguageChanged()
4866af4da5dSStephan Aßmus {
4876af4da5dSStephan Aßmus 	_DestroyMenu();
4886af4da5dSStephan Aßmus 	_CreateMenu();
4896af4da5dSStephan Aßmus 	_UpdateLabels();
4906af4da5dSStephan Aßmus 	BuildAudioVideoMenus();
4916af4da5dSStephan Aßmus 	Lock();
4926af4da5dSStephan Aßmus 	fInfoView->Invalidate();
4936af4da5dSStephan Aßmus 	Unlock();
4946af4da5dSStephan Aßmus }
4956af4da5dSStephan Aßmus 
4966af4da5dSStephan Aßmus 
4976af4da5dSStephan Aßmus void
4986af4da5dSStephan Aßmus MediaConverterWindow::BuildAudioVideoMenus()
4996af4da5dSStephan Aßmus {
5006af4da5dSStephan Aßmus 	BMenu* menu = fAudioMenu->Menu();
5016af4da5dSStephan Aßmus 	BMenuItem* item;
5026af4da5dSStephan Aßmus 	// clear out old audio codec menu items
5037730c846SStephan Aßmus 	while ((item = menu->RemoveItem(0L)) != NULL)
5046af4da5dSStephan Aßmus 		delete item;
5056af4da5dSStephan Aßmus 
5066af4da5dSStephan Aßmus 	bool separator = true;
5076af4da5dSStephan Aßmus 
5086af4da5dSStephan Aßmus 	// get selected file format
5097730c846SStephan Aßmus 	FileFormatMenuItem* ffmi
5107730c846SStephan Aßmus 		= (FileFormatMenuItem*)fFormatMenu->Menu()->FindMarked();
5116af4da5dSStephan Aßmus 	media_file_format* mf_format = &(ffmi->fFileFormat);
5126af4da5dSStephan Aßmus 
5136af4da5dSStephan Aßmus 	media_format format, outfmt;
5146af4da5dSStephan Aßmus 	memset(&format, 0, sizeof(format));
5156af4da5dSStephan Aßmus 	media_codec_info codec_info;
5166af4da5dSStephan Aßmus 	int32 cookie = 0;
5176af4da5dSStephan Aßmus 	CodecMenuItem* cmi;
5186af4da5dSStephan Aßmus 
5196af4da5dSStephan Aßmus 	// add available audio encoders to menu
5206af4da5dSStephan Aßmus 	format.type = B_MEDIA_RAW_AUDIO;
5216af4da5dSStephan Aßmus 	format.u.raw_audio = media_raw_audio_format::wildcard;
5227730c846SStephan Aßmus 	while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info)
5237730c846SStephan Aßmus 		== B_OK) {
5246af4da5dSStephan Aßmus 		if (separator) {
525ae0f70fcSAdrien Destugues 			menu->AddItem(new BMenuItem(
526546208a5SOliver Tappe 				B_TRANSLATE_CONTEXT("No audio", "Audio codecs list"),
5276af4da5dSStephan Aßmus 				new BMessage(AUDIO_CODEC_SELECT_MESSAGE)));
5286af4da5dSStephan Aßmus 			menu->AddSeparatorItem();
5296af4da5dSStephan Aßmus 			separator = false;
5306af4da5dSStephan Aßmus 		}
5316af4da5dSStephan Aßmus 
5326af4da5dSStephan Aßmus 		cmi = new CodecMenuItem(&codec_info, AUDIO_CODEC_SELECT_MESSAGE);
5336af4da5dSStephan Aßmus 		menu->AddItem(cmi);
5346af4da5dSStephan Aßmus 		// reset media format struct
5356af4da5dSStephan Aßmus /*
5366af4da5dSStephan Aßmus 		format.type = B_MEDIA_RAW_AUDIO;
5376af4da5dSStephan Aßmus 		format.u.raw_audio = media_raw_audio_format::wildcard;
5386af4da5dSStephan Aßmus */
5396af4da5dSStephan Aßmus 	}
5406af4da5dSStephan Aßmus 
5416af4da5dSStephan Aßmus 	// mark first audio encoder
5426af4da5dSStephan Aßmus 	item = menu->ItemAt(0);
5436af4da5dSStephan Aßmus 	if (item != NULL) {
5446af4da5dSStephan Aßmus 		fAudioMenu->SetEnabled(fEnabled);
5456af4da5dSStephan Aßmus 		fAudioQualitySlider->SetEnabled(fEnabled);
5466af4da5dSStephan Aßmus 		item->SetMarked(true);
5476af4da5dSStephan Aßmus 		((BInvoker *)item)->Invoke();
5486af4da5dSStephan Aßmus 	} else {
549ae0f70fcSAdrien Destugues 		item = new BMenuItem(
550546208a5SOliver Tappe 			B_TRANSLATE_CONTEXT("None available", "Audio codecs"),
551ae0f70fcSAdrien Destugues 			NULL);
5526af4da5dSStephan Aßmus 		menu->AddItem(item);
5536af4da5dSStephan Aßmus 		item->SetMarked(true);
5546af4da5dSStephan Aßmus 		fAudioMenu->SetEnabled(false);
5556af4da5dSStephan Aßmus 		fAudioQualitySlider->SetEnabled(false);
5566af4da5dSStephan Aßmus 	}
5576af4da5dSStephan Aßmus 
5586af4da5dSStephan Aßmus 	// clear out old video codec menu items
5596af4da5dSStephan Aßmus 	menu = fVideoMenu->Menu();
5607730c846SStephan Aßmus 	while ((item = menu->RemoveItem(0L)) != NULL)
5616af4da5dSStephan Aßmus 		delete item;
5626af4da5dSStephan Aßmus 
5636af4da5dSStephan Aßmus 	separator = true;
5646af4da5dSStephan Aßmus 
5656af4da5dSStephan Aßmus 	// construct a generic video format.  Some of these parameters
5666af4da5dSStephan Aßmus 	// seem silly, but are needed for R4.5.x, which is more picky
5676af4da5dSStephan Aßmus 	// than subsequent BeOS releases will be.
5686af4da5dSStephan Aßmus 	memset(&format, 0, sizeof(format));
5696af4da5dSStephan Aßmus 	format.type = B_MEDIA_RAW_VIDEO;
5706af4da5dSStephan Aßmus 	format.u.raw_video.last_active = (uint32)(240 - 1);
5716af4da5dSStephan Aßmus 	format.u.raw_video.orientation = B_VIDEO_TOP_LEFT_RIGHT;
5726af4da5dSStephan Aßmus 	format.u.raw_video.display.format = B_RGB32;
5736af4da5dSStephan Aßmus 	format.u.raw_video.display.line_width = (int32)320;
5746af4da5dSStephan Aßmus 	format.u.raw_video.display.line_count = (int32)240;
5756af4da5dSStephan Aßmus 	format.u.raw_video.display.bytes_per_row = 4 * 320;
5766af4da5dSStephan Aßmus 
5776af4da5dSStephan Aßmus 	// add available video encoders to menu
5786af4da5dSStephan Aßmus 	cookie = 0;
5796af4da5dSStephan Aßmus 	while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info) == B_OK) {
5806af4da5dSStephan Aßmus 		if (separator) {
581ae0f70fcSAdrien Destugues 			menu->AddItem(new BMenuItem(
582546208a5SOliver Tappe 				B_TRANSLATE_CONTEXT("No video", "Video codecs list"),
5836af4da5dSStephan Aßmus 				new BMessage(VIDEO_CODEC_SELECT_MESSAGE)));
5846af4da5dSStephan Aßmus 			menu->AddSeparatorItem();
5856af4da5dSStephan Aßmus 			separator = false;
5866af4da5dSStephan Aßmus 		}
5876af4da5dSStephan Aßmus 
5886af4da5dSStephan Aßmus 		cmi = new CodecMenuItem(&codec_info, VIDEO_CODEC_SELECT_MESSAGE);
5896af4da5dSStephan Aßmus 		menu->AddItem(cmi);
5906af4da5dSStephan Aßmus 	}
5916af4da5dSStephan Aßmus 
5926af4da5dSStephan Aßmus 	// mark first video encoder
5936af4da5dSStephan Aßmus 	item = menu->ItemAt(0);
5946af4da5dSStephan Aßmus 	if (item != NULL) {
5956af4da5dSStephan Aßmus 		fVideoMenu->SetEnabled(fEnabled);
5966af4da5dSStephan Aßmus 		fVideoQualitySlider->SetEnabled(fEnabled);
5976af4da5dSStephan Aßmus 		item->SetMarked(true);
5986af4da5dSStephan Aßmus 		((BInvoker *)item)->Invoke();
5996af4da5dSStephan Aßmus 	} else {
600ae0f70fcSAdrien Destugues 		item = new BMenuItem(
601546208a5SOliver Tappe 			B_TRANSLATE_CONTEXT("None available", "Video codecs"),
602ae0f70fcSAdrien Destugues 			NULL);
6036af4da5dSStephan Aßmus 		menu->AddItem(item);
6046af4da5dSStephan Aßmus 		item->SetMarked(true);
6056af4da5dSStephan Aßmus 		fVideoMenu->SetEnabled(false);
6066af4da5dSStephan Aßmus 		fVideoQualitySlider->SetEnabled(false);
6076af4da5dSStephan Aßmus 	}
6086af4da5dSStephan Aßmus }
6096af4da5dSStephan Aßmus 
6106af4da5dSStephan Aßmus void
6116af4da5dSStephan Aßmus MediaConverterWindow::GetSelectedFormatInfo(media_file_format** format,
6126af4da5dSStephan Aßmus 	media_codec_info** audio, media_codec_info** video)
6136af4da5dSStephan Aßmus {
6146af4da5dSStephan Aßmus 	*audio = NULL;
6156af4da5dSStephan Aßmus 	*video = NULL;
6166af4da5dSStephan Aßmus 	*format = NULL;
6176af4da5dSStephan Aßmus 
6186af4da5dSStephan Aßmus 	FileFormatMenuItem *formatItem =
6196af4da5dSStephan Aßmus 		dynamic_cast<FileFormatMenuItem *>(fFormatMenu->Menu()->FindMarked());
6206af4da5dSStephan Aßmus 	if (formatItem != NULL) {
6216af4da5dSStephan Aßmus 		*format = &(formatItem->fFileFormat);
6226af4da5dSStephan Aßmus 	}
6236af4da5dSStephan Aßmus 
6246af4da5dSStephan Aßmus 	*audio = *video = NULL;
6256af4da5dSStephan Aßmus 	CodecMenuItem *codecItem =
6266af4da5dSStephan Aßmus 		dynamic_cast<CodecMenuItem *>(fAudioMenu->Menu()->FindMarked());
6276af4da5dSStephan Aßmus 	if (codecItem != NULL) {
6286af4da5dSStephan Aßmus 		*audio =  &(codecItem->fCodecInfo);
6296af4da5dSStephan Aßmus 	}
6306af4da5dSStephan Aßmus 
6316af4da5dSStephan Aßmus 	codecItem = dynamic_cast<CodecMenuItem *>(fVideoMenu->Menu()->FindMarked());
6326af4da5dSStephan Aßmus 	if (codecItem != NULL) {
6336af4da5dSStephan Aßmus 		*video =  &(codecItem->fCodecInfo);
6346af4da5dSStephan Aßmus 	}
6356af4da5dSStephan Aßmus }
6366af4da5dSStephan Aßmus 
6376af4da5dSStephan Aßmus 
6386af4da5dSStephan Aßmus void
6396af4da5dSStephan Aßmus MediaConverterWindow::BuildFormatMenu()
6406af4da5dSStephan Aßmus {
6416af4da5dSStephan Aßmus 	BMenu *menu = fFormatMenu->Menu();
6426af4da5dSStephan Aßmus 	BMenuItem *item;
6436af4da5dSStephan Aßmus 	// clear out old format menu items
6446af4da5dSStephan Aßmus 	while ((item = menu->RemoveItem((int32)0)) != NULL) {
6456af4da5dSStephan Aßmus 		delete item;
6466af4da5dSStephan Aßmus 	}
6476af4da5dSStephan Aßmus 
6486af4da5dSStephan Aßmus 	// add menu items for each file format
6496af4da5dSStephan Aßmus 	media_file_format mfi;
6506af4da5dSStephan Aßmus 	int32 cookie = 0;
6516af4da5dSStephan Aßmus 	FileFormatMenuItem *ff_item;
6526af4da5dSStephan Aßmus 	while (get_next_file_format(&cookie, &mfi) == B_OK) {
6536af4da5dSStephan Aßmus 		ff_item = new FileFormatMenuItem(&mfi);
6546af4da5dSStephan Aßmus 		menu->AddItem(ff_item);
6556af4da5dSStephan Aßmus 	}
6566af4da5dSStephan Aßmus 
6576af4da5dSStephan Aßmus 	// mark first item
6586af4da5dSStephan Aßmus 	item = menu->ItemAt(0);
6596af4da5dSStephan Aßmus 	if (item != NULL) {
6606af4da5dSStephan Aßmus 		item->SetMarked(true);
6616af4da5dSStephan Aßmus 		((BInvoker *)item)->Invoke();
6626af4da5dSStephan Aßmus 	}
6636af4da5dSStephan Aßmus }
6646af4da5dSStephan Aßmus 
665dd55ed1aSAlex Wilson 
6666af4da5dSStephan Aßmus void
6676af4da5dSStephan Aßmus MediaConverterWindow::SetFileMessage(const char *message)
6686af4da5dSStephan Aßmus {
669dd55ed1aSAlex Wilson 	fFileStatus->SetText(message);
6706af4da5dSStephan Aßmus }
6716af4da5dSStephan Aßmus 
672dd55ed1aSAlex Wilson 
6736af4da5dSStephan Aßmus void
6746af4da5dSStephan Aßmus MediaConverterWindow::SetStatusMessage(const char *message)
6756af4da5dSStephan Aßmus {
676dd55ed1aSAlex Wilson 	fStatus->SetText(message);
6776af4da5dSStephan Aßmus }
6786af4da5dSStephan Aßmus 
6796af4da5dSStephan Aßmus 
6806af4da5dSStephan Aßmus // #pragma mark -
6816af4da5dSStephan Aßmus 
6826af4da5dSStephan Aßmus 
6831c992a52SStephan Aßmus bool
6846af4da5dSStephan Aßmus MediaConverterWindow::AddSourceFile(BMediaFile* file, const entry_ref& ref)
6856af4da5dSStephan Aßmus {
6861c992a52SStephan Aßmus 	if (!fListView->AddMediaItem(file, ref))
6871c992a52SStephan Aßmus 		return false;
6886af4da5dSStephan Aßmus 
6896af4da5dSStephan Aßmus 	if (!fOutputDirSpecified) {
6906af4da5dSStephan Aßmus 		BEntry entry(&ref);
6916af4da5dSStephan Aßmus 		entry.GetParent(&entry);
6926af4da5dSStephan Aßmus 		_SetOutputFolder(entry);
6936af4da5dSStephan Aßmus 	}
6941c992a52SStephan Aßmus 
6951c992a52SStephan Aßmus 	return true;
6966af4da5dSStephan Aßmus }
6976af4da5dSStephan Aßmus 
6986af4da5dSStephan Aßmus 
6996af4da5dSStephan Aßmus void
7006af4da5dSStephan Aßmus MediaConverterWindow::RemoveSourceFile(int32 index)
7016af4da5dSStephan Aßmus {
7026af4da5dSStephan Aßmus 	delete fListView->RemoveItem(index);
7036af4da5dSStephan Aßmus 	fStartDurationTC->SetText("0");
7046af4da5dSStephan Aßmus 	fEndDurationTC->SetText("0");
7056af4da5dSStephan Aßmus }
7066af4da5dSStephan Aßmus 
7076af4da5dSStephan Aßmus 
7086af4da5dSStephan Aßmus int32
7096af4da5dSStephan Aßmus MediaConverterWindow::CountSourceFiles()
7106af4da5dSStephan Aßmus {
7116af4da5dSStephan Aßmus 	return fListView->CountItems();
7126af4da5dSStephan Aßmus }
7136af4da5dSStephan Aßmus 
7146af4da5dSStephan Aßmus 
7156af4da5dSStephan Aßmus status_t
7166af4da5dSStephan Aßmus MediaConverterWindow::GetSourceFileAt(int32 index, BMediaFile** _file,
7176af4da5dSStephan Aßmus 	entry_ref* ref)
7186af4da5dSStephan Aßmus {
7196af4da5dSStephan Aßmus 	MediaFileListItem* item = dynamic_cast<MediaFileListItem*>(
7206af4da5dSStephan Aßmus 		fListView->ItemAt(index));
7216af4da5dSStephan Aßmus 	if (item != NULL) {
7226af4da5dSStephan Aßmus 		*_file = item->fMediaFile;
7236af4da5dSStephan Aßmus 		*ref = item->fRef;
7246af4da5dSStephan Aßmus 		return B_OK;
7256af4da5dSStephan Aßmus 	} else {
7266af4da5dSStephan Aßmus 		return B_ERROR;
7276af4da5dSStephan Aßmus 	}
7286af4da5dSStephan Aßmus }
7296af4da5dSStephan Aßmus 
7306af4da5dSStephan Aßmus 
7316af4da5dSStephan Aßmus void
7326af4da5dSStephan Aßmus MediaConverterWindow::SourceFileSelectionChanged()
7336af4da5dSStephan Aßmus {
7346af4da5dSStephan Aßmus 	int32 selected = fListView->CurrentSelection();
7356af4da5dSStephan Aßmus 	BMediaFile* file = NULL;
7366af4da5dSStephan Aßmus 	entry_ref ref;
7377730c846SStephan Aßmus 	bool enabled = GetSourceFileAt(selected, &file, &ref) == B_OK;
7386af4da5dSStephan Aßmus 
7396af4da5dSStephan Aßmus 	fPreviewButton->SetEnabled(enabled);
7406af4da5dSStephan Aßmus 	fVideoQualitySlider->SetEnabled(enabled);
7416af4da5dSStephan Aßmus 	fAudioQualitySlider->SetEnabled(enabled);
7426af4da5dSStephan Aßmus 	fStartDurationTC->SetEnabled(enabled);
7436af4da5dSStephan Aßmus 	fEndDurationTC->SetEnabled(enabled);
7446af4da5dSStephan Aßmus 
7457730c846SStephan Aßmus 	BString duration;
7467730c846SStephan Aßmus 	if (enabled) {
7477730c846SStephan Aßmus 		fInfoView->Update(file, &ref);
7486af4da5dSStephan Aßmus 		// HACK: get the fInfoView to update the duration "synchronously"
7496af4da5dSStephan Aßmus 		UpdateIfNeeded();
7507730c846SStephan Aßmus 		duration << fInfoView->Duration() / 1000;
7517730c846SStephan Aßmus 	} else
7527730c846SStephan Aßmus 		duration = "0";
7536af4da5dSStephan Aßmus 
7546af4da5dSStephan Aßmus 	// update duration text controls
7556af4da5dSStephan Aßmus 	fStartDurationTC->SetText("0");
7566af4da5dSStephan Aßmus 	fEndDurationTC->SetText(duration.String());
7576af4da5dSStephan Aßmus }
7586af4da5dSStephan Aßmus 
7596af4da5dSStephan Aßmus 
7606af4da5dSStephan Aßmus // #pragma mark -
7616af4da5dSStephan Aßmus 
7626af4da5dSStephan Aßmus 
7636af4da5dSStephan Aßmus void
7646af4da5dSStephan Aßmus MediaConverterWindow::SetEnabled(bool enabled, bool convertEnabled)
7656af4da5dSStephan Aßmus {
7666af4da5dSStephan Aßmus 	fConvertButton->SetEnabled(convertEnabled);
7676af4da5dSStephan Aßmus 	if (enabled == fEnabled)
7686af4da5dSStephan Aßmus 			return;
7696af4da5dSStephan Aßmus 
7706af4da5dSStephan Aßmus 	fFormatMenu->SetEnabled(enabled);
7716af4da5dSStephan Aßmus 	fAudioMenu->SetEnabled(enabled);
7726af4da5dSStephan Aßmus 	fVideoMenu->SetEnabled(enabled);
7736af4da5dSStephan Aßmus 	fListView->SetEnabled(enabled);
7746af4da5dSStephan Aßmus 	fStartDurationTC->SetEnabled(enabled);
7756af4da5dSStephan Aßmus 	fEndDurationTC->SetEnabled(enabled);
7766af4da5dSStephan Aßmus 
7776af4da5dSStephan Aßmus 	fEnabled = enabled;
7786af4da5dSStephan Aßmus }
7796af4da5dSStephan Aßmus 
7806af4da5dSStephan Aßmus 
7816af4da5dSStephan Aßmus bool
7826af4da5dSStephan Aßmus MediaConverterWindow::IsEnabled()
7836af4da5dSStephan Aßmus {
7846af4da5dSStephan Aßmus 	return fEnabled;
7856af4da5dSStephan Aßmus }
7866af4da5dSStephan Aßmus 
7876af4da5dSStephan Aßmus 
7886af4da5dSStephan Aßmus const char*
7896af4da5dSStephan Aßmus MediaConverterWindow::StartDuration() const
7906af4da5dSStephan Aßmus {
7916af4da5dSStephan Aßmus 	return fStartDurationTC->Text();
7926af4da5dSStephan Aßmus }
7936af4da5dSStephan Aßmus 
7946af4da5dSStephan Aßmus 
7956af4da5dSStephan Aßmus const char*
7966af4da5dSStephan Aßmus MediaConverterWindow::EndDuration() const
7976af4da5dSStephan Aßmus {
7986af4da5dSStephan Aßmus 	return fEndDurationTC->Text();
7996af4da5dSStephan Aßmus }
8006af4da5dSStephan Aßmus 
8016af4da5dSStephan Aßmus 
8026af4da5dSStephan Aßmus BDirectory
8036af4da5dSStephan Aßmus MediaConverterWindow::OutputDirectory() const
8046af4da5dSStephan Aßmus {
8056af4da5dSStephan Aßmus 	return fOutputDir;
8066af4da5dSStephan Aßmus }
8076af4da5dSStephan Aßmus 
8086af4da5dSStephan Aßmus 
8096af4da5dSStephan Aßmus void
8106af4da5dSStephan Aßmus MediaConverterWindow::SetAudioQualityLabel(const char* label)
8116af4da5dSStephan Aßmus {
8126af4da5dSStephan Aßmus 	fAudioQualitySlider->SetLabel(label);
8136af4da5dSStephan Aßmus }
8146af4da5dSStephan Aßmus 
8156af4da5dSStephan Aßmus 
8166af4da5dSStephan Aßmus void
8176af4da5dSStephan Aßmus MediaConverterWindow::SetVideoQualityLabel(const char* label)
8186af4da5dSStephan Aßmus {
8196af4da5dSStephan Aßmus 	fVideoQualitySlider->SetLabel(label);
8206af4da5dSStephan Aßmus }
8216af4da5dSStephan Aßmus 
8226af4da5dSStephan Aßmus 
8236af4da5dSStephan Aßmus // #pragma mark -
8246af4da5dSStephan Aßmus 
8256af4da5dSStephan Aßmus 
8266af4da5dSStephan Aßmus void
8276af4da5dSStephan Aßmus MediaConverterWindow::_UpdateLabels()
8286af4da5dSStephan Aßmus {
829dd55ed1aSAlex Wilson 	if (fSourcesBox != NULL) {
830ae0f70fcSAdrien Destugues 		fSourcesBox->SetLabel(B_TRANSLATE("Source files"));
831dd55ed1aSAlex Wilson 		_UpdateBBoxLayoutInsets(fSourcesBox);
832dd55ed1aSAlex Wilson 	}
8336af4da5dSStephan Aßmus 
834dd55ed1aSAlex Wilson 	if (fInfoBox != NULL)
835ae0f70fcSAdrien Destugues 		fInfoBox->SetLabel(B_TRANSLATE("File details"));
8366af4da5dSStephan Aßmus 
837dd55ed1aSAlex Wilson 	if (fOutputBox != NULL) {
838ae0f70fcSAdrien Destugues 		fOutputBox->SetLabel(B_TRANSLATE("Output format"));
839dd55ed1aSAlex Wilson 		_UpdateBBoxLayoutInsets(fOutputBox);
840dd55ed1aSAlex Wilson 	}
8416af4da5dSStephan Aßmus 
842dd55ed1aSAlex Wilson 	if (fConvertButton != NULL)
843ae0f70fcSAdrien Destugues 		fConvertButton->SetLabel(B_TRANSLATE("Convert"));
8446af4da5dSStephan Aßmus 
845dd55ed1aSAlex Wilson 	if (fPreviewButton != NULL)
846ae0f70fcSAdrien Destugues 		fPreviewButton->SetLabel(B_TRANSLATE("Preview"));
8476af4da5dSStephan Aßmus 
848dd55ed1aSAlex Wilson 	if (fDestButton != NULL)
849ae0f70fcSAdrien Destugues 		fDestButton->SetLabel(B_TRANSLATE("Output folder"));
8506af4da5dSStephan Aßmus 
8516af4da5dSStephan Aßmus 	if (fVideoQualitySlider != NULL) {
852dd55ed1aSAlex Wilson 		char buffer[40];
853ae0f70fcSAdrien Destugues 		snprintf(buffer, sizeof(buffer), B_TRANSLATE("Video quality: %3d%%"),
854f086ada7SStephan Aßmus 			(int8)fVideoQuality);
8556af4da5dSStephan Aßmus 		fVideoQualitySlider->SetLabel(buffer);
856ae0f70fcSAdrien Destugues 		fVideoQualitySlider->SetLimitLabels(B_TRANSLATE("Low"),
857ae0f70fcSAdrien Destugues 			B_TRANSLATE("High"));
8586af4da5dSStephan Aßmus 	}
8596af4da5dSStephan Aßmus 
8606af4da5dSStephan Aßmus 	if (fAudioQualitySlider != NULL) {
861dd55ed1aSAlex Wilson 		char buffer[40];
862ae0f70fcSAdrien Destugues 		snprintf(buffer, sizeof(buffer), B_TRANSLATE("Audio quality: %3d%%"),
863f086ada7SStephan Aßmus 			(int8)fAudioQuality);
8646af4da5dSStephan Aßmus 		fAudioQualitySlider->SetLabel(buffer);
865ae0f70fcSAdrien Destugues 		fAudioQualitySlider->SetLimitLabels(B_TRANSLATE("Low"),
866ae0f70fcSAdrien Destugues 			B_TRANSLATE("High"));
8676af4da5dSStephan Aßmus 	}
8686af4da5dSStephan Aßmus 
869dd55ed1aSAlex Wilson 	if (fStartDurationTC != NULL)
870ae0f70fcSAdrien Destugues 		fStartDurationTC->SetLabel(B_TRANSLATE("Start [ms]: "));
871dd55ed1aSAlex Wilson 
872dd55ed1aSAlex Wilson 	if (fEndDurationTC != NULL)
873ae0f70fcSAdrien Destugues 		fEndDurationTC->SetLabel(B_TRANSLATE("End   [ms]: "));
8746af4da5dSStephan Aßmus 
8756af4da5dSStephan Aßmus 	if (fFormatMenu != NULL)
876ae0f70fcSAdrien Destugues 		fFormatMenu->SetLabel(B_TRANSLATE("File format:"));
877dd55ed1aSAlex Wilson 
8786af4da5dSStephan Aßmus 	if (fAudioMenu != NULL)
879ae0f70fcSAdrien Destugues 		fAudioMenu->SetLabel(B_TRANSLATE("Audio encoding:"));
880dd55ed1aSAlex Wilson 
8816af4da5dSStephan Aßmus 	if (fVideoMenu != NULL)
882ae0f70fcSAdrien Destugues 		fVideoMenu->SetLabel(B_TRANSLATE("Video encoding:"));
8836af4da5dSStephan Aßmus 
884ae0f70fcSAdrien Destugues 	SetFileMessage(B_TRANSLATE("Drop media files onto this window"));
8856af4da5dSStephan Aßmus }
8866af4da5dSStephan Aßmus 
8876af4da5dSStephan Aßmus 
8886af4da5dSStephan Aßmus void
889dd55ed1aSAlex Wilson MediaConverterWindow::_UpdateBBoxLayoutInsets(BBox* box)
890dd55ed1aSAlex Wilson {
891dd55ed1aSAlex Wilson 	BTwoDimensionalLayout* layout
892dd55ed1aSAlex Wilson 		= dynamic_cast<BTwoDimensionalLayout*>(box->GetLayout());
8937730c846SStephan Aßmus 	if (layout != NULL) {
894dd55ed1aSAlex Wilson 		float padding = be_control_look->DefaultItemSpacing();
895dd55ed1aSAlex Wilson 		layout->SetInsets(padding, box->TopBorderOffset() + padding, padding,
896dd55ed1aSAlex Wilson 			padding);
897dd55ed1aSAlex Wilson 	}
898dd55ed1aSAlex Wilson }
899dd55ed1aSAlex Wilson 
900dd55ed1aSAlex Wilson 
901dd55ed1aSAlex Wilson void
9026af4da5dSStephan Aßmus MediaConverterWindow::_DestroyMenu()
9036af4da5dSStephan Aßmus {
9046af4da5dSStephan Aßmus 	BMenu* Menu;
9056af4da5dSStephan Aßmus 
9066af4da5dSStephan Aßmus 	while ((Menu = fMenuBar->SubmenuAt(0)) != NULL) {
9076af4da5dSStephan Aßmus 		fMenuBar->RemoveItem(Menu);
9086af4da5dSStephan Aßmus 		delete Menu;
9096af4da5dSStephan Aßmus 	}
9106af4da5dSStephan Aßmus }
9116af4da5dSStephan Aßmus 
9126af4da5dSStephan Aßmus 
9136af4da5dSStephan Aßmus void
9146af4da5dSStephan Aßmus MediaConverterWindow::_CreateMenu()
9156af4da5dSStephan Aßmus {
9166af4da5dSStephan Aßmus 	BMenuItem* item;
9176af4da5dSStephan Aßmus 	BMenu* menu;
9186af4da5dSStephan Aßmus 
919546208a5SOliver Tappe 	menu = new BMenu(B_TRANSLATE_CONTEXT("File", "Menu"));
920546208a5SOliver Tappe 	item = new BMenuItem(B_TRANSLATE_CONTEXT(
921ae0f70fcSAdrien Destugues 		"Open" B_UTF8_ELLIPSIS, "Menu"),
922dd55ed1aSAlex Wilson 		new BMessage(OPEN_FILE_MESSAGE), 'O');
9236af4da5dSStephan Aßmus 	menu->AddItem(item);
9246af4da5dSStephan Aßmus 	menu->AddSeparatorItem();
925546208a5SOliver Tappe 	item = new BMenuItem(B_TRANSLATE_CONTEXT("Quit", "Menu"),
926ae0f70fcSAdrien Destugues 		new BMessage(QUIT_MESSAGE), 'Q');
9276af4da5dSStephan Aßmus 	menu->AddItem(item);
9286af4da5dSStephan Aßmus 
9296af4da5dSStephan Aßmus 	fMenuBar->AddItem(menu);
9306af4da5dSStephan Aßmus }
9316af4da5dSStephan Aßmus 
9326af4da5dSStephan Aßmus 
9336af4da5dSStephan Aßmus void
9346af4da5dSStephan Aßmus MediaConverterWindow::_SetOutputFolder(BEntry entry)
9356af4da5dSStephan Aßmus {
9366af4da5dSStephan Aßmus 	BPath path;
9376af4da5dSStephan Aßmus 	entry.GetPath(&path);
9386af4da5dSStephan Aßmus 	fOutputFolder->SetText(path.Path());
9396af4da5dSStephan Aßmus 	fOutputFolder->ResizeToPreferred();
9406af4da5dSStephan Aßmus 	fOutputDir.SetTo(path.Path());
9416af4da5dSStephan Aßmus }
9426af4da5dSStephan Aßmus 
9436af4da5dSStephan Aßmus 
944