CodeOperation *newCodeOperation(ClassifierCodeDocument *ccd, UMLOperation * op) { CodeOperation *retval = NULL; switch (UMLApp::app()->activeLanguage()) { case Uml::ProgrammingLanguage::Cpp: { CPPHeaderCodeDocument *hcd = dynamic_cast<CPPHeaderCodeDocument*>(ccd); if (hcd) { CPPHeaderCodeOperation *cpphcd = new CPPHeaderCodeOperation(hcd, op); cpphcd->updateMethodDeclaration(); cpphcd->updateContent(); return cpphcd; } CPPSourceCodeDocument *scd = dynamic_cast<CPPSourceCodeDocument*>(ccd); if (scd) { CPPSourceCodeOperation *cppscd = new CPPSourceCodeOperation(scd, op); cppscd->updateMethodDeclaration(); cppscd->updateContent(); return cppscd; } } break; case Uml::ProgrammingLanguage::D: retval = new DCodeOperation(dynamic_cast<DClassifierCodeDocument*>(ccd), op); retval->updateMethodDeclaration(); retval->updateContent(); break; case Uml::ProgrammingLanguage::Java: retval = new JavaCodeOperation(dynamic_cast<JavaClassifierCodeDocument*>(ccd), op); retval->updateMethodDeclaration(); retval->updateContent(); break; case Uml::ProgrammingLanguage::Ruby: retval = new RubyCodeOperation(dynamic_cast<RubyClassifierCodeDocument*>(ccd), op); retval->updateMethodDeclaration(); retval->updateContent(); break; default: break; } return retval; }
// Sigh. NOT optimal. The only reason that we need to have this // is so we can create the CPPHeaderClassDeclarationBlock. // would be better if we could create a handler interface that each // codeblock used so all we have to do here is add the handler void CPPHeaderCodeDocument::loadChildTextBlocksFromNode (QDomElement & root) { QDomNode tnode = root.firstChild(); QDomElement telement = tnode.toElement(); bool loadCheckForChildrenOK = false; while(!telement.isNull()) { QString nodeName = telement.tagName(); if(nodeName == QLatin1String("textblocks")) { QDomNode node = telement.firstChild(); QDomElement element = node.toElement(); // if there is nothing to begin with, then we don't worry about it loadCheckForChildrenOK = element.isNull() ? true : false; while(!element.isNull()) { QString name = element.tagName(); if(name == QLatin1String("codecomment")) { CodeComment * block = new CPPCodeDocumentation(this); block->loadFromXMI(element); if(!addTextBlock(block)) { uError()<<"Unable to add codeComment to :"<<this; delete block; } else loadCheckForChildrenOK= true; } else if(name == QLatin1String("codeaccessormethod") || name == QLatin1String("ccfdeclarationcodeblock")) { QString acctag = element.attribute(QLatin1String("tag")); // search for our method in the TextBlock * tb = findCodeClassFieldTextBlockByTag(acctag); if(!tb || !addTextBlock(tb)) { uError()<<"Unable to add codeclassfield child method to:"<<this; // DON'T delete } else loadCheckForChildrenOK= true; } else if(name == QLatin1String("codeblock")) { CodeBlock * block = newCodeBlock(); block->loadFromXMI(element); if(!addTextBlock(block)) { uError()<<"Unable to add codeBlock to :"<<this; delete block; } else loadCheckForChildrenOK= true; } else if(name == QLatin1String("codeblockwithcomments")) { CodeBlockWithComments * block = newCodeBlockWithComments(); block->loadFromXMI(element); if(!addTextBlock(block)) { uError()<<"Unable to add codeBlockwithcomments to:"<<this; delete block; } else loadCheckForChildrenOK= true; } else if(name == QLatin1String("header")) { // do nothing.. this is treated elsewhere } else if(name == QLatin1String("hierarchicalcodeblock")) { HierarchicalCodeBlock * block = newHierarchicalCodeBlock(); block->loadFromXMI(element); if(!addTextBlock(block)) { uError()<<"Unable to add hierarchicalcodeBlock to:"<<this; delete block; } else loadCheckForChildrenOK= true; } else if(name == QLatin1String("codeoperation")) { // find the code operation by id QString id = element.attribute(QLatin1String("parent_id"),QLatin1String("-1")); UMLObject * obj = UMLApp::app()->document()->findObjectById(Uml::ID::fromString(id)); UMLOperation * op = dynamic_cast<UMLOperation*>(obj); if(op) { CodeOperation * block = new CPPHeaderCodeOperation(this, op); block->updateMethodDeclaration(); block->updateContent(); block->loadFromXMI(element); if(addTextBlock(block)) loadCheckForChildrenOK= true; else { uError()<<"Unable to add codeoperation to:"<<this; block->deleteLater(); } } else uError()<<"Unable to find operation create codeoperation for:"<<this; } else if(name == QLatin1String("cppheaderclassdeclarationblock")) { CPPHeaderClassDeclarationBlock * block = getClassDecl(); block->loadFromXMI(element); // normally this would be populated by the following syncToparent // call, but we cant wait for it, so lets just do it now. m_namespaceBlock = getHierarchicalCodeBlock(QLatin1String("namespace"), QLatin1String("Namespace"), 0); if(!m_namespaceBlock || !m_namespaceBlock->addTextBlock(block)) { uError()<<"Error:cant add class declaration codeblock"; // DON'T delete/release block // block->release(); } else loadCheckForChildrenOK= true; } // only needed for extreme debugging conditions (E.g. making new codeclassdocument loader) //else //uDebug()<<" LoadFromXMI: Got strange tag in text block stack:"<<name<<", ignorning"; node = element.nextSibling(); element = node.toElement(); } break; } tnode = telement.nextSibling(); telement = tnode.toElement(); } if(!loadCheckForChildrenOK) { uWarning() << "loadChildBlocks : unable to initialize any child blocks in doc: " << getFileName() << " " << this; } }