xref: /haiku/src/apps/mediaconverter/MediaConverterWindow.cpp (revision 83010212f75bee29d7ba53200452fa08c32f9cd3)
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 
466af4da5dSStephan Aßmus // #pragma mark - DirectoryFilter
476af4da5dSStephan Aßmus 
486af4da5dSStephan Aßmus 
4960b6f368SStephan Aßmus class DirectoryFilter : public BRefFilter {
506af4da5dSStephan Aßmus public:
516af4da5dSStephan Aßmus 	DirectoryFilter() {};
526af4da5dSStephan Aßmus 	virtual bool Filter(const entry_ref* ref,
5360b6f368SStephan Aßmus 		BNode* node, struct stat_beos* st, const char* filetype)
546af4da5dSStephan Aßmus 	{
556af4da5dSStephan Aßmus 		return node->IsDirectory();
566af4da5dSStephan Aßmus 	}
576af4da5dSStephan Aßmus };
586af4da5dSStephan Aßmus 
596af4da5dSStephan Aßmus 
606af4da5dSStephan Aßmus // #pragma mark - FileFormatMenuItem
616af4da5dSStephan Aßmus 
626af4da5dSStephan Aßmus 
636af4da5dSStephan Aßmus class FileFormatMenuItem : public BMenuItem {
646af4da5dSStephan Aßmus public:
656af4da5dSStephan Aßmus 	FileFormatMenuItem(media_file_format* format);
666af4da5dSStephan Aßmus 	virtual ~FileFormatMenuItem();
676af4da5dSStephan Aßmus 
686af4da5dSStephan Aßmus 	media_file_format fFileFormat;
696af4da5dSStephan Aßmus };
706af4da5dSStephan Aßmus 
716af4da5dSStephan Aßmus 
726af4da5dSStephan Aßmus FileFormatMenuItem::FileFormatMenuItem(media_file_format *format)
73dd55ed1aSAlex Wilson 	:
74dd55ed1aSAlex Wilson 	BMenuItem(format->pretty_name, new BMessage(FORMAT_SELECT_MESSAGE))
756af4da5dSStephan Aßmus {
766af4da5dSStephan Aßmus 	memcpy(&fFileFormat, format, sizeof(fFileFormat));
776af4da5dSStephan Aßmus }
786af4da5dSStephan Aßmus 
796af4da5dSStephan Aßmus 
806af4da5dSStephan Aßmus FileFormatMenuItem::~FileFormatMenuItem()
816af4da5dSStephan Aßmus {
826af4da5dSStephan Aßmus }
836af4da5dSStephan Aßmus 
846af4da5dSStephan Aßmus 
856af4da5dSStephan Aßmus // #pragma mark - CodecMenuItem
866af4da5dSStephan Aßmus 
876af4da5dSStephan Aßmus 
886af4da5dSStephan Aßmus class CodecMenuItem : public BMenuItem {
896af4da5dSStephan Aßmus 	public:
906af4da5dSStephan Aßmus 				CodecMenuItem(media_codec_info *ci, uint32 msg_type);
916af4da5dSStephan Aßmus 	virtual		~CodecMenuItem();
926af4da5dSStephan Aßmus 
936af4da5dSStephan Aßmus 	media_codec_info fCodecInfo;
946af4da5dSStephan Aßmus };
956af4da5dSStephan Aßmus 
966af4da5dSStephan Aßmus 
976af4da5dSStephan Aßmus CodecMenuItem::CodecMenuItem(media_codec_info *ci, uint32 msg_type)
98dd55ed1aSAlex Wilson 	:
99dd55ed1aSAlex Wilson 	BMenuItem(ci->pretty_name, new BMessage(msg_type))
1006af4da5dSStephan Aßmus {
1016af4da5dSStephan Aßmus 	memcpy(&fCodecInfo, ci, sizeof(fCodecInfo));
1026af4da5dSStephan Aßmus }
1036af4da5dSStephan Aßmus 
1046af4da5dSStephan Aßmus 
1056af4da5dSStephan Aßmus CodecMenuItem::~CodecMenuItem()
1066af4da5dSStephan Aßmus {
1076af4da5dSStephan Aßmus }
1086af4da5dSStephan Aßmus 
1096af4da5dSStephan Aßmus 
1106af4da5dSStephan Aßmus // #pragma mark - MediaConverterWindow
1116af4da5dSStephan Aßmus 
1126af4da5dSStephan Aßmus 
1136af4da5dSStephan Aßmus MediaConverterWindow::MediaConverterWindow(BRect frame)
114dd55ed1aSAlex Wilson 	:
115560ff447SJonas Sundström 	BWindow(frame, B_TRANSLATE_SYSTEM_NAME("MediaConverter"), B_TITLED_WINDOW_LOOK,
11687077901SJohn Scipione 		B_NORMAL_WINDOW_FEEL, B_NOT_ZOOMABLE | B_NOT_V_RESIZABLE
11787077901SJohn Scipione 		| B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS),
118dd55ed1aSAlex Wilson 	fVideoQuality(75),
119dd55ed1aSAlex Wilson 	fAudioQuality(75),
120dd55ed1aSAlex Wilson 	fSaveFilePanel(NULL),
121dd55ed1aSAlex Wilson 	fOpenFilePanel(NULL),
122dd55ed1aSAlex Wilson 	fOutputDirSpecified(false),
123dd55ed1aSAlex Wilson 	fEnabled(true),
124dd55ed1aSAlex Wilson 	fConverting(false),
125dd55ed1aSAlex Wilson 	fCancelling(false)
1266af4da5dSStephan Aßmus {
127b78760b9SPhilippe Saint-Pierre 	BPath outputDir;
128b78760b9SPhilippe Saint-Pierre 	if (find_directory(B_USER_DIRECTORY, &outputDir) != B_OK)
129b78760b9SPhilippe Saint-Pierre 		outputDir.SetTo("/boot/home");
130b78760b9SPhilippe Saint-Pierre 	fOutputDir.SetTo(outputDir.Path());
1316af4da5dSStephan Aßmus 
132dd55ed1aSAlex Wilson 	fMenuBar = new BMenuBar("menubar");
1336af4da5dSStephan Aßmus 	_CreateMenu();
1346af4da5dSStephan Aßmus 
135a9adf1a6SJohn Scipione 	float padding = be_control_look->DefaultItemSpacing();
136a9adf1a6SJohn Scipione 
137dd55ed1aSAlex Wilson 	fListView = new MediaFileListView();
138a9adf1a6SJohn Scipione 	fListView->SetExplicitMinSize(BSize(padding * 10, B_SIZE_UNSET));
139dd55ed1aSAlex Wilson 	BScrollView* scroller = new BScrollView(NULL, fListView, 0, false, true);
1406af4da5dSStephan Aßmus 
1416af4da5dSStephan Aßmus 	// file list view box
142dd55ed1aSAlex Wilson 	fSourcesBox = new BBox(B_FANCY_BORDER, scroller);
143dd55ed1aSAlex Wilson 	fSourcesBox->SetLayout(new BGroupLayout(B_HORIZONTAL, 0));
144dd55ed1aSAlex Wilson 	// We give fSourcesBox a layout to provide insets for the sources list
145dd55ed1aSAlex Wilson 	// said insets are adjusted in _UpdateLabels
1466af4da5dSStephan Aßmus 
147dd55ed1aSAlex Wilson 	fInfoView = new MediaFileInfoView();
148dd55ed1aSAlex Wilson 	fInfoBox = new BBox(B_FANCY_BORDER, fInfoView);
149dd55ed1aSAlex Wilson 	fInfoBox->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH,
150dd55ed1aSAlex Wilson 			B_ALIGN_USE_FULL_HEIGHT));
1517730c846SStephan Aßmus 
152dd55ed1aSAlex Wilson 	// Output format box
153dd55ed1aSAlex Wilson 	fOutputBox = new BBox(B_FANCY_BORDER, NULL);
1540a81944dSStephan Aßmus 	BGridLayout* outputGrid = new BGridLayout(padding, padding);
1550a81944dSStephan Aßmus 	fOutputBox->SetLayout(outputGrid);
156dd55ed1aSAlex Wilson 		// fOutputBox's layout is also adjusted in _UpdateLabels
1577730c846SStephan Aßmus 	outputGrid->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH,
1587730c846SStephan Aßmus 			B_ALIGN_USE_FULL_HEIGHT));
1597730c846SStephan Aßmus 	fOutputBox->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED));
1606af4da5dSStephan Aßmus 
161ae0f70fcSAdrien Destugues 	fFormatMenu = new BMenuField(NULL, B_TRANSLATE("File format:"),
162ae0f70fcSAdrien Destugues 		new BPopUpMenu(""));
163ae0f70fcSAdrien Destugues 	fAudioMenu = new BMenuField(NULL, B_TRANSLATE("Audio encoding:"),
164ae0f70fcSAdrien Destugues 		new BPopUpMenu(""));
165ae0f70fcSAdrien Destugues 	fVideoMenu = new BMenuField(NULL, B_TRANSLATE("Video encoding:"),
166ae0f70fcSAdrien Destugues 		new BPopUpMenu(""));
1676af4da5dSStephan Aßmus 
1686af4da5dSStephan Aßmus 	// output folder
169ae0f70fcSAdrien Destugues 	fDestButton = new BButton(B_TRANSLATE("Output folder"),
170dd55ed1aSAlex Wilson 		new BMessage(OUTPUT_FOLDER_MESSAGE));
171dd55ed1aSAlex Wilson 	BAlignment labelAlignment(be_control_look->DefaultLabelAlignment());
172b78760b9SPhilippe Saint-Pierre 	fOutputFolder = new BStringView(NULL, outputDir.Path());
173dd55ed1aSAlex Wilson 	fOutputFolder->SetExplicitAlignment(labelAlignment);
1746af4da5dSStephan Aßmus 
1756af4da5dSStephan Aßmus 	// start/end duration
1764d891825SJohn Scipione 	fStartDurationTC = new BTextControl(NULL, "0", NULL);
1774d891825SJohn Scipione 	fEndDurationTC = new BTextControl(NULL, "0", NULL);
1786af4da5dSStephan Aßmus 
1796af4da5dSStephan Aßmus 	// Video Quality
180dd55ed1aSAlex Wilson 	fVideoQualitySlider = new BSlider("VSlider", "" ,
181dd55ed1aSAlex Wilson 		new BMessage(VIDEO_QUALITY_CHANGED_MESSAGE), 1, 100, B_HORIZONTAL);
18253bb96c5SJohn Scipione 	fVideoQualitySlider->SetModificationMessage(
18353bb96c5SJohn Scipione 		new BMessage(VIDEO_QUALITY_CHANGED_MESSAGE));
1846af4da5dSStephan Aßmus 	fVideoQualitySlider->SetValue(fVideoQuality);
1856af4da5dSStephan Aßmus 	fVideoQualitySlider->SetEnabled(false);
1866af4da5dSStephan Aßmus 
1876af4da5dSStephan Aßmus 	// Audio Quality
188dd55ed1aSAlex Wilson 	fAudioQualitySlider = new BSlider("ASlider", "" ,
189dd55ed1aSAlex Wilson 		new BMessage(AUDIO_QUALITY_CHANGED_MESSAGE), 1, 100, B_HORIZONTAL);
19053bb96c5SJohn Scipione 	fAudioQualitySlider->SetModificationMessage(
19153bb96c5SJohn Scipione 		new BMessage(AUDIO_QUALITY_CHANGED_MESSAGE));
1926af4da5dSStephan Aßmus 	fAudioQualitySlider->SetValue(fAudioQuality);
1936af4da5dSStephan Aßmus 	fAudioQualitySlider->SetEnabled(false);
194dd55ed1aSAlex Wilson 
1950a81944dSStephan Aßmus 	BLayoutBuilder::Grid<>(outputGrid)
196dd55ed1aSAlex Wilson 		.SetInsets(padding, padding, padding, padding)
197*83010212SJohn Scipione 		.Add(fFormatMenu->CreateLabelLayoutItem(), 0, 0)
198*83010212SJohn Scipione 		.Add(fFormatMenu->CreateMenuBarLayoutItem(), 1, 0)
199*83010212SJohn Scipione 		.Add(fAudioMenu->CreateLabelLayoutItem(), 0, 1)
200*83010212SJohn Scipione 		.Add(fAudioMenu->CreateMenuBarLayoutItem(), 1, 1)
201*83010212SJohn Scipione 		.Add(fVideoMenu->CreateLabelLayoutItem(), 0, 2)
202*83010212SJohn Scipione 		.Add(fVideoMenu->CreateMenuBarLayoutItem(), 1, 2)
203dd55ed1aSAlex Wilson 		.Add(fDestButton, 0, 3)
204dd55ed1aSAlex Wilson 		.Add(fOutputFolder, 1, 3)
205*83010212SJohn Scipione 		.Add(fStartDurationTC->CreateLabelLayoutItem(), 0, 4)
206*83010212SJohn Scipione 		.Add(fStartDurationTC->CreateTextViewLayoutItem(), 1, 4)
207*83010212SJohn Scipione 		.Add(fEndDurationTC->CreateLabelLayoutItem(), 0, 5)
208*83010212SJohn Scipione 		.Add(fEndDurationTC->CreateTextViewLayoutItem(), 1, 5)
209dd55ed1aSAlex Wilson 		.Add(fVideoQualitySlider, 0, 6, 2, 1)
210dd55ed1aSAlex Wilson 		.Add(fAudioQualitySlider, 0, 7, 2, 1);
2116af4da5dSStephan Aßmus 
2126af4da5dSStephan Aßmus 	// buttons
213ae0f70fcSAdrien Destugues 	fPreviewButton = new BButton(B_TRANSLATE("Preview"),
214dd55ed1aSAlex Wilson 		new BMessage(PREVIEW_MESSAGE));
2156af4da5dSStephan Aßmus 	fPreviewButton->SetEnabled(false);
2166af4da5dSStephan Aßmus 
217ae0f70fcSAdrien Destugues 	fConvertButton = new BButton(B_TRANSLATE("Convert"),
218dd55ed1aSAlex Wilson 		new BMessage(CONVERT_BUTTON_MESSAGE));
2196af4da5dSStephan Aßmus 
220dd55ed1aSAlex Wilson 	// Status views
221dd55ed1aSAlex Wilson 	fStatus = new BStringView(NULL, NULL);
222dd55ed1aSAlex Wilson 	fStatus->SetExplicitAlignment(labelAlignment);
223dd55ed1aSAlex Wilson 	fFileStatus = new BStringView(NULL, NULL);
224dd55ed1aSAlex Wilson 	fFileStatus->SetExplicitAlignment(labelAlignment);
2256af4da5dSStephan Aßmus 
2266af4da5dSStephan Aßmus 	SetStatusMessage("");
2276af4da5dSStephan Aßmus 	_UpdateLabels();
2286af4da5dSStephan Aßmus 
229dd55ed1aSAlex Wilson 	BLayoutBuilder::Group<>(this, B_VERTICAL, 0)
230dd55ed1aSAlex Wilson 		.SetInsets(0, 0, 0, 0)
231dd55ed1aSAlex Wilson 		.Add(fMenuBar)
2327730c846SStephan Aßmus 		.AddSplit(B_HORIZONTAL, padding / 2)
233dd55ed1aSAlex Wilson 			.SetInsets(padding, padding, padding, padding)
2347730c846SStephan Aßmus 			.Add(fSourcesBox, 0.4)
2357730c846SStephan Aßmus 			.AddGroup(B_VERTICAL, padding, 0.6)
2367730c846SStephan Aßmus 				.Add(fInfoBox)
2377730c846SStephan Aßmus 				.Add(fOutputBox)
2387730c846SStephan Aßmus 			.End()
2397730c846SStephan Aßmus 		.End()
2407730c846SStephan Aßmus 		.AddGrid(padding, padding)
2417730c846SStephan Aßmus 			.SetInsets(padding, 0, padding, padding)
242dd55ed1aSAlex Wilson 			.Add(fStatus, 0, 0)
243dd55ed1aSAlex Wilson 			.Add(fFileStatus, 0, 1)
2449b2ea762SAlex Wilson 			.Add(BSpaceLayoutItem::CreateGlue(), 1, 0)
245dd55ed1aSAlex Wilson 			.Add(fPreviewButton, 2, 0)
2467730c846SStephan Aßmus 			.Add(fConvertButton, 3, 0)
2477730c846SStephan Aßmus 		.End()
2487730c846SStephan Aßmus 	;
2496af4da5dSStephan Aßmus }
2506af4da5dSStephan Aßmus 
2516af4da5dSStephan Aßmus 
2526af4da5dSStephan Aßmus MediaConverterWindow::~MediaConverterWindow()
2536af4da5dSStephan Aßmus {
2543c0f9a7cSKarsten Heimrich 	delete fSaveFilePanel;
2553c0f9a7cSKarsten Heimrich 	delete fOpenFilePanel;
2566af4da5dSStephan Aßmus }
2576af4da5dSStephan Aßmus 
2586af4da5dSStephan Aßmus 
2596af4da5dSStephan Aßmus // #pragma mark -
2606af4da5dSStephan Aßmus 
2616af4da5dSStephan Aßmus 
2626af4da5dSStephan Aßmus void
2636af4da5dSStephan Aßmus MediaConverterWindow::MessageReceived(BMessage* msg)
2646af4da5dSStephan Aßmus {
2656af4da5dSStephan Aßmus 	entry_ref inRef;
2666af4da5dSStephan Aßmus 
2676af4da5dSStephan Aßmus 	char buffer[40];
268f086ada7SStephan Aßmus 	BEntry inEntry;
2696af4da5dSStephan Aßmus 
2706af4da5dSStephan Aßmus 	switch (msg->what) {
2716af4da5dSStephan Aßmus 		#if B_BEOS_VERSION <= B_BEOS_VERSION_6
2726af4da5dSStephan Aßmus 		case B_LANGUAGE_CHANGED:
2736af4da5dSStephan Aßmus 			LanguageChanged();
2746af4da5dSStephan Aßmus 			break;
2756af4da5dSStephan Aßmus 		#endif
2766af4da5dSStephan Aßmus 
2776af4da5dSStephan Aßmus 		case INIT_FORMAT_MENUS:
2786af4da5dSStephan Aßmus 			BuildFormatMenu();
2796af4da5dSStephan Aßmus 			if (CountSourceFiles() == 0)
2806af4da5dSStephan Aßmus 				SetEnabled(false, false);
2816af4da5dSStephan Aßmus 			break;
2826af4da5dSStephan Aßmus 
2836af4da5dSStephan Aßmus 		case B_SIMPLE_DATA:
284f086ada7SStephan Aßmus 			if (msg->WasDropped()) {
2856af4da5dSStephan Aßmus 				DetachCurrentMessage();
2866af4da5dSStephan Aßmus 				msg->what = B_REFS_RECEIVED;
2876af4da5dSStephan Aßmus 				BMessenger(be_app).SendMessage(msg);
2886af4da5dSStephan Aßmus 				delete msg;
2896af4da5dSStephan Aßmus 			}
2906af4da5dSStephan Aßmus 			break;
2916af4da5dSStephan Aßmus 
2926af4da5dSStephan Aßmus 		case FORMAT_SELECT_MESSAGE:
2936af4da5dSStephan Aßmus 			BuildAudioVideoMenus();
2946af4da5dSStephan Aßmus 			break;
2956af4da5dSStephan Aßmus 		case AUDIO_CODEC_SELECT_MESSAGE:
2966af4da5dSStephan Aßmus 			break;
2976af4da5dSStephan Aßmus 		case VIDEO_CODEC_SELECT_MESSAGE:
2986af4da5dSStephan Aßmus 			break;
2996af4da5dSStephan Aßmus 
3006af4da5dSStephan Aßmus 		case CONVERT_BUTTON_MESSAGE:
3016af4da5dSStephan Aßmus 			if (!fConverting) {
302ae0f70fcSAdrien Destugues 				fConvertButton->SetLabel(B_TRANSLATE("Cancel"));
3036af4da5dSStephan Aßmus 				fConverting = true;
304ae0f70fcSAdrien Destugues 				SetStatusMessage(B_TRANSLATE("Convert"));
3056af4da5dSStephan Aßmus 				SetEnabled(false, true);
3066af4da5dSStephan Aßmus 				BMessenger(be_app).SendMessage(START_CONVERSION_MESSAGE);
3076af4da5dSStephan Aßmus 			} else if (!fCancelling) {
3086af4da5dSStephan Aßmus 				fCancelling = true;
309ae0f70fcSAdrien Destugues 				SetStatusMessage(B_TRANSLATE("Cancelling" B_UTF8_ELLIPSIS));
3106af4da5dSStephan Aßmus 				BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE);
3116af4da5dSStephan Aßmus 			}
3126af4da5dSStephan Aßmus 			break;
3136af4da5dSStephan Aßmus 
3146af4da5dSStephan Aßmus 		case CONVERSION_DONE_MESSAGE:
315f086ada7SStephan Aßmus 		{
316ae0f70fcSAdrien Destugues 			SetStatusMessage(fCancelling ? B_TRANSLATE("Conversion cancelled")
317ae0f70fcSAdrien Destugues 				: B_TRANSLATE("Conversion completed"));
3186af4da5dSStephan Aßmus 			fConverting = false;
3196af4da5dSStephan Aßmus 			fCancelling = false;
3206af4da5dSStephan Aßmus 			bool enable = CountSourceFiles() > 0;
3216af4da5dSStephan Aßmus 			SetEnabled(enable, enable);
322ae0f70fcSAdrien Destugues 			fConvertButton->SetLabel(B_TRANSLATE("Convert"));
3236af4da5dSStephan Aßmus 			break;
324f086ada7SStephan Aßmus 		}
3256af4da5dSStephan Aßmus 
3266af4da5dSStephan Aßmus 		case OUTPUT_FOLDER_MESSAGE:
3276af4da5dSStephan Aßmus 			// Execute Save Panel
328f086ada7SStephan Aßmus 			if (fSaveFilePanel == NULL) {
329f086ada7SStephan Aßmus 				BButton* selectThisDir;
3306af4da5dSStephan Aßmus 
3313c0f9a7cSKarsten Heimrich 				BMessage message(FOLDER_SELECT_MESSAGE);
3323c0f9a7cSKarsten Heimrich 				fSaveFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL,
3333c0f9a7cSKarsten Heimrich 					B_DIRECTORY_NODE, true, &message, NULL, false, true);
334ae0f70fcSAdrien Destugues 				fSaveFilePanel->SetButtonLabel(B_DEFAULT_BUTTON,
335ae0f70fcSAdrien Destugues 					B_TRANSLATE("Select"));
3366af4da5dSStephan Aßmus 				fSaveFilePanel->SetTarget(this);
3376af4da5dSStephan Aßmus 
3386af4da5dSStephan Aßmus 				fSaveFilePanel->Window()->Lock();
339ae0f70fcSAdrien Destugues 				fSaveFilePanel->Window()->SetTitle(
340ae0f70fcSAdrien Destugues 					B_TRANSLATE("MediaConverter+:SaveDirectory"));
341f086ada7SStephan Aßmus 				BRect buttonRect
342f086ada7SStephan Aßmus 					= fSaveFilePanel->Window()->ChildAt(0)->FindView(
343f086ada7SStephan Aßmus 						"cancel button")->Frame();
344f086ada7SStephan Aßmus 				buttonRect.right  = buttonRect.left - 20;
345f086ada7SStephan Aßmus 				buttonRect.left = buttonRect.right - 130;
346ae0f70fcSAdrien Destugues 				selectThisDir = new BButton(buttonRect, NULL,
347ae0f70fcSAdrien Destugues 					B_TRANSLATE("Select this folder"),
348f086ada7SStephan Aßmus 					new BMessage(SELECT_THIS_DIR_MESSAGE),
349f086ada7SStephan Aßmus 					B_FOLLOW_BOTTOM | B_FOLLOW_RIGHT);
350f086ada7SStephan Aßmus 				selectThisDir->SetTarget(this);
351f086ada7SStephan Aßmus 				fSaveFilePanel->Window()->ChildAt(0)->AddChild(selectThisDir);
3526af4da5dSStephan Aßmus 				fSaveFilePanel->Window()->Unlock();
3536af4da5dSStephan Aßmus 
354f086ada7SStephan Aßmus 				fSaveFilePanel->SetRefFilter(new DirectoryFilter);
3556af4da5dSStephan Aßmus 			}
3566af4da5dSStephan Aßmus 			fSaveFilePanel->Show();
3576af4da5dSStephan Aßmus 			break;
3586af4da5dSStephan Aßmus 
3596af4da5dSStephan Aßmus 		case FOLDER_SELECT_MESSAGE:
3606af4da5dSStephan Aßmus 			// "SELECT" Button at Save Panel Pushed
3616af4da5dSStephan Aßmus 			fSaveFilePanel->GetNextSelectedRef(&inRef);
362f086ada7SStephan Aßmus 			inEntry.SetTo(&inRef, true);
363f086ada7SStephan Aßmus 			_SetOutputFolder(inEntry);
3646af4da5dSStephan Aßmus 			fOutputDirSpecified = true;
3656af4da5dSStephan Aßmus 			break;
3666af4da5dSStephan Aßmus 
3676af4da5dSStephan Aßmus 		case SELECT_THIS_DIR_MESSAGE:
3686af4da5dSStephan Aßmus 			// "THIS DIR" Button at Save Panel Pushed
3696af4da5dSStephan Aßmus 			fSaveFilePanel->GetPanelDirectory(&inRef);
3706af4da5dSStephan Aßmus 			fSaveFilePanel->Hide();
371f086ada7SStephan Aßmus 			inEntry.SetTo(&inRef, true);
372f086ada7SStephan Aßmus 			_SetOutputFolder(inEntry);
3736af4da5dSStephan Aßmus 			fOutputDirSpecified = true;
3746af4da5dSStephan Aßmus 			break;
3756af4da5dSStephan Aßmus 
3766af4da5dSStephan Aßmus 		case OPEN_FILE_MESSAGE:
3776af4da5dSStephan Aßmus 			// Execute Open Panel
3786af4da5dSStephan Aßmus 			if (!fOpenFilePanel) {
3793c0f9a7cSKarsten Heimrich 				fOpenFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL,
3803c0f9a7cSKarsten Heimrich 					B_FILE_NODE, true, NULL, NULL, false, true);
3816af4da5dSStephan Aßmus 				fOpenFilePanel->SetTarget(this);
3826af4da5dSStephan Aßmus 			}
3836af4da5dSStephan Aßmus 			fOpenFilePanel->Show();
3846af4da5dSStephan Aßmus 			break;
3856af4da5dSStephan Aßmus 
3866af4da5dSStephan Aßmus 		case B_REFS_RECEIVED:
3876af4da5dSStephan Aßmus 			// Media Files Seleced by Open Panel
3886af4da5dSStephan Aßmus 			DetachCurrentMessage();
3896af4da5dSStephan Aßmus 			msg->what = B_REFS_RECEIVED;
3906af4da5dSStephan Aßmus 			BMessenger(be_app).SendMessage(msg);
3916af4da5dSStephan Aßmus 			// fall through
3926af4da5dSStephan Aßmus 
3936af4da5dSStephan Aßmus 		case B_CANCEL:
3946af4da5dSStephan Aßmus 			break;
3956af4da5dSStephan Aßmus 
3966af4da5dSStephan Aßmus 		case QUIT_MESSAGE:
3976af4da5dSStephan Aßmus 			MediaConverterWindow::QuitRequested();
3986af4da5dSStephan Aßmus 			break;
3996af4da5dSStephan Aßmus 
4006af4da5dSStephan Aßmus 		case PREVIEW_MESSAGE:
401f086ada7SStephan Aßmus 		{
402f086ada7SStephan Aßmus 			// Build the command line to launch the preview application.
403f086ada7SStephan Aßmus 			// TODO: Launch the default app instead of hardcoded MediaPlayer!
404f086ada7SStephan Aßmus 			int32 srcIndex = fListView->CurrentSelection();
405f086ada7SStephan Aßmus 			BMediaFile* inFile = NULL;
406f086ada7SStephan Aßmus 			status_t status = GetSourceFileAt(srcIndex, &inFile, &inRef);
4076af4da5dSStephan Aßmus 
408f086ada7SStephan Aßmus 			const char* argv[3];
409f086ada7SStephan Aßmus 			BString startPosString;
410f086ada7SStephan Aßmus 			BPath path;
411f086ada7SStephan Aßmus 
4126af4da5dSStephan Aßmus 			if (status == B_OK) {
413f086ada7SStephan Aßmus 				argv[0] = "-pos";
414f086ada7SStephan Aßmus 					// NOTE: -pos argument is currently not supported by Haiku
415f086ada7SStephan Aßmus 					// MediaPlayer.
416f086ada7SStephan Aßmus 				startPosString << fStartDurationTC->Text();
417f086ada7SStephan Aßmus 				startPosString << "000";
418f086ada7SStephan Aßmus 				argv[1] = startPosString.String();
4196af4da5dSStephan Aßmus 
420f086ada7SStephan Aßmus 				status = inEntry.SetTo(&inRef);
4216af4da5dSStephan Aßmus 			}
4226af4da5dSStephan Aßmus 
423f086ada7SStephan Aßmus 			if (status == B_OK) {
424f086ada7SStephan Aßmus 				status = inEntry.GetPath(&path);
425f086ada7SStephan Aßmus 				if (status == B_OK)
426f086ada7SStephan Aßmus 					argv[2] = path.Path();
427f086ada7SStephan Aßmus 			}
4286af4da5dSStephan Aßmus 
429f086ada7SStephan Aßmus 			if (status == B_OK) {
430f086ada7SStephan Aßmus 				status = be_roster->Launch(
431f086ada7SStephan Aßmus 					"application/x-vnd.Haiku-MediaPlayer",
432f086ada7SStephan Aßmus 					3, (char**)argv, NULL);
433f086ada7SStephan Aßmus 			}
434f086ada7SStephan Aßmus 
435f086ada7SStephan Aßmus 			if (status != B_OK && status != B_ALREADY_RUNNING) {
436007d8a0cSSiarzhuk Zharski 				BString errorString(B_TRANSLATE("Error launching: %strError%"));
437007d8a0cSSiarzhuk Zharski 				errorString.ReplaceFirst("%strError%", strerror(status));
438aed35104SHumdinger 				BAlert* alert = new BAlert(B_TRANSLATE("Error"),
439aed35104SHumdinger 					errorString.String(), B_TRANSLATE("OK"));
440aed35104SHumdinger 				alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
441aed35104SHumdinger 				alert->Go();
4426af4da5dSStephan Aßmus 			}
4436af4da5dSStephan Aßmus 			break;
444f086ada7SStephan Aßmus 		}
4456af4da5dSStephan Aßmus 
4466af4da5dSStephan Aßmus 		case VIDEO_QUALITY_CHANGED_MESSAGE:
447f086ada7SStephan Aßmus 		{
448f086ada7SStephan Aßmus 			int32 value;
4496af4da5dSStephan Aßmus 			msg->FindInt32("be:value", &value);
450ae0f70fcSAdrien Destugues 			snprintf(buffer, sizeof(buffer),
451ae0f70fcSAdrien Destugues 				B_TRANSLATE("Video quality: %3d%%"), (int8)value);
4526af4da5dSStephan Aßmus 			fVideoQualitySlider->SetLabel(buffer);
4536af4da5dSStephan Aßmus 			fVideoQuality = value;
4546af4da5dSStephan Aßmus 			break;
455f086ada7SStephan Aßmus 		}
4566af4da5dSStephan Aßmus 
4576af4da5dSStephan Aßmus 		case AUDIO_QUALITY_CHANGED_MESSAGE:
458f086ada7SStephan Aßmus 		{
459f086ada7SStephan Aßmus 			int32 value;
4606af4da5dSStephan Aßmus 			msg->FindInt32("be:value", &value);
461ae0f70fcSAdrien Destugues 			snprintf(buffer, sizeof(buffer),
462ae0f70fcSAdrien Destugues 				B_TRANSLATE("Audio quality: %3d%%"), (int8)value);
4636af4da5dSStephan Aßmus 			fAudioQualitySlider->SetLabel(buffer);
4646af4da5dSStephan Aßmus 			fAudioQuality = value;
4656af4da5dSStephan Aßmus 			break;
466f086ada7SStephan Aßmus 		}
4676af4da5dSStephan Aßmus 
4686af4da5dSStephan Aßmus 		default:
4696af4da5dSStephan Aßmus 			BWindow::MessageReceived(msg);
4706af4da5dSStephan Aßmus 	}
4716af4da5dSStephan Aßmus }
4726af4da5dSStephan Aßmus 
4736af4da5dSStephan Aßmus 
4746af4da5dSStephan Aßmus bool
4756af4da5dSStephan Aßmus MediaConverterWindow::QuitRequested()
4766af4da5dSStephan Aßmus {
4776af4da5dSStephan Aßmus 	if (!fConverting) {
4786af4da5dSStephan Aßmus 		BMessenger(be_app).SendMessage(B_QUIT_REQUESTED);
4796af4da5dSStephan Aßmus 		return true;
4806af4da5dSStephan Aßmus 	} else if (!fCancelling) {
4816af4da5dSStephan Aßmus 		fCancelling = true;
482ae0f70fcSAdrien Destugues 		SetStatusMessage(B_TRANSLATE("Cancelling"));
4836af4da5dSStephan Aßmus 		BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE);
4846af4da5dSStephan Aßmus 	}
4856af4da5dSStephan Aßmus 	return false;
4866af4da5dSStephan Aßmus }
4876af4da5dSStephan Aßmus 
4886af4da5dSStephan Aßmus 
4896af4da5dSStephan Aßmus // #pragma mark -
4906af4da5dSStephan Aßmus 
4916af4da5dSStephan Aßmus 
4926af4da5dSStephan Aßmus void
4936af4da5dSStephan Aßmus MediaConverterWindow::LanguageChanged()
4946af4da5dSStephan Aßmus {
4956af4da5dSStephan Aßmus 	_DestroyMenu();
4966af4da5dSStephan Aßmus 	_CreateMenu();
4976af4da5dSStephan Aßmus 	_UpdateLabels();
4986af4da5dSStephan Aßmus 	BuildAudioVideoMenus();
4996af4da5dSStephan Aßmus 	Lock();
5006af4da5dSStephan Aßmus 	fInfoView->Invalidate();
5016af4da5dSStephan Aßmus 	Unlock();
5026af4da5dSStephan Aßmus }
5036af4da5dSStephan Aßmus 
5046af4da5dSStephan Aßmus 
5056af4da5dSStephan Aßmus void
5066af4da5dSStephan Aßmus MediaConverterWindow::BuildAudioVideoMenus()
5076af4da5dSStephan Aßmus {
5086af4da5dSStephan Aßmus 	BMenu* menu = fAudioMenu->Menu();
5096af4da5dSStephan Aßmus 	BMenuItem* item;
5106af4da5dSStephan Aßmus 	// clear out old audio codec menu items
5117f4d1af4SSergei Reznikov 	while ((item = menu->RemoveItem((int32)0)) != NULL)
5126af4da5dSStephan Aßmus 		delete item;
5136af4da5dSStephan Aßmus 
5146af4da5dSStephan Aßmus 	bool separator = true;
5156af4da5dSStephan Aßmus 
5166af4da5dSStephan Aßmus 	// get selected file format
5177730c846SStephan Aßmus 	FileFormatMenuItem* ffmi
5187730c846SStephan Aßmus 		= (FileFormatMenuItem*)fFormatMenu->Menu()->FindMarked();
5196af4da5dSStephan Aßmus 	media_file_format* mf_format = &(ffmi->fFileFormat);
5206af4da5dSStephan Aßmus 
5216af4da5dSStephan Aßmus 	media_format format, outfmt;
5226af4da5dSStephan Aßmus 	memset(&format, 0, sizeof(format));
5236af4da5dSStephan Aßmus 	media_codec_info codec_info;
5246af4da5dSStephan Aßmus 	int32 cookie = 0;
5256af4da5dSStephan Aßmus 	CodecMenuItem* cmi;
5266af4da5dSStephan Aßmus 
5276af4da5dSStephan Aßmus 	// add available audio encoders to menu
5286af4da5dSStephan Aßmus 	format.type = B_MEDIA_RAW_AUDIO;
5296af4da5dSStephan Aßmus 	format.u.raw_audio = media_raw_audio_format::wildcard;
5307730c846SStephan Aßmus 	while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info)
5317730c846SStephan Aßmus 		== B_OK) {
5326af4da5dSStephan Aßmus 		if (separator) {
533ae0f70fcSAdrien Destugues 			menu->AddItem(new BMenuItem(
534546208a5SOliver Tappe 				B_TRANSLATE_CONTEXT("No audio", "Audio codecs list"),
5356af4da5dSStephan Aßmus 				new BMessage(AUDIO_CODEC_SELECT_MESSAGE)));
5366af4da5dSStephan Aßmus 			menu->AddSeparatorItem();
5376af4da5dSStephan Aßmus 			separator = false;
5386af4da5dSStephan Aßmus 		}
5396af4da5dSStephan Aßmus 
5406af4da5dSStephan Aßmus 		cmi = new CodecMenuItem(&codec_info, AUDIO_CODEC_SELECT_MESSAGE);
5416af4da5dSStephan Aßmus 		menu->AddItem(cmi);
5426af4da5dSStephan Aßmus 		// reset media format struct
5436af4da5dSStephan Aßmus /*
5446af4da5dSStephan Aßmus 		format.type = B_MEDIA_RAW_AUDIO;
5456af4da5dSStephan Aßmus 		format.u.raw_audio = media_raw_audio_format::wildcard;
5466af4da5dSStephan Aßmus */
5476af4da5dSStephan Aßmus 	}
5486af4da5dSStephan Aßmus 
5496af4da5dSStephan Aßmus 	// mark first audio encoder
5506af4da5dSStephan Aßmus 	item = menu->ItemAt(0);
5516af4da5dSStephan Aßmus 	if (item != NULL) {
5526af4da5dSStephan Aßmus 		fAudioMenu->SetEnabled(fEnabled);
5536af4da5dSStephan Aßmus 		fAudioQualitySlider->SetEnabled(fEnabled);
5546af4da5dSStephan Aßmus 		item->SetMarked(true);
5556af4da5dSStephan Aßmus 		((BInvoker *)item)->Invoke();
5566af4da5dSStephan Aßmus 	} else {
557ae0f70fcSAdrien Destugues 		item = new BMenuItem(
558546208a5SOliver Tappe 			B_TRANSLATE_CONTEXT("None available", "Audio codecs"),
559ae0f70fcSAdrien Destugues 			NULL);
5606af4da5dSStephan Aßmus 		menu->AddItem(item);
5616af4da5dSStephan Aßmus 		item->SetMarked(true);
5626af4da5dSStephan Aßmus 		fAudioMenu->SetEnabled(false);
5636af4da5dSStephan Aßmus 		fAudioQualitySlider->SetEnabled(false);
5646af4da5dSStephan Aßmus 	}
5656af4da5dSStephan Aßmus 
5666af4da5dSStephan Aßmus 	// clear out old video codec menu items
5676af4da5dSStephan Aßmus 	menu = fVideoMenu->Menu();
5687f4d1af4SSergei Reznikov 	while ((item = menu->RemoveItem((int32)0)) != NULL)
5696af4da5dSStephan Aßmus 		delete item;
5706af4da5dSStephan Aßmus 
5716af4da5dSStephan Aßmus 	separator = true;
5726af4da5dSStephan Aßmus 
5736af4da5dSStephan Aßmus 	// construct a generic video format.  Some of these parameters
5746af4da5dSStephan Aßmus 	// seem silly, but are needed for R4.5.x, which is more picky
5756af4da5dSStephan Aßmus 	// than subsequent BeOS releases will be.
5766af4da5dSStephan Aßmus 	memset(&format, 0, sizeof(format));
5776af4da5dSStephan Aßmus 	format.type = B_MEDIA_RAW_VIDEO;
5786af4da5dSStephan Aßmus 	format.u.raw_video.last_active = (uint32)(240 - 1);
5796af4da5dSStephan Aßmus 	format.u.raw_video.orientation = B_VIDEO_TOP_LEFT_RIGHT;
5806af4da5dSStephan Aßmus 	format.u.raw_video.display.format = B_RGB32;
5816af4da5dSStephan Aßmus 	format.u.raw_video.display.line_width = (int32)320;
5826af4da5dSStephan Aßmus 	format.u.raw_video.display.line_count = (int32)240;
5836af4da5dSStephan Aßmus 	format.u.raw_video.display.bytes_per_row = 4 * 320;
5846af4da5dSStephan Aßmus 
5856af4da5dSStephan Aßmus 	// add available video encoders to menu
5866af4da5dSStephan Aßmus 	cookie = 0;
5876af4da5dSStephan Aßmus 	while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info) == B_OK) {
5886af4da5dSStephan Aßmus 		if (separator) {
589ae0f70fcSAdrien Destugues 			menu->AddItem(new BMenuItem(
590546208a5SOliver Tappe 				B_TRANSLATE_CONTEXT("No video", "Video codecs list"),
5916af4da5dSStephan Aßmus 				new BMessage(VIDEO_CODEC_SELECT_MESSAGE)));
5926af4da5dSStephan Aßmus 			menu->AddSeparatorItem();
5936af4da5dSStephan Aßmus 			separator = false;
5946af4da5dSStephan Aßmus 		}
5956af4da5dSStephan Aßmus 
5966af4da5dSStephan Aßmus 		cmi = new CodecMenuItem(&codec_info, VIDEO_CODEC_SELECT_MESSAGE);
5976af4da5dSStephan Aßmus 		menu->AddItem(cmi);
5986af4da5dSStephan Aßmus 	}
5996af4da5dSStephan Aßmus 
6006af4da5dSStephan Aßmus 	// mark first video encoder
6016af4da5dSStephan Aßmus 	item = menu->ItemAt(0);
6026af4da5dSStephan Aßmus 	if (item != NULL) {
6036af4da5dSStephan Aßmus 		fVideoMenu->SetEnabled(fEnabled);
6046af4da5dSStephan Aßmus 		fVideoQualitySlider->SetEnabled(fEnabled);
6056af4da5dSStephan Aßmus 		item->SetMarked(true);
6066af4da5dSStephan Aßmus 		((BInvoker *)item)->Invoke();
6076af4da5dSStephan Aßmus 	} else {
608ae0f70fcSAdrien Destugues 		item = new BMenuItem(
609546208a5SOliver Tappe 			B_TRANSLATE_CONTEXT("None available", "Video codecs"),
610ae0f70fcSAdrien Destugues 			NULL);
6116af4da5dSStephan Aßmus 		menu->AddItem(item);
6126af4da5dSStephan Aßmus 		item->SetMarked(true);
6136af4da5dSStephan Aßmus 		fVideoMenu->SetEnabled(false);
6146af4da5dSStephan Aßmus 		fVideoQualitySlider->SetEnabled(false);
6156af4da5dSStephan Aßmus 	}
6166af4da5dSStephan Aßmus }
6176af4da5dSStephan Aßmus 
6186af4da5dSStephan Aßmus void
6196af4da5dSStephan Aßmus MediaConverterWindow::GetSelectedFormatInfo(media_file_format** format,
6206af4da5dSStephan Aßmus 	media_codec_info** audio, media_codec_info** video)
6216af4da5dSStephan Aßmus {
6226af4da5dSStephan Aßmus 	*audio = NULL;
6236af4da5dSStephan Aßmus 	*video = NULL;
6246af4da5dSStephan Aßmus 	*format = NULL;
6256af4da5dSStephan Aßmus 
6266af4da5dSStephan Aßmus 	FileFormatMenuItem *formatItem =
6276af4da5dSStephan Aßmus 		dynamic_cast<FileFormatMenuItem *>(fFormatMenu->Menu()->FindMarked());
6286af4da5dSStephan Aßmus 	if (formatItem != NULL) {
6296af4da5dSStephan Aßmus 		*format = &(formatItem->fFileFormat);
6306af4da5dSStephan Aßmus 	}
6316af4da5dSStephan Aßmus 
6326af4da5dSStephan Aßmus 	*audio = *video = NULL;
6336af4da5dSStephan Aßmus 	CodecMenuItem *codecItem =
6346af4da5dSStephan Aßmus 		dynamic_cast<CodecMenuItem *>(fAudioMenu->Menu()->FindMarked());
6356af4da5dSStephan Aßmus 	if (codecItem != NULL) {
6366af4da5dSStephan Aßmus 		*audio =  &(codecItem->fCodecInfo);
6376af4da5dSStephan Aßmus 	}
6386af4da5dSStephan Aßmus 
6396af4da5dSStephan Aßmus 	codecItem = dynamic_cast<CodecMenuItem *>(fVideoMenu->Menu()->FindMarked());
6406af4da5dSStephan Aßmus 	if (codecItem != NULL) {
6416af4da5dSStephan Aßmus 		*video =  &(codecItem->fCodecInfo);
6426af4da5dSStephan Aßmus 	}
6436af4da5dSStephan Aßmus }
6446af4da5dSStephan Aßmus 
6456af4da5dSStephan Aßmus 
6466af4da5dSStephan Aßmus void
6476af4da5dSStephan Aßmus MediaConverterWindow::BuildFormatMenu()
6486af4da5dSStephan Aßmus {
6496af4da5dSStephan Aßmus 	BMenu *menu = fFormatMenu->Menu();
6506af4da5dSStephan Aßmus 	BMenuItem *item;
6516af4da5dSStephan Aßmus 	// clear out old format menu items
6526af4da5dSStephan Aßmus 	while ((item = menu->RemoveItem((int32)0)) != NULL) {
6536af4da5dSStephan Aßmus 		delete item;
6546af4da5dSStephan Aßmus 	}
6556af4da5dSStephan Aßmus 
6566af4da5dSStephan Aßmus 	// add menu items for each file format
6576af4da5dSStephan Aßmus 	media_file_format mfi;
6586af4da5dSStephan Aßmus 	int32 cookie = 0;
6596af4da5dSStephan Aßmus 	FileFormatMenuItem *ff_item;
6606af4da5dSStephan Aßmus 	while (get_next_file_format(&cookie, &mfi) == B_OK) {
6616af4da5dSStephan Aßmus 		ff_item = new FileFormatMenuItem(&mfi);
6626af4da5dSStephan Aßmus 		menu->AddItem(ff_item);
6636af4da5dSStephan Aßmus 	}
6646af4da5dSStephan Aßmus 
6656af4da5dSStephan Aßmus 	// mark first item
6666af4da5dSStephan Aßmus 	item = menu->ItemAt(0);
6676af4da5dSStephan Aßmus 	if (item != NULL) {
6686af4da5dSStephan Aßmus 		item->SetMarked(true);
6696af4da5dSStephan Aßmus 		((BInvoker *)item)->Invoke();
6706af4da5dSStephan Aßmus 	}
6716af4da5dSStephan Aßmus }
6726af4da5dSStephan Aßmus 
673dd55ed1aSAlex Wilson 
6746af4da5dSStephan Aßmus void
6756af4da5dSStephan Aßmus MediaConverterWindow::SetFileMessage(const char *message)
6766af4da5dSStephan Aßmus {
677dd55ed1aSAlex Wilson 	fFileStatus->SetText(message);
6786af4da5dSStephan Aßmus }
6796af4da5dSStephan Aßmus 
680dd55ed1aSAlex Wilson 
6816af4da5dSStephan Aßmus void
6826af4da5dSStephan Aßmus MediaConverterWindow::SetStatusMessage(const char *message)
6836af4da5dSStephan Aßmus {
684dd55ed1aSAlex Wilson 	fStatus->SetText(message);
6856af4da5dSStephan Aßmus }
6866af4da5dSStephan Aßmus 
6876af4da5dSStephan Aßmus 
6886af4da5dSStephan Aßmus // #pragma mark -
6896af4da5dSStephan Aßmus 
6906af4da5dSStephan Aßmus 
6911c992a52SStephan Aßmus bool
6926af4da5dSStephan Aßmus MediaConverterWindow::AddSourceFile(BMediaFile* file, const entry_ref& ref)
6936af4da5dSStephan Aßmus {
6941c992a52SStephan Aßmus 	if (!fListView->AddMediaItem(file, ref))
6951c992a52SStephan Aßmus 		return false;
6966af4da5dSStephan Aßmus 
6976af4da5dSStephan Aßmus 	if (!fOutputDirSpecified) {
6986af4da5dSStephan Aßmus 		BEntry entry(&ref);
6996af4da5dSStephan Aßmus 		entry.GetParent(&entry);
7006af4da5dSStephan Aßmus 		_SetOutputFolder(entry);
7016af4da5dSStephan Aßmus 	}
7021c992a52SStephan Aßmus 
7031c992a52SStephan Aßmus 	return true;
7046af4da5dSStephan Aßmus }
7056af4da5dSStephan Aßmus 
7066af4da5dSStephan Aßmus 
7076af4da5dSStephan Aßmus void
7086af4da5dSStephan Aßmus MediaConverterWindow::RemoveSourceFile(int32 index)
7096af4da5dSStephan Aßmus {
7106af4da5dSStephan Aßmus 	delete fListView->RemoveItem(index);
7116af4da5dSStephan Aßmus 	fStartDurationTC->SetText("0");
7126af4da5dSStephan Aßmus 	fEndDurationTC->SetText("0");
7136af4da5dSStephan Aßmus }
7146af4da5dSStephan Aßmus 
7156af4da5dSStephan Aßmus 
7166af4da5dSStephan Aßmus int32
7176af4da5dSStephan Aßmus MediaConverterWindow::CountSourceFiles()
7186af4da5dSStephan Aßmus {
7196af4da5dSStephan Aßmus 	return fListView->CountItems();
7206af4da5dSStephan Aßmus }
7216af4da5dSStephan Aßmus 
7226af4da5dSStephan Aßmus 
7236af4da5dSStephan Aßmus status_t
7246af4da5dSStephan Aßmus MediaConverterWindow::GetSourceFileAt(int32 index, BMediaFile** _file,
7256af4da5dSStephan Aßmus 	entry_ref* ref)
7266af4da5dSStephan Aßmus {
7276af4da5dSStephan Aßmus 	MediaFileListItem* item = dynamic_cast<MediaFileListItem*>(
7286af4da5dSStephan Aßmus 		fListView->ItemAt(index));
7296af4da5dSStephan Aßmus 	if (item != NULL) {
7306af4da5dSStephan Aßmus 		*_file = item->fMediaFile;
7316af4da5dSStephan Aßmus 		*ref = item->fRef;
7326af4da5dSStephan Aßmus 		return B_OK;
7336af4da5dSStephan Aßmus 	} else {
7346af4da5dSStephan Aßmus 		return B_ERROR;
7356af4da5dSStephan Aßmus 	}
7366af4da5dSStephan Aßmus }
7376af4da5dSStephan Aßmus 
7386af4da5dSStephan Aßmus 
7396af4da5dSStephan Aßmus void
7406af4da5dSStephan Aßmus MediaConverterWindow::SourceFileSelectionChanged()
7416af4da5dSStephan Aßmus {
7426af4da5dSStephan Aßmus 	int32 selected = fListView->CurrentSelection();
7436af4da5dSStephan Aßmus 	BMediaFile* file = NULL;
7446af4da5dSStephan Aßmus 	entry_ref ref;
7457730c846SStephan Aßmus 	bool enabled = GetSourceFileAt(selected, &file, &ref) == B_OK;
7466af4da5dSStephan Aßmus 
7476af4da5dSStephan Aßmus 	fPreviewButton->SetEnabled(enabled);
7486af4da5dSStephan Aßmus 	fVideoQualitySlider->SetEnabled(enabled);
7496af4da5dSStephan Aßmus 	fAudioQualitySlider->SetEnabled(enabled);
7506af4da5dSStephan Aßmus 	fStartDurationTC->SetEnabled(enabled);
7516af4da5dSStephan Aßmus 	fEndDurationTC->SetEnabled(enabled);
7526af4da5dSStephan Aßmus 
7537730c846SStephan Aßmus 	BString duration;
7547730c846SStephan Aßmus 	if (enabled) {
7557730c846SStephan Aßmus 		fInfoView->Update(file, &ref);
7566af4da5dSStephan Aßmus 		// HACK: get the fInfoView to update the duration "synchronously"
7576af4da5dSStephan Aßmus 		UpdateIfNeeded();
7587730c846SStephan Aßmus 		duration << fInfoView->Duration() / 1000;
7597730c846SStephan Aßmus 	} else
7607730c846SStephan Aßmus 		duration = "0";
7616af4da5dSStephan Aßmus 
7626af4da5dSStephan Aßmus 	// update duration text controls
7636af4da5dSStephan Aßmus 	fStartDurationTC->SetText("0");
7646af4da5dSStephan Aßmus 	fEndDurationTC->SetText(duration.String());
7656af4da5dSStephan Aßmus }
7666af4da5dSStephan Aßmus 
7676af4da5dSStephan Aßmus 
7686af4da5dSStephan Aßmus // #pragma mark -
7696af4da5dSStephan Aßmus 
7706af4da5dSStephan Aßmus 
7716af4da5dSStephan Aßmus void
7726af4da5dSStephan Aßmus MediaConverterWindow::SetEnabled(bool enabled, bool convertEnabled)
7736af4da5dSStephan Aßmus {
7746af4da5dSStephan Aßmus 	fConvertButton->SetEnabled(convertEnabled);
7756af4da5dSStephan Aßmus 	if (enabled == fEnabled)
7766af4da5dSStephan Aßmus 			return;
7776af4da5dSStephan Aßmus 
7786af4da5dSStephan Aßmus 	fFormatMenu->SetEnabled(enabled);
7796af4da5dSStephan Aßmus 	fAudioMenu->SetEnabled(enabled);
7806af4da5dSStephan Aßmus 	fVideoMenu->SetEnabled(enabled);
7816af4da5dSStephan Aßmus 	fListView->SetEnabled(enabled);
7826af4da5dSStephan Aßmus 	fStartDurationTC->SetEnabled(enabled);
7836af4da5dSStephan Aßmus 	fEndDurationTC->SetEnabled(enabled);
7846af4da5dSStephan Aßmus 
7856af4da5dSStephan Aßmus 	fEnabled = enabled;
7866af4da5dSStephan Aßmus }
7876af4da5dSStephan Aßmus 
7886af4da5dSStephan Aßmus 
7896af4da5dSStephan Aßmus bool
7906af4da5dSStephan Aßmus MediaConverterWindow::IsEnabled()
7916af4da5dSStephan Aßmus {
7926af4da5dSStephan Aßmus 	return fEnabled;
7936af4da5dSStephan Aßmus }
7946af4da5dSStephan Aßmus 
7956af4da5dSStephan Aßmus 
7966af4da5dSStephan Aßmus const char*
7976af4da5dSStephan Aßmus MediaConverterWindow::StartDuration() const
7986af4da5dSStephan Aßmus {
7996af4da5dSStephan Aßmus 	return fStartDurationTC->Text();
8006af4da5dSStephan Aßmus }
8016af4da5dSStephan Aßmus 
8026af4da5dSStephan Aßmus 
8036af4da5dSStephan Aßmus const char*
8046af4da5dSStephan Aßmus MediaConverterWindow::EndDuration() const
8056af4da5dSStephan Aßmus {
8066af4da5dSStephan Aßmus 	return fEndDurationTC->Text();
8076af4da5dSStephan Aßmus }
8086af4da5dSStephan Aßmus 
8096af4da5dSStephan Aßmus 
8106af4da5dSStephan Aßmus BDirectory
8116af4da5dSStephan Aßmus MediaConverterWindow::OutputDirectory() const
8126af4da5dSStephan Aßmus {
8136af4da5dSStephan Aßmus 	return fOutputDir;
8146af4da5dSStephan Aßmus }
8156af4da5dSStephan Aßmus 
8166af4da5dSStephan Aßmus 
8176af4da5dSStephan Aßmus void
8186af4da5dSStephan Aßmus MediaConverterWindow::SetAudioQualityLabel(const char* label)
8196af4da5dSStephan Aßmus {
8206af4da5dSStephan Aßmus 	fAudioQualitySlider->SetLabel(label);
8216af4da5dSStephan Aßmus }
8226af4da5dSStephan Aßmus 
8236af4da5dSStephan Aßmus 
8246af4da5dSStephan Aßmus void
8256af4da5dSStephan Aßmus MediaConverterWindow::SetVideoQualityLabel(const char* label)
8266af4da5dSStephan Aßmus {
8276af4da5dSStephan Aßmus 	fVideoQualitySlider->SetLabel(label);
8286af4da5dSStephan Aßmus }
8296af4da5dSStephan Aßmus 
8306af4da5dSStephan Aßmus 
8316af4da5dSStephan Aßmus // #pragma mark -
8326af4da5dSStephan Aßmus 
8336af4da5dSStephan Aßmus 
8346af4da5dSStephan Aßmus void
8356af4da5dSStephan Aßmus MediaConverterWindow::_UpdateLabels()
8366af4da5dSStephan Aßmus {
837dd55ed1aSAlex Wilson 	if (fSourcesBox != NULL) {
838ae0f70fcSAdrien Destugues 		fSourcesBox->SetLabel(B_TRANSLATE("Source files"));
839dd55ed1aSAlex Wilson 		_UpdateBBoxLayoutInsets(fSourcesBox);
840dd55ed1aSAlex Wilson 	}
8416af4da5dSStephan Aßmus 
842dd55ed1aSAlex Wilson 	if (fInfoBox != NULL)
843ae0f70fcSAdrien Destugues 		fInfoBox->SetLabel(B_TRANSLATE("File details"));
8446af4da5dSStephan Aßmus 
845dd55ed1aSAlex Wilson 	if (fOutputBox != NULL) {
846ae0f70fcSAdrien Destugues 		fOutputBox->SetLabel(B_TRANSLATE("Output format"));
847dd55ed1aSAlex Wilson 		_UpdateBBoxLayoutInsets(fOutputBox);
848dd55ed1aSAlex Wilson 	}
8496af4da5dSStephan Aßmus 
850dd55ed1aSAlex Wilson 	if (fConvertButton != NULL)
851ae0f70fcSAdrien Destugues 		fConvertButton->SetLabel(B_TRANSLATE("Convert"));
8526af4da5dSStephan Aßmus 
853dd55ed1aSAlex Wilson 	if (fPreviewButton != NULL)
854ae0f70fcSAdrien Destugues 		fPreviewButton->SetLabel(B_TRANSLATE("Preview"));
8556af4da5dSStephan Aßmus 
856dd55ed1aSAlex Wilson 	if (fDestButton != NULL)
857ae0f70fcSAdrien Destugues 		fDestButton->SetLabel(B_TRANSLATE("Output folder"));
8586af4da5dSStephan Aßmus 
8596af4da5dSStephan Aßmus 	if (fVideoQualitySlider != NULL) {
860dd55ed1aSAlex Wilson 		char buffer[40];
861ae0f70fcSAdrien Destugues 		snprintf(buffer, sizeof(buffer), B_TRANSLATE("Video quality: %3d%%"),
862f086ada7SStephan Aßmus 			(int8)fVideoQuality);
8636af4da5dSStephan Aßmus 		fVideoQualitySlider->SetLabel(buffer);
864ae0f70fcSAdrien Destugues 		fVideoQualitySlider->SetLimitLabels(B_TRANSLATE("Low"),
865ae0f70fcSAdrien Destugues 			B_TRANSLATE("High"));
8666af4da5dSStephan Aßmus 	}
8676af4da5dSStephan Aßmus 
8686af4da5dSStephan Aßmus 	if (fAudioQualitySlider != NULL) {
869dd55ed1aSAlex Wilson 		char buffer[40];
870ae0f70fcSAdrien Destugues 		snprintf(buffer, sizeof(buffer), B_TRANSLATE("Audio quality: %3d%%"),
871f086ada7SStephan Aßmus 			(int8)fAudioQuality);
8726af4da5dSStephan Aßmus 		fAudioQualitySlider->SetLabel(buffer);
873ae0f70fcSAdrien Destugues 		fAudioQualitySlider->SetLimitLabels(B_TRANSLATE("Low"),
874ae0f70fcSAdrien Destugues 			B_TRANSLATE("High"));
8756af4da5dSStephan Aßmus 	}
8766af4da5dSStephan Aßmus 
877dd55ed1aSAlex Wilson 	if (fStartDurationTC != NULL)
878ae0f70fcSAdrien Destugues 		fStartDurationTC->SetLabel(B_TRANSLATE("Start [ms]: "));
879dd55ed1aSAlex Wilson 
880dd55ed1aSAlex Wilson 	if (fEndDurationTC != NULL)
881ae0f70fcSAdrien Destugues 		fEndDurationTC->SetLabel(B_TRANSLATE("End   [ms]: "));
8826af4da5dSStephan Aßmus 
8836af4da5dSStephan Aßmus 	if (fFormatMenu != NULL)
884ae0f70fcSAdrien Destugues 		fFormatMenu->SetLabel(B_TRANSLATE("File format:"));
885dd55ed1aSAlex Wilson 
8866af4da5dSStephan Aßmus 	if (fAudioMenu != NULL)
887ae0f70fcSAdrien Destugues 		fAudioMenu->SetLabel(B_TRANSLATE("Audio encoding:"));
888dd55ed1aSAlex Wilson 
8896af4da5dSStephan Aßmus 	if (fVideoMenu != NULL)
890ae0f70fcSAdrien Destugues 		fVideoMenu->SetLabel(B_TRANSLATE("Video encoding:"));
8916af4da5dSStephan Aßmus 
892ae0f70fcSAdrien Destugues 	SetFileMessage(B_TRANSLATE("Drop media files onto this window"));
8936af4da5dSStephan Aßmus }
8946af4da5dSStephan Aßmus 
8956af4da5dSStephan Aßmus 
8966af4da5dSStephan Aßmus void
897dd55ed1aSAlex Wilson MediaConverterWindow::_UpdateBBoxLayoutInsets(BBox* box)
898dd55ed1aSAlex Wilson {
899dd55ed1aSAlex Wilson 	BTwoDimensionalLayout* layout
900dd55ed1aSAlex Wilson 		= dynamic_cast<BTwoDimensionalLayout*>(box->GetLayout());
9017730c846SStephan Aßmus 	if (layout != NULL) {
902dd55ed1aSAlex Wilson 		float padding = be_control_look->DefaultItemSpacing();
903dd55ed1aSAlex Wilson 		layout->SetInsets(padding, box->TopBorderOffset() + padding, padding,
904dd55ed1aSAlex Wilson 			padding);
905dd55ed1aSAlex Wilson 	}
906dd55ed1aSAlex Wilson }
907dd55ed1aSAlex Wilson 
908dd55ed1aSAlex Wilson 
909dd55ed1aSAlex Wilson void
9106af4da5dSStephan Aßmus MediaConverterWindow::_DestroyMenu()
9116af4da5dSStephan Aßmus {
9126af4da5dSStephan Aßmus 	BMenu* Menu;
9136af4da5dSStephan Aßmus 
9146af4da5dSStephan Aßmus 	while ((Menu = fMenuBar->SubmenuAt(0)) != NULL) {
9156af4da5dSStephan Aßmus 		fMenuBar->RemoveItem(Menu);
9166af4da5dSStephan Aßmus 		delete Menu;
9176af4da5dSStephan Aßmus 	}
9186af4da5dSStephan Aßmus }
9196af4da5dSStephan Aßmus 
9206af4da5dSStephan Aßmus 
9216af4da5dSStephan Aßmus void
9226af4da5dSStephan Aßmus MediaConverterWindow::_CreateMenu()
9236af4da5dSStephan Aßmus {
9246af4da5dSStephan Aßmus 	BMenuItem* item;
9256af4da5dSStephan Aßmus 	BMenu* menu;
9266af4da5dSStephan Aßmus 
927546208a5SOliver Tappe 	menu = new BMenu(B_TRANSLATE_CONTEXT("File", "Menu"));
928546208a5SOliver Tappe 	item = new BMenuItem(B_TRANSLATE_CONTEXT(
929ae0f70fcSAdrien Destugues 		"Open" B_UTF8_ELLIPSIS, "Menu"),
930dd55ed1aSAlex Wilson 		new BMessage(OPEN_FILE_MESSAGE), 'O');
9316af4da5dSStephan Aßmus 	menu->AddItem(item);
9326af4da5dSStephan Aßmus 	menu->AddSeparatorItem();
933546208a5SOliver Tappe 	item = new BMenuItem(B_TRANSLATE_CONTEXT("Quit", "Menu"),
934ae0f70fcSAdrien Destugues 		new BMessage(QUIT_MESSAGE), 'Q');
9356af4da5dSStephan Aßmus 	menu->AddItem(item);
9366af4da5dSStephan Aßmus 
9376af4da5dSStephan Aßmus 	fMenuBar->AddItem(menu);
9386af4da5dSStephan Aßmus }
9396af4da5dSStephan Aßmus 
9406af4da5dSStephan Aßmus 
9416af4da5dSStephan Aßmus void
9426af4da5dSStephan Aßmus MediaConverterWindow::_SetOutputFolder(BEntry entry)
9436af4da5dSStephan Aßmus {
9446af4da5dSStephan Aßmus 	BPath path;
9456af4da5dSStephan Aßmus 	entry.GetPath(&path);
9466af4da5dSStephan Aßmus 	fOutputFolder->SetText(path.Path());
9476af4da5dSStephan Aßmus 	fOutputFolder->ResizeToPreferred();
9486af4da5dSStephan Aßmus 	fOutputDir.SetTo(path.Path());
9496af4da5dSStephan Aßmus }
9506af4da5dSStephan Aßmus 
9516af4da5dSStephan Aßmus 
952