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.
koffice/karbon/vtool.cc

280 lines
5.7 KiB

/* This file is part of the KDE project
Copyright (C) 2001, 2002, 2003 The Karbon Developers
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include <qevent.h>
#include <qlabel.h>
#include <kdebug.h>
#include <kiconloader.h>
#include "karbon_view.h"
#include "karbon_part.h"
#include "vtoolcontroller.h"
#include "KoContextCelp.h"
#include "vtool.h"
#include "vtool.moc"
VTool::VTool( KarbonView *view, const char *name ) : QObject( 0, name ), m_view( view )
{
m_mouseButtonIsDown = false;
m_isDragging = false;
m_shiftPressed = false;
m_ctrlPressed = false;
m_altPressed = false;
m_action = 0;
}
VTool::~VTool()
{
if (toolController())
toolController()->unregisterTool( this );
delete m_action;
//kdDebug(38000) << "Deleting : " << name().latin1() << endl;
}
void
VTool::registerTool( VTool *tool )
{
toolController()->registerTool( tool );
}
VToolController *
VTool::toolController() const
{
return m_view->toolController();
}
KarbonView *
VTool::view() const
{
return m_view;
}
bool
VTool::mouseEvent( QMouseEvent* mouseEvent, const KoPoint &canvasCoordinate )
{
if( !view() || !view()->part() || !view()->part()->isReadWrite() )
return false;
m_lastPoint.setX( canvasCoordinate.x() );
m_lastPoint.setY( canvasCoordinate.y() );
setCursor();
m_altPressed = mouseEvent->state() & Qt::AltButton;
m_shiftPressed = mouseEvent->state() & Qt::ShiftButton;
m_ctrlPressed = mouseEvent->state() & Qt::ControlButton;
// Mouse events:
if( mouseEvent->type() == QEvent::MouseButtonDblClick )
{
mouseButtonDblClick();
return true;
}
if( mouseEvent->type() == QEvent::MouseButtonPress )
{
m_firstPoint.setX( canvasCoordinate.x() );
m_firstPoint.setY( canvasCoordinate.y() );
if( mouseEvent->button() == QEvent::RightButton )
rightMouseButtonPress();
else
mouseButtonPress();
m_mouseButtonIsDown = true;
return true;
}
if( mouseEvent->type() == QEvent::MouseMove )
{
//setCursor();
if( m_mouseButtonIsDown )
{
mouseDrag();
m_isDragging = true;
}
else
mouseMove();
return true;
}
if( mouseEvent->type() == QEvent::MouseButtonRelease )
{
if( m_isDragging )
{
mouseDragRelease();
m_isDragging = false;
}
else if( m_mouseButtonIsDown ) // False if canceled.
if( mouseEvent->button() == QEvent::RightButton )
rightMouseButtonRelease();
else
mouseButtonRelease();
m_mouseButtonIsDown = false;
return true;
}
return false;
}
bool
VTool::keyEvent( QEvent* event )
{
// Key press events.
if( event->type() == QEvent::KeyPress )
{
QKeyEvent* keyEvent = static_cast<QKeyEvent*>( event );
// Terminate the current drawing with the Enter-key:
if(
( keyEvent->key() == Qt::Key_Enter ||
keyEvent->key() == Qt::Key_Return )
&& !m_isDragging )
{
accept();
return true;
}
// Terminate the current drawing with the Enter-key:
if( keyEvent->key() == Qt::Key_Backspace && !m_isDragging )
{
cancelStep();
return true;
}
// Cancel dragging with ESC-key:
if( keyEvent->key() == Qt::Key_Escape )
{
cancel();
m_isDragging = false;
m_mouseButtonIsDown = false;
return true;
}
// If SHIFT is pressed, some tools create a "square" object while dragging:
if( keyEvent->key() == Qt::Key_Shift )
{
m_shiftPressed = true;
if( m_isDragging )
{
mouseDragShiftPressed();
return true;
}
}
// If Ctrl is pressed, some tools create a "centered" object while dragging:
if( keyEvent->key() == Qt::Key_Control )
{
m_ctrlPressed = true;
if( m_isDragging )
{
mouseDragCtrlPressed();
return true;
}
}
}
// Key release events:
if( event->type() == QEvent::KeyRelease )
{
QKeyEvent* keyEvent = static_cast<QKeyEvent*>( event );
Qt::Key key = (Qt::Key)keyEvent->key();
if( key == Qt::Key_Shift )
{
m_shiftPressed = false;
if( m_isDragging )
{
mouseDragShiftReleased();
return true;
}
}
if( key == Qt::Key_Control )
{
m_ctrlPressed = false;
if( m_isDragging )
{
mouseDragCtrlReleased();
return true;
}
}
if( key == Qt::Key_Left || key == Qt::Key_Right || key == Qt::Key_Up || key == Qt::Key_Down )
{
arrowKeyReleased( key );
return true;
}
return keyReleased( key );
}
return false;
}
void
VTool::activate()
{
kdDebug() << k_funcinfo << endl;
refreshUnit();
QPixmap Icon = BarIcon( icon() );
view()->contextHelpAction()->updateHelp( uiname(), contextHelp(), &Icon );
view()->statusMessage()->setText( statusText() );
toolController()->setCurrentTool( this );
#if 0
if( toolController()->activeTool() )
{
toolController()->activeTool()->action()->setChecked( false );
toolController()->activeTool()->deactivate();
}
if( toolController()->activeTool() == this )
showDialog();
else
{
refreshUnit();
QPixmap Icon = BarIcon( icon() );
view()->contextHelpAction()->updateHelp( uiname(), contextHelp(), &Icon );
view()->statusMessage()->setText( statusText() );
toolController()->activeTool()->action()->setChecked( true );
}
#endif
}