summaryrefslogtreecommitdiffstats
path: root/umbrello/umbrello/classifierwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'umbrello/umbrello/classifierwidget.cpp')
-rw-r--r--umbrello/umbrello/classifierwidget.cpp803
1 files changed, 803 insertions, 0 deletions
diff --git a/umbrello/umbrello/classifierwidget.cpp b/umbrello/umbrello/classifierwidget.cpp
new file mode 100644
index 00000000..4d4c1eb8
--- /dev/null
+++ b/umbrello/umbrello/classifierwidget.cpp
@@ -0,0 +1,803 @@
+/***************************************************************************
+ * *
+ * 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) 2004-2007 *
+ * Umbrello UML Modeller Authors <uml-devel@uml.sf.net> *
+ ***************************************************************************/
+
+// own header
+#include "classifierwidget.h"
+// qt/kde includes
+#include <qpainter.h>
+#include <kdebug.h>
+// app includes
+#include "classifier.h"
+#include "operation.h"
+#include "template.h"
+#include "associationwidget.h"
+#include "umlview.h"
+#include "umldoc.h"
+#include "uml.h"
+#include "listpopupmenu.h"
+#include "object_factory.h"
+
+ClassifierWidget::ClassifierWidget(UMLView * view, UMLClassifier *c)
+ : UMLWidget(view, c) {
+ init();
+ if (c != NULL && c->isInterface()) {
+ WidgetBase::setBaseType(Uml::wt_Interface);
+ m_bShowStereotype = true;
+ m_bShowAttributes = false;
+ updateSigs();
+ }
+}
+
+ClassifierWidget::~ClassifierWidget() {
+ if (m_pAssocWidget)
+ m_pAssocWidget->removeAssocClassLine();
+}
+
+const int ClassifierWidget::MARGIN = 5;
+const int ClassifierWidget::CIRCLE_SIZE = 30;
+
+void ClassifierWidget::init() {
+ WidgetBase::setBaseType(Uml::wt_Class);
+
+ const Settings::OptionState& ops = m_pView->getOptionState();
+ m_bShowAccess = ops.classState.showVisibility;
+ m_bShowOperations = ops.classState.showOps;
+ m_bShowPublicOnly = false;
+ m_bShowPackage = ops.classState.showPackage;
+ m_ShowAttSigs = Uml::st_ShowSig;
+ /* setShowOpSigs( ops.classState.showOpSig );
+ Cannot do that because we get "pure virtual method called". Open code:
+ */
+ if( !ops.classState.showOpSig ) {
+ if (m_bShowAccess)
+ m_ShowOpSigs = Uml::st_NoSig;
+ else
+ m_ShowOpSigs = Uml::st_NoSigNoVis;
+
+ } else if (m_bShowAccess)
+ m_ShowOpSigs = Uml::st_ShowSig;
+ else
+ m_ShowOpSigs = Uml::st_SigNoVis;
+
+ m_bShowAttributes = ops.classState.showAtts;
+ m_bShowStereotype = ops.classState.showStereoType;
+ m_bDrawAsCircle = false;
+ m_pAssocWidget = NULL;
+ setShowAttSigs( ops.classState.showAttSig );
+}
+
+void ClassifierWidget::updateSigs() {
+ //turn on scope
+ if (m_bShowAccess) {
+ if (m_ShowOpSigs == Uml::st_NoSigNoVis) {
+ m_ShowOpSigs = Uml::st_NoSig;
+ } else if (m_ShowOpSigs == Uml::st_SigNoVis) {
+ m_ShowOpSigs = Uml::st_ShowSig;
+ }
+ } else { //turn off scope
+ if (m_ShowOpSigs == Uml::st_ShowSig) {
+ m_ShowOpSigs = Uml::st_SigNoVis;
+ } else if (m_ShowOpSigs == Uml::st_NoSig) {
+ m_ShowOpSigs = Uml::st_NoSigNoVis;
+ }
+ }
+ if (m_bShowAccess) {
+ if (m_ShowAttSigs == Uml::st_NoSigNoVis)
+ m_ShowAttSigs = Uml::st_NoSig;
+ else if (m_ShowAttSigs == Uml::st_SigNoVis)
+ m_ShowAttSigs = Uml::st_ShowSig;
+ } else {
+ if (m_ShowAttSigs == Uml::st_ShowSig)
+ m_ShowAttSigs = Uml::st_SigNoVis;
+ else if(m_ShowAttSigs == Uml::st_NoSig)
+ m_ShowAttSigs = Uml::st_NoSigNoVis;
+ }
+ updateComponentSize();
+ update();
+}
+
+void ClassifierWidget::toggleShowStereotype()
+{
+ m_bShowStereotype = !m_bShowStereotype;
+ updateSigs();
+ updateComponentSize();
+ update();
+}
+
+bool ClassifierWidget::getShowOps() const {
+ return m_bShowOperations;
+}
+
+void ClassifierWidget::setShowOps(bool _show) {
+ m_bShowOperations = _show;
+ updateSigs();
+ updateComponentSize();
+ update();
+}
+
+void ClassifierWidget::toggleShowOps() {
+ m_bShowOperations = !m_bShowOperations;
+ updateSigs();
+ updateComponentSize();
+ update();
+}
+
+bool ClassifierWidget::getShowPublicOnly() const {
+ return m_bShowPublicOnly;
+}
+
+void ClassifierWidget::setShowPublicOnly(bool _status) {
+ m_bShowPublicOnly = _status;
+ updateComponentSize();
+ update();
+}
+
+void ClassifierWidget::toggleShowPublicOnly() {
+ m_bShowPublicOnly = !m_bShowPublicOnly;
+ updateComponentSize();
+ update();
+}
+
+bool ClassifierWidget::getShowVisibility() const {
+ return m_bShowAccess;
+}
+
+void ClassifierWidget::setShowVisibility(bool _visibility) {
+ m_bShowAccess = _visibility;
+ updateSigs();
+ updateComponentSize();
+ update();
+}
+
+void ClassifierWidget::toggleShowVisibility() {
+ m_bShowAccess = !m_bShowAccess;
+ updateSigs();
+ updateComponentSize();
+ update();
+}
+
+Uml::Signature_Type ClassifierWidget::getShowOpSigs() const {
+ return m_ShowOpSigs;
+}
+
+void ClassifierWidget::setShowOpSigs(bool _status) {
+ if( !_status ) {
+ if (m_bShowAccess)
+ m_ShowOpSigs = Uml::st_NoSig;
+ else
+ m_ShowOpSigs = Uml::st_NoSigNoVis;
+ } else if (m_bShowAccess)
+ m_ShowOpSigs = Uml::st_ShowSig;
+ else
+ m_ShowOpSigs = Uml::st_SigNoVis;
+ updateComponentSize();
+ update();
+}
+
+void ClassifierWidget::toggleShowOpSigs() {
+ if (m_ShowOpSigs == Uml::st_ShowSig || m_ShowOpSigs == Uml::st_SigNoVis) {
+ if (m_bShowAccess) {
+ m_ShowOpSigs = Uml::st_NoSig;
+ } else {
+ m_ShowOpSigs = Uml::st_NoSigNoVis;
+ }
+ } else if (m_bShowAccess) {
+ m_ShowOpSigs = Uml::st_ShowSig;
+ } else {
+ m_ShowOpSigs = Uml::st_SigNoVis;
+ }
+ updateComponentSize();
+ update();
+}
+
+bool ClassifierWidget::getShowPackage() const {
+ return m_bShowPackage;
+}
+
+void ClassifierWidget::setShowPackage(bool _status) {
+ m_bShowPackage = _status;
+ updateComponentSize();
+ update();
+}
+
+void ClassifierWidget::toggleShowPackage() {
+ m_bShowPackage = !m_bShowPackage;
+ updateSigs();
+ updateComponentSize();
+ update();
+}
+
+void ClassifierWidget::setOpSignature(Uml::Signature_Type sig) {
+ m_ShowOpSigs = sig;
+ updateSigs();
+ updateComponentSize();
+ update();
+}
+
+void ClassifierWidget::setShowAtts(bool _show) {
+ m_bShowAttributes = _show;
+ updateSigs();
+
+ updateComponentSize();
+ update();
+}
+
+void ClassifierWidget::setAttSignature(Uml::Signature_Type sig) {
+ m_ShowAttSigs = sig;
+ updateSigs();
+ updateComponentSize();
+ update();
+}
+
+void ClassifierWidget::setShowAttSigs(bool _status) {
+ if( !_status ) {
+ if (m_bShowAccess)
+ m_ShowAttSigs = Uml::st_NoSig;
+ else
+ m_ShowAttSigs = Uml::st_NoSigNoVis;
+ }
+ else if (m_bShowAccess)
+ m_ShowAttSigs = Uml::st_ShowSig;
+ else
+ m_ShowAttSigs = Uml::st_SigNoVis;
+ if (UMLApp::app()->getDocument()->loading())
+ return;
+ updateComponentSize();
+ update();
+}
+
+void ClassifierWidget::toggleShowAtts()
+{
+ m_bShowAttributes = !m_bShowAttributes;
+ updateSigs();
+ updateComponentSize();
+ update();
+}
+
+void ClassifierWidget::toggleShowAttSigs()
+{
+ if (m_ShowAttSigs == Uml::st_ShowSig ||
+ m_ShowAttSigs == Uml::st_SigNoVis) {
+ if (m_bShowAccess) {
+ m_ShowAttSigs = Uml::st_NoSig;
+ } else {
+ m_ShowAttSigs = Uml::st_NoSigNoVis;
+ }
+ } else if (m_bShowAccess) {
+ m_ShowAttSigs = Uml::st_ShowSig;
+ } else {
+ m_ShowAttSigs = Uml::st_SigNoVis;
+ }
+ updateComponentSize();
+ update();
+}
+
+int ClassifierWidget::displayedMembers(Uml::Object_Type ot) {
+ int count = 0;
+ UMLClassifierListItemList list = getClassifier()->getFilteredList(ot);
+ for (UMLClassifierListItem *m = list.first(); m; m = list.next()) {
+ if (!(m_bShowPublicOnly && m->getVisibility() != Uml::Visibility::Public))
+ count++;
+ }
+ return count;
+}
+
+int ClassifierWidget::displayedOperations() {
+ if (!m_bShowOperations)
+ return 0;
+ return displayedMembers(Uml::ot_Operation);
+}
+
+QSize ClassifierWidget::calculateSize() {
+ if (!m_pObject) {
+ return UMLWidget::calculateSize();
+ }
+ if (getClassifier()->isInterface() && m_bDrawAsCircle) {
+ return calculateAsCircleSize();
+ }
+
+ const QFontMetrics &fm = getFontMetrics(UMLWidget::FT_NORMAL);
+ const int fontHeight = fm.lineSpacing();
+ // width is the width of the longest 'word'
+ int width = 0, height = 0;
+
+ // consider stereotype
+ if (m_bShowStereotype && !m_pObject->getStereotype().isEmpty()) {
+ height += fontHeight;
+ // ... width
+ const QFontMetrics &bfm = UMLWidget::getFontMetrics(UMLWidget::FT_BOLD);
+ const int stereoWidth = bfm.size(0,m_pObject->getStereotype(true)).width();
+ if (stereoWidth > width)
+ width = stereoWidth;
+ }
+
+ // consider name
+ height += fontHeight;
+ // ... width
+ QString displayedName;
+ if (m_bShowPackage)
+ displayedName = m_pObject->getFullyQualifiedName();
+ else
+ displayedName = m_pObject->getName();
+ const UMLWidget::FontType nft = (m_pObject->getAbstract() ? FT_BOLD_ITALIC : FT_BOLD);
+ //const int nameWidth = getFontMetrics(nft).boundingRect(displayName).width();
+ const int nameWidth = UMLWidget::getFontMetrics(nft).size(0,displayedName).width();
+ if (nameWidth > width)
+ width = nameWidth;
+
+ // consider attributes
+ const int numAtts = displayedAttributes();
+ if (numAtts == 0) {
+ height += fontHeight / 2; // no atts, so just add a bit of space
+ } else {
+ height += fontHeight * numAtts;
+ // calculate width of the attributes
+ UMLClassifierListItemList list = getClassifier()->getFilteredList(Uml::ot_Attribute);
+ for (UMLClassifierListItem *a = list.first(); a; a = list.next()) {
+ if (m_bShowPublicOnly && a->getVisibility() != Uml::Visibility::Public)
+ continue;
+ const int attWidth = fm.size(0,a->toString(m_ShowAttSigs)).width();
+ if (attWidth > width)
+ width = attWidth;
+ }
+ }
+
+ // consider operations
+ const int numOps = displayedOperations();
+ if (numOps == 0) {
+ height += fontHeight / 2; // no ops, so just add a bit of space
+ } else {
+ height += numOps * fontHeight;
+ // ... width
+ UMLOperationList list(getClassifier()->getOpList());
+ for (UMLOperation* op = list.first(); op; op = list.next()) {
+ if (m_bShowPublicOnly && op->getVisibility() != Uml::Visibility::Public)
+ continue;
+ const QString displayedOp = op->toString(m_ShowOpSigs);
+ UMLWidget::FontType oft;
+ oft = (op->getAbstract() ? UMLWidget::FT_ITALIC : UMLWidget::FT_NORMAL);
+ const int w = UMLWidget::getFontMetrics(oft).size(0,displayedOp).width();
+ if (w > width)
+ width = w;
+ }
+ }
+
+ // consider template box _as last_ !
+ QSize templatesBoxSize = calculateTemplatesBoxSize();
+ if (templatesBoxSize.width() != 0) {
+ // add width to largest 'word'
+ width += templatesBoxSize.width() / 2;
+ }
+ if (templatesBoxSize.height() != 0) {
+ height += templatesBoxSize.height() - MARGIN;
+ }
+
+
+ // allow for height margin
+ if (!m_bShowOperations && !m_bShowAttributes && !m_bShowStereotype) {
+ height += MARGIN * 2;
+ }
+
+ // allow for width margin
+ width += MARGIN * 2;
+
+ return QSize(width, height);
+}
+
+void ClassifierWidget::slotMenuSelection(int sel) {
+ ListPopupMenu::Menu_Type mt = (ListPopupMenu::Menu_Type)sel;
+ switch (mt) {
+ case ListPopupMenu::mt_Attribute:
+ case ListPopupMenu::mt_Operation:
+ case ListPopupMenu::mt_Template:
+ {
+ Uml::Object_Type ot = ListPopupMenu::convert_MT_OT(mt);
+ if (Object_Factory::createChildObject(getClassifier(), ot)) {
+ updateComponentSize();
+ update();
+ UMLApp::app()->getDocument()->setModified();
+ }
+ break;
+ }
+ case ListPopupMenu::mt_Show_Operations:
+ case ListPopupMenu::mt_Show_Operations_Selection:
+ toggleShowOps();
+ break;
+
+ case ListPopupMenu::mt_Show_Attributes:
+ case ListPopupMenu::mt_Show_Attributes_Selection:
+ toggleShowAtts();
+ break;
+
+ case ListPopupMenu::mt_Show_Public_Only:
+ case ListPopupMenu::mt_Show_Public_Only_Selection:
+ toggleShowPublicOnly();
+ break;
+
+ case ListPopupMenu::mt_Show_Operation_Signature:
+ case ListPopupMenu::mt_Show_Operation_Signature_Selection:
+ toggleShowOpSigs();
+ break;
+
+ case ListPopupMenu::mt_Show_Attribute_Signature:
+ case ListPopupMenu::mt_Show_Attribute_Signature_Selection:
+ toggleShowAttSigs();
+ break;
+
+ case ListPopupMenu::mt_Visibility:
+ case ListPopupMenu::mt_Visibility_Selection:
+ toggleShowVisibility();
+ break;
+
+ case ListPopupMenu::mt_Show_Packages:
+ case ListPopupMenu::mt_Show_Packages_Selection:
+ toggleShowPackage();
+ break;
+
+ case ListPopupMenu::mt_Show_Stereotypes:
+ case ListPopupMenu::mt_Show_Stereotypes_Selection:
+ toggleShowStereotype();
+ break;
+
+ case ListPopupMenu::mt_DrawAsCircle:
+ case ListPopupMenu::mt_DrawAsCircle_Selection:
+ toggleDrawAsCircle();
+ break;
+
+ case ListPopupMenu::mt_ChangeToClass:
+ case ListPopupMenu::mt_ChangeToClass_Selection:
+ changeToClass();
+ break;
+
+ case ListPopupMenu::mt_ChangeToInterface:
+ case ListPopupMenu::mt_ChangeToInterface_Selection:
+ changeToInterface();
+ break;
+
+ default:
+ UMLWidget::slotMenuSelection(sel);
+ break;
+ }
+}
+
+QSize ClassifierWidget::calculateTemplatesBoxSize() {
+ UMLTemplateList list = getClassifier()->getTemplateList();
+ int count = list.count();
+ if (count == 0) {
+ return QSize(0, 0);
+ }
+
+ int width, height;
+ height = width = 0;
+
+ QFont font = UMLWidget::getFont();
+ font.setItalic(false);
+ font.setUnderline(false);
+ font.setBold(false);
+ const QFontMetrics fm(font);
+
+ height = count * fm.lineSpacing() + (MARGIN*2);
+
+ for (UMLTemplate *t = list.first(); t; t = list.next()) {
+ int textWidth = fm.size(0, t->toString() ).width();
+ if (textWidth > width)
+ width = textWidth;
+ }
+
+ width += (MARGIN*2);
+ return QSize(width, height);
+}
+
+int ClassifierWidget::displayedAttributes() {
+ if (!m_bShowAttributes)
+ return 0;
+ return displayedMembers(Uml::ot_Attribute);
+}
+
+void ClassifierWidget::setClassAssocWidget(AssociationWidget *assocwidget) {
+ m_pAssocWidget = assocwidget;
+ UMLAssociation *umlassoc = NULL;
+ if (assocwidget)
+ umlassoc = assocwidget->getAssociation();
+ getClassifier()->setClassAssoc(umlassoc);
+}
+
+AssociationWidget *ClassifierWidget::getClassAssocWidget() {
+ return m_pAssocWidget;
+}
+
+UMLClassifier *ClassifierWidget::getClassifier() {
+ return static_cast<UMLClassifier*>(m_pObject);
+}
+
+void ClassifierWidget::draw(QPainter & p, int offsetX, int offsetY) {
+ UMLWidget::setPen(p);
+ if ( UMLWidget::getUseFillColour() )
+ p.setBrush( UMLWidget::getFillColour() );
+ else
+ p.setBrush( m_pView->viewport()->backgroundColor() );
+
+ if (getClassifier()->isInterface() && m_bDrawAsCircle) {
+ drawAsCircle(p, offsetX, offsetY);
+ return;
+ }
+
+ // Draw the bounding rectangle
+ QSize templatesBoxSize = calculateTemplatesBoxSize();
+ m_bodyOffsetY = offsetY;
+ if (templatesBoxSize.height() > 0)
+ m_bodyOffsetY += templatesBoxSize.height() - MARGIN;
+ int w = width();
+ if (templatesBoxSize.width() > 0)
+ w -= templatesBoxSize.width() / 2;
+ int h = height();
+ if (templatesBoxSize.height() > 0)
+ h -= templatesBoxSize.height() - MARGIN;
+ p.drawRect(offsetX, m_bodyOffsetY, w, h);
+
+ QFont font = UMLWidget::getFont();
+ font.setUnderline(false);
+ font.setItalic(false);
+ const QFontMetrics fm = UMLWidget::getFontMetrics(UMLWidget::FT_NORMAL);
+ const int fontHeight = fm.lineSpacing();
+
+ //If there are any templates then draw them
+ UMLTemplateList tlist = getClassifier()->getTemplateList();
+ if ( tlist.count() > 0 ) {
+ UMLWidget::setPen(p);
+ QPen pen = p.pen();
+ pen.setStyle(Qt::DotLine);
+ p.setPen(pen);
+ p.drawRect( offsetX + width() - templatesBoxSize.width(), offsetY,
+ templatesBoxSize.width(), templatesBoxSize.height() );
+ p.setPen( QPen(Qt::black) );
+ font.setBold(false);
+ p.setFont(font);
+ const int x = offsetX + width() - templatesBoxSize.width() + MARGIN;
+ int y = offsetY + MARGIN;
+ for ( UMLTemplate *t = tlist.first(); t; t = tlist.next() ) {
+ QString text = t->toString();
+ p.drawText(x, y, fm.size(0,text).width(), fontHeight, Qt::AlignVCenter, text);
+ y += fontHeight;
+ }
+ }
+
+ const int textX = offsetX + MARGIN;
+ const int textWidth = w - MARGIN * 2;
+
+ p.setPen(QPen(Qt::black));
+
+ // draw stereotype
+ font.setBold(true);
+ QString stereo = m_pObject->getStereotype();
+ /* if no stereotype is given we don't want to show the empty << >> */
+ const bool showStereotype = (m_bShowStereotype && !stereo.isEmpty());
+ const bool showNameOnly = (!m_bShowOperations && !m_bShowAttributes && !showStereotype);
+ int nameHeight = fontHeight;
+ if (showNameOnly) {
+ nameHeight = h;
+ } else if (showStereotype) {
+ p.setFont(font);
+ stereo = m_pObject->getStereotype(true);
+ p.drawText(textX, m_bodyOffsetY, textWidth, fontHeight, Qt::AlignCenter, stereo);
+ m_bodyOffsetY += fontHeight;
+ }
+
+ // draw name
+ QString name;
+ if (m_bShowPackage) {
+ name = m_pObject->getFullyQualifiedName();
+ } else {
+ name = this->getName();
+ }
+ font.setItalic( m_pObject->getAbstract() );
+ p.setFont(font);
+ p.drawText(textX, m_bodyOffsetY, textWidth, nameHeight, Qt::AlignCenter, name);
+ if (!showNameOnly) {
+ m_bodyOffsetY += fontHeight;
+ UMLWidget::setPen(p);
+ p.drawLine(offsetX, m_bodyOffsetY, offsetX + w - 1, m_bodyOffsetY);
+ p.setPen(QPen(Qt::black));
+ }
+ font.setBold(false);
+ font.setItalic(false);
+ p.setFont(font);
+
+ // draw attributes
+ const int numAtts = displayedAttributes();
+ if (m_bShowAttributes) {
+ drawMembers(p, Uml::ot_Attribute, m_ShowAttSigs, textX,
+ m_bodyOffsetY, fontHeight);
+ }
+
+ // draw dividing line between attributes and operations
+ if (!showNameOnly) {
+ if (numAtts == 0)
+ m_bodyOffsetY += fontHeight / 2; // no atts, so just add a bit of space
+ else
+ m_bodyOffsetY += fontHeight * numAtts;
+ UMLWidget::setPen(p);
+ p.drawLine(offsetX, m_bodyOffsetY, offsetX + w - 1, m_bodyOffsetY);
+ p.setPen(QPen(Qt::black));
+ }
+
+ // draw operations
+ if (m_bShowOperations) {
+ drawMembers(p, Uml::ot_Operation, m_ShowOpSigs, textX,
+ m_bodyOffsetY, fontHeight);
+ }
+
+ if (UMLWidget::m_bSelected)
+ UMLWidget::drawSelected(&p, offsetX, offsetY);
+}
+
+void ClassifierWidget::drawAsCircle(QPainter& p, int offsetX, int offsetY) {
+ int w = width();
+
+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL);
+ const int fontHeight = fm.lineSpacing();
+ QString name;
+ if ( m_bShowPackage ) {
+ name = m_pObject->getFullyQualifiedName();
+ } else {
+ name = this -> getName();
+ }
+
+ p.drawEllipse(offsetX + w/2 - CIRCLE_SIZE/2, offsetY, CIRCLE_SIZE, CIRCLE_SIZE);
+ p.setPen( QPen(Qt::black) );
+
+ QFont font = UMLWidget::getFont();
+ p.setFont(font);
+ p.drawText(offsetX, offsetY + CIRCLE_SIZE, w, fontHeight, Qt::AlignCenter, name);
+
+ if (m_bSelected) {
+ drawSelected(&p, offsetX, offsetY);
+ }
+}
+
+QSize ClassifierWidget::calculateAsCircleSize() {
+ const QFontMetrics &fm = UMLWidget::getFontMetrics(UMLWidget::FT_ITALIC_UNDERLINE);
+ const int fontHeight = fm.lineSpacing();
+
+ int height = CIRCLE_SIZE + fontHeight;
+
+ int width = CIRCLE_SIZE;
+ QString displayedName;
+ if (m_bShowPackage) {
+ displayedName = m_pObject->getFullyQualifiedName();
+ } else {
+ displayedName = m_pObject->getName();
+ }
+ const int nameWidth = fm.size(0,displayedName).width();
+ if (nameWidth > width)
+ width = nameWidth;
+ width += MARGIN * 2;
+
+ return QSize(width, height);
+}
+
+void ClassifierWidget::drawMembers(QPainter & p, Uml::Object_Type ot, Uml::Signature_Type sigType,
+ int x, int y, int fontHeight) {
+ QFont f = UMLWidget::getFont();
+ f.setBold(false);
+ UMLClassifierListItemList list = getClassifier()->getFilteredList(ot);
+ for (UMLClassifierListItem *obj = list.first(); obj; obj = list.next()) {
+ if (m_bShowPublicOnly && obj->getVisibility() != Uml::Visibility::Public)
+ continue;
+ QString text = obj->toString(sigType);
+ f.setItalic( obj->getAbstract() );
+ f.setUnderline( obj->getStatic() );
+ p.setFont( f );
+ QFontMetrics fontMetrics(f);
+ p.drawText(x, y, fontMetrics.size(0,text).width(), fontHeight, Qt::AlignVCenter, text);
+ f.setItalic(false);
+ f.setUnderline(false);
+ p.setFont(f);
+ y += fontHeight;
+ }
+}
+
+void ClassifierWidget::setDrawAsCircle(bool drawAsCircle) {
+ m_bDrawAsCircle = drawAsCircle;
+ updateComponentSize();
+ update();
+}
+
+bool ClassifierWidget::getDrawAsCircle() const {
+ return m_bDrawAsCircle;
+}
+
+void ClassifierWidget::toggleDrawAsCircle() {
+ m_bDrawAsCircle = !m_bDrawAsCircle;
+ updateSigs();
+ updateComponentSize();
+ update();
+}
+
+void ClassifierWidget::changeToClass() {
+ WidgetBase::setBaseType(Uml::wt_Class);
+ getClassifier()->setBaseType(Uml::ot_Class);
+
+ const Settings::OptionState& ops = m_pView->getOptionState();
+ m_bShowAttributes = ops.classState.showAtts;
+ m_bShowStereotype = ops.classState.showStereoType;
+
+ updateComponentSize();
+ update();
+}
+
+void ClassifierWidget::changeToInterface() {
+ WidgetBase::setBaseType(Uml::wt_Interface);
+ getClassifier()->setBaseType(Uml::ot_Interface);
+
+ m_bShowAttributes = false;
+ m_bShowStereotype = true;
+
+ updateComponentSize();
+ update();
+}
+
+void ClassifierWidget::adjustAssocs(int x, int y) {
+ UMLWidget::adjustAssocs(x, y);
+
+ if (m_pDoc->loading() || m_pAssocWidget == 0) {
+ return;
+ }
+
+ m_pAssocWidget->computeAssocClassLine();
+}
+
+void ClassifierWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) {
+ QDomElement conceptElement;
+ UMLClassifier *umlc = getClassifier();
+ if (umlc->isInterface())
+ conceptElement = qDoc.createElement("interfacewidget");
+ else
+ conceptElement = qDoc.createElement("classwidget");
+ UMLWidget::saveToXMI( qDoc, conceptElement );
+ conceptElement.setAttribute( "showoperations", m_bShowOperations );
+ conceptElement.setAttribute( "showpubliconly", m_bShowPublicOnly );
+ conceptElement.setAttribute( "showopsigs", m_ShowOpSigs );
+ conceptElement.setAttribute( "showpackage", m_bShowPackage );
+ conceptElement.setAttribute( "showscope", m_bShowAccess );
+ if (! umlc->isInterface()) {
+ conceptElement.setAttribute("showattributes", m_bShowAttributes);
+ conceptElement.setAttribute("showattsigs", m_ShowAttSigs);
+ }
+ if (umlc->isInterface() || umlc->getAbstract())
+ conceptElement.setAttribute("drawascircle", m_bDrawAsCircle);
+ qElement.appendChild( conceptElement );
+}
+
+bool ClassifierWidget::loadFromXMI(QDomElement & qElement) {
+ if (!UMLWidget::loadFromXMI(qElement))
+ return false;
+ QString showatts = qElement.attribute( "showattributes", "0" );
+ QString showops = qElement.attribute( "showoperations", "1" );
+ QString showpubliconly = qElement.attribute( "showpubliconly", "0" );
+ QString showattsigs = qElement.attribute( "showattsigs", "600" );
+ QString showopsigs = qElement.attribute( "showopsigs", "600" );
+ QString showpackage = qElement.attribute( "showpackage", "0" );
+ QString showscope = qElement.attribute( "showscope", "0" );
+ QString drawascircle = qElement.attribute("drawascircle", "0");
+
+ m_bShowAttributes = (bool)showatts.toInt();
+ m_bShowOperations = (bool)showops.toInt();
+ m_bShowPublicOnly = (bool)showpubliconly.toInt();
+ m_ShowAttSigs = (Uml::Signature_Type)showattsigs.toInt();
+ m_ShowOpSigs = (Uml::Signature_Type)showopsigs.toInt();
+ m_bShowPackage = (bool)showpackage.toInt();
+ m_bShowAccess = (bool)showscope.toInt();
+ m_bDrawAsCircle = (bool)drawascircle.toInt();
+
+ return true;
+}
+