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/dialogs/parmpropdlg.cpp

258 lines
9.0 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) 2002-2006 *
* Umbrello UML Modeller Authors <uml-devel@uml.sf.net> *
***************************************************************************/
// own header
#include "parmpropdlg.h"
// qt includes
#include <tqlayout.h>
#include <tqtooltip.h>
// kde includes
#include <tdelocale.h>
#include <kdebug.h>
// local includes
#include "../classifier.h"
#include "../umltemplatelist.h"
#include "../template.h"
#include "../umldoc.h"
#include "../dialog_utils.h"
#include "../object_factory.h"
#include "../stereotype.h"
#include "parmpropdlg.moc"
ParmPropDlg::ParmPropDlg(TQWidget * parent, UMLDoc * doc, UMLAttribute * a)
: KDialogBase(Plain, i18n("Parameter Properties"), Help | Ok | Cancel , Ok, parent, "_PARMPROPDLG_", true, true)
{
m_pUmldoc = doc;
m_pAtt = a;
TQString type, text, name, initialValue;
if(!a) {
type = text = name = initialValue = "";
} else {
type = a -> getTypeName();
name = a -> getName();
initialValue = a -> getInitialValue();
text = a -> getDoc();
}
int margin = fontMetrics().height();
setMinimumSize(300, 400);
//disableResize();
TQVBoxLayout * topLayout = new TQVBoxLayout(plainPage());
topLayout -> setSpacing(10);
topLayout -> setMargin(margin);
m_pParmGB = new TQGroupBox(i18n("Properties"), plainPage());
topLayout -> addWidget(m_pParmGB);
TQGridLayout * propLayout = new TQGridLayout(m_pParmGB, 4, 2);
propLayout -> setSpacing(10);
propLayout -> setMargin(margin);
m_pTypeL = new TQLabel(i18n("&Type:"), m_pParmGB);
propLayout -> addWidget(m_pTypeL, 0, 0);
m_pTypeCB = new KComboBox(m_pParmGB);
propLayout -> addWidget(m_pTypeCB, 0, 1);
m_pTypeL->setBuddy(m_pTypeCB);
Dialog_Utils::makeLabeledEditField( m_pParmGB, propLayout, 1,
m_pNameL, i18n("&Name:"),
m_pNameLE, name );
Dialog_Utils::makeLabeledEditField( m_pParmGB, propLayout, 2,
m_pInitialL, i18n("&Initial value:"),
m_pInitialLE, initialValue );
m_pStereoTypeL = new TQLabel( i18n("Stereotype name:"), m_pParmGB );
propLayout -> addWidget(m_pStereoTypeL, 3, 0);
m_pStereoTypeCB = new KComboBox(true, m_pParmGB );
propLayout -> addWidget(m_pStereoTypeCB, 3, 1);
m_pKind = new TQButtonGroup(i18n("Passing Direction"), plainPage());
m_pKind->setExclusive(true);
TQToolTip::add(m_pKind, i18n("\"in\" is a readonly parameter, \"out\" is a writeonly parameter and \"inout\" is a parameter for reading and writing."));
TQHBoxLayout * kindLayout = new TQHBoxLayout( m_pKind );
kindLayout->setMargin(margin);
m_pIn = new TQRadioButton( "in", m_pKind );
kindLayout->addWidget( m_pIn );
m_pInOut = new TQRadioButton( "inout", m_pKind );
kindLayout->addWidget( m_pInOut );
m_pOut = new TQRadioButton( "out", m_pKind );
kindLayout->addWidget( m_pOut );
topLayout -> addWidget(m_pKind);
m_pDocGB = new TQGroupBox(i18n("Documentation"), plainPage());
TQHBoxLayout * docLayout = new TQHBoxLayout(m_pDocGB);
docLayout -> setMargin(margin);
m_pDoc = new TQMultiLineEdit(m_pDocGB);
///////////
m_pDoc->setWordWrap(TQMultiLineEdit::WidgetWidth);
//////////
m_pDoc -> setText(text);
docLayout -> addWidget(m_pDoc);
topLayout -> addWidget(m_pDocGB);
// Check the proper Kind radiobutton.
if (a) {
Uml::Parameter_Direction kind = a->getParmKind();
if (kind == Uml::pd_Out)
m_pOut->setChecked(true);
else if (kind == Uml::pd_InOut)
m_pInOut->setChecked(true);
else
m_pIn->setChecked(true);
} else
m_pIn->setChecked(true);
m_pTypeCB->setDuplicatesEnabled(false);//only allow one of each type in box
m_pTypeCB->setEditable(true);
m_pTypeCB->setCompletionMode( TDEGlobalSettings::CompletionPopup );
// m_pTypeCB->setAutoCompletion(false);
//add template parameters
UMLClassifier *pConcept = dynamic_cast<UMLClassifier*>( m_pAtt->parent()->parent() );
if (pConcept == NULL) {
kError() << "ParmPropDlg: grandparent of " << m_pAtt->getName()
<< " is not a UMLClassifier" << endl;
} else {
UMLTemplateList tmplParams( pConcept->getTemplateList() );
for (UMLTemplate *t = tmplParams.first(); t; t = tmplParams.next())
insertType( t->getName() );
}
//now add the Concepts
UMLClassifierList namesList( m_pUmldoc->getConcepts() );
UMLClassifier * obj;
for(obj=namesList.first(); obj!=0 ;obj=namesList.next()) {
insertType( obj->getFullyQualifiedName() );
}
//work out which one to select
int typeBoxCount = 0;
bool foundType = false;
while (typeBoxCount < m_pTypeCB->count() && foundType == false) {
TQString typeBoxString = m_pTypeCB->text(typeBoxCount);
if ( typeBoxString == type ) { //getTypeName()
foundType = true;
m_pTypeCB->setCurrentItem(typeBoxCount);
} else {
typeBoxCount++;
}
}
if (!foundType) {
insertType( type, 0 );
m_pTypeCB->setCurrentItem(0);
}
// manage stereotypes
m_pStereoTypeCB->setDuplicatesEnabled(false); //only allow one of each type in box
m_pStereoTypeCB->setCompletionMode( TDEGlobalSettings::CompletionPopup );
insertStereotype (TQString("")); // an empty stereotype is the default
int defaultStereotype=0;
bool foundDefaultStereotype = false;
for (UMLStereotypeListIt it(m_pUmldoc->getStereotypes()); it.current(); ++it) {
if (!foundDefaultStereotype) {
if ( m_pAtt->getStereotype() == it.current()->getName()) {
foundDefaultStereotype = true;
}
defaultStereotype++;
}
insertStereotype (it.current()->getName());
}
// lookup for a default stereotype, if the operation doesn't have one
if (foundDefaultStereotype)
m_pStereoTypeCB->setCurrentItem(defaultStereotype);
else
m_pStereoTypeCB->setCurrentItem(-1);
// set tab order
setTabOrder(m_pKind, m_pTypeCB);
setTabOrder(m_pTypeCB, m_pNameLE);
setTabOrder(m_pNameLE, m_pInitialLE);
setTabOrder(m_pInitialLE, m_pStereoTypeCB);
setTabOrder(m_pStereoTypeCB, m_pIn);
setTabOrder(m_pIn, m_pDoc);
m_pNameLE->setFocus();
}
void ParmPropDlg::insertType( const TQString& type, int index )
{
m_pTypeCB->insertItem( type, index );
m_pTypeCB->completionObject()->addItem( type );
}
void ParmPropDlg::insertStereotype( const TQString& type, int index )
{
m_pStereoTypeCB->insertItem( type, index );
m_pStereoTypeCB->completionObject()->addItem( type );
}
Uml::Parameter_Direction ParmPropDlg::getParmKind() {
Uml::Parameter_Direction pk = Uml::pd_In;
if (m_pOut->isChecked())
pk = Uml::pd_Out;
else if (m_pInOut->isChecked())
pk = Uml::pd_InOut;
return pk;
}
void ParmPropDlg::slotOk() {
if (m_pAtt != NULL) {
m_pAtt->setParmKind( getParmKind() );
m_pAtt->setStereotype( m_pStereoTypeCB->currentText() );
TQString typeName = m_pTypeCB->currentText();
UMLClassifier * pConcept = dynamic_cast<UMLClassifier*>( m_pAtt->parent()->parent() );
if (pConcept == NULL) {
kError() << "ParmPropDlg::slotOk: grandparent of " << m_pAtt->getName()
<< " is not a UMLClassifier" << endl;
} else {
UMLTemplate *tmplParam = pConcept->findTemplate(typeName);
if (tmplParam) {
m_pAtt->setType(tmplParam);
accept();
return;
}
}
UMLClassifierList namesList( m_pUmldoc->getConcepts() );
UMLClassifier * obj;
for (obj = namesList.first(); obj; obj = namesList.next()) {
if (obj->getFullyQualifiedName() == typeName) {
m_pAtt->setType( obj );
break;
}
}
if (obj == NULL) {
// Nothing found: Create a new type on the fly.
// @todo There should be an extra dialog to decide whether to
// create a datatype or a class. For now, we create a class.
kDebug() << "ParmPropDlg::slotOk: " << typeName << " not found."
<< " Creating a new class for the type." << endl;
UMLObject *o = Object_Factory::createUMLObject(Uml::ot_Class, typeName);
m_pAtt->setType(o);
}
}
accept();
}
ParmPropDlg::~ParmPropDlg() {}