Fixed memory leaks. Thanks Stephan and Rene! Added naive sorting of the list of available languages, meant to be replaced.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34066 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jonas Sundström
2009-11-15 22:11:50 +00:00
parent eaf37e54bf
commit 2e71609917
2 changed files with 37 additions and 9 deletions
+35 -9
View File
@@ -54,13 +54,26 @@ class LanguageListItem: public BStringItem
}; };
static int
compare_list_items(const void* _a, const void* _b)
{
LanguageListItem* a = *(LanguageListItem**)_a;
LanguageListItem* b = *(LanguageListItem**)_b;
return strcasecmp(a->Text(), b->Text());
}
class LanguageListView: public BListView class LanguageListView: public BListView
{ {
public: public:
LanguageListView(const char* name, list_view_type type) LanguageListView(const char* name, list_view_type type)
: BListView(name, type) :
BListView(name, type),
fMsgPrefLanguagesChanged(new BMessage(kMsgPrefLanguagesChanged))
{} {}
~LanguageListView() { delete fMsgPrefLanguagesChanged; }
bool InitiateDrag(BPoint point, int32 index, bool wasSelected); bool InitiateDrag(BPoint point, int32 index, bool wasSelected);
void MouseMoved(BPoint where, uint32 transit, const BMessage* msg); void MouseMoved(BPoint where, uint32 transit, const BMessage* msg);
void MoveItems(BList& items, int32 index); void MoveItems(BList& items, int32 index);
@@ -107,11 +120,12 @@ class LanguageListView: public BListView
fDropIndex = -1; fDropIndex = -1;
} }
} }
Invoke(new BMessage(kMsgPrefLanguagesChanged)); Invoke(fMsgPrefLanguagesChanged);
} else BListView::MessageReceived(message); } else BListView::MessageReceived(message);
} }
private: private:
int32 fDropIndex; int32 fDropIndex;
BMessage* fMsgPrefLanguagesChanged;
}; };
@@ -299,7 +313,8 @@ LocaleWindow::LocaleWindow()
: :
BWindow(BRect(0, 0, 0, 0), "Locale", B_TITLED_WINDOW, B_NOT_RESIZABLE BWindow(BRect(0, 0, 0, 0), "Locale", B_TITLED_WINDOW, B_NOT_RESIZABLE
| B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS | B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS
| B_QUIT_ON_WINDOW_CLOSE) | B_QUIT_ON_WINDOW_CLOSE),
fMsgPrefLanguagesChanged(new BMessage(kMsgPrefLanguagesChanged))
{ {
BCountry* defaultCountry; BCountry* defaultCountry;
be_locale_roster->GetDefaultCountry(&defaultCountry); be_locale_roster->GetDefaultCountry(&defaultCountry);
@@ -347,6 +362,9 @@ LocaleWindow::LocaleWindow()
fLanguageListView->AddItem(si); fLanguageListView->AddItem(si);
} }
fLanguageListView->SortItems(compare_list_items);
// see previous comment on sort using collators
} else { } else {
BAlert* myAlert = new BAlert("Error", BAlert* myAlert = new BAlert("Error",
TR("Unable to find the available languages! You can't use this " TR("Unable to find the available languages! You can't use this "
@@ -461,6 +479,12 @@ LocaleWindow::LocaleWindow()
} }
LocaleWindow::~LocaleWindow()
{
delete fMsgPrefLanguagesChanged;
}
void void
LocaleWindow::MessageReceived(BMessage* message) LocaleWindow::MessageReceived(BMessage* message)
{ {
@@ -496,9 +520,9 @@ LocaleWindow::MessageReceived(BMessage* message)
BListView* countryList = static_cast<BListView*>(ptr); BListView* countryList = static_cast<BListView*>(ptr);
LanguageListItem* lli = static_cast<LanguageListItem*> LanguageListItem* lli = static_cast<LanguageListItem*>
(countryList->ItemAt(countryList->CurrentSelection())); (countryList->ItemAt(countryList->CurrentSelection()));
BMessage* newMessage = new BMessage(kMsgSettingsChanged); BMessage newMessage(kMsgSettingsChanged);
newMessage->AddString("country",lli->LanguageCode()); newMessage.AddString("country",lli->LanguageCode());
be_app_messenger.SendMessage(newMessage); be_app_messenger.SendMessage(&newMessage);
BCountry* country = new BCountry(lli->LanguageCode()); BCountry* country = new BCountry(lli->LanguageCode());
fFormatView->SetCountry(country); fFormatView->SetCountry(country);
@@ -514,7 +538,7 @@ LocaleWindow::MessageReceived(BMessage* message)
(fLanguageListView->RemoveItem(index)); (fLanguageListView->RemoveItem(index));
fPreferredListView->AddItem(listItem); fPreferredListView->AddItem(listItem);
fPreferredListView fPreferredListView
->Invoke(new BMessage(kMsgPrefLanguagesChanged)); ->Invoke(fMsgPrefLanguagesChanged);
} }
break; break;
} }
@@ -530,8 +554,10 @@ LocaleWindow::MessageReceived(BMessage* message)
= static_cast<LanguageListItem*> = static_cast<LanguageListItem*>
(fPreferredListView->RemoveItem(index)); (fPreferredListView->RemoveItem(index));
fLanguageListView->AddItem(listItem); fLanguageListView->AddItem(listItem);
fLanguageListView->SortItems(compare_list_items);
// see previous comment on sort using collators
fPreferredListView fPreferredListView
->Invoke(new BMessage(kMsgPrefLanguagesChanged)); ->Invoke(fMsgPrefLanguagesChanged);
} }
break; break;
} }
+2
View File
@@ -16,6 +16,7 @@ class FormatView;
class LocaleWindow : public BWindow { class LocaleWindow : public BWindow {
public: public:
LocaleWindow(); LocaleWindow();
~LocaleWindow();
virtual void MessageReceived(BMessage* message); virtual void MessageReceived(BMessage* message);
virtual void FrameMoved(BPoint newPosition); virtual void FrameMoved(BPoint newPosition);
@@ -25,6 +26,7 @@ private:
BListView* fLanguageListView; BListView* fLanguageListView;
BListView* fPreferredListView; BListView* fPreferredListView;
FormatView* fFormatView; FormatView* fFormatView;
BMessage* fMsgPrefLanguagesChanged;
}; };
#endif // LOCALE_WINDOW_H #endif // LOCALE_WINDOW_H