xref: /haiku/src/apps/mediaconverter/MediaConverterWindow.cpp (revision 0e68593ea3e1761851833723f9f551677ce49d4c)
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>
126af4da5dSStephan Aßmus 
136af4da5dSStephan Aßmus #include <Alert.h>
146af4da5dSStephan Aßmus #include <Application.h>
156af4da5dSStephan Aßmus #include <Box.h>
166af4da5dSStephan Aßmus #include <Button.h>
17ae0f70fcSAdrien Destugues #include <Catalog.h>
18dd55ed1aSAlex Wilson #include <ControlLook.h>
196af4da5dSStephan Aßmus #include <FilePanel.h>
20fc4d98a2SPhilippe Saint-Pierre #include <FindDirectory.h>
21dd55ed1aSAlex Wilson #include <LayoutBuilder.h>
22ae0f70fcSAdrien Destugues #include <Locale.h>
236af4da5dSStephan Aßmus #include <Menu.h>
246af4da5dSStephan Aßmus #include <MenuBar.h>
256af4da5dSStephan Aßmus #include <MenuField.h>
266af4da5dSStephan Aßmus #include <MenuItem.h>
276af4da5dSStephan Aßmus #include <Path.h>
286af4da5dSStephan Aßmus #include <PopUpMenu.h>
296af4da5dSStephan Aßmus #include <Roster.h>
306af4da5dSStephan Aßmus #include <ScrollBar.h>
316af4da5dSStephan Aßmus #include <ScrollView.h>
326af4da5dSStephan Aßmus #include <Slider.h>
336af4da5dSStephan Aßmus #include <StringView.h>
346af4da5dSStephan Aßmus #include <TextControl.h>
356af4da5dSStephan Aßmus 
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 
46a42b9a43SJohn Scipione static const unsigned int kMinSourceWidth = 12;
47f29499e7SJohn Scipione static const unsigned int kQualitySliderWidth = 28;
48a42b9a43SJohn Scipione static const unsigned int kDurationWidth = 10;
49a42b9a43SJohn Scipione 
50a42b9a43SJohn Scipione 
516af4da5dSStephan Aßmus // #pragma mark - DirectoryFilter
526af4da5dSStephan Aßmus 
536af4da5dSStephan Aßmus 
5460b6f368SStephan Aßmus class DirectoryFilter : public BRefFilter {
556af4da5dSStephan Aßmus public:
566af4da5dSStephan Aßmus 	DirectoryFilter() {};
576af4da5dSStephan Aßmus 	virtual bool Filter(const entry_ref* ref,
5860b6f368SStephan Aßmus 		BNode* node, struct stat_beos* st, const char* filetype)
596af4da5dSStephan Aßmus 	{
606af4da5dSStephan Aßmus 		return node->IsDirectory();
616af4da5dSStephan Aßmus 	}
626af4da5dSStephan Aßmus };
636af4da5dSStephan Aßmus 
646af4da5dSStephan Aßmus 
656af4da5dSStephan Aßmus // #pragma mark - FileFormatMenuItem
666af4da5dSStephan Aßmus 
676af4da5dSStephan Aßmus 
686af4da5dSStephan Aßmus class FileFormatMenuItem : public BMenuItem {
696af4da5dSStephan Aßmus public:
706af4da5dSStephan Aßmus 	FileFormatMenuItem(media_file_format* format);
716af4da5dSStephan Aßmus 	virtual ~FileFormatMenuItem();
726af4da5dSStephan Aßmus 
736af4da5dSStephan Aßmus 	media_file_format fFileFormat;
746af4da5dSStephan Aßmus };
756af4da5dSStephan Aßmus 
766af4da5dSStephan Aßmus 
776af4da5dSStephan Aßmus FileFormatMenuItem::FileFormatMenuItem(media_file_format* format)
78dd55ed1aSAlex Wilson 	:
79dd55ed1aSAlex Wilson 	BMenuItem(format->pretty_name, new BMessage(FORMAT_SELECT_MESSAGE))
806af4da5dSStephan Aßmus {
816af4da5dSStephan Aßmus 	memcpy(&fFileFormat, format, sizeof(fFileFormat));
826af4da5dSStephan Aßmus }
836af4da5dSStephan Aßmus 
846af4da5dSStephan Aßmus 
856af4da5dSStephan Aßmus FileFormatMenuItem::~FileFormatMenuItem()
866af4da5dSStephan Aßmus {
876af4da5dSStephan Aßmus }
886af4da5dSStephan Aßmus 
896af4da5dSStephan Aßmus 
906af4da5dSStephan Aßmus // #pragma mark - CodecMenuItem
916af4da5dSStephan Aßmus 
926af4da5dSStephan Aßmus 
936af4da5dSStephan Aßmus class CodecMenuItem : public BMenuItem {
946af4da5dSStephan Aßmus public:
95*0e68593eSJohn Scipione 	CodecMenuItem(media_codec_info* ci, uint32 message_type);
966af4da5dSStephan Aßmus 	virtual ~CodecMenuItem();
976af4da5dSStephan Aßmus 
986af4da5dSStephan Aßmus 	media_codec_info fCodecInfo;
996af4da5dSStephan Aßmus };
1006af4da5dSStephan Aßmus 
1016af4da5dSStephan Aßmus 
102*0e68593eSJohn Scipione CodecMenuItem::CodecMenuItem(media_codec_info* ci, uint32 message_type)
103dd55ed1aSAlex Wilson 	:
104*0e68593eSJohn Scipione 	BMenuItem(ci->pretty_name, new BMessage(message_type))
1056af4da5dSStephan Aßmus {
1066af4da5dSStephan Aßmus 	memcpy(&fCodecInfo, ci, sizeof(fCodecInfo));
1076af4da5dSStephan Aßmus }
1086af4da5dSStephan Aßmus 
1096af4da5dSStephan Aßmus 
1106af4da5dSStephan Aßmus CodecMenuItem::~CodecMenuItem()
1116af4da5dSStephan Aßmus {
1126af4da5dSStephan Aßmus }
1136af4da5dSStephan Aßmus 
1146af4da5dSStephan Aßmus 
115a42b9a43SJohn Scipione // #pragma mark - OutputBox
116a42b9a43SJohn Scipione 
117a42b9a43SJohn Scipione 
118a42b9a43SJohn Scipione class OutputBox : public BBox {
119a42b9a43SJohn Scipione public:
120a42b9a43SJohn Scipione 	OutputBox(border_style border, BView* child);
121a42b9a43SJohn Scipione 	virtual void FrameResized(float width, float height)
122a42b9a43SJohn Scipione 	{
123a42b9a43SJohn Scipione 		MediaConverterWindow* window
124a42b9a43SJohn Scipione 			= dynamic_cast<MediaConverterWindow*>(Window());
125a42b9a43SJohn Scipione 		if (window != NULL)
126a42b9a43SJohn Scipione 			window->TruncateOutputFolderPath();
127a42b9a43SJohn Scipione 		BBox::FrameResized(width, height);
128a42b9a43SJohn Scipione 	}
129a42b9a43SJohn Scipione };
130a42b9a43SJohn Scipione 
131a42b9a43SJohn Scipione 
132a42b9a43SJohn Scipione OutputBox::OutputBox(border_style border, BView* child)
133a42b9a43SJohn Scipione 	:
134a42b9a43SJohn Scipione 	BBox(border, child)
135a42b9a43SJohn Scipione {
136a42b9a43SJohn Scipione }
137a42b9a43SJohn Scipione 
138a42b9a43SJohn Scipione 
1396af4da5dSStephan Aßmus // #pragma mark - MediaConverterWindow
1406af4da5dSStephan Aßmus 
1416af4da5dSStephan Aßmus 
1426af4da5dSStephan Aßmus MediaConverterWindow::MediaConverterWindow(BRect frame)
143dd55ed1aSAlex Wilson 	:
144*0e68593eSJohn Scipione 	BWindow(frame, B_TRANSLATE_SYSTEM_NAME("MediaConverter"),
145*0e68593eSJohn Scipione 		B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, B_NOT_ZOOMABLE
146*0e68593eSJohn Scipione 		| B_NOT_V_RESIZABLE | B_ASYNCHRONOUS_CONTROLS
147*0e68593eSJohn Scipione 		| B_AUTO_UPDATE_SIZE_LIMITS),
148dd55ed1aSAlex Wilson 	fVideoQuality(75),
149dd55ed1aSAlex Wilson 	fAudioQuality(75),
150dd55ed1aSAlex Wilson 	fSaveFilePanel(NULL),
151dd55ed1aSAlex Wilson 	fOpenFilePanel(NULL),
152dd55ed1aSAlex Wilson 	fOutputDirSpecified(false),
153dd55ed1aSAlex Wilson 	fEnabled(true),
154dd55ed1aSAlex Wilson 	fConverting(false),
155dd55ed1aSAlex Wilson 	fCancelling(false)
1566af4da5dSStephan Aßmus {
157b78760b9SPhilippe Saint-Pierre 	BPath outputDir;
158b78760b9SPhilippe Saint-Pierre 	if (find_directory(B_USER_DIRECTORY, &outputDir) != B_OK)
159b78760b9SPhilippe Saint-Pierre 		outputDir.SetTo("/boot/home");
160b78760b9SPhilippe Saint-Pierre 	fOutputDir.SetTo(outputDir.Path());
1616af4da5dSStephan Aßmus 
162dd55ed1aSAlex Wilson 	fMenuBar = new BMenuBar("menubar");
1636af4da5dSStephan Aßmus 	_CreateMenu();
1646af4da5dSStephan Aßmus 
165a9adf1a6SJohn Scipione 	float padding = be_control_look->DefaultItemSpacing();
166a9adf1a6SJohn Scipione 
167dd55ed1aSAlex Wilson 	fListView = new MediaFileListView();
168a42b9a43SJohn Scipione 	fListView->SetExplicitMinSize(BSize(padding * kMinSourceWidth, B_SIZE_UNSET));
169dd55ed1aSAlex Wilson 	BScrollView* scroller = new BScrollView(NULL, fListView, 0, false, true);
1706af4da5dSStephan Aßmus 
1716af4da5dSStephan Aßmus 	// file list view box
172dd55ed1aSAlex Wilson 	fSourcesBox = new BBox(B_FANCY_BORDER, scroller);
173dd55ed1aSAlex Wilson 	fSourcesBox->SetLayout(new BGroupLayout(B_HORIZONTAL, 0));
174a42b9a43SJohn Scipione 		// fSourcesBox's layout adjusted in _UpdateLabels
1756af4da5dSStephan Aßmus 
176a42b9a43SJohn Scipione 	// info box
177dd55ed1aSAlex Wilson 	fInfoView = new MediaFileInfoView();
178a42b9a43SJohn Scipione 	fInfoView->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH,
179a42b9a43SJohn Scipione 		B_ALIGN_VERTICAL_UNSET));
180dd55ed1aSAlex Wilson 	fInfoBox = new BBox(B_FANCY_BORDER, fInfoView);
1817730c846SStephan Aßmus 
182a42b9a43SJohn Scipione 	// output menu fields
183ae0f70fcSAdrien Destugues 	fFormatMenu = new BMenuField(NULL, B_TRANSLATE("File format:"),
184ae0f70fcSAdrien Destugues 		new BPopUpMenu(""));
185ae0f70fcSAdrien Destugues 	fAudioMenu = new BMenuField(NULL, B_TRANSLATE("Audio encoding:"),
186ae0f70fcSAdrien Destugues 		new BPopUpMenu(""));
187ae0f70fcSAdrien Destugues 	fVideoMenu = new BMenuField(NULL, B_TRANSLATE("Video encoding:"),
188ae0f70fcSAdrien Destugues 		new BPopUpMenu(""));
1896af4da5dSStephan Aßmus 
1906af4da5dSStephan Aßmus 	// output folder
191ae0f70fcSAdrien Destugues 	fDestButton = new BButton(B_TRANSLATE("Output folder"),
192dd55ed1aSAlex Wilson 		new BMessage(OUTPUT_FOLDER_MESSAGE));
193dd55ed1aSAlex Wilson 	BAlignment labelAlignment(be_control_look->DefaultLabelAlignment());
194b78760b9SPhilippe Saint-Pierre 	fOutputFolder = new BStringView(NULL, outputDir.Path());
195dd55ed1aSAlex Wilson 	fOutputFolder->SetExplicitAlignment(labelAlignment);
1966af4da5dSStephan Aßmus 
1976af4da5dSStephan Aßmus 	// start/end duration
1984d891825SJohn Scipione 	fStartDurationTC = new BTextControl(NULL, "0", NULL);
199a42b9a43SJohn Scipione 	BLayoutItem* startDuration = fStartDurationTC->CreateTextViewLayoutItem();
200a42b9a43SJohn Scipione 	startDuration->SetExplicitSize(BSize(padding * kDurationWidth, B_SIZE_UNSET));
201a42b9a43SJohn Scipione 	startDuration->SetExplicitAlignment(BAlignment(B_ALIGN_LEFT,
202a42b9a43SJohn Scipione 		B_ALIGN_VERTICAL_CENTER));
2034d891825SJohn Scipione 	fEndDurationTC = new BTextControl(NULL, "0", NULL);
204a42b9a43SJohn Scipione 	BLayoutItem* endDuration = fEndDurationTC->CreateTextViewLayoutItem();
205a42b9a43SJohn Scipione 	endDuration->SetExplicitSize(BSize(padding * kDurationWidth, B_SIZE_UNSET));
206a42b9a43SJohn Scipione 	endDuration->SetExplicitAlignment(BAlignment(B_ALIGN_LEFT,
207a42b9a43SJohn Scipione 		B_ALIGN_VERTICAL_CENTER));
2086af4da5dSStephan Aßmus 
209a42b9a43SJohn Scipione 	// video quality
210dd55ed1aSAlex Wilson 	fVideoQualitySlider = new BSlider("VSlider", "" ,
211dd55ed1aSAlex Wilson 		new BMessage(VIDEO_QUALITY_CHANGED_MESSAGE), 1, 100, B_HORIZONTAL);
21253bb96c5SJohn Scipione 	fVideoQualitySlider->SetModificationMessage(
21353bb96c5SJohn Scipione 		new BMessage(VIDEO_QUALITY_CHANGED_MESSAGE));
2146af4da5dSStephan Aßmus 	fVideoQualitySlider->SetValue(fVideoQuality);
2156af4da5dSStephan Aßmus 	fVideoQualitySlider->SetEnabled(false);
216f29499e7SJohn Scipione 	fVideoQualitySlider->SetExplicitSize(BSize(padding * kQualitySliderWidth,
217f29499e7SJohn Scipione 		B_SIZE_UNSET));
2186af4da5dSStephan Aßmus 
219a42b9a43SJohn Scipione 	// audio quality
220dd55ed1aSAlex Wilson 	fAudioQualitySlider = new BSlider("ASlider", "" ,
221dd55ed1aSAlex Wilson 		new BMessage(AUDIO_QUALITY_CHANGED_MESSAGE), 1, 100, B_HORIZONTAL);
22253bb96c5SJohn Scipione 	fAudioQualitySlider->SetModificationMessage(
22353bb96c5SJohn Scipione 		new BMessage(AUDIO_QUALITY_CHANGED_MESSAGE));
2246af4da5dSStephan Aßmus 	fAudioQualitySlider->SetValue(fAudioQuality);
2256af4da5dSStephan Aßmus 	fAudioQualitySlider->SetEnabled(false);
226f29499e7SJohn Scipione 	fAudioQualitySlider->SetExplicitSize(BSize(padding * kQualitySliderWidth,
227f29499e7SJohn Scipione 		B_SIZE_UNSET));
228dd55ed1aSAlex Wilson 
229a42b9a43SJohn Scipione 	// output format box
230a42b9a43SJohn Scipione 	BView* outputGrid = BLayoutBuilder::Grid<>()
23183010212SJohn Scipione 		.Add(fFormatMenu->CreateLabelLayoutItem(), 0, 0)
23283010212SJohn Scipione 		.Add(fFormatMenu->CreateMenuBarLayoutItem(), 1, 0)
23383010212SJohn Scipione 		.Add(fAudioMenu->CreateLabelLayoutItem(), 0, 1)
23483010212SJohn Scipione 		.Add(fAudioMenu->CreateMenuBarLayoutItem(), 1, 1)
23583010212SJohn Scipione 		.Add(fVideoMenu->CreateLabelLayoutItem(), 0, 2)
23683010212SJohn Scipione 		.Add(fVideoMenu->CreateMenuBarLayoutItem(), 1, 2)
237dd55ed1aSAlex Wilson 		.Add(fDestButton, 0, 3)
238dd55ed1aSAlex Wilson 		.Add(fOutputFolder, 1, 3)
23983010212SJohn Scipione 		.Add(fStartDurationTC->CreateLabelLayoutItem(), 0, 4)
240a42b9a43SJohn Scipione 		.Add(startDuration, 1, 4)
24183010212SJohn Scipione 		.Add(fEndDurationTC->CreateLabelLayoutItem(), 0, 5)
242a42b9a43SJohn Scipione 		.Add(endDuration, 1, 5)
243dd55ed1aSAlex Wilson 		.Add(fVideoQualitySlider, 0, 6, 2, 1)
244a42b9a43SJohn Scipione 		.Add(fAudioQualitySlider, 0, 7, 2, 1)
245a42b9a43SJohn Scipione 		.View();
246a42b9a43SJohn Scipione 	outputGrid->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH,
247a42b9a43SJohn Scipione 		B_ALIGN_USE_FULL_HEIGHT));
248a42b9a43SJohn Scipione 	fOutputBox = new OutputBox(B_FANCY_BORDER, outputGrid);
249a42b9a43SJohn Scipione 	fOutputBox->SetLayout(new BGroupLayout(B_HORIZONTAL, 0));
250a42b9a43SJohn Scipione 		// fOutputBox's layout adjusted in _UpdateLabels
2516af4da5dSStephan Aßmus 
2526af4da5dSStephan Aßmus 	// buttons
253ae0f70fcSAdrien Destugues 	fPreviewButton = new BButton(B_TRANSLATE("Preview"),
254dd55ed1aSAlex Wilson 		new BMessage(PREVIEW_MESSAGE));
2556af4da5dSStephan Aßmus 	fPreviewButton->SetEnabled(false);
2566af4da5dSStephan Aßmus 
257ae0f70fcSAdrien Destugues 	fConvertButton = new BButton(B_TRANSLATE("Convert"),
258dd55ed1aSAlex Wilson 		new BMessage(CONVERT_BUTTON_MESSAGE));
2596af4da5dSStephan Aßmus 
260dd55ed1aSAlex Wilson 	// Status views
261dd55ed1aSAlex Wilson 	fStatus = new BStringView(NULL, NULL);
262dd55ed1aSAlex Wilson 	fStatus->SetExplicitAlignment(labelAlignment);
263dd55ed1aSAlex Wilson 	fFileStatus = new BStringView(NULL, NULL);
264dd55ed1aSAlex Wilson 	fFileStatus->SetExplicitAlignment(labelAlignment);
2656af4da5dSStephan Aßmus 
2666af4da5dSStephan Aßmus 	SetStatusMessage("");
2676af4da5dSStephan Aßmus 	_UpdateLabels();
2686af4da5dSStephan Aßmus 
269dd55ed1aSAlex Wilson 	BLayoutBuilder::Group<>(this, B_VERTICAL, 0)
270dd55ed1aSAlex Wilson 		.SetInsets(0, 0, 0, 0)
271dd55ed1aSAlex Wilson 		.Add(fMenuBar)
2727730c846SStephan Aßmus 		.AddSplit(B_HORIZONTAL, padding / 2)
273dd55ed1aSAlex Wilson 			.SetInsets(padding, padding, padding, padding)
2747730c846SStephan Aßmus 			.Add(fSourcesBox, 0.4)
2757730c846SStephan Aßmus 			.AddGroup(B_VERTICAL, padding, 0.6)
2767730c846SStephan Aßmus 				.Add(fInfoBox)
2777730c846SStephan Aßmus 				.Add(fOutputBox)
2787730c846SStephan Aßmus 			.End()
2797730c846SStephan Aßmus 		.End()
2807730c846SStephan Aßmus 		.AddGrid(padding, padding)
2817730c846SStephan Aßmus 			.SetInsets(padding, 0, padding, padding)
282dd55ed1aSAlex Wilson 			.Add(fStatus, 0, 0)
283dd55ed1aSAlex Wilson 			.Add(fFileStatus, 0, 1)
2849b2ea762SAlex Wilson 			.Add(BSpaceLayoutItem::CreateGlue(), 1, 0)
285dd55ed1aSAlex Wilson 			.Add(fPreviewButton, 2, 0)
2867730c846SStephan Aßmus 			.Add(fConvertButton, 3, 0)
287*0e68593eSJohn Scipione 		.End();
2886af4da5dSStephan Aßmus }
2896af4da5dSStephan Aßmus 
2906af4da5dSStephan Aßmus 
2916af4da5dSStephan Aßmus MediaConverterWindow::~MediaConverterWindow()
2926af4da5dSStephan Aßmus {
2933c0f9a7cSKarsten Heimrich 	delete fSaveFilePanel;
2943c0f9a7cSKarsten Heimrich 	delete fOpenFilePanel;
2956af4da5dSStephan Aßmus }
2966af4da5dSStephan Aßmus 
2976af4da5dSStephan Aßmus 
2986af4da5dSStephan Aßmus // #pragma mark -
2996af4da5dSStephan Aßmus 
3006af4da5dSStephan Aßmus 
3016af4da5dSStephan Aßmus void
302*0e68593eSJohn Scipione MediaConverterWindow::MessageReceived(BMessage* message)
3036af4da5dSStephan Aßmus {
3046af4da5dSStephan Aßmus 	entry_ref inRef;
3056af4da5dSStephan Aßmus 
3066af4da5dSStephan Aßmus 	char buffer[40];
307f086ada7SStephan Aßmus 	BEntry inEntry;
3086af4da5dSStephan Aßmus 
309*0e68593eSJohn Scipione 	switch (message->what) {
3106af4da5dSStephan Aßmus 		#if B_BEOS_VERSION <= B_BEOS_VERSION_6
3116af4da5dSStephan Aßmus 		case B_LANGUAGE_CHANGED:
3126af4da5dSStephan Aßmus 			LanguageChanged();
3136af4da5dSStephan Aßmus 			break;
3146af4da5dSStephan Aßmus 		#endif
3156af4da5dSStephan Aßmus 
3166af4da5dSStephan Aßmus 		case INIT_FORMAT_MENUS:
3176af4da5dSStephan Aßmus 			BuildFormatMenu();
3186af4da5dSStephan Aßmus 			if (CountSourceFiles() == 0)
3196af4da5dSStephan Aßmus 				SetEnabled(false, false);
3206af4da5dSStephan Aßmus 			break;
3216af4da5dSStephan Aßmus 
3226af4da5dSStephan Aßmus 		case B_SIMPLE_DATA:
323*0e68593eSJohn Scipione 			if (message->WasDropped()) {
3246af4da5dSStephan Aßmus 				DetachCurrentMessage();
325*0e68593eSJohn Scipione 				message->what = B_REFS_RECEIVED;
326*0e68593eSJohn Scipione 				BMessenger(be_app).SendMessage(message);
327*0e68593eSJohn Scipione 				delete message;
3286af4da5dSStephan Aßmus 			}
3296af4da5dSStephan Aßmus 			break;
3306af4da5dSStephan Aßmus 
3316af4da5dSStephan Aßmus 		case FORMAT_SELECT_MESSAGE:
3326af4da5dSStephan Aßmus 			BuildAudioVideoMenus();
3336af4da5dSStephan Aßmus 			break;
3346af4da5dSStephan Aßmus 		case AUDIO_CODEC_SELECT_MESSAGE:
3356af4da5dSStephan Aßmus 			break;
3366af4da5dSStephan Aßmus 		case VIDEO_CODEC_SELECT_MESSAGE:
3376af4da5dSStephan Aßmus 			break;
3386af4da5dSStephan Aßmus 
3396af4da5dSStephan Aßmus 		case CONVERT_BUTTON_MESSAGE:
3406af4da5dSStephan Aßmus 			if (!fConverting) {
341ae0f70fcSAdrien Destugues 				fConvertButton->SetLabel(B_TRANSLATE("Cancel"));
3426af4da5dSStephan Aßmus 				fConverting = true;
343ae0f70fcSAdrien Destugues 				SetStatusMessage(B_TRANSLATE("Convert"));
3446af4da5dSStephan Aßmus 				SetEnabled(false, true);
3456af4da5dSStephan Aßmus 				BMessenger(be_app).SendMessage(START_CONVERSION_MESSAGE);
3466af4da5dSStephan Aßmus 			} else if (!fCancelling) {
3476af4da5dSStephan Aßmus 				fCancelling = true;
348ae0f70fcSAdrien Destugues 				SetStatusMessage(B_TRANSLATE("Cancelling" B_UTF8_ELLIPSIS));
3496af4da5dSStephan Aßmus 				BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE);
3506af4da5dSStephan Aßmus 			}
3516af4da5dSStephan Aßmus 			break;
3526af4da5dSStephan Aßmus 
3536af4da5dSStephan Aßmus 		case CONVERSION_DONE_MESSAGE:
354f086ada7SStephan Aßmus 		{
355ae0f70fcSAdrien Destugues 			SetStatusMessage(fCancelling ? B_TRANSLATE("Conversion cancelled")
356ae0f70fcSAdrien Destugues 				: B_TRANSLATE("Conversion completed"));
3576af4da5dSStephan Aßmus 			fConverting = false;
3586af4da5dSStephan Aßmus 			fCancelling = false;
3596af4da5dSStephan Aßmus 			bool enable = CountSourceFiles() > 0;
3606af4da5dSStephan Aßmus 			SetEnabled(enable, enable);
361ae0f70fcSAdrien Destugues 			fConvertButton->SetLabel(B_TRANSLATE("Convert"));
3626af4da5dSStephan Aßmus 			break;
363f086ada7SStephan Aßmus 		}
3646af4da5dSStephan Aßmus 
3656af4da5dSStephan Aßmus 		case OUTPUT_FOLDER_MESSAGE:
3666af4da5dSStephan Aßmus 			// Execute Save Panel
367f086ada7SStephan Aßmus 			if (fSaveFilePanel == NULL) {
368f086ada7SStephan Aßmus 				BButton* selectThisDir;
3696af4da5dSStephan Aßmus 
370*0e68593eSJohn Scipione 				BMessage folderSelect(FOLDER_SELECT_MESSAGE);
3713c0f9a7cSKarsten Heimrich 				fSaveFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL,
372*0e68593eSJohn Scipione 					B_DIRECTORY_NODE, true, &folderSelect, NULL, false, true);
373ae0f70fcSAdrien Destugues 				fSaveFilePanel->SetButtonLabel(B_DEFAULT_BUTTON,
374ae0f70fcSAdrien Destugues 					B_TRANSLATE("Select"));
3756af4da5dSStephan Aßmus 				fSaveFilePanel->SetTarget(this);
3766af4da5dSStephan Aßmus 
3776af4da5dSStephan Aßmus 				fSaveFilePanel->Window()->Lock();
378ae0f70fcSAdrien Destugues 				fSaveFilePanel->Window()->SetTitle(
379ae0f70fcSAdrien Destugues 					B_TRANSLATE("MediaConverter+:SaveDirectory"));
380f086ada7SStephan Aßmus 				BRect buttonRect
381f086ada7SStephan Aßmus 					= fSaveFilePanel->Window()->ChildAt(0)->FindView(
382f086ada7SStephan Aßmus 						"cancel button")->Frame();
383f086ada7SStephan Aßmus 				buttonRect.right  = buttonRect.left - 20;
384f086ada7SStephan Aßmus 				buttonRect.left = buttonRect.right - 130;
385ae0f70fcSAdrien Destugues 				selectThisDir = new BButton(buttonRect, NULL,
386ae0f70fcSAdrien Destugues 					B_TRANSLATE("Select this folder"),
387f086ada7SStephan Aßmus 					new BMessage(SELECT_THIS_DIR_MESSAGE),
388f086ada7SStephan Aßmus 					B_FOLLOW_BOTTOM | B_FOLLOW_RIGHT);
389f086ada7SStephan Aßmus 				selectThisDir->SetTarget(this);
390f086ada7SStephan Aßmus 				fSaveFilePanel->Window()->ChildAt(0)->AddChild(selectThisDir);
3916af4da5dSStephan Aßmus 				fSaveFilePanel->Window()->Unlock();
3926af4da5dSStephan Aßmus 
393f086ada7SStephan Aßmus 				fSaveFilePanel->SetRefFilter(new DirectoryFilter);
3946af4da5dSStephan Aßmus 			}
3956af4da5dSStephan Aßmus 			fSaveFilePanel->Show();
3966af4da5dSStephan Aßmus 			break;
3976af4da5dSStephan Aßmus 
3986af4da5dSStephan Aßmus 		case FOLDER_SELECT_MESSAGE:
3996af4da5dSStephan Aßmus 			// "SELECT" Button at Save Panel Pushed
4006af4da5dSStephan Aßmus 			fSaveFilePanel->GetNextSelectedRef(&inRef);
401f086ada7SStephan Aßmus 			inEntry.SetTo(&inRef, true);
402f086ada7SStephan Aßmus 			_SetOutputFolder(inEntry);
4036af4da5dSStephan Aßmus 			fOutputDirSpecified = true;
4046af4da5dSStephan Aßmus 			break;
4056af4da5dSStephan Aßmus 
4066af4da5dSStephan Aßmus 		case SELECT_THIS_DIR_MESSAGE:
4076af4da5dSStephan Aßmus 			// "THIS DIR" Button at Save Panel Pushed
4086af4da5dSStephan Aßmus 			fSaveFilePanel->GetPanelDirectory(&inRef);
4096af4da5dSStephan Aßmus 			fSaveFilePanel->Hide();
410f086ada7SStephan Aßmus 			inEntry.SetTo(&inRef, true);
411f086ada7SStephan Aßmus 			_SetOutputFolder(inEntry);
4126af4da5dSStephan Aßmus 			fOutputDirSpecified = true;
4136af4da5dSStephan Aßmus 			break;
4146af4da5dSStephan Aßmus 
4156af4da5dSStephan Aßmus 		case OPEN_FILE_MESSAGE:
4166af4da5dSStephan Aßmus 			// Execute Open Panel
4176af4da5dSStephan Aßmus 			if (!fOpenFilePanel) {
4183c0f9a7cSKarsten Heimrich 				fOpenFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL,
4193c0f9a7cSKarsten Heimrich 					B_FILE_NODE, true, NULL, NULL, false, true);
4206af4da5dSStephan Aßmus 				fOpenFilePanel->SetTarget(this);
4216af4da5dSStephan Aßmus 			}
4226af4da5dSStephan Aßmus 			fOpenFilePanel->Show();
4236af4da5dSStephan Aßmus 			break;
4246af4da5dSStephan Aßmus 
4256af4da5dSStephan Aßmus 		case B_REFS_RECEIVED:
4266af4da5dSStephan Aßmus 			// Media Files Seleced by Open Panel
4276af4da5dSStephan Aßmus 			DetachCurrentMessage();
428*0e68593eSJohn Scipione 			message->what = B_REFS_RECEIVED;
429*0e68593eSJohn Scipione 			BMessenger(be_app).SendMessage(message);
4306af4da5dSStephan Aßmus 			// fall through
4316af4da5dSStephan Aßmus 
4326af4da5dSStephan Aßmus 		case B_CANCEL:
4336af4da5dSStephan Aßmus 			break;
4346af4da5dSStephan Aßmus 
4356af4da5dSStephan Aßmus 		case QUIT_MESSAGE:
4366af4da5dSStephan Aßmus 			MediaConverterWindow::QuitRequested();
4376af4da5dSStephan Aßmus 			break;
4386af4da5dSStephan Aßmus 
4396af4da5dSStephan Aßmus 		case PREVIEW_MESSAGE:
440f086ada7SStephan Aßmus 		{
441f086ada7SStephan Aßmus 			// Build the command line to launch the preview application.
442f086ada7SStephan Aßmus 			// TODO: Launch the default app instead of hardcoded MediaPlayer!
443f086ada7SStephan Aßmus 			int32 srcIndex = fListView->CurrentSelection();
444f086ada7SStephan Aßmus 			BMediaFile* inFile = NULL;
445f086ada7SStephan Aßmus 			status_t status = GetSourceFileAt(srcIndex, &inFile, &inRef);
4466af4da5dSStephan Aßmus 
447f086ada7SStephan Aßmus 			const char* argv[3];
448f086ada7SStephan Aßmus 			BString startPosString;
449f086ada7SStephan Aßmus 			BPath path;
450f086ada7SStephan Aßmus 
4516af4da5dSStephan Aßmus 			if (status == B_OK) {
452f086ada7SStephan Aßmus 				argv[0] = "-pos";
453f086ada7SStephan Aßmus 					// NOTE: -pos argument is currently not supported by Haiku
454f086ada7SStephan Aßmus 					// MediaPlayer.
455f086ada7SStephan Aßmus 				startPosString << fStartDurationTC->Text();
456f086ada7SStephan Aßmus 				startPosString << "000";
457f086ada7SStephan Aßmus 				argv[1] = startPosString.String();
4586af4da5dSStephan Aßmus 
459f086ada7SStephan Aßmus 				status = inEntry.SetTo(&inRef);
4606af4da5dSStephan Aßmus 			}
4616af4da5dSStephan Aßmus 
462f086ada7SStephan Aßmus 			if (status == B_OK) {
463f086ada7SStephan Aßmus 				status = inEntry.GetPath(&path);
464f086ada7SStephan Aßmus 				if (status == B_OK)
465f086ada7SStephan Aßmus 					argv[2] = path.Path();
466f086ada7SStephan Aßmus 			}
4676af4da5dSStephan Aßmus 
468f086ada7SStephan Aßmus 			if (status == B_OK) {
469f086ada7SStephan Aßmus 				status = be_roster->Launch(
470f086ada7SStephan Aßmus 					"application/x-vnd.Haiku-MediaPlayer",
471f086ada7SStephan Aßmus 					3, (char**)argv, NULL);
472f086ada7SStephan Aßmus 			}
473f086ada7SStephan Aßmus 
474f086ada7SStephan Aßmus 			if (status != B_OK && status != B_ALREADY_RUNNING) {
475007d8a0cSSiarzhuk Zharski 				BString errorString(B_TRANSLATE("Error launching: %strError%"));
476007d8a0cSSiarzhuk Zharski 				errorString.ReplaceFirst("%strError%", strerror(status));
477aed35104SHumdinger 				BAlert* alert = new BAlert(B_TRANSLATE("Error"),
478aed35104SHumdinger 					errorString.String(), B_TRANSLATE("OK"));
479aed35104SHumdinger 				alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
480aed35104SHumdinger 				alert->Go();
4816af4da5dSStephan Aßmus 			}
4826af4da5dSStephan Aßmus 			break;
483f086ada7SStephan Aßmus 		}
4846af4da5dSStephan Aßmus 
4856af4da5dSStephan Aßmus 		case VIDEO_QUALITY_CHANGED_MESSAGE:
486f086ada7SStephan Aßmus 		{
487f086ada7SStephan Aßmus 			int32 value;
488*0e68593eSJohn Scipione 			message->FindInt32("be:value", &value);
489ae0f70fcSAdrien Destugues 			snprintf(buffer, sizeof(buffer),
490ae0f70fcSAdrien Destugues 				B_TRANSLATE("Video quality: %3d%%"), (int8)value);
4916af4da5dSStephan Aßmus 			fVideoQualitySlider->SetLabel(buffer);
4926af4da5dSStephan Aßmus 			fVideoQuality = value;
4936af4da5dSStephan Aßmus 			break;
494f086ada7SStephan Aßmus 		}
4956af4da5dSStephan Aßmus 
4966af4da5dSStephan Aßmus 		case AUDIO_QUALITY_CHANGED_MESSAGE:
497f086ada7SStephan Aßmus 		{
498f086ada7SStephan Aßmus 			int32 value;
499*0e68593eSJohn Scipione 			message->FindInt32("be:value", &value);
500ae0f70fcSAdrien Destugues 			snprintf(buffer, sizeof(buffer),
501ae0f70fcSAdrien Destugues 				B_TRANSLATE("Audio quality: %3d%%"), (int8)value);
5026af4da5dSStephan Aßmus 			fAudioQualitySlider->SetLabel(buffer);
5036af4da5dSStephan Aßmus 			fAudioQuality = value;
5046af4da5dSStephan Aßmus 			break;
505f086ada7SStephan Aßmus 		}
5066af4da5dSStephan Aßmus 
5076af4da5dSStephan Aßmus 		default:
508*0e68593eSJohn Scipione 			BWindow::MessageReceived(message);
5096af4da5dSStephan Aßmus 	}
5106af4da5dSStephan Aßmus }
5116af4da5dSStephan Aßmus 
5126af4da5dSStephan Aßmus 
5136af4da5dSStephan Aßmus bool
5146af4da5dSStephan Aßmus MediaConverterWindow::QuitRequested()
5156af4da5dSStephan Aßmus {
5166af4da5dSStephan Aßmus 	if (!fConverting) {
5176af4da5dSStephan Aßmus 		BMessenger(be_app).SendMessage(B_QUIT_REQUESTED);
5186af4da5dSStephan Aßmus 		return true;
5196af4da5dSStephan Aßmus 	} else if (!fCancelling) {
5206af4da5dSStephan Aßmus 		fCancelling = true;
521ae0f70fcSAdrien Destugues 		SetStatusMessage(B_TRANSLATE("Cancelling"));
5226af4da5dSStephan Aßmus 		BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE);
5236af4da5dSStephan Aßmus 	}
524*0e68593eSJohn Scipione 
5256af4da5dSStephan Aßmus 	return false;
5266af4da5dSStephan Aßmus }
5276af4da5dSStephan Aßmus 
5286af4da5dSStephan Aßmus 
5296af4da5dSStephan Aßmus // #pragma mark -
5306af4da5dSStephan Aßmus 
5316af4da5dSStephan Aßmus 
5326af4da5dSStephan Aßmus void
5336af4da5dSStephan Aßmus MediaConverterWindow::LanguageChanged()
5346af4da5dSStephan Aßmus {
5356af4da5dSStephan Aßmus 	_DestroyMenu();
5366af4da5dSStephan Aßmus 	_CreateMenu();
5376af4da5dSStephan Aßmus 	_UpdateLabels();
5386af4da5dSStephan Aßmus 	BuildAudioVideoMenus();
5396af4da5dSStephan Aßmus 	Lock();
5406af4da5dSStephan Aßmus 	fInfoView->Invalidate();
5416af4da5dSStephan Aßmus 	Unlock();
5426af4da5dSStephan Aßmus }
5436af4da5dSStephan Aßmus 
5446af4da5dSStephan Aßmus 
5456af4da5dSStephan Aßmus void
5466af4da5dSStephan Aßmus MediaConverterWindow::BuildAudioVideoMenus()
5476af4da5dSStephan Aßmus {
5486af4da5dSStephan Aßmus 	BMenu* menu = fAudioMenu->Menu();
5496af4da5dSStephan Aßmus 	BMenuItem* item;
550*0e68593eSJohn Scipione 
5516af4da5dSStephan Aßmus 	// clear out old audio codec menu items
5527f4d1af4SSergei Reznikov 	while ((item = menu->RemoveItem((int32)0)) != NULL)
5536af4da5dSStephan Aßmus 		delete item;
5546af4da5dSStephan Aßmus 
5556af4da5dSStephan Aßmus 	bool separator = true;
5566af4da5dSStephan Aßmus 
5576af4da5dSStephan Aßmus 	// get selected file format
5587730c846SStephan Aßmus 	FileFormatMenuItem* ffmi
5597730c846SStephan Aßmus 		= (FileFormatMenuItem*)fFormatMenu->Menu()->FindMarked();
5606af4da5dSStephan Aßmus 	media_file_format* mf_format = &(ffmi->fFileFormat);
5616af4da5dSStephan Aßmus 
5626af4da5dSStephan Aßmus 	media_format format, outfmt;
5636af4da5dSStephan Aßmus 	memset(&format, 0, sizeof(format));
5646af4da5dSStephan Aßmus 	media_codec_info codec_info;
5656af4da5dSStephan Aßmus 	int32 cookie = 0;
5666af4da5dSStephan Aßmus 	CodecMenuItem* cmi;
5676af4da5dSStephan Aßmus 
5686af4da5dSStephan Aßmus 	// add available audio encoders to menu
5696af4da5dSStephan Aßmus 	format.type = B_MEDIA_RAW_AUDIO;
5706af4da5dSStephan Aßmus 	format.u.raw_audio = media_raw_audio_format::wildcard;
5717730c846SStephan Aßmus 	while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info)
5727730c846SStephan Aßmus 			== B_OK) {
5736af4da5dSStephan Aßmus 		if (separator) {
574ae0f70fcSAdrien Destugues 			menu->AddItem(new BMenuItem(
575546208a5SOliver Tappe 				B_TRANSLATE_CONTEXT("No audio", "Audio codecs list"),
5766af4da5dSStephan Aßmus 				new BMessage(AUDIO_CODEC_SELECT_MESSAGE)));
5776af4da5dSStephan Aßmus 			menu->AddSeparatorItem();
5786af4da5dSStephan Aßmus 			separator = false;
5796af4da5dSStephan Aßmus 		}
5806af4da5dSStephan Aßmus 
5816af4da5dSStephan Aßmus 		cmi = new CodecMenuItem(&codec_info, AUDIO_CODEC_SELECT_MESSAGE);
5826af4da5dSStephan Aßmus 		menu->AddItem(cmi);
5836af4da5dSStephan Aßmus 		// reset media format struct
5846af4da5dSStephan Aßmus /*
5856af4da5dSStephan Aßmus 		format.type = B_MEDIA_RAW_AUDIO;
5866af4da5dSStephan Aßmus 		format.u.raw_audio = media_raw_audio_format::wildcard;
5876af4da5dSStephan Aßmus */
5886af4da5dSStephan Aßmus 	}
5896af4da5dSStephan Aßmus 
5906af4da5dSStephan Aßmus 	// mark first audio encoder
5916af4da5dSStephan Aßmus 	item = menu->ItemAt(0);
5926af4da5dSStephan Aßmus 	if (item != NULL) {
5936af4da5dSStephan Aßmus 		fAudioMenu->SetEnabled(fEnabled);
5946af4da5dSStephan Aßmus 		fAudioQualitySlider->SetEnabled(fEnabled);
5956af4da5dSStephan Aßmus 		item->SetMarked(true);
5966af4da5dSStephan Aßmus 		((BInvoker*)item)->Invoke();
5976af4da5dSStephan Aßmus 	} else {
598ae0f70fcSAdrien Destugues 		item = new BMenuItem(
599*0e68593eSJohn Scipione 			B_TRANSLATE_CONTEXT("None available", "Audio codecs"), NULL);
6006af4da5dSStephan Aßmus 		menu->AddItem(item);
6016af4da5dSStephan Aßmus 		item->SetMarked(true);
6026af4da5dSStephan Aßmus 		fAudioMenu->SetEnabled(false);
6036af4da5dSStephan Aßmus 		fAudioQualitySlider->SetEnabled(false);
6046af4da5dSStephan Aßmus 	}
6056af4da5dSStephan Aßmus 
6066af4da5dSStephan Aßmus 	// clear out old video codec menu items
6076af4da5dSStephan Aßmus 	menu = fVideoMenu->Menu();
6087f4d1af4SSergei Reznikov 	while ((item = menu->RemoveItem((int32)0)) != NULL)
6096af4da5dSStephan Aßmus 		delete item;
6106af4da5dSStephan Aßmus 
6116af4da5dSStephan Aßmus 	separator = true;
6126af4da5dSStephan Aßmus 
6136af4da5dSStephan Aßmus 	// construct a generic video format.  Some of these parameters
6146af4da5dSStephan Aßmus 	// seem silly, but are needed for R4.5.x, which is more picky
6156af4da5dSStephan Aßmus 	// than subsequent BeOS releases will be.
6166af4da5dSStephan Aßmus 	memset(&format, 0, sizeof(format));
6176af4da5dSStephan Aßmus 	format.type = B_MEDIA_RAW_VIDEO;
6186af4da5dSStephan Aßmus 	format.u.raw_video.last_active = (uint32)(240 - 1);
6196af4da5dSStephan Aßmus 	format.u.raw_video.orientation = B_VIDEO_TOP_LEFT_RIGHT;
6206af4da5dSStephan Aßmus 	format.u.raw_video.display.format = B_RGB32;
6216af4da5dSStephan Aßmus 	format.u.raw_video.display.line_width = (int32)320;
6226af4da5dSStephan Aßmus 	format.u.raw_video.display.line_count = (int32)240;
6236af4da5dSStephan Aßmus 	format.u.raw_video.display.bytes_per_row = 4 * 320;
6246af4da5dSStephan Aßmus 
6256af4da5dSStephan Aßmus 	// add available video encoders to menu
6266af4da5dSStephan Aßmus 	cookie = 0;
627*0e68593eSJohn Scipione 	while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info)
628*0e68593eSJohn Scipione 			== B_OK) {
6296af4da5dSStephan Aßmus 		if (separator) {
630ae0f70fcSAdrien Destugues 			menu->AddItem(new BMenuItem(
631546208a5SOliver Tappe 				B_TRANSLATE_CONTEXT("No video", "Video codecs list"),
6326af4da5dSStephan Aßmus 				new BMessage(VIDEO_CODEC_SELECT_MESSAGE)));
6336af4da5dSStephan Aßmus 			menu->AddSeparatorItem();
6346af4da5dSStephan Aßmus 			separator = false;
6356af4da5dSStephan Aßmus 		}
6366af4da5dSStephan Aßmus 
6376af4da5dSStephan Aßmus 		cmi = new CodecMenuItem(&codec_info, VIDEO_CODEC_SELECT_MESSAGE);
6386af4da5dSStephan Aßmus 		menu->AddItem(cmi);
6396af4da5dSStephan Aßmus 	}
6406af4da5dSStephan Aßmus 
6416af4da5dSStephan Aßmus 	// mark first video encoder
6426af4da5dSStephan Aßmus 	item = menu->ItemAt(0);
6436af4da5dSStephan Aßmus 	if (item != NULL) {
6446af4da5dSStephan Aßmus 		fVideoMenu->SetEnabled(fEnabled);
6456af4da5dSStephan Aßmus 		fVideoQualitySlider->SetEnabled(fEnabled);
6466af4da5dSStephan Aßmus 		item->SetMarked(true);
6476af4da5dSStephan Aßmus 		((BInvoker*)item)->Invoke();
6486af4da5dSStephan Aßmus 	} else {
649ae0f70fcSAdrien Destugues 		item = new BMenuItem(
650*0e68593eSJohn Scipione 			B_TRANSLATE_CONTEXT("None available", "Video codecs"), NULL);
6516af4da5dSStephan Aßmus 		menu->AddItem(item);
6526af4da5dSStephan Aßmus 		item->SetMarked(true);
6536af4da5dSStephan Aßmus 		fVideoMenu->SetEnabled(false);
6546af4da5dSStephan Aßmus 		fVideoQualitySlider->SetEnabled(false);
6556af4da5dSStephan Aßmus 	}
6566af4da5dSStephan Aßmus }
6576af4da5dSStephan Aßmus 
6586af4da5dSStephan Aßmus void
6596af4da5dSStephan Aßmus MediaConverterWindow::GetSelectedFormatInfo(media_file_format** format,
6606af4da5dSStephan Aßmus 	media_codec_info** audio, media_codec_info** video)
6616af4da5dSStephan Aßmus {
6626af4da5dSStephan Aßmus 	*audio = NULL;
6636af4da5dSStephan Aßmus 	*video = NULL;
6646af4da5dSStephan Aßmus 	*format = NULL;
6656af4da5dSStephan Aßmus 
6666af4da5dSStephan Aßmus 	FileFormatMenuItem* formatItem =
6676af4da5dSStephan Aßmus 		dynamic_cast<FileFormatMenuItem*>(fFormatMenu->Menu()->FindMarked());
668*0e68593eSJohn Scipione 	if (formatItem != NULL)
6696af4da5dSStephan Aßmus 		*format = &(formatItem->fFileFormat);
6706af4da5dSStephan Aßmus 
6716af4da5dSStephan Aßmus 	*audio = *video = NULL;
6726af4da5dSStephan Aßmus 	CodecMenuItem* codecItem =
6736af4da5dSStephan Aßmus 		dynamic_cast<CodecMenuItem*>(fAudioMenu->Menu()->FindMarked());
674*0e68593eSJohn Scipione 	if (codecItem != NULL)
6756af4da5dSStephan Aßmus 		*audio =  &(codecItem->fCodecInfo);
6766af4da5dSStephan Aßmus 
6776af4da5dSStephan Aßmus 	codecItem = dynamic_cast<CodecMenuItem*>(fVideoMenu->Menu()->FindMarked());
678*0e68593eSJohn Scipione 	if (codecItem != NULL)
6796af4da5dSStephan Aßmus 		*video =  &(codecItem->fCodecInfo);
6806af4da5dSStephan Aßmus }
6816af4da5dSStephan Aßmus 
6826af4da5dSStephan Aßmus 
6836af4da5dSStephan Aßmus void
6846af4da5dSStephan Aßmus MediaConverterWindow::BuildFormatMenu()
6856af4da5dSStephan Aßmus {
6866af4da5dSStephan Aßmus 	BMenu* menu = fFormatMenu->Menu();
6876af4da5dSStephan Aßmus 	BMenuItem* item;
688*0e68593eSJohn Scipione 
6896af4da5dSStephan Aßmus 	// clear out old format menu items
690*0e68593eSJohn Scipione 	while ((item = menu->RemoveItem((int32)0)) != NULL)
6916af4da5dSStephan Aßmus 		delete item;
6926af4da5dSStephan Aßmus 
6936af4da5dSStephan Aßmus 	// add menu items for each file format
6946af4da5dSStephan Aßmus 	media_file_format mfi;
6956af4da5dSStephan Aßmus 	int32 cookie = 0;
6966af4da5dSStephan Aßmus 	FileFormatMenuItem* ff_item;
6976af4da5dSStephan Aßmus 	while (get_next_file_format(&cookie, &mfi) == B_OK) {
6986af4da5dSStephan Aßmus 		ff_item = new FileFormatMenuItem(&mfi);
6996af4da5dSStephan Aßmus 		menu->AddItem(ff_item);
7006af4da5dSStephan Aßmus 	}
7016af4da5dSStephan Aßmus 
7026af4da5dSStephan Aßmus 	// mark first item
7036af4da5dSStephan Aßmus 	item = menu->ItemAt(0);
7046af4da5dSStephan Aßmus 	if (item != NULL) {
7056af4da5dSStephan Aßmus 		item->SetMarked(true);
7066af4da5dSStephan Aßmus 		((BInvoker*)item)->Invoke();
7076af4da5dSStephan Aßmus 	}
7086af4da5dSStephan Aßmus }
7096af4da5dSStephan Aßmus 
710dd55ed1aSAlex Wilson 
7116af4da5dSStephan Aßmus void
7126af4da5dSStephan Aßmus MediaConverterWindow::SetFileMessage(const char* message)
7136af4da5dSStephan Aßmus {
714dd55ed1aSAlex Wilson 	fFileStatus->SetText(message);
7156af4da5dSStephan Aßmus }
7166af4da5dSStephan Aßmus 
717dd55ed1aSAlex Wilson 
7186af4da5dSStephan Aßmus void
7196af4da5dSStephan Aßmus MediaConverterWindow::SetStatusMessage(const char* message)
7206af4da5dSStephan Aßmus {
721dd55ed1aSAlex Wilson 	fStatus->SetText(message);
7226af4da5dSStephan Aßmus }
7236af4da5dSStephan Aßmus 
7246af4da5dSStephan Aßmus 
7256af4da5dSStephan Aßmus // #pragma mark -
7266af4da5dSStephan Aßmus 
7276af4da5dSStephan Aßmus 
7281c992a52SStephan Aßmus bool
7296af4da5dSStephan Aßmus MediaConverterWindow::AddSourceFile(BMediaFile* file, const entry_ref& ref)
7306af4da5dSStephan Aßmus {
7311c992a52SStephan Aßmus 	if (!fListView->AddMediaItem(file, ref))
7321c992a52SStephan Aßmus 		return false;
7336af4da5dSStephan Aßmus 
7346af4da5dSStephan Aßmus 	if (!fOutputDirSpecified) {
7356af4da5dSStephan Aßmus 		BEntry entry(&ref);
7366af4da5dSStephan Aßmus 		entry.GetParent(&entry);
7376af4da5dSStephan Aßmus 		_SetOutputFolder(entry);
7386af4da5dSStephan Aßmus 	}
7391c992a52SStephan Aßmus 
7401c992a52SStephan Aßmus 	return true;
7416af4da5dSStephan Aßmus }
7426af4da5dSStephan Aßmus 
7436af4da5dSStephan Aßmus 
7446af4da5dSStephan Aßmus void
7456af4da5dSStephan Aßmus MediaConverterWindow::RemoveSourceFile(int32 index)
7466af4da5dSStephan Aßmus {
7476af4da5dSStephan Aßmus 	delete fListView->RemoveItem(index);
7486af4da5dSStephan Aßmus 	fStartDurationTC->SetText("0");
7496af4da5dSStephan Aßmus 	fEndDurationTC->SetText("0");
7506af4da5dSStephan Aßmus }
7516af4da5dSStephan Aßmus 
7526af4da5dSStephan Aßmus 
7536af4da5dSStephan Aßmus int32
7546af4da5dSStephan Aßmus MediaConverterWindow::CountSourceFiles()
7556af4da5dSStephan Aßmus {
7566af4da5dSStephan Aßmus 	return fListView->CountItems();
7576af4da5dSStephan Aßmus }
7586af4da5dSStephan Aßmus 
7596af4da5dSStephan Aßmus 
7606af4da5dSStephan Aßmus status_t
7616af4da5dSStephan Aßmus MediaConverterWindow::GetSourceFileAt(int32 index, BMediaFile** _file,
7626af4da5dSStephan Aßmus 	entry_ref* ref)
7636af4da5dSStephan Aßmus {
7646af4da5dSStephan Aßmus 	MediaFileListItem* item = dynamic_cast<MediaFileListItem*>(
7656af4da5dSStephan Aßmus 		fListView->ItemAt(index));
7666af4da5dSStephan Aßmus 	if (item != NULL) {
7676af4da5dSStephan Aßmus 		*_file = item->fMediaFile;
7686af4da5dSStephan Aßmus 		*ref = item->fRef;
7696af4da5dSStephan Aßmus 		return B_OK;
770*0e68593eSJohn Scipione 	} else
7716af4da5dSStephan Aßmus 		return B_ERROR;
7726af4da5dSStephan Aßmus }
7736af4da5dSStephan Aßmus 
7746af4da5dSStephan Aßmus 
7756af4da5dSStephan Aßmus void
7766af4da5dSStephan Aßmus MediaConverterWindow::SourceFileSelectionChanged()
7776af4da5dSStephan Aßmus {
7786af4da5dSStephan Aßmus 	int32 selected = fListView->CurrentSelection();
7796af4da5dSStephan Aßmus 	BMediaFile* file = NULL;
7806af4da5dSStephan Aßmus 	entry_ref ref;
7817730c846SStephan Aßmus 	bool enabled = GetSourceFileAt(selected, &file, &ref) == B_OK;
7826af4da5dSStephan Aßmus 
7836af4da5dSStephan Aßmus 	fPreviewButton->SetEnabled(enabled);
7846af4da5dSStephan Aßmus 	fVideoQualitySlider->SetEnabled(enabled);
7856af4da5dSStephan Aßmus 	fAudioQualitySlider->SetEnabled(enabled);
7866af4da5dSStephan Aßmus 	fStartDurationTC->SetEnabled(enabled);
7876af4da5dSStephan Aßmus 	fEndDurationTC->SetEnabled(enabled);
7886af4da5dSStephan Aßmus 
7897730c846SStephan Aßmus 	BString duration;
7907730c846SStephan Aßmus 	if (enabled) {
7917730c846SStephan Aßmus 		fInfoView->Update(file, &ref);
7926af4da5dSStephan Aßmus 		// HACK: get the fInfoView to update the duration "synchronously"
7936af4da5dSStephan Aßmus 		UpdateIfNeeded();
7947730c846SStephan Aßmus 		duration << fInfoView->Duration() / 1000;
7957730c846SStephan Aßmus 	} else
7967730c846SStephan Aßmus 		duration = "0";
7976af4da5dSStephan Aßmus 
7986af4da5dSStephan Aßmus 	// update duration text controls
7996af4da5dSStephan Aßmus 	fStartDurationTC->SetText("0");
8006af4da5dSStephan Aßmus 	fEndDurationTC->SetText(duration.String());
8016af4da5dSStephan Aßmus }
8026af4da5dSStephan Aßmus 
8036af4da5dSStephan Aßmus 
8046af4da5dSStephan Aßmus // #pragma mark -
8056af4da5dSStephan Aßmus 
8066af4da5dSStephan Aßmus 
8076af4da5dSStephan Aßmus void
8086af4da5dSStephan Aßmus MediaConverterWindow::SetEnabled(bool enabled, bool convertEnabled)
8096af4da5dSStephan Aßmus {
8106af4da5dSStephan Aßmus 	fConvertButton->SetEnabled(convertEnabled);
8116af4da5dSStephan Aßmus 	if (enabled == fEnabled)
8126af4da5dSStephan Aßmus 		return;
8136af4da5dSStephan Aßmus 
8146af4da5dSStephan Aßmus 	fFormatMenu->SetEnabled(enabled);
8156af4da5dSStephan Aßmus 	fAudioMenu->SetEnabled(enabled);
8166af4da5dSStephan Aßmus 	fVideoMenu->SetEnabled(enabled);
8176af4da5dSStephan Aßmus 	fListView->SetEnabled(enabled);
8186af4da5dSStephan Aßmus 	fStartDurationTC->SetEnabled(enabled);
8196af4da5dSStephan Aßmus 	fEndDurationTC->SetEnabled(enabled);
8206af4da5dSStephan Aßmus 
8216af4da5dSStephan Aßmus 	fEnabled = enabled;
8226af4da5dSStephan Aßmus }
8236af4da5dSStephan Aßmus 
8246af4da5dSStephan Aßmus 
8256af4da5dSStephan Aßmus bool
8266af4da5dSStephan Aßmus MediaConverterWindow::IsEnabled()
8276af4da5dSStephan Aßmus {
8286af4da5dSStephan Aßmus 	return fEnabled;
8296af4da5dSStephan Aßmus }
8306af4da5dSStephan Aßmus 
8316af4da5dSStephan Aßmus 
8326af4da5dSStephan Aßmus const char*
8336af4da5dSStephan Aßmus MediaConverterWindow::StartDuration() const
8346af4da5dSStephan Aßmus {
8356af4da5dSStephan Aßmus 	return fStartDurationTC->Text();
8366af4da5dSStephan Aßmus }
8376af4da5dSStephan Aßmus 
8386af4da5dSStephan Aßmus 
8396af4da5dSStephan Aßmus const char*
8406af4da5dSStephan Aßmus MediaConverterWindow::EndDuration() const
8416af4da5dSStephan Aßmus {
8426af4da5dSStephan Aßmus 	return fEndDurationTC->Text();
8436af4da5dSStephan Aßmus }
8446af4da5dSStephan Aßmus 
8456af4da5dSStephan Aßmus 
8466af4da5dSStephan Aßmus BDirectory
8476af4da5dSStephan Aßmus MediaConverterWindow::OutputDirectory() const
8486af4da5dSStephan Aßmus {
8496af4da5dSStephan Aßmus 	return fOutputDir;
8506af4da5dSStephan Aßmus }
8516af4da5dSStephan Aßmus 
8526af4da5dSStephan Aßmus 
8536af4da5dSStephan Aßmus void
8546af4da5dSStephan Aßmus MediaConverterWindow::SetAudioQualityLabel(const char* label)
8556af4da5dSStephan Aßmus {
8566af4da5dSStephan Aßmus 	fAudioQualitySlider->SetLabel(label);
8576af4da5dSStephan Aßmus }
8586af4da5dSStephan Aßmus 
8596af4da5dSStephan Aßmus 
8606af4da5dSStephan Aßmus void
8616af4da5dSStephan Aßmus MediaConverterWindow::SetVideoQualityLabel(const char* label)
8626af4da5dSStephan Aßmus {
8636af4da5dSStephan Aßmus 	fVideoQualitySlider->SetLabel(label);
8646af4da5dSStephan Aßmus }
8656af4da5dSStephan Aßmus 
8666af4da5dSStephan Aßmus 
867a42b9a43SJohn Scipione void
868a42b9a43SJohn Scipione MediaConverterWindow::TruncateOutputFolderPath()
869a42b9a43SJohn Scipione {
870a42b9a43SJohn Scipione 	BEntry entry;
871a42b9a43SJohn Scipione 	fOutputDir.GetEntry(&entry);
872a42b9a43SJohn Scipione 	BPath path;
873a42b9a43SJohn Scipione 	entry.GetPath(&path);
874a42b9a43SJohn Scipione 	BString pathString(path.Path());
875a42b9a43SJohn Scipione 	float maxWidth = fVideoMenu->MenuBar()->Frame().Width();
876a42b9a43SJohn Scipione 
877a42b9a43SJohn Scipione 	fOutputFolder->TruncateString(&pathString, B_TRUNCATE_MIDDLE, maxWidth);
878a42b9a43SJohn Scipione 	fOutputFolder->SetText(pathString.String());
879a42b9a43SJohn Scipione }
880a42b9a43SJohn Scipione 
881a42b9a43SJohn Scipione 
8826af4da5dSStephan Aßmus // #pragma mark -
8836af4da5dSStephan Aßmus 
8846af4da5dSStephan Aßmus 
8856af4da5dSStephan Aßmus void
8866af4da5dSStephan Aßmus MediaConverterWindow::_UpdateLabels()
8876af4da5dSStephan Aßmus {
888dd55ed1aSAlex Wilson 	if (fSourcesBox != NULL) {
889ae0f70fcSAdrien Destugues 		fSourcesBox->SetLabel(B_TRANSLATE("Source files"));
890dd55ed1aSAlex Wilson 		_UpdateBBoxLayoutInsets(fSourcesBox);
891dd55ed1aSAlex Wilson 	}
8926af4da5dSStephan Aßmus 
893dd55ed1aSAlex Wilson 	if (fInfoBox != NULL)
894ae0f70fcSAdrien Destugues 		fInfoBox->SetLabel(B_TRANSLATE("File details"));
8956af4da5dSStephan Aßmus 
896dd55ed1aSAlex Wilson 	if (fOutputBox != NULL) {
897ae0f70fcSAdrien Destugues 		fOutputBox->SetLabel(B_TRANSLATE("Output format"));
898dd55ed1aSAlex Wilson 		_UpdateBBoxLayoutInsets(fOutputBox);
899dd55ed1aSAlex Wilson 	}
9006af4da5dSStephan Aßmus 
901dd55ed1aSAlex Wilson 	if (fConvertButton != NULL)
902ae0f70fcSAdrien Destugues 		fConvertButton->SetLabel(B_TRANSLATE("Convert"));
9036af4da5dSStephan Aßmus 
904dd55ed1aSAlex Wilson 	if (fPreviewButton != NULL)
905ae0f70fcSAdrien Destugues 		fPreviewButton->SetLabel(B_TRANSLATE("Preview"));
9066af4da5dSStephan Aßmus 
907dd55ed1aSAlex Wilson 	if (fDestButton != NULL)
908ae0f70fcSAdrien Destugues 		fDestButton->SetLabel(B_TRANSLATE("Output folder"));
9096af4da5dSStephan Aßmus 
9106af4da5dSStephan Aßmus 	if (fVideoQualitySlider != NULL) {
911dd55ed1aSAlex Wilson 		char buffer[40];
912ae0f70fcSAdrien Destugues 		snprintf(buffer, sizeof(buffer), B_TRANSLATE("Video quality: %3d%%"),
913f086ada7SStephan Aßmus 			(int8)fVideoQuality);
9146af4da5dSStephan Aßmus 		fVideoQualitySlider->SetLabel(buffer);
915ae0f70fcSAdrien Destugues 		fVideoQualitySlider->SetLimitLabels(B_TRANSLATE("Low"),
916ae0f70fcSAdrien Destugues 			B_TRANSLATE("High"));
9176af4da5dSStephan Aßmus 	}
9186af4da5dSStephan Aßmus 
9196af4da5dSStephan Aßmus 	if (fAudioQualitySlider != NULL) {
920dd55ed1aSAlex Wilson 		char buffer[40];
921ae0f70fcSAdrien Destugues 		snprintf(buffer, sizeof(buffer), B_TRANSLATE("Audio quality: %3d%%"),
922f086ada7SStephan Aßmus 			(int8)fAudioQuality);
9236af4da5dSStephan Aßmus 		fAudioQualitySlider->SetLabel(buffer);
924ae0f70fcSAdrien Destugues 		fAudioQualitySlider->SetLimitLabels(B_TRANSLATE("Low"),
925ae0f70fcSAdrien Destugues 			B_TRANSLATE("High"));
9266af4da5dSStephan Aßmus 	}
9276af4da5dSStephan Aßmus 
928dd55ed1aSAlex Wilson 	if (fStartDurationTC != NULL)
929ae0f70fcSAdrien Destugues 		fStartDurationTC->SetLabel(B_TRANSLATE("Start [ms]: "));
930dd55ed1aSAlex Wilson 
931dd55ed1aSAlex Wilson 	if (fEndDurationTC != NULL)
932ae0f70fcSAdrien Destugues 		fEndDurationTC->SetLabel(B_TRANSLATE("End   [ms]: "));
9336af4da5dSStephan Aßmus 
9346af4da5dSStephan Aßmus 	if (fFormatMenu != NULL)
935ae0f70fcSAdrien Destugues 		fFormatMenu->SetLabel(B_TRANSLATE("File format:"));
936dd55ed1aSAlex Wilson 
9376af4da5dSStephan Aßmus 	if (fAudioMenu != NULL)
938ae0f70fcSAdrien Destugues 		fAudioMenu->SetLabel(B_TRANSLATE("Audio encoding:"));
939dd55ed1aSAlex Wilson 
9406af4da5dSStephan Aßmus 	if (fVideoMenu != NULL)
941ae0f70fcSAdrien Destugues 		fVideoMenu->SetLabel(B_TRANSLATE("Video encoding:"));
9426af4da5dSStephan Aßmus 
943ae0f70fcSAdrien Destugues 	SetFileMessage(B_TRANSLATE("Drop media files onto this window"));
9446af4da5dSStephan Aßmus }
9456af4da5dSStephan Aßmus 
9466af4da5dSStephan Aßmus 
9476af4da5dSStephan Aßmus void
948dd55ed1aSAlex Wilson MediaConverterWindow::_UpdateBBoxLayoutInsets(BBox* box)
949dd55ed1aSAlex Wilson {
950dd55ed1aSAlex Wilson 	BTwoDimensionalLayout* layout
951dd55ed1aSAlex Wilson 		= dynamic_cast<BTwoDimensionalLayout*>(box->GetLayout());
9527730c846SStephan Aßmus 	if (layout != NULL) {
953dd55ed1aSAlex Wilson 		float padding = be_control_look->DefaultItemSpacing();
954dd55ed1aSAlex Wilson 		layout->SetInsets(padding, box->TopBorderOffset() + padding, padding,
955dd55ed1aSAlex Wilson 			padding);
956dd55ed1aSAlex Wilson 	}
957dd55ed1aSAlex Wilson }
958dd55ed1aSAlex Wilson 
959dd55ed1aSAlex Wilson 
960dd55ed1aSAlex Wilson void
9616af4da5dSStephan Aßmus MediaConverterWindow::_DestroyMenu()
9626af4da5dSStephan Aßmus {
963*0e68593eSJohn Scipione 	BMenu* menu;
9646af4da5dSStephan Aßmus 
965*0e68593eSJohn Scipione 	while ((menu = fMenuBar->SubmenuAt(0)) != NULL) {
966*0e68593eSJohn Scipione 		fMenuBar->RemoveItem(menu);
967*0e68593eSJohn Scipione 		delete menu;
9686af4da5dSStephan Aßmus 	}
9696af4da5dSStephan Aßmus }
9706af4da5dSStephan Aßmus 
9716af4da5dSStephan Aßmus 
9726af4da5dSStephan Aßmus void
9736af4da5dSStephan Aßmus MediaConverterWindow::_CreateMenu()
9746af4da5dSStephan Aßmus {
9756af4da5dSStephan Aßmus 	BMenu* menu;
976*0e68593eSJohn Scipione 	BMenuItem* item;
9776af4da5dSStephan Aßmus 
978546208a5SOliver Tappe 	menu = new BMenu(B_TRANSLATE_CONTEXT("File", "Menu"));
979*0e68593eSJohn Scipione 	item = new BMenuItem(B_TRANSLATE_CONTEXT("Open" B_UTF8_ELLIPSIS, "Menu"),
980dd55ed1aSAlex Wilson 		new BMessage(OPEN_FILE_MESSAGE), 'O');
9816af4da5dSStephan Aßmus 	menu->AddItem(item);
9826af4da5dSStephan Aßmus 	menu->AddSeparatorItem();
983546208a5SOliver Tappe 	item = new BMenuItem(B_TRANSLATE_CONTEXT("Quit", "Menu"),
984ae0f70fcSAdrien Destugues 		new BMessage(QUIT_MESSAGE), 'Q');
9856af4da5dSStephan Aßmus 	menu->AddItem(item);
9866af4da5dSStephan Aßmus 
9876af4da5dSStephan Aßmus 	fMenuBar->AddItem(menu);
9886af4da5dSStephan Aßmus }
9896af4da5dSStephan Aßmus 
9906af4da5dSStephan Aßmus 
9916af4da5dSStephan Aßmus void
9926af4da5dSStephan Aßmus MediaConverterWindow::_SetOutputFolder(BEntry entry)
9936af4da5dSStephan Aßmus {
994a42b9a43SJohn Scipione 	fOutputDir.SetTo(&entry);
995a42b9a43SJohn Scipione 	TruncateOutputFolderPath();
9966af4da5dSStephan Aßmus }
997