xref: /haiku/src/apps/mediaconverter/MediaConverterWindow.cpp (revision 37d99b7eaadef6dacbfcde9d9ef84fd9ff7528ba)
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.
4ce74de86SJohn Scipione // Copyright 2010-2013, 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 
7ce74de86SJohn Scipione 
86af4da5dSStephan Aßmus #include "MediaConverterWindow.h"
96af4da5dSStephan Aßmus 
106af4da5dSStephan Aßmus #include <stdio.h>
116af4da5dSStephan Aßmus #include <string.h>
12fdd3fd9eSVivek Roy #include <unistd.h>
136af4da5dSStephan Aßmus 
146af4da5dSStephan Aßmus #include <Alert.h>
156af4da5dSStephan Aßmus #include <Application.h>
166af4da5dSStephan Aßmus #include <Box.h>
176af4da5dSStephan Aßmus #include <Button.h>
18ae0f70fcSAdrien Destugues #include <Catalog.h>
19dd55ed1aSAlex Wilson #include <ControlLook.h>
206af4da5dSStephan Aßmus #include <FilePanel.h>
21fc4d98a2SPhilippe Saint-Pierre #include <FindDirectory.h>
22dd55ed1aSAlex Wilson #include <LayoutBuilder.h>
23ae0f70fcSAdrien Destugues #include <Locale.h>
246af4da5dSStephan Aßmus #include <Menu.h>
256af4da5dSStephan Aßmus #include <MenuBar.h>
266af4da5dSStephan Aßmus #include <MenuField.h>
276af4da5dSStephan Aßmus #include <MenuItem.h>
2830456952SEmir SARI #include <NumberFormat.h>
296af4da5dSStephan Aßmus #include <Path.h>
306af4da5dSStephan Aßmus #include <PopUpMenu.h>
316af4da5dSStephan Aßmus #include <Roster.h>
326af4da5dSStephan Aßmus #include <ScrollBar.h>
336af4da5dSStephan Aßmus #include <ScrollView.h>
346af4da5dSStephan Aßmus #include <Slider.h>
356af4da5dSStephan Aßmus #include <StringView.h>
366af4da5dSStephan Aßmus #include <TextControl.h>
376af4da5dSStephan Aßmus 
386af4da5dSStephan Aßmus #include "MediaFileInfoView.h"
396af4da5dSStephan Aßmus #include "MediaFileListView.h"
406af4da5dSStephan Aßmus #include "MessageConstants.h"
41ae0f70fcSAdrien Destugues 
42ae0f70fcSAdrien Destugues 
43546208a5SOliver Tappe #undef B_TRANSLATION_CONTEXT
44546208a5SOliver Tappe #define B_TRANSLATION_CONTEXT "MediaConverter"
45ae0f70fcSAdrien Destugues #define VERSION "1.3.0"
466af4da5dSStephan Aßmus 
476af4da5dSStephan Aßmus 
48a42b9a43SJohn Scipione static const unsigned int kMinSourceWidth = 12;
49f29499e7SJohn Scipione static const unsigned int kQualitySliderWidth = 28;
50a42b9a43SJohn Scipione static const unsigned int kDurationWidth = 10;
51a42b9a43SJohn Scipione 
52a42b9a43SJohn Scipione 
536af4da5dSStephan Aßmus // #pragma mark - DirectoryFilter
546af4da5dSStephan Aßmus 
556af4da5dSStephan Aßmus 
5660b6f368SStephan Aßmus class DirectoryFilter : public BRefFilter {
576af4da5dSStephan Aßmus public:
DirectoryFilter()586af4da5dSStephan Aßmus 	DirectoryFilter() {};
Filter(const entry_ref * ref,BNode * node,struct stat_beos * st,const char * filetype)596af4da5dSStephan Aßmus 	virtual bool Filter(const entry_ref* ref,
6060b6f368SStephan Aßmus 		BNode* node, struct stat_beos* st, const char* filetype)
616af4da5dSStephan Aßmus 	{
62ecba7b5cSRyan Leavengood 		return node->IsDirectory();
636af4da5dSStephan Aßmus 	}
646af4da5dSStephan Aßmus };
656af4da5dSStephan Aßmus 
666af4da5dSStephan Aßmus 
676af4da5dSStephan Aßmus // #pragma mark - FileFormatMenuItem
686af4da5dSStephan Aßmus 
696af4da5dSStephan Aßmus 
706af4da5dSStephan Aßmus class FileFormatMenuItem : public BMenuItem {
716af4da5dSStephan Aßmus public:
726af4da5dSStephan Aßmus 	FileFormatMenuItem(media_file_format* format);
736af4da5dSStephan Aßmus 	virtual ~FileFormatMenuItem();
746af4da5dSStephan Aßmus 
756af4da5dSStephan Aßmus 	media_file_format fFileFormat;
766af4da5dSStephan Aßmus };
776af4da5dSStephan Aßmus 
786af4da5dSStephan Aßmus 
FileFormatMenuItem(media_file_format * format)796af4da5dSStephan Aßmus FileFormatMenuItem::FileFormatMenuItem(media_file_format* format)
80dd55ed1aSAlex Wilson 	:
81dd55ed1aSAlex Wilson 	BMenuItem(format->pretty_name, new BMessage(FORMAT_SELECT_MESSAGE))
826af4da5dSStephan Aßmus {
836af4da5dSStephan Aßmus 	memcpy(&fFileFormat, format, sizeof(fFileFormat));
846af4da5dSStephan Aßmus }
856af4da5dSStephan Aßmus 
866af4da5dSStephan Aßmus 
~FileFormatMenuItem()876af4da5dSStephan Aßmus FileFormatMenuItem::~FileFormatMenuItem()
886af4da5dSStephan Aßmus {
896af4da5dSStephan Aßmus }
906af4da5dSStephan Aßmus 
916af4da5dSStephan Aßmus 
926af4da5dSStephan Aßmus // #pragma mark - CodecMenuItem
936af4da5dSStephan Aßmus 
946af4da5dSStephan Aßmus 
956af4da5dSStephan Aßmus class CodecMenuItem : public BMenuItem {
966af4da5dSStephan Aßmus public:
970e68593eSJohn Scipione 	CodecMenuItem(media_codec_info* ci, uint32 message_type);
986af4da5dSStephan Aßmus 	virtual ~CodecMenuItem();
996af4da5dSStephan Aßmus 
1006af4da5dSStephan Aßmus 	media_codec_info fCodecInfo;
1016af4da5dSStephan Aßmus };
1026af4da5dSStephan Aßmus 
1036af4da5dSStephan Aßmus 
CodecMenuItem(media_codec_info * ci,uint32 message_type)1040e68593eSJohn Scipione CodecMenuItem::CodecMenuItem(media_codec_info* ci, uint32 message_type)
105dd55ed1aSAlex Wilson 	:
1060e68593eSJohn Scipione 	BMenuItem(ci->pretty_name, new BMessage(message_type))
1076af4da5dSStephan Aßmus {
1086af4da5dSStephan Aßmus 	memcpy(&fCodecInfo, ci, sizeof(fCodecInfo));
1096af4da5dSStephan Aßmus }
1106af4da5dSStephan Aßmus 
1116af4da5dSStephan Aßmus 
~CodecMenuItem()1126af4da5dSStephan Aßmus CodecMenuItem::~CodecMenuItem()
1136af4da5dSStephan Aßmus {
1146af4da5dSStephan Aßmus }
1156af4da5dSStephan Aßmus 
1166af4da5dSStephan Aßmus 
117a42b9a43SJohn Scipione // #pragma mark - OutputBox
118a42b9a43SJohn Scipione 
119a42b9a43SJohn Scipione 
120a42b9a43SJohn Scipione class OutputBox : public BBox {
121a42b9a43SJohn Scipione public:
122a42b9a43SJohn Scipione 	OutputBox(border_style border, BView* child);
FrameResized(float width,float height)123a42b9a43SJohn Scipione 	virtual void FrameResized(float width, float height)
124a42b9a43SJohn Scipione 	{
125a42b9a43SJohn Scipione 		MediaConverterWindow* window
126a42b9a43SJohn Scipione 			= dynamic_cast<MediaConverterWindow*>(Window());
127a42b9a43SJohn Scipione 		if (window != NULL)
128a42b9a43SJohn Scipione 			window->TruncateOutputFolderPath();
129a42b9a43SJohn Scipione 		BBox::FrameResized(width, height);
130a42b9a43SJohn Scipione 	}
131a42b9a43SJohn Scipione };
132a42b9a43SJohn Scipione 
133a42b9a43SJohn Scipione 
OutputBox(border_style border,BView * child)134a42b9a43SJohn Scipione OutputBox::OutputBox(border_style border, BView* child)
135a42b9a43SJohn Scipione 	:
136a42b9a43SJohn Scipione 	BBox(border, child)
137a42b9a43SJohn Scipione {
138a42b9a43SJohn Scipione }
139a42b9a43SJohn Scipione 
140a42b9a43SJohn Scipione 
1416af4da5dSStephan Aßmus // #pragma mark - MediaConverterWindow
1426af4da5dSStephan Aßmus 
1436af4da5dSStephan Aßmus 
MediaConverterWindow(BRect frame)1446af4da5dSStephan Aßmus MediaConverterWindow::MediaConverterWindow(BRect frame)
145dd55ed1aSAlex Wilson 	:
1460e68593eSJohn Scipione 	BWindow(frame, B_TRANSLATE_SYSTEM_NAME("MediaConverter"),
1470e68593eSJohn Scipione 		B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, B_NOT_ZOOMABLE
1480e68593eSJohn Scipione 		| B_NOT_V_RESIZABLE | B_ASYNCHRONOUS_CONTROLS
1490e68593eSJohn Scipione 		| B_AUTO_UPDATE_SIZE_LIMITS),
150dd55ed1aSAlex Wilson 	fVideoQuality(75),
151dd55ed1aSAlex Wilson 	fAudioQuality(75),
152dd55ed1aSAlex Wilson 	fSaveFilePanel(NULL),
153dd55ed1aSAlex Wilson 	fOpenFilePanel(NULL),
154dd55ed1aSAlex Wilson 	fOutputDirSpecified(false),
155dd55ed1aSAlex Wilson 	fEnabled(true),
156dd55ed1aSAlex Wilson 	fConverting(false),
157dd55ed1aSAlex Wilson 	fCancelling(false)
1586af4da5dSStephan Aßmus {
159b78760b9SPhilippe Saint-Pierre 	BPath outputDir;
160b78760b9SPhilippe Saint-Pierre 	if (find_directory(B_USER_DIRECTORY, &outputDir) != B_OK)
161b78760b9SPhilippe Saint-Pierre 		outputDir.SetTo("/boot/home");
162b78760b9SPhilippe Saint-Pierre 	fOutputDir.SetTo(outputDir.Path());
1636af4da5dSStephan Aßmus 
164dd55ed1aSAlex Wilson 	fMenuBar = new BMenuBar("menubar");
1656af4da5dSStephan Aßmus 	_CreateMenu();
1666af4da5dSStephan Aßmus 
167a9adf1a6SJohn Scipione 	float padding = be_control_look->DefaultItemSpacing();
168a9adf1a6SJohn Scipione 
169dd55ed1aSAlex Wilson 	fListView = new MediaFileListView();
170a42b9a43SJohn Scipione 	fListView->SetExplicitMinSize(BSize(padding * kMinSourceWidth, B_SIZE_UNSET));
171dd55ed1aSAlex Wilson 	BScrollView* scroller = new BScrollView(NULL, fListView, 0, false, true);
1726af4da5dSStephan Aßmus 
1736af4da5dSStephan Aßmus 	// file list view box
174dd55ed1aSAlex Wilson 	fSourcesBox = new BBox(B_FANCY_BORDER, scroller);
175dd55ed1aSAlex Wilson 	fSourcesBox->SetLayout(new BGroupLayout(B_HORIZONTAL, 0));
176a42b9a43SJohn Scipione 		// fSourcesBox's layout adjusted in _UpdateLabels
1776af4da5dSStephan Aßmus 
178a42b9a43SJohn Scipione 	// info box
179dd55ed1aSAlex Wilson 	fInfoView = new MediaFileInfoView();
180a42b9a43SJohn Scipione 	fInfoView->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH,
181a42b9a43SJohn Scipione 		B_ALIGN_VERTICAL_UNSET));
182dd55ed1aSAlex Wilson 	fInfoBox = new BBox(B_FANCY_BORDER, fInfoView);
1837730c846SStephan Aßmus 
184a42b9a43SJohn Scipione 	// output menu fields
185ae0f70fcSAdrien Destugues 	fFormatMenu = new BMenuField(NULL, B_TRANSLATE("File format:"),
186ae0f70fcSAdrien Destugues 		new BPopUpMenu(""));
187ae0f70fcSAdrien Destugues 	fAudioMenu = new BMenuField(NULL, B_TRANSLATE("Audio encoding:"),
188ae0f70fcSAdrien Destugues 		new BPopUpMenu(""));
189ae0f70fcSAdrien Destugues 	fVideoMenu = new BMenuField(NULL, B_TRANSLATE("Video encoding:"),
190ae0f70fcSAdrien Destugues 		new BPopUpMenu(""));
1916af4da5dSStephan Aßmus 
1926af4da5dSStephan Aßmus 	// output folder
193ae0f70fcSAdrien Destugues 	fDestButton = new BButton(B_TRANSLATE("Output folder"),
194dd55ed1aSAlex Wilson 		new BMessage(OUTPUT_FOLDER_MESSAGE));
195dd55ed1aSAlex Wilson 	BAlignment labelAlignment(be_control_look->DefaultLabelAlignment());
196b78760b9SPhilippe Saint-Pierre 	fOutputFolder = new BStringView(NULL, outputDir.Path());
197dd55ed1aSAlex Wilson 	fOutputFolder->SetExplicitAlignment(labelAlignment);
1986af4da5dSStephan Aßmus 
1996af4da5dSStephan Aßmus 	// start/end duration
2004d891825SJohn Scipione 	fStartDurationTC = new BTextControl(NULL, "0", NULL);
201a42b9a43SJohn Scipione 	BLayoutItem* startDuration = fStartDurationTC->CreateTextViewLayoutItem();
202a42b9a43SJohn Scipione 	startDuration->SetExplicitSize(BSize(padding * kDurationWidth, B_SIZE_UNSET));
203a42b9a43SJohn Scipione 	startDuration->SetExplicitAlignment(BAlignment(B_ALIGN_LEFT,
204a42b9a43SJohn Scipione 		B_ALIGN_VERTICAL_CENTER));
2054d891825SJohn Scipione 	fEndDurationTC = new BTextControl(NULL, "0", NULL);
206a42b9a43SJohn Scipione 	BLayoutItem* endDuration = fEndDurationTC->CreateTextViewLayoutItem();
207a42b9a43SJohn Scipione 	endDuration->SetExplicitSize(BSize(padding * kDurationWidth, B_SIZE_UNSET));
208a42b9a43SJohn Scipione 	endDuration->SetExplicitAlignment(BAlignment(B_ALIGN_LEFT,
209a42b9a43SJohn Scipione 		B_ALIGN_VERTICAL_CENTER));
2106af4da5dSStephan Aßmus 
211a42b9a43SJohn Scipione 	// video quality
212dd55ed1aSAlex Wilson 	fVideoQualitySlider = new BSlider("VSlider", "" ,
213dd55ed1aSAlex Wilson 		new BMessage(VIDEO_QUALITY_CHANGED_MESSAGE), 1, 100, B_HORIZONTAL);
21453bb96c5SJohn Scipione 	fVideoQualitySlider->SetModificationMessage(
21553bb96c5SJohn Scipione 		new BMessage(VIDEO_QUALITY_CHANGED_MESSAGE));
2166af4da5dSStephan Aßmus 	fVideoQualitySlider->SetValue(fVideoQuality);
2176af4da5dSStephan Aßmus 	fVideoQualitySlider->SetEnabled(false);
218f29499e7SJohn Scipione 	fVideoQualitySlider->SetExplicitSize(BSize(padding * kQualitySliderWidth,
219f29499e7SJohn Scipione 		B_SIZE_UNSET));
2206af4da5dSStephan Aßmus 
221a42b9a43SJohn Scipione 	// audio quality
222dd55ed1aSAlex Wilson 	fAudioQualitySlider = new BSlider("ASlider", "" ,
223dd55ed1aSAlex Wilson 		new BMessage(AUDIO_QUALITY_CHANGED_MESSAGE), 1, 100, B_HORIZONTAL);
22453bb96c5SJohn Scipione 	fAudioQualitySlider->SetModificationMessage(
22553bb96c5SJohn Scipione 		new BMessage(AUDIO_QUALITY_CHANGED_MESSAGE));
2266af4da5dSStephan Aßmus 	fAudioQualitySlider->SetValue(fAudioQuality);
2276af4da5dSStephan Aßmus 	fAudioQualitySlider->SetEnabled(false);
228f29499e7SJohn Scipione 	fAudioQualitySlider->SetExplicitSize(BSize(padding * kQualitySliderWidth,
229f29499e7SJohn Scipione 		B_SIZE_UNSET));
230dd55ed1aSAlex Wilson 
231a42b9a43SJohn Scipione 	// output format box
232a42b9a43SJohn Scipione 	BView* outputGrid = BLayoutBuilder::Grid<>()
23383010212SJohn Scipione 		.Add(fFormatMenu->CreateLabelLayoutItem(), 0, 0)
23483010212SJohn Scipione 		.Add(fFormatMenu->CreateMenuBarLayoutItem(), 1, 0)
23583010212SJohn Scipione 		.Add(fAudioMenu->CreateLabelLayoutItem(), 0, 1)
23683010212SJohn Scipione 		.Add(fAudioMenu->CreateMenuBarLayoutItem(), 1, 1)
23783010212SJohn Scipione 		.Add(fVideoMenu->CreateLabelLayoutItem(), 0, 2)
23883010212SJohn Scipione 		.Add(fVideoMenu->CreateMenuBarLayoutItem(), 1, 2)
239dd55ed1aSAlex Wilson 		.Add(fDestButton, 0, 3)
240dd55ed1aSAlex Wilson 		.Add(fOutputFolder, 1, 3)
24183010212SJohn Scipione 		.Add(fStartDurationTC->CreateLabelLayoutItem(), 0, 4)
242a42b9a43SJohn Scipione 		.Add(startDuration, 1, 4)
24383010212SJohn Scipione 		.Add(fEndDurationTC->CreateLabelLayoutItem(), 0, 5)
244a42b9a43SJohn Scipione 		.Add(endDuration, 1, 5)
245dd55ed1aSAlex Wilson 		.Add(fVideoQualitySlider, 0, 6, 2, 1)
246a42b9a43SJohn Scipione 		.Add(fAudioQualitySlider, 0, 7, 2, 1)
247a42b9a43SJohn Scipione 		.View();
248a42b9a43SJohn Scipione 	outputGrid->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH,
249a42b9a43SJohn Scipione 		B_ALIGN_USE_FULL_HEIGHT));
250a42b9a43SJohn Scipione 	fOutputBox = new OutputBox(B_FANCY_BORDER, outputGrid);
251a42b9a43SJohn Scipione 	fOutputBox->SetLayout(new BGroupLayout(B_HORIZONTAL, 0));
252a42b9a43SJohn Scipione 		// fOutputBox's layout adjusted in _UpdateLabels
2536af4da5dSStephan Aßmus 
2546af4da5dSStephan Aßmus 	// buttons
255ae0f70fcSAdrien Destugues 	fPreviewButton = new BButton(B_TRANSLATE("Preview"),
256dd55ed1aSAlex Wilson 		new BMessage(PREVIEW_MESSAGE));
2576af4da5dSStephan Aßmus 	fPreviewButton->SetEnabled(false);
2586af4da5dSStephan Aßmus 
259ae0f70fcSAdrien Destugues 	fConvertButton = new BButton(B_TRANSLATE("Convert"),
260dd55ed1aSAlex Wilson 		new BMessage(CONVERT_BUTTON_MESSAGE));
2616af4da5dSStephan Aßmus 
262dd55ed1aSAlex Wilson 	// Status views
263dd55ed1aSAlex Wilson 	fStatus = new BStringView(NULL, NULL);
264dd55ed1aSAlex Wilson 	fStatus->SetExplicitAlignment(labelAlignment);
265dd55ed1aSAlex Wilson 	fFileStatus = new BStringView(NULL, NULL);
266dd55ed1aSAlex Wilson 	fFileStatus->SetExplicitAlignment(labelAlignment);
2676af4da5dSStephan Aßmus 
2686af4da5dSStephan Aßmus 	SetStatusMessage("");
2696af4da5dSStephan Aßmus 	_UpdateLabels();
2706af4da5dSStephan Aßmus 
271dd55ed1aSAlex Wilson 	BLayoutBuilder::Group<>(this, B_VERTICAL, 0)
272dd55ed1aSAlex Wilson 		.SetInsets(0, 0, 0, 0)
273dd55ed1aSAlex Wilson 		.Add(fMenuBar)
274744a3927SHumdinger 		.AddSplit(B_HORIZONTAL, B_USE_DEFAULT_SPACING)
275744a3927SHumdinger 			.SetInsets(B_USE_WINDOW_SPACING, B_USE_WINDOW_SPACING,
276744a3927SHumdinger 				B_USE_WINDOW_SPACING, 0)
277744a3927SHumdinger 			.Add(fSourcesBox)
278744a3927SHumdinger 			.AddGroup(B_VERTICAL, B_USE_ITEM_SPACING)
2797730c846SStephan Aßmus 				.Add(fInfoBox)
2807730c846SStephan Aßmus 				.Add(fOutputBox)
2817730c846SStephan Aßmus 			.End()
2827730c846SStephan Aßmus 		.End()
283744a3927SHumdinger 		.AddGrid(B_USE_ITEM_SPACING)
284744a3927SHumdinger 			.SetInsets(B_USE_WINDOW_SPACING, B_USE_DEFAULT_SPACING,
285744a3927SHumdinger 				B_USE_WINDOW_SPACING, B_USE_WINDOW_SPACING)
286dd55ed1aSAlex Wilson 			.Add(fStatus, 0, 0)
287dd55ed1aSAlex Wilson 			.Add(fFileStatus, 0, 1)
2889b2ea762SAlex Wilson 			.Add(BSpaceLayoutItem::CreateGlue(), 1, 0)
289dd55ed1aSAlex Wilson 			.Add(fPreviewButton, 2, 0)
2907730c846SStephan Aßmus 			.Add(fConvertButton, 3, 0)
2910e68593eSJohn Scipione 		.End();
2926af4da5dSStephan Aßmus }
2936af4da5dSStephan Aßmus 
2946af4da5dSStephan Aßmus 
~MediaConverterWindow()2956af4da5dSStephan Aßmus MediaConverterWindow::~MediaConverterWindow()
2966af4da5dSStephan Aßmus {
2973c0f9a7cSKarsten Heimrich 	delete fSaveFilePanel;
2983c0f9a7cSKarsten Heimrich 	delete fOpenFilePanel;
2996af4da5dSStephan Aßmus }
3006af4da5dSStephan Aßmus 
3016af4da5dSStephan Aßmus 
3026af4da5dSStephan Aßmus // #pragma mark -
3036af4da5dSStephan Aßmus 
3046af4da5dSStephan Aßmus 
3056af4da5dSStephan Aßmus void
MessageReceived(BMessage * message)3060e68593eSJohn Scipione MediaConverterWindow::MessageReceived(BMessage* message)
3076af4da5dSStephan Aßmus {
3086af4da5dSStephan Aßmus 	entry_ref inRef;
3096af4da5dSStephan Aßmus 
310f086ada7SStephan Aßmus 	BEntry inEntry;
31130456952SEmir SARI 	BNumberFormat fNumberFormat;
31230456952SEmir SARI 	BString buffer;
3136af4da5dSStephan Aßmus 
3140e68593eSJohn Scipione 	switch (message->what) {
3156af4da5dSStephan Aßmus 		#if B_BEOS_VERSION <= B_BEOS_VERSION_6
3166af4da5dSStephan Aßmus 		case B_LANGUAGE_CHANGED:
3176af4da5dSStephan Aßmus 			LanguageChanged();
3186af4da5dSStephan Aßmus 			break;
3196af4da5dSStephan Aßmus 		#endif
3206af4da5dSStephan Aßmus 
3216af4da5dSStephan Aßmus 		case INIT_FORMAT_MENUS:
3226af4da5dSStephan Aßmus 			BuildFormatMenu();
3236af4da5dSStephan Aßmus 			if (CountSourceFiles() == 0)
3246af4da5dSStephan Aßmus 				SetEnabled(false, false);
3256af4da5dSStephan Aßmus 			break;
3266af4da5dSStephan Aßmus 
3276af4da5dSStephan Aßmus 		case B_SIMPLE_DATA:
3280e68593eSJohn Scipione 			if (message->WasDropped()) {
3296af4da5dSStephan Aßmus 				DetachCurrentMessage();
3300e68593eSJohn Scipione 				message->what = B_REFS_RECEIVED;
3310e68593eSJohn Scipione 				BMessenger(be_app).SendMessage(message);
3320e68593eSJohn Scipione 				delete message;
3336af4da5dSStephan Aßmus 			}
3346af4da5dSStephan Aßmus 			break;
3356af4da5dSStephan Aßmus 
3366af4da5dSStephan Aßmus 		case FORMAT_SELECT_MESSAGE:
3376af4da5dSStephan Aßmus 			BuildAudioVideoMenus();
3386af4da5dSStephan Aßmus 			break;
3396af4da5dSStephan Aßmus 		case AUDIO_CODEC_SELECT_MESSAGE:
3406af4da5dSStephan Aßmus 			break;
3416af4da5dSStephan Aßmus 		case VIDEO_CODEC_SELECT_MESSAGE:
3426af4da5dSStephan Aßmus 			break;
3436af4da5dSStephan Aßmus 
3446af4da5dSStephan Aßmus 		case CONVERT_BUTTON_MESSAGE:
3456af4da5dSStephan Aßmus 			if (!fConverting) {
346ae0f70fcSAdrien Destugues 				fConvertButton->SetLabel(B_TRANSLATE("Cancel"));
3476af4da5dSStephan Aßmus 				fConverting = true;
348ae0f70fcSAdrien Destugues 				SetStatusMessage(B_TRANSLATE("Convert"));
3496af4da5dSStephan Aßmus 				SetEnabled(false, true);
3506af4da5dSStephan Aßmus 				BMessenger(be_app).SendMessage(START_CONVERSION_MESSAGE);
3516af4da5dSStephan Aßmus 			} else if (!fCancelling) {
3526af4da5dSStephan Aßmus 				fCancelling = true;
353ae0f70fcSAdrien Destugues 				SetStatusMessage(B_TRANSLATE("Cancelling" B_UTF8_ELLIPSIS));
3546af4da5dSStephan Aßmus 				BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE);
3556af4da5dSStephan Aßmus 			}
3566af4da5dSStephan Aßmus 			break;
3576af4da5dSStephan Aßmus 
3586af4da5dSStephan Aßmus 		case CONVERSION_DONE_MESSAGE:
359f086ada7SStephan Aßmus 		{
360ae0f70fcSAdrien Destugues 			SetStatusMessage(fCancelling ? B_TRANSLATE("Conversion cancelled")
361ae0f70fcSAdrien Destugues 				: B_TRANSLATE("Conversion completed"));
3626af4da5dSStephan Aßmus 			fConverting = false;
3636af4da5dSStephan Aßmus 			fCancelling = false;
3646af4da5dSStephan Aßmus 			bool enable = CountSourceFiles() > 0;
3656af4da5dSStephan Aßmus 			SetEnabled(enable, enable);
366ae0f70fcSAdrien Destugues 			fConvertButton->SetLabel(B_TRANSLATE("Convert"));
3676af4da5dSStephan Aßmus 			break;
368f086ada7SStephan Aßmus 		}
3696af4da5dSStephan Aßmus 
3706af4da5dSStephan Aßmus 		case OUTPUT_FOLDER_MESSAGE:
3716af4da5dSStephan Aßmus 			// Execute Save Panel
372f086ada7SStephan Aßmus 			if (fSaveFilePanel == NULL) {
373f086ada7SStephan Aßmus 				BButton* selectThisDir;
3746af4da5dSStephan Aßmus 
3750e68593eSJohn Scipione 				BMessage folderSelect(FOLDER_SELECT_MESSAGE);
3763c0f9a7cSKarsten Heimrich 				fSaveFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL,
3770e68593eSJohn Scipione 					B_DIRECTORY_NODE, true, &folderSelect, NULL, false, true);
378ae0f70fcSAdrien Destugues 				fSaveFilePanel->SetButtonLabel(B_DEFAULT_BUTTON,
379ae0f70fcSAdrien Destugues 					B_TRANSLATE("Select"));
3806af4da5dSStephan Aßmus 				fSaveFilePanel->SetTarget(this);
3816af4da5dSStephan Aßmus 
3826af4da5dSStephan Aßmus 				fSaveFilePanel->Window()->Lock();
383ae0f70fcSAdrien Destugues 				fSaveFilePanel->Window()->SetTitle(
384ae0f70fcSAdrien Destugues 					B_TRANSLATE("MediaConverter+:SaveDirectory"));
385f086ada7SStephan Aßmus 				BRect buttonRect
386f086ada7SStephan Aßmus 					= fSaveFilePanel->Window()->ChildAt(0)->FindView(
387f086ada7SStephan Aßmus 						"cancel button")->Frame();
388f086ada7SStephan Aßmus 				buttonRect.right  = buttonRect.left - 20;
389f086ada7SStephan Aßmus 				buttonRect.left = buttonRect.right - 130;
390ae0f70fcSAdrien Destugues 				selectThisDir = new BButton(buttonRect, NULL,
391ae0f70fcSAdrien Destugues 					B_TRANSLATE("Select this folder"),
392f086ada7SStephan Aßmus 					new BMessage(SELECT_THIS_DIR_MESSAGE),
393f086ada7SStephan Aßmus 					B_FOLLOW_BOTTOM | B_FOLLOW_RIGHT);
394f086ada7SStephan Aßmus 				selectThisDir->SetTarget(this);
395f086ada7SStephan Aßmus 				fSaveFilePanel->Window()->ChildAt(0)->AddChild(selectThisDir);
3966af4da5dSStephan Aßmus 				fSaveFilePanel->Window()->Unlock();
3976af4da5dSStephan Aßmus 
398f086ada7SStephan Aßmus 				fSaveFilePanel->SetRefFilter(new DirectoryFilter);
3996af4da5dSStephan Aßmus 			}
4006af4da5dSStephan Aßmus 			fSaveFilePanel->Show();
4016af4da5dSStephan Aßmus 			break;
4026af4da5dSStephan Aßmus 
4036af4da5dSStephan Aßmus 		case FOLDER_SELECT_MESSAGE:
4046af4da5dSStephan Aßmus 			// "SELECT" Button at Save Panel Pushed
4056af4da5dSStephan Aßmus 			fSaveFilePanel->GetNextSelectedRef(&inRef);
406f086ada7SStephan Aßmus 			inEntry.SetTo(&inRef, true);
407f086ada7SStephan Aßmus 			_SetOutputFolder(inEntry);
4086af4da5dSStephan Aßmus 			fOutputDirSpecified = true;
409d1dd0b58SJohn Scipione 			fSaveFilePanel->Rewind();
4106af4da5dSStephan Aßmus 			break;
4116af4da5dSStephan Aßmus 
4126af4da5dSStephan Aßmus 		case SELECT_THIS_DIR_MESSAGE:
4136af4da5dSStephan Aßmus 			// "THIS DIR" Button at Save Panel Pushed
4146af4da5dSStephan Aßmus 			fSaveFilePanel->GetPanelDirectory(&inRef);
4156af4da5dSStephan Aßmus 			fSaveFilePanel->Hide();
416f086ada7SStephan Aßmus 			inEntry.SetTo(&inRef, true);
417f086ada7SStephan Aßmus 			_SetOutputFolder(inEntry);
4186af4da5dSStephan Aßmus 			fOutputDirSpecified = true;
4196af4da5dSStephan Aßmus 			break;
4206af4da5dSStephan Aßmus 
4216af4da5dSStephan Aßmus 		case OPEN_FILE_MESSAGE:
4226af4da5dSStephan Aßmus 			// Execute Open Panel
4236af4da5dSStephan Aßmus 			if (!fOpenFilePanel) {
4243c0f9a7cSKarsten Heimrich 				fOpenFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL,
4253c0f9a7cSKarsten Heimrich 					B_FILE_NODE, true, NULL, NULL, false, true);
4266af4da5dSStephan Aßmus 				fOpenFilePanel->SetTarget(this);
4276af4da5dSStephan Aßmus 			}
4286af4da5dSStephan Aßmus 			fOpenFilePanel->Show();
4296af4da5dSStephan Aßmus 			break;
4306af4da5dSStephan Aßmus 
4316af4da5dSStephan Aßmus 		case B_REFS_RECEIVED:
4326af4da5dSStephan Aßmus 			// Media Files Seleced by Open Panel
4336af4da5dSStephan Aßmus 			DetachCurrentMessage();
4340e68593eSJohn Scipione 			message->what = B_REFS_RECEIVED;
4350e68593eSJohn Scipione 			BMessenger(be_app).SendMessage(message);
4366af4da5dSStephan Aßmus 			// fall through
4376af4da5dSStephan Aßmus 
4386af4da5dSStephan Aßmus 		case B_CANCEL:
4396af4da5dSStephan Aßmus 			break;
4406af4da5dSStephan Aßmus 
4416af4da5dSStephan Aßmus 		case QUIT_MESSAGE:
4426af4da5dSStephan Aßmus 			MediaConverterWindow::QuitRequested();
4436af4da5dSStephan Aßmus 			break;
4446af4da5dSStephan Aßmus 
4456af4da5dSStephan Aßmus 		case PREVIEW_MESSAGE:
446f086ada7SStephan Aßmus 		{
447f086ada7SStephan Aßmus 			// Build the command line to launch the preview application.
448f086ada7SStephan Aßmus 			// TODO: Launch the default app instead of hardcoded MediaPlayer!
449f086ada7SStephan Aßmus 			int32 srcIndex = fListView->CurrentSelection();
450f086ada7SStephan Aßmus 			BMediaFile* inFile = NULL;
451f086ada7SStephan Aßmus 			status_t status = GetSourceFileAt(srcIndex, &inFile, &inRef);
4526af4da5dSStephan Aßmus 
453f086ada7SStephan Aßmus 			const char* argv[3];
454f086ada7SStephan Aßmus 			BString startPosString;
455f086ada7SStephan Aßmus 			BPath path;
456f086ada7SStephan Aßmus 
4576af4da5dSStephan Aßmus 			if (status == B_OK) {
458f086ada7SStephan Aßmus 				argv[0] = "-pos";
459f086ada7SStephan Aßmus 					// NOTE: -pos argument is currently not supported by Haiku
460f086ada7SStephan Aßmus 					// MediaPlayer.
461f086ada7SStephan Aßmus 				startPosString << fStartDurationTC->Text();
462f086ada7SStephan Aßmus 				startPosString << "000";
463f086ada7SStephan Aßmus 				argv[1] = startPosString.String();
4646af4da5dSStephan Aßmus 
465f086ada7SStephan Aßmus 				status = inEntry.SetTo(&inRef);
4666af4da5dSStephan Aßmus 			}
4676af4da5dSStephan Aßmus 
468f086ada7SStephan Aßmus 			if (status == B_OK) {
469f086ada7SStephan Aßmus 				status = inEntry.GetPath(&path);
470f086ada7SStephan Aßmus 				if (status == B_OK)
471f086ada7SStephan Aßmus 					argv[2] = path.Path();
472f086ada7SStephan Aßmus 			}
4736af4da5dSStephan Aßmus 
474f086ada7SStephan Aßmus 			if (status == B_OK) {
475f086ada7SStephan Aßmus 				status = be_roster->Launch(
476f086ada7SStephan Aßmus 					"application/x-vnd.Haiku-MediaPlayer",
477f086ada7SStephan Aßmus 					3, (char**)argv, NULL);
478f086ada7SStephan Aßmus 			}
479f086ada7SStephan Aßmus 
480f086ada7SStephan Aßmus 			if (status != B_OK && status != B_ALREADY_RUNNING) {
481007d8a0cSSiarzhuk Zharski 				BString errorString(B_TRANSLATE("Error launching: %strError%"));
482007d8a0cSSiarzhuk Zharski 				errorString.ReplaceFirst("%strError%", strerror(status));
483aed35104SHumdinger 				BAlert* alert = new BAlert(B_TRANSLATE("Error"),
484aed35104SHumdinger 					errorString.String(), B_TRANSLATE("OK"));
485aed35104SHumdinger 				alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
486aed35104SHumdinger 				alert->Go();
4876af4da5dSStephan Aßmus 			}
4886af4da5dSStephan Aßmus 			break;
489f086ada7SStephan Aßmus 		}
4906af4da5dSStephan Aßmus 
4916af4da5dSStephan Aßmus 		case VIDEO_QUALITY_CHANGED_MESSAGE:
492f086ada7SStephan Aßmus 		{
493f086ada7SStephan Aßmus 			int32 value;
49430456952SEmir SARI 			BString data;
49530456952SEmir SARI 
4960e68593eSJohn Scipione 			message->FindInt32("be:value", &value);
49730456952SEmir SARI 			double percentValue = value / 100.0;
49830456952SEmir SARI 
49930456952SEmir SARI 			if (fNumberFormat.FormatPercent(data, percentValue) != B_OK)
500*37d99b7eSEmir SARI 				data.SetToFormat("%d%%", (int8)value);
50130456952SEmir SARI 
50230456952SEmir SARI 			buffer.SetToFormat(B_TRANSLATE("Video quality: %s"), data.String());
50330456952SEmir SARI 			fVideoQualitySlider->SetLabel(buffer.String());
50430456952SEmir SARI 			fVideoQuality = (int)percentValue;
5056af4da5dSStephan Aßmus 			break;
506f086ada7SStephan Aßmus 		}
5076af4da5dSStephan Aßmus 
5086af4da5dSStephan Aßmus 		case AUDIO_QUALITY_CHANGED_MESSAGE:
509f086ada7SStephan Aßmus 		{
510f086ada7SStephan Aßmus 			int32 value;
51130456952SEmir SARI 			BString data;
51230456952SEmir SARI 
5130e68593eSJohn Scipione 			message->FindInt32("be:value", &value);
51430456952SEmir SARI 			double percentValue = value / 100.0;
51530456952SEmir SARI 
51630456952SEmir SARI 			if (fNumberFormat.FormatPercent(data, percentValue) != B_OK)
517*37d99b7eSEmir SARI 				data.SetToFormat("%d%%", (int8)value);
51830456952SEmir SARI 
51930456952SEmir SARI 			buffer.SetToFormat(B_TRANSLATE("Audio quality: %s"), data.String());
52030456952SEmir SARI 			fAudioQualitySlider->SetLabel(buffer.String());
52130456952SEmir SARI 			fAudioQuality = (int)percentValue;
5226af4da5dSStephan Aßmus 			break;
523f086ada7SStephan Aßmus 		}
5246af4da5dSStephan Aßmus 
5256af4da5dSStephan Aßmus 		default:
5260e68593eSJohn Scipione 			BWindow::MessageReceived(message);
527ab05d368Ssushilhub 			break;
5286af4da5dSStephan Aßmus 	}
5296af4da5dSStephan Aßmus }
5306af4da5dSStephan Aßmus 
5316af4da5dSStephan Aßmus 
5326af4da5dSStephan Aßmus bool
QuitRequested()5336af4da5dSStephan Aßmus MediaConverterWindow::QuitRequested()
5346af4da5dSStephan Aßmus {
5356af4da5dSStephan Aßmus 	if (!fConverting) {
5366af4da5dSStephan Aßmus 		BMessenger(be_app).SendMessage(B_QUIT_REQUESTED);
5376af4da5dSStephan Aßmus 		return true;
5386af4da5dSStephan Aßmus 	} else if (!fCancelling) {
5396af4da5dSStephan Aßmus 		fCancelling = true;
540ae0f70fcSAdrien Destugues 		SetStatusMessage(B_TRANSLATE("Cancelling"));
5416af4da5dSStephan Aßmus 		BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE);
5426af4da5dSStephan Aßmus 	}
5430e68593eSJohn Scipione 
5446af4da5dSStephan Aßmus 	return false;
5456af4da5dSStephan Aßmus }
5466af4da5dSStephan Aßmus 
5476af4da5dSStephan Aßmus 
5486af4da5dSStephan Aßmus // #pragma mark -
5496af4da5dSStephan Aßmus 
5506af4da5dSStephan Aßmus 
5516af4da5dSStephan Aßmus void
LanguageChanged()5526af4da5dSStephan Aßmus MediaConverterWindow::LanguageChanged()
5536af4da5dSStephan Aßmus {
5546af4da5dSStephan Aßmus 	_DestroyMenu();
5556af4da5dSStephan Aßmus 	_CreateMenu();
5566af4da5dSStephan Aßmus 	_UpdateLabels();
5576af4da5dSStephan Aßmus 	BuildAudioVideoMenus();
5586af4da5dSStephan Aßmus 	Lock();
5596af4da5dSStephan Aßmus 	fInfoView->Invalidate();
5606af4da5dSStephan Aßmus 	Unlock();
5616af4da5dSStephan Aßmus }
5626af4da5dSStephan Aßmus 
5636af4da5dSStephan Aßmus 
5646af4da5dSStephan Aßmus void
BuildAudioVideoMenus()5656af4da5dSStephan Aßmus MediaConverterWindow::BuildAudioVideoMenus()
5666af4da5dSStephan Aßmus {
5676af4da5dSStephan Aßmus 	BMenu* menu = fAudioMenu->Menu();
5686af4da5dSStephan Aßmus 	BMenuItem* item;
5690e68593eSJohn Scipione 
5706af4da5dSStephan Aßmus 	// clear out old audio codec menu items
5717f4d1af4SSergei Reznikov 	while ((item = menu->RemoveItem((int32)0)) != NULL)
5726af4da5dSStephan Aßmus 		delete item;
5736af4da5dSStephan Aßmus 
5746af4da5dSStephan Aßmus 	bool separator = true;
5756af4da5dSStephan Aßmus 
5766af4da5dSStephan Aßmus 	// get selected file format
5777730c846SStephan Aßmus 	FileFormatMenuItem* ffmi
5787730c846SStephan Aßmus 		= (FileFormatMenuItem*)fFormatMenu->Menu()->FindMarked();
5796af4da5dSStephan Aßmus 	media_file_format* mf_format = &(ffmi->fFileFormat);
5806af4da5dSStephan Aßmus 
5816af4da5dSStephan Aßmus 	media_format format, outfmt;
5829f9afda5SMurai Takashi 	format.Clear();
5836af4da5dSStephan Aßmus 	media_codec_info codec_info;
5846af4da5dSStephan Aßmus 	int32 cookie = 0;
5856af4da5dSStephan Aßmus 	CodecMenuItem* cmi;
5866af4da5dSStephan Aßmus 
5876af4da5dSStephan Aßmus 	// add available audio encoders to menu
5886af4da5dSStephan Aßmus 	format.type = B_MEDIA_RAW_AUDIO;
5896af4da5dSStephan Aßmus 	format.u.raw_audio = media_raw_audio_format::wildcard;
5907730c846SStephan Aßmus 	while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info)
5917730c846SStephan Aßmus 			== B_OK) {
5926af4da5dSStephan Aßmus 		if (separator) {
593ae0f70fcSAdrien Destugues 			menu->AddItem(new BMenuItem(
594546208a5SOliver Tappe 				B_TRANSLATE_CONTEXT("No audio", "Audio codecs list"),
5956af4da5dSStephan Aßmus 				new BMessage(AUDIO_CODEC_SELECT_MESSAGE)));
5966af4da5dSStephan Aßmus 			menu->AddSeparatorItem();
5976af4da5dSStephan Aßmus 			separator = false;
5986af4da5dSStephan Aßmus 		}
5996af4da5dSStephan Aßmus 
6006af4da5dSStephan Aßmus 		cmi = new CodecMenuItem(&codec_info, AUDIO_CODEC_SELECT_MESSAGE);
6016af4da5dSStephan Aßmus 		menu->AddItem(cmi);
6026af4da5dSStephan Aßmus 		// reset media format struct
6036af4da5dSStephan Aßmus /*
6046af4da5dSStephan Aßmus 		format.type = B_MEDIA_RAW_AUDIO;
6056af4da5dSStephan Aßmus 		format.u.raw_audio = media_raw_audio_format::wildcard;
6066af4da5dSStephan Aßmus */
6076af4da5dSStephan Aßmus 	}
6086af4da5dSStephan Aßmus 
6096af4da5dSStephan Aßmus 	// mark first audio encoder
6106af4da5dSStephan Aßmus 	item = menu->ItemAt(0);
6116af4da5dSStephan Aßmus 	if (item != NULL) {
6126af4da5dSStephan Aßmus 		fAudioMenu->SetEnabled(fEnabled);
6136af4da5dSStephan Aßmus 		fAudioQualitySlider->SetEnabled(fEnabled);
6146af4da5dSStephan Aßmus 		item->SetMarked(true);
6156af4da5dSStephan Aßmus 		((BInvoker*)item)->Invoke();
6166af4da5dSStephan Aßmus 	} else {
617ae0f70fcSAdrien Destugues 		item = new BMenuItem(
6180e68593eSJohn Scipione 			B_TRANSLATE_CONTEXT("None available", "Audio codecs"), NULL);
6196af4da5dSStephan Aßmus 		menu->AddItem(item);
6206af4da5dSStephan Aßmus 		item->SetMarked(true);
6216af4da5dSStephan Aßmus 		fAudioMenu->SetEnabled(false);
6226af4da5dSStephan Aßmus 		fAudioQualitySlider->SetEnabled(false);
6236af4da5dSStephan Aßmus 	}
6246af4da5dSStephan Aßmus 
6256af4da5dSStephan Aßmus 	// clear out old video codec menu items
6266af4da5dSStephan Aßmus 	menu = fVideoMenu->Menu();
6277f4d1af4SSergei Reznikov 	while ((item = menu->RemoveItem((int32)0)) != NULL)
6286af4da5dSStephan Aßmus 		delete item;
6296af4da5dSStephan Aßmus 
6306af4da5dSStephan Aßmus 	separator = true;
6316af4da5dSStephan Aßmus 
6326af4da5dSStephan Aßmus 	// construct a generic video format.  Some of these parameters
6336af4da5dSStephan Aßmus 	// seem silly, but are needed for R4.5.x, which is more picky
6346af4da5dSStephan Aßmus 	// than subsequent BeOS releases will be.
6359f9afda5SMurai Takashi 	format.Clear();
6366af4da5dSStephan Aßmus 	format.type = B_MEDIA_RAW_VIDEO;
6376af4da5dSStephan Aßmus 	format.u.raw_video.last_active = (uint32)(240 - 1);
6386af4da5dSStephan Aßmus 	format.u.raw_video.orientation = B_VIDEO_TOP_LEFT_RIGHT;
6396af4da5dSStephan Aßmus 	format.u.raw_video.display.format = B_RGB32;
6406af4da5dSStephan Aßmus 	format.u.raw_video.display.line_width = (int32)320;
6416af4da5dSStephan Aßmus 	format.u.raw_video.display.line_count = (int32)240;
6426af4da5dSStephan Aßmus 	format.u.raw_video.display.bytes_per_row = 4 * 320;
6436af4da5dSStephan Aßmus 
6446af4da5dSStephan Aßmus 	// add available video encoders to menu
6456af4da5dSStephan Aßmus 	cookie = 0;
6460e68593eSJohn Scipione 	while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info)
6470e68593eSJohn Scipione 			== B_OK) {
6486af4da5dSStephan Aßmus 		if (separator) {
649ae0f70fcSAdrien Destugues 			menu->AddItem(new BMenuItem(
650546208a5SOliver Tappe 				B_TRANSLATE_CONTEXT("No video", "Video codecs list"),
6516af4da5dSStephan Aßmus 				new BMessage(VIDEO_CODEC_SELECT_MESSAGE)));
6526af4da5dSStephan Aßmus 			menu->AddSeparatorItem();
6536af4da5dSStephan Aßmus 			separator = false;
6546af4da5dSStephan Aßmus 		}
6556af4da5dSStephan Aßmus 
6566af4da5dSStephan Aßmus 		cmi = new CodecMenuItem(&codec_info, VIDEO_CODEC_SELECT_MESSAGE);
6576af4da5dSStephan Aßmus 		menu->AddItem(cmi);
6586af4da5dSStephan Aßmus 	}
6596af4da5dSStephan Aßmus 
6606af4da5dSStephan Aßmus 	// mark first video encoder
6616af4da5dSStephan Aßmus 	item = menu->ItemAt(0);
6626af4da5dSStephan Aßmus 	if (item != NULL) {
6636af4da5dSStephan Aßmus 		fVideoMenu->SetEnabled(fEnabled);
6646af4da5dSStephan Aßmus 		fVideoQualitySlider->SetEnabled(fEnabled);
6656af4da5dSStephan Aßmus 		item->SetMarked(true);
6666af4da5dSStephan Aßmus 		((BInvoker*)item)->Invoke();
6676af4da5dSStephan Aßmus 	} else {
668ae0f70fcSAdrien Destugues 		item = new BMenuItem(
6690e68593eSJohn Scipione 			B_TRANSLATE_CONTEXT("None available", "Video codecs"), NULL);
6706af4da5dSStephan Aßmus 		menu->AddItem(item);
6716af4da5dSStephan Aßmus 		item->SetMarked(true);
6726af4da5dSStephan Aßmus 		fVideoMenu->SetEnabled(false);
6736af4da5dSStephan Aßmus 		fVideoQualitySlider->SetEnabled(false);
6746af4da5dSStephan Aßmus 	}
6756af4da5dSStephan Aßmus }
6766af4da5dSStephan Aßmus 
6776af4da5dSStephan Aßmus void
GetSelectedFormatInfo(media_file_format ** format,media_codec_info ** audio,media_codec_info ** video)6786af4da5dSStephan Aßmus MediaConverterWindow::GetSelectedFormatInfo(media_file_format** format,
6796af4da5dSStephan Aßmus 	media_codec_info** audio, media_codec_info** video)
6806af4da5dSStephan Aßmus {
6816af4da5dSStephan Aßmus 	*audio = NULL;
6826af4da5dSStephan Aßmus 	*video = NULL;
6836af4da5dSStephan Aßmus 	*format = NULL;
6846af4da5dSStephan Aßmus 
6856af4da5dSStephan Aßmus 	FileFormatMenuItem* formatItem =
6866af4da5dSStephan Aßmus 		dynamic_cast<FileFormatMenuItem*>(fFormatMenu->Menu()->FindMarked());
6870e68593eSJohn Scipione 	if (formatItem != NULL)
6886af4da5dSStephan Aßmus 		*format = &(formatItem->fFileFormat);
6896af4da5dSStephan Aßmus 
6906af4da5dSStephan Aßmus 	*audio = *video = NULL;
6916af4da5dSStephan Aßmus 	CodecMenuItem* codecItem =
6926af4da5dSStephan Aßmus 		dynamic_cast<CodecMenuItem*>(fAudioMenu->Menu()->FindMarked());
6930e68593eSJohn Scipione 	if (codecItem != NULL)
6946af4da5dSStephan Aßmus 		*audio =  &(codecItem->fCodecInfo);
6956af4da5dSStephan Aßmus 
6966af4da5dSStephan Aßmus 	codecItem = dynamic_cast<CodecMenuItem*>(fVideoMenu->Menu()->FindMarked());
6970e68593eSJohn Scipione 	if (codecItem != NULL)
6986af4da5dSStephan Aßmus 		*video =  &(codecItem->fCodecInfo);
6996af4da5dSStephan Aßmus }
7006af4da5dSStephan Aßmus 
7016af4da5dSStephan Aßmus 
7026af4da5dSStephan Aßmus void
BuildFormatMenu()7036af4da5dSStephan Aßmus MediaConverterWindow::BuildFormatMenu()
7046af4da5dSStephan Aßmus {
7056af4da5dSStephan Aßmus 	BMenu* menu = fFormatMenu->Menu();
7066af4da5dSStephan Aßmus 	BMenuItem* item;
7070e68593eSJohn Scipione 
7086af4da5dSStephan Aßmus 	// clear out old format menu items
7090e68593eSJohn Scipione 	while ((item = menu->RemoveItem((int32)0)) != NULL)
7106af4da5dSStephan Aßmus 		delete item;
7116af4da5dSStephan Aßmus 
7126af4da5dSStephan Aßmus 	// add menu items for each file format
7136af4da5dSStephan Aßmus 	media_file_format mfi;
7146af4da5dSStephan Aßmus 	int32 cookie = 0;
7156af4da5dSStephan Aßmus 	FileFormatMenuItem* ff_item;
7166af4da5dSStephan Aßmus 	while (get_next_file_format(&cookie, &mfi) == B_OK) {
717575984d2SJessica Hamilton 		if ((mfi.capabilities & media_file_format::B_WRITABLE) == 0)
718575984d2SJessica Hamilton 			continue;
7196af4da5dSStephan Aßmus 		ff_item = new FileFormatMenuItem(&mfi);
7206af4da5dSStephan Aßmus 		menu->AddItem(ff_item);
7216af4da5dSStephan Aßmus 	}
7226af4da5dSStephan Aßmus 
7236af4da5dSStephan Aßmus 	// mark first item
7246af4da5dSStephan Aßmus 	item = menu->ItemAt(0);
7256af4da5dSStephan Aßmus 	if (item != NULL) {
7266af4da5dSStephan Aßmus 		item->SetMarked(true);
7276af4da5dSStephan Aßmus 		((BInvoker*)item)->Invoke();
7286af4da5dSStephan Aßmus 	}
7296af4da5dSStephan Aßmus }
7306af4da5dSStephan Aßmus 
731dd55ed1aSAlex Wilson 
7326af4da5dSStephan Aßmus void
SetFileMessage(const char * message)7336af4da5dSStephan Aßmus MediaConverterWindow::SetFileMessage(const char* message)
7346af4da5dSStephan Aßmus {
735dd55ed1aSAlex Wilson 	fFileStatus->SetText(message);
7366af4da5dSStephan Aßmus }
7376af4da5dSStephan Aßmus 
738dd55ed1aSAlex Wilson 
7396af4da5dSStephan Aßmus void
SetStatusMessage(const char * message)7406af4da5dSStephan Aßmus MediaConverterWindow::SetStatusMessage(const char* message)
7416af4da5dSStephan Aßmus {
742dd55ed1aSAlex Wilson 	fStatus->SetText(message);
7436af4da5dSStephan Aßmus }
7446af4da5dSStephan Aßmus 
7456af4da5dSStephan Aßmus 
7466af4da5dSStephan Aßmus // #pragma mark -
7476af4da5dSStephan Aßmus 
7486af4da5dSStephan Aßmus 
7491c992a52SStephan Aßmus bool
AddSourceFile(BMediaFile * file,const entry_ref & ref)7506af4da5dSStephan Aßmus MediaConverterWindow::AddSourceFile(BMediaFile* file, const entry_ref& ref)
7516af4da5dSStephan Aßmus {
7521c992a52SStephan Aßmus 	if (!fListView->AddMediaItem(file, ref))
7531c992a52SStephan Aßmus 		return false;
7546af4da5dSStephan Aßmus 
7556af4da5dSStephan Aßmus 	if (!fOutputDirSpecified) {
7566af4da5dSStephan Aßmus 		BEntry entry(&ref);
7576af4da5dSStephan Aßmus 		entry.GetParent(&entry);
7586af4da5dSStephan Aßmus 		_SetOutputFolder(entry);
7596af4da5dSStephan Aßmus 	}
7601c992a52SStephan Aßmus 
7611c992a52SStephan Aßmus 	return true;
7626af4da5dSStephan Aßmus }
7636af4da5dSStephan Aßmus 
7646af4da5dSStephan Aßmus 
7656af4da5dSStephan Aßmus void
RemoveSourceFile(int32 index)7666af4da5dSStephan Aßmus MediaConverterWindow::RemoveSourceFile(int32 index)
7676af4da5dSStephan Aßmus {
7686af4da5dSStephan Aßmus 	delete fListView->RemoveItem(index);
7696af4da5dSStephan Aßmus 	fStartDurationTC->SetText("0");
7706af4da5dSStephan Aßmus 	fEndDurationTC->SetText("0");
7716af4da5dSStephan Aßmus }
7726af4da5dSStephan Aßmus 
7736af4da5dSStephan Aßmus 
7746af4da5dSStephan Aßmus int32
CountSourceFiles()7756af4da5dSStephan Aßmus MediaConverterWindow::CountSourceFiles()
7766af4da5dSStephan Aßmus {
7776af4da5dSStephan Aßmus 	return fListView->CountItems();
7786af4da5dSStephan Aßmus }
7796af4da5dSStephan Aßmus 
7806af4da5dSStephan Aßmus 
7816af4da5dSStephan Aßmus status_t
GetSourceFileAt(int32 index,BMediaFile ** _file,entry_ref * ref)7826af4da5dSStephan Aßmus MediaConverterWindow::GetSourceFileAt(int32 index, BMediaFile** _file,
7836af4da5dSStephan Aßmus 	entry_ref* ref)
7846af4da5dSStephan Aßmus {
7856af4da5dSStephan Aßmus 	MediaFileListItem* item = dynamic_cast<MediaFileListItem*>(
7866af4da5dSStephan Aßmus 		fListView->ItemAt(index));
7876af4da5dSStephan Aßmus 	if (item != NULL) {
7886af4da5dSStephan Aßmus 		*_file = item->fMediaFile;
7896af4da5dSStephan Aßmus 		*ref = item->fRef;
7906af4da5dSStephan Aßmus 		return B_OK;
7910e68593eSJohn Scipione 	} else
7926af4da5dSStephan Aßmus 		return B_ERROR;
7936af4da5dSStephan Aßmus }
7946af4da5dSStephan Aßmus 
7956af4da5dSStephan Aßmus 
7966af4da5dSStephan Aßmus void
SourceFileSelectionChanged()7976af4da5dSStephan Aßmus MediaConverterWindow::SourceFileSelectionChanged()
7986af4da5dSStephan Aßmus {
7996af4da5dSStephan Aßmus 	int32 selected = fListView->CurrentSelection();
8006af4da5dSStephan Aßmus 	BMediaFile* file = NULL;
8016af4da5dSStephan Aßmus 	entry_ref ref;
8027730c846SStephan Aßmus 	bool enabled = GetSourceFileAt(selected, &file, &ref) == B_OK;
8036af4da5dSStephan Aßmus 
8046af4da5dSStephan Aßmus 	fPreviewButton->SetEnabled(enabled);
8056af4da5dSStephan Aßmus 	fVideoQualitySlider->SetEnabled(enabled);
8066af4da5dSStephan Aßmus 	fAudioQualitySlider->SetEnabled(enabled);
8076af4da5dSStephan Aßmus 	fStartDurationTC->SetEnabled(enabled);
8086af4da5dSStephan Aßmus 	fEndDurationTC->SetEnabled(enabled);
8096af4da5dSStephan Aßmus 
8107730c846SStephan Aßmus 	BString duration;
8117730c846SStephan Aßmus 	if (enabled) {
8127730c846SStephan Aßmus 		fInfoView->Update(file, &ref);
8136af4da5dSStephan Aßmus 		// HACK: get the fInfoView to update the duration "synchronously"
8146af4da5dSStephan Aßmus 		UpdateIfNeeded();
8157730c846SStephan Aßmus 		duration << fInfoView->Duration() / 1000;
8167730c846SStephan Aßmus 	} else
8177730c846SStephan Aßmus 		duration = "0";
8186af4da5dSStephan Aßmus 
8196af4da5dSStephan Aßmus 	// update duration text controls
8206af4da5dSStephan Aßmus 	fStartDurationTC->SetText("0");
8216af4da5dSStephan Aßmus 	fEndDurationTC->SetText(duration.String());
8226af4da5dSStephan Aßmus }
8236af4da5dSStephan Aßmus 
8246af4da5dSStephan Aßmus 
8256af4da5dSStephan Aßmus // #pragma mark -
8266af4da5dSStephan Aßmus 
8276af4da5dSStephan Aßmus 
8286af4da5dSStephan Aßmus void
SetEnabled(bool enabled,bool convertEnabled)8296af4da5dSStephan Aßmus MediaConverterWindow::SetEnabled(bool enabled, bool convertEnabled)
8306af4da5dSStephan Aßmus {
8316af4da5dSStephan Aßmus 	fConvertButton->SetEnabled(convertEnabled);
8326af4da5dSStephan Aßmus 	if (enabled == fEnabled)
8336af4da5dSStephan Aßmus 		return;
8346af4da5dSStephan Aßmus 
8356af4da5dSStephan Aßmus 	fFormatMenu->SetEnabled(enabled);
8366af4da5dSStephan Aßmus 	fAudioMenu->SetEnabled(enabled);
8376af4da5dSStephan Aßmus 	fVideoMenu->SetEnabled(enabled);
8386af4da5dSStephan Aßmus 	fListView->SetEnabled(enabled);
8396af4da5dSStephan Aßmus 	fStartDurationTC->SetEnabled(enabled);
8406af4da5dSStephan Aßmus 	fEndDurationTC->SetEnabled(enabled);
8416af4da5dSStephan Aßmus 
8426af4da5dSStephan Aßmus 	fEnabled = enabled;
8436af4da5dSStephan Aßmus }
8446af4da5dSStephan Aßmus 
8456af4da5dSStephan Aßmus 
8466af4da5dSStephan Aßmus bool
IsEnabled()8476af4da5dSStephan Aßmus MediaConverterWindow::IsEnabled()
8486af4da5dSStephan Aßmus {
8496af4da5dSStephan Aßmus 	return fEnabled;
8506af4da5dSStephan Aßmus }
8516af4da5dSStephan Aßmus 
8526af4da5dSStephan Aßmus 
8536af4da5dSStephan Aßmus const char*
StartDuration() const8546af4da5dSStephan Aßmus MediaConverterWindow::StartDuration() const
8556af4da5dSStephan Aßmus {
8566af4da5dSStephan Aßmus 	return fStartDurationTC->Text();
8576af4da5dSStephan Aßmus }
8586af4da5dSStephan Aßmus 
8596af4da5dSStephan Aßmus 
8606af4da5dSStephan Aßmus const char*
EndDuration() const8616af4da5dSStephan Aßmus MediaConverterWindow::EndDuration() const
8626af4da5dSStephan Aßmus {
8636af4da5dSStephan Aßmus 	return fEndDurationTC->Text();
8646af4da5dSStephan Aßmus }
8656af4da5dSStephan Aßmus 
8666af4da5dSStephan Aßmus 
8676af4da5dSStephan Aßmus BDirectory
OutputDirectory() const8686af4da5dSStephan Aßmus MediaConverterWindow::OutputDirectory() const
8696af4da5dSStephan Aßmus {
8706af4da5dSStephan Aßmus 	return fOutputDir;
8716af4da5dSStephan Aßmus }
8726af4da5dSStephan Aßmus 
8736af4da5dSStephan Aßmus 
8746af4da5dSStephan Aßmus void
SetAudioQualityLabel(const char * label)8756af4da5dSStephan Aßmus MediaConverterWindow::SetAudioQualityLabel(const char* label)
8766af4da5dSStephan Aßmus {
8776af4da5dSStephan Aßmus 	fAudioQualitySlider->SetLabel(label);
8786af4da5dSStephan Aßmus }
8796af4da5dSStephan Aßmus 
8806af4da5dSStephan Aßmus 
8816af4da5dSStephan Aßmus void
SetVideoQualityLabel(const char * label)8826af4da5dSStephan Aßmus MediaConverterWindow::SetVideoQualityLabel(const char* label)
8836af4da5dSStephan Aßmus {
8846af4da5dSStephan Aßmus 	fVideoQualitySlider->SetLabel(label);
8856af4da5dSStephan Aßmus }
8866af4da5dSStephan Aßmus 
8876af4da5dSStephan Aßmus 
888a42b9a43SJohn Scipione void
TruncateOutputFolderPath()889a42b9a43SJohn Scipione MediaConverterWindow::TruncateOutputFolderPath()
890a42b9a43SJohn Scipione {
891a42b9a43SJohn Scipione 	BEntry entry;
892a42b9a43SJohn Scipione 	fOutputDir.GetEntry(&entry);
893a42b9a43SJohn Scipione 	BPath path;
894a42b9a43SJohn Scipione 	entry.GetPath(&path);
895a42b9a43SJohn Scipione 	BString pathString(path.Path());
896a42b9a43SJohn Scipione 	float maxWidth = fVideoMenu->MenuBar()->Frame().Width();
897a42b9a43SJohn Scipione 
898a42b9a43SJohn Scipione 	fOutputFolder->TruncateString(&pathString, B_TRUNCATE_MIDDLE, maxWidth);
899a42b9a43SJohn Scipione 	fOutputFolder->SetText(pathString.String());
9004dcf7ed2SJohn Scipione 	if (fOutputFolder->StringWidth(path.Path()) > maxWidth)
9014dcf7ed2SJohn Scipione 		fOutputFolder->SetToolTip(path.Path());
9024dcf7ed2SJohn Scipione 	else
9034dcf7ed2SJohn Scipione 		fOutputFolder->SetToolTip((const char*)NULL);
904a42b9a43SJohn Scipione }
905a42b9a43SJohn Scipione 
906a42b9a43SJohn Scipione 
9076af4da5dSStephan Aßmus // #pragma mark -
9086af4da5dSStephan Aßmus 
9096af4da5dSStephan Aßmus 
9106af4da5dSStephan Aßmus void
_UpdateLabels()9116af4da5dSStephan Aßmus MediaConverterWindow::_UpdateLabels()
9126af4da5dSStephan Aßmus {
91330456952SEmir SARI 	BNumberFormat fNumberFormat;
91430456952SEmir SARI 
915dd55ed1aSAlex Wilson 	if (fSourcesBox != NULL) {
916ae0f70fcSAdrien Destugues 		fSourcesBox->SetLabel(B_TRANSLATE("Source files"));
917dd55ed1aSAlex Wilson 		_UpdateBBoxLayoutInsets(fSourcesBox);
918dd55ed1aSAlex Wilson 	}
9196af4da5dSStephan Aßmus 
920dd55ed1aSAlex Wilson 	if (fInfoBox != NULL)
921ae0f70fcSAdrien Destugues 		fInfoBox->SetLabel(B_TRANSLATE("File details"));
9226af4da5dSStephan Aßmus 
923dd55ed1aSAlex Wilson 	if (fOutputBox != NULL) {
924ae0f70fcSAdrien Destugues 		fOutputBox->SetLabel(B_TRANSLATE("Output format"));
925dd55ed1aSAlex Wilson 		_UpdateBBoxLayoutInsets(fOutputBox);
926dd55ed1aSAlex Wilson 	}
9276af4da5dSStephan Aßmus 
928dd55ed1aSAlex Wilson 	if (fConvertButton != NULL)
929ae0f70fcSAdrien Destugues 		fConvertButton->SetLabel(B_TRANSLATE("Convert"));
9306af4da5dSStephan Aßmus 
931dd55ed1aSAlex Wilson 	if (fPreviewButton != NULL)
932ae0f70fcSAdrien Destugues 		fPreviewButton->SetLabel(B_TRANSLATE("Preview"));
9336af4da5dSStephan Aßmus 
934dd55ed1aSAlex Wilson 	if (fDestButton != NULL)
935ae0f70fcSAdrien Destugues 		fDestButton->SetLabel(B_TRANSLATE("Output folder"));
9366af4da5dSStephan Aßmus 
9376af4da5dSStephan Aßmus 	if (fVideoQualitySlider != NULL) {
93830456952SEmir SARI 		BString buffer;
93930456952SEmir SARI 		BString data;
94030456952SEmir SARI 		double percentValue = fVideoQuality / 100.0;
94130456952SEmir SARI 
94230456952SEmir SARI 		if (fNumberFormat.FormatPercent(data, percentValue) != B_OK)
943*37d99b7eSEmir SARI 			data.SetToFormat("%d%%", (int8)fVideoQuality);
94430456952SEmir SARI 
94530456952SEmir SARI 		buffer.SetToFormat(B_TRANSLATE("Video quality: %s"), data.String());
94630456952SEmir SARI 		fVideoQuality = (int)percentValue;
94730456952SEmir SARI 		fVideoQualitySlider->SetLabel(buffer.String());
94830456952SEmir SARI 		fVideoQualitySlider->SetLimitLabels(B_TRANSLATE("Low"), B_TRANSLATE("High"));
9496af4da5dSStephan Aßmus 	}
9506af4da5dSStephan Aßmus 
9516af4da5dSStephan Aßmus 	if (fAudioQualitySlider != NULL) {
95230456952SEmir SARI 		BString buffer;
95330456952SEmir SARI 		BString data;
95430456952SEmir SARI 		double percentValue = fAudioQuality / 100.0;
95530456952SEmir SARI 
95630456952SEmir SARI 		if (fNumberFormat.FormatPercent(data, percentValue) != B_OK) {
957*37d99b7eSEmir SARI 			data.SetToFormat("%d%%", (int8)fAudioQuality);
95830456952SEmir SARI 		}
95930456952SEmir SARI 
96030456952SEmir SARI 		buffer.SetToFormat(B_TRANSLATE("Audio quality: %s"), data.String());
96130456952SEmir SARI 		fAudioQuality = (int)percentValue;
96230456952SEmir SARI 		fAudioQualitySlider->SetLabel(buffer.String());
96330456952SEmir SARI 		fAudioQualitySlider->SetLimitLabels(B_TRANSLATE("Low"), B_TRANSLATE("High"));
9646af4da5dSStephan Aßmus 	}
9656af4da5dSStephan Aßmus 
966dd55ed1aSAlex Wilson 	if (fStartDurationTC != NULL)
967ae0f70fcSAdrien Destugues 		fStartDurationTC->SetLabel(B_TRANSLATE("Start [ms]: "));
968dd55ed1aSAlex Wilson 
969dd55ed1aSAlex Wilson 	if (fEndDurationTC != NULL)
970ae0f70fcSAdrien Destugues 		fEndDurationTC->SetLabel(B_TRANSLATE("End   [ms]: "));
9716af4da5dSStephan Aßmus 
9726af4da5dSStephan Aßmus 	if (fFormatMenu != NULL)
973ae0f70fcSAdrien Destugues 		fFormatMenu->SetLabel(B_TRANSLATE("File format:"));
974dd55ed1aSAlex Wilson 
9756af4da5dSStephan Aßmus 	if (fAudioMenu != NULL)
976ae0f70fcSAdrien Destugues 		fAudioMenu->SetLabel(B_TRANSLATE("Audio encoding:"));
977dd55ed1aSAlex Wilson 
9786af4da5dSStephan Aßmus 	if (fVideoMenu != NULL)
979ae0f70fcSAdrien Destugues 		fVideoMenu->SetLabel(B_TRANSLATE("Video encoding:"));
9806af4da5dSStephan Aßmus 
981ae0f70fcSAdrien Destugues 	SetFileMessage(B_TRANSLATE("Drop media files onto this window"));
9826af4da5dSStephan Aßmus }
9836af4da5dSStephan Aßmus 
9846af4da5dSStephan Aßmus 
9856af4da5dSStephan Aßmus void
_UpdateBBoxLayoutInsets(BBox * box)986dd55ed1aSAlex Wilson MediaConverterWindow::_UpdateBBoxLayoutInsets(BBox* box)
987dd55ed1aSAlex Wilson {
988dd55ed1aSAlex Wilson 	BTwoDimensionalLayout* layout
989dd55ed1aSAlex Wilson 		= dynamic_cast<BTwoDimensionalLayout*>(box->GetLayout());
9907730c846SStephan Aßmus 	if (layout != NULL) {
991dd55ed1aSAlex Wilson 		float padding = be_control_look->DefaultItemSpacing();
992dd55ed1aSAlex Wilson 		layout->SetInsets(padding, box->TopBorderOffset() + padding, padding,
993dd55ed1aSAlex Wilson 			padding);
994dd55ed1aSAlex Wilson 	}
995dd55ed1aSAlex Wilson }
996dd55ed1aSAlex Wilson 
997dd55ed1aSAlex Wilson 
998dd55ed1aSAlex Wilson void
_DestroyMenu()9996af4da5dSStephan Aßmus MediaConverterWindow::_DestroyMenu()
10006af4da5dSStephan Aßmus {
10010e68593eSJohn Scipione 	BMenu* menu;
10026af4da5dSStephan Aßmus 
10030e68593eSJohn Scipione 	while ((menu = fMenuBar->SubmenuAt(0)) != NULL) {
10040e68593eSJohn Scipione 		fMenuBar->RemoveItem(menu);
10050e68593eSJohn Scipione 		delete menu;
10066af4da5dSStephan Aßmus 	}
10076af4da5dSStephan Aßmus }
10086af4da5dSStephan Aßmus 
10096af4da5dSStephan Aßmus 
10106af4da5dSStephan Aßmus void
_CreateMenu()10116af4da5dSStephan Aßmus MediaConverterWindow::_CreateMenu()
10126af4da5dSStephan Aßmus {
10136af4da5dSStephan Aßmus 	BMenu* menu;
10140e68593eSJohn Scipione 	BMenuItem* item;
10156af4da5dSStephan Aßmus 
1016546208a5SOliver Tappe 	menu = new BMenu(B_TRANSLATE_CONTEXT("File", "Menu"));
10170e68593eSJohn Scipione 	item = new BMenuItem(B_TRANSLATE_CONTEXT("Open" B_UTF8_ELLIPSIS, "Menu"),
1018dd55ed1aSAlex Wilson 		new BMessage(OPEN_FILE_MESSAGE), 'O');
10196af4da5dSStephan Aßmus 	menu->AddItem(item);
10206af4da5dSStephan Aßmus 	menu->AddSeparatorItem();
1021546208a5SOliver Tappe 	item = new BMenuItem(B_TRANSLATE_CONTEXT("Quit", "Menu"),
1022ae0f70fcSAdrien Destugues 		new BMessage(QUIT_MESSAGE), 'Q');
10236af4da5dSStephan Aßmus 	menu->AddItem(item);
10246af4da5dSStephan Aßmus 
10256af4da5dSStephan Aßmus 	fMenuBar->AddItem(menu);
10266af4da5dSStephan Aßmus }
10276af4da5dSStephan Aßmus 
10286af4da5dSStephan Aßmus 
10296af4da5dSStephan Aßmus void
_SetOutputFolder(BEntry entry)10306af4da5dSStephan Aßmus MediaConverterWindow::_SetOutputFolder(BEntry entry)
10316af4da5dSStephan Aßmus {
1032fdd3fd9eSVivek Roy 	BPath path;
1033fdd3fd9eSVivek Roy 	entry.GetPath(&path);
1034fdd3fd9eSVivek Roy 	if (access(path.Path(), W_OK) != -1) {
1035a42b9a43SJohn Scipione 		fOutputDir.SetTo(&entry);
1036fdd3fd9eSVivek Roy 	} else {
1037fdd3fd9eSVivek Roy 		BString errorString(B_TRANSLATE("Error writing to location: %strPath%."
1038fdd3fd9eSVivek Roy 			" Defaulting to location: /boot/home"));
1039fdd3fd9eSVivek Roy 		errorString.ReplaceFirst("%strPath%", path.Path());
1040fdd3fd9eSVivek Roy 		BAlert* alert = new BAlert(B_TRANSLATE("Error"),
1041fdd3fd9eSVivek Roy 			errorString.String(), B_TRANSLATE("OK"));
1042fdd3fd9eSVivek Roy 		alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
1043fdd3fd9eSVivek Roy 		alert->Go();
1044fdd3fd9eSVivek Roy 		fOutputDir.SetTo("/boot/home");
1045fdd3fd9eSVivek Roy 	}
1046a42b9a43SJohn Scipione 	TruncateOutputFolderPath();
10476af4da5dSStephan Aßmus }
1048