void ObjectBrowserWidget::loadField(ObjectBrowserItem* parent, CCopasiVector <CCopasiObject>* copaParent) { unsigned int i; ObjectBrowserItem* lastFieldItem = NULL; CCopasiObject* currentFieldObject = NULL; ObjectBrowserItem* lastObjectItem = NULL; CCopasiObject* currentObject = NULL; if ((copaParent->size() < 1) || (!(*copaParent)[0]->isContainer())) return; //empty list const CCopasiContainer::objectMap * pFieldList = &(static_cast< CCopasiContainer * >((*copaParent)[0])->getObjects()); CCopasiContainer::objectMap::const_iterator fieldIt = pFieldList->begin(); CCopasiContainer::objectMap::const_iterator fieldEnd = pFieldList->end(); while (fieldIt != fieldEnd) { currentFieldObject = fieldIt->second; ObjectBrowserItem* currentFieldItem = new ObjectBrowserItem(parent, lastFieldItem, NULL, objectItemList); currentFieldItem->attachKey(); currentFieldItem->setObjectType(FIELDATTR); currentFieldItem->setText(0, FROM_UTF8(currentFieldObject->getObjectName())); lastFieldItem = currentFieldItem; lastObjectItem = NULL; for (i = 0; i < copaParent->size(); i++) { CCopasiObject* pSubField; currentObject = (*static_cast< CCopasiVector < CCopasiObject > * >(copaParent))[i]; if (currentObject->isContainer()) pSubField = getFieldCopasiObject(static_cast< CCopasiContainer * >(currentObject), FROM_UTF8(currentFieldObject->getObjectName())); else { pSubField = NULL; // this shall be an exception error } ObjectBrowserItem* currentItem = new ObjectBrowserItem(currentFieldItem, lastObjectItem, pSubField, objectItemList); currentItem->setText(0, FROM_UTF8(currentObject->getObjectName())); // if ((pSubField)&&(pSubField->isVector())) // currentItem->setText(0, currentItem->text(0) + "[]"); currentItem->setObjectType(FIELDATTR); currentItem->attachKey(); if (pSubField) if (pSubField->isContainer()) //container field recursively to find all possible items { loadChild(currentItem, static_cast< CCopasiContainer * >(pSubField), false); // wont show the attribute and field list } lastObjectItem = currentItem; } fieldIt++; } }
void ObjectBrowserWidget::loadChild(ObjectBrowserItem* parent, const CCopasiContainer* copaParent, bool nField) { unsigned int i; ObjectBrowserItem* last = NULL; CCopasiObject* current = NULL; ObjectList* childStack = new ObjectList(); const CCopasiContainer::objectMap * pObjectList = & copaParent->getObjects(); CCopasiContainer::objectMap::const_iterator it = pObjectList->begin(); CCopasiContainer::objectMap::const_iterator end = pObjectList->end(); if ((copaParent->isVector()) && (nField)) { if ((static_cast< const CCopasiVector < CCopasiObject > * >(copaParent)->size() >= 1) && ((*static_cast< const CCopasiVector < CCopasiObject > * >(copaParent))[0]->isContainer())) {//add attribute list ObjectBrowserItem* fieldChild = new ObjectBrowserItem(parent, NULL, NULL, objectItemList); fieldChild->setObjectType(FIELDATTR); fieldChild->setText(0, "Select by attribute"); fieldChild->setSelectable(false); loadField(fieldChild, const_cast<CCopasiVector < CCopasiObject > *>(static_cast< const CCopasiVector < CCopasiObject > * >(copaParent))); fieldChild->attachKey(); last = fieldChild; } } if (copaParent->isVector()) { for (i = 0; i < static_cast< const CCopasiVector < CCopasiObject > * >(copaParent)->size(); i++) { current = (*static_cast< const CCopasiVector < CCopasiObject > * >(copaParent))[i]; ObjectBrowserItem* currentItem = new ObjectBrowserItem(parent, last, current, objectItemList); last = currentItem; currentItem->setText(0, FROM_UTF8(current->getObjectName())); if (current->isContainer()) { currentItem->setObjectType(CONTAINERATTR); currentItem->attachKey(); if (current->isVector()) currentItem->setText(0, currentItem->text(0) + "[]"); loadChild(currentItem, static_cast< CCopasiContainer * >(current), nField); } else { currentItem->setObjectType(OBJECTATTR); childStack->insert(currentItem); //attach the key later } } } else { while (it != end) { current = it->second; // Skip all strings if (dynamic_cast<CCopasiStaticString *>(current)) { it++; continue; } ObjectBrowserItem* currentItem = new ObjectBrowserItem(parent, last, current, objectItemList); last = currentItem; currentItem->setText(0, FROM_UTF8(current->getObjectName())); if (current->isContainer()) { currentItem->setObjectType(CONTAINERATTR); currentItem->attachKey(); if (current->isVector()) currentItem->setText(0, currentItem->text(0) + "[]"); loadChild(currentItem, static_cast< CCopasiContainer * >(current), nField); } else { currentItem->setObjectType(OBJECTATTR); childStack->insert(currentItem); //attach the key later } it++; } } ObjectBrowserItem* pCurrent; while (childStack->len() > 0) { pCurrent = childStack->pop(); pCurrent->attachKey(); } pdelete(childStack); }