void PrefListView::BuildView(XmlNode *node, int level, BListItem* parent) { if (!node) { puts("Rebuild mit NULL?!"); return; } int anz = node->Children(); //printf("BuildView: %s %d einträge\n", node->Attribute("text"), anz); if (anz>0) { if (level==0) { for (int i=0;i<anz;i++) { XmlNode* c = (XmlNode*)node->ItemAt(i); const char* t = c->Attribute("text"); BStringItem* item = new BStringItem(t); item->SetText( t ); if (level>0) AddUnder(item, parent); else AddItem(item); //printf("Hinzufügen war %d\n", b); if (c->Children()>0) { BuildView(c, level+1, item); } } DeselectAll(); } else { for (int i=anz-1;i>=0;i--) { XmlNode* c = (XmlNode*)node->ItemAt(i); const char* t = c->Attribute("text"); BStringItem* item = new BStringItem(t); item->SetText( t ); if (level>0) AddUnder(item, parent); else AddItem(item); //printf("Hinzufügen war %d\n", b); if (c->Children()>0) { BuildView(c, level+1, item); } } } } else { //puts("Tja..."); } }
int sortX(const BListItem* itemA, const BListItem* itemB) { XmlNode *a = (XmlNode*)itemA; XmlNode *b = (XmlNode*)itemB; BString sa( a->Attribute(OPML_TITLE) ); return sa.Compare( b->Attribute(OPML_TITLE) ); }
void PrefListView::MessageReceived(BMessage* msg) { switch (msg->what) { case 'ITEM': { puts("We have a winner, supposably ;-)"); BPoint dropzone; msg->FindPoint("_drop_point_", &dropzone); dropzone = ConvertFromScreen(dropzone); int32 i, nr; msg->FindInt32("Item", &i); msg->FindInt32("Item_nr", &nr); XmlNode* Item = (XmlNode*)i; XmlNode* toItem = dynamic_cast<XmlNode*>(ItemAt(IndexOf(dropzone))); // Only proceed if valid if (toItem && Item && toItem!=Item) { XmlNode* parent = Item->Parent(); uint32 index = parent->IndexOf(Item); uint32 toIndex = toItem->Parent()->IndexOf(toItem); if (index<toIndex) toIndex++; parent->DetachChild(index); if (toItem->Attribute(OPML_URL)!=NULL) { toItem->Parent()->AddChild(Item, toIndex); } else { toItem->AddChild(Item,0); } MakeEmpty(); BuildView(root); Invalidate(); } } break; default: BOutlineListView::MessageReceived(msg); } }