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.
236 lines
7.3 KiB
236 lines
7.3 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) 2002-2006 *
|
|
* Umbrello UML Modeller Authors <uml-devel@uml.sf.net> *
|
|
***************************************************************************/
|
|
|
|
// own header
|
|
#include "activitywidget.h"
|
|
|
|
// qt includes
|
|
#include <tqpainter.h>
|
|
|
|
// kde includes
|
|
#include <tdelocale.h>
|
|
#include <kdebug.h>
|
|
#include <kinputdialog.h>
|
|
|
|
// app includes
|
|
#include "uml.h"
|
|
#include "umldoc.h"
|
|
#include "docwindow.h"
|
|
#include "umlview.h"
|
|
#include "listpopupmenu.h"
|
|
#include "dialogs/activitydialog.h"
|
|
|
|
ActivityWidget::ActivityWidget(UMLView * view, ActivityType activityType, Uml::IDType id )
|
|
: UMLWidget(view, id)
|
|
{
|
|
UMLWidget::setBaseType( Uml::wt_Activity );
|
|
setActivityType( activityType );
|
|
updateComponentSize();
|
|
}
|
|
|
|
ActivityWidget::~ActivityWidget() {}
|
|
|
|
void ActivityWidget::draw(TQPainter & p, int offsetX, int offsetY) {
|
|
int w = width();
|
|
int h = height();
|
|
switch ( m_ActivityType )
|
|
{
|
|
case Normal :
|
|
UMLWidget::setPen(p);
|
|
if ( UMLWidget::getUseFillColour() ) {
|
|
p.setBrush( UMLWidget::getFillColour() );
|
|
}
|
|
{
|
|
const TQFontMetrics &fm = getFontMetrics(FT_NORMAL);
|
|
const int fontHeight = fm.lineSpacing();
|
|
//int middleX = w / 2;
|
|
int textStartY = (h / 2) - (fontHeight / 2);
|
|
p.drawRoundRect(offsetX, offsetY, w, h, (h * 60) / w, 60);
|
|
p.setPen(TQt::black);
|
|
p.setFont( UMLWidget::getFont() );
|
|
p.drawText(offsetX + ACTIVITY_MARGIN, offsetY + textStartY,
|
|
w - ACTIVITY_MARGIN * 2, fontHeight, TQt::AlignCenter, getName());
|
|
}
|
|
UMLWidget::setPen(p);
|
|
break;
|
|
case Initial :
|
|
p.setPen( TQPen(m_LineColour, 1) );
|
|
p.setBrush( WidgetBase::getLineColor() );
|
|
p.drawEllipse( offsetX, offsetY, w, h );
|
|
break;
|
|
case End :
|
|
p.setPen( TQPen(m_LineColour, 1) );
|
|
p.setBrush( WidgetBase::getLineColor() );
|
|
p.drawEllipse( offsetX, offsetY, w, h );
|
|
p.setBrush( TQt::white );
|
|
p.drawEllipse( offsetX + 1, offsetY + 1, w - 2, h - 2 );
|
|
p.setBrush( WidgetBase::getLineColor() );
|
|
p.drawEllipse( offsetX + 3, offsetY + 3, w - 6, h - 6 );
|
|
break;
|
|
case Branch :
|
|
UMLWidget::setPen(p);
|
|
p.setBrush( UMLWidget::getFillColour() );
|
|
{
|
|
TQPointArray array( 4 );
|
|
array[ 0 ] = TQPoint( offsetX + w / 2, offsetY );
|
|
array[ 1 ] = TQPoint( offsetX + w, offsetY + h / 2 );
|
|
array[ 2 ] = TQPoint( offsetX + w / 2, offsetY + h );
|
|
array[ 3 ] = TQPoint( offsetX, offsetY + h / 2 );
|
|
p.drawPolygon( array );
|
|
p.drawPolyline( array );
|
|
}
|
|
break;
|
|
}
|
|
if(m_bSelected)
|
|
drawSelected(&p, offsetX, offsetY);
|
|
}
|
|
|
|
void ActivityWidget::constrain(int& width, int& height) {
|
|
if (m_ActivityType == Normal) {
|
|
TQSize minSize = calculateSize();
|
|
if (width < minSize.width())
|
|
width = minSize.width();
|
|
if (height < minSize.height())
|
|
height = minSize.height();
|
|
return;
|
|
}
|
|
if (width > height)
|
|
width = height;
|
|
else if (height > width)
|
|
height = width;
|
|
if (m_ActivityType == Branch) {
|
|
if (width < 20) {
|
|
width = 20;
|
|
height = 20;
|
|
} else if (width > 50) {
|
|
width = 50;
|
|
height = 50;
|
|
}
|
|
} else {
|
|
if (width < 15) {
|
|
width = 15;
|
|
height = 15;
|
|
} else if (width > 30) {
|
|
width = 30;
|
|
height = 30;
|
|
}
|
|
}
|
|
}
|
|
|
|
TQSize ActivityWidget::calculateSize() {
|
|
int width, height;
|
|
if ( m_ActivityType == Normal ) {
|
|
const TQFontMetrics &fm = getFontMetrics(FT_NORMAL);
|
|
const int fontHeight = fm.lineSpacing();
|
|
const int textWidth = fm.width(getName());
|
|
height = fontHeight;
|
|
width = textWidth > ACTIVITY_WIDTH ? textWidth : ACTIVITY_WIDTH;
|
|
height = height > ACTIVITY_HEIGHT ? height : ACTIVITY_HEIGHT;
|
|
width += ACTIVITY_MARGIN * 2;
|
|
height += ACTIVITY_MARGIN * 2;
|
|
} else {
|
|
width = height = 20;
|
|
}
|
|
return TQSize(width, height);
|
|
}
|
|
|
|
ActivityWidget::ActivityType ActivityWidget::getActivityType() const {
|
|
return m_ActivityType;
|
|
}
|
|
|
|
void ActivityWidget::setActivityType( ActivityType activityType ) {
|
|
m_ActivityType = activityType;
|
|
updateComponentSize();
|
|
UMLWidget::m_bResizable = true;
|
|
}
|
|
|
|
void ActivityWidget::slotMenuSelection(int sel) {
|
|
bool done = false;
|
|
|
|
bool ok = false;
|
|
TQString name = m_Text;
|
|
|
|
switch( sel ) {
|
|
case ListPopupMenu::mt_Rename:
|
|
name = KInputDialog::getText( i18n("Enter Activity Name"), i18n("Enter the name of the new activity:"), m_Text, &ok );
|
|
if( ok && name.length() > 0 )
|
|
m_Text = name;
|
|
done = true;
|
|
break;
|
|
|
|
case ListPopupMenu::mt_Properties:
|
|
showProperties();
|
|
done = true;
|
|
break;
|
|
}
|
|
|
|
if( !done )
|
|
UMLWidget::slotMenuSelection( sel );
|
|
}
|
|
|
|
void ActivityWidget::showProperties() {
|
|
DocWindow *docwindow = UMLApp::app()->getDocWindow();
|
|
docwindow->updateDocumentation(false);
|
|
|
|
ActivityDialog dialog(m_pView, this);
|
|
if (dialog.exec() && dialog.getChangesMade()) {
|
|
docwindow->showDocumentation(this, true);
|
|
UMLApp::app()->getDocument()->setModified(true);
|
|
}
|
|
}
|
|
|
|
bool ActivityWidget::isActivity(WorkToolBar::ToolBar_Buttons tbb,
|
|
ActivityType& resultType)
|
|
{
|
|
bool status = true;
|
|
switch (tbb) {
|
|
case WorkToolBar::tbb_Initial_Activity:
|
|
resultType = Initial;
|
|
break;
|
|
case WorkToolBar::tbb_Activity:
|
|
resultType = Normal;
|
|
break;
|
|
case WorkToolBar::tbb_End_Activity:
|
|
resultType = End;
|
|
break;
|
|
case WorkToolBar::tbb_Branch:
|
|
resultType = Branch;
|
|
break;
|
|
default:
|
|
status = false;
|
|
break;
|
|
}
|
|
return status;
|
|
}
|
|
|
|
void ActivityWidget::saveToXMI( TQDomDocument & qDoc, TQDomElement & qElement ) {
|
|
TQDomElement activityElement = qDoc.createElement( "activitywidget" );
|
|
UMLWidget::saveToXMI( qDoc, activityElement );
|
|
activityElement.setAttribute( "activityname", m_Text );
|
|
activityElement.setAttribute( "documentation", m_Doc );
|
|
activityElement.setAttribute( "activitytype", m_ActivityType );
|
|
qElement.appendChild( activityElement );
|
|
}
|
|
|
|
bool ActivityWidget::loadFromXMI( TQDomElement & qElement ) {
|
|
if( !UMLWidget::loadFromXMI( qElement ) )
|
|
return false;
|
|
m_Text = qElement.attribute( "activityname", "" );
|
|
m_Doc = qElement.attribute( "documentation", "" );
|
|
TQString type = qElement.attribute( "activitytype", "1" );
|
|
setActivityType( (ActivityType)type.toInt() );
|
|
return true;
|
|
}
|
|
|
|
|
|
#include "activitywidget.moc"
|
|
|