* Fixed a ton of minor coding style violations, no functional change intended.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36586 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2010-05-02 17:38:11 +00:00
parent 0a51dbde98
commit 533d9a5f85
6 changed files with 383 additions and 375 deletions

View File

@ -6,7 +6,9 @@
* Stephan Aßmus <superstippi@gmx.de>
* Adrien Destugues <pulkomandy@gmail.com>
* Oliver Tappe <zooey@hirschkaefer.de>
*/
*/
#include "LanguageListView.h"
#include <stdio.h>
@ -46,7 +48,6 @@ LanguageListItem::~LanguageListItem()
}
//MediaListItem - DrawItem
void
LanguageListItem::DrawItem(BView* owner, BRect frame, bool complete)
{
@ -93,6 +94,8 @@ LanguageListItem::DrawItem(BView* owner, BRect frame, bool complete)
}
// #pragma mark -
LanguageListView::LanguageListView(const char* name, list_view_type type)
:
@ -162,7 +165,8 @@ LanguageListView::MoveItems(BList& items, int32 index)
}
void LanguageListView::MessageReceived (BMessage* message)
void
LanguageListView::MessageReceived(BMessage* message)
{
if (message->what == 'DRAG') {
// Someone just dropped something on us

View File

@ -6,9 +6,9 @@
* Stephan Aßmus <superstippi@gmx.de>
* Adrien Destugues <pulkomandy@gmail.com>
* Oliver Tappe <zooey@hirschkaefer.de>
*/
#ifndef __LANGUAGE_LIST_VIEW_H
#define __LANGUAGE_LIST_VIEW_H
*/
#ifndef LANGUAGE_LIST_VIEW_H
#define LANGUAGE_LIST_VIEW_H
#include <OutlineListView.h>
@ -53,4 +53,4 @@ private:
};
#endif
#endif // LANGUAGE_LIST_VIEW_H

View File

@ -19,5 +19,6 @@ static const uint32 kMsgPrefLangInvoked = 'pliv';
static const uint32 kMsgDefaults = 'dflt';
static const uint32 kMsgRevert = 'revt';
#endif /* LOCALE_H */

View File

@ -1,5 +1,6 @@
/*
* Copyright 2005-2009, Axel Dörfler, axeld@pinc-software.de.
* Copyright 2005-2010, Axel Dörfler, axeld@pinc-software.de.
* Copyright 2009-2010, Adrien Destugues <pulkomandy@gmail.com>.
* All rights reserved. Distributed under the terms of the MIT License.
*/
@ -52,6 +53,9 @@ compare_typed_list_items(const BListItem* _a, const BListItem* _b)
}
// #pragma mark -
LocaleWindow::LocaleWindow()
:
BWindow(BRect(0, 0, 0, 0), "Locale", B_TITLED_WINDOW, B_NOT_RESIZABLE
@ -73,157 +77,149 @@ LocaleWindow::LocaleWindow()
BView* languageTab = new BView(TR("Language"), B_WILL_DRAW);
languageTab->SetLayout(new BGroupLayout(B_VERTICAL, 0));
{
// first list: available languages
fLanguageListView = new LanguageListView("available",
B_MULTIPLE_SELECTION_LIST);
BScrollView* scrollView = new BScrollView("scroller", fLanguageListView,
B_WILL_DRAW | B_FRAME_EVENTS, false, true);
// first list: available languages
fLanguageListView = new LanguageListView("available",
B_MULTIPLE_SELECTION_LIST);
BScrollView* scrollView = new BScrollView("scroller", fLanguageListView,
B_WILL_DRAW | B_FRAME_EVENTS, false, true);
fLanguageListView->SetInvocationMessage(new BMessage(kMsgLangInvoked));
fLanguageListView->SetInvocationMessage(new BMessage(kMsgLangInvoked));
// Fill the language list from the LocaleRoster data
BMessage installedLanguages;
if (be_locale_roster->GetInstalledLanguages(&installedLanguages)
== B_OK) {
// Fill the language list from the LocaleRoster data
BMessage installedLanguages;
if (be_locale_roster->GetInstalledLanguages(&installedLanguages)
== B_OK) {
BString currentLanguageCode;
BString currentLanguageName;
LanguageListItem* lastAddedItem = NULL;
BString currentLanguageCode;
BString currentLanguageName;
LanguageListItem* lastAddedLanguage = NULL;
for (int i = 0; installedLanguages.FindString("langs",
i, &currentLanguageCode) == B_OK; i++) {
for (int i = 0; installedLanguages.FindString("langs",
i, &currentLanguageCode) == B_OK; i++) {
// Now get an human-readable, localized name for each language
// TODO: sort them using collators.
BLanguage* currentLanguage;
be_locale_roster->GetLanguage(&currentLanguage,
currentLanguageCode.String());
// Now get an human-readable, localized name for each language
// TODO: sort them using collators.
BLanguage* currentLanguage;
be_locale_roster->GetLanguage(&currentLanguage,
currentLanguageCode.String());
currentLanguageName.Truncate(0);
currentLanguage->GetName(&currentLanguageName);
currentLanguageName.Truncate(0);
currentLanguage->GetName(&currentLanguageName);
LanguageListItem* si = new LanguageListItem(currentLanguageName,
currentLanguageCode.String());
if (currentLanguage->IsCountry()) {
fLanguageListView->AddUnder(si,lastAddedLanguage);
} else {
// This is a language without country, add it at top-level
fLanguageListView->AddItem(si);
si->SetExpanded(false);
if (lastAddedLanguage != NULL) {
fLanguageListView->SortItemsUnder(lastAddedLanguage,
true, compare_typed_list_items);
}
lastAddedLanguage = si;
LanguageListItem* item = new LanguageListItem(currentLanguageName,
currentLanguageCode.String());
if (currentLanguage->IsCountry()) {
fLanguageListView->AddUnder(item, lastAddedItem);
} else {
// This is a language without country, add it at top-level
fLanguageListView->AddItem(item);
item->SetExpanded(false);
if (lastAddedItem != NULL) {
fLanguageListView->SortItemsUnder(lastAddedItem, true,
compare_typed_list_items);
}
delete currentLanguage;
lastAddedItem = item;
}
fLanguageListView->SortItemsUnder(lastAddedLanguage, true,
compare_typed_list_items);
fLanguageListView->SortItems(compare_list_items);
// see previous comment on sort using collators
} else {
BAlert* myAlert = new BAlert("Error",
TR("Unable to find the available languages! You can't use this "
"preflet!"),
TR("OK"), NULL, NULL,
B_WIDTH_AS_USUAL, B_OFFSET_SPACING, B_STOP_ALERT);
myAlert->Go();
delete currentLanguage;
}
fLanguageListView->SortItemsUnder(lastAddedItem, true,
compare_typed_list_items);
// Second list: active languages
fPreferredListView = new LanguageListView("preferred",
B_MULTIPLE_SELECTION_LIST);
BScrollView* scrollViewEnabled = new BScrollView("scroller",
fPreferredListView, B_WILL_DRAW | B_FRAME_EVENTS, false, true);
fLanguageListView->SortItems(compare_list_items);
// see previous comment on sort using collators
fPreferredListView
->SetInvocationMessage(new BMessage(kMsgPrefLangInvoked));
// get the preferred languages from the Settings. Move them here from
// the other list.
BMessage msg;
be_locale_roster->GetPreferredLanguages(&msg);
BString langCode;
for (int index = 0;
msg.FindString("language", index, &langCode) == B_OK; index++) {
for (int listPos = 0; LanguageListItem* lli
= static_cast<LanguageListItem*>
(fLanguageListView->FullListItemAt(listPos));
listPos++) {
if (langCode == lli->LanguageCode()) {
// We found the item we were looking for, now move it to
// the other list along with all its children
static_cast<LanguageListView*>(fPreferredListView)
->MoveItemFrom(fLanguageListView,
fLanguageListView->FullListIndexOf(lli),
fLanguageListView->CountItems());
}
}
}
languageTab->AddChild(BLayoutBuilder::Group<>(B_HORIZONTAL, 10)
.AddGroup(B_VERTICAL, 10)
.Add(new BStringView("", TR("Available languages")))
.Add(scrollView)
.End()
.AddGroup(B_VERTICAL, 10)
.Add(new BStringView("", TR("Preferred languages")))
.Add(scrollViewEnabled)
.End()
.View());
} else {
BAlert* myAlert = new BAlert("Error",
TR("Unable to find the available languages! You can't use this "
"preflet!"),
TR("OK"), NULL, NULL,
B_WIDTH_AS_USUAL, B_OFFSET_SPACING, B_STOP_ALERT);
myAlert->Go();
}
// Second list: active languages
fPreferredListView = new LanguageListView("preferred",
B_MULTIPLE_SELECTION_LIST);
BScrollView* scrollViewEnabled = new BScrollView("scroller",
fPreferredListView, B_WILL_DRAW | B_FRAME_EVENTS, false, true);
fPreferredListView->SetInvocationMessage(new BMessage(kMsgPrefLangInvoked));
// get the preferred languages from the Settings. Move them here from
// the other list.
BMessage msg;
be_locale_roster->GetPreferredLanguages(&msg);
BString langCode;
for (int index = 0; msg.FindString("language", index, &langCode) == B_OK;
index++) {
for (int listPos = 0; LanguageListItem* item
= static_cast<LanguageListItem*>
(fLanguageListView->FullListItemAt(listPos));
listPos++) {
if (langCode == item->LanguageCode()) {
// We found the item we were looking for, now move it to
// the other list along with all its children
static_cast<LanguageListView*>(fPreferredListView)
->MoveItemFrom(fLanguageListView,
fLanguageListView->FullListIndexOf(item),
fLanguageListView->CountItems());
}
}
}
languageTab->AddChild(BLayoutBuilder::Group<>(B_HORIZONTAL, 10)
.AddGroup(B_VERTICAL, 10)
.Add(new BStringView("", TR("Available languages")))
.Add(scrollView)
.End()
.AddGroup(B_VERTICAL, 10)
.Add(new BStringView("", TR("Preferred languages")))
.Add(scrollViewEnabled)
.End()
.View());
BView* countryTab = new BView(TR("Country"), B_WILL_DRAW);
countryTab->SetLayout(new BGroupLayout(B_VERTICAL, 0));
{
BListView* listView = new BListView("country", B_SINGLE_SELECTION_LIST);
BScrollView* scrollView = new BScrollView("scroller",
listView, B_WILL_DRAW | B_FRAME_EVENTS, false, true);
listView->SetSelectionMessage(new BMessage(kMsgCountrySelection));
BListView* listView = new BListView("country", B_SINGLE_SELECTION_LIST);
scrollView = new BScrollView("scroller", listView,
B_WILL_DRAW | B_FRAME_EVENTS, false, true);
listView->SetSelectionMessage(new BMessage(kMsgCountrySelection));
// get all available countries from ICU
// Use DateFormat::getAvailableLocale so we get only the one we can
// use. Maybe check the NumberFormat one and see if there is more.
int32_t localeCount;
const Locale* currentLocale
= Locale::getAvailableLocales(localeCount);
// get all available countries from ICU
// Use DateFormat::getAvailableLocale so we get only the one we can
// use. Maybe check the NumberFormat one and see if there is more.
int32_t localeCount;
const Locale* currentLocale = Locale::getAvailableLocales(localeCount);
for (int index = 0; index < localeCount; index++)
{
UnicodeString countryFullName;
BString str;
BStringByteSink bbs(&str);
currentLocale[index].getDisplayName(countryFullName);
countryFullName.toUTF8(bbs);
LanguageListItem* si
= new LanguageListItem(str, currentLocale[index].getName());
listView->AddItem(si);
if (strcmp(currentLocale[index].getName(),
defaultCountry->Code()) == 0)
listView->Select(listView->CountItems() - 1);
}
for (int index = 0; index < localeCount; index++) {
UnicodeString countryFullName;
BString string;
BStringByteSink sink(&string);
currentLocale[index].getDisplayName(countryFullName);
countryFullName.toUTF8(sink);
// TODO: find a real solution intead of this hack
listView->SetExplicitMinSize(BSize(300, B_SIZE_UNSET));
fFormatView = new FormatView(defaultCountry);
countryTab->AddChild(BLayoutBuilder::Group<>(B_HORIZONTAL, 5)
.AddGroup(B_VERTICAL, 3)
.Add(scrollView)
.End()
.Add(fFormatView)
.View()
);
listView->ScrollToSelection();
LanguageListItem* item
= new LanguageListItem(string, currentLocale[index].getName());
listView->AddItem(item);
if (!strcmp(currentLocale[index].getName(), defaultCountry->Code()))
listView->Select(listView->CountItems() - 1);
}
// TODO: find a real solution intead of this hack
listView->SetExplicitMinSize(BSize(300, B_SIZE_UNSET));
fFormatView = new FormatView(defaultCountry);
countryTab->AddChild(BLayoutBuilder::Group<>(B_HORIZONTAL, 5)
.AddGroup(B_VERTICAL, 3)
.Add(scrollView)
.End()
.Add(fFormatView)
.View()
);
listView->ScrollToSelection();
tabView->AddTab(languageTab);
tabView->AddTab(countryTab);
@ -269,9 +265,9 @@ LocaleWindow::MessageReceived(BMessage* message)
// from them anyway
if (fPreferredListView->Superitem(
fPreferredListView->FullListItemAt(index)) != NULL) {
update.AddString("language", static_cast<LanguageListItem*>(
fPreferredListView->FullListItemAt(index))
->LanguageCode());
LanguageListItem* item = static_cast<LanguageListItem*>(
fPreferredListView->FullListItemAt(index));
update.AddString("language", item->LanguageCode());
}
index++;
}
@ -285,16 +281,19 @@ LocaleWindow::MessageReceived(BMessage* message)
// Country selection changed.
// Get the new selected country from the ListView and send it to the
// main app event handler.
void* ptr;
message->FindPointer("source", &ptr);
BListView* countryList = static_cast<BListView*>(ptr);
LanguageListItem* lli = static_cast<LanguageListItem*>
void* listView;
if (message->FindPointer("source", &listView) != B_OK)
break;
BListView* countryList = static_cast<BListView*>(listView);
LanguageListItem* item = static_cast<LanguageListItem*>
(countryList->ItemAt(countryList->CurrentSelection()));
BMessage newMessage(kMsgSettingsChanged);
newMessage.AddString("country",lli->LanguageCode());
newMessage.AddString("country", item->LanguageCode());
be_app_messenger.SendMessage(&newMessage);
BCountry* country = new BCountry(lli->LanguageCode());
BCountry* country = new BCountry(item->LanguageCode());
fFormatView->SetCountry(country);
break;
}
@ -303,9 +302,8 @@ LocaleWindow::MessageReceived(BMessage* message)
{
int32 index = 0;
if (message->FindInt32("index", &index) == B_OK) {
LanguageListItem* listItem
= static_cast<LanguageListItem*>
(fLanguageListView->RemoveItem(index));
LanguageListItem* listItem = static_cast<LanguageListItem*>
(fLanguageListView->RemoveItem(index));
fPreferredListView->AddItem(listItem);
fPreferredListView->Invoke(fMsgPrefLanguagesChanged);
}
@ -319,9 +317,8 @@ LocaleWindow::MessageReceived(BMessage* message)
int32 index = 0;
if (message->FindInt32("index", &index) == B_OK) {
LanguageListItem* listItem
= static_cast<LanguageListItem*>
(fPreferredListView->RemoveItem(index));
LanguageListItem* listItem = static_cast<LanguageListItem*>
(fPreferredListView->RemoveItem(index));
fLanguageListView->AddItem(listItem);
fLanguageListView->SortItems(compare_list_items);
// see previous comment on sort using collators

View File

@ -35,28 +35,32 @@
#define TR_CONTEXT "TimeFormatSettings"
BMessage*
MenuMessage(const char* format, BMenuField* field)
{
BMessage* msg = new BMessage(kMenuMessage);
msg->AddPointer("dest", field);
msg->AddString("format", format);
return msg;
}
class DateMenuItem: public BMenuItem {
public:
DateMenuItem(const char* label, const char* code,
BMenuField* field)
:
BMenuItem(label, MenuMessage(code, field))
{
fIcuCode = code;
}
DateMenuItem(const char* label, const char* code, BMenuField* field)
:
BMenuItem(label, _MenuMessage(code, field))
{
fIcuCode = code;
}
BString fIcuCode;
const BString& ICUCode() const
{
return fIcuCode;
}
private:
static BMessage* _MenuMessage(const char* format, BMenuField* field)
{
BMessage* msg = new BMessage(kMenuMessage);
msg->AddPointer("dest", field);
msg->AddString("format", format);
return msg;
}
private:
BString fIcuCode;
};
@ -116,6 +120,20 @@ CreateDateMenu(BMenuField** field, bool longFormat = true)
}
bool
IsSpecialDateChar(char charToTest)
{
static const char* specials = "dDeEFgMLyYu";
for (int i = 0; i < 11; i++)
if (charToTest == specials[i])
return true;
return false;
}
// #pragma mark -
FormatView::FormatView(BCountry* country)
:
BView("WindowsSettingsView", B_FRAME_EVENTS),
@ -335,130 +353,6 @@ FormatView::FormatView(BCountry* country)
}
bool IsSpecialDateChar(char charToTest)
{
static const char* specials = "dDeEFgMLyYu";
for (int i = 0; i < 11; i++)
if (charToTest == specials[i])
return true;
return false;
}
// Get the date format from ICU and set the date fields accordingly
void
FormatView::_ParseDateFormat()
{
// TODO parse the short date too
BString dateFormatString;
fCountry->DateFormat(dateFormatString, true);
const char* dateFormat = dateFormatString.String();
// Travel trough the string and parse it
const char* parsePointer = dateFormat;
const char* fieldBegin = dateFormat;
for (int i = 0; i < 4; i++)
{
fieldBegin = parsePointer;
while (*parsePointer == *(parsePointer + 1)) parsePointer++ ;
parsePointer++;
BString str;
str.Append(fieldBegin, parsePointer - fieldBegin);
fLongDateString[i] = str;
BMenu* subMenu;
bool isFound = false;
for (int subMenuIndex = 0; subMenuIndex < 3; subMenuIndex++) {
subMenu = fLongDateMenu[i]->Menu()->SubmenuAt(subMenuIndex);
BMenuItem* item;
for (int itemIndex = 0; (item = subMenu->ItemAt(itemIndex)) != NULL;
itemIndex++) {
if (static_cast<DateMenuItem*>(item)->fIcuCode == str) {
item->SetMarked(true);
fLongDateMenu[i]->MenuItem()->SetLabel(item->Label());
isFound = true;
} else
item->SetMarked(false);
}
}
if (!isFound)
fLongDateMenu[i]->MenuItem()->SetLabel(str.Append("*"));
fieldBegin = parsePointer;
while ((!IsSpecialDateChar(*parsePointer)) && *parsePointer != '\0'
&& *(parsePointer - 1) >= 0) {
if (*parsePointer == '\'') {
parsePointer++;
while (*parsePointer != '\'') parsePointer++;
}
parsePointer++;
}
str.Truncate(0);
str.Append(fieldBegin, parsePointer - fieldBegin);
fLongDateSeparator[i]->SetText(str);
}
// Short date is a bit more tricky, we want to extract the separator
dateFormatString.Truncate(0);
fCountry->DateFormat(dateFormatString, false);
dateFormat = dateFormatString.String();
// Travel trough the string and parse it
parsePointer = dateFormat;
fieldBegin = dateFormat;
for (int i = 0; i < 3; i++)
{
fieldBegin = parsePointer;
while (*parsePointer == *(parsePointer + 1)) parsePointer++ ;
parsePointer++;
BString str;
str.Append(fieldBegin, parsePointer - fieldBegin);
fLongDateString[i] = str;
BMenu* subMenu;
bool isFound = false;
for (int subMenuIndex = 0; subMenuIndex < 3; subMenuIndex++) {
subMenu = fDateMenu[i]->Menu()->SubmenuAt(subMenuIndex);
BMenuItem* item;
for (int itemIndex = 0; (item = subMenu->ItemAt(itemIndex)) != NULL;
itemIndex++) {
if (static_cast<DateMenuItem*>(item)->fIcuCode == str) {
item->SetMarked(true);
fDateMenu[i]->MenuItem()->SetLabel(item->Label());
isFound = true;
} else
item->SetMarked(false);
}
}
if (!isFound) {
fDateMenu[i]->MenuItem()->SetLabel(
str.Append(TR(" (unknown format)")));
}
fieldBegin = parsePointer;
while ((!IsSpecialDateChar(*parsePointer)) && *parsePointer != '\0'
&& *(parsePointer - 1) >= 0) {
if (*parsePointer == '\'') {
parsePointer++;
while (*parsePointer != '\'') parsePointer++;
}
parsePointer++;
}
if (parsePointer - fieldBegin > 0) {
str.Truncate(0);
str.Append(fieldBegin, parsePointer - fieldBegin);
fSeparatorMenuField->MenuItem()->SetLabel(str);
}
}
}
void
FormatView::AttachedToWindow()
{
@ -480,32 +374,6 @@ FormatView::AttachedToWindow()
}
void
FormatView::_UpdateLongDateFormatString()
{
BString newDateFormat;
for (int i = 0; i < 4; i++) {
newDateFormat.Append(fLongDateString[i]);
newDateFormat.Append(fLongDateSeparator[i]->Text());
}
// TODO save this in the settings preflet and make the roster load it back
fCountry->SetDateFormat(newDateFormat.String());
newDateFormat.Truncate(0);
newDateFormat.Append(fDateString[0]);
newDateFormat.Append(fSeparatorMenuField->MenuItem()->Label());
newDateFormat.Append(fDateString[1]);
newDateFormat.Append(fSeparatorMenuField->MenuItem()->Label());
newDateFormat.Append(fDateString[2]);
// TODO save this in the settings preflet and make the roster load it back
fCountry->SetDateFormat(newDateFormat.String(), false);
}
void
FormatView::MessageReceived(BMessage* message)
{
@ -569,7 +437,7 @@ FormatView::MessageReceived(BMessage* message)
Window()->PostMessage(kSettingsContentsModified);
break;
}
default:
BView::MessageReceived(message);
}
@ -624,20 +492,6 @@ FormatView::Revert()
}
void
FormatView::_SendNotices()
{
// Make the notification message and send it to the tracker:
/*
BMessage notificationMessage;
notificationMessage.AddInt32("TimeFormatSeparator", (int32)settings.TimeFormatSeparator());
notificationMessage.AddInt32("DateOrderFormat", (int32)settings.DateOrderFormat());
notificationMessage.AddBool("24HrClock", settings.ClockIs24Hr());
tracker->SendNotices(kDateFormatChanged, &notificationMessage);
*/
}
void
FormatView::SetCountry(BCountry* country)
{
@ -722,3 +576,155 @@ FormatView::_UpdateExamples()
fNumberFormatExampleView->SetText(u_errorName((UErrorCode)Error));
}
void
FormatView::_SendNotices()
{
// Make the notification message and send it to the tracker:
/*
BMessage notificationMessage;
notificationMessage.AddInt32("TimeFormatSeparator", (int32)settings.TimeFormatSeparator());
notificationMessage.AddInt32("DateOrderFormat", (int32)settings.DateOrderFormat());
notificationMessage.AddBool("24HrClock", settings.ClockIs24Hr());
tracker->SendNotices(kDateFormatChanged, &notificationMessage);
*/
}
//! Get the date format from ICU and set the date fields accordingly
void
FormatView::_ParseDateFormat()
{
// TODO parse the short date too
BString dateFormatString;
fCountry->DateFormat(dateFormatString, true);
const char* dateFormat = dateFormatString.String();
// Travel trough the string and parse it
const char* parsePointer = dateFormat;
const char* fieldBegin = dateFormat;
for (int i = 0; i < 4; i++)
{
fieldBegin = parsePointer;
while (*parsePointer == *(parsePointer + 1)) parsePointer++ ;
parsePointer++;
BString str;
str.Append(fieldBegin, parsePointer - fieldBegin);
fLongDateString[i] = str;
BMenu* subMenu;
bool isFound = false;
for (int subMenuIndex = 0; subMenuIndex < 3; subMenuIndex++) {
subMenu = fLongDateMenu[i]->Menu()->SubmenuAt(subMenuIndex);
BMenuItem* item;
for (int itemIndex = 0; (item = subMenu->ItemAt(itemIndex)) != NULL;
itemIndex++) {
if (static_cast<DateMenuItem*>(item)->ICUCode() == str) {
item->SetMarked(true);
fLongDateMenu[i]->MenuItem()->SetLabel(item->Label());
isFound = true;
} else
item->SetMarked(false);
}
}
if (!isFound)
fLongDateMenu[i]->MenuItem()->SetLabel(str.Append("*"));
fieldBegin = parsePointer;
while ((!IsSpecialDateChar(*parsePointer)) && *parsePointer != '\0'
&& *(parsePointer - 1) >= 0) {
if (*parsePointer == '\'') {
parsePointer++;
while (*parsePointer != '\'') parsePointer++;
}
parsePointer++;
}
str.Truncate(0);
str.Append(fieldBegin, parsePointer - fieldBegin);
fLongDateSeparator[i]->SetText(str);
}
// Short date is a bit more tricky, we want to extract the separator
dateFormatString.Truncate(0);
fCountry->DateFormat(dateFormatString, false);
dateFormat = dateFormatString.String();
// Travel trough the string and parse it
parsePointer = dateFormat;
fieldBegin = dateFormat;
for (int i = 0; i < 3; i++) {
fieldBegin = parsePointer;
while (*parsePointer == *(parsePointer + 1)) parsePointer++ ;
parsePointer++;
BString str;
str.Append(fieldBegin, parsePointer - fieldBegin);
fLongDateString[i] = str;
BMenu* subMenu;
bool isFound = false;
for (int subMenuIndex = 0; subMenuIndex < 3; subMenuIndex++) {
subMenu = fDateMenu[i]->Menu()->SubmenuAt(subMenuIndex);
BMenuItem* item;
for (int itemIndex = 0; (item = subMenu->ItemAt(itemIndex)) != NULL;
itemIndex++) {
if (static_cast<DateMenuItem*>(item)->ICUCode() == str) {
item->SetMarked(true);
fDateMenu[i]->MenuItem()->SetLabel(item->Label());
isFound = true;
} else
item->SetMarked(false);
}
}
if (!isFound) {
fDateMenu[i]->MenuItem()->SetLabel(
str.Append(TR(" (unknown format)")));
}
fieldBegin = parsePointer;
while ((!IsSpecialDateChar(*parsePointer)) && *parsePointer != '\0'
&& *(parsePointer - 1) >= 0) {
if (*parsePointer == '\'') {
parsePointer++;
while (*parsePointer != '\'') parsePointer++;
}
parsePointer++;
}
if (parsePointer - fieldBegin > 0) {
str.Truncate(0);
str.Append(fieldBegin, parsePointer - fieldBegin);
fSeparatorMenuField->MenuItem()->SetLabel(str);
}
}
}
void
FormatView::_UpdateLongDateFormatString()
{
BString newDateFormat;
for (int i = 0; i < 4; i++) {
newDateFormat.Append(fLongDateString[i]);
newDateFormat.Append(fLongDateSeparator[i]->Text());
}
// TODO save this in the settings preflet and make the roster load it back
fCountry->SetDateFormat(newDateFormat.String());
newDateFormat.Truncate(0);
newDateFormat.Append(fDateString[0]);
newDateFormat.Append(fSeparatorMenuField->MenuItem()->Label());
newDateFormat.Append(fDateString[1]);
newDateFormat.Append(fSeparatorMenuField->MenuItem()->Label());
newDateFormat.Append(fDateString[2]);
// TODO save this in the settings preflet and make the roster load it back
fCountry->SetDateFormat(newDateFormat.String(), false);
}

View File

@ -2,8 +2,8 @@
* Copyright 2009, Adrien Destugues, pulkomandy@gmail.com. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef __TIMEFORMATSETTINGS_H__
#define __TIMEFORMATSETTINGS_H__
#ifndef TIME_FORMAT_SETTINGS_H
#define TIME_FORMAT_SETTINGS_H
#include <Box.h>
@ -35,54 +35,54 @@ const uint32 kMenuMessage = 'FRMT';
class FormatView : public BView {
public:
FormatView(BCountry* country);
FormatView(BCountry* country);
virtual void MessageReceived(BMessage* message);
virtual void AttachedToWindow();
virtual void MessageReceived(BMessage* message);
virtual void AttachedToWindow();
virtual void SetDefaults();
virtual bool IsDefaultable() const;
virtual void Revert();
virtual void SetCountry(BCountry* country);
virtual void RecordRevertSettings();
virtual bool IsRevertable() const;
virtual void SetDefaults();
virtual bool IsDefaultable() const;
virtual void Revert();
virtual void SetCountry(BCountry* country);
virtual void RecordRevertSettings();
virtual bool IsRevertable() const;
private:
void _UpdateExamples();
void _SendNotices();
void _ParseDateFormat();
void _UpdateLongDateFormatString();
void _UpdateExamples();
void _SendNotices();
void _ParseDateFormat();
void _UpdateLongDateFormatString();
BRadioButton* f24HrRadioButton;
BRadioButton* f12HrRadioButton;
private:
BRadioButton* f24HrRadioButton;
BRadioButton* f12HrRadioButton;
BMenuField* fLongDateMenu[4];
BString fLongDateString[4];
BTextControl* fLongDateSeparator[4];
BMenuField* fDateMenu[3];
BString fDateString[3];
BMenuField* fLongDateMenu[4];
BString fLongDateString[4];
BTextControl* fLongDateSeparator[4];
BMenuField* fDateMenu[3];
BString fDateString[3];
BMenuField* fSeparatorMenuField;
BMenuField* fSeparatorMenuField;
BStringView* fLongDateExampleView;
BStringView* fShortDateExampleView;
BStringView* fLongTimeExampleView;
BStringView* fShortTimeExampleView;
BStringView* fNumberFormatExampleView;
BStringView* fLongDateExampleView;
BStringView* fShortDateExampleView;
BStringView* fLongTimeExampleView;
BStringView* fShortTimeExampleView;
BStringView* fNumberFormatExampleView;
bool f24HrClock;
bool f24HrClock;
FormatSeparator fSeparator;
BString fDateFormat;
FormatSeparator fSeparator;
BString fDateFormat;
BCountry* fCountry;
BCountry* fCountry;
BBox* fDateBox;
BBox* fTimeBox;
BBox* fNumbersBox;
BBox* fCurrencyBox;
BBox* fDateBox;
BBox* fTimeBox;
BBox* fNumbersBox;
BBox* fCurrencyBox;
};
#endif
#endif // TIME_FORMAT_SETTINGS_H