r19047 by jghali - #12220: Pressing "Esc" while editing a Text Frame from Canvas freezes keyboard input

scribus-commit scribus-commit at lists.scribus.net
Fri Apr 18 21:34:59 UTC 2014


Author: jghali
Date: Fri Apr 18 21:34:59 2014
New Revision: 19047

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=19047
Log:
#12220: Pressing "Esc" while editing a Text Frame from Canvas freezes keyboard input

Modified:
    trunk/Scribus/scribus/canvasmode_edit.cpp

Modified: trunk/Scribus/scribus/canvasmode_edit.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=19047&path=/trunk/Scribus/scribus/canvasmode_edit.cpp
==============================================================================
--- trunk/Scribus/scribus/canvasmode_edit.cpp (original)
+++ trunk/Scribus/scribus/canvasmode_edit.cpp Fri Apr 18 21:34:59 2014
@@ -1,1089 +1,1090 @@
-/*
- For general Scribus (>=1.3.2) copyright and licensing information please refer
- to the COPYING file provided with the program. Following this notice may exist
- a copyright and/or license notice that predates the release of Scribus 1.3.2
- for which a new license (GPL+exception) is in place.
- */
-/***************************************************************************
-*                                                                         *
-*   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.                                   *
-*                                                                         *
-***************************************************************************/
-
-
-#include "canvasmode_edit.h"
-
-#include <QApplication>
-#include <QButtonGroup>
-#include <QCheckBox>
-#include <QCursor>
-#include <QEvent>
-#include <QMessageBox>
-#include <QMouseEvent>
-#include <QPainterPath>
-#include <QPoint>
-#include <QPointF>
-#include <QRect>
-#include <QTimer>
-#include <QWidgetAction>
-#include <QDebug>
-
-
-#include "canvas.h"
-
-#include "fpoint.h"
-#include "fpointarray.h"
-#include "hyphenator.h"
-#include "pageitem_noteframe.h"
-#include "pageitem_textframe.h"
-#include "prefscontext.h"
-#include "prefsfile.h"
-#include "prefsmanager.h"
-#include "sccolorengine.h"
-#include "scmimedata.h"
-#include "scribus.h"
-#include "scribusdoc.h"
-#include "scribusview.h"
-#include "scribusXml.h"
-#include "selection.h"
-#include "ui/aligndistribute.h"
-#include "ui/contextmenu.h"
-#include "ui/hruler.h"
-#include "ui/insertTable.h"
-#include "ui/pageselector.h"
-#include "ui/propertiespalette.h"
-#include "undomanager.h"
-#include "units.h"
-#include "util.h"
-#include "util_icon.h"
-#include "util_math.h"
-
-
-CanvasMode_Edit::CanvasMode_Edit(ScribusView* view) : CanvasMode(view), m_ScMW(view->m_ScMW) 
-{
-	Mxp = Myp = -1;
-	Dxp = Dyp = -1;
-	oldCp = Cp = -1;
-	frameResizeHandle = -1;
-	m_blinker = new QTimer(view);	
-	connect(m_blinker, SIGNAL(timeout()), this, SLOT(blinkTextCursor()));
-	connect(view->horizRuler, SIGNAL(MarkerMoved(double, double)), this, SLOT(rulerPreview(double, double)));
-	mRulerGuide = -1;
-	m_longCursorTime=false;
-	m_keyRepeat = false;
-}
-
-inline bool CanvasMode_Edit::GetItem(PageItem** pi)
-{ 
-	*pi = m_doc->m_Selection->itemAt(0); 
-	return (*pi) != NULL; 
-}
-
-
-void CanvasMode_Edit::blinkTextCursor()
-{
-	PageItem* currItem;
-	if (m_doc->appMode == modeEdit && GetItem(&currItem))
-	{
-		QRectF brect = QRectF(0, 0, currItem->width(), currItem->height());
-		QTransform m = currItem->getTransform();
-		brect = m.mapRect(brect);
-		m_canvas->update(QRectF(m_canvas->canvasToLocal(brect.topLeft()), QSizeF(brect.width(),brect.height())*m_canvas->scale()).toRect());
-	}
-}
-
-void CanvasMode_Edit::keyPressEvent(QKeyEvent *e)
-{
-	if (m_keyRepeat)
-		return;
-	m_keyRepeat = true;
-	e->accept();
-
+/*
+ For general Scribus (>=1.3.2) copyright and licensing information please refer
+ to the COPYING file provided with the program. Following this notice may exist
+ a copyright and/or license notice that predates the release of Scribus 1.3.2
+ for which a new license (GPL+exception) is in place.
+ */
+/***************************************************************************
+*                                                                         *
+*   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.                                   *
+*                                                                         *
+***************************************************************************/
+
+
+#include "canvasmode_edit.h"
+
+#include <QApplication>
+#include <QButtonGroup>
+#include <QCheckBox>
+#include <QCursor>
+#include <QEvent>
+#include <QMessageBox>
+#include <QMouseEvent>
+#include <QPainterPath>
+#include <QPoint>
+#include <QPointF>
+#include <QRect>
+#include <QTimer>
+#include <QWidgetAction>
+#include <QDebug>
+
+
+#include "canvas.h"
+
+#include "fpoint.h"
+#include "fpointarray.h"
+#include "hyphenator.h"
+#include "pageitem_noteframe.h"
+#include "pageitem_textframe.h"
+#include "prefscontext.h"
+#include "prefsfile.h"
+#include "prefsmanager.h"
+#include "sccolorengine.h"
+#include "scmimedata.h"
+#include "scribus.h"
+#include "scribusdoc.h"
+#include "scribusview.h"
+#include "scribusXml.h"
+#include "selection.h"
+#include "ui/aligndistribute.h"
+#include "ui/contextmenu.h"
+#include "ui/hruler.h"
+#include "ui/insertTable.h"
+#include "ui/pageselector.h"
+#include "ui/propertiespalette.h"
+#include "undomanager.h"
+#include "units.h"
+#include "util.h"
+#include "util_icon.h"
+#include "util_math.h"
+
+
+CanvasMode_Edit::CanvasMode_Edit(ScribusView* view) : CanvasMode(view), m_ScMW(view->m_ScMW) 
+{
+	Mxp = Myp = -1;
+	Dxp = Dyp = -1;
+	oldCp = Cp = -1;
+	frameResizeHandle = -1;
+	m_blinker = new QTimer(view);	
+	connect(m_blinker, SIGNAL(timeout()), this, SLOT(blinkTextCursor()));
+	connect(view->horizRuler, SIGNAL(MarkerMoved(double, double)), this, SLOT(rulerPreview(double, double)));
+	mRulerGuide = -1;
+	m_longCursorTime=false;
+	m_keyRepeat = false;
+}
+
+inline bool CanvasMode_Edit::GetItem(PageItem** pi)
+{ 
+	*pi = m_doc->m_Selection->itemAt(0); 
+	return (*pi) != NULL; 
+}
+
+
+void CanvasMode_Edit::blinkTextCursor()
+{
+	PageItem* currItem;
+	if (m_doc->appMode == modeEdit && GetItem(&currItem))
+	{
+		QRectF brect = QRectF(0, 0, currItem->width(), currItem->height());
+		QTransform m = currItem->getTransform();
+		brect = m.mapRect(brect);
+		m_canvas->update(QRectF(m_canvas->canvasToLocal(brect.topLeft()), QSizeF(brect.width(),brect.height())*m_canvas->scale()).toRect());
+	}
+}
+
+void CanvasMode_Edit::keyPressEvent(QKeyEvent *e)
+{
+	if (m_keyRepeat)
+		return;
+	m_keyRepeat = true;
+	e->accept();
+
 	if (e->key() == Qt::Key_Escape)
 	{
 		// Go back to normal mode.
 		m_view->requestMode(modeNormal);
+		m_keyRepeat = false;
 		return;
-	}
-
-	PageItem* currItem;
-	if (!GetItem(&currItem))
-	{
-		m_keyRepeat = false;
-		return;
-	}
-
-	if (currItem->asImageFrame() && !currItem->locked())
-	{
-		currItem->handleModeEditKey(e, m_keyRepeat);
-	}
-	if (currItem->asTextFrame())
-	{
-		bool oldKeyRepeat = m_keyRepeat;
-
-		m_cursorVisible = true;
-		switch (e->key())
-		{
-			case Qt::Key_PageUp:
-			case Qt::Key_PageDown:
-			case Qt::Key_Up:
-			case Qt::Key_Down:
-			case Qt::Key_Home:
-			case Qt::Key_End:
-				m_longCursorTime=true;
-				break;
-			default:
-				m_longCursorTime=false;
-				break;
-		}
-		blinkTextCursor();
-
-		currItem->handleModeEditKey(e, m_keyRepeat);
-		if (currItem->isAutoNoteFrame() && currItem->asNoteFrame()->notesList().isEmpty())
-		{
-			if (!currItem->asNoteFrame()->isEndNotesFrame())
-			{
-				currItem->asNoteFrame()->masterFrame()->invalidateLayout(false);
-				currItem->asNoteFrame()->masterFrame()->updateLayout();
-			}
-		}
-		m_keyRepeat = oldKeyRepeat;
-		if (!currItem->isTextFrame() || (currItem->isAutoNoteFrame() && currItem->asNoteFrame()->notesList().isEmpty()))
-			m_ScMW->slotDocCh(false);
-		m_doc->regionsChanged()->update(QRectF());
-	}
-	m_keyRepeat = false;
-}
-
-
-
-void CanvasMode_Edit::rulerPreview(double base, double xp)
-{
-	PageItem* currItem;
-	if (m_doc->appMode == modeEdit && GetItem(&currItem))
-	{
-		QTransform mm = currItem->getTransform();
-		QPointF itPos = mm.map(QPointF(0, currItem->yPos()));
-		QPoint oldP = m_canvas->canvasToLocal(QPointF(mRulerGuide, itPos.y()));
-		mRulerGuide = base + xp;
-		QPoint p = m_canvas->canvasToLocal(QPointF(mRulerGuide, itPos.y() + currItem->height() * mm.m22()));
-		m_canvas->update(QRect(oldP.x()-2, oldP.y(), p.x()+2, p.y()));
-	}
-}
-
-
-void CanvasMode_Edit::drawControls(QPainter* p)
-{
-	commonDrawControls(p, false);
-	PageItem* currItem;
-	if (GetItem(&currItem))
-	{
-		QPen pp = QPen(Qt::blue, 1.0 / m_canvas->scale(), Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
-		pp.setCosmetic(true);
-		PageItem_TextFrame* textframe = currItem->asTextFrame();
-		if (textframe)
-		{
-			if (mRulerGuide >= 0)
-			{
-				QTransform mm = currItem->getTransform();
-				QPointF itPos = mm.map(QPointF(0, currItem->yPos()));
-				p->save();
-				p->setTransform(mm, true);
-				p->setPen(QPen(Qt::blue, 1.0 / m_canvas->scale(), Qt::DashLine, Qt::FlatCap, Qt::MiterJoin));
-				p->setClipRect(QRectF(0.0, 0.0, currItem->width(), currItem->height()));
-				p->setBrush(Qt::NoBrush);
-				p->setRenderHint(QPainter::Antialiasing);
-				p->drawLine(mRulerGuide - itPos.x(), 0, mRulerGuide - itPos.x(), currItem->height() * mm.m22());
-				p->restore();
-			}
-			drawTextCursor(p, textframe);
-		}
-		else if (currItem->asImageFrame())
-		{
-			QTransform mm = currItem->getTransform();
-			p->save();
-			p->setTransform(mm, true);
-			p->setClipRect(QRectF(0.0, 0.0, currItem->width(), currItem->height()));
-			p->setPen(pp);
-			p->setBrush(QColor(0,0,255,10));
-			p->setRenderHint(QPainter::Antialiasing);
-			p->translate(currItem->imageXOffset()*currItem->imageXScale(), currItem->imageYOffset()*currItem->imageYScale());
-			p->rotate(currItem->imageRotation());
-			p->drawRect(0, 0, currItem->OrigW*currItem->imageXScale(), currItem->OrigH*currItem->imageYScale());
-			p->translate(currItem->OrigW*currItem->imageXScale() / 2, currItem->OrigH*currItem->imageYScale() / 2);
-			p->scale(1.0 / m_canvas->scale(), 1.0 / m_canvas->scale());
-			QPen pps = QPen(Qt::blue, 1.0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
-			pps.setCosmetic(true);
-			p->setPen(pps);
-			p->drawLine(-10, 0, 10, 0);
-			p->drawLine(0, -10, 0, 10);
-			p->setBrush(QColor(0,0,255,70));
-			p->drawEllipse(QPointF(0.0, 0.0), 10.0, 10.0);
-			p->restore();
-		}
-	}
-}
-
-
-void CanvasMode_Edit::drawTextCursor ( QPainter *p, PageItem_TextFrame* textframe )
-{
-	if ((!m_longCursorTime && m_blinkTime.elapsed() > qApp->cursorFlashTime() / 2 ) ||
-		(m_longCursorTime && m_blinkTime.elapsed() > qApp->cursorFlashTime() )
-		)
-	{
-		m_cursorVisible = !m_cursorVisible;
-		m_blinkTime.restart();
-		m_longCursorTime=false;
-	}
-	if ( m_cursorVisible )
-	{
-		commonDrawTextCursor(p, textframe, QPointF());
-	}
-}
-
-void CanvasMode_Edit::enterEvent(QEvent *)
-{
-	if (!m_canvas->m_viewMode.m_MouseButtonPressed)
-	{
-		setModeCursor();
-	}
-}
-
-void CanvasMode_Edit::leaveEvent(QEvent *e)
-{
-}
-
-void CanvasMode_Edit::activate(bool fromGesture)
-{
-	m_canvas->m_viewMode.m_MouseButtonPressed = false;
-	m_canvas->resetRenderMode();
-	m_doc->DragP = false;
-	m_doc->leaveDrag = false;
-	m_canvas->m_viewMode.operItemMoving = false;
-	m_canvas->m_viewMode.operItemResizing = false;
-	m_view->MidButt = false;
-	Mxp = Myp = -1;
-	Dxp = Dyp = -1;
-	oldCp = Cp = -1;
-	frameResizeHandle = -1;
-	setModeCursor();
-	if (fromGesture)
-	{
-		m_view->update();
-	}
-	mRulerGuide = -1;
-	PageItem * it(0);
-	if(GetItem(&it))
-	{
-		if (it->asTextFrame())
-		{
-			m_canvas->setupEditHRuler(it, true);
-			if (m_doc->appMode == modeEdit)
-			{
-				m_blinker->start(200);
-				m_blinkTime.start();
-				m_cursorVisible = true;
-				blinkTextCursor();
-			}
-		}
-	}
-}
-
-void CanvasMode_Edit::deactivate(bool forGesture)
-{
-	m_view->setRedrawMarkerShown(false);
-	if (!forGesture)
-	{
-		mRulerGuide = -1;
-		m_blinker->stop();
-	}
-}
-
-void CanvasMode_Edit::mouseDoubleClickEvent(QMouseEvent *m)
-{
-	m->accept();
-	m_canvas->m_viewMode.m_MouseButtonPressed = false;
-	m_canvas->resetRenderMode();
-	PageItem *currItem = 0;
-	if (GetItem(&currItem) && (m_doc->appMode == modeEdit) && currItem->asTextFrame())
-	{
-		//CB if annotation, open the annotation dialog
-		if (currItem->isAnnotation())
-		{
-		//	qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
-			m_view->requestMode(submodeAnnotProps);
-		}
-		//otherwise, select between the whitespace
-		else
-		{
-			if (m->modifiers() & Qt::ControlModifier)
-			{
-				int start=0, stop=0;
-
-				if (m->modifiers() & Qt::ShiftModifier)
-				{//Double click with Ctrl+Shift in a frame to select few paragraphs
-					uint oldPar = currItem->itemText.nrOfParagraph(oldCp);
-					uint newPar = currItem->itemText.nrOfParagraph();
-					if (oldPar < newPar)
-					{
-						start = currItem->itemText.startOfParagraph(oldPar);
-						stop = currItem->itemText.endOfParagraph(newPar);
-					}
-					else
-					{
-						start = currItem->itemText.startOfParagraph(newPar);
-						stop = currItem->itemText.endOfParagraph(oldPar);
-					}
-				}
-				else
-				{//Double click with Ctrl in a frame to select a paragraph
-					oldCp = currItem->itemText.cursorPosition();
-					uint nrPar = currItem->itemText.nrOfParagraph(oldCp);
-					start = currItem->itemText.startOfParagraph(nrPar);
-					stop = currItem->itemText.endOfParagraph(nrPar);
-				}
-				currItem->itemText.deselectAll();
-				currItem->itemText.extendSelection(start, stop);
-				currItem->itemText.setCursorPosition(stop);
-			}
-            else if ((currItem->itemText.cursorPosition() < currItem->itemText.length()) && (currItem->itemText.hasMark(currItem->itemText.cursorPosition())))
-			{	//invoke edit marker dialog
-				m_ScMW->slotEditMark();
-				return;
-			}
-			else
-			{	//Double click in a frame to select a word
-				oldCp = currItem->itemText.cursorPosition();
-				bool validPos = (oldCp >= 0 && oldCp < currItem->itemText.length());
-				if (validPos && currItem->itemText.hasObject(oldCp))
-				{
-					currItem->itemText.select(oldCp, 1, true);
-					PageItem *iItem = currItem->itemText.object(oldCp);
-					m_ScMW->editInlineStart(iItem->inlineCharID);
-				}
-				else
-				{
-					int newPos = currItem->itemText.selectWord(oldCp);
-					currItem->itemText.setCursorPosition(newPos);
-				}
-			}
-			currItem->HasSel = (currItem->itemText.lengthOfSelection() > 0);
-		}
-	}
-	else
-	{
-		mousePressEvent(m);
-		return;
-	}
-}
-
-
-void CanvasMode_Edit::mouseMoveEvent(QMouseEvent *m)
-{
-// 	const double mouseX = m->globalX();
-// 	const double mouseY = m->globalY();
-	const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
-	
-	m_lastPosWasOverGuide = false;
-	double newX, newY;
-	PageItem *currItem;
-	//bool erf = false;
-	m->accept();
-	if (commonMouseMove(m))
-		return;
-	if (GetItem(&currItem))
-	{
-		newX = qRound(mousePointDoc.x()); //m_view->translateToDoc(m->x(), m->y()).x());
-		newY = qRound(mousePointDoc.y()); //m_view->translateToDoc(m->x(), m->y()).y());
-		if (m_doc->DragP)
-			return;
-		if (m_canvas->m_viewMode.m_MouseButtonPressed && (m_doc->appMode == modeEdit))
-		{
-			if (currItem->asImageFrame())
-			{
-				if (m->modifiers() & Qt::ShiftModifier)
-				{
-					m_view->setCursor(QCursor(loadIcon("Rotieren2.png")));
-					QTransform p = currItem->getTransform();
-					p.translate(currItem->imageXOffset()*currItem->imageXScale(), currItem->imageYOffset()*currItem->imageYScale());
-					QPointF rotP = p.map(QPointF(0.0, 0.0));
-					double itemRotation = xy2Deg(mousePointDoc.x() - rotP.x(), mousePointDoc.y() - rotP.y());
-					currItem->setImageRotation(itemRotation);
-					m_canvas->displayRotHUD(m->globalPos(), itemRotation);
-				}
-				else
-				{
-					m_view->setCursor(QCursor(loadIcon("HandC.xpm")));
-					QTransform ro;
-					ro.rotate(-currItem->rotation());
-					QPointF rota = ro.map(QPointF(newX-Mxp,newY-Myp));
-					QTransform mm = currItem->getTransform();
-					double sx, sy;
-					getScaleFromMatrix(mm, sx, sy);
-					currItem->moveImageInFrame((rota.x() / sx) / currItem->imageXScale(), (rota.y() / sy) / currItem->imageYScale());
-					m_canvas->displayXYHUD(m->globalPos(), currItem->imageXOffset() * currItem->imageXScale(), currItem->imageYOffset() * currItem->imageYScale());
-				}
-				currItem->update();
-				Mxp = newX;
-				Myp = newY;
-			}
-			if (currItem->asTextFrame())
-			{
-				int refStartSel(currItem->asTextFrame()->itemText.startOfSelection());
-				int refEndSel(currItem->asTextFrame()->itemText.endOfSelection());
-				currItem->itemText.deselectAll();
-				currItem->HasSel = false;
-				m_view->slotSetCurs(m->globalPos().x(), m->globalPos().y());
-				//Make sure we dont go here if the old cursor position was not set
-				if (oldCp!=-1 && currItem->itemText.length() > 0)
-				{
-					if (currItem->itemText.cursorPosition() < oldCp)
-					{
-						currItem->itemText.select(currItem->itemText.cursorPosition(), oldCp - currItem->itemText.cursorPosition());
-						currItem->HasSel = true;
-					}
-					if (currItem->itemText.cursorPosition() > oldCp)
-					{
-						currItem->itemText.select(oldCp, currItem->itemText.cursorPosition() - oldCp);
-						currItem->HasSel = true;
-					}
-				}
-				if(currItem->HasSel)
-				{
-					m_ScMW->EnableTxEdit();
-					m_canvas->m_viewMode.operTextSelecting = true;
-					if((refStartSel != currItem->asTextFrame()->itemText.startOfSelection())
-						|| (refEndSel != currItem->asTextFrame()->itemText.endOfSelection()))
-					{
-						QRectF br(currItem->getBoundingRect());
-						m_canvas->update(QRectF(m_canvas->canvasToLocal(br.topLeft()), br.size() * m_canvas->scale()).toRect());
-					}
-				}
-				else
-					m_ScMW->DisableTxEdit();
-
-			}
-		}
-		if (!m_canvas->m_viewMode.m_MouseButtonPressed)
-		{
-			if (m_doc->m_Selection->isMultipleSelection())
-			{
-				setModeCursor();
-				return;
-			}
-			for (int a = 0; a < m_doc->m_Selection->count(); ++a)
-			{
-				currItem = m_doc->m_Selection->itemAt(a);
-				if (currItem->locked())
-					break;
-				int hitTest = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem);
-				if (hitTest >= 0)
-				{
-					if (hitTest == Canvas::INSIDE)
-					{
-						if (currItem->asTextFrame())
-							m_view->setCursor(QCursor(Qt::IBeamCursor));
-						if (currItem->asImageFrame())
-						{
-							if (m->modifiers() & Qt::ShiftModifier)
-								m_view->setCursor(QCursor(loadIcon("Rotieren2.png")));
-							else
-								m_view->setCursor(QCursor(loadIcon("HandC.xpm")));
-						}
-					}
-				}
-				else
-				{
-// 					setModeCursor();
-					m_view->setCursor(QCursor(Qt::ArrowCursor));
-				}
-			}
-		}
-	}
-	else
-	{
-		if ((m_canvas->m_viewMode.m_MouseButtonPressed) && (m->buttons() & Qt::LeftButton))
-		{
-			newX = qRound(mousePointDoc.x()); //m_view->translateToDoc(m->x(), m->y()).x());
-			newY = qRound(mousePointDoc.y()); //m_view->translateToDoc(m->x(), m->y()).y());
-			SeRx = newX;
-			SeRy = newY;
-			QPoint startP = m_canvas->canvasToGlobal(QPointF(Mxp, Myp));
-			m_view->redrawMarker->setGeometry(QRect(m_view->mapFromGlobal(startP), m_view->mapFromGlobal(m->globalPos())).normalized());
-			m_view->setRedrawMarkerShown(true);
-			m_view->HaveSelRect = true;
-			return;
-		}
-	}
-}
-
-void CanvasMode_Edit::mousePressEvent(QMouseEvent *m)
-{
-	if (UndoManager::undoEnabled())
-	{
-		SimpleState *ss = dynamic_cast<SimpleState*>(undoManager->getLastUndo());
-		if(ss)
-			ss->set("ETEA",QString(""));
-		else
-		{
-			TransactionState *ts = dynamic_cast<TransactionState*>(undoManager->getLastUndo());
-			if(ts)
-				ss = dynamic_cast<SimpleState*>(ts->at(0));
-			if(ss)
-				ss->set("ETEA",QString(""));
-		}
-	}
-// 	const double mouseX = m->globalX();
-// 	const double mouseY = m->globalY();
-	const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
-
-	bool inText;
-	PageItem *currItem;
-	m_canvas->PaintSizeRect(QRect());
-	FPoint npf, npf2;
-	QTransform pm;
-	m_canvas->m_viewMode.m_MouseButtonPressed = true;
-	m_canvas->m_viewMode.operItemMoving = false;
-	m_view->HaveSelRect = false;
-	m_doc->DragP = false;
-	m_doc->leaveDrag = false;
-//	oldClip = 0;
-	m->accept();
-	m_view->registerMousePress(m->globalPos());
-	Mxp = mousePointDoc.x(); //qRound(m->x()/m_canvas->scale() + 0*m_doc->minCanvasCoordinate.x());
-	Myp = mousePointDoc.y(); //qRound(m->y()/m_canvas->scale() + 0*m_doc->minCanvasCoordinate.y());
-// 	QRect mpo(m->x()-m_doc->guidesPrefs().grabRad, m->y()-m_doc->guidesPrefs().grabRad, m_doc->guidesPrefs().grabRad*2, m_doc->guidesPrefs().grabRad*2);
-//	mpo.moveBy(qRound(m_doc->minCanvasCoordinate.x() * m_canvas->scale()), qRound(m_doc->minCanvasCoordinate.y() * m_canvas->scale()));
-	SeRx = Mxp;
-	SeRy = Myp;
-	if (m->button() == Qt::MidButton)
-	{
-		m_view->MidButt = true;
-		if (m->modifiers() & Qt::ControlModifier)
-			m_view->DrawNew();
-		return;
-	}
-
-	frameResizeHandle = 0;
-	int oldP=0;
-	if (GetItem(&currItem))
-	{
-//		m_view->slotDoCurs(false);
-		if ((!currItem->locked() || currItem->isTextFrame()) && !currItem->asLine())
-		{
-			FPoint canvasPoint = m_canvas->globalToCanvas(m->globalPos());
-			if (m_canvas->frameHitTest(QPointF(canvasPoint.x(), canvasPoint.y()), currItem) < 0)
-			{
-				m_doc->m_Selection->delaySignalsOn();
-				m_view->Deselect(true);
-				bool wantNormal = true;
-				if (SeleItem(m))
-				{
-					currItem = m_doc->m_Selection->itemAt(0);
-					if ((currItem->asTextFrame()) || (currItem->asImageFrame()))
-					{
-						m_view->requestMode(modeEdit);
-						wantNormal = false;
-					}
-					else
-					{
-						m_view->requestMode(submodePaintingDone);
-						m_view->setCursor(QCursor(Qt::ArrowCursor));
-					}
-					if (currItem->asTextFrame())
-						m_view->slotSetCurs(m->globalPos().x(), m->globalPos().y());
-				}
-				else
-				{
-					m_view->requestMode(submodePaintingDone);
-					m_view->setCursor(QCursor(Qt::ArrowCursor));
-				}
-				m_doc->m_Selection->delaySignalsOff();
-				if (wantNormal)
-					m_view->requestMode(modeNormal);
-				return;
-			}
-		}
-		oldP = currItem->itemText.cursorPosition();
-		//CB Where we set the cursor for a click in text frame
-		if (currItem->asTextFrame())
-		{
-			inText = m_view->slotSetCurs(m->globalPos().x(), m->globalPos().y());
-			//CB If we clicked outside a text frame to go out of edit mode and deselect the frame
-			if (!inText)
-			{
-				currItem->invalidateLayout();
-				m_view->Deselect(true);
-				//m_view->slotDoCurs(true);
-				m_view->requestMode(modeNormal);
-				return;
-			}
-
-			if (m->button() != Qt::RightButton)
-			{
-				//currItem->asTextFrame()->deselectAll();
-				//<<CB Add in shift select to text frames
-				if (m->modifiers() & Qt::ShiftModifier)
-				{
-					if (currItem->itemText.lengthOfSelection() > 0)
-					{
-						if (currItem->itemText.cursorPosition() < (currItem->itemText.startOfSelection() + currItem->itemText.endOfSelection()) / 2)
-						{
-							if (m->modifiers() & Qt::ControlModifier)
-								currItem->itemText.setCursorPosition(currItem->itemText.startOfParagraph());
-							oldP = currItem->itemText.startOfSelection();
-						}
-						else
-						{
-							if (m->modifiers() & Qt::ControlModifier)
-								currItem->itemText.setCursorPosition(currItem->itemText.endOfParagraph());
-							oldP = currItem->itemText.endOfSelection();
-						}
-						currItem->asTextFrame()->itemText.extendSelection(oldP, currItem->itemText.cursorPosition());
-						oldCp = currItem->itemText.cursorPosition();
-					}
-					else
-					{
-						int dir=1;
-						if (oldCp > currItem->itemText.cursorPosition())
-							dir=-1;
-						if (m->modifiers() & Qt::ControlModifier) //no selection but Ctrl+Shift+click still select paragraphs
-						{
-							if (dir == 1)
-								currItem->itemText.setCursorPosition(currItem->itemText.endOfParagraph());
-							else
-								currItem->itemText.setCursorPosition(currItem->itemText.startOfParagraph());
-						}
-						currItem->asTextFrame()->ExpandSel(dir, oldP);
-						oldCp = oldP;
-					}
-				}
-				else //>>CB
-				{
-					oldCp = currItem->itemText.cursorPosition();
-					currItem->itemText.deselectAll();
-					currItem->HasSel = false;
-				}
-				currItem->emitAllToGUI();
-				if (m->button() == Qt::MidButton)
-				{
-					m_canvas->m_viewMode.m_MouseButtonPressed = false;
-					m_view->MidButt = false;
-					QString cc;
-					cc = QApplication::clipboard()->text(QClipboard::Selection);
-					if (cc.isNull())
-						cc = QApplication::clipboard()->text(QClipboard::Clipboard);
-					if (!cc.isNull())
-					{
-						// K.I.S.S.:
-						currItem->itemText.insertChars(0, cc, true);
-						if (m_doc->docHyphenator->AutoCheck)
-							m_doc->docHyphenator->slotHyphenate(currItem);
-						m_ScMW->BookMarkTxT(currItem);
-						//							m_ScMW->outlinePalette->BuildTree();
-					}
-					else
-					{
-						if (ScMimeData::clipboardHasScribusText())
-							m_ScMW->slotEditPaste();
-					}
-					currItem->update();
-				}
-			}
-		}
-		else if (!currItem->asImageFrame() || m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem) < 0)
-		{
-			m_view->Deselect(true);
-			if (SeleItem(m))
-			{
-				currItem = m_doc->m_Selection->itemAt(0);
-				if ((currItem->asTextFrame()) || (currItem->asImageFrame()))
-				{
-					m_view->requestMode(modeEdit);
-				}
-				else
-				{
-					m_view->requestMode(submodePaintingDone);
-					m_view->setCursor(QCursor(Qt::ArrowCursor));
-				}
-			}
-			else
-			{
-				m_view->requestMode(submodePaintingDone);
-				m_view->setCursor(QCursor(Qt::ArrowCursor));
-			}
-		}
-	}
-}
-
-
-
-void CanvasMode_Edit::mouseReleaseEvent(QMouseEvent *m)
-{
-#ifdef GESTURE_FRAME_PREVIEW
-        clearPixmapCache();
-#endif // GESTURE_FRAME_PREVIEW
-	const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
-	PageItem *currItem;
-	m_canvas->m_viewMode.m_MouseButtonPressed = false;
-	m_canvas->resetRenderMode();
-	m->accept();
-//	m_view->stopDragTimer();
-	if ((GetItem(&currItem)) && (m->button() == Qt::RightButton) && (!m_doc->DragP))
-	{
-		createContextMenu(currItem, mousePointDoc.x(), mousePointDoc.y());
-		return;
-	}
-	if (m_view->moveTimerElapsed() && (GetItem(&currItem)))
-	{
-//		m_view->stopDragTimer();
-		m_canvas->setRenderModeUseBuffer(false);
-		if (!m_doc->m_Selection->isMultipleSelection())
-		{
-			m_doc->setRedrawBounding(currItem);
-			currItem->OwnPage = m_doc->OnPage(currItem);
-			m_canvas->m_viewMode.operItemResizing = false;
-			if (currItem->asLine())
-				m_view->updateContents();
-		}
-		if (m_canvas->m_viewMode.operItemMoving)
-		{
-			m_view->updatesOn(false);
-			if (m_doc->m_Selection->isMultipleSelection())
-			{
-				if (!m_view->groupTransactionStarted())
-				{
-					m_view->startGroupTransaction(Um::Move, "", Um::IMove);
-				}
-				m_doc->m_Selection->setGroupRect();
-				double gx, gy, gh, gw;
-				m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
-				double nx = gx;
-				double ny = gy;
-				if (!m_doc->ApplyGuides(&nx, &ny) && !m_doc->ApplyGuides(&nx, &ny,true))
-				{
-					FPoint npx = m_doc->ApplyGridF(FPoint(gx, gy));
-					FPoint npw = m_doc->ApplyGridF(FPoint(gx+gw, gy+gh));
-					if ((fabs(gx-npx.x())) > (fabs((gx+gw)-npw.x())))
-						nx = npw.x() - gw;
-					else
-						nx = npx.x();
-					if ((fabs(gy-npx.y())) > (fabs((gy+gh)-npw.y())))
-						ny = npw.y() - gh;
-					else
-						ny = npx.y();
-				}
-				m_doc->moveGroup(nx-gx, ny-gy, false);
-				m_doc->m_Selection->setGroupRect();
-				m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
-				nx = gx+gw;
-				ny = gy+gh;
-				if (m_doc->ApplyGuides(&nx, &ny) || m_doc->ApplyGuides(&nx,&ny,true))
-					m_doc->moveGroup(nx-(gx+gw), ny-(gy+gh), false);
-				m_doc->m_Selection->setGroupRect();
-			}
-			else
-			{
-				currItem = m_doc->m_Selection->itemAt(0);
-				if (m_doc->SnapGrid)
-				{
-					double nx = currItem->xPos();
-					double ny = currItem->yPos();
-					if (!m_doc->ApplyGuides(&nx, &ny) && !m_doc->ApplyGuides(&nx, &ny,true))
-					{
-						m_doc->m_Selection->setGroupRect();
-						double gx, gy, gh, gw;
-						m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
-						FPoint npx = m_doc->ApplyGridF(FPoint(gx, gy));
-						FPoint npw = m_doc->ApplyGridF(FPoint(gx+gw, gy+gh));
-						if ((fabs(gx-npx.x())) > (fabs((gx+gw)-npw.x())))
-							nx = npw.x() - gw;
-						else
-							nx = npx.x();
-						if ((fabs(gy-npx.y())) > (fabs((gy+gh)-npw.y())))
-							ny = npw.y() - gh;
-						else
-							ny = npx.y();
-					}
-					m_doc->MoveItem(nx-currItem->xPos(), ny-currItem->yPos(), currItem);
-				}
-				else
-					m_doc->MoveItem(0, 0, currItem, false);
-			}
-			m_canvas->m_viewMode.operItemMoving = false;
-			if (m_doc->m_Selection->isMultipleSelection())
-			{
-				double gx, gy, gh, gw;
-				m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
-				FPoint maxSize(gx+gw+m_doc->scratch()->Right, gy+gh+m_doc->scratch()->Bottom);
-				FPoint minSize(gx-m_doc->scratch()->Left, gy-m_doc->scratch()->Top);
-				m_doc->adjustCanvas(minSize, maxSize);
-			}
-			m_doc->setRedrawBounding(currItem);
-			currItem->OwnPage = m_doc->OnPage(currItem);
-			if (currItem->OwnPage != -1)
-			{
-				m_doc->setCurrentPage(m_doc->Pages->at(currItem->OwnPage));
-				m_view->m_ScMW->slotSetCurrentPage(currItem->OwnPage);
-			}
-			//CB done with emitAllToGUI
-			//emit HaveSel(currItem->itemType());
-			//EmitValues(currItem);
-			//CB need this for? a moved item will send its new data with the new xpos/ypos emits
-			//CB TODO And what if we have dragged to a new page. Items X&Y are not updated anyway now
-			//currItem->emitAllToGUI();
-			m_view->updatesOn(true);
-			m_view->updateContents();
-		}
-	}
-	//CB Drag selection performed here
-	if ((m_doc->m_Selection->count() == 0) && (m_view->HaveSelRect) && (!m_view->MidButt))
-	{
-		QRectF Sele = QRectF(Dxp, Dyp, SeRx-Dxp, SeRy-Dyp).normalized();
-		if (!m_doc->masterPageMode())
-		{
-			uint docPagesCount=m_doc->Pages->count();
-			uint docCurrPageNo=m_doc->currentPageNumber();
-			for (uint i = 0; i < docPagesCount; ++i)
-			{
-				if (QRectF(m_doc->Pages->at(i)->xOffset(), m_doc->Pages->at(i)->yOffset(), m_doc->Pages->at(i)->width(), m_doc->Pages->at(i)->height()).intersects(Sele))
-				{
-					if (docCurrPageNo != i)
-					{
-						m_doc->setCurrentPage(m_doc->Pages->at(i));
-						m_view->m_ScMW->slotSetCurrentPage(i);
-					}
-					break;
-				}
-			}
-			m_view->setRulerPos(m_view->contentsX(), m_view->contentsY());
-		}
-		int docItemCount=m_doc->Items->count();
-		if (docItemCount != 0)
-		{
-			m_doc->m_Selection->delaySignalsOn();
-			for (int a = 0; a < docItemCount; ++a)
-			{
-				PageItem* docItem = m_doc->Items->at(a);
-				QTransform p;
-				m_canvas->Transform(docItem, p);
-				QRegion apr = QRegion(docItem->Clip * p);
-				QRect apr2(docItem->getRedrawBounding(1.0));
-				if ((m_doc->masterPageMode()) && (docItem->OnMasterPage != m_doc->currentPage()->pageName()))
-					continue;
-				if (((Sele.contains(apr.boundingRect())) || (Sele.contains(apr2))) && ((docItem->LayerID == m_doc->activeLayer()) || (m_doc->layerSelectable(docItem->LayerID))) && (!m_doc->layerLocked(docItem->LayerID)))
-				{
-					bool redrawSelection=false;
-					m_view->SelectItemNr(a, redrawSelection);
-				}
-			}
-			m_doc->m_Selection->delaySignalsOff();
-			if (m_doc->m_Selection->count() > 1)
-			{
-				m_doc->m_Selection->setGroupRect();
-				double x, y, w, h;
-				m_doc->m_Selection->getGroupRect(&x, &y, &w, &h);
-				m_view->getGroupRectScreen(&x, &y, &w, &h);
-			}
-		}
-		m_view->HaveSelRect = false;
-		m_view->setRedrawMarkerShown(false);
-		m_view->updateContents();
-	}
-	if (GetItem(&currItem))
-	{
-		if (m_doc->m_Selection->count() > 1)
-		{
-			m_doc->m_Selection->setGroupRect();
-			double x, y, w, h;
-			m_doc->m_Selection->getGroupRect(&x, &y, &w, &h);
-			m_canvas->m_viewMode.operItemMoving = false;
-			m_canvas->m_viewMode.operItemResizing = false;
-			m_view->updateContents(QRect(static_cast<int>(x-5), static_cast<int>(y-5), static_cast<int>(w+10), static_cast<int>(h+10)));
-		}
-		/*else
-			currItem->emitAllToGUI();*/
-	}
-	m_canvas->setRenderModeUseBuffer(false);
-	m_doc->DragP = false;
-	m_doc->leaveDrag = false;
-	m_canvas->m_viewMode.operItemMoving = false;
-	m_canvas->m_viewMode.operItemResizing = false;
-	m_view->MidButt = false;
-	if (m_view->groupTransactionStarted())
-	{
-		for (int i = 0; i < m_doc->m_Selection->count(); ++i)
-			m_doc->m_Selection->itemAt(i)->checkChanges(true);
-		m_view->endGroupTransaction();
-	}
-	for (int i = 0; i < m_doc->m_Selection->count(); ++i)
-		m_doc->m_Selection->itemAt(i)->checkChanges(true);
-	//Commit drag created items to undo manager.
-	if (m_doc->m_Selection->itemAt(0)!=NULL)
-	{
-		m_doc->itemAddCommit(m_doc->m_Selection->itemAt(0));
-	}
-	//Make sure the Zoom spinbox and page selector dont have focus if we click on the canvas
-	m_view->m_ScMW->zoomSpinBox->clearFocus();
-	m_view->m_ScMW->pageSelector->clearFocus();
-	if (m_doc->m_Selection->itemAt(0) != 0) // is there the old clip stored for the undo action
-	{
-		currItem = m_doc->m_Selection->itemAt(0);
-		m_doc->nodeEdit.finishTransaction(currItem);
-	}
-}
-
-//CB-->Doc/Fix
-bool CanvasMode_Edit::SeleItem(QMouseEvent *m)
-{
-	const unsigned SELECT_IN_GROUP = Qt::AltModifier;
-	const unsigned SELECT_MULTIPLE = Qt::ShiftModifier;
-	const unsigned SELECT_BENEATH = Qt::ControlModifier;
-	QTransform p;
-	QRectF mpo;
-	PageItem *currItem;
-	m_canvas->m_viewMode.m_MouseButtonPressed = true;
-	FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
-	Mxp = mousePointDoc.x(); //m->x()/m_canvas->scale());
-	Myp = mousePointDoc.y(); //m->y()/m_canvas->scale());
-	double grabRadius = m_doc->guidesPrefs().grabRadius / m_canvas->scale();
-	int MxpS = static_cast<int>(mousePointDoc.x()); //m->x()/m_canvas->scale() + 0*m_doc->minCanvasCoordinate.x());
-	int MypS = static_cast<int>(mousePointDoc.y()); //m->y()/m_canvas->scale() + 0*m_doc->minCanvasCoordinate.y());
-	mpo = QRectF(Mxp-grabRadius, Myp-grabRadius, grabRadius*2, grabRadius*2);
-//	mpo.translate(m_doc->minCanvasCoordinate.x() * m_canvas->scale(), m_doc->minCanvasCoordinate.y() * m_canvas->scale());
-	m_doc->nodeEdit.deselect();
-// 	int a;
-	if (!m_doc->masterPageMode())
-	{
-		int pgNum = -1;
-		int docPageCount = static_cast<int>(m_doc->Pages->count() - 1);
-		MarginStruct pageBleeds;
-		bool drawBleed = false;
-		if (m_doc->bleeds()->hasNonZeroValue() && m_doc->guidesPrefs().showBleed)
-			drawBleed = true;
-		for (int a = docPageCount; a > -1; a--)
-		{
-			if (drawBleed)
-				m_doc->getBleeds(a, pageBleeds);
-			int x = static_cast<int>(m_doc->Pages->at(a)->xOffset() - pageBleeds.Left);
-			int y = static_cast<int>(m_doc->Pages->at(a)->yOffset() - pageBleeds.Top);
-			int w = static_cast<int>(m_doc->Pages->at(a)->width() + pageBleeds.Left + pageBleeds.Right);
-			int h = static_cast<int>(m_doc->Pages->at(a)->height() + pageBleeds.Bottom + pageBleeds.Top);
-			if (QRect(x, y, w, h).contains(MxpS, MypS))
-			{
-				pgNum = static_cast<int>(a);
-				if (drawBleed)  // check again if its really on the correct page
-				{
-					for (int a2 = docPageCount; a2 > -1; a2--)
-					{
-						int xn = static_cast<int>(m_doc->Pages->at(a2)->xOffset());
-						int yn = static_cast<int>(m_doc->Pages->at(a2)->yOffset());
-						int wn = static_cast<int>(m_doc->Pages->at(a2)->width());
-						int hn = static_cast<int>(m_doc->Pages->at(a2)->height());
-						if (QRect(xn, yn, wn, hn).contains(MxpS, MypS))
-						{
-							pgNum = static_cast<int>(a2);
-							break;
-						}
-					}
-				}
-				break;
-			}
-		}
-		if (pgNum >= 0)
-		{
-			if (m_doc->currentPageNumber() != pgNum)
-			{
-				m_doc->setCurrentPage(m_doc->Pages->at(unsigned(pgNum)));
-				m_view->m_ScMW->slotSetCurrentPage(unsigned(pgNum));
-				m_view->DrawNew();
-			}
-		}
-		m_view->setRulerPos(m_view->contentsX(), m_view->contentsY());
-	}
-	
-	currItem = NULL;
-	if ((m->modifiers() & SELECT_BENEATH) != 0)
-	{
-		for (int i=0; i < m_doc->m_Selection->count(); ++i)
-		{
-			if (m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), m_doc->m_Selection->itemAt(i)) >= 0)
-			{
-				currItem = m_doc->m_Selection->itemAt(i);
-				m_doc->m_Selection->removeItem(currItem);
-				break;
-			}
-		}
-	}
-	else if ( (m->modifiers() & SELECT_MULTIPLE) == Qt::NoModifier)
-	{
-		m_view->Deselect(false);
-	}
-	currItem = m_canvas->itemUnderCursor(m->globalPos(), currItem, (m->modifiers() & SELECT_IN_GROUP));
-	if (currItem)
-	{
-		m_doc->m_Selection->delaySignalsOn();
-		if (m_doc->m_Selection->containsItem(currItem))
-		{
-			m_doc->m_Selection->removeItem(currItem);
-		}
-		else
-		{
-			//CB: If we have a selection but the user clicks with control on another item that is not below the current
-			//then clear and select the new item
-			if ((m->modifiers() == SELECT_BENEATH) && m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem) >= 0)
-				m_doc->m_Selection->clear();
-			//CB: #7186: This was prependItem, does not seem to need to be anymore with current select code
-			m_doc->m_Selection->addItem(currItem);
-			if ( (m->modifiers() & SELECT_IN_GROUP) && (!currItem->isGroup()))
-			{
-				currItem->isSingleSel = true;
-			}
-		}
-		m_canvas->update();
-		m_doc->m_Selection->delaySignalsOff();
-		if (m_doc->m_Selection->count() > 1)
-		{
-			m_doc->m_Selection->setGroupRect();
-			double x, y, w, h;
-			m_doc->m_Selection->getGroupRect(&x, &y, &w, &h);
-			m_view->getGroupRectScreen(&x, &y, &w, &h);
-		}
-		if (m_doc->m_Selection->count() == 1)
-		{
-			frameResizeHandle = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem);
-			if ((frameResizeHandle == Canvas::INSIDE) && (!currItem->locked()))
-				m_view->setCursor(QCursor(Qt::SizeAllCursor));
-		}
-		else
-		{
-			m_view->setCursor(QCursor(Qt::SizeAllCursor));
-			m_canvas->m_viewMode.operItemResizing = false;
-		}
-		return true;
-	}
-	m_doc->m_Selection->connectItemToGUI();
-	if ( !(m->modifiers() & SELECT_MULTIPLE))
-		m_view->Deselect(true);
-	return false;
-}
-
-void CanvasMode_Edit::createContextMenu(PageItem* currItem, double mx, double my)
-{
-	ContextMenu* cmen=NULL;
-	m_view->setCursor(QCursor(Qt::ArrowCursor));
-	m_view->setObjectUndoMode();
-	Mxp = mx;
-	Myp = my;
-	if(currItem!=NULL)
-		cmen = new ContextMenu(*(m_doc->m_Selection), m_ScMW, m_doc);
-	else
-		cmen = new ContextMenu(m_ScMW, m_doc, mx, my);
-	if (cmen)
-		cmen->exec(QCursor::pos());
-	m_view->setGlobalUndoMode();
-	delete cmen;
-}
+	}
+
+	PageItem* currItem;
+	if (!GetItem(&currItem))
+	{
+		m_keyRepeat = false;
+		return;
+	}
+
+	if (currItem->asImageFrame() && !currItem->locked())
+	{
+		currItem->handleModeEditKey(e, m_keyRepeat);
+	}
+	if (currItem->asTextFrame())
+	{
+		bool oldKeyRepeat = m_keyRepeat;
+
+		m_cursorVisible = true;
+		switch (e->key())
+		{
+			case Qt::Key_PageUp:
+			case Qt::Key_PageDown:
+			case Qt::Key_Up:
+			case Qt::Key_Down:
+			case Qt::Key_Home:
+			case Qt::Key_End:
+				m_longCursorTime=true;
+				break;
+			default:
+				m_longCursorTime=false;
+				break;
+		}
+		blinkTextCursor();
+
+		currItem->handleModeEditKey(e, m_keyRepeat);
+		if (currItem->isAutoNoteFrame() && currItem->asNoteFrame()->notesList().isEmpty())
+		{
+			if (!currItem->asNoteFrame()->isEndNotesFrame())
+			{
+				currItem->asNoteFrame()->masterFrame()->invalidateLayout(false);
+				currItem->asNoteFrame()->masterFrame()->updateLayout();
+			}
+		}
+		m_keyRepeat = oldKeyRepeat;
+		if (!currItem->isTextFrame() || (currItem->isAutoNoteFrame() && currItem->asNoteFrame()->notesList().isEmpty()))
+			m_ScMW->slotDocCh(false);
+		m_doc->regionsChanged()->update(QRectF());
+	}
+	m_keyRepeat = false;
+}
+
+
+
+void CanvasMode_Edit::rulerPreview(double base, double xp)
+{
+	PageItem* currItem;
+	if (m_doc->appMode == modeEdit && GetItem(&currItem))
+	{
+		QTransform mm = currItem->getTransform();
+		QPointF itPos = mm.map(QPointF(0, currItem->yPos()));
+		QPoint oldP = m_canvas->canvasToLocal(QPointF(mRulerGuide, itPos.y()));
+		mRulerGuide = base + xp;
+		QPoint p = m_canvas->canvasToLocal(QPointF(mRulerGuide, itPos.y() + currItem->height() * mm.m22()));
+		m_canvas->update(QRect(oldP.x()-2, oldP.y(), p.x()+2, p.y()));
+	}
+}
+
+
+void CanvasMode_Edit::drawControls(QPainter* p)
+{
+	commonDrawControls(p, false);
+	PageItem* currItem;
+	if (GetItem(&currItem))
+	{
+		QPen pp = QPen(Qt::blue, 1.0 / m_canvas->scale(), Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
+		pp.setCosmetic(true);
+		PageItem_TextFrame* textframe = currItem->asTextFrame();
+		if (textframe)
+		{
+			if (mRulerGuide >= 0)
+			{
+				QTransform mm = currItem->getTransform();
+				QPointF itPos = mm.map(QPointF(0, currItem->yPos()));
+				p->save();
+				p->setTransform(mm, true);
+				p->setPen(QPen(Qt::blue, 1.0 / m_canvas->scale(), Qt::DashLine, Qt::FlatCap, Qt::MiterJoin));
+				p->setClipRect(QRectF(0.0, 0.0, currItem->width(), currItem->height()));
+				p->setBrush(Qt::NoBrush);
+				p->setRenderHint(QPainter::Antialiasing);
+				p->drawLine(mRulerGuide - itPos.x(), 0, mRulerGuide - itPos.x(), currItem->height() * mm.m22());
+				p->restore();
+			}
+			drawTextCursor(p, textframe);
+		}
+		else if (currItem->asImageFrame())
+		{
+			QTransform mm = currItem->getTransform();
+			p->save();
+			p->setTransform(mm, true);
+			p->setClipRect(QRectF(0.0, 0.0, currItem->width(), currItem->height()));
+			p->setPen(pp);
+			p->setBrush(QColor(0,0,255,10));
+			p->setRenderHint(QPainter::Antialiasing);
+			p->translate(currItem->imageXOffset()*currItem->imageXScale(), currItem->imageYOffset()*currItem->imageYScale());
+			p->rotate(currItem->imageRotation());
+			p->drawRect(0, 0, currItem->OrigW*currItem->imageXScale(), currItem->OrigH*currItem->imageYScale());
+			p->translate(currItem->OrigW*currItem->imageXScale() / 2, currItem->OrigH*currItem->imageYScale() / 2);
+			p->scale(1.0 / m_canvas->scale(), 1.0 / m_canvas->scale());
+			QPen pps = QPen(Qt::blue, 1.0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
+			pps.setCosmetic(true);
+			p->setPen(pps);
+			p->drawLine(-10, 0, 10, 0);
+			p->drawLine(0, -10, 0, 10);
+			p->setBrush(QColor(0,0,255,70));
+			p->drawEllipse(QPointF(0.0, 0.0), 10.0, 10.0);
+			p->restore();
+		}
+	}
+}
+
+
+void CanvasMode_Edit::drawTextCursor ( QPainter *p, PageItem_TextFrame* textframe )
+{
+	if ((!m_longCursorTime && m_blinkTime.elapsed() > qApp->cursorFlashTime() / 2 ) ||
+		(m_longCursorTime && m_blinkTime.elapsed() > qApp->cursorFlashTime() )
+		)
+	{
+		m_cursorVisible = !m_cursorVisible;
+		m_blinkTime.restart();
+		m_longCursorTime=false;
+	}
+	if ( m_cursorVisible )
+	{
+		commonDrawTextCursor(p, textframe, QPointF());
+	}
+}
+
+void CanvasMode_Edit::enterEvent(QEvent *)
+{
+	if (!m_canvas->m_viewMode.m_MouseButtonPressed)
+	{
+		setModeCursor();
+	}
+}
+
+void CanvasMode_Edit::leaveEvent(QEvent *e)
+{
+}
+
+void CanvasMode_Edit::activate(bool fromGesture)
+{
+	m_canvas->m_viewMode.m_MouseButtonPressed = false;
+	m_canvas->resetRenderMode();
+	m_doc->DragP = false;
+	m_doc->leaveDrag = false;
+	m_canvas->m_viewMode.operItemMoving = false;
+	m_canvas->m_viewMode.operItemResizing = false;
+	m_view->MidButt = false;
+	Mxp = Myp = -1;
+	Dxp = Dyp = -1;
+	oldCp = Cp = -1;
+	frameResizeHandle = -1;
+	setModeCursor();
+	if (fromGesture)
+	{
+		m_view->update();
+	}
+	mRulerGuide = -1;
+	PageItem * it(0);
+	if(GetItem(&it))
+	{
+		if (it->asTextFrame())
+		{
+			m_canvas->setupEditHRuler(it, true);
+			if (m_doc->appMode == modeEdit)
+			{
+				m_blinker->start(200);
+				m_blinkTime.start();
+				m_cursorVisible = true;
+				blinkTextCursor();
+			}
+		}
+	}
+}
+
+void CanvasMode_Edit::deactivate(bool forGesture)
+{
+	m_view->setRedrawMarkerShown(false);
+	if (!forGesture)
+	{
+		mRulerGuide = -1;
+		m_blinker->stop();
+	}
+}
+
+void CanvasMode_Edit::mouseDoubleClickEvent(QMouseEvent *m)
+{
+	m->accept();
+	m_canvas->m_viewMode.m_MouseButtonPressed = false;
+	m_canvas->resetRenderMode();
+	PageItem *currItem = 0;
+	if (GetItem(&currItem) && (m_doc->appMode == modeEdit) && currItem->asTextFrame())
+	{
+		//CB if annotation, open the annotation dialog
+		if (currItem->isAnnotation())
+		{
+		//	qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
+			m_view->requestMode(submodeAnnotProps);
+		}
+		//otherwise, select between the whitespace
+		else
+		{
+			if (m->modifiers() & Qt::ControlModifier)
+			{
+				int start=0, stop=0;
+
+				if (m->modifiers() & Qt::ShiftModifier)
+				{//Double click with Ctrl+Shift in a frame to select few paragraphs
+					uint oldPar = currItem->itemText.nrOfParagraph(oldCp);
+					uint newPar = currItem->itemText.nrOfParagraph();
+					if (oldPar < newPar)
+					{
+						start = currItem->itemText.startOfParagraph(oldPar);
+						stop = currItem->itemText.endOfParagraph(newPar);
+					}
+					else
+					{
+						start = currItem->itemText.startOfParagraph(newPar);
+						stop = currItem->itemText.endOfParagraph(oldPar);
+					}
+				}
+				else
+				{//Double click with Ctrl in a frame to select a paragraph
+					oldCp = currItem->itemText.cursorPosition();
+					uint nrPar = currItem->itemText.nrOfParagraph(oldCp);
+					start = currItem->itemText.startOfParagraph(nrPar);
+					stop = currItem->itemText.endOfParagraph(nrPar);
+				}
+				currItem->itemText.deselectAll();
+				currItem->itemText.extendSelection(start, stop);
+				currItem->itemText.setCursorPosition(stop);
+			}
+            else if ((currItem->itemText.cursorPosition() < currItem->itemText.length()) && (currItem->itemText.hasMark(currItem->itemText.cursorPosition())))
+			{	//invoke edit marker dialog
+				m_ScMW->slotEditMark();
+				return;
+			}
+			else
+			{	//Double click in a frame to select a word
+				oldCp = currItem->itemText.cursorPosition();
+				bool validPos = (oldCp >= 0 && oldCp < currItem->itemText.length());
+				if (validPos && currItem->itemText.hasObject(oldCp))
+				{
+					currItem->itemText.select(oldCp, 1, true);
+					PageItem *iItem = currItem->itemText.object(oldCp);
+					m_ScMW->editInlineStart(iItem->inlineCharID);
+				}
+				else
+				{
+					int newPos = currItem->itemText.selectWord(oldCp);
+					currItem->itemText.setCursorPosition(newPos);
+				}
+			}
+			currItem->HasSel = (currItem->itemText.lengthOfSelection() > 0);
+		}
+	}
+	else
+	{
+		mousePressEvent(m);
+		return;
+	}
+}
+
+
+void CanvasMode_Edit::mouseMoveEvent(QMouseEvent *m)
+{
+// 	const double mouseX = m->globalX();
+// 	const double mouseY = m->globalY();
+	const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
+	
+	m_lastPosWasOverGuide = false;
+	double newX, newY;
+	PageItem *currItem;
+	//bool erf = false;
+	m->accept();
+	if (commonMouseMove(m))
+		return;
+	if (GetItem(&currItem))
+	{
+		newX = qRound(mousePointDoc.x()); //m_view->translateToDoc(m->x(), m->y()).x());
+		newY = qRound(mousePointDoc.y()); //m_view->translateToDoc(m->x(), m->y()).y());
+		if (m_doc->DragP)
+			return;
+		if (m_canvas->m_viewMode.m_MouseButtonPressed && (m_doc->appMode == modeEdit))
+		{
+			if (currItem->asImageFrame())
+			{
+				if (m->modifiers() & Qt::ShiftModifier)
+				{
+					m_view->setCursor(QCursor(loadIcon("Rotieren2.png")));
+					QTransform p = currItem->getTransform();
+					p.translate(currItem->imageXOffset()*currItem->imageXScale(), currItem->imageYOffset()*currItem->imageYScale());
+					QPointF rotP = p.map(QPointF(0.0, 0.0));
+					double itemRotation = xy2Deg(mousePointDoc.x() - rotP.x(), mousePointDoc.y() - rotP.y());
+					currItem->setImageRotation(itemRotation);
+					m_canvas->displayRotHUD(m->globalPos(), itemRotation);
+				}
+				else
+				{
+					m_view->setCursor(QCursor(loadIcon("HandC.xpm")));
+					QTransform ro;
+					ro.rotate(-currItem->rotation());
+					QPointF rota = ro.map(QPointF(newX-Mxp,newY-Myp));
+					QTransform mm = currItem->getTransform();
+					double sx, sy;
+					getScaleFromMatrix(mm, sx, sy);
+					currItem->moveImageInFrame((rota.x() / sx) / currItem->imageXScale(), (rota.y() / sy) / currItem->imageYScale());
+					m_canvas->displayXYHUD(m->globalPos(), currItem->imageXOffset() * currItem->imageXScale(), currItem->imageYOffset() * currItem->imageYScale());
+				}
+				currItem->update();
+				Mxp = newX;
+				Myp = newY;
+			}
+			if (currItem->asTextFrame())
+			{
+				int refStartSel(currItem->asTextFrame()->itemText.startOfSelection());
+				int refEndSel(currItem->asTextFrame()->itemText.endOfSelection());
+				currItem->itemText.deselectAll();
+				currItem->HasSel = false;
+				m_view->slotSetCurs(m->globalPos().x(), m->globalPos().y());
+				//Make sure we dont go here if the old cursor position was not set
+				if (oldCp!=-1 && currItem->itemText.length() > 0)
+				{
+					if (currItem->itemText.cursorPosition() < oldCp)
+					{
+						currItem->itemText.select(currItem->itemText.cursorPosition(), oldCp - currItem->itemText.cursorPosition());
+						currItem->HasSel = true;
+					}
+					if (currItem->itemText.cursorPosition() > oldCp)
+					{
+						currItem->itemText.select(oldCp, currItem->itemText.cursorPosition() - oldCp);
+						currItem->HasSel = true;
+					}
+				}
+				if(currItem->HasSel)
+				{
+					m_ScMW->EnableTxEdit();
+					m_canvas->m_viewMode.operTextSelecting = true;
+					if((refStartSel != currItem->asTextFrame()->itemText.startOfSelection())
+						|| (refEndSel != currItem->asTextFrame()->itemText.endOfSelection()))
+					{
+						QRectF br(currItem->getBoundingRect());
+						m_canvas->update(QRectF(m_canvas->canvasToLocal(br.topLeft()), br.size() * m_canvas->scale()).toRect());
+					}
+				}
+				else
+					m_ScMW->DisableTxEdit();
+
+			}
+		}
+		if (!m_canvas->m_viewMode.m_MouseButtonPressed)
+		{
+			if (m_doc->m_Selection->isMultipleSelection())
+			{
+				setModeCursor();
+				return;
+			}
+			for (int a = 0; a < m_doc->m_Selection->count(); ++a)
+			{
+				currItem = m_doc->m_Selection->itemAt(a);
+				if (currItem->locked())
+					break;
+				int hitTest = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem);
+				if (hitTest >= 0)
+				{
+					if (hitTest == Canvas::INSIDE)
+					{
+						if (currItem->asTextFrame())
+							m_view->setCursor(QCursor(Qt::IBeamCursor));
+						if (currItem->asImageFrame())
+						{
+							if (m->modifiers() & Qt::ShiftModifier)
+								m_view->setCursor(QCursor(loadIcon("Rotieren2.png")));
+							else
+								m_view->setCursor(QCursor(loadIcon("HandC.xpm")));
+						}
+					}
+				}
+				else
+				{
+// 					setModeCursor();
+					m_view->setCursor(QCursor(Qt::ArrowCursor));
+				}
+			}
+		}
+	}
+	else
+	{
+		if ((m_canvas->m_viewMode.m_MouseButtonPressed) && (m->buttons() & Qt::LeftButton))
+		{
+			newX = qRound(mousePointDoc.x()); //m_view->translateToDoc(m->x(), m->y()).x());
+			newY = qRound(mousePointDoc.y()); //m_view->translateToDoc(m->x(), m->y()).y());
+			SeRx = newX;
+			SeRy = newY;
+			QPoint startP = m_canvas->canvasToGlobal(QPointF(Mxp, Myp));
+			m_view->redrawMarker->setGeometry(QRect(m_view->mapFromGlobal(startP), m_view->mapFromGlobal(m->globalPos())).normalized());
+			m_view->setRedrawMarkerShown(true);
+			m_view->HaveSelRect = true;
+			return;
+		}
+	}
+}
+
+void CanvasMode_Edit::mousePressEvent(QMouseEvent *m)
+{
+	if (UndoManager::undoEnabled())
+	{
+		SimpleState *ss = dynamic_cast<SimpleState*>(undoManager->getLastUndo());
+		if(ss)
+			ss->set("ETEA",QString(""));
+		else
+		{
+			TransactionState *ts = dynamic_cast<TransactionState*>(undoManager->getLastUndo());
+			if(ts)
+				ss = dynamic_cast<SimpleState*>(ts->at(0));
+			if(ss)
+				ss->set("ETEA",QString(""));
+		}
+	}
+// 	const double mouseX = m->globalX();
+// 	const double mouseY = m->globalY();
+	const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
+
+	bool inText;
+	PageItem *currItem;
+	m_canvas->PaintSizeRect(QRect());
+	FPoint npf, npf2;
+	QTransform pm;
+	m_canvas->m_viewMode.m_MouseButtonPressed = true;
+	m_canvas->m_viewMode.operItemMoving = false;
+	m_view->HaveSelRect = false;
+	m_doc->DragP = false;
+	m_doc->leaveDrag = false;
+//	oldClip = 0;
+	m->accept();
+	m_view->registerMousePress(m->globalPos());
+	Mxp = mousePointDoc.x(); //qRound(m->x()/m_canvas->scale() + 0*m_doc->minCanvasCoordinate.x());
+	Myp = mousePointDoc.y(); //qRound(m->y()/m_canvas->scale() + 0*m_doc->minCanvasCoordinate.y());
+// 	QRect mpo(m->x()-m_doc->guidesPrefs().grabRad, m->y()-m_doc->guidesPrefs().grabRad, m_doc->guidesPrefs().grabRad*2, m_doc->guidesPrefs().grabRad*2);
+//	mpo.moveBy(qRound(m_doc->minCanvasCoordinate.x() * m_canvas->scale()), qRound(m_doc->minCanvasCoordinate.y() * m_canvas->scale()));
+	SeRx = Mxp;
+	SeRy = Myp;
+	if (m->button() == Qt::MidButton)
+	{
+		m_view->MidButt = true;
+		if (m->modifiers() & Qt::ControlModifier)
+			m_view->DrawNew();
+		return;
+	}
+
+	frameResizeHandle = 0;
+	int oldP=0;
+	if (GetItem(&currItem))
+	{
+//		m_view->slotDoCurs(false);
+		if ((!currItem->locked() || currItem->isTextFrame()) && !currItem->asLine())
+		{
+			FPoint canvasPoint = m_canvas->globalToCanvas(m->globalPos());
+			if (m_canvas->frameHitTest(QPointF(canvasPoint.x(), canvasPoint.y()), currItem) < 0)
+			{
+				m_doc->m_Selection->delaySignalsOn();
+				m_view->Deselect(true);
+				bool wantNormal = true;
+				if (SeleItem(m))
+				{
+					currItem = m_doc->m_Selection->itemAt(0);
+					if ((currItem->asTextFrame()) || (currItem->asImageFrame()))
+					{
+						m_view->requestMode(modeEdit);
+						wantNormal = false;
+					}
+					else
+					{
+						m_view->requestMode(submodePaintingDone);
+						m_view->setCursor(QCursor(Qt::ArrowCursor));
+					}
+					if (currItem->asTextFrame())
+						m_view->slotSetCurs(m->globalPos().x(), m->globalPos().y());
+				}
+				else
+				{
+					m_view->requestMode(submodePaintingDone);
+					m_view->setCursor(QCursor(Qt::ArrowCursor));
+				}
+				m_doc->m_Selection->delaySignalsOff();
+				if (wantNormal)
+					m_view->requestMode(modeNormal);
+				return;
+			}
+		}
+		oldP = currItem->itemText.cursorPosition();
+		//CB Where we set the cursor for a click in text frame
+		if (currItem->asTextFrame())
+		{
+			inText = m_view->slotSetCurs(m->globalPos().x(), m->globalPos().y());
+			//CB If we clicked outside a text frame to go out of edit mode and deselect the frame
+			if (!inText)
+			{
+				currItem->invalidateLayout();
+				m_view->Deselect(true);
+				//m_view->slotDoCurs(true);
+				m_view->requestMode(modeNormal);
+				return;
+			}
+
+			if (m->button() != Qt::RightButton)
+			{
+				//currItem->asTextFrame()->deselectAll();
+				//<<CB Add in shift select to text frames
+				if (m->modifiers() & Qt::ShiftModifier)
+				{
+					if (currItem->itemText.lengthOfSelection() > 0)
+					{
+						if (currItem->itemText.cursorPosition() < (currItem->itemText.startOfSelection() + currItem->itemText.endOfSelection()) / 2)
+						{
+							if (m->modifiers() & Qt::ControlModifier)
+								currItem->itemText.setCursorPosition(currItem->itemText.startOfParagraph());
+							oldP = currItem->itemText.startOfSelection();
+						}
+						else
+						{
+							if (m->modifiers() & Qt::ControlModifier)
+								currItem->itemText.setCursorPosition(currItem->itemText.endOfParagraph());
+							oldP = currItem->itemText.endOfSelection();
+						}
+						currItem->asTextFrame()->itemText.extendSelection(oldP, currItem->itemText.cursorPosition());
+						oldCp = currItem->itemText.cursorPosition();
+					}
+					else
+					{
+						int dir=1;
+						if (oldCp > currItem->itemText.cursorPosition())
+							dir=-1;
+						if (m->modifiers() & Qt::ControlModifier) //no selection but Ctrl+Shift+click still select paragraphs
+						{
+							if (dir == 1)
+								currItem->itemText.setCursorPosition(currItem->itemText.endOfParagraph());
+							else
+								currItem->itemText.setCursorPosition(currItem->itemText.startOfParagraph());
+						}
+						currItem->asTextFrame()->ExpandSel(dir, oldP);
+						oldCp = oldP;
+					}
+				}
+				else //>>CB
+				{
+					oldCp = currItem->itemText.cursorPosition();
+					currItem->itemText.deselectAll();
+					currItem->HasSel = false;
+				}
+				currItem->emitAllToGUI();
+				if (m->button() == Qt::MidButton)
+				{
+					m_canvas->m_viewMode.m_MouseButtonPressed = false;
+					m_view->MidButt = false;
+					QString cc;
+					cc = QApplication::clipboard()->text(QClipboard::Selection);
+					if (cc.isNull())
+						cc = QApplication::clipboard()->text(QClipboard::Clipboard);
+					if (!cc.isNull())
+					{
+						// K.I.S.S.:
+						currItem->itemText.insertChars(0, cc, true);
+						if (m_doc->docHyphenator->AutoCheck)
+							m_doc->docHyphenator->slotHyphenate(currItem);
+						m_ScMW->BookMarkTxT(currItem);
+						//							m_ScMW->outlinePalette->BuildTree();
+					}
+					else
+					{
+						if (ScMimeData::clipboardHasScribusText())
+							m_ScMW->slotEditPaste();
+					}
+					currItem->update();
+				}
+			}
+		}
+		else if (!currItem->asImageFrame() || m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem) < 0)
+		{
+			m_view->Deselect(true);
+			if (SeleItem(m))
+			{
+				currItem = m_doc->m_Selection->itemAt(0);
+				if ((currItem->asTextFrame()) || (currItem->asImageFrame()))
+				{
+					m_view->requestMode(modeEdit);
+				}
+				else
+				{
+					m_view->requestMode(submodePaintingDone);
+					m_view->setCursor(QCursor(Qt::ArrowCursor));
+				}
+			}
+			else
+			{
+				m_view->requestMode(submodePaintingDone);
+				m_view->setCursor(QCursor(Qt::ArrowCursor));
+			}
+		}
+	}
+}
+
+
+
+void CanvasMode_Edit::mouseReleaseEvent(QMouseEvent *m)
+{
+#ifdef GESTURE_FRAME_PREVIEW
+        clearPixmapCache();
+#endif // GESTURE_FRAME_PREVIEW
+	const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
+	PageItem *currItem;
+	m_canvas->m_viewMode.m_MouseButtonPressed = false;
+	m_canvas->resetRenderMode();
+	m->accept();
+//	m_view->stopDragTimer();
+	if ((GetItem(&currItem)) && (m->button() == Qt::RightButton) && (!m_doc->DragP))
+	{
+		createContextMenu(currItem, mousePointDoc.x(), mousePointDoc.y());
+		return;
+	}
+	if (m_view->moveTimerElapsed() && (GetItem(&currItem)))
+	{
+//		m_view->stopDragTimer();
+		m_canvas->setRenderModeUseBuffer(false);
+		if (!m_doc->m_Selection->isMultipleSelection())
+		{
+			m_doc->setRedrawBounding(currItem);
+			currItem->OwnPage = m_doc->OnPage(currItem);
+			m_canvas->m_viewMode.operItemResizing = false;
+			if (currItem->asLine())
+				m_view->updateContents();
+		}
+		if (m_canvas->m_viewMode.operItemMoving)
+		{
+			m_view->updatesOn(false);
+			if (m_doc->m_Selection->isMultipleSelection())
+			{
+				if (!m_view->groupTransactionStarted())
+				{
+					m_view->startGroupTransaction(Um::Move, "", Um::IMove);
+				}
+				m_doc->m_Selection->setGroupRect();
+				double gx, gy, gh, gw;
+				m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
+				double nx = gx;
+				double ny = gy;
+				if (!m_doc->ApplyGuides(&nx, &ny) && !m_doc->ApplyGuides(&nx, &ny,true))
+				{
+					FPoint npx = m_doc->ApplyGridF(FPoint(gx, gy));
+					FPoint npw = m_doc->ApplyGridF(FPoint(gx+gw, gy+gh));
+					if ((fabs(gx-npx.x())) > (fabs((gx+gw)-npw.x())))
+						nx = npw.x() - gw;
+					else
+						nx = npx.x();
+					if ((fabs(gy-npx.y())) > (fabs((gy+gh)-npw.y())))
+						ny = npw.y() - gh;
+					else
+						ny = npx.y();
+				}
+				m_doc->moveGroup(nx-gx, ny-gy, false);
+				m_doc->m_Selection->setGroupRect();
+				m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
+				nx = gx+gw;
+				ny = gy+gh;
+				if (m_doc->ApplyGuides(&nx, &ny) || m_doc->ApplyGuides(&nx,&ny,true))
+					m_doc->moveGroup(nx-(gx+gw), ny-(gy+gh), false);
+				m_doc->m_Selection->setGroupRect();
+			}
+			else
+			{
+				currItem = m_doc->m_Selection->itemAt(0);
+				if (m_doc->SnapGrid)
+				{
+					double nx = currItem->xPos();
+					double ny = currItem->yPos();
+					if (!m_doc->ApplyGuides(&nx, &ny) && !m_doc->ApplyGuides(&nx, &ny,true))
+					{
+						m_doc->m_Selection->setGroupRect();
+						double gx, gy, gh, gw;
+						m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
+						FPoint npx = m_doc->ApplyGridF(FPoint(gx, gy));
+						FPoint npw = m_doc->ApplyGridF(FPoint(gx+gw, gy+gh));
+						if ((fabs(gx-npx.x())) > (fabs((gx+gw)-npw.x())))
+							nx = npw.x() - gw;
+						else
+							nx = npx.x();
+						if ((fabs(gy-npx.y())) > (fabs((gy+gh)-npw.y())))
+							ny = npw.y() - gh;
+						else
+							ny = npx.y();
+					}
+					m_doc->MoveItem(nx-currItem->xPos(), ny-currItem->yPos(), currItem);
+				}
+				else
+					m_doc->MoveItem(0, 0, currItem, false);
+			}
+			m_canvas->m_viewMode.operItemMoving = false;
+			if (m_doc->m_Selection->isMultipleSelection())
+			{
+				double gx, gy, gh, gw;
+				m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
+				FPoint maxSize(gx+gw+m_doc->scratch()->Right, gy+gh+m_doc->scratch()->Bottom);
+				FPoint minSize(gx-m_doc->scratch()->Left, gy-m_doc->scratch()->Top);
+				m_doc->adjustCanvas(minSize, maxSize);
+			}
+			m_doc->setRedrawBounding(currItem);
+			currItem->OwnPage = m_doc->OnPage(currItem);
+			if (currItem->OwnPage != -1)
+			{
+				m_doc->setCurrentPage(m_doc->Pages->at(currItem->OwnPage));
+				m_view->m_ScMW->slotSetCurrentPage(currItem->OwnPage);
+			}
+			//CB done with emitAllToGUI
+			//emit HaveSel(currItem->itemType());
+			//EmitValues(currItem);
+			//CB need this for? a moved item will send its new data with the new xpos/ypos emits
+			//CB TODO And what if we have dragged to a new page. Items X&Y are not updated anyway now
+			//currItem->emitAllToGUI();
+			m_view->updatesOn(true);
+			m_view->updateContents();
+		}
+	}
+	//CB Drag selection performed here
+	if ((m_doc->m_Selection->count() == 0) && (m_view->HaveSelRect) && (!m_view->MidButt))
+	{
+		QRectF Sele = QRectF(Dxp, Dyp, SeRx-Dxp, SeRy-Dyp).normalized();
+		if (!m_doc->masterPageMode())
+		{
+			uint docPagesCount=m_doc->Pages->count();
+			uint docCurrPageNo=m_doc->currentPageNumber();
+			for (uint i = 0; i < docPagesCount; ++i)
+			{
+				if (QRectF(m_doc->Pages->at(i)->xOffset(), m_doc->Pages->at(i)->yOffset(), m_doc->Pages->at(i)->width(), m_doc->Pages->at(i)->height()).intersects(Sele))
+				{
+					if (docCurrPageNo != i)
+					{
+						m_doc->setCurrentPage(m_doc->Pages->at(i));
+						m_view->m_ScMW->slotSetCurrentPage(i);
+					}
+					break;
+				}
+			}
+			m_view->setRulerPos(m_view->contentsX(), m_view->contentsY());
+		}
+		int docItemCount=m_doc->Items->count();
+		if (docItemCount != 0)
+		{
+			m_doc->m_Selection->delaySignalsOn();
+			for (int a = 0; a < docItemCount; ++a)
+			{
+				PageItem* docItem = m_doc->Items->at(a);
+				QTransform p;
+				m_canvas->Transform(docItem, p);
+				QRegion apr = QRegion(docItem->Clip * p);
+				QRect apr2(docItem->getRedrawBounding(1.0));
+				if ((m_doc->masterPageMode()) && (docItem->OnMasterPage != m_doc->currentPage()->pageName()))
+					continue;
+				if (((Sele.contains(apr.boundingRect())) || (Sele.contains(apr2))) && ((docItem->LayerID == m_doc->activeLayer()) || (m_doc->layerSelectable(docItem->LayerID))) && (!m_doc->layerLocked(docItem->LayerID)))
+				{
+					bool redrawSelection=false;
+					m_view->SelectItemNr(a, redrawSelection);
+				}
+			}
+			m_doc->m_Selection->delaySignalsOff();
+			if (m_doc->m_Selection->count() > 1)
+			{
+				m_doc->m_Selection->setGroupRect();
+				double x, y, w, h;
+				m_doc->m_Selection->getGroupRect(&x, &y, &w, &h);
+				m_view->getGroupRectScreen(&x, &y, &w, &h);
+			}
+		}
+		m_view->HaveSelRect = false;
+		m_view->setRedrawMarkerShown(false);
+		m_view->updateContents();
+	}
+	if (GetItem(&currItem))
+	{
+		if (m_doc->m_Selection->count() > 1)
+		{
+			m_doc->m_Selection->setGroupRect();
+			double x, y, w, h;
+			m_doc->m_Selection->getGroupRect(&x, &y, &w, &h);
+			m_canvas->m_viewMode.operItemMoving = false;
+			m_canvas->m_viewMode.operItemResizing = false;
+			m_view->updateContents(QRect(static_cast<int>(x-5), static_cast<int>(y-5), static_cast<int>(w+10), static_cast<int>(h+10)));
+		}
+		/*else
+			currItem->emitAllToGUI();*/
+	}
+	m_canvas->setRenderModeUseBuffer(false);
+	m_doc->DragP = false;
+	m_doc->leaveDrag = false;
+	m_canvas->m_viewMode.operItemMoving = false;
+	m_canvas->m_viewMode.operItemResizing = false;
+	m_view->MidButt = false;
+	if (m_view->groupTransactionStarted())
+	{
+		for (int i = 0; i < m_doc->m_Selection->count(); ++i)
+			m_doc->m_Selection->itemAt(i)->checkChanges(true);
+		m_view->endGroupTransaction();
+	}
+	for (int i = 0; i < m_doc->m_Selection->count(); ++i)
+		m_doc->m_Selection->itemAt(i)->checkChanges(true);
+	//Commit drag created items to undo manager.
+	if (m_doc->m_Selection->itemAt(0)!=NULL)
+	{
+		m_doc->itemAddCommit(m_doc->m_Selection->itemAt(0));
+	}
+	//Make sure the Zoom spinbox and page selector dont have focus if we click on the canvas
+	m_view->m_ScMW->zoomSpinBox->clearFocus();
+	m_view->m_ScMW->pageSelector->clearFocus();
+	if (m_doc->m_Selection->itemAt(0) != 0) // is there the old clip stored for the undo action
+	{
+		currItem = m_doc->m_Selection->itemAt(0);
+		m_doc->nodeEdit.finishTransaction(currItem);
+	}
+}
+
+//CB-->Doc/Fix
+bool CanvasMode_Edit::SeleItem(QMouseEvent *m)
+{
+	const unsigned SELECT_IN_GROUP = Qt::AltModifier;
+	const unsigned SELECT_MULTIPLE = Qt::ShiftModifier;
+	const unsigned SELECT_BENEATH = Qt::ControlModifier;
+	QTransform p;
+	QRectF mpo;
+	PageItem *currItem;
+	m_canvas->m_viewMode.m_MouseButtonPressed = true;
+	FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
+	Mxp = mousePointDoc.x(); //m->x()/m_canvas->scale());
+	Myp = mousePointDoc.y(); //m->y()/m_canvas->scale());
+	double grabRadius = m_doc->guidesPrefs().grabRadius / m_canvas->scale();
+	int MxpS = static_cast<int>(mousePointDoc.x()); //m->x()/m_canvas->scale() + 0*m_doc->minCanvasCoordinate.x());
+	int MypS = static_cast<int>(mousePointDoc.y()); //m->y()/m_canvas->scale() + 0*m_doc->minCanvasCoordinate.y());
+	mpo = QRectF(Mxp-grabRadius, Myp-grabRadius, grabRadius*2, grabRadius*2);
+//	mpo.translate(m_doc->minCanvasCoordinate.x() * m_canvas->scale(), m_doc->minCanvasCoordinate.y() * m_canvas->scale());
+	m_doc->nodeEdit.deselect();
+// 	int a;
+	if (!m_doc->masterPageMode())
+	{
+		int pgNum = -1;
+		int docPageCount = static_cast<int>(m_doc->Pages->count() - 1);
+		MarginStruct pageBleeds;
+		bool drawBleed = false;
+		if (m_doc->bleeds()->hasNonZeroValue() && m_doc->guidesPrefs().showBleed)
+			drawBleed = true;
+		for (int a = docPageCount; a > -1; a--)
+		{
+			if (drawBleed)
+				m_doc->getBleeds(a, pageBleeds);
+			int x = static_cast<int>(m_doc->Pages->at(a)->xOffset() - pageBleeds.Left);
+			int y = static_cast<int>(m_doc->Pages->at(a)->yOffset() - pageBleeds.Top);
+			int w = static_cast<int>(m_doc->Pages->at(a)->width() + pageBleeds.Left + pageBleeds.Right);
+			int h = static_cast<int>(m_doc->Pages->at(a)->height() + pageBleeds.Bottom + pageBleeds.Top);
+			if (QRect(x, y, w, h).contains(MxpS, MypS))
+			{
+				pgNum = static_cast<int>(a);
+				if (drawBleed)  // check again if its really on the correct page
+				{
+					for (int a2 = docPageCount; a2 > -1; a2--)
+					{
+						int xn = static_cast<int>(m_doc->Pages->at(a2)->xOffset());
+						int yn = static_cast<int>(m_doc->Pages->at(a2)->yOffset());
+						int wn = static_cast<int>(m_doc->Pages->at(a2)->width());
+						int hn = static_cast<int>(m_doc->Pages->at(a2)->height());
+						if (QRect(xn, yn, wn, hn).contains(MxpS, MypS))
+						{
+							pgNum = static_cast<int>(a2);
+							break;
+						}
+					}
+				}
+				break;
+			}
+		}
+		if (pgNum >= 0)
+		{
+			if (m_doc->currentPageNumber() != pgNum)
+			{
+				m_doc->setCurrentPage(m_doc->Pages->at(unsigned(pgNum)));
+				m_view->m_ScMW->slotSetCurrentPage(unsigned(pgNum));
+				m_view->DrawNew();
+			}
+		}
+		m_view->setRulerPos(m_view->contentsX(), m_view->contentsY());
+	}
+	
+	currItem = NULL;
+	if ((m->modifiers() & SELECT_BENEATH) != 0)
+	{
+		for (int i=0; i < m_doc->m_Selection->count(); ++i)
+		{
+			if (m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), m_doc->m_Selection->itemAt(i)) >= 0)
+			{
+				currItem = m_doc->m_Selection->itemAt(i);
+				m_doc->m_Selection->removeItem(currItem);
+				break;
+			}
+		}
+	}
+	else if ( (m->modifiers() & SELECT_MULTIPLE) == Qt::NoModifier)
+	{
+		m_view->Deselect(false);
+	}
+	currItem = m_canvas->itemUnderCursor(m->globalPos(), currItem, (m->modifiers() & SELECT_IN_GROUP));
+	if (currItem)
+	{
+		m_doc->m_Selection->delaySignalsOn();
+		if (m_doc->m_Selection->containsItem(currItem))
+		{
+			m_doc->m_Selection->removeItem(currItem);
+		}
+		else
+		{
+			//CB: If we have a selection but the user clicks with control on another item that is not below the current
+			//then clear and select the new item
+			if ((m->modifiers() == SELECT_BENEATH) && m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem) >= 0)
+				m_doc->m_Selection->clear();
+			//CB: #7186: This was prependItem, does not seem to need to be anymore with current select code
+			m_doc->m_Selection->addItem(currItem);
+			if ( (m->modifiers() & SELECT_IN_GROUP) && (!currItem->isGroup()))
+			{
+				currItem->isSingleSel = true;
+			}
+		}
+		m_canvas->update();
+		m_doc->m_Selection->delaySignalsOff();
+		if (m_doc->m_Selection->count() > 1)
+		{
+			m_doc->m_Selection->setGroupRect();
+			double x, y, w, h;
+			m_doc->m_Selection->getGroupRect(&x, &y, &w, &h);
+			m_view->getGroupRectScreen(&x, &y, &w, &h);
+		}
+		if (m_doc->m_Selection->count() == 1)
+		{
+			frameResizeHandle = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem);
+			if ((frameResizeHandle == Canvas::INSIDE) && (!currItem->locked()))
+				m_view->setCursor(QCursor(Qt::SizeAllCursor));
+		}
+		else
+		{
+			m_view->setCursor(QCursor(Qt::SizeAllCursor));
+			m_canvas->m_viewMode.operItemResizing = false;
+		}
+		return true;
+	}
+	m_doc->m_Selection->connectItemToGUI();
+	if ( !(m->modifiers() & SELECT_MULTIPLE))
+		m_view->Deselect(true);
+	return false;
+}
+
+void CanvasMode_Edit::createContextMenu(PageItem* currItem, double mx, double my)
+{
+	ContextMenu* cmen=NULL;
+	m_view->setCursor(QCursor(Qt::ArrowCursor));
+	m_view->setObjectUndoMode();
+	Mxp = mx;
+	Myp = my;
+	if(currItem!=NULL)
+		cmen = new ContextMenu(*(m_doc->m_Selection), m_ScMW, m_doc);
+	else
+		cmen = new ContextMenu(m_ScMW, m_doc, mx, my);
+	if (cmen)
+		cmen->exec(QCursor::pos());
+	m_view->setGlobalUndoMode();
+	delete cmen;
+}




More information about the scribus-commit mailing list