You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdesdk/umbrello/umbrello/componentwidget.cpp

142 lines
4.5 KiB

/***************************************************************************
* *
* 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 "componentwidget.h"
// qt/kde includes
#include <tqpainter.h>
// app includes
#include <kdebug.h>
#include "component.h"
#include "umlview.h"
ComponentWidget::ComponentWidget(UMLView * view, UMLComponent *c)
: UMLWidget(view, c) {
init();
}
void ComponentWidget::init() {
UMLWidget::setBaseType(Uml::wt_Component);
setSize(100, 30);
m_pMenu = 0;
//set defaults from m_pView
if (m_pView) {
//check to see if correct
const Settings::OptionState& ops = m_pView->getOptionState();
m_bShowStereotype = ops.classState.showStereoType;
}
//maybe loading and this may not be set.
if (m_pObject) {
updateComponentSize();
update();
}
}
ComponentWidget::~ComponentWidget() {}
void ComponentWidget::draw(TQPainter & p, int offsetX, int offsetY) {
UMLComponent *umlcomp = static_cast<UMLComponent*>(m_pObject);
if (umlcomp == NULL)
return;
UMLWidget::setPen(p);
if ( umlcomp->getExecutable() ) {
TQPen thickerPen = p.pen();
thickerPen.setWidth(2);
p.setPen(thickerPen);
}
if ( UMLWidget::getUseFillColour() ) {
p.setBrush( UMLWidget::getFillColour() );
} else {
p.setBrush( m_pView->viewport()->backgroundColor() );
}
const int w = width();
const int h = height();
TQFont font = UMLWidget::getFont();
font.setBold(true);
const TQFontMetrics &fm = getFontMetrics(FT_BOLD);
const int fontHeight = fm.lineSpacing();
TQString name = getName();
const TQString stereotype = m_pObject->getStereotype();
p.drawRect(offsetX + 2*COMPONENT_MARGIN, offsetY, w - 2*COMPONENT_MARGIN, h);
p.drawRect(offsetX, offsetY + h/2 - fontHeight/2 - fontHeight, COMPONENT_MARGIN*4, fontHeight);
p.drawRect(offsetX, offsetY + h/2 + fontHeight/2, COMPONENT_MARGIN*4, fontHeight);
p.setPen( TQPen(TQt::black) );
p.setFont(font);
int lines = 1;
if (!stereotype.isEmpty()) {
p.drawText(offsetX + (COMPONENT_MARGIN*4), offsetY + (h/2) - fontHeight,
w - (COMPONENT_MARGIN*4), fontHeight, TQt::AlignCenter,
m_pObject->getStereotype(true));
lines = 2;
}
if ( UMLWidget::getIsInstance() ) {
font.setUnderline(true);
p.setFont(font);
name = UMLWidget::getInstanceName() + " : " + name;
}
if (lines == 1) {
p.drawText(offsetX + (COMPONENT_MARGIN*4), offsetY + (h/2) - (fontHeight/2),
w - (COMPONENT_MARGIN*4), fontHeight, TQt::AlignCenter, name );
} else {
p.drawText(offsetX + (COMPONENT_MARGIN*4), offsetY + (h/2),
w - (COMPONENT_MARGIN*4), fontHeight, TQt::AlignCenter, name );
}
if(m_bSelected) {
drawSelected(&p, offsetX, offsetY);
}
}
TQSize ComponentWidget::calculateSize() {
if ( !m_pObject) {
return TQSize(70, 70);
}
const TQFontMetrics &fm = getFontMetrics(FT_BOLD_ITALIC);
const int fontHeight = fm.lineSpacing();
TQString name = m_pObject->getName();
if ( UMLWidget::getIsInstance() ) {
name = UMLWidget::getInstanceName() + " : " + name;
}
int width = fm.width(name);
int stereoWidth = 0;
if (!m_pObject->getStereotype().isEmpty()) {
stereoWidth = fm.width(m_pObject->getStereotype(true));
}
if (stereoWidth > width)
width = stereoWidth;
width += COMPONENT_MARGIN * 6;
width = 70>width ? 70 : width; //minumin width of 70
int height = (2*fontHeight) + (COMPONENT_MARGIN * 3);
return TQSize(width, height);
}
void ComponentWidget::saveToXMI(TQDomDocument& qDoc, TQDomElement& qElement) {
TQDomElement conceptElement = qDoc.createElement("componentwidget");
UMLWidget::saveToXMI(qDoc, conceptElement);
qElement.appendChild(conceptElement);
}