xref: /haiku/src/preferences/locale/LocalePreflet.cpp (revision 820dca4df6c7bf955c46e8f6521b9408f50b2900)
1 /*
2  * Copyright 2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3  * Copyright 2010, Adrien Destugues <pulkomandy@pulkomandy.ath.cx>. All rightts reserved.
4  * Distributed under the terms of the MIT License.
5  */
6 
7 
8 #include <AboutWindow.h>
9 #include <Alert.h>
10 #include <Application.h>
11 #include <Catalog.h>
12 #include <Locale.h>
13 #include <Roster.h>
14 #include <TextView.h>
15 
16 #include "LocalePreflet.h"
17 #include "LocaleWindow.h"
18 
19 
20 #undef B_TRANSLATION_CONTEXT
21 #define B_TRANSLATION_CONTEXT "Locale Preflet"
22 
23 
24 const char* kAppName = B_TRANSLATE("Locale");
25 const char* kSignature = "application/x-vnd.Haiku-Locale";
26 
27 
28 class LocalePreflet : public BApplication {
29 	public:
30 							LocalePreflet();
31 		virtual				~LocalePreflet();
32 
33 		virtual	void		MessageReceived(BMessage* message);
34 
35 private:
36 		status_t			_RestartApp(const char* signature) const;
37 
38 		LocaleWindow*		fLocaleWindow;
39 		BAboutWindow*		fAboutWindow;
40 };
41 
42 
43 //	#pragma mark -
44 
45 
46 LocalePreflet::LocalePreflet()
47 	:
48 	BApplication(kSignature),
49 	fLocaleWindow(new LocaleWindow()),
50 	fAboutWindow(NULL)
51 {
52 	fLocaleWindow->Show();
53 }
54 
55 
56 LocalePreflet::~LocalePreflet()
57 {
58 	// replicant deleted, destroy the about window
59 	if (fAboutWindow != NULL)
60 		fAboutWindow->Quit();
61 }
62 
63 
64 void
65 LocalePreflet::MessageReceived(BMessage* message)
66 {
67 	switch (message->what) {
68 		case B_LOCALE_CHANGED:
69 			BLocaleRoster::Default()->Refresh();
70 			fLocaleWindow->PostMessage(message);
71 			break;
72 
73 		case kMsgRestartTrackerAndDeskbar:
74 			if (message->FindInt32("which") == 1) {
75 				_RestartApp("application/x-vnd.Be-TRAK");
76 				_RestartApp("application/x-vnd.Be-TSKB");
77 			}
78 			break;
79 
80 		case B_ABOUT_REQUESTED:
81 			if (fAboutWindow == NULL) {
82 				const char* authors[] = {
83 					"Axel Dörfler",
84 					"Adrien Destugues",
85 					"Oliver Tappe",
86 					NULL
87 				};
88 
89 				fAboutWindow = new BAboutWindow(kAppName, kSignature);
90 				fAboutWindow->AddCopyright(2005, "Haiku, Inc.");
91 				fAboutWindow->AddAuthors(authors);
92 				fAboutWindow->Show();
93 			} else if (fAboutWindow->IsHidden())
94 				fAboutWindow->Show();
95 			else
96 				fAboutWindow->Activate();
97 
98 			break;
99 
100 		default:
101 			BApplication::MessageReceived(message);
102 			break;
103 	}
104 }
105 
106 
107 status_t
108 LocalePreflet::_RestartApp(const char* signature) const
109 {
110 	app_info info;
111 	status_t status = be_roster->GetAppInfo(signature, &info);
112 	if (status != B_OK)
113 		return status;
114 
115 	BMessenger application(signature);
116 	status = application.SendMessage(B_QUIT_REQUESTED);
117 	if (status != B_OK)
118 		return status;
119 
120 	status_t exit;
121 	wait_for_thread(info.thread, &exit);
122 
123 	return be_roster->Launch(signature);
124 }
125 
126 
127 //	#pragma mark -
128 
129 
130 int
131 main(int argc, char** argv)
132 {
133 	LocalePreflet app;
134 	app.Run();
135 	return 0;
136 }
137 
138