xref: /haiku/src/kits/interface/ZombieReplicantView.cpp (revision 17889a8c70dbb3d59c1412f6431968753c767bab)
1 /*
2  * Copyright 2001-2010, Haiku.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Marc Flerackers (mflerackers@androme.be)
7  */
8 
9 #include <Alert.h>
10 #include <Message.h>
11 #include <MimeType.h>
12 #include <String.h>
13 #include <SystemCatalog.h>
14 
15 #include "ZombieReplicantView.h"
16 
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <string.h>
20 #include <new>
21 
22 using BPrivate::gSystemCatalog;
23 
24 #undef B_TRANSLATION_CONTEXT
25 #define B_TRANSLATION_CONTEXT "ZombieReplicantView"
26 
27 #undef B_TRANSLATE
28 #define B_TRANSLATE(str) \
29 	gSystemCatalog.GetString(B_TRANSLATE_MARK(str), "ZombieReplicantView")
30 
31 
32 _BZombieReplicantView_::_BZombieReplicantView_(BRect frame, status_t error)
33 	:
34 	BBox(frame, "<Zombie>", B_FOLLOW_NONE, B_WILL_DRAW),
35 	fError(error)
36 {
37 	BFont font(be_bold_font);
38 	font.SetSize(9.0f); // TODO
39 	SetFont(&font);
40 	SetViewColor(kZombieColor);
41 }
42 
43 
44 _BZombieReplicantView_::~_BZombieReplicantView_()
45 {
46 }
47 
48 
49 void
50 _BZombieReplicantView_::MessageReceived(BMessage* msg)
51 {
52 	switch (msg->what) {
53 		case B_ABOUT_REQUESTED:
54 		{
55 			const char* addOn = NULL;
56 			BString error;
57 			if (fArchive->FindString("add_on", &addOn) == B_OK) {
58 				char description[B_MIME_TYPE_LENGTH] = "";
59 				BMimeType type(addOn);
60 				type.GetShortDescription(description);
61 				error = B_TRANSLATE("Cannot create the replicant for "
62 						"\"%description\".\n%error");
63 				error.ReplaceFirst("%description", description);
64 			} else
65 				error = B_TRANSLATE("Cannot locate the application for the "
66 					"replicant. No application signature supplied.\n%error");
67 
68 			error.ReplaceFirst("%error", strerror(fError));
69 
70 			BAlert* alert = new (std::nothrow) BAlert(B_TRANSLATE("Error"),
71 				error.String(), B_TRANSLATE("OK"), NULL, NULL,
72 				B_WIDTH_AS_USUAL, B_STOP_ALERT);
73 			if (alert != NULL) {
74 				alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
75 				alert->Go();
76 			}
77 
78 			break;
79 		}
80 		default:
81 			BView::MessageReceived(msg);
82 	}
83 }
84 
85 
86 void
87 _BZombieReplicantView_::Draw(BRect updateRect)
88 {
89 	BRect bounds(Bounds());
90 	font_height fh;
91 
92 	GetFontHeight(&fh);
93 
94 	DrawChar('?', BPoint(bounds.Width() / 2.0f - StringWidth("?") / 2.0f,
95 		bounds.Height() / 2.0f - fh.ascent / 2.0f));
96 
97 	BBox::Draw(updateRect);
98 }
99 
100 
101 void
102 _BZombieReplicantView_::MouseDown(BPoint)
103 {
104 }
105 
106 
107 status_t
108 _BZombieReplicantView_::Archive(BMessage* archive, bool) const
109 {
110 	*archive = *fArchive;
111 
112 	return B_OK;
113 }
114 
115 
116 void
117 _BZombieReplicantView_::SetArchive(BMessage* archive)
118 {
119 	fArchive = archive;
120 }
121