xref: /haiku/src/preferences/locale/FormatSettingsView.cpp (revision 34a79bff8ad710b8e8024b0006a77ec8a9f45b16)
1fb816644SAdrien Destugues /*
2fb816644SAdrien Destugues  * Copyright 2009, Adrien Destugues, pulkomandy@gmail.com. All rights reserved.
3fb816644SAdrien Destugues  * Distributed under the terms of the MIT License.
4fb816644SAdrien Destugues  */
5fb816644SAdrien Destugues 
6fb816644SAdrien Destugues 
7fb816644SAdrien Destugues #include "FormatSettingsView.h"
8fb816644SAdrien Destugues #include "Locale.h"
9fb816644SAdrien Destugues 
10fb816644SAdrien Destugues #include <Alert.h>
11fb816644SAdrien Destugues #include <Application.h>
12fb816644SAdrien Destugues #include <Catalog.h>
13fb816644SAdrien Destugues #include <CheckBox.h>
14fb816644SAdrien Destugues #include <ControlLook.h>
15fb816644SAdrien Destugues #include <Country.h>
16fb816644SAdrien Destugues #include <GroupLayout.h>
17fb816644SAdrien Destugues #include <GroupLayoutBuilder.h>
18fb816644SAdrien Destugues #include <LayoutBuilder.h>
19fb816644SAdrien Destugues #include <Locale.h>
20fb816644SAdrien Destugues #include <MutableLocaleRoster.h>
21fb816644SAdrien Destugues #include <Message.h>
22fb816644SAdrien Destugues #include <Menu.h>
23fb816644SAdrien Destugues #include <MenuField.h>
24fb816644SAdrien Destugues #include <MenuItem.h>
25fb816644SAdrien Destugues #include <PopUpMenu.h>
26fb816644SAdrien Destugues #include <RadioButton.h>
27fb816644SAdrien Destugues #include <ScrollView.h>
28fb816644SAdrien Destugues #include <ScrollBar.h>
29fb816644SAdrien Destugues #include <SeparatorView.h>
30fb816644SAdrien Destugues #include <String.h>
31fb816644SAdrien Destugues #include <StringView.h>
32fb816644SAdrien Destugues #include <TextControl.h>
33fb816644SAdrien Destugues #include <Window.h>
34fb816644SAdrien Destugues 
35fb816644SAdrien Destugues #include <iostream>
36fb816644SAdrien Destugues 
37fb816644SAdrien Destugues #include <stdio.h>
38fb816644SAdrien Destugues 
39*34a79bffSOliver Tappe using BPrivate::gMutableLocaleRoster;
40fb816644SAdrien Destugues 
41fb816644SAdrien Destugues 
42fb816644SAdrien Destugues #undef B_TRANSLATE_CONTEXT
43fb816644SAdrien Destugues #define B_TRANSLATE_CONTEXT "TimeFormatSettings"
44fb816644SAdrien Destugues 
45fb816644SAdrien Destugues 
46fb816644SAdrien Destugues class DateMenuItem: public BMenuItem {
47fb816644SAdrien Destugues public:
48fb816644SAdrien Destugues 	DateMenuItem(const char* label, const char* code, BMenuField* field)
49fb816644SAdrien Destugues 		:
50fb816644SAdrien Destugues 		BMenuItem(label, _MenuMessage(code, field))
51fb816644SAdrien Destugues 	{
52fb816644SAdrien Destugues 		fIcuCode = code;
53fb816644SAdrien Destugues 	}
54fb816644SAdrien Destugues 
55fb816644SAdrien Destugues 	const BString& ICUCode() const
56fb816644SAdrien Destugues 	{
57fb816644SAdrien Destugues 		return fIcuCode;
58fb816644SAdrien Destugues 	}
59fb816644SAdrien Destugues 
60fb816644SAdrien Destugues private:
61fb816644SAdrien Destugues 	static BMessage* _MenuMessage(const char* format, BMenuField* field)
62fb816644SAdrien Destugues 	{
63fb816644SAdrien Destugues 		BMessage* msg = new BMessage(kMenuMessage);
64fb816644SAdrien Destugues 		msg->AddPointer("dest", field);
65fb816644SAdrien Destugues 		msg->AddString("format", format);
66fb816644SAdrien Destugues 
67fb816644SAdrien Destugues 		return msg;
68fb816644SAdrien Destugues 	}
69fb816644SAdrien Destugues 
70fb816644SAdrien Destugues private:
71fb816644SAdrien Destugues 	BString			fIcuCode;
72fb816644SAdrien Destugues };
73fb816644SAdrien Destugues 
74fb816644SAdrien Destugues 
75fb816644SAdrien Destugues void
76fb816644SAdrien Destugues CreateDateMenu(BMenuField** field, bool longFormat = true)
77fb816644SAdrien Destugues {
78fb816644SAdrien Destugues 	BMenu* menu = new BMenu("");
79fb816644SAdrien Destugues 	*field = new BMenuField("", menu);
80fb816644SAdrien Destugues 
81fb816644SAdrien Destugues 	BPopUpMenu* dayMenu = new BPopUpMenu(B_TRANSLATE("Day"));
82fb816644SAdrien Destugues 	// Not all available ICU settings are listed here. It's possible to add some
83fb816644SAdrien Destugues 	// other things if you ever need.
84fb816644SAdrien Destugues 	menu->AddItem(dayMenu);
85fb816644SAdrien Destugues 		dayMenu->AddItem(new DateMenuItem(
86fb816644SAdrien Destugues 			B_TRANSLATE("Day in month"), "d", *field));
87fb816644SAdrien Destugues 		dayMenu->AddItem(new DateMenuItem(
88fb816644SAdrien Destugues 			B_TRANSLATE("Day in month (2 digits)"), "dd", *field));
89fb816644SAdrien Destugues 		/*
90fb816644SAdrien Destugues 		dayMenu->AddItem(new DateMenuItem(B_TRANSLATE("Day in year"),
91fb816644SAdrien Destugues 			"D", *field));
92fb816644SAdrien Destugues 		dayMenu->AddItem(new DateMenuItem(B_TRANSLATE("Day in year (2 digits)"),
93fb816644SAdrien Destugues 			 "DD", *field));
94fb816644SAdrien Destugues 		dayMenu->AddItem(new DateMenuItem(B_TRANSLATE("Day in year (3 digits)"),
95fb816644SAdrien Destugues 			"DDD", *field));
96fb816644SAdrien Destugues 		*/
97fb816644SAdrien Destugues 		dayMenu->AddItem(new DateMenuItem(
98fb816644SAdrien Destugues 			B_TRANSLATE("Day of week"), "e", *field));
99fb816644SAdrien Destugues 		// dayMenu->AddItem(new DateMenuItem("Day of week (short text)", "eee",
100fb816644SAdrien Destugues 		//	*field));
101fb816644SAdrien Destugues 		// dayMenu->AddItem(new DateMenuItem("Day of week (full text)", "eeee",
102fb816644SAdrien Destugues 		//	*field));
103fb816644SAdrien Destugues 		dayMenu->AddItem(new DateMenuItem(
104fb816644SAdrien Destugues 			B_TRANSLATE("Day of week (short name)"), "E", *field));
105fb816644SAdrien Destugues 		dayMenu->AddItem(new DateMenuItem(
106fb816644SAdrien Destugues 			B_TRANSLATE("Day of week (name)"), "EEEE", *field));
107fb816644SAdrien Destugues 		dayMenu->AddItem(new DateMenuItem(
108fb816644SAdrien Destugues 			B_TRANSLATE("Day of week in month"), "F", *field));
109fb816644SAdrien Destugues 		// dayMenu->AddItem(new DateMenuItem(
110fb816644SAdrien Destugues 		//	B_TRANSLATE("julian day"), "g", *field));
111fb816644SAdrien Destugues 		// dayMenu->AddItem(new BMenuItem("c", msg));
112fb816644SAdrien Destugues 	BPopUpMenu* monthMenu = new BPopUpMenu(B_TRANSLATE("Month"));
113fb816644SAdrien Destugues 	menu->AddItem(monthMenu);
114fb816644SAdrien Destugues 		monthMenu->AddItem(new DateMenuItem(
115fb816644SAdrien Destugues 			B_TRANSLATE("Month number"), "M", *field));
116fb816644SAdrien Destugues 		monthMenu->AddItem(new DateMenuItem(
117fb816644SAdrien Destugues 			B_TRANSLATE("Month number (2 digits)"), "MM", *field));
118fb816644SAdrien Destugues 		monthMenu->AddItem(new DateMenuItem(
119fb816644SAdrien Destugues 			B_TRANSLATE("Month name"), "MMMM", *field));
120fb816644SAdrien Destugues 		// monthMenu->AddItem(new DateMenuItem("L", "L", *field));
121fb816644SAdrien Destugues 	BPopUpMenu* yearMenu = new BPopUpMenu(B_TRANSLATE("Year"));
122fb816644SAdrien Destugues 	menu->AddItem(yearMenu);
123fb816644SAdrien Destugues 		// And here is some ICU kludge... sorry about that.
124fb816644SAdrien Destugues 		if (longFormat)
125fb816644SAdrien Destugues 			yearMenu->AddItem(new DateMenuItem(
126fb816644SAdrien Destugues 				B_TRANSLATE("Year"), "y", *field));
127fb816644SAdrien Destugues 		else {
128fb816644SAdrien Destugues 			yearMenu->AddItem(new DateMenuItem(
129fb816644SAdrien Destugues 				B_TRANSLATE("Year (4 digits)"), "yyyy", *field));
130fb816644SAdrien Destugues 		}
131fb816644SAdrien Destugues 		yearMenu->AddItem(new DateMenuItem(
132fb816644SAdrien Destugues 			B_TRANSLATE("Year (2 digits)"), "yy", *field));
133fb816644SAdrien Destugues 		// yearMenu->AddItem(new DateMenuItem("Y", "Y", *field));
134fb816644SAdrien Destugues 		// yearMenu->AddItem(new DateMenuItem("u", "u", *field));
135fb816644SAdrien Destugues }
136fb816644SAdrien Destugues 
137fb816644SAdrien Destugues 
138fb816644SAdrien Destugues bool
139fb816644SAdrien Destugues IsSpecialDateChar(char charToTest)
140fb816644SAdrien Destugues {
141fb816644SAdrien Destugues 	static const char* specials = "dDeEFgMLyYu";
142fb816644SAdrien Destugues 	for (int i = 0; i < 11; i++)
143fb816644SAdrien Destugues 		if (charToTest == specials[i])
144fb816644SAdrien Destugues 			return true;
145fb816644SAdrien Destugues 	return false;
146fb816644SAdrien Destugues }
147fb816644SAdrien Destugues 
148fb816644SAdrien Destugues // #pragma mark -
149fb816644SAdrien Destugues 
150fb816644SAdrien Destugues 
1515c3a3034SAdrien Destugues FormatView::FormatView(const BLocale& locale)
152fb816644SAdrien Destugues 	:
153fb816644SAdrien Destugues 	BView("WindowsSettingsView", B_FRAME_EVENTS),
1545c3a3034SAdrien Destugues 	fLocale(locale)
155fb816644SAdrien Destugues {
156fb816644SAdrien Destugues 	SetLayout(new BGroupLayout(B_HORIZONTAL));
157fb816644SAdrien Destugues 
158fb816644SAdrien Destugues 	fLongDateExampleView = new BStringView("", "");
159fb816644SAdrien Destugues 
160fb816644SAdrien Destugues 	for (int i = 0; i < 4; i++) {
161fb816644SAdrien Destugues 		CreateDateMenu(&fLongDateMenu[i]);
162fb816644SAdrien Destugues 		fLongDateSeparator[i] = new BTextControl("", "", "",
163fb816644SAdrien Destugues 			new BMessage(kSettingsContentsModified));
164fb816644SAdrien Destugues 		fLongDateSeparator[i]->SetModificationMessage(
165fb816644SAdrien Destugues 			new BMessage(kSettingsContentsModified));
166fb816644SAdrien Destugues 	}
167fb816644SAdrien Destugues 
168fb816644SAdrien Destugues 	fShortDateExampleView = new BStringView("", "");
169fb816644SAdrien Destugues 
170fb816644SAdrien Destugues 	for (int i = 0; i < 3; i++) {
171fb816644SAdrien Destugues 		CreateDateMenu(&fDateMenu[i], false);
172fb816644SAdrien Destugues 	}
173fb816644SAdrien Destugues 
174fb816644SAdrien Destugues 	BPopUpMenu* menu = new BPopUpMenu(B_TRANSLATE("Separator"));
175fb816644SAdrien Destugues 	menu->AddItem(new BMenuItem(B_TRANSLATE("None"),
176fb816644SAdrien Destugues 		new BMessage(kSettingsContentsModified)));
177fb816644SAdrien Destugues 	menu->AddItem(new BMenuItem(B_TRANSLATE("Space"),
178fb816644SAdrien Destugues 		new BMessage(kSettingsContentsModified)));
179fb816644SAdrien Destugues 	menu->AddItem(new BMenuItem("-", new BMessage(kSettingsContentsModified)));
180fb816644SAdrien Destugues 	menu->AddItem(new BMenuItem("/", new BMessage(kSettingsContentsModified)));
181fb816644SAdrien Destugues 	menu->AddItem(new BMenuItem("\\", new BMessage(kSettingsContentsModified)));
182fb816644SAdrien Destugues 	menu->AddItem(new BMenuItem(".", new BMessage(kSettingsContentsModified)));
183fb816644SAdrien Destugues 
184fb816644SAdrien Destugues 	fSeparatorMenuField = new BMenuField(B_TRANSLATE("Separator:"), menu);
185fb816644SAdrien Destugues 
186fb816644SAdrien Destugues 	f24HrRadioButton = new BRadioButton("", B_TRANSLATE("24 hour"),
187fb816644SAdrien Destugues 		new BMessage(kClockFormatChange));
188fb816644SAdrien Destugues 
189fb816644SAdrien Destugues 	f12HrRadioButton = new BRadioButton("", B_TRANSLATE("12 hour"),
190fb816644SAdrien Destugues 		new BMessage(kClockFormatChange));
191fb816644SAdrien Destugues 
1925c3a3034SAdrien Destugues 	fLocale.GetTimeFormat(fOriginalTimeFormat, false);
1935c3a3034SAdrien Destugues 	fLocale.GetTimeFormat(fOriginalLongTimeFormat, true);
194fb816644SAdrien Destugues 	if (fOriginalTimeFormat.FindFirst("a") != B_ERROR) {
195fb816644SAdrien Destugues 		f12HrRadioButton->SetValue(B_CONTROL_ON);
1965c3a3034SAdrien Destugues 		fLocaleIs24Hr = false;
197fb816644SAdrien Destugues 	} else {
198fb816644SAdrien Destugues 		f24HrRadioButton->SetValue(B_CONTROL_ON);
1995c3a3034SAdrien Destugues 		fLocaleIs24Hr = true;
200fb816644SAdrien Destugues 	}
201fb816644SAdrien Destugues 
202fb816644SAdrien Destugues 	float spacing = be_control_look->DefaultItemSpacing();
203fb816644SAdrien Destugues 
204fb816644SAdrien Destugues 	fLongTimeExampleView = new BStringView("", "");
205fb816644SAdrien Destugues 	fShortTimeExampleView = new BStringView("", "");
206fb816644SAdrien Destugues 
207fb816644SAdrien Destugues 	fNumberFormatExampleView = new BStringView("", "");
208fb816644SAdrien Destugues 
209fb816644SAdrien Destugues 	BTextControl* numberThousand = new BTextControl("",
210fb816644SAdrien Destugues 		B_TRANSLATE("Thousand separator: "), "",
211fb816644SAdrien Destugues 		new BMessage(kSettingsContentsModified));
212fb816644SAdrien Destugues 	BTextControl* numberDecimal = new BTextControl("",
213fb816644SAdrien Destugues 		B_TRANSLATE("Decimal separator: "),	"",
214fb816644SAdrien Destugues 		new BMessage(kSettingsContentsModified));
215fb816644SAdrien Destugues 	// TODO number of decimal digits (spinbox ?)
216fb816644SAdrien Destugues 	BCheckBox* numberLeadingZero = new BCheckBox("", B_TRANSLATE("Leading 0"),
217fb816644SAdrien Destugues 		new BMessage(kSettingsContentsModified));
218fb816644SAdrien Destugues 	BTextControl* numberList = new BTextControl("",
219fb816644SAdrien Destugues 		B_TRANSLATE("List separator: "), "",
220fb816644SAdrien Destugues 		new BMessage(kSettingsContentsModified));
221fb816644SAdrien Destugues 	// Unit system (US/Metric) (radio)
222fb816644SAdrien Destugues 
223fb816644SAdrien Destugues 	BTextControl* currencySymbol = new BTextControl("",
224fb816644SAdrien Destugues 		B_TRANSLATE("Currency symbol:"), "",
225fb816644SAdrien Destugues 		new BMessage(kSettingsContentsModified));
226fb816644SAdrien Destugues 	menu = new BPopUpMenu(B_TRANSLATE("Negative marker"));
227fb816644SAdrien Destugues 	menu->AddItem(new BMenuItem("-", new BMessage(kSettingsContentsModified)));
228fb816644SAdrien Destugues 	menu->AddItem(new BMenuItem("()", new BMessage(kSettingsContentsModified)));
229fb816644SAdrien Destugues 
230fb816644SAdrien Destugues 	BMenuField* currencyNegative = new BMenuField(
231fb816644SAdrien Destugues 		B_TRANSLATE("Negative marker:"), menu);
232fb816644SAdrien Destugues 
233fb816644SAdrien Destugues 	BTextControl* currencyDecimal = new BTextControl("",
234fb816644SAdrien Destugues 		B_TRANSLATE("Decimal separator: "), "",
235fb816644SAdrien Destugues 		new BMessage(kSettingsContentsModified));
236fb816644SAdrien Destugues 	BCheckBox* currencyLeadingZero = new BCheckBox("",
237fb816644SAdrien Destugues 		B_TRANSLATE("Leading 0"), new BMessage(kSettingsContentsModified));
238fb816644SAdrien Destugues 
239fb816644SAdrien Destugues 	BBox* formatBox = new BBox("Symbol position");
240fb816644SAdrien Destugues 	formatBox->SetLabel(B_TRANSLATE("Symbol position"));
241fb816644SAdrien Destugues 
242fb816644SAdrien Destugues 	BRadioButton* beforeRadioButton = new BRadioButton("",
243fb816644SAdrien Destugues 		B_TRANSLATE("Before"), new BMessage(kSettingsContentsModified));
244fb816644SAdrien Destugues 
245fb816644SAdrien Destugues 	BRadioButton* afterRadioButton = new BRadioButton("",
246fb816644SAdrien Destugues 		B_TRANSLATE("After"), new BMessage(kSettingsContentsModified));
247fb816644SAdrien Destugues 
248fb816644SAdrien Destugues 	formatBox->AddChild(BGroupLayoutBuilder(B_VERTICAL)
249fb816644SAdrien Destugues 		.Add(beforeRadioButton)
250fb816644SAdrien Destugues 		.Add(afterRadioButton)
251fb816644SAdrien Destugues 		.SetInsets(spacing, 0, spacing, 0));
252fb816644SAdrien Destugues 
253fb816644SAdrien Destugues 	_UpdateExamples();
254fb816644SAdrien Destugues 	_ParseDateFormat();
255fb816644SAdrien Destugues 
256fb816644SAdrien Destugues 	fDateBox = new BBox(B_TRANSLATE("Date"));
257fb816644SAdrien Destugues 	fTimeBox = new BBox(B_TRANSLATE("Time"));
258fb816644SAdrien Destugues 	fNumbersBox = new BBox(B_TRANSLATE("Numbers"));
259fb816644SAdrien Destugues 	fCurrencyBox = new BBox(B_TRANSLATE("Currency"));
260fb816644SAdrien Destugues 
261fb816644SAdrien Destugues 	fDateBox->SetLabel(B_TRANSLATE("Date"));
262fb816644SAdrien Destugues 	fTimeBox->SetLabel(B_TRANSLATE("Time"));
263fb816644SAdrien Destugues 	fNumbersBox->SetLabel(B_TRANSLATE("Numbers"));
264fb816644SAdrien Destugues 	fCurrencyBox->SetLabel(B_TRANSLATE("Currency"));
265fb816644SAdrien Destugues 
266fb816644SAdrien Destugues 	fDateBox->AddChild(BLayoutBuilder::Group<>(B_HORIZONTAL)
267fb816644SAdrien Destugues 		.AddGroup(B_VERTICAL, spacing / 2)
268fb816644SAdrien Destugues 			.AddGroup(B_HORIZONTAL, spacing)
269fb816644SAdrien Destugues 				.Add(new BStringView("", B_TRANSLATE("Long format:")))
270fb816644SAdrien Destugues 				.Add(fLongDateExampleView)
271fb816644SAdrien Destugues 				.AddGlue()
272fb816644SAdrien Destugues 				.End()
273fb816644SAdrien Destugues 			.AddGroup(B_HORIZONTAL, spacing)
274fb816644SAdrien Destugues 				.Add(fLongDateMenu[0])
275fb816644SAdrien Destugues 				.Add(fLongDateSeparator[0])
276fb816644SAdrien Destugues 				.End()
277fb816644SAdrien Destugues 			.AddGroup(B_HORIZONTAL, spacing)
278fb816644SAdrien Destugues 				.Add(fLongDateMenu[1])
279fb816644SAdrien Destugues 				.Add(fLongDateSeparator[1])
280fb816644SAdrien Destugues 				.End()
281fb816644SAdrien Destugues 			.AddGroup(B_HORIZONTAL, spacing)
282fb816644SAdrien Destugues 				.Add(fLongDateMenu[2])
283fb816644SAdrien Destugues 				.Add(fLongDateSeparator[2])
284fb816644SAdrien Destugues 				.End()
285fb816644SAdrien Destugues 			.AddGroup(B_HORIZONTAL, spacing)
286fb816644SAdrien Destugues 				.Add(fLongDateMenu[3])
287fb816644SAdrien Destugues 				.Add(fLongDateSeparator[3])
288fb816644SAdrien Destugues 				.End()
289fb816644SAdrien Destugues 			.AddGroup(B_HORIZONTAL, spacing)
290fb816644SAdrien Destugues 				.Add(new BStringView("", B_TRANSLATE("Short format:")))
291fb816644SAdrien Destugues 				.Add(fShortDateExampleView)
292fb816644SAdrien Destugues 				.AddGlue()
293fb816644SAdrien Destugues 				.End()
294fb816644SAdrien Destugues 			.Add(fDateMenu[0])
295fb816644SAdrien Destugues 			.Add(fDateMenu[1])
296fb816644SAdrien Destugues 			.Add(fDateMenu[2])
297fb816644SAdrien Destugues 			.End()
298fb816644SAdrien Destugues 		.SetInsets(spacing, spacing, spacing, spacing));
299fb816644SAdrien Destugues 
300fb816644SAdrien Destugues 	fTimeBox->AddChild(BLayoutBuilder::Group<>(B_HORIZONTAL, spacing)
301fb816644SAdrien Destugues 		.AddGroup(B_VERTICAL, spacing / 2)
302fb816644SAdrien Destugues 			.AddGroup(B_HORIZONTAL, spacing)
303fb816644SAdrien Destugues 				.Add(new BStringView("", B_TRANSLATE("Long format:")))
304fb816644SAdrien Destugues 				.Add(fLongTimeExampleView)
305fb816644SAdrien Destugues 				.AddGlue()
306fb816644SAdrien Destugues 				.End()
307fb816644SAdrien Destugues 			.AddGroup(B_HORIZONTAL, spacing)
308fb816644SAdrien Destugues 				.Add(new BStringView("", B_TRANSLATE("Short format:")))
309fb816644SAdrien Destugues 				.Add(fShortTimeExampleView)
310fb816644SAdrien Destugues 				.AddGlue()
311fb816644SAdrien Destugues 				.End()
312fb816644SAdrien Destugues 			.AddGroup(B_HORIZONTAL, spacing)
313fb816644SAdrien Destugues 				.Add(f24HrRadioButton)
314fb816644SAdrien Destugues 				.Add(f12HrRadioButton)
315fb816644SAdrien Destugues 				.AddGlue()
316fb816644SAdrien Destugues 				.End()
317fb816644SAdrien Destugues 			.End()
318fb816644SAdrien Destugues 		.SetInsets(spacing, spacing, spacing, spacing));
319fb816644SAdrien Destugues 
320fb816644SAdrien Destugues 	fNumbersBox->AddChild(BLayoutBuilder::Group<>(B_HORIZONTAL, spacing)
321fb816644SAdrien Destugues 		.AddGroup(B_VERTICAL, spacing / 2)
322fb816644SAdrien Destugues 			.AddGroup(B_HORIZONTAL, spacing)
323fb816644SAdrien Destugues 				.Add(new BStringView("", B_TRANSLATE("Example:")))
324fb816644SAdrien Destugues 				.Add(fNumberFormatExampleView)
325fb816644SAdrien Destugues 				.AddGlue()
326fb816644SAdrien Destugues 				.End()
327fb816644SAdrien Destugues 			.Add(numberThousand)
328fb816644SAdrien Destugues 			.Add(numberDecimal)
329fb816644SAdrien Destugues 			.Add(numberLeadingZero)
330fb816644SAdrien Destugues 			.Add(numberList)
331fb816644SAdrien Destugues 			.End()
332fb816644SAdrien Destugues 		.SetInsets(spacing, spacing, spacing, spacing));
333fb816644SAdrien Destugues 
334fb816644SAdrien Destugues 	fCurrencyBox->AddChild(BLayoutBuilder::Group<>(B_HORIZONTAL, spacing)
335fb816644SAdrien Destugues 		.AddGroup(B_VERTICAL, spacing / 2)
336fb816644SAdrien Destugues 			.Add(currencySymbol)
337fb816644SAdrien Destugues 			.Add(currencyNegative)
338fb816644SAdrien Destugues 			.Add(currencyDecimal)
339fb816644SAdrien Destugues 			.Add(currencyLeadingZero)
340fb816644SAdrien Destugues 			.AddGroup(B_HORIZONTAL, spacing)
341fb816644SAdrien Destugues 				.Add(formatBox)
342fb816644SAdrien Destugues 				.AddGlue()
343fb816644SAdrien Destugues 				.End()
344fb816644SAdrien Destugues 			.End()
345fb816644SAdrien Destugues 		.SetInsets(spacing, spacing, spacing, spacing));
346fb816644SAdrien Destugues 
347fb816644SAdrien Destugues 	AddChild(BLayoutBuilder::Group<>(B_HORIZONTAL, spacing)
348fb816644SAdrien Destugues 		.AddGroup(B_VERTICAL, spacing)
349fb816644SAdrien Destugues 			.Add(fDateBox)
350fb816644SAdrien Destugues 			.Add(fTimeBox)
351fb816644SAdrien Destugues 			.AddGlue()
352fb816644SAdrien Destugues 			.End()
353fb816644SAdrien Destugues 		.AddGroup(B_VERTICAL, spacing)
354fb816644SAdrien Destugues 			.Add(fNumbersBox)
355fb816644SAdrien Destugues 			.Add(fCurrencyBox)
356fb816644SAdrien Destugues 			.AddGlue()
357fb816644SAdrien Destugues 			.End());
358fb816644SAdrien Destugues }
359fb816644SAdrien Destugues 
360fb816644SAdrien Destugues 
361fb816644SAdrien Destugues FormatView::~FormatView()
362fb816644SAdrien Destugues {
363*34a79bffSOliver Tappe 	gMutableLocaleRoster->SetDefaultLocale(fLocale);
364fb816644SAdrien Destugues }
365fb816644SAdrien Destugues 
366fb816644SAdrien Destugues 
367fb816644SAdrien Destugues void
368fb816644SAdrien Destugues FormatView::AttachedToWindow()
369fb816644SAdrien Destugues {
370fb816644SAdrien Destugues 	f24HrRadioButton->SetTarget(this);
371fb816644SAdrien Destugues 	f12HrRadioButton->SetTarget(this);
372fb816644SAdrien Destugues 
373fb816644SAdrien Destugues 	for (int j = 0; j < 4; j++) {
374fb816644SAdrien Destugues 		for (int i = 0; i < fLongDateMenu[j]->Menu()->CountItems(); i++)
375fb816644SAdrien Destugues 			fLongDateMenu[j]->Menu()->SubmenuAt(i)->SetTargetForItems(this);
376fb816644SAdrien Destugues 		fLongDateSeparator[j]->SetTarget(this);
377fb816644SAdrien Destugues 	}
378fb816644SAdrien Destugues 
379fb816644SAdrien Destugues 	for (int j = 0; j < 3; j++) {
380fb816644SAdrien Destugues 		for (int i = 0; i < fDateMenu[j]->Menu()->CountItems(); i++)
381fb816644SAdrien Destugues 			fDateMenu[j]->Menu()->SubmenuAt(i)->SetTargetForItems(this);
382fb816644SAdrien Destugues 	}
383fb816644SAdrien Destugues 
384fb816644SAdrien Destugues 	fSeparatorMenuField->Menu()->SetTargetForItems(this);
385fb816644SAdrien Destugues }
386fb816644SAdrien Destugues 
387fb816644SAdrien Destugues 
388fb816644SAdrien Destugues void
389fb816644SAdrien Destugues FormatView::MessageReceived(BMessage* message)
390fb816644SAdrien Destugues {
391fb816644SAdrien Destugues 	switch (message->what) {
392fb816644SAdrien Destugues 		case kMenuMessage:
393fb816644SAdrien Destugues 		{
394fb816644SAdrien Destugues 			// Update one of the dropdown menus
395fb816644SAdrien Destugues 			void* pointerFromMessage;
396fb816644SAdrien Destugues 			message->FindPointer("dest", &pointerFromMessage);
397fb816644SAdrien Destugues 			BMenuField* menuField
398fb816644SAdrien Destugues 			= static_cast<BMenuField*>(pointerFromMessage);
399fb816644SAdrien Destugues 			BString format;
400fb816644SAdrien Destugues 			message->FindString("format", &format);
401fb816644SAdrien Destugues 
402fb816644SAdrien Destugues 			for (int i = 0; i < 4; i++) {
403fb816644SAdrien Destugues 				if (fLongDateMenu[i]==menuField) {
404fb816644SAdrien Destugues 					fLongDateString[i] = format;
405fb816644SAdrien Destugues 					break;
406fb816644SAdrien Destugues 				}
407fb816644SAdrien Destugues 			}
408fb816644SAdrien Destugues 
409fb816644SAdrien Destugues 			for (int i = 0; i < 3; i++) {
410fb816644SAdrien Destugues 				if (fDateMenu[i]==menuField) {
411fb816644SAdrien Destugues 					fDateString[i] = format;
412fb816644SAdrien Destugues 					break;
413fb816644SAdrien Destugues 				}
414fb816644SAdrien Destugues 			}
415fb816644SAdrien Destugues 
416fb816644SAdrien Destugues 			message->FindPointer("source", &pointerFromMessage);
417fb816644SAdrien Destugues 			BMenuItem* menuItem = static_cast<BMenuItem*>(pointerFromMessage);
418fb816644SAdrien Destugues 
419fb816644SAdrien Destugues 			menuField->MenuItem()->SetLabel(menuItem->Label());
420fb816644SAdrien Destugues 
421fb816644SAdrien Destugues 			_UpdateLongDateFormatString();
422fb816644SAdrien Destugues 		}
423fb816644SAdrien Destugues 		// pass trough
424fb816644SAdrien Destugues 		case kSettingsContentsModified:
425fb816644SAdrien Destugues 			{
426fb816644SAdrien Destugues 				int32 separator = 0;
427fb816644SAdrien Destugues 				BMenuItem* item = fSeparatorMenuField->Menu()->FindMarked();
428fb816644SAdrien Destugues 				if (item) {
429fb816644SAdrien Destugues 					separator = fSeparatorMenuField->Menu()->IndexOf(item);
430fb816644SAdrien Destugues 					if (separator >= 0)
431fb816644SAdrien Destugues 						// settings.SetTimeFormatSeparator(
432fb816644SAdrien Destugues 						//	(FormatSeparator)separator);
433fb816644SAdrien Destugues 						;
434fb816644SAdrien Destugues 				}
435fb816644SAdrien Destugues 
436fb816644SAdrien Destugues 				// Make the notification message and send it to the tracker:
437fb816644SAdrien Destugues 				BMessage notificationMessage;
438fb816644SAdrien Destugues 				notificationMessage.AddInt32("TimeFormatSeparator", separator);
439fb816644SAdrien Destugues 				notificationMessage.AddBool("24HrClock",
440fb816644SAdrien Destugues 					f24HrRadioButton->Value() == 1);
441fb816644SAdrien Destugues 
442fb816644SAdrien Destugues 				_UpdateExamples();
443fb816644SAdrien Destugues 
444fb816644SAdrien Destugues 				Window()->PostMessage(kSettingsContentsModified);
445fb816644SAdrien Destugues 				break;
446fb816644SAdrien Destugues 			}
447fb816644SAdrien Destugues 
448fb816644SAdrien Destugues 		case kClockFormatChange:
449fb816644SAdrien Destugues 		{
450fb816644SAdrien Destugues 			BMessage newMessage(kMsgSettingsChanged);
451fb816644SAdrien Destugues 
452fb816644SAdrien Destugues 			BString timeFormat;
453fb816644SAdrien Destugues 			timeFormat = fOriginalTimeFormat;
454fb816644SAdrien Destugues 			if (f24HrRadioButton->Value() == 1) {
4555c3a3034SAdrien Destugues 				if (!fLocaleIs24Hr) {
456fb816644SAdrien Destugues 					timeFormat.ReplaceAll("h", "H");
457fb816644SAdrien Destugues 					timeFormat.ReplaceAll("k", "K");
458fb816644SAdrien Destugues 					timeFormat.RemoveAll(" a");
459fb816644SAdrien Destugues 					timeFormat.RemoveAll("a");
460fb816644SAdrien Destugues 				}
461fb816644SAdrien Destugues 			} else {
4625c3a3034SAdrien Destugues 				if (fLocaleIs24Hr && timeFormat.FindFirst("a") == B_ERROR) {
463fb816644SAdrien Destugues 					timeFormat.ReplaceAll("K", "k");
464fb816644SAdrien Destugues 					timeFormat.ReplaceAll("H", "h");
465fb816644SAdrien Destugues 					timeFormat.Append(" a");
466fb816644SAdrien Destugues 				}
467fb816644SAdrien Destugues 			}
4685c3a3034SAdrien Destugues 			fLocale.SetTimeFormat(timeFormat.String(), false);
469fb816644SAdrien Destugues 			newMessage.AddString("shortTimeFormat", timeFormat);
470fb816644SAdrien Destugues 
471fb816644SAdrien Destugues 			timeFormat = fOriginalLongTimeFormat;
472fb816644SAdrien Destugues 			if (f24HrRadioButton->Value() == 1) {
4735c3a3034SAdrien Destugues 				if (!fLocaleIs24Hr) {
474fb816644SAdrien Destugues 					timeFormat.ReplaceAll("h", "H");
475fb816644SAdrien Destugues 					timeFormat.ReplaceAll("k", "K");
476fb816644SAdrien Destugues 					timeFormat.RemoveAll(" a");
477fb816644SAdrien Destugues 					timeFormat.RemoveAll("a");
478fb816644SAdrien Destugues 				}
479fb816644SAdrien Destugues 			} else {
4805c3a3034SAdrien Destugues 				if (fLocaleIs24Hr && timeFormat.FindFirst("a") == B_ERROR) {
481fb816644SAdrien Destugues 					timeFormat.ReplaceAll("K", "k");
482fb816644SAdrien Destugues 					timeFormat.ReplaceAll("H", "h");
483fb816644SAdrien Destugues 					timeFormat.Append(" a");
484fb816644SAdrien Destugues 				}
485fb816644SAdrien Destugues 			}
4865c3a3034SAdrien Destugues 			fLocale.SetTimeFormat(timeFormat.String(), true);
487fb816644SAdrien Destugues 			newMessage.AddString("longTimeFormat", timeFormat);
488fb816644SAdrien Destugues 			_UpdateExamples();
489fb816644SAdrien Destugues 			Window()->PostMessage(kSettingsContentsModified);
490fb816644SAdrien Destugues 			be_app_messenger.SendMessage(&newMessage);
491fb816644SAdrien Destugues 			break;
492fb816644SAdrien Destugues 		}
493fb816644SAdrien Destugues 
494fb816644SAdrien Destugues 		default:
495fb816644SAdrien Destugues 			BView::MessageReceived(message);
496fb816644SAdrien Destugues 	}
497fb816644SAdrien Destugues }
498fb816644SAdrien Destugues 
499fb816644SAdrien Destugues 
500fb816644SAdrien Destugues void
501fb816644SAdrien Destugues FormatView::SetDefaults()
502fb816644SAdrien Destugues {
503fb816644SAdrien Destugues 	/*
504fb816644SAdrien Destugues 	TrackerSettings settings;
505fb816644SAdrien Destugues 
506fb816644SAdrien Destugues 	settings.SetTimeFormatSeparator(kSlashSeparator);
507fb816644SAdrien Destugues 	settings.SetDateOrderFormat(kMDYFormat);
508fb816644SAdrien Destugues 	settings.SetClockTo24Hr(false);
509fb816644SAdrien Destugues 	*/
510fb816644SAdrien Destugues 
5115c3a3034SAdrien Destugues 	BLocale defaultLocale;
5125c3a3034SAdrien Destugues 	be_locale_roster->GetDefaultLocale(&defaultLocale);
5135c3a3034SAdrien Destugues 	fLocale = defaultLocale;
514fb816644SAdrien Destugues 		// We work on a copy of the default country and set the changes when
515fb816644SAdrien Destugues 		// closing the preflet
516fb816644SAdrien Destugues 	_UpdateExamples();
517fb816644SAdrien Destugues 	_SendNotices();
518fb816644SAdrien Destugues }
519fb816644SAdrien Destugues 
520fb816644SAdrien Destugues 
521fb816644SAdrien Destugues bool
522fb816644SAdrien Destugues FormatView::IsDefaultable() const
523fb816644SAdrien Destugues {
524fb816644SAdrien Destugues 	/*
525fb816644SAdrien Destugues 	TrackerSettings settings;
526fb816644SAdrien Destugues 
527fb816644SAdrien Destugues 	return settings.TimeFormatSeparator() != kSlashSeparator
528fb816644SAdrien Destugues 		|| settings.DateOrderFormat() != kMDYFormat
529fb816644SAdrien Destugues 		|| settings.ClockIs24Hr() != false;
530fb816644SAdrien Destugues 	*/
531fb816644SAdrien Destugues 	return true;
532fb816644SAdrien Destugues }
533fb816644SAdrien Destugues 
534fb816644SAdrien Destugues 
535fb816644SAdrien Destugues void
536fb816644SAdrien Destugues FormatView::Revert()
537fb816644SAdrien Destugues {
538fb816644SAdrien Destugues 	/*
539fb816644SAdrien Destugues 	TrackerSettings settings;
540fb816644SAdrien Destugues 
541fb816644SAdrien Destugues 	settings.SetTimeFormatSeparator(fSeparator);
542fb816644SAdrien Destugues 	settings.SetDateOrderFormat(fFormat);
543fb816644SAdrien Destugues 	settings.SetClockTo24Hr(f24HrClock);
544fb816644SAdrien Destugues 	*/
545fb816644SAdrien Destugues 
546fb816644SAdrien Destugues 	// ShowCurrentSettings();
547fb816644SAdrien Destugues 	_SendNotices();
548fb816644SAdrien Destugues }
549fb816644SAdrien Destugues 
550fb816644SAdrien Destugues 
551fb816644SAdrien Destugues void
5525c3a3034SAdrien Destugues FormatView::SetLocale(const BLocale& locale)
553fb816644SAdrien Destugues {
5545c3a3034SAdrien Destugues 	fLocale = locale;
555fb816644SAdrien Destugues 
5565c3a3034SAdrien Destugues 	fLocale.GetTimeFormat(fOriginalTimeFormat, false);
5575c3a3034SAdrien Destugues 	fLocale.GetTimeFormat(fOriginalLongTimeFormat, true);
558fb816644SAdrien Destugues 
559fb816644SAdrien Destugues 	if (fOriginalTimeFormat.FindFirst("a") != B_ERROR) {
560fb816644SAdrien Destugues 		f12HrRadioButton->SetValue(B_CONTROL_ON);
5615c3a3034SAdrien Destugues 		fLocaleIs24Hr = false;
562fb816644SAdrien Destugues 	} else {
563fb816644SAdrien Destugues 		f24HrRadioButton->SetValue(B_CONTROL_ON);
5645c3a3034SAdrien Destugues 		fLocaleIs24Hr = true;
565fb816644SAdrien Destugues 	}
566fb816644SAdrien Destugues 
567fb816644SAdrien Destugues 	/*
568fb816644SAdrien Destugues 	FormatSeparator separator = settings.TimeFormatSeparator();
569fb816644SAdrien Destugues 
570fb816644SAdrien Destugues 	if (separator >= kNoSeparator && separator < kSeparatorsEnd)
571fb816644SAdrien Destugues 		fSeparatorMenuField->Menu()->ItemAt((int32)separator)->SetMarked(true);
572fb816644SAdrien Destugues 	*/
573fb816644SAdrien Destugues 	_UpdateExamples();
574fb816644SAdrien Destugues 	_ParseDateFormat();
575fb816644SAdrien Destugues }
576fb816644SAdrien Destugues 
577fb816644SAdrien Destugues 
578fb816644SAdrien Destugues void
579fb816644SAdrien Destugues FormatView::RecordRevertSettings()
580fb816644SAdrien Destugues {
581fb816644SAdrien Destugues 	/*
582fb816644SAdrien Destugues 	f24HrClock = settings.ClockIs24Hr();
583fb816644SAdrien Destugues 	fSeparator = settings.TimeFormatSeparator();
584fb816644SAdrien Destugues 	fFormat = settings.DateOrderFormat();
585fb816644SAdrien Destugues 	*/
586fb816644SAdrien Destugues }
587fb816644SAdrien Destugues 
588fb816644SAdrien Destugues 
589fb816644SAdrien Destugues // Return true if the Revert button should be enabled (ie some setting was
590fb816644SAdrien Destugues // changed)
591fb816644SAdrien Destugues bool
592fb816644SAdrien Destugues FormatView::IsRevertable() const
593fb816644SAdrien Destugues {
594fb816644SAdrien Destugues 	FormatSeparator separator;
595fb816644SAdrien Destugues 
596fb816644SAdrien Destugues 	BMenuItem* item = fSeparatorMenuField->Menu()->FindMarked();
597fb816644SAdrien Destugues 	if (item) {
598fb816644SAdrien Destugues 		int32 index = fSeparatorMenuField->Menu()->IndexOf(item);
599fb816644SAdrien Destugues 		if (index >= 0)
600fb816644SAdrien Destugues 			separator = (FormatSeparator)index;
601fb816644SAdrien Destugues 		else
602fb816644SAdrien Destugues 			return true;
603fb816644SAdrien Destugues 	} else
604fb816644SAdrien Destugues 		return true;
605fb816644SAdrien Destugues 
606fb816644SAdrien Destugues 	// TODO generate ICU string and compare to the initial one
607fb816644SAdrien Destugues 	BString dateFormat ;
608fb816644SAdrien Destugues 		// fYMDRadioButton->Value() ? kYMDFormat :
609fb816644SAdrien Destugues 		//(fDMYRadioButton->Value() ? kDMYFormat : kMDYFormat);
610fb816644SAdrien Destugues 
611fb816644SAdrien Destugues 	return f24HrClock != (f24HrRadioButton->Value() > 0)
612fb816644SAdrien Destugues 		|| separator != fSeparator
613fb816644SAdrien Destugues 		|| dateFormat != fDateFormat;
614fb816644SAdrien Destugues }
615fb816644SAdrien Destugues 
616fb816644SAdrien Destugues 
617fb816644SAdrien Destugues void
618fb816644SAdrien Destugues FormatView::_UpdateExamples()
619fb816644SAdrien Destugues {
620fb816644SAdrien Destugues 	time_t timeValue = (time_t)time(NULL);
621fb816644SAdrien Destugues 	BString timeFormat;
622fb816644SAdrien Destugues 
6235c3a3034SAdrien Destugues 	fLocale.FormatDate(&timeFormat, timeValue, true);
624fb816644SAdrien Destugues 	fLongDateExampleView->SetText(timeFormat);
625fb816644SAdrien Destugues 
6265c3a3034SAdrien Destugues 	fLocale.FormatDate(&timeFormat, timeValue, false);
627fb816644SAdrien Destugues 	fShortDateExampleView->SetText(timeFormat);
628fb816644SAdrien Destugues 
6295c3a3034SAdrien Destugues 	fLocale.FormatTime(&timeFormat, timeValue, true);
630fb816644SAdrien Destugues 	fLongTimeExampleView->SetText(timeFormat);
631fb816644SAdrien Destugues 
6325c3a3034SAdrien Destugues 	fLocale.FormatTime(&timeFormat, timeValue, false);
633fb816644SAdrien Destugues 	fShortTimeExampleView->SetText(timeFormat);
634fb816644SAdrien Destugues 
6355c3a3034SAdrien Destugues 	status_t Error = fLocale.FormatNumber(&timeFormat, 1234.5678);
636fb816644SAdrien Destugues 	if (Error == B_OK)
637fb816644SAdrien Destugues 		fNumberFormatExampleView->SetText(timeFormat);
638fb816644SAdrien Destugues 	else
639fb816644SAdrien Destugues 		fNumberFormatExampleView->SetText("ERROR");
640fb816644SAdrien Destugues }
641fb816644SAdrien Destugues 
642fb816644SAdrien Destugues 
643fb816644SAdrien Destugues void
644fb816644SAdrien Destugues FormatView::_SendNotices()
645fb816644SAdrien Destugues {
646fb816644SAdrien Destugues 	// Make the notification message and send it to the tracker:
647fb816644SAdrien Destugues 	/*
648fb816644SAdrien Destugues 	BMessage notificationMessage;
649fb816644SAdrien Destugues 	notificationMessage.AddInt32("TimeFormatSeparator",
650fb816644SAdrien Destugues 		(int32)settings.TimeFormatSeparator());
651fb816644SAdrien Destugues 	notificationMessage.AddInt32("DateOrderFormat",
652fb816644SAdrien Destugues 		(int32)settings.DateOrderFormat());
653fb816644SAdrien Destugues 	notificationMessage.AddBool("24HrClock", settings.ClockIs24Hr());
654fb816644SAdrien Destugues 	tracker->SendNotices(kDateFormatChanged, &notificationMessage);
655fb816644SAdrien Destugues 	*/
656fb816644SAdrien Destugues }
657fb816644SAdrien Destugues 
658fb816644SAdrien Destugues 
659fb816644SAdrien Destugues //! Get the date format from ICU and set the date fields accordingly
660fb816644SAdrien Destugues void
661fb816644SAdrien Destugues FormatView::_ParseDateFormat()
662fb816644SAdrien Destugues {
663fb816644SAdrien Destugues 	// TODO parse the short date too
664fb816644SAdrien Destugues 	BString dateFormatString;
6655c3a3034SAdrien Destugues 	fLocale.GetDateFormat(dateFormatString, true);
666fb816644SAdrien Destugues 	const char* dateFormat = dateFormatString.String();
667fb816644SAdrien Destugues 
668fb816644SAdrien Destugues printf("FV::_ParseDateFormat: df='%s'\n", dateFormat);
669fb816644SAdrien Destugues 
670fb816644SAdrien Destugues 	// Travel through the string and parse it
671fb816644SAdrien Destugues 	const char* parsePointer = dateFormat;
672fb816644SAdrien Destugues 	const char* fieldBegin = dateFormat;
673fb816644SAdrien Destugues 
674fb816644SAdrien Destugues 	for (int i = 0; i < 4; i++)
675fb816644SAdrien Destugues 	{
676fb816644SAdrien Destugues 		fieldBegin = parsePointer;
677fb816644SAdrien Destugues 		while (*parsePointer == *(parsePointer + 1)) parsePointer++ ;
678fb816644SAdrien Destugues 		parsePointer++;
679fb816644SAdrien Destugues 		BString str;
680fb816644SAdrien Destugues 		str.Append(fieldBegin, parsePointer - fieldBegin);
681fb816644SAdrien Destugues 
682fb816644SAdrien Destugues 		fLongDateString[i] = str;
683fb816644SAdrien Destugues 
684fb816644SAdrien Destugues 		BMenu* subMenu;
685fb816644SAdrien Destugues 		bool isFound = false;
686fb816644SAdrien Destugues 		for (int subMenuIndex = 0; subMenuIndex < 3; subMenuIndex++) {
687fb816644SAdrien Destugues 			subMenu = fLongDateMenu[i]->Menu()->SubmenuAt(subMenuIndex);
688fb816644SAdrien Destugues 			BMenuItem* item;
689fb816644SAdrien Destugues 			for (int itemIndex = 0; (item = subMenu->ItemAt(itemIndex)) != NULL;
690fb816644SAdrien Destugues 					itemIndex++) {
691fb816644SAdrien Destugues 				if (static_cast<DateMenuItem*>(item)->ICUCode() == str) {
692fb816644SAdrien Destugues 					item->SetMarked(true);
693fb816644SAdrien Destugues 					fLongDateMenu[i]->MenuItem()->SetLabel(item->Label());
694fb816644SAdrien Destugues 					isFound = true;
695fb816644SAdrien Destugues 				} else
696fb816644SAdrien Destugues 					item->SetMarked(false);
697fb816644SAdrien Destugues 			}
698fb816644SAdrien Destugues 		}
699fb816644SAdrien Destugues 
700fb816644SAdrien Destugues 		if (!isFound)
701fb816644SAdrien Destugues 			fLongDateMenu[i]->MenuItem()->SetLabel(str.Append("*"));
702fb816644SAdrien Destugues 
703fb816644SAdrien Destugues 		fieldBegin = parsePointer;
704fb816644SAdrien Destugues 		while ((!IsSpecialDateChar(*parsePointer)) && *parsePointer != '\0'
705fb816644SAdrien Destugues 				&& *(parsePointer - 1) >= 0) {
706fb816644SAdrien Destugues 			if (*parsePointer == '\'') {
707fb816644SAdrien Destugues 				parsePointer++;
708fb816644SAdrien Destugues 				while (*parsePointer != '\'') parsePointer++;
709fb816644SAdrien Destugues 			}
710fb816644SAdrien Destugues 			parsePointer++;
711fb816644SAdrien Destugues 		}
712fb816644SAdrien Destugues 		str.Truncate(0);
713fb816644SAdrien Destugues 		str.Append(fieldBegin, parsePointer - fieldBegin);
714fb816644SAdrien Destugues 		fLongDateSeparator[i]->SetText(str);
715fb816644SAdrien Destugues 	}
716fb816644SAdrien Destugues 
717fb816644SAdrien Destugues 	// Short date is a bit more tricky, we want to extract the separator
7185c3a3034SAdrien Destugues 	fLocale.GetDateFormat(dateFormatString, false);
719fb816644SAdrien Destugues 	dateFormat = dateFormatString.String();
720fb816644SAdrien Destugues 
721fb816644SAdrien Destugues 	// Travel trough the string and parse it
722fb816644SAdrien Destugues 	parsePointer = dateFormat;
723fb816644SAdrien Destugues 	fieldBegin = dateFormat;
724fb816644SAdrien Destugues 
725fb816644SAdrien Destugues 	for (int i = 0; i < 3; i++) {
726fb816644SAdrien Destugues 		fieldBegin = parsePointer;
727fb816644SAdrien Destugues 		while (*parsePointer == *(parsePointer + 1)) parsePointer++ ;
728fb816644SAdrien Destugues 		parsePointer++;
729fb816644SAdrien Destugues 		BString str;
730fb816644SAdrien Destugues 		str.Append(fieldBegin, parsePointer - fieldBegin);
731fb816644SAdrien Destugues 
732fb816644SAdrien Destugues 		fLongDateString[i] = str;
733fb816644SAdrien Destugues 
734fb816644SAdrien Destugues 		BMenu* subMenu;
735fb816644SAdrien Destugues 		bool isFound = false;
736fb816644SAdrien Destugues 		for (int subMenuIndex = 0; subMenuIndex < 3; subMenuIndex++) {
737fb816644SAdrien Destugues 			subMenu = fDateMenu[i]->Menu()->SubmenuAt(subMenuIndex);
738fb816644SAdrien Destugues 			BMenuItem* item;
739fb816644SAdrien Destugues 			for (int itemIndex = 0; (item = subMenu->ItemAt(itemIndex)) != NULL;
740fb816644SAdrien Destugues 					itemIndex++) {
741fb816644SAdrien Destugues 				if (static_cast<DateMenuItem*>(item)->ICUCode() == str) {
742fb816644SAdrien Destugues 					item->SetMarked(true);
743fb816644SAdrien Destugues 					fDateMenu[i]->MenuItem()->SetLabel(item->Label());
744fb816644SAdrien Destugues 					isFound = true;
745fb816644SAdrien Destugues 				} else
746fb816644SAdrien Destugues 					item->SetMarked(false);
747fb816644SAdrien Destugues 			}
748fb816644SAdrien Destugues 		}
749fb816644SAdrien Destugues 
750fb816644SAdrien Destugues 		if (!isFound) {
751fb816644SAdrien Destugues 			fDateMenu[i]->MenuItem()->SetLabel(
752fb816644SAdrien Destugues 				str.Append(B_TRANSLATE(" (unknown format)")));
753fb816644SAdrien Destugues 		}
754fb816644SAdrien Destugues 
755fb816644SAdrien Destugues 		fieldBegin = parsePointer;
756fb816644SAdrien Destugues 		while ((!IsSpecialDateChar(*parsePointer)) && *parsePointer != '\0'
757fb816644SAdrien Destugues 				&& *(parsePointer - 1) >= 0) {
758fb816644SAdrien Destugues 			if (*parsePointer == '\'') {
759fb816644SAdrien Destugues 				parsePointer++;
760fb816644SAdrien Destugues 				while (*parsePointer != '\'') parsePointer++;
761fb816644SAdrien Destugues 			}
762fb816644SAdrien Destugues 			parsePointer++;
763fb816644SAdrien Destugues 		}
764fb816644SAdrien Destugues 		if (parsePointer - fieldBegin > 0) {
765fb816644SAdrien Destugues 			str.Truncate(0);
766fb816644SAdrien Destugues 			str.Append(fieldBegin, parsePointer - fieldBegin);
767fb816644SAdrien Destugues 			fSeparatorMenuField->MenuItem()->SetLabel(str);
768fb816644SAdrien Destugues 		}
769fb816644SAdrien Destugues 	}
770fb816644SAdrien Destugues }
771fb816644SAdrien Destugues 
772fb816644SAdrien Destugues 
773fb816644SAdrien Destugues void
774fb816644SAdrien Destugues FormatView::_UpdateLongDateFormatString()
775fb816644SAdrien Destugues {
776fb816644SAdrien Destugues 	BString newDateFormat;
777fb816644SAdrien Destugues 
778fb816644SAdrien Destugues 	for (int i = 0; i < 4; i++) {
779fb816644SAdrien Destugues 		newDateFormat.Append(fLongDateString[i]);
780fb816644SAdrien Destugues 		newDateFormat.Append(fLongDateSeparator[i]->Text());
781fb816644SAdrien Destugues 	}
782fb816644SAdrien Destugues 
783fb816644SAdrien Destugues 	// TODO save this in the settings preflet and make the roster load it back
7845c3a3034SAdrien Destugues 	fLocale.SetDateFormat(newDateFormat.String());
785fb816644SAdrien Destugues 
786fb816644SAdrien Destugues 	newDateFormat.Truncate(0);
787fb816644SAdrien Destugues 
788fb816644SAdrien Destugues 	newDateFormat.Append(fDateString[0]);
789fb816644SAdrien Destugues 	newDateFormat.Append(fSeparatorMenuField->MenuItem()->Label());
790fb816644SAdrien Destugues 	newDateFormat.Append(fDateString[1]);
791fb816644SAdrien Destugues 	newDateFormat.Append(fSeparatorMenuField->MenuItem()->Label());
792fb816644SAdrien Destugues 	newDateFormat.Append(fDateString[2]);
793fb816644SAdrien Destugues 
794fb816644SAdrien Destugues 	// TODO save this in the settings preflet and make the roster load it back
7955c3a3034SAdrien Destugues 	fLocale.SetDateFormat(newDateFormat.String(), false);
796fb816644SAdrien Destugues }
797