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, ¬ificationMessage); 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