You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdesdk/umbrello/umbrello/codegenerators/cppheadercodeoperation.cpp

176 lines
6.3 KiB

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* copyright (C) 2004-2006 *
* Umbrello UML Modeller Authors <uml-devel@uml.sf.net> *
***************************************************************************/
/* This code generated by:
* Author : thomas
* Date : Mon Sep 1 2003
*/
#include "cppheadercodeoperation.h"
#include "cppcodegenerator.h"
#include "cppcodegenerationpolicy.h"
#include "cppheadercodedocument.h"
#include "cppcodedocumentation.h"
#include "../uml.h"
// Constructors/Destructors
//
CPPHeaderCodeOperation::CPPHeaderCodeOperation
( CPPHeaderCodeDocument * doc, UMLOperation *parent, const TQString & body, const TQString & comment )
: CodeOperation (doc, parent, body, comment)
{
// lets not go with the default comment and instead use
// full-blown cpp documentation object instead
setComment(new CPPCodeDocumentation(doc));
// these things never change..
setOverallIndentationLevel(1);
setText("");
setStartMethodText("");
setEndMethodText("");
updateMethodDeclaration();
updateContent();
}
CPPHeaderCodeOperation::~CPPHeaderCodeOperation ( ) { }
// Other methods
//
// we basically just want to know whether or not to print out
// the body of the operation.
// In C++ if the operations are inline, then we DO print out
// the body text.
void CPPHeaderCodeOperation::updateContent( )
{
CodeGenPolicyExt *pe = UMLApp::app()->getPolicyExt();
CPPCodeGenerationPolicy * policy = dynamic_cast<CPPCodeGenerationPolicy*>(pe);
bool isInlineMethod = policy->getOperationsAreInline( );
if(isInlineMethod)
setText(""); // change whatever it is to "";
}
// we basically want to update the doc and start text of this method
void CPPHeaderCodeOperation::updateMethodDeclaration()
{
ClassifierCodeDocument *ccd = dynamic_cast<ClassifierCodeDocument*>(getParentDocument());
bool isInterface = ccd->parentIsInterface();
UMLOperation * o = getParentOperation();
CodeGenPolicyExt *pe = UMLApp::app()->getPolicyExt();
CPPCodeGenerationPolicy * policy = dynamic_cast<CPPCodeGenerationPolicy*>(pe);
bool isInlineMethod = policy->getOperationsAreInline( );
TQString endLine = getNewLineEndingChars();
// first, the comment on the operation, IF its autogenerated/empty
TQString comment = o->getDoc();
if(comment.isEmpty() && getContentType() == CodeBlock::AutoGenerated)
{
UMLAttributeList parameters = o->getParmList();
for(UMLAttributeListIt iterator(parameters); iterator.current(); ++iterator) {
comment += endLine + "@param " + iterator.current()->getName() + ' ';
comment += iterator.current()->getDoc();
}
getComment()->setText(comment);
}
// no return type for constructors
TQString methodReturnType = o->getTypeName();
TQString methodName = o->getName();
TQString paramStr = TQString("");
// assemble parameters
UMLAttributeList list = getParentOperation()->getParmList();
int nrofParam = list.count();
int paramNum = 0;
for(UMLAttribute* parm = list.first(); parm; parm=list.next())
{
TQString rType = parm->getTypeName();
TQString paramName = parm->getName();
TQString initialValue = parm->getInitialValue();
paramStr += rType + ' ' + paramName;
if(!initialValue.isEmpty())
paramStr += '=' + initialValue;
paramNum++;
if (paramNum != nrofParam )
paramStr += ", ";
}
// if an operation isn't a constructor or a destructor and it has no return type
if (o->isLifeOperation()) // constructor/destructor has no type
methodReturnType = "";
else if (methodReturnType.isEmpty()) // this operation should be 'void'
methodReturnType = TQString("void");
// set start/end method text
TQString prototype = methodReturnType+' '+methodName+" ("+paramStr+')';
TQString startText;
TQString endText;
applyStereotypes (prototype, o, isInlineMethod, isInterface, startText, endText);
setStartMethodText(prototype+startText);
setEndMethodText(endText);
}
int CPPHeaderCodeOperation::lastEditableLine() {
ClassifierCodeDocument * doc = dynamic_cast<ClassifierCodeDocument*>(getParentDocument());
UMLOperation * o = getParentOperation();
if(doc->parentIsInterface() || o->getAbstract())
return -1; // very last line is NOT editable as its a one-line declaration w/ no body in
// an interface.
return 0;
}
void CPPHeaderCodeOperation::applyStereotypes (TQString& prototype, UMLOperation * pOp,
bool inlinePolicy, bool interface,
TQString& start, TQString& end)
{
// if the class is an interface, all methods will be declared as pure
// virtual functions
start = (inlinePolicy ? " {" : ";");
end = (inlinePolicy ? "}" : "");
if (pOp->getConst())
prototype += " const";
if (interface || pOp->getAbstract()) {
// constructor can't be virtual or abstract
if (!pOp->isLifeOperation()) {
prototype = "virtual " + prototype + " = 0";
if (inlinePolicy) {
start = ";";
end = "";
}
}
} // constructors could not be declared as static
else if (pOp->getStatic() && !pOp->isLifeOperation()) {
prototype = "static " + prototype;
}
// apply the stereotypes
if (!pOp->getStereotype().isEmpty()) {
if ((pOp->getStereotype() == "friend") || (pOp->getStereotype(false) == "virtual")) {
if (!pOp->isLifeOperation() && !(interface || pOp->getAbstract()) && !pOp->getStatic())
prototype = pOp->getStereotype() + ' ' + prototype;
}
}
}
#include "cppheadercodeoperation.moc"