Fix #5755: Locale preflet crashing when dragging languages around
* The flag bitmaps being part of list items were not treated properly in the language item's copy constructor (the bitmap pointer was copied, not the bitmap object itself). As a result, bitmap objects were freed more than once. * some cleanup git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36487 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -37,14 +37,23 @@ LanguageListItem::LanguageListItem(const char* text, const char* code)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LanguageListItem::LanguageListItem(const LanguageListItem& other)
|
||||||
|
:
|
||||||
|
BStringItem(other.Text()),
|
||||||
|
fLanguageCode(other.fLanguageCode),
|
||||||
|
fIcon(other.fIcon ? new(std::nothrow) BBitmap(other.fIcon) : NULL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
LanguageListItem::~LanguageListItem()
|
LanguageListItem::~LanguageListItem()
|
||||||
{
|
{
|
||||||
delete fIcon;
|
delete fIcon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//MediaListItem - DrawItem
|
//MediaListItem - DrawItem
|
||||||
void
|
void
|
||||||
LanguageListItem::DrawItem(BView *owner, BRect frame, bool complete)
|
LanguageListItem::DrawItem(BView *owner, BRect frame, bool complete)
|
||||||
{
|
{
|
||||||
rgb_color kHighlight = { 140,140,140,0 };
|
rgb_color kHighlight = { 140,140,140,0 };
|
||||||
@@ -66,7 +75,7 @@ LanguageListItem::DrawItem(BView *owner, BRect frame, bool complete)
|
|||||||
} else {
|
} else {
|
||||||
owner->SetLowColor(owner->ViewColor());
|
owner->SetLowColor(owner->ViewColor());
|
||||||
}
|
}
|
||||||
|
|
||||||
frame.left += 4;
|
frame.left += 4;
|
||||||
BRect iconFrame(frame);
|
BRect iconFrame(frame);
|
||||||
iconFrame.Set(iconFrame.left, iconFrame.top+1, iconFrame.left+15, iconFrame.top+16);
|
iconFrame.Set(iconFrame.left, iconFrame.top+1, iconFrame.left+15, iconFrame.top+16);
|
||||||
@@ -79,7 +88,7 @@ LanguageListItem::DrawItem(BView *owner, BRect frame, bool complete)
|
|||||||
|
|
||||||
frame.left += 16 * (OutlineLevel() + 1);
|
frame.left += 16 * (OutlineLevel() + 1);
|
||||||
owner->SetHighColor(kBlack);
|
owner->SetHighColor(kBlack);
|
||||||
|
|
||||||
BFont font = be_plain_font;
|
BFont font = be_plain_font;
|
||||||
font_height finfo;
|
font_height finfo;
|
||||||
font.GetHeight(&finfo);
|
font.GetHeight(&finfo);
|
||||||
@@ -193,7 +202,7 @@ void LanguageListView::MessageReceived (BMessage* message)
|
|||||||
// Item has a parent
|
// Item has a parent
|
||||||
fDropIndex = FullListIndexOf(Superitem(FullListItemAt(fDropIndex)));
|
fDropIndex = FullListIndexOf(Superitem(FullListItemAt(fDropIndex)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Item is now a top level one - we must insert just below its last child
|
// Item is now a top level one - we must insert just below its last child
|
||||||
fDropIndex += CountItemsUnder(FullListItemAt(fDropIndex),false) + 1;
|
fDropIndex += CountItemsUnder(FullListItemAt(fDropIndex),false) + 1;
|
||||||
|
|
||||||
@@ -355,7 +364,7 @@ LanguageListView::MouseMoved(BPoint where, uint32 transit, const BMessage* msg)
|
|||||||
// offset where by half of item height
|
// offset where by half of item height
|
||||||
BRect r = ItemFrame(0);
|
BRect r = ItemFrame(0);
|
||||||
where.y += r.Height() / 2.0;
|
where.y += r.Height() / 2.0;
|
||||||
|
|
||||||
int32 index = FullListIndexOf(where);
|
int32 index = FullListIndexOf(where);
|
||||||
if (index < 0)
|
if (index < 0)
|
||||||
index = FullListCountItems();
|
index = FullListCountItems();
|
||||||
|
|||||||
@@ -19,34 +19,18 @@
|
|||||||
class LanguageListItem: public BStringItem {
|
class LanguageListItem: public BStringItem {
|
||||||
public:
|
public:
|
||||||
LanguageListItem(const char* text, const char* code);
|
LanguageListItem(const char* text, const char* code);
|
||||||
|
LanguageListItem(const LanguageListItem& other);
|
||||||
LanguageListItem(const LanguageListItem& other)
|
|
||||||
:
|
|
||||||
BStringItem(other.Text()),
|
|
||||||
fLanguageCode(other.fLanguageCode),
|
|
||||||
fIcon(other.fIcon)
|
|
||||||
{}
|
|
||||||
|
|
||||||
~LanguageListItem();
|
~LanguageListItem();
|
||||||
|
|
||||||
const inline BString LanguageCode() { return fLanguageCode; }
|
const BString& LanguageCode() { return fLanguageCode; }
|
||||||
void DrawItem(BView *owner, BRect frame, bool complete = false);
|
void DrawItem(BView *owner, BRect frame, bool complete = false);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const BString fLanguageCode;
|
BString fLanguageCode;
|
||||||
BBitmap* fIcon;
|
BBitmap* fIcon;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
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 BOutlineListView {
|
class LanguageListView: public BOutlineListView {
|
||||||
public:
|
public:
|
||||||
LanguageListView(const char* name, list_view_type type);
|
LanguageListView(const char* name, list_view_type type);
|
||||||
|
|||||||
@@ -34,6 +34,15 @@
|
|||||||
#define TR_CONTEXT "Locale Preflet Window"
|
#define TR_CONTEXT "Locale Preflet Window"
|
||||||
|
|
||||||
|
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
LocaleWindow::LocaleWindow()
|
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
|
||||||
@@ -54,7 +63,7 @@ LocaleWindow::LocaleWindow()
|
|||||||
|
|
||||||
BView* languageTab = new BView(TR("Language"), B_WILL_DRAW);
|
BView* languageTab = new BView(TR("Language"), B_WILL_DRAW);
|
||||||
languageTab->SetLayout(new BGroupLayout(B_VERTICAL, 0));
|
languageTab->SetLayout(new BGroupLayout(B_VERTICAL, 0));
|
||||||
|
|
||||||
{
|
{
|
||||||
// first list: available languages
|
// first list: available languages
|
||||||
fLanguageListView = new LanguageListView("available",
|
fLanguageListView = new LanguageListView("available",
|
||||||
@@ -161,7 +170,7 @@ LocaleWindow::LocaleWindow()
|
|||||||
BScrollView* scrollView = new BScrollView("scroller",
|
BScrollView* scrollView = new BScrollView("scroller",
|
||||||
listView, B_WILL_DRAW | B_FRAME_EVENTS, false, true);
|
listView, B_WILL_DRAW | B_FRAME_EVENTS, false, true);
|
||||||
listView->SetSelectionMessage(new BMessage(kMsgCountrySelection));
|
listView->SetSelectionMessage(new BMessage(kMsgCountrySelection));
|
||||||
|
|
||||||
// get all available countries from ICU
|
// get all available countries from ICU
|
||||||
// Use DateFormat::getAvailableLocale so we get only the one we can
|
// Use DateFormat::getAvailableLocale so we get only the one we can
|
||||||
// use. Maybe check the NumberFormat one and see if there is more.
|
// use. Maybe check the NumberFormat one and see if there is more.
|
||||||
|
|||||||
Reference in New Issue
Block a user