void CQSpeciesDetail::copy() { if (mpMetab == NULL) return; CModel * pModel = NULL; if (mpMetab) pModel = mpDataModel->getModel(); if (pModel == NULL) return; // for getting compartments and initializing cModelExpObj // Create and customize compartment choices dialog CQNameSelectionDialog * pDialog = new CQNameSelectionDialog(this); pDialog->setWindowTitle("Choose a compartment"); pDialog->mpLblName->setText("compartment"); pDialog->mpSelectionBox->clear(); pDialog->mpSelectionBox->setDuplicatesEnabled(false); pDialog->mpSelectionBox->setEditable(false); // at least for now, unless we want to add new compartment creation here. // Use CModelExpansion for duplication CModelExpansion cModelExpObj = CModelExpansion(pModel); CModelExpansion::SetOfModelElements sourceObjects; CModelExpansion::ElementsMap origToCopyMapping; // for comboBox compartment list and setting compartment CCopasiVectorNS< CCompartment > & Compartments = pModel->getCompartments(); CCopasiVectorN< CCompartment >::const_iterator it = Compartments.begin(); CCopasiVectorN< CCompartment >::const_iterator end = Compartments.end(); QStringList SelectionList; // Collect and load list of compartment names in comboBox for (; it != end; ++it) { SelectionList.append(FROM_UTF8((*it)->getObjectName())); } pDialog->setSelectionList(SelectionList); //Set the current compartment as the default mpCurrentCompartment = mpMetab->getCompartment(); // to use here, and for testing if compartment changed after executing the dialog int origCompartmentIndex = pDialog->mpSelectionBox->findText(FROM_UTF8(mpCurrentCompartment->getObjectName())); pDialog->mpSelectionBox->setCurrentIndex(origCompartmentIndex); it = Compartments.begin(); // Reuse Compartments iterator to set compartment choice if (pDialog->exec() != QDialog::Rejected) { // Put species in different compartment (without name modification) by making // duplicateMetab think the other compartment was duplicated from the original if(origCompartmentIndex != pDialog->mpSelectionBox->currentIndex()) { sourceObjects.addCompartment(mpMetab->getCompartment()); origToCopyMapping.add(mpMetab->getCompartment(),*(it + pDialog->mpSelectionBox->currentIndex())); } sourceObjects.addMetab(mpMetab); cModelExpObj.duplicateMetab(mpMetab, "_copy", sourceObjects, origToCopyMapping); protectedNotify(ListViews::COMPARTMENT, ListViews::DELETE, "");//Refresh all protectedNotify(ListViews::METABOLITE, ListViews::DELETE, ""); //Refresh all protectedNotify(ListViews::REACTION, ListViews::DELETE, ""); //Refresh all mpListView->switchToOtherWidget(C_INVALID_INDEX, origToCopyMapping.getDuplicateKey(mKey)); } pdelete(pDialog); }
void CQCompartment::copy() { CModel * pModel = mpDataModel->getModel(); CModelExpansion cModelExpObj = CModelExpansion(pModel); CModelExpansion::SetOfModelElements compartmentObjectsToCopy; CModelExpansion::ElementsMap origToCopyMappings; CQCompartmentCopyOptions * pDialog = new CQCompartmentCopyOptions(this); pDialog->exec(); bool success = false; switch (pDialog->result()) { case QDialog::Rejected: break; case CQCompartmentCopyOptions::COMP: //compartment only compartmentObjectsToCopy.addObject(mpObject); success = true; break; case CQCompartmentCopyOptions::SPECIES: // include the species { compartmentObjectsToCopy.addObject(mpObject); CCopasiVectorNS < CMetab > & Metabolites = mpCompartment->getMetabolites(); CCopasiVectorNS < CMetab >::const_iterator itMetab; for (itMetab = Metabolites.begin(); itMetab != Metabolites.end(); ++itMetab) { compartmentObjectsToCopy.addMetab(*itMetab); } } success = true; break; case CQCompartmentCopyOptions::INTREAC: //also include the internal reactions { compartmentObjectsToCopy.addObject(mpObject); // Get all the compartment's species first CCopasiVectorNS < CMetab > & Metabolites = mpCompartment->getMetabolites(); CCopasiVectorNS < CMetab >::const_iterator itMetab; for (itMetab = Metabolites.begin(); itMetab != Metabolites.end(); ++itMetab) { compartmentObjectsToCopy.addMetab(*itMetab); } // Now get the reactions which are not multi-compartment CCopasiVectorN< CReaction >::const_iterator it = pModel->getReactions().begin(); CCopasiVectorN< CReaction >::const_iterator end = pModel->getReactions().end(); CReactionInterface * pRi = new CReactionInterface(pModel); for (; it != end; ++it) { pRi->initFromReaction((*it)->getKey()); if (!pRi->isMulticompartment()) { if (pRi->getChemEqInterface().getCompartment()->getKey() == mKey) compartmentObjectsToCopy.addReaction(*it); } } pdelete(pRi); success = true; break; } case CQCompartmentCopyOptions::ALLREAC: //get everything in compartment compartmentObjectsToCopy.addObject(mpObject); compartmentObjectsToCopy.fillDependencies(pModel); success = true; break; } pdelete(pDialog); if (success) { cModelExpObj.duplicate(compartmentObjectsToCopy, "_copy", origToCopyMappings); protectedNotify(ListViews::COMPARTMENT, ListViews::DELETE, "");//Refresh all protectedNotify(ListViews::METABOLITE, ListViews::DELETE, ""); //Refresh all protectedNotify(ListViews::REACTION, ListViews::DELETE, ""); //Refresh all mpListView->switchToOtherWidget(C_INVALID_INDEX, origToCopyMappings.getDuplicateKey(mKey)); } }