summaryrefslogtreecommitdiffstats
path: root/umbrello/umbrello/dialogs/umlentityattributedialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'umbrello/umbrello/dialogs/umlentityattributedialog.cpp')
-rw-r--r--umbrello/umbrello/dialogs/umlentityattributedialog.cpp262
1 files changed, 262 insertions, 0 deletions
diff --git a/umbrello/umbrello/dialogs/umlentityattributedialog.cpp b/umbrello/umbrello/dialogs/umlentityattributedialog.cpp
new file mode 100644
index 00000000..ef6a5791
--- /dev/null
+++ b/umbrello/umbrello/dialogs/umlentityattributedialog.cpp
@@ -0,0 +1,262 @@
+/***************************************************************************
+ * *
+ * 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-2007 *
+ * Umbrello UML Modeller Authors <uml-devel@uml.sf.net> *
+ ***************************************************************************/
+
+// own header
+#include "umlentityattributedialog.h"
+
+// qt includes
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qcheckbox.h>
+#include <qgroupbox.h>
+#include <qbuttongroup.h>
+#include <qradiobutton.h>
+#include <qlabel.h>
+
+// kde includes
+#include <kcombobox.h>
+#include <kcompletion.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kapplication.h>
+#include <kdebug.h>
+
+// app includes
+#include "../entityattribute.h"
+#include "../classifier.h"
+#include "../umldoc.h"
+#include "../uml.h"
+#include "../codegenerator.h"
+#include "../dialog_utils.h"
+#include "../object_factory.h"
+#include "../umlclassifierlist.h"
+
+UMLEntityAttributeDialog::UMLEntityAttributeDialog( QWidget * pParent, UMLEntityAttribute * pEntityAttribute )
+ : KDialogBase( Plain, i18n("Entity Attribute Properties"), Help | Ok | Cancel , Ok, pParent, "_UMLENTITYATTRIBUTEDLG_", true, true) {
+ m_pEntityAttribute = pEntityAttribute;
+ setupDialog();
+}
+
+UMLEntityAttributeDialog::~UMLEntityAttributeDialog() {}
+
+void UMLEntityAttributeDialog::setupDialog() {
+ UMLDoc * pDoc = UMLApp::app()->getDocument();
+ int margin = fontMetrics().height();
+
+ QVBoxLayout * mainLayout = new QVBoxLayout( plainPage() );
+
+ m_pValuesGB = new QGroupBox(i18n("General Properties"), plainPage() );
+ QGridLayout * valuesLayout = new QGridLayout(m_pValuesGB, 5, 2);
+ valuesLayout -> setMargin(margin);
+ valuesLayout -> setSpacing(10);
+
+ m_pTypeL = new QLabel(i18n("&Type:"), m_pValuesGB);
+ valuesLayout -> addWidget(m_pTypeL, 0, 0);
+
+ m_pTypeCB = new KComboBox(true, m_pValuesGB);
+ valuesLayout -> addWidget(m_pTypeCB, 0, 1);
+ m_pTypeL->setBuddy(m_pTypeCB);
+
+ Dialog_Utils::makeLabeledEditField( m_pValuesGB, valuesLayout, 1,
+ m_pNameL, i18n("&Name:"),
+ m_pNameLE, m_pEntityAttribute->getName() );
+
+ Dialog_Utils::makeLabeledEditField( m_pValuesGB, valuesLayout, 2,
+ m_pInitialL, i18n("&Default value:"),
+ m_pInitialLE, m_pEntityAttribute->getInitialValue() );
+
+ Dialog_Utils::makeLabeledEditField( m_pValuesGB, valuesLayout, 3,
+ m_pStereoTypeL, i18n("Stereotype name:"),
+ m_pStereoTypeLE, m_pEntityAttribute->getStereotype() );
+
+ Dialog_Utils::makeLabeledEditField( m_pValuesGB, valuesLayout, 4,
+ m_pValuesL, i18n("Length/Values:"),
+ m_pValuesLE, m_pEntityAttribute->getValues() );
+
+ m_pAutoIncrementCB = new QCheckBox( i18n("&Auto increment"), m_pValuesGB );
+ m_pAutoIncrementCB->setChecked( m_pEntityAttribute->getAutoIncrement() );
+ valuesLayout->addWidget(m_pAutoIncrementCB, 5, 0);
+
+ m_pNullCB = new QCheckBox( i18n("Allow &null"), m_pValuesGB );
+ m_pNullCB->setChecked( m_pEntityAttribute->getNull() );
+ valuesLayout->addWidget(m_pNullCB, 6, 0);
+
+ m_pAttributesL = new QLabel(i18n("Attributes:"), m_pValuesGB);
+ valuesLayout->addWidget(m_pAttributesL, 7, 0);
+
+ m_pAttributesCB = new KComboBox(true, m_pValuesGB);
+ m_pAttributesCB->setCompletionMode( KGlobalSettings::CompletionPopup );
+ valuesLayout->addWidget(m_pAttributesCB, 7, 1);
+ m_pTypeL->setBuddy(m_pAttributesCB);
+
+ insertAttribute( m_pEntityAttribute->getAttributes() );
+ insertAttribute("");
+ insertAttribute("binary");
+ insertAttribute("unsigned");
+ insertAttribute("unsigned zerofill");
+
+ mainLayout -> addWidget(m_pValuesGB);
+
+ m_pScopeBG = new QButtonGroup(i18n("Indexing"), plainPage() );
+ QHBoxLayout* scopeLayout = new QHBoxLayout(m_pScopeBG);
+ scopeLayout->setMargin(margin);
+
+ m_pNoneRB = new QRadioButton(i18n("&None"), m_pScopeBG);
+ scopeLayout->addWidget(m_pNoneRB);
+
+ m_pPublicRB = new QRadioButton(i18n("&Primary"), m_pScopeBG);
+ scopeLayout->addWidget(m_pPublicRB);
+
+ m_pPrivateRB = new QRadioButton(i18n("&Index"), m_pScopeBG);
+ scopeLayout->addWidget(m_pPrivateRB);
+
+ m_pProtectedRB = new QRadioButton(i18n("&Unique"), m_pScopeBG);
+ scopeLayout->addWidget(m_pProtectedRB);
+
+ mainLayout->addWidget(m_pScopeBG);
+ Uml::DBIndex_Type scope = m_pEntityAttribute->getIndexType();
+ if ( scope == Uml::Primary )
+ m_pPublicRB->setChecked( true );
+ else if( scope == Uml::Index )
+ m_pPrivateRB -> setChecked( true );
+ else if( scope == Uml::Unique )
+ m_pProtectedRB -> setChecked( true );
+ else {
+ m_pNoneRB->setChecked(true);
+ }
+
+ m_pTypeCB->setDuplicatesEnabled(false);//only allow one of each type in box
+ m_pTypeCB->setCompletionMode( KGlobalSettings::CompletionPopup );
+
+ // Add the data types.
+ UMLClassifierList dataTypes = pDoc->getDatatypes();
+ if (dataTypes.count() == 0) {
+ // Switch to SQL as the active language if no datatypes are set.
+ UMLApp::app()->setActiveLanguage("SQL");
+ pDoc->addDefaultDatatypes();
+ kapp->processEvents();
+ dataTypes = pDoc->getDatatypes();
+ }
+ UMLClassifier *dat;
+ for (UMLClassifierListIt dit(dataTypes); (dat = dit.current()) != NULL; ++dit) {
+ insertType(dat->getName());
+ }
+
+ //work out which one to select
+ int typeBoxCount = 0;
+ bool foundType = false;
+ while (typeBoxCount < m_pTypeCB->count() && foundType == false) {
+ QString typeBoxString = m_pTypeCB->text(typeBoxCount);
+ if ( typeBoxString == m_pEntityAttribute->getTypeName() ) {
+ foundType = true;
+ m_pTypeCB->setCurrentItem(typeBoxCount);
+ } else {
+ typeBoxCount++;
+ }
+ }
+
+ if (!foundType) {
+ insertType( m_pEntityAttribute->getTypeName(), 0 );
+ m_pTypeCB->setCurrentItem(0);
+ }
+
+ m_pNameLE->setFocus();
+ connect( m_pNameLE, SIGNAL( textChanged ( const QString & ) ), SLOT( slotNameChanged( const QString & ) ) );
+ slotNameChanged(m_pNameLE->text() );
+}
+
+void UMLEntityAttributeDialog::slotNameChanged( const QString &_text )
+{
+ enableButtonOK( !_text.isEmpty() );
+}
+
+bool UMLEntityAttributeDialog::apply() {
+ QString name = m_pNameLE->text();
+ if (name.isEmpty()) {
+ KMessageBox::error(this, i18n("You have entered an invalid entity attribute name."),
+ i18n("Entity Attribute Name Invalid"), false);
+ m_pNameLE->setText( m_pEntityAttribute->getName() );
+ return false;
+ }
+ UMLClassifier * pConcept = dynamic_cast<UMLClassifier *>( m_pEntityAttribute->parent() );
+ UMLObject *o = pConcept->findChildObject(name);
+ if (o && o != m_pEntityAttribute) {
+ KMessageBox::error(this, i18n("The entity attribute name you have chosen is already being used in this operation."),
+ i18n("Entity Attribute Name Not Unique"), false);
+ m_pNameLE->setText( m_pEntityAttribute->getName() );
+ return false;
+ }
+ m_pEntityAttribute->setName(name);
+ m_pEntityAttribute->setInitialValue( m_pInitialLE->text() );
+ m_pEntityAttribute->setStereotype( m_pStereoTypeLE->text() );
+ m_pEntityAttribute->setValues( m_pValuesLE->text() );
+ m_pEntityAttribute->setAttributes( m_pAttributesCB->currentText() );
+ m_pEntityAttribute->setAutoIncrement( m_pAutoIncrementCB->isChecked() );
+ m_pEntityAttribute->setNull( m_pNullCB->isChecked() );
+
+ if ( m_pPublicRB->isChecked() ) {
+ m_pEntityAttribute->setIndexType(Uml::Primary);
+ } else if ( m_pPrivateRB -> isChecked() ) {
+ m_pEntityAttribute->setIndexType(Uml::Index);
+ } else if ( m_pProtectedRB -> isChecked() ) {
+ m_pEntityAttribute->setIndexType(Uml::Unique);
+ } else {
+ m_pEntityAttribute->setIndexType(Uml::None);
+ }
+
+ QString typeName = m_pTypeCB->currentText();
+ UMLDoc *pDoc = UMLApp::app()->getDocument();
+ UMLClassifierList dataTypes = pDoc->getDatatypes();
+ UMLClassifier *dat;
+ for (UMLClassifierListIt dit(dataTypes); (dat = dit.current()) != NULL; ++dit) {
+ if (typeName == dat->getName()) {
+ m_pEntityAttribute->setType(dat);
+ return true;
+ }
+ }
+ UMLObject *obj = pDoc->findUMLObject(typeName);
+ UMLClassifier *classifier = dynamic_cast<UMLClassifier*>(obj);
+ if (classifier == NULL) {
+ // If it's obviously a pointer type (C++) then create a datatype.
+ // Else we don't know what it is so as a compromise create a class.
+ Uml::Object_Type ot = (typeName.contains('*') ? Uml::ot_Datatype
+ : Uml::ot_Class);
+ obj = Object_Factory::createUMLObject(ot, typeName);
+ if (obj == NULL)
+ return false;
+ classifier = static_cast<UMLClassifier*>(obj);
+ }
+ m_pEntityAttribute->setType( classifier );
+ return true;
+}
+
+void UMLEntityAttributeDialog::slotApply() {
+ apply();
+}
+
+void UMLEntityAttributeDialog::slotOk() {
+ if ( apply() ) {
+ accept();
+ }
+}
+
+void UMLEntityAttributeDialog::insertType( const QString& type, int index ) {
+ m_pTypeCB->insertItem( type, index );
+ m_pTypeCB->completionObject()->addItem( type );
+}
+
+void UMLEntityAttributeDialog::insertAttribute( const QString& type, int index ) {
+ m_pAttributesCB->insertItem( type, index );
+ m_pAttributesCB->completionObject()->addItem( type );
+}
+
+
+#include "umlentityattributedialog.moc"