// static QMessageBox::StandardButton CQMessageBox::confirmDelete(QWidget *parent, const QString &objectType, const QString &objects, const std::set< const CCopasiObject * > & deletedObjects) { if (deletedObjects.size() == 0) return QMessageBox::Ok; // Determine the affected data model const CCopasiDataModel * pDataModel = (*deletedObjects.begin())->getObjectDataModel(); // Determine the affected function DB CFunctionDB * pFunctionDB = dynamic_cast< CFunctionDB * >((*deletedObjects.begin())->getObjectAncestor("FunctionDB")); if (pDataModel == NULL && pFunctionDB == NULL) return QMessageBox::Ok; if (pFunctionDB != NULL) { // TODO In case a function is deleted we need to loop through all data models pDataModel = (*CCopasiRootContainer::getDatamodelList())[0]; } else { pFunctionDB = CCopasiRootContainer::getFunctionList(); } QString msg = QString("Do you want to delete the listed %1?\n %2\n").arg(objectType, objects); std::set< const CCopasiObject * > Functions; std::set< const CCopasiObject * > Reactions; std::set< const CCopasiObject * > Metabolites; std::set< const CCopasiObject * > Values; std::set< const CCopasiObject * > Compartments; std::set< const CCopasiObject * > Events; std::set< const CCopasiObject * > Tasks; bool Used = false; if (pFunctionDB != NULL) { Used |= pFunctionDB->appendDependentFunctions(deletedObjects, Functions); if (Functions.size() > 0) { msg.append("Following functions(s) reference above and will be deleted:\n "); std::set< const CCopasiObject * >::const_iterator it = Functions.begin(); std::set< const CCopasiObject * >::const_iterator end = Functions.end(); for (; it != end; ++it) { msg.append(FROM_UTF8((*it)->getObjectName())); msg.append("\n "); } msg.remove(msg.length() - 2, 2); } } const CModel * pModel = NULL; if (pDataModel != NULL) { pModel = pDataModel->getModel(); // We need to check the tasks Used |= pDataModel->appendDependentTasks(deletedObjects, Tasks); if (Tasks.size() > 0) { msg.append("Following task(s) reference above and will be modified:\n "); std::set< const CCopasiObject * >::const_iterator it = Tasks.begin(); std::set< const CCopasiObject * >::const_iterator end = Tasks.end(); for (; it != end; ++it) { msg.append(FROM_UTF8((*it)->getObjectName())); msg.append("\n "); } msg.remove(msg.length() - 2, 2); } } if (pModel != NULL) { Used |= pModel->appendDependentModelObjects(deletedObjects, Reactions, Metabolites, Compartments, Values, Events); if (Reactions.size() > 0) { msg.append("Following reactions(s) reference above and will be deleted:\n "); std::set< const CCopasiObject * >::const_iterator it = Reactions.begin(); std::set< const CCopasiObject * >::const_iterator end = Reactions.end(); for (; it != end; ++it) { msg.append(FROM_UTF8((*it)->getObjectName())); msg.append("\n "); } msg.remove(msg.length() - 2, 2); } if (Metabolites.size() > 0) { msg.append("Following species reference above and will be deleted:\n "); std::set< const CCopasiObject * >::const_iterator it = Metabolites.begin(); std::set< const CCopasiObject * >::const_iterator end = Metabolites.end(); for (; it != end; ++it) { msg.append(FROM_UTF8((*it)->getObjectName())); msg.append("\n "); } msg.remove(msg.length() - 2, 2); } if (Values.size() > 0) { msg.append("Following global quantities reference above and will be deleted:\n "); std::set< const CCopasiObject * >::const_iterator it = Values.begin(); std::set< const CCopasiObject * >::const_iterator end = Values.end(); for (; it != end; ++it) { msg.append(FROM_UTF8((*it)->getObjectName())); msg.append("\n "); } msg.remove(msg.length() - 2, 2); } if (Compartments.size() > 0) { msg.append("Following compartment(s) reference above and will be deleted:\n "); std::set< const CCopasiObject * >::const_iterator it = Compartments.begin(); std::set< const CCopasiObject * >::const_iterator end = Compartments.end(); for (; it != end; ++it) { msg.append(FROM_UTF8((*it)->getObjectName())); msg.append("\n "); } msg.remove(msg.length() - 2, 2); } if (Events.size() > 0) { msg.append("Following event(s) reference above and will be deleted:\n "); std::set< const CCopasiObject * >::const_iterator it = Events.begin(); std::set< const CCopasiObject * >::const_iterator end = Events.end(); for (; it != end; ++it) { msg.append(FROM_UTF8((*it)->getObjectName())); msg.append("\n "); } msg.remove(msg.length() - 2, 2); } } StandardButton choice = QMessageBox::Ok; if (Used) { choice = CQMessageBox::question(parent, "CONFIRM DELETE", msg, QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel); } return choice; }
bool FunctionWidget1::leave() { assert(CCopasiRootContainer::getDatamodelList()->size() > 0); CModel * pModel = (*CCopasiRootContainer::getDatamodelList())[0]->getModel(); if (pModel == NULL) return true; // :TODO: We should check what changes have been done to the function // CFunctionDB * pFunctionDB = CCopasiRootContainer::getFunctionList(); if (pFunctionDB == NULL) return true; CEvaluationTree * pFunction = dynamic_cast<CEvaluationTree *>(CCopasiRootContainer::getKeyFactory()->get(mKey)); if (pFunction == NULL) return true; bool Used = false; if (functionParametersChanged()) { QString msg = QString("Cannot modify function: \n %1\n").arg(FROM_UTF8(pFunction->getObjectName())); std::set< const CCopasiObject * > Functions; std::set< const CCopasiObject * > Reactions; std::set< const CCopasiObject * > Metabolites; std::set< const CCopasiObject * > Values; std::set< const CCopasiObject * > Compartments; std::set< const CCopasiObject * > Events; std::set< const CCopasiObject * > DeletedObjects = pFunction->getDeletedObjects(); Used |= pFunctionDB->appendDependentFunctions(DeletedObjects, Functions); if (Functions.size() > 0) { msg.append("Following functions(s) reference above:\n "); std::set< const CCopasiObject * >::const_iterator it = Functions.begin(); std::set< const CCopasiObject * >::const_iterator end = Functions.end(); for (; it != end; ++it) { msg.append(FROM_UTF8((*it)->getObjectName())); msg.append("\n "); } msg.remove(msg.length() - 2, 2); } Used |= pModel->appendDependentModelObjects(DeletedObjects, Reactions, Metabolites, Compartments, Values, Events); if (Reactions.size() > 0) { msg.append("Following reactions(s) reference above:\n "); std::set< const CCopasiObject * >::const_iterator it = Reactions.begin(); std::set< const CCopasiObject * >::const_iterator end = Reactions.end(); for (; it != end; ++it) { msg.append(FROM_UTF8((*it)->getObjectName())); msg.append("\n "); } msg.remove(msg.length() - 2, 2); } if (Metabolites.size() > 0) { msg.append("Following species reference above:\n "); std::set< const CCopasiObject * >::const_iterator it = Metabolites.begin(); std::set< const CCopasiObject * >::const_iterator end = Metabolites.end(); for (; it != end; ++it) { msg.append(FROM_UTF8((*it)->getObjectName())); msg.append("\n "); } msg.remove(msg.length() - 2, 2); } if (Values.size() > 0) { msg.append("Following global quantities reference above:\n "); std::set< const CCopasiObject * >::const_iterator it = Values.begin(); std::set< const CCopasiObject * >::const_iterator end = Values.end(); for (; it != end; ++it) { msg.append(FROM_UTF8((*it)->getObjectName())); msg.append("\n "); } msg.remove(msg.length() - 2, 2); } if (Compartments.size() > 0) { msg.append("Following compartment(s) reference above:\n "); std::set< const CCopasiObject * >::const_iterator it = Compartments.begin(); std::set< const CCopasiObject * >::const_iterator end = Compartments.end(); for (; it != end; ++it) { msg.append(FROM_UTF8((*it)->getObjectName())); msg.append("\n "); } msg.remove(msg.length() - 2, 2); } if (Events.size() > 0) { msg.append("Following event(s) reference above:\n "); std::set< const CCopasiObject * >::const_iterator it = Events.begin(); std::set< const CCopasiObject * >::const_iterator end = Events.end(); for (; it != end; ++it) { msg.append(FROM_UTF8((*it)->getObjectName())); msg.append("\n "); } msg.remove(msg.length() - 2, 2); } if (Used) { CQMessageBox::information(this, "Modification not possible", msg, QMessageBox::Ok, QMessageBox::Ok); return true; } } if (isValid) { saveToFunction(); mpExpressionEMSW->updateWidget(); } //update pFunction values /* Remove line breaks from the function description */ /*std::string desc = TO_UTF8(textBrowser->text()); unsigned int loc = 0; while (1) { loc = desc.find('\n', loc); if (loc == std::string::npos) break; desc.erase(loc, 1); } textBrowser->setText(FROM_UTF8(desc));*/ //mScrollView->hide(); return true; }