umbrello API Documentation

floatingtextwidgetcontroller.cpp

00001 /***************************************************************************
00002  *                                                                         *
00003  *   This program is free software; you can redistribute it and/or modify  *
00004  *   it under the terms of the GNU General Public License as published by  *
00005  *   the Free Software Foundation; either version 2 of the License, or     *
00006  *   (at your option) any later version.                                   *
00007  *                                                                         *
00008  *   copyright (C) 2006                                                    *
00009  *   Umbrello UML Modeller Authors <uml-devel@uml.sf.net>                  *
00010  ***************************************************************************/
00011 
00012 // own header
00013 #include "floatingtextwidgetcontroller.h"
00014 // qt/kde includes
00015 #include <kdebug.h>
00016 // app includes
00017 #include "floatingtextwidget.h"
00018 #include "messagewidget.h"
00019 #include "objectwidget.h"
00020 
00021 FloatingTextWidgetController::FloatingTextWidgetController(FloatingTextWidget *floatingTextWidget):
00022             UMLWidgetController(floatingTextWidget) {
00023     m_floatingTextWidget = floatingTextWidget;
00024     m_unconstrainedPositionX = 0;
00025     m_unconstrainedPositionY = 0;
00026     m_movementDirectionX = 0;
00027     m_movementDirectionY = 0;
00028 }
00029 
00030 FloatingTextWidgetController::~FloatingTextWidgetController() {
00031 }
00032 
00033 void FloatingTextWidgetController::saveWidgetValues(QMouseEvent *me) {
00034     UMLWidgetController::saveWidgetValues(me);
00035 
00036     m_unconstrainedPositionX = m_widget->getX();
00037     m_unconstrainedPositionY = m_widget->getY();
00038     m_movementDirectionX = 0;
00039     m_movementDirectionY = 0;
00040 }
00041 
00042 bool FloatingTextWidgetController::isInResizeArea(QMouseEvent *me) {
00043     return false;
00044 }
00045 
00046 void FloatingTextWidgetController::moveWidgetBy(int diffX, int diffY) {
00047     if (m_floatingTextWidget->m_Role == Uml::tr_Seq_Message_Self)
00048         return;
00049 
00050     if (m_floatingTextWidget->m_Role == Uml::tr_Seq_Message
00051                     && ((MessageWidget*)m_floatingTextWidget->m_pLink)->getSelected()) {
00052         return;
00053     }
00054 
00055     m_unconstrainedPositionX += diffX;
00056     m_unconstrainedPositionY += diffY;
00057     QPoint constrainedPosition = constrainPosition(diffX, diffY);
00058 
00059     int newX = constrainedPosition.x();
00060     int newY = constrainedPosition.y();
00061 
00062     if (!m_movementDirectionX) {
00063         if (m_unconstrainedPositionX != constrainedPosition.x()) {
00064             m_movementDirectionX = (diffX > 0)? 1: -1;
00065         }
00066     } else if ((m_movementDirectionX < 0 && m_unconstrainedPositionX > m_floatingTextWidget->getX()) ||
00067                (m_movementDirectionX > 0 && m_unconstrainedPositionX < m_floatingTextWidget->getX()) ) {
00068         newX = m_unconstrainedPositionX;
00069         m_movementDirectionX = 0;
00070     }
00071 
00072     if (!m_movementDirectionY) {
00073         if (m_unconstrainedPositionY != constrainedPosition.y()) {
00074             m_movementDirectionY = (diffY > 0)? 1: -1;
00075         }
00076     } else if ((m_movementDirectionY < 0 && m_unconstrainedPositionY > m_floatingTextWidget->getY()) ||
00077                (m_movementDirectionY > 0 && m_unconstrainedPositionY < m_floatingTextWidget->getY()) ) {
00078         newY = m_unconstrainedPositionY;
00079         m_movementDirectionY = 0;
00080     }
00081 
00082     m_floatingTextWidget->setX(newX);
00083     m_floatingTextWidget->setY(newY);
00084 
00085     if (m_floatingTextWidget->m_pLink) {
00086         m_floatingTextWidget->m_pLink->calculateNameTextSegment();
00087         if (m_floatingTextWidget->m_Role == Uml::tr_Seq_Message) {
00088             MessageWidget* messageWidget = (MessageWidget*)m_floatingTextWidget->m_pLink;
00089             messageWidget->setY(newY + m_floatingTextWidget->getHeight());
00090 
00091             //TODO This should be moved to somewhere in MessageWidget, refactor with messagewidgetcontroller.cpp:44
00092             if (messageWidget->getSequenceMessageType() == Uml::sequence_message_creation) {
00093                 const int objWidgetHalfHeight = messageWidget->getWidget(Uml::B)->getHeight() / 2;
00094                 messageWidget->getWidget(Uml::B)->UMLWidget::setY(messageWidget->getY() - objWidgetHalfHeight);
00095             }
00096         }
00097     }
00098 }
00099 
00100 void FloatingTextWidgetController::constrainMovementForAllWidgets(int &diffX, int &diffY) {
00101     QPoint constrainedPosition = constrainPosition(diffX, diffY);
00102 
00103     diffX = constrainedPosition.x() - m_floatingTextWidget->getX();
00104     diffY = constrainedPosition.y() - m_floatingTextWidget->getY();
00105 }
00106 
00107 QPoint FloatingTextWidgetController::constrainPosition(int diffX, int diffY) {
00108     int newX = m_floatingTextWidget->getX() + diffX;
00109     int newY = m_floatingTextWidget->getY() + diffY;
00110 
00111     if (m_floatingTextWidget->m_pLink) {
00112         m_floatingTextWidget->m_pLink->constrainTextPos(newX, newY,
00113                     m_floatingTextWidget->width(), m_floatingTextWidget->height(),
00114                     m_floatingTextWidget->m_Role);
00115     }
00116 
00117     return QPoint(newX, newY);
00118 }
00119 
KDE Logo
This file is part of the documentation for umbrello Version 3.1.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Jun 26 08:07:57 2007 by doxygen 1.4.1 written by Dimitri van Heesch, © 1997-2003