xref: /haiku/src/kits/interface/AboutWindow.cpp (revision ae3724532e7e498d0ac591023d58447afedb2240)
19ce450b9SJohn Scipione /*
27a96554cSlooncraz  * Copyright 2007-2015 Haiku, Inc.
39ce450b9SJohn Scipione  * Distributed under the terms of the MIT License.
49ce450b9SJohn Scipione  *
59ce450b9SJohn Scipione  * Authors:
69ce450b9SJohn Scipione  *		Ryan Leavengood <leavengood@gmail.com>
79ce450b9SJohn Scipione  *		John Scipione <jscipione@gmail.com>
87a96554cSlooncraz  *		Joseph Groover <looncraz@looncraz.net>
99ce450b9SJohn Scipione  */
109ce450b9SJohn Scipione 
119ce450b9SJohn Scipione 
129ce450b9SJohn Scipione #include <AboutWindow.h>
139ce450b9SJohn Scipione 
149ce450b9SJohn Scipione #include <stdarg.h>
159ce450b9SJohn Scipione #include <time.h>
169ce450b9SJohn Scipione 
179ce450b9SJohn Scipione #include <Alert.h>
189ce450b9SJohn Scipione #include <AppFileInfo.h>
199ce450b9SJohn Scipione #include <Bitmap.h>
209ce450b9SJohn Scipione #include <Button.h>
219ce450b9SJohn Scipione #include <File.h>
229ce450b9SJohn Scipione #include <Font.h>
239ce450b9SJohn Scipione #include <GroupLayoutBuilder.h>
249ce450b9SJohn Scipione #include <GroupView.h>
259ce450b9SJohn Scipione #include <InterfaceDefs.h>
269ce450b9SJohn Scipione #include <LayoutBuilder.h>
279ce450b9SJohn Scipione #include <Message.h>
289ce450b9SJohn Scipione #include <MessageFilter.h>
299ce450b9SJohn Scipione #include <Point.h>
309ce450b9SJohn Scipione #include <Roster.h>
319ce450b9SJohn Scipione #include <Screen.h>
329ce450b9SJohn Scipione #include <ScrollView.h>
339ce450b9SJohn Scipione #include <Size.h>
349ce450b9SJohn Scipione #include <String.h>
359ce450b9SJohn Scipione #include <StringView.h>
369ce450b9SJohn Scipione #include <SystemCatalog.h>
379ce450b9SJohn Scipione #include <TextView.h>
389ce450b9SJohn Scipione #include <View.h>
399ce450b9SJohn Scipione #include <Window.h>
409ce450b9SJohn Scipione 
419ce450b9SJohn Scipione 
429ce450b9SJohn Scipione static const float kStripeWidth = 30.0;
439ce450b9SJohn Scipione 
449ce450b9SJohn Scipione using BPrivate::gSystemCatalog;
459ce450b9SJohn Scipione 
469ce450b9SJohn Scipione 
479ce450b9SJohn Scipione #undef B_TRANSLATION_CONTEXT
489ce450b9SJohn Scipione #define B_TRANSLATION_CONTEXT "AboutWindow"
499ce450b9SJohn Scipione 
509ce450b9SJohn Scipione 
511d114757SAugustin Cavalier namespace BPrivate {
521d114757SAugustin Cavalier 
539ce450b9SJohn Scipione class StripeView : public BView {
549ce450b9SJohn Scipione public:
559ce450b9SJohn Scipione 							StripeView(BBitmap* icon);
569ce450b9SJohn Scipione 	virtual					~StripeView();
579ce450b9SJohn Scipione 
589ce450b9SJohn Scipione 	virtual	void			Draw(BRect updateRect);
599ce450b9SJohn Scipione 
Icon() const609ce450b9SJohn Scipione 			BBitmap*		Icon() const { return fIcon; };
619ce450b9SJohn Scipione 			void			SetIcon(BBitmap* icon);
629ce450b9SJohn Scipione 
639ce450b9SJohn Scipione private:
649ce450b9SJohn Scipione 			BBitmap*		fIcon;
659ce450b9SJohn Scipione };
669ce450b9SJohn Scipione 
679ce450b9SJohn Scipione 
689ce450b9SJohn Scipione class AboutView : public BGroupView {
699ce450b9SJohn Scipione public:
709ce450b9SJohn Scipione 							AboutView(const char* name,
719ce450b9SJohn Scipione 								const char* signature);
729ce450b9SJohn Scipione 	virtual					~AboutView();
739ce450b9SJohn Scipione 
747a96554cSlooncraz 	virtual	void			AllAttached();
757a96554cSlooncraz 
InfoView() const769ce450b9SJohn Scipione 			BTextView*		InfoView() const { return fInfoView; };
779ce450b9SJohn Scipione 
789ce450b9SJohn Scipione 			BBitmap*		Icon();
799ce450b9SJohn Scipione 			status_t		SetIcon(BBitmap* icon);
809ce450b9SJohn Scipione 
819ce450b9SJohn Scipione 			const char*		Name();
829ce450b9SJohn Scipione 			status_t		SetName(const char* name);
839ce450b9SJohn Scipione 
849ce450b9SJohn Scipione 			const char*		Version();
859ce450b9SJohn Scipione 			status_t		SetVersion(const char* version);
869ce450b9SJohn Scipione 
879ce450b9SJohn Scipione private:
88*ae372453SFreaxed 			BString			_GetVersionFromSignature(const char* signature);
899ce450b9SJohn Scipione 			BBitmap*		_GetIconFromSignature(const char* signature);
909ce450b9SJohn Scipione 
919ce450b9SJohn Scipione private:
929ce450b9SJohn Scipione 			BStringView*	fNameView;
939ce450b9SJohn Scipione 			BStringView*	fVersionView;
949ce450b9SJohn Scipione 			BTextView*		fInfoView;
959ce450b9SJohn Scipione 			StripeView*		fStripeView;
969ce450b9SJohn Scipione };
979ce450b9SJohn Scipione 
989ce450b9SJohn Scipione 
999ce450b9SJohn Scipione //	#pragma mark - StripeView
1009ce450b9SJohn Scipione 
1019ce450b9SJohn Scipione 
StripeView(BBitmap * icon)1029ce450b9SJohn Scipione StripeView::StripeView(BBitmap* icon)
1039ce450b9SJohn Scipione 	:
1049ce450b9SJohn Scipione 	BView("StripeView", B_WILL_DRAW),
1059ce450b9SJohn Scipione 	fIcon(icon)
1069ce450b9SJohn Scipione {
1077a96554cSlooncraz 	SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
1089ce450b9SJohn Scipione 
1099ce450b9SJohn Scipione 	float width = 0.0f;
1109ce450b9SJohn Scipione 	if (icon != NULL)
111d87eeceeSHumdinger 		width += icon->Bounds().Width() + 24.0f;
1129ce450b9SJohn Scipione 
113d87eeceeSHumdinger 	SetExplicitSize(BSize(width, B_SIZE_UNSET));
1149ce450b9SJohn Scipione 	SetExplicitPreferredSize(BSize(width, B_SIZE_UNLIMITED));
1159ce450b9SJohn Scipione }
1169ce450b9SJohn Scipione 
1179ce450b9SJohn Scipione 
~StripeView()1189ce450b9SJohn Scipione StripeView::~StripeView()
1199ce450b9SJohn Scipione {
1209ce450b9SJohn Scipione }
1219ce450b9SJohn Scipione 
1229ce450b9SJohn Scipione 
1239ce450b9SJohn Scipione void
Draw(BRect updateRect)1249ce450b9SJohn Scipione StripeView::Draw(BRect updateRect)
1259ce450b9SJohn Scipione {
1269ce450b9SJohn Scipione 	if (fIcon == NULL)
1279ce450b9SJohn Scipione 		return;
1289ce450b9SJohn Scipione 
1299ce450b9SJohn Scipione 	SetHighColor(ViewColor());
1309ce450b9SJohn Scipione 	FillRect(updateRect);
1319ce450b9SJohn Scipione 
1329ce450b9SJohn Scipione 	BRect stripeRect = Bounds();
1339ce450b9SJohn Scipione 	stripeRect.right = kStripeWidth;
1349ce450b9SJohn Scipione 	SetHighColor(tint_color(ViewColor(), B_DARKEN_1_TINT));
1359ce450b9SJohn Scipione 	FillRect(stripeRect);
1369ce450b9SJohn Scipione 
1379ce450b9SJohn Scipione 	SetDrawingMode(B_OP_ALPHA);
1389ce450b9SJohn Scipione 	SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY);
1399ce450b9SJohn Scipione 	DrawBitmapAsync(fIcon, BPoint(15.0f, 10.0f));
1409ce450b9SJohn Scipione }
1419ce450b9SJohn Scipione 
1429ce450b9SJohn Scipione 
1439ce450b9SJohn Scipione void
SetIcon(BBitmap * icon)1449ce450b9SJohn Scipione StripeView::SetIcon(BBitmap* icon)
1459ce450b9SJohn Scipione {
1469ce450b9SJohn Scipione 	if (fIcon != NULL)
1479ce450b9SJohn Scipione 		delete fIcon;
1489ce450b9SJohn Scipione 
1499ce450b9SJohn Scipione 	fIcon = icon;
1509ce450b9SJohn Scipione 
1519ce450b9SJohn Scipione 	float width = 0.0f;
1529ce450b9SJohn Scipione 	if (icon != NULL)
153d87eeceeSHumdinger 		width += icon->Bounds().Width() + 24.0f;
1549ce450b9SJohn Scipione 
155d87eeceeSHumdinger 	SetExplicitSize(BSize(width, B_SIZE_UNSET));
1569ce450b9SJohn Scipione 	SetExplicitPreferredSize(BSize(width, B_SIZE_UNLIMITED));
1579ce450b9SJohn Scipione };
1589ce450b9SJohn Scipione 
1599ce450b9SJohn Scipione 
1609ce450b9SJohn Scipione //	#pragma mark - AboutView
1619ce450b9SJohn Scipione 
1629ce450b9SJohn Scipione 
AboutView(const char * appName,const char * signature)1639ce450b9SJohn Scipione AboutView::AboutView(const char* appName, const char* signature)
1649ce450b9SJohn Scipione 	:
1659ce450b9SJohn Scipione 	BGroupView("AboutView", B_VERTICAL)
1669ce450b9SJohn Scipione {
1677a96554cSlooncraz 	SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
1689ce450b9SJohn Scipione 	fNameView = new BStringView("name", appName);
1699ce450b9SJohn Scipione 	BFont font;
1709ce450b9SJohn Scipione 	fNameView->GetFont(&font);
1719ce450b9SJohn Scipione 	font.SetFace(B_BOLD_FACE);
1729ce450b9SJohn Scipione 	font.SetSize(font.Size() * 2.0);
1739ce450b9SJohn Scipione 	fNameView->SetFont(&font, B_FONT_FAMILY_AND_STYLE | B_FONT_SIZE
1749ce450b9SJohn Scipione 		| B_FONT_FLAGS);
175d87eeceeSHumdinger 	fNameView->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET));
1769ce450b9SJohn Scipione 
1779ce450b9SJohn Scipione 	fVersionView = new BStringView("version",
178*ae372453SFreaxed 		_GetVersionFromSignature(signature).String());
179d87eeceeSHumdinger 	fVersionView->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET));
1809ce450b9SJohn Scipione 
1814cb7d0e7SPhilippe Saint-Pierre 	rgb_color documentColor = ui_color(B_DOCUMENT_TEXT_COLOR);
1824cb7d0e7SPhilippe Saint-Pierre 	fInfoView = new BTextView("info", NULL, &documentColor, B_WILL_DRAW);
1839ce450b9SJohn Scipione 	fInfoView->SetExplicitMinSize(BSize(210.0, 160.0));
1849ce450b9SJohn Scipione 	fInfoView->MakeEditable(false);
1859ce450b9SJohn Scipione 	fInfoView->SetWordWrap(true);
1869ce450b9SJohn Scipione 	fInfoView->SetInsets(5.0, 5.0, 5.0, 5.0);
1879ce450b9SJohn Scipione 	fInfoView->SetStylable(true);
1889ce450b9SJohn Scipione 
1899ce450b9SJohn Scipione 	BScrollView* infoViewScroller = new BScrollView(
1909ce450b9SJohn Scipione 		"infoViewScroller", fInfoView, B_WILL_DRAW | B_FRAME_EVENTS,
1919ce450b9SJohn Scipione 		false, true, B_PLAIN_BORDER);
1929ce450b9SJohn Scipione 
1939ce450b9SJohn Scipione 	fStripeView = new StripeView(_GetIconFromSignature(signature));
1949ce450b9SJohn Scipione 
19576a607d2SHumdinger 	const char* ok = B_TRANSLATE_MARK("OK");
1969ce450b9SJohn Scipione 	BButton* closeButton = new BButton("ok",
1979ce450b9SJohn Scipione 		gSystemCatalog.GetString(ok, "AboutWindow"),
1989ce450b9SJohn Scipione 		new BMessage(B_QUIT_REQUESTED));
1999ce450b9SJohn Scipione 
2009ce450b9SJohn Scipione 	GroupLayout()->SetSpacing(0);
2019ce450b9SJohn Scipione 	BLayoutBuilder::Group<>(this, B_HORIZONTAL, 0)
2029ce450b9SJohn Scipione 		.Add(fStripeView)
203d87eeceeSHumdinger 		.AddGroup(B_VERTICAL)
2049ce450b9SJohn Scipione 			.SetInsets(0, B_USE_DEFAULT_SPACING,
2059ce450b9SJohn Scipione 				B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING)
206d87eeceeSHumdinger 			.AddGroup(B_VERTICAL, 0)
2079ce450b9SJohn Scipione 				.Add(fNameView)
2089ce450b9SJohn Scipione 				.Add(fVersionView)
209d87eeceeSHumdinger 				.AddStrut(B_USE_SMALL_SPACING)
2109ce450b9SJohn Scipione 				.Add(infoViewScroller)
211d87eeceeSHumdinger 				.End()
2129ce450b9SJohn Scipione 			.AddGroup(B_HORIZONTAL, 0)
2139ce450b9SJohn Scipione 				.AddGlue()
2149ce450b9SJohn Scipione 				.Add(closeButton)
2159ce450b9SJohn Scipione 				.End()
2169ce450b9SJohn Scipione 			.End()
2177a96554cSlooncraz 		.View()->SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
2189ce450b9SJohn Scipione }
2199ce450b9SJohn Scipione 
2209ce450b9SJohn Scipione 
~AboutView()2219ce450b9SJohn Scipione AboutView::~AboutView()
2229ce450b9SJohn Scipione {
2239ce450b9SJohn Scipione }
2249ce450b9SJohn Scipione 
2259ce450b9SJohn Scipione 
2267a96554cSlooncraz void
AllAttached()2277a96554cSlooncraz AboutView::AllAttached()
2287a96554cSlooncraz {
2297a96554cSlooncraz 	fNameView->SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
2307a96554cSlooncraz 	fInfoView->SetViewUIColor(B_DOCUMENT_BACKGROUND_COLOR);
2317a96554cSlooncraz 	fVersionView->SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
2327a96554cSlooncraz }
2337a96554cSlooncraz 
2347a96554cSlooncraz 
2359ce450b9SJohn Scipione //	#pragma mark - AboutView private methods
2369ce450b9SJohn Scipione 
2379ce450b9SJohn Scipione 
238*ae372453SFreaxed BString
_GetVersionFromSignature(const char * signature)2399ce450b9SJohn Scipione AboutView::_GetVersionFromSignature(const char* signature)
2409ce450b9SJohn Scipione {
2419ce450b9SJohn Scipione 	if (signature == NULL)
2429ce450b9SJohn Scipione 		return NULL;
2439ce450b9SJohn Scipione 
2449ce450b9SJohn Scipione 	entry_ref ref;
2459ce450b9SJohn Scipione 	if (be_roster->FindApp(signature, &ref) != B_OK)
2469ce450b9SJohn Scipione 		return NULL;
2479ce450b9SJohn Scipione 
2489ce450b9SJohn Scipione 	BFile file(&ref, B_READ_ONLY);
2499ce450b9SJohn Scipione 	BAppFileInfo appMime(&file);
2509ce450b9SJohn Scipione 	if (appMime.InitCheck() != B_OK)
2519ce450b9SJohn Scipione 		return NULL;
2529ce450b9SJohn Scipione 
2539ce450b9SJohn Scipione 	version_info versionInfo;
2549ce450b9SJohn Scipione 	if (appMime.GetVersionInfo(&versionInfo, B_APP_VERSION_KIND) == B_OK) {
2559ce450b9SJohn Scipione 		if (versionInfo.major == 0 && versionInfo.middle == 0
2569ce450b9SJohn Scipione 			&& versionInfo.minor == 0) {
2579ce450b9SJohn Scipione 			return NULL;
2589ce450b9SJohn Scipione 		}
2599ce450b9SJohn Scipione 
2609ce450b9SJohn Scipione 		const char* version = B_TRANSLATE_MARK("Version");
2619ce450b9SJohn Scipione 		version = gSystemCatalog.GetString(version, "AboutWindow");
2629ce450b9SJohn Scipione 		BString appVersion(version);
2639ce450b9SJohn Scipione 		appVersion << " " << versionInfo.major << "." << versionInfo.middle;
2649ce450b9SJohn Scipione 		if (versionInfo.minor > 0)
2659ce450b9SJohn Scipione 			appVersion << "." << versionInfo.minor;
2669ce450b9SJohn Scipione 
2679ce450b9SJohn Scipione 		// Add the version variety
2689ce450b9SJohn Scipione 		const char* variety = NULL;
2699ce450b9SJohn Scipione 		switch (versionInfo.variety) {
2709ce450b9SJohn Scipione 			case B_DEVELOPMENT_VERSION:
2719ce450b9SJohn Scipione 				variety = B_TRANSLATE_MARK("development");
2729ce450b9SJohn Scipione 				break;
2739ce450b9SJohn Scipione 			case B_ALPHA_VERSION:
2749ce450b9SJohn Scipione 				variety = B_TRANSLATE_MARK("alpha");
2759ce450b9SJohn Scipione 				break;
2769ce450b9SJohn Scipione 			case B_BETA_VERSION:
2779ce450b9SJohn Scipione 				variety = B_TRANSLATE_MARK("beta");
2789ce450b9SJohn Scipione 				break;
2799ce450b9SJohn Scipione 			case B_GAMMA_VERSION:
2809ce450b9SJohn Scipione 				variety = B_TRANSLATE_MARK("gamma");
2819ce450b9SJohn Scipione 				break;
2829ce450b9SJohn Scipione 			case B_GOLDEN_MASTER_VERSION:
2839ce450b9SJohn Scipione 				variety = B_TRANSLATE_MARK("gold master");
2849ce450b9SJohn Scipione 				break;
2859ce450b9SJohn Scipione 		}
2869ce450b9SJohn Scipione 
2879ce450b9SJohn Scipione 		if (variety != NULL) {
2889ce450b9SJohn Scipione 			variety = gSystemCatalog.GetString(variety, "AboutWindow");
2899ce450b9SJohn Scipione 			appVersion << "-" << variety;
2909ce450b9SJohn Scipione 		}
2919ce450b9SJohn Scipione 
292*ae372453SFreaxed 		return appVersion;
2939ce450b9SJohn Scipione 	}
2949ce450b9SJohn Scipione 
2959ce450b9SJohn Scipione 	return NULL;
2969ce450b9SJohn Scipione }
2979ce450b9SJohn Scipione 
2989ce450b9SJohn Scipione 
2999ce450b9SJohn Scipione BBitmap*
_GetIconFromSignature(const char * signature)3009ce450b9SJohn Scipione AboutView::_GetIconFromSignature(const char* signature)
3019ce450b9SJohn Scipione {
3029ce450b9SJohn Scipione 	if (signature == NULL)
3039ce450b9SJohn Scipione 		return NULL;
3049ce450b9SJohn Scipione 
3059ce450b9SJohn Scipione 	entry_ref ref;
3069ce450b9SJohn Scipione 	if (be_roster->FindApp(signature, &ref) != B_OK)
3079ce450b9SJohn Scipione 		return NULL;
3089ce450b9SJohn Scipione 
3099ce450b9SJohn Scipione 	BFile file(&ref, B_READ_ONLY);
3109ce450b9SJohn Scipione 	BAppFileInfo appMime(&file);
3119ce450b9SJohn Scipione 	if (appMime.InitCheck() != B_OK)
3129ce450b9SJohn Scipione 		return NULL;
3139ce450b9SJohn Scipione 
314d87eeceeSHumdinger 	BBitmap* icon = new BBitmap(BRect(0.0, 0.0, 63.0, 63.0), B_RGBA32);
315d87eeceeSHumdinger 	if (appMime.GetIcon(icon, (icon_size)64) == B_OK)
3169ce450b9SJohn Scipione 		return icon;
3179ce450b9SJohn Scipione 
3189ce450b9SJohn Scipione 	delete icon;
3199ce450b9SJohn Scipione 	return NULL;
3209ce450b9SJohn Scipione }
3219ce450b9SJohn Scipione 
3229ce450b9SJohn Scipione 
3239ce450b9SJohn Scipione //	#pragma mark - AboutView public methods
3249ce450b9SJohn Scipione 
3259ce450b9SJohn Scipione 
3269ce450b9SJohn Scipione BBitmap*
Icon()3279ce450b9SJohn Scipione AboutView::Icon()
3289ce450b9SJohn Scipione {
3299ce450b9SJohn Scipione 	if (fStripeView == NULL)
3309ce450b9SJohn Scipione 		return NULL;
3319ce450b9SJohn Scipione 
3329ce450b9SJohn Scipione 	return fStripeView->Icon();
3339ce450b9SJohn Scipione }
3349ce450b9SJohn Scipione 
3359ce450b9SJohn Scipione 
3369ce450b9SJohn Scipione status_t
SetIcon(BBitmap * icon)3379ce450b9SJohn Scipione AboutView::SetIcon(BBitmap* icon)
3389ce450b9SJohn Scipione {
3399ce450b9SJohn Scipione 	if (fStripeView == NULL)
3409ce450b9SJohn Scipione 		return B_NO_INIT;
3419ce450b9SJohn Scipione 
3429ce450b9SJohn Scipione 	fStripeView->SetIcon(icon);
3439ce450b9SJohn Scipione 
3449ce450b9SJohn Scipione 	return B_OK;
3459ce450b9SJohn Scipione }
3469ce450b9SJohn Scipione 
3479ce450b9SJohn Scipione 
3489ce450b9SJohn Scipione const char*
Name()3499ce450b9SJohn Scipione AboutView::Name()
3509ce450b9SJohn Scipione {
3519ce450b9SJohn Scipione 	return fNameView->Text();
3529ce450b9SJohn Scipione }
3539ce450b9SJohn Scipione 
3549ce450b9SJohn Scipione 
3559ce450b9SJohn Scipione status_t
SetName(const char * name)3569ce450b9SJohn Scipione AboutView::SetName(const char* name)
3579ce450b9SJohn Scipione {
3589ce450b9SJohn Scipione 	fNameView->SetText(name);
3599ce450b9SJohn Scipione 
3609ce450b9SJohn Scipione 	return B_OK;
3619ce450b9SJohn Scipione }
3629ce450b9SJohn Scipione 
3639ce450b9SJohn Scipione 
3649ce450b9SJohn Scipione const char*
Version()3659ce450b9SJohn Scipione AboutView::Version()
3669ce450b9SJohn Scipione {
3679ce450b9SJohn Scipione 	return fVersionView->Text();
3689ce450b9SJohn Scipione }
3699ce450b9SJohn Scipione 
3709ce450b9SJohn Scipione 
3719ce450b9SJohn Scipione status_t
SetVersion(const char * version)3729ce450b9SJohn Scipione AboutView::SetVersion(const char* version)
3739ce450b9SJohn Scipione {
3749ce450b9SJohn Scipione 	fVersionView->SetText(version);
3759ce450b9SJohn Scipione 
3769ce450b9SJohn Scipione 	return B_OK;
3779ce450b9SJohn Scipione }
3789ce450b9SJohn Scipione 
3791d114757SAugustin Cavalier } // namespace BPrivate
3801d114757SAugustin Cavalier 
3819ce450b9SJohn Scipione 
3829ce450b9SJohn Scipione //	#pragma mark - BAboutWindow
3839ce450b9SJohn Scipione 
3849ce450b9SJohn Scipione 
BAboutWindow(const char * appName,const char * signature)3859ce450b9SJohn Scipione BAboutWindow::BAboutWindow(const char* appName, const char* signature)
3869ce450b9SJohn Scipione 	:
387d87eeceeSHumdinger 	BWindow(BRect(0.0, 0.0, 400.0, 200.0), appName, B_MODAL_WINDOW,
388d87eeceeSHumdinger 		B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE
3899ce450b9SJohn Scipione 			| B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE)
3909ce450b9SJohn Scipione {
3919ce450b9SJohn Scipione 	SetLayout(new BGroupLayout(B_VERTICAL));
3929ce450b9SJohn Scipione 
3939ce450b9SJohn Scipione 	const char* about = B_TRANSLATE_MARK("About %app%");
3949ce450b9SJohn Scipione 	about = gSystemCatalog.GetString(about, "AboutWindow");
3959ce450b9SJohn Scipione 
3969ce450b9SJohn Scipione 	BString title(about);
3979ce450b9SJohn Scipione 	title.ReplaceFirst("%app%", appName);
3989ce450b9SJohn Scipione 	SetTitle(title.String());
3999ce450b9SJohn Scipione 
4001d114757SAugustin Cavalier 	fAboutView = new BPrivate::AboutView(appName, signature);
4019ce450b9SJohn Scipione 	AddChild(fAboutView);
4029ce450b9SJohn Scipione 
4039ce450b9SJohn Scipione 	MoveTo(AboutPosition(Frame().Width(), Frame().Height()));
4049ce450b9SJohn Scipione }
4059ce450b9SJohn Scipione 
4069ce450b9SJohn Scipione 
~BAboutWindow()4079ce450b9SJohn Scipione BAboutWindow::~BAboutWindow()
4089ce450b9SJohn Scipione {
4099ce450b9SJohn Scipione 	fAboutView->RemoveSelf();
4109ce450b9SJohn Scipione 	delete fAboutView;
4119ce450b9SJohn Scipione 	fAboutView = NULL;
4129ce450b9SJohn Scipione }
4139ce450b9SJohn Scipione 
4149ce450b9SJohn Scipione 
4159ce450b9SJohn Scipione //	#pragma mark - BAboutWindow virtual methods
4169ce450b9SJohn Scipione 
4179ce450b9SJohn Scipione 
4189ce450b9SJohn Scipione void
Show()4199ce450b9SJohn Scipione BAboutWindow::Show()
4209ce450b9SJohn Scipione {
4219ce450b9SJohn Scipione 	if (IsHidden()) {
4229ce450b9SJohn Scipione 		// move to current workspace
4239ce450b9SJohn Scipione 		SetWorkspaces(B_CURRENT_WORKSPACE);
4249ce450b9SJohn Scipione 	}
4259ce450b9SJohn Scipione 
4269ce450b9SJohn Scipione 	BWindow::Show();
4279ce450b9SJohn Scipione }
4289ce450b9SJohn Scipione 
4299ce450b9SJohn Scipione 
4309ce450b9SJohn Scipione //	#pragma mark - BAboutWindow public methods
4319ce450b9SJohn Scipione 
4329ce450b9SJohn Scipione 
4339ce450b9SJohn Scipione BPoint
AboutPosition(float width,float height)4349ce450b9SJohn Scipione BAboutWindow::AboutPosition(float width, float height)
4359ce450b9SJohn Scipione {
4369ce450b9SJohn Scipione 	BPoint result(100, 100);
4379ce450b9SJohn Scipione 
4389ce450b9SJohn Scipione 	BWindow* window =
4399ce450b9SJohn Scipione 		dynamic_cast<BWindow*>(BLooper::LooperForThread(find_thread(NULL)));
4409ce450b9SJohn Scipione 
4419ce450b9SJohn Scipione 	BScreen screen(window);
4429ce450b9SJohn Scipione 	BRect screenFrame(0, 0, 640, 480);
4439ce450b9SJohn Scipione 	if (screen.IsValid())
4449ce450b9SJohn Scipione 		screenFrame = screen.Frame();
4459ce450b9SJohn Scipione 
4469ce450b9SJohn Scipione 	// Horizontally, we're smack in the middle
4479ce450b9SJohn Scipione 	result.x = screenFrame.left + (screenFrame.Width() / 2.0) - (width / 2.0);
4489ce450b9SJohn Scipione 
4499ce450b9SJohn Scipione 	// This is probably sooo wrong, but it looks right on 1024 x 768
4509ce450b9SJohn Scipione 	result.y = screenFrame.top + (screenFrame.Height() / 4.0)
4519ce450b9SJohn Scipione 		- ceil(height / 3.0);
4529ce450b9SJohn Scipione 
4539ce450b9SJohn Scipione 	return result;
4549ce450b9SJohn Scipione }
4559ce450b9SJohn Scipione 
4569ce450b9SJohn Scipione 
4579ce450b9SJohn Scipione void
AddDescription(const char * description)4589ce450b9SJohn Scipione BAboutWindow::AddDescription(const char* description)
4599ce450b9SJohn Scipione {
4609ce450b9SJohn Scipione 	if (description == NULL)
4619ce450b9SJohn Scipione 		return;
4629ce450b9SJohn Scipione 
4639ce450b9SJohn Scipione 	AddText(description);
4649ce450b9SJohn Scipione }
4659ce450b9SJohn Scipione 
4669ce450b9SJohn Scipione 
4679ce450b9SJohn Scipione void
AddCopyright(int32 firstCopyrightYear,const char * copyrightHolder,const char ** extraCopyrights)4689ce450b9SJohn Scipione BAboutWindow::AddCopyright(int32 firstCopyrightYear,
4699ce450b9SJohn Scipione 	const char* copyrightHolder, const char** extraCopyrights)
4709ce450b9SJohn Scipione {
4719ce450b9SJohn Scipione 	BString copyright(B_UTF8_COPYRIGHT " %years% %holder%");
4729ce450b9SJohn Scipione 
4739ce450b9SJohn Scipione 	// Get current year
4749ce450b9SJohn Scipione 	time_t tp;
4759ce450b9SJohn Scipione 	time(&tp);
4769ce450b9SJohn Scipione 	char currentYear[5];
4779ce450b9SJohn Scipione 	strftime(currentYear, 5, "%Y", localtime(&tp));
4789ce450b9SJohn Scipione 	BString copyrightYears;
4799ce450b9SJohn Scipione 	copyrightYears << firstCopyrightYear;
4809ce450b9SJohn Scipione 	if (copyrightYears != currentYear)
4819ce450b9SJohn Scipione 		copyrightYears << "-" << currentYear;
4829ce450b9SJohn Scipione 
4839ce450b9SJohn Scipione 	BString text("");
4849ce450b9SJohn Scipione 	if (fAboutView->InfoView()->TextLength() > 0)
4859ce450b9SJohn Scipione 		text << "\n\n";
4869ce450b9SJohn Scipione 
4879ce450b9SJohn Scipione 	text << copyright;
4889ce450b9SJohn Scipione 
4899ce450b9SJohn Scipione 	// Fill out the copyright year placeholder
4909ce450b9SJohn Scipione 	text.ReplaceAll("%years%", copyrightYears.String());
4919ce450b9SJohn Scipione 
4929ce450b9SJohn Scipione 	// Fill in the copyright holder placeholder
4939ce450b9SJohn Scipione 	text.ReplaceAll("%holder%", copyrightHolder);
4949ce450b9SJohn Scipione 
4959ce450b9SJohn Scipione 	// Add extra copyright strings
4969ce450b9SJohn Scipione 	if (extraCopyrights != NULL) {
4979ce450b9SJohn Scipione 		// Add optional extra copyright information
4989ce450b9SJohn Scipione 		for (int32 i = 0; extraCopyrights[i]; i++)
4999ce450b9SJohn Scipione 			text << "\n" << B_UTF8_COPYRIGHT << " " << extraCopyrights[i];
5009ce450b9SJohn Scipione 	}
5019ce450b9SJohn Scipione 
5029ce450b9SJohn Scipione 	const char* allRightsReserved = B_TRANSLATE_MARK("All Rights Reserved.");
5039ce450b9SJohn Scipione 	allRightsReserved = gSystemCatalog.GetString(allRightsReserved,
5049ce450b9SJohn Scipione 		"AboutWindow");
5059ce450b9SJohn Scipione 	text << "\n    " << allRightsReserved;
5069ce450b9SJohn Scipione 
5079ce450b9SJohn Scipione 	fAboutView->InfoView()->Insert(text.String());
5089ce450b9SJohn Scipione }
5099ce450b9SJohn Scipione 
5109ce450b9SJohn Scipione 
5119ce450b9SJohn Scipione void
AddAuthors(const char ** authors)5129ce450b9SJohn Scipione BAboutWindow::AddAuthors(const char** authors)
5139ce450b9SJohn Scipione {
5149ce450b9SJohn Scipione 	if (authors == NULL)
5159ce450b9SJohn Scipione 		return;
5169ce450b9SJohn Scipione 
5179ce450b9SJohn Scipione 	const char* writtenBy = B_TRANSLATE_MARK("Written by:");
5189ce450b9SJohn Scipione 	writtenBy = gSystemCatalog.GetString(writtenBy, "AboutWindow");
5199ce450b9SJohn Scipione 
5209ce450b9SJohn Scipione 	AddText(writtenBy, authors);
5219ce450b9SJohn Scipione }
5229ce450b9SJohn Scipione 
5239ce450b9SJohn Scipione 
5249ce450b9SJohn Scipione void
AddSpecialThanks(const char ** thanks)5259ce450b9SJohn Scipione BAboutWindow::AddSpecialThanks(const char** thanks)
5269ce450b9SJohn Scipione {
5279ce450b9SJohn Scipione 	if (thanks == NULL)
5289ce450b9SJohn Scipione 		return;
5299ce450b9SJohn Scipione 
5309ce450b9SJohn Scipione 	const char* specialThanks = B_TRANSLATE_MARK("Special Thanks:");
5319ce450b9SJohn Scipione 	specialThanks = gSystemCatalog.GetString(specialThanks, "AboutWindow");
5329ce450b9SJohn Scipione 
5339ce450b9SJohn Scipione 	AddText(specialThanks, thanks);
5349ce450b9SJohn Scipione }
5359ce450b9SJohn Scipione 
5369ce450b9SJohn Scipione 
5379ce450b9SJohn Scipione void
AddVersionHistory(const char ** history)5389ce450b9SJohn Scipione BAboutWindow::AddVersionHistory(const char** history)
5399ce450b9SJohn Scipione {
5409ce450b9SJohn Scipione 	if (history == NULL)
5419ce450b9SJohn Scipione 		return;
5429ce450b9SJohn Scipione 
5439ce450b9SJohn Scipione 	const char* versionHistory = B_TRANSLATE_MARK("Version history:");
5449ce450b9SJohn Scipione 	versionHistory = gSystemCatalog.GetString(versionHistory, "AboutWindow");
5459ce450b9SJohn Scipione 
5469ce450b9SJohn Scipione 	AddText(versionHistory, history);
5479ce450b9SJohn Scipione }
5489ce450b9SJohn Scipione 
5499ce450b9SJohn Scipione 
5509ce450b9SJohn Scipione void
AddExtraInfo(const char * extraInfo)5519ce450b9SJohn Scipione BAboutWindow::AddExtraInfo(const char* extraInfo)
5529ce450b9SJohn Scipione {
5539ce450b9SJohn Scipione 	if (extraInfo == NULL)
5549ce450b9SJohn Scipione 		return;
5559ce450b9SJohn Scipione 
5569ce450b9SJohn Scipione 	const char* appExtraInfo = B_TRANSLATE_MARK(extraInfo);
5579ce450b9SJohn Scipione 	appExtraInfo = gSystemCatalog.GetString(extraInfo, "AboutWindow");
5589ce450b9SJohn Scipione 
5599ce450b9SJohn Scipione 	BString extra("");
5609ce450b9SJohn Scipione 	if (fAboutView->InfoView()->TextLength() > 0)
5619ce450b9SJohn Scipione 		extra << "\n\n";
5629ce450b9SJohn Scipione 
5639ce450b9SJohn Scipione 	extra << appExtraInfo;
5649ce450b9SJohn Scipione 
5659ce450b9SJohn Scipione 	fAboutView->InfoView()->Insert(extra.String());
5669ce450b9SJohn Scipione }
5679ce450b9SJohn Scipione 
5689ce450b9SJohn Scipione 
5699ce450b9SJohn Scipione void
AddText(const char * header,const char ** contents)5709ce450b9SJohn Scipione BAboutWindow::AddText(const char* header, const char** contents)
5719ce450b9SJohn Scipione {
5729ce450b9SJohn Scipione 	BTextView* infoView = fAboutView->InfoView();
5739ce450b9SJohn Scipione 	int32 textLength = infoView->TextLength();
5749ce450b9SJohn Scipione 	BString text("");
5759ce450b9SJohn Scipione 
5769ce450b9SJohn Scipione 	if (textLength > 0) {
5779ce450b9SJohn Scipione 		text << "\n\n";
5789ce450b9SJohn Scipione 		textLength += 2;
5799ce450b9SJohn Scipione 	}
5809ce450b9SJohn Scipione 
5819ce450b9SJohn Scipione 	const char* indent = "";
5829ce450b9SJohn Scipione 	if (header != NULL) {
5839ce450b9SJohn Scipione 		indent = "    ";
5849ce450b9SJohn Scipione 		text << header;
5859ce450b9SJohn Scipione 	}
5869ce450b9SJohn Scipione 
5879ce450b9SJohn Scipione 	if (contents != NULL) {
5889ce450b9SJohn Scipione 		text << "\n";
5899ce450b9SJohn Scipione 		for (int32 i = 0; contents[i]; i++)
5909ce450b9SJohn Scipione 			text << indent << contents[i] << "\n";
5919ce450b9SJohn Scipione 	}
5929ce450b9SJohn Scipione 
5939ce450b9SJohn Scipione 	infoView->Insert(text.String());
5949ce450b9SJohn Scipione 
5959ce450b9SJohn Scipione 	if (contents != NULL && header != NULL) {
5969ce450b9SJohn Scipione 		infoView->SetFontAndColor(textLength, textLength + strlen(header),
5979ce450b9SJohn Scipione 			be_bold_font);
5989ce450b9SJohn Scipione 	}
5999ce450b9SJohn Scipione }
6009ce450b9SJohn Scipione 
6019ce450b9SJohn Scipione 
6029ce450b9SJohn Scipione BBitmap*
Icon()6039ce450b9SJohn Scipione BAboutWindow::Icon()
6049ce450b9SJohn Scipione {
6059ce450b9SJohn Scipione 	return fAboutView->Icon();
6069ce450b9SJohn Scipione }
6079ce450b9SJohn Scipione 
6089ce450b9SJohn Scipione 
6099ce450b9SJohn Scipione void
SetIcon(BBitmap * icon)6109ce450b9SJohn Scipione BAboutWindow::SetIcon(BBitmap* icon)
6119ce450b9SJohn Scipione {
6129ce450b9SJohn Scipione 	fAboutView->SetIcon(icon);
6139ce450b9SJohn Scipione }
6149ce450b9SJohn Scipione 
6159ce450b9SJohn Scipione 
6169ce450b9SJohn Scipione const char*
Name()6179ce450b9SJohn Scipione BAboutWindow::Name()
6189ce450b9SJohn Scipione {
6199ce450b9SJohn Scipione 	return fAboutView->Name();
6209ce450b9SJohn Scipione }
6219ce450b9SJohn Scipione 
6229ce450b9SJohn Scipione 
6239ce450b9SJohn Scipione void
SetName(const char * name)6249ce450b9SJohn Scipione BAboutWindow::SetName(const char* name)
6259ce450b9SJohn Scipione {
6269ce450b9SJohn Scipione 	fAboutView->SetName(name);
6279ce450b9SJohn Scipione }
6289ce450b9SJohn Scipione 
6299ce450b9SJohn Scipione 
6309ce450b9SJohn Scipione const char*
Version()6319ce450b9SJohn Scipione BAboutWindow::Version()
6329ce450b9SJohn Scipione {
6339ce450b9SJohn Scipione 	return fAboutView->Version();
6349ce450b9SJohn Scipione }
6359ce450b9SJohn Scipione 
6369ce450b9SJohn Scipione 
6379ce450b9SJohn Scipione void
SetVersion(const char * version)6389ce450b9SJohn Scipione BAboutWindow::SetVersion(const char* version)
6399ce450b9SJohn Scipione {
6409ce450b9SJohn Scipione 	fAboutView->SetVersion(version);
6419ce450b9SJohn Scipione }
6429ce450b9SJohn Scipione 
6439ce450b9SJohn Scipione 
6449ce450b9SJohn Scipione // FBC padding
6459ce450b9SJohn Scipione 
_ReservedAboutWindow20()6469ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow20() {}
_ReservedAboutWindow19()6479ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow19() {}
_ReservedAboutWindow18()6489ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow18() {}
_ReservedAboutWindow17()6499ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow17() {}
_ReservedAboutWindow16()6509ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow16() {}
_ReservedAboutWindow15()6519ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow15() {}
_ReservedAboutWindow14()6529ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow14() {}
_ReservedAboutWindow13()6539ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow13() {}
_ReservedAboutWindow12()6549ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow12() {}
_ReservedAboutWindow11()6559ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow11() {}
_ReservedAboutWindow10()6569ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow10() {}
_ReservedAboutWindow9()6579ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow9() {}
_ReservedAboutWindow8()6589ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow8() {}
_ReservedAboutWindow7()6599ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow7() {}
_ReservedAboutWindow6()6609ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow6() {}
_ReservedAboutWindow5()6619ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow5() {}
_ReservedAboutWindow4()6629ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow4() {}
_ReservedAboutWindow3()6639ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow3() {}
_ReservedAboutWindow2()6649ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow2() {}
_ReservedAboutWindow1()6659ce450b9SJohn Scipione void BAboutWindow::_ReservedAboutWindow1() {}
666