/***************************************************************************
* *
* 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 ( ) { }