16af4da5dSStephan Aßmus// Copyright 1999, Be Incorporated. All Rights Reserved.
26af4da5dSStephan Aßmus// Copyright 2000-2004, Jun Suzuki. All Rights Reserved.
36af4da5dSStephan Aßmus// Copyright 2007, Stephan A��mus. All Rights Reserved.
46af4da5dSStephan Aßmus// This file may be used under the terms of the Be Sample Code License.
56af4da5dSStephan Aßmus#include "MediaFileInfoView.h"
66af4da5dSStephan Aßmus
7e66d0f55SStephan Aßmus#include <Alert.h>
858a25e21SAdrien Destugues#include <Catalog.h>
9dd55ed1aSAlex Wilson#include <ControlLook.h>
1058a25e21SAdrien Destugues#include <Locale.h>
116af4da5dSStephan Aßmus#include <MediaFile.h>
126af4da5dSStephan Aßmus#include <MediaTrack.h>
136af4da5dSStephan Aßmus#include <String.h>
146af4da5dSStephan Aßmus
1558a25e21SAdrien Destugues
16546208a5SOliver Tappe#undef B_TRANSLATION_CONTEXT
17546208a5SOliver Tappe#define B_TRANSLATION_CONTEXT "MediaConverter-FileInfo"
186af4da5dSStephan Aßmus
196af4da5dSStephan Aßmus
20dd55ed1aSAlex Wilsonconst float kSpacing = 5.0f;
21dd55ed1aSAlex Wilson
22dd55ed1aSAlex Wilson
23dd55ed1aSAlex WilsonMediaFileInfoView::MediaFileInfoView()
24dd55ed1aSAlex Wilson	:
25dd55ed1aSAlex Wilson	BView("MediaFileInfoView", B_WILL_DRAW | B_SUPPORTS_LAYOUT),
26dd55ed1aSAlex Wilson	fMinMaxValid(false),
27dd55ed1aSAlex Wilson	fRef(),
28dd55ed1aSAlex Wilson	fMediaFile(NULL)
296af4da5dSStephan Aßmus{
30dd55ed1aSAlex Wilson	SetFont(be_plain_font);
316af4da5dSStephan Aßmus}
326af4da5dSStephan Aßmus
336af4da5dSStephan Aßmus
346af4da5dSStephan AßmusMediaFileInfoView::~MediaFileInfoView()
356af4da5dSStephan Aßmus{
366af4da5dSStephan Aßmus}
376af4da5dSStephan Aßmus
386af4da5dSStephan Aßmus
396af4da5dSStephan Aßmusvoid
406af4da5dSStephan AßmusMediaFileInfoView::Draw(BRect /*update*/)
416af4da5dSStephan Aßmus{
42dd55ed1aSAlex Wilson	_ValidateMinMax();
43dd55ed1aSAlex Wilson
44dd55ed1aSAlex Wilson	_SetFontFace(B_BOLD_FACE);
45dd55ed1aSAlex Wilson
466af4da5dSStephan Aßmus	font_height fh;
476af4da5dSStephan Aßmus	GetFontHeight(&fh);
48dd55ed1aSAlex Wilson	BPoint labelStart(kSpacing, fh.ascent + fh.leading + 1);
496af4da5dSStephan Aßmus
506af4da5dSStephan Aßmus	if (fMediaFile == NULL) {
5158a25e21SAdrien Destugues		DrawString(B_TRANSLATE("No file selected"), labelStart);
526af4da5dSStephan Aßmus		return;
536af4da5dSStephan Aßmus	}
546af4da5dSStephan Aßmus
556af4da5dSStephan Aßmus	// draw filename
56dd55ed1aSAlex Wilson	DrawString(fRef.name, labelStart);
57dd55ed1aSAlex Wilson	labelStart.y += fLineHeight + kSpacing;
58dd55ed1aSAlex Wilson	BPoint infoStart(labelStart.x + fMaxLabelWidth + kSpacing, labelStart.y);
596af4da5dSStephan Aßmus
606af4da5dSStephan Aßmus	// draw labels
6158a25e21SAdrien Destugues	DrawString(B_TRANSLATE("Audio:"), labelStart);
62dd55ed1aSAlex Wilson	labelStart.y += fLineHeight * 2;
63dd55ed1aSAlex Wilson
6458a25e21SAdrien Destugues	DrawString(B_TRANSLATE("Video:"), labelStart);
65dd55ed1aSAlex Wilson	labelStart.y += fLineHeight * 2;
66dd55ed1aSAlex Wilson
6758a25e21SAdrien Destugues	DrawString(B_TRANSLATE("Duration:"), labelStart);
68dd55ed1aSAlex Wilson	labelStart.y += fLineHeight * 2;
696af4da5dSStephan Aßmus
706af4da5dSStephan Aßmus	// draw audio/video/duration info
71dd55ed1aSAlex Wilson	_SetFontFace(B_REGULAR_FACE);
726af4da5dSStephan Aßmus
73dd55ed1aSAlex Wilson	BString* infoStrings[5] = {&fInfo.audio.format, &fInfo.audio.details,
74dd55ed1aSAlex Wilson		&fInfo.video.format, &fInfo.video.details, &fInfo.duration};
75dd55ed1aSAlex Wilson	for (int32 i = 0; i < 5; i++) {
76dd55ed1aSAlex Wilson		DrawString(*infoStrings[i], infoStart);
77dd55ed1aSAlex Wilson		infoStart.y += fLineHeight;
78dd55ed1aSAlex Wilson	}
79dd55ed1aSAlex Wilson}
80dd55ed1aSAlex Wilson
81dd55ed1aSAlex Wilson
82dd55ed1aSAlex WilsonBSize
83dd55ed1aSAlex WilsonMediaFileInfoView::MinSize()
84dd55ed1aSAlex Wilson{
85dd55ed1aSAlex Wilson	_ValidateMinMax();
86dd55ed1aSAlex Wilson	return fMinSize;
87dd55ed1aSAlex Wilson}
88dd55ed1aSAlex Wilson
89dd55ed1aSAlex Wilson
90dd55ed1aSAlex WilsonBSize
91dd55ed1aSAlex WilsonMediaFileInfoView::MaxSize()
92dd55ed1aSAlex Wilson{
939b2ea762SAlex Wilson	return BSize(B_SIZE_UNLIMITED, fMinSize.height);
94dd55ed1aSAlex Wilson}
95dd55ed1aSAlex Wilson
96dd55ed1aSAlex Wilson
97dd55ed1aSAlex WilsonBSize
98dd55ed1aSAlex WilsonMediaFileInfoView::PreferredSize()
99dd55ed1aSAlex Wilson{
100dd55ed1aSAlex Wilson	_ValidateMinMax();
101dd55ed1aSAlex Wilson	return fMinSize;
102dd55ed1aSAlex Wilson}
103dd55ed1aSAlex Wilson
104dd55ed1aSAlex Wilson
105dd55ed1aSAlex WilsonBAlignment
106dd55ed1aSAlex WilsonMediaFileInfoView::LayoutAlignment()
107dd55ed1aSAlex Wilson{
108dd55ed1aSAlex Wilson	return BAlignment(B_ALIGN_LEFT, B_ALIGN_TOP);
109dd55ed1aSAlex Wilson}
110dd55ed1aSAlex Wilson
111dd55ed1aSAlex Wilson
112dd55ed1aSAlex Wilsonvoid
113dd55ed1aSAlex WilsonMediaFileInfoView::InvalidateLayout(bool /*children*/)
114dd55ed1aSAlex Wilson{
115dd55ed1aSAlex Wilson	fMinMaxValid = false;
116dd55ed1aSAlex Wilson	BView::InvalidateLayout();
117dd55ed1aSAlex Wilson}
118dd55ed1aSAlex Wilson
119dd55ed1aSAlex Wilson
120dd55ed1aSAlex Wilsonvoid
121dd55ed1aSAlex WilsonMediaFileInfoView::SetFont(const BFont* font, uint32 mask)
122dd55ed1aSAlex Wilson{
123dd55ed1aSAlex Wilson	BView::SetFont(font, mask);
124dd55ed1aSAlex Wilson	if (mask == B_FONT_FACE)
125dd55ed1aSAlex Wilson		return;
126dd55ed1aSAlex Wilson
127dd55ed1aSAlex Wilson	fLineHeight = _LineHeight();
128dd55ed1aSAlex Wilson	BFont bold(font);
129dd55ed1aSAlex Wilson	bold.SetFace(B_BOLD_FACE);
130dd55ed1aSAlex Wilson	fMaxLabelWidth = 0;
131dd55ed1aSAlex Wilson
13258a25e21SAdrien Destugues	BString labels[] = {B_TRANSLATE("Video:"), B_TRANSLATE("Duration:"), B_TRANSLATE("Audio:")};
133dd55ed1aSAlex Wilson	int32 labelCount = sizeof(labels) / sizeof(BString);
134dd55ed1aSAlex Wilson	fMaxLabelWidth = _MaxLineWidth(labels, labelCount, bold);
135dd55ed1aSAlex Wilson
13658a25e21SAdrien Destugues	fNoFileLabelWidth = ceilf(bold.StringWidth(B_TRANSLATE("No file selected")));
137dd55ed1aSAlex Wilson	InvalidateLayout();
1386af4da5dSStephan Aßmus}
1396af4da5dSStephan Aßmus
1406af4da5dSStephan Aßmus
1416af4da5dSStephan Aßmusvoid
1426af4da5dSStephan AßmusMediaFileInfoView::AttachedToWindow()
1436af4da5dSStephan Aßmus{
1446af4da5dSStephan Aßmus	rgb_color c = Parent()->LowColor();
1456af4da5dSStephan Aßmus	SetViewColor(c);
1466af4da5dSStephan Aßmus	SetLowColor(c);
1476af4da5dSStephan Aßmus}
1486af4da5dSStephan Aßmus
1496af4da5dSStephan Aßmus
1506af4da5dSStephan Aßmusvoid
1516af4da5dSStephan AßmusMediaFileInfoView::Update(BMediaFile* file, entry_ref* ref)
1526af4da5dSStephan Aßmus{
1536af4da5dSStephan Aßmus	if (fMediaFile == file)
1546af4da5dSStephan Aßmus		return;
1556af4da5dSStephan Aßmus
1566af4da5dSStephan Aßmus	fMediaFile = file;
1576af4da5dSStephan Aßmus
158f086ada7SStephan Aßmus	if (file != NULL && ref != NULL) {
1596af4da5dSStephan Aßmus		fRef = *ref;
160ae96ed6dSJohn Scipione		status_t result = fInfo.LoadInfo(file);
161ae96ed6dSJohn Scipione		if (result != B_OK) {
16258a25e21SAdrien Destugues			BString error(B_TRANSLATE("An error has occurred reading the "
16358a25e21SAdrien Destugues				"file info.\n\nError : "));
164ae96ed6dSJohn Scipione			error << strerror(result);
16558a25e21SAdrien Destugues			BAlert* alert = new BAlert(
16658a25e21SAdrien Destugues				B_TRANSLATE("File Error"), error.String(),
167ae96ed6dSJohn Scipione				B_TRANSLATE("OK"), NULL, NULL, B_WIDTH_AS_USUAL, B_STOP_ALERT);
168aed35104SHumdinger			alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
169f086ada7SStephan Aßmus			alert->Go(NULL);
170f086ada7SStephan Aßmus		}
171ae96ed6dSJohn Scipione	} else
1726af4da5dSStephan Aßmus		fRef = entry_ref();
173ae96ed6dSJohn Scipione
174dd55ed1aSAlex Wilson	InvalidateLayout();
1756af4da5dSStephan Aßmus	Invalidate();
1766af4da5dSStephan Aßmus}
1776af4da5dSStephan Aßmus
1786af4da5dSStephan Aßmus
179dd55ed1aSAlex Wilsonfloat
180dd55ed1aSAlex WilsonMediaFileInfoView::_LineHeight()
181dd55ed1aSAlex Wilson{
182dd55ed1aSAlex Wilson	font_height fontHeight;
183dd55ed1aSAlex Wilson	GetFontHeight(&fontHeight);
184dd55ed1aSAlex Wilson	return ceilf(fontHeight.ascent + fontHeight.descent + fontHeight.leading);
185dd55ed1aSAlex Wilson}
1866af4da5dSStephan Aßmus
1876af4da5dSStephan Aßmus
188dd55ed1aSAlex Wilsonfloat
189dd55ed1aSAlex WilsonMediaFileInfoView::_MaxLineWidth(BString* strings, int32 count,
190dd55ed1aSAlex Wilson	const BFont& font)
191dd55ed1aSAlex Wilson{
192dd55ed1aSAlex Wilson	float width = 0;
193dd55ed1aSAlex Wilson	for (int32 i = 0; i < count; i++)
194dd55ed1aSAlex Wilson		width = max_c(font.StringWidth(strings[i]), width);
195dd55ed1aSAlex Wilson
196dd55ed1aSAlex Wilson	return ceilf(width);
197dd55ed1aSAlex Wilson}
198dd55ed1aSAlex Wilson
199dd55ed1aSAlex Wilson
200dd55ed1aSAlex Wilsonvoid
201dd55ed1aSAlex WilsonMediaFileInfoView::_ValidateMinMax()
2026af4da5dSStephan Aßmus{
203dd55ed1aSAlex Wilson	if (fMinMaxValid)
204dd55ed1aSAlex Wilson		return;
205dd55ed1aSAlex Wilson
206dd55ed1aSAlex Wilson	BFont font;
207dd55ed1aSAlex Wilson	GetFont(&font);
208dd55ed1aSAlex Wilson
209dd55ed1aSAlex Wilson	BFont bold(font);
210dd55ed1aSAlex Wilson	bold.SetFace(B_BOLD_FACE);
211dd55ed1aSAlex Wilson	fMinSize.Set(0, 0);
212dd55ed1aSAlex Wilson
213dd55ed1aSAlex Wilson	if (fMediaFile == NULL) {
214dd55ed1aSAlex Wilson		fMinSize.width =  fNoFileLabelWidth + kSpacing * 2;
215dd55ed1aSAlex Wilson		fMinSize.height = fLineHeight + kSpacing;
2166af4da5dSStephan Aßmus		return;
2176af4da5dSStephan Aßmus	}
2186af4da5dSStephan Aßmus
219dd55ed1aSAlex Wilson	fMinSize.height += fLineHeight + kSpacing + 1;
220dd55ed1aSAlex Wilson	fMinSize.width = ceilf(bold.StringWidth(fRef.name));
221dd55ed1aSAlex Wilson
222dd55ed1aSAlex Wilson	BString strings[5] = {fInfo.audio.format, fInfo.audio.details,
223dd55ed1aSAlex Wilson		fInfo.video.format, fInfo.video.details, fInfo.duration};
224dd55ed1aSAlex Wilson	float maxInfoWidth = _MaxLineWidth(strings, 5, font);
225dd55ed1aSAlex Wilson
226dd55ed1aSAlex Wilson	fMinSize.width = max_c(fMinSize.width, fMaxLabelWidth
227dd55ed1aSAlex Wilson		+ maxInfoWidth + kSpacing);
228dd55ed1aSAlex Wilson	fMinSize.width += kSpacing;
229dd55ed1aSAlex Wilson
230dd55ed1aSAlex Wilson	fMinSize.height += fLineHeight * 5 + 2 * kSpacing;
231dd55ed1aSAlex Wilson		// 5 lines of info, w/ spacing above and below (not between lines)
232dd55ed1aSAlex Wilson
233dd55ed1aSAlex Wilson	ResetLayoutInvalidation();
234dd55ed1aSAlex Wilson	fMinMaxValid = true;
2356af4da5dSStephan Aßmus}
2366af4da5dSStephan Aßmus
2376af4da5dSStephan Aßmus
238dd55ed1aSAlex Wilsonvoid
239dd55ed1aSAlex WilsonMediaFileInfoView::_SetFontFace(uint16 face)
240dd55ed1aSAlex Wilson{
241dd55ed1aSAlex Wilson	BFont font;
242dd55ed1aSAlex Wilson	font.SetFace(face);
243dd55ed1aSAlex Wilson	SetFont(&font, B_FONT_FACE);
244dd55ed1aSAlex Wilson}
245dd55ed1aSAlex Wilson
246