* Fixed broken archive functionality, before we would not archive subitems

and store the archived items in the wrong message field. Verified on R5.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26278 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Karsten Heimrich
2008-07-06 14:46:06 +00:00
parent 7da7c45951
commit ba18b05b5d
+41 -1
View File
@@ -46,6 +46,17 @@ BOutlineListView::BOutlineListView(BRect frame, const char* name,
BOutlineListView::BOutlineListView(BMessage* archive) BOutlineListView::BOutlineListView(BMessage* archive)
: BListView(archive) : BListView(archive)
{ {
int32 i = 0;
BMessage subData;
while (archive->FindMessage("_l_full_items", i++, &subData) == B_OK) {
BArchivable *object = instantiate_object(&subData);
if (!object)
continue;
BListItem *item = dynamic_cast<BListItem*>(object);
if (item)
AddItem(item);
}
} }
@@ -68,7 +79,36 @@ BOutlineListView::Instantiate(BMessage* archive)
status_t status_t
BOutlineListView::Archive(BMessage* archive, bool deep) const BOutlineListView::Archive(BMessage* archive, bool deep) const
{ {
return BListView::Archive(archive, deep); // Note: We can't call the BListView Archive function here, as we are also
// interested in subitems BOutlineListView can have. They are even stored
// with a different field name (_l_full_items vs. _l_items).
status_t status = BView::Archive(archive, deep);
if (status != B_OK)
return status;
status = archive->AddInt32("_lv_type", fListType);
if (status == B_OK && deep) {
int32 i = 0;
BListItem *item = NULL;
while ((item = static_cast<BListItem*>(fFullList.ItemAt(i++)))) {
BMessage subData;
status = item->Archive(&subData, true);
if (status >= B_OK)
status = archive->AddMessage("_l_full_items", &subData);
if (status < B_OK)
break;
}
}
if (status >= B_OK && InvocationMessage() != NULL)
status = archive->AddMessage("_msg", InvocationMessage());
if (status == B_OK && fSelectMessage != NULL)
status = archive->AddMessage("_2nd_msg", fSelectMessage);
return status;
} }