summaryrefslogtreecommitdiffstats
path: root/umbrello/umbrello/entitywidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'umbrello/umbrello/entitywidget.cpp')
-rw-r--r--umbrello/umbrello/entitywidget.cpp203
1 files changed, 203 insertions, 0 deletions
diff --git a/umbrello/umbrello/entitywidget.cpp b/umbrello/umbrello/entitywidget.cpp
new file mode 100644
index 00000000..942de360
--- /dev/null
+++ b/umbrello/umbrello/entitywidget.cpp
@@ -0,0 +1,203 @@
+/***************************************************************************
+ * *
+ * 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) 2003-2007 *
+ * Umbrello UML Modeller Authors <uml-devel@uml.sf.net> *
+ ***************************************************************************/
+
+// own header
+#include "entitywidget.h"
+
+// qt/kde includes
+#include <qpainter.h>
+#include <kdebug.h>
+
+// app includes
+#include "entity.h"
+#include "entityattribute.h"
+#include "classifier.h"
+#include "umlclassifierlistitemlist.h"
+#include "classifierlistitem.h"
+#include "umlview.h"
+#include "umldoc.h"
+#include "uml.h"
+#include "listpopupmenu.h"
+#include "object_factory.h"
+
+
+EntityWidget::EntityWidget(UMLView* view, UMLObject* o): UMLWidget(view, o) {
+ init();
+}
+
+void EntityWidget::init() {
+ UMLWidget::setBaseType(Uml::wt_Entity);
+ setSize(100, 30);
+ //set defaults from m_pView
+ if (m_pView) {
+ //check to see if correct
+ const Settings::OptionState& ops = m_pView->getOptionState();
+ }
+ if (! UMLApp::app()->getDocument()->loading())
+ updateComponentSize();
+}
+
+EntityWidget::~EntityWidget() {}
+
+void EntityWidget::draw(QPainter& p, int offsetX, int offsetY) {
+ UMLWidget::setPen(p);
+ if(UMLWidget::getUseFillColour())
+ p.setBrush(UMLWidget::getFillColour());
+ else
+ p.setBrush(m_pView -> viewport() -> backgroundColor());
+
+ const int w = width();
+ const int h = height();
+
+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL);
+ int fontHeight = fm.lineSpacing();
+ const QString name = this->getName();
+
+ p.drawRect(offsetX, offsetY, w, h);
+ p.setPen(QPen(Qt::black));
+
+ QFont font = UMLWidget::getFont();
+ font.setBold(true);
+ p.setFont(font);
+ int y = 0;
+ if ( !m_pObject->getStereotype().isEmpty() ) {
+ p.drawText(offsetX + ENTITY_MARGIN, offsetY,
+ w - ENTITY_MARGIN * 2,fontHeight,
+ Qt::AlignCenter, m_pObject->getStereotype(true));
+ font.setItalic( m_pObject -> getAbstract() );
+ p.setFont(font);
+ p.drawText(offsetX + ENTITY_MARGIN, offsetY + fontHeight,
+ w - ENTITY_MARGIN * 2, fontHeight, Qt::AlignCenter, name);
+ font.setBold(false);
+ font.setItalic(false);
+ p.setFont(font);
+ y = fontHeight * 2;
+ } else {
+ font.setItalic( m_pObject -> getAbstract() );
+ p.setFont(font);
+ p.drawText(offsetX + ENTITY_MARGIN, offsetY,
+ w - ENTITY_MARGIN * 2, fontHeight, Qt::AlignCenter, name);
+ font.setBold(false);
+ font.setItalic(false);
+ p.setFont(font);
+
+ y = fontHeight;
+ }
+
+ UMLWidget::setPen(p);
+
+ p.drawLine(offsetX, offsetY + y, offsetX + w - 1, offsetY + y);
+
+ QFontMetrics fontMetrics(font);
+ UMLClassifier *classifier = (UMLClassifier*)m_pObject;
+ UMLClassifierListItem* entityattribute = 0;
+ UMLClassifierListItemList list = classifier->getFilteredList(Uml::ot_EntityAttribute);
+ for (entityattribute = list.first(); entityattribute; entityattribute = list.next()) {
+ QString text = entityattribute->getName();
+ p.setPen( QPen(Qt::black) );
+ UMLEntityAttribute* casted = dynamic_cast<UMLEntityAttribute*>( entityattribute );
+ if( casted && casted->getIndexType() == Uml::Primary )
+ {
+ font.setUnderline( true );
+ p.setFont( font );
+ font.setUnderline( false );
+ }
+ p.drawText(offsetX + ENTITY_MARGIN, offsetY + y,
+ fontMetrics.width(text), fontHeight, Qt::AlignVCenter, text);
+ p.setFont( font );
+ y+=fontHeight;
+ }
+
+ if (m_bSelected) {
+ drawSelected(&p, offsetX, offsetY);
+ }
+}
+
+QSize EntityWidget::calculateSize() {
+ if (!m_pObject) {
+ return UMLWidget::calculateSize();
+ }
+
+ int width, height;
+ QFont font = UMLWidget::getFont();
+ font.setItalic(false);
+ font.setUnderline(false);
+ font.setBold(false);
+ const QFontMetrics fm(font);
+
+ const int fontHeight = fm.lineSpacing();
+
+ int lines = 1;//always have one line - for name
+ if ( !m_pObject->getStereotype().isEmpty() ) {
+ lines++;
+ }
+
+ const int numberOfEntityAttributes = ((UMLEntity*)m_pObject)->entityAttributes();
+
+ height = width = 0;
+ //set the height of the entity
+
+ lines += numberOfEntityAttributes;
+ if (numberOfEntityAttributes == 0) {
+ height += fontHeight / 2; //no entity literals, so just add a bit of space
+ }
+
+ height += lines * fontHeight;
+
+ //now set the width of the concept
+ //set width to name to start with
+ // FIXME spaces to get round beastie with font width,
+ // investigate UMLWidget::getFontMetrics()
+ width = getFontMetrics(FT_BOLD_ITALIC).boundingRect(' ' + getName() + ' ').width();
+
+ const int w = getFontMetrics(FT_BOLD).boundingRect(m_pObject->getStereotype(true)).width();
+
+ width = w > width?w:width;
+
+ UMLClassifier* classifier = (UMLClassifier*)m_pObject;
+ UMLClassifierListItemList list = classifier->getFilteredList(Uml::ot_EntityAttribute);
+ UMLClassifierListItem* listItem = 0;
+ for (listItem = list.first(); listItem; listItem = list.next()) {
+ int w = fm.width( listItem->getName() );
+ width = w > width?w:width;
+ }
+
+ //allow for width margin
+ width += ENTITY_MARGIN * 2;
+
+ return QSize(width, height);
+}
+
+void EntityWidget::slotMenuSelection(int sel) {
+ switch(sel) {
+ case ListPopupMenu::mt_EntityAttribute:
+ if (Object_Factory::createChildObject(static_cast<UMLClassifier*>(m_pObject),
+ Uml::ot_EntityAttribute) ) {
+ UMLApp::app()->getDocument()->setModified();
+ }
+ break;
+ }
+ UMLWidget::slotMenuSelection(sel);
+}
+
+void EntityWidget::saveToXMI( QDomDocument& qDoc, QDomElement& qElement ) {
+ QDomElement conceptElement = qDoc.createElement("entitywidget");
+ UMLWidget::saveToXMI(qDoc, conceptElement);
+ qElement.appendChild(conceptElement);
+}
+
+bool EntityWidget::loadFromXMI( QDomElement & qElement ) {
+ if ( !UMLWidget::loadFromXMI(qElement) ) {
+ return false;
+ }
+ return true;
+}
+