/*************************************************************************** * * * 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 * ***************************************************************************/ // own header #include "parmpropdlg.h" // qt includes #include #include // kde includes #include #include // 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( 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( 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() {}