
/***************************************************************************
 *                                                                         *
 *   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.                                   *
 *                                                                         *
 ***************************************************************************/

/*  This code generated by: 
 *      Author : thomas
 *      Date   : Mon Sep 1 2003
 */


#include <kdebug.h>
#include <qregexp.h>

#include "cppcodeclassfield.h"
#include "cppcodegenerationpolicy.h"

#include "../codegenerator.h"
#include "../classifiercodedocument.h"
#include "../attribute.h"
#include "../umlobject.h"
#include "../umlrole.h"

// #include "cppclassifiercodedocument.h"

// Constructors/Destructors
//  

CPPCodeClassField::CPPCodeClassField (ClassifierCodeDocument * parentDoc, UMLRole * role) 
    : CodeClassField((ClassifierCodeDocument*)parentDoc, role) 
{

}

CPPCodeClassField::CPPCodeClassField (ClassifierCodeDocument * parentDoc, UMLAttribute * attrib) 
    : CodeClassField((ClassifierCodeDocument*)parentDoc, attrib) 
{

}

CPPCodeClassField::~CPPCodeClassField ( ) { }

//  
// Methods
//  

// Other methods
//  

// IF the type is "string" we need to declare it as
// the CPP Object "String" (there is no string primative in CPP).
// Same thing again for "bool" to "boolean"
QString CPPCodeClassField::fixTypeName(QString string)
{
// FIX!!
        string.replace(QRegExp("^[Ll]ist$"),"QPtrList");
        string.replace(QRegExp("^string$"),"QString");
        string.replace(QRegExp("^bool$"),"bool");
        return cleanName(string);
}

QString CPPCodeClassField::getFieldName() {
        if (parentIsAttribute()) 
	{
		UMLAttribute * at = (UMLAttribute*) getParentObject();
		return cleanName(at->getName());
	} 
	else
	{
		UMLRole * role = (UMLRole*) getParentObject();
		QString roleName = role->getName();
		if(fieldIsSingleValue()) {
			return roleName.replace(0, 1, roleName.left(1).lower());
		} else { 
			return roleName.lower() + "Vector";
		}
	}
}

QString CPPCodeClassField::getListFieldClassName () {
	CodeGenerator * gen = getParentDocument()->getParentGenerator(); 
	CPPCodeGenerationPolicy *policy = (CPPCodeGenerationPolicy*) gen->getPolicy();
	return policy->getVectorClassName();
}

QString CPPCodeClassField::getInitialValue() {

        if (parentIsAttribute()) 
	{
		UMLAttribute * at = (UMLAttribute*) getParentObject();
                return fixInitialStringDeclValue(at->getInitialValue(), getTypeName());
        } 
	else 
	{
		if(fieldIsSingleValue()) {
// FIX : IF the multiplicity is "1" then we should init a new object here, if its 0 or 1,
//       then we can just return 'empty' string (minor problem).
			return "";
		} else {
			return " new "+getListFieldClassName()+"( )";
		}
        }

}


#include "cppcodeclassfield.moc"
