Subversion Repositories Scribus

Rev

Rev 18921 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
12775 jghali 1
/*
2
 For general Scribus (>=1.3.2) copyright and licensing information please refer
3
 to the COPYING file provided with the program. Following this notice may exist
4
 a copyright and/or license notice that predates the release of Scribus 1.3.2
5
 for which a new license (GPL+exception) is in place.
6
 */
7
/***************************************************************************
8
*                                                                         *
9
*   This program is free software; you can redistribute it and/or modify  *
10
*   it under the terms of the GNU General Public License as published by  *
11
*   the Free Software Foundation; either version 2 of the License, or     *
12
*   (at your option) any later version.                                   *
13
*                                                                         *
14
***************************************************************************/
15
 
16
 
17
#include "canvasmode_edit.h"
18
 
19
#include <QApplication>
20
#include <QButtonGroup>
21
#include <QCheckBox>
22
#include <QCursor>
23
#include <QEvent>
24
#include <QMessageBox>
25
#include <QMouseEvent>
26
#include <QPainterPath>
27
#include <QPoint>
28
#include <QRect>
29
#include <QTimer>
30
#include <QWidgetAction>
31
#include <QDebug>
32
 
33
#include "aligndistribute.h"
34
#include "canvas.h"
35
#include "canvasgesture_resize.h"
36
#include "contextmenu.h"
15468 craig 37
#include "hruler.h"
12775 jghali 38
#include "customfdialog.h"
39
#include "fpoint.h"
40
#include "fpointarray.h"
41
#include "hyphenator.h"
42
#include "insertTable.h"
43
#include "pageitem_textframe.h"
44
#include "pageselector.h"
45
#include "prefscontext.h"
46
#include "prefsfile.h"
47
#include "prefsmanager.h"
48
#include "propertiespalette.h"
12809 pierre 49
#include "sccolorengine.h"
12841 jghali 50
#include "scmimedata.h"
12775 jghali 51
#include "scribus.h"
52
#include "scribusdoc.h"
53
#include "scribusview.h"
54
#include "scribusXml.h"
55
#include "selection.h"
56
#include "undomanager.h"
57
#include "units.h"
58
#include "util.h"
59
#include "util_icon.h"
60
#include "util_math.h"
61
 
62
 
63
CanvasMode_Edit::CanvasMode_Edit(ScribusView* view) : CanvasMode(view), m_ScMW(view->m_ScMW)
64
{
65
        Mxp = Myp = -1;
66
        Dxp = Dyp = -1;
67
        oldCp = Cp = -1;
68
        frameResizeHandle = -1;
12809 pierre 69
        m_blinker = new QTimer(view);  
12775 jghali 70
        connect(m_blinker, SIGNAL(timeout()), this, SLOT(blinkTextCursor()));
15468 craig 71
        connect(view->horizRuler, SIGNAL(MarkerMoved(double, double)), this, SLOT(rulerPreview(double, double)));
72
        m_RulerGuide = -1;
16473 craig 73
        m_longCursorTime=false;
12775 jghali 74
}
75
 
76
inline bool CanvasMode_Edit::GetItem(PageItem** pi)
77
{
78
        *pi = m_doc->m_Selection->itemAt(0);
79
        return (*pi) != NULL;
80
}
81
 
82
 
83
void CanvasMode_Edit::blinkTextCursor()
84
{
85
        PageItem* currItem;
86
        if (m_doc->appMode == modeEdit && GetItem(&currItem))
87
        {
88
                QRectF brect = currItem->getBoundingRect();
89
//              qDebug() << "update cursor" << brect;
90
                m_canvas->update(QRectF(m_canvas->canvasToLocal(brect.topLeft()), QSizeF(brect.width(),brect.height())*m_canvas->scale()).toRect());
91
        }
92
}
93
 
16473 craig 94
void CanvasMode_Edit::keyPressEvent(QKeyEvent *e)
95
{
96
        PageItem* currItem;
97
        if (GetItem(&currItem))
98
        {
99
                PageItem_TextFrame* textframe = currItem->asTextFrame();
100
                if (textframe)
101
                {
102
                        m_cursorVisible=true;
103
                        int kk = e->key();
104
                        switch (kk)
105
                        {
106
                                case Qt::Key_PageUp:
107
                                case Qt::Key_PageDown:
108
                                case Qt::Key_Up:
109
                                case Qt::Key_Down:
110
                                case Qt::Key_Home:
111
                                case Qt::Key_End:
112
                                        m_longCursorTime=true;
113
                                        break;
114
                                default:
115
                                        m_longCursorTime=false;
116
                                        break;
117
                        }
118
                        blinkTextCursor();
119
                }
120
        }
121
}
122
 
15468 craig 123
void CanvasMode_Edit::rulerPreview(double base, double xp)
124
{
125
        PageItem* currItem;
126
        if (m_doc->appMode == modeEdit && GetItem(&currItem))
127
        {
128
                QPoint oldP = m_canvas->canvasToLocal(QPointF(m_RulerGuide, currItem->yPos()));
129
                m_RulerGuide = base + xp;
130
                QPoint p = m_canvas->canvasToLocal(QPointF(m_RulerGuide, currItem->yPos() + currItem->height()));
131
                m_canvas->update(QRect(oldP.x()-2, oldP.y(), p.x()+2, p.y()));
132
        }
133
}
134
 
12775 jghali 135
void CanvasMode_Edit::drawControls(QPainter* p)
136
{
14372 jghali 137
        commonDrawControls(p, false);
12775 jghali 138
        PageItem* currItem;
139
        if (GetItem(&currItem))
140
        {
141
                PageItem_TextFrame* textframe = currItem->asTextFrame();
142
                if (textframe)
15468 craig 143
                {
144
                        if (m_RulerGuide >= 0)
145
                        {
146
                                p->save();
147
                                p->translate(currItem->xPos(), currItem->yPos());
148
                                p->rotate(currItem->rotation());
149
                                p->setPen(QPen(Qt::blue, 1.0 / m_canvas->scale(), Qt::DashLine, Qt::FlatCap, Qt::MiterJoin));
150
                                p->setClipRect(QRectF(0.0, 0.0, currItem->width(), currItem->height()));
151
                                p->setBrush(Qt::NoBrush);
152
                                p->setRenderHint(QPainter::Antialiasing);
153
                                if (currItem->imageFlippedH())
154
                                {
155
                                        p->translate(currItem->width(), 0);
156
                                        p->scale(-1, 1);
157
                                }
158
                                if (currItem->imageFlippedV())
159
                                {
160
                                        p->translate(0, currItem->height());
161
                                        p->scale(1, -1);
162
                                }
163
                                p->drawLine(m_RulerGuide - currItem->xPos(), 0, m_RulerGuide - currItem->xPos(), currItem->height());
164
                                p->restore();
165
                        }
12775 jghali 166
                        drawTextCursor(p, textframe);
15468 craig 167
                }
12775 jghali 168
        }
169
}
170
 
171
 
13079 pierre 172
void CanvasMode_Edit::drawTextCursor ( QPainter *p, PageItem_TextFrame* textframe )
12775 jghali 173
{
16473 craig 174
        if ((!m_longCursorTime && m_blinkTime.elapsed() > qApp->cursorFlashTime() / 2 ) ||
175
                (m_longCursorTime && m_blinkTime.elapsed() > qApp->cursorFlashTime() )
176
                )
12775 jghali 177
        {
13079 pierre 178
                m_cursorVisible = !m_cursorVisible;
179
                m_blinkTime.restart();
16473 craig 180
                m_longCursorTime=false;
12775 jghali 181
        }
13079 pierre 182
        if ( m_cursorVisible )
12775 jghali 183
        {
13089 pierre 184
                // Debug
185
//              QString dbgString;
16638 jghali 186
//              int lif(qMax(textframe->itemText.cursorPosition() , textframe->lastInFrame()));
13089 pierre 187
//              for(int ti(textframe->firstInFrame());ti < lif; ++ti)
188
//              {
16638 jghali 189
//                      if(ti == textframe->itemText.cursorPosition() )
13089 pierre 190
//                      {
16638 jghali 191
//                              dbgString += "["+QString::number(textframe->itemText.cursorPosition())+"]";
13089 pierre 192
//                      }
193
//                      dbgString += textframe->itemText.text(ti);
194
//              }
195
//              dbgString +="]"+QString::number(textframe->lastInFrame())+"[";
196
//              qDebug()<<"==============================================================";
197
//              qDebug()<<textframe->CPos<<textframe->lastInFrame();
198
//              qDebug()<<dbgString;
199
//              qDebug()<<"==============================================================";
200
                // end debug
13079 pierre 201
                double dx, dy, dy1;
16662 jghali 202
                QPen cPen ( Qt::black, 1.5 , Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin );
203
                cPen.setCosmetic(true); // #10049 : make cursor line width constant on screen
13079 pierre 204
 
205
                // normalize Current Position
16638 jghali 206
                textframe->itemText.normalizeCursorPosition();
207
                int textCursorPos ( textframe->itemText.cursorPosition() );
13079 pierre 208
 
209
                if ( textframe->lastInFrame() >= signed ( textframe->itemText.nrOfItems() )
210
                        || textframe->itemText.length() == 0 )
211
                {
13106 pierre 212
                        dx = textframe->textToFrameDistLeft();
213
                        dy = textframe->textToFrameDistTop();
13107 pierre 214
                        dy1 = textframe->textToFrameDistTop() + (textframe->itemText.defaultStyle().charStyle().fontSize() / 10.0);
13079 pierre 215
 
216
                        cPen.setColor ( ScColorEngine::getRGBColor ( m_doc->PageColors[textframe->itemText.defaultStyle().charStyle().fillColor() ], m_doc ) );
217
                }
218
                else if ( textCursorPos > textframe->lastInFrame() )
219
                {
220
                        // Happens often when typing directly into frame.
221
                        // And the cursor curses nothing, vertigo.
16835 craig 222
                        textCursorPos = qMax(0, textframe->lastInFrame());
15456 jghali 223
                        QChar textCursorChar = textframe->itemText.text(textCursorPos);
224
                        if (textCursorChar == SpecialChars::PARSEP || textCursorChar == SpecialChars::LINEBREAK)
13089 pierre 225
                        {
226
                                // The cursor must be moved to the beginning of the next line
227
                                FRect bbox = textframe->itemText.boundingBox ( textCursorPos );
228
                                double lineSpacing(textframe->itemText.paragraphStyle(textCursorPos).lineSpacing());
13106 pierre 229
 
230
                                // take care if cursor is not in first column
231
                                int curCol(1);
232
                                double ccPos(textframe->itemText.boundingBox ( textCursorPos ).x());
233
                                double leftOffset(textframe->textToFrameDistLeft());
234
                                for(int ci(1); ci <= textframe->columns(); ++ci)
235
                                {
236
                                        double cLeft(((ci-1) * textframe->columnWidth()) + ((ci -1) * textframe->columnGap()) + leftOffset);
237
                                        double cRight((ci * textframe->columnWidth()) + ((ci -1) * textframe->columnGap()) + leftOffset);
238
                                        if((cLeft <= ccPos) && (ccPos <= cRight))
239
                                        {
240
                                                curCol = ci;
241
                                                break;
242
                                        }
243
                                }
244
                                dx = (textframe->columnWidth() * (curCol - 1)) + (textframe->columnGap() * (curCol - 1))  + leftOffset;
13089 pierre 245
                                dy = bbox.y();
246
 
247
                                if ( bbox.height() <= 2 )
248
                                        dy1 = bbox.y() + textframe->itemText.charStyle ( textCursorPos ).fontSize() / 30.0;
249
                                else
250
                                        dy1 = bbox.y() + bbox.height();
251
 
252
                                dy  += lineSpacing;
253
                                dy1 += lineSpacing;
254
                        }
15456 jghali 255
                        else if (textCursorChar == SpecialChars::COLBREAK)
13098 pierre 256
                        {
257
                                // A bit tricky :)
258
                                // We want to position the cursor at the beginning of the next column, if any.
259
                                // At first we need to know in which column the cursor is.
260
                                int curCol(1);
261
                                double ccPos(textframe->itemText.boundingBox ( textCursorPos ).x());
13106 pierre 262
                                double leftOffset(textframe->textToFrameDistLeft());
13098 pierre 263
                                for(int ci(1); ci <= textframe->columns(); ++ci)
264
                                {
13106 pierre 265
                                        double cLeft(((ci-1) * textframe->columnWidth()) + ((ci -1) * textframe->columnGap()) + leftOffset);
266
                                        double cRight((ci * textframe->columnWidth()) + ((ci -1) * textframe->columnGap()) + leftOffset);
13098 pierre 267
                                        if((cLeft <= ccPos) && (ccPos <= cRight))
268
                                        {
269
                                                curCol = ci;
270
                                                break;
271
                                        }
272
                                }
273
                                if(textframe->columns() > curCol)
274
                                {
13106 pierre 275
                                        dx = (textframe->columnWidth() * curCol) + (textframe->columnGap() * curCol)  + leftOffset;
276
                                        dy = textframe->textToFrameDistTop();
13107 pierre 277
                                        dy1 = textframe->textToFrameDistTop() + textframe->itemText.boundingBox ( textCursorPos ).height();
13098 pierre 278
                                }
279
                                else // there is no column after the current column
280
                                {
281
                                        FRect bbox = textframe->itemText.boundingBox ( textCursorPos );
282
                                        dx = bbox.x();
283
                                        dy = bbox.y();
284
                                        dx += textframe->itemText.item ( textCursorPos )->glyph.wide();
285
                                        if ( bbox.height() <= 2 )
286
                                                dy1 = bbox.y() + textframe->itemText.charStyle ( textCursorPos ).fontSize() / 30.0;
287
                                        else
288
                                                dy1 = bbox.y() + bbox.height();
289
                                }
290
                        }
13079 pierre 291
                        else
13089 pierre 292
                        {
293
                                FRect bbox = textframe->itemText.boundingBox ( textCursorPos );
294
                                dx = bbox.x();
295
                                dy = bbox.y();
296
                                dx += textframe->itemText.item ( textCursorPos )->glyph.wide();
297
                                if ( bbox.height() <= 2 )
298
                                        dy1 = bbox.y() + textframe->itemText.charStyle ( textCursorPos ).fontSize() / 30.0;
299
                                else
300
                                        dy1 = bbox.y() + bbox.height();
301
 
302
                        }
13079 pierre 303
                        cPen.setColor ( ScColorEngine::getRGBColor ( m_doc->PageColors[textframe->itemText.charStyle ( textCursorPos ).fillColor() ], m_doc ) );
304
                }
12775 jghali 305
                else
13079 pierre 306
                {
307
                        FRect bbox = textframe->itemText.boundingBox ( textCursorPos );
308
                        dx = bbox.x();
309
                        dy = bbox.y();
310
                        if ( bbox.height() <= 2 )
311
                                dy1 = bbox.y() + textframe->itemText.charStyle ( textCursorPos ).fontSize() / 30.0;
312
                        else
313
                                dy1 = bbox.y() + bbox.height();
12775 jghali 314
 
13079 pierre 315
                        cPen.setColor ( ScColorEngine::getRGBColor ( m_doc->PageColors[textframe->itemText.charStyle ( textCursorPos ).fillColor() ], m_doc ) );
316
                }
317
                //handle Right to Left writing
18695 jghali 318
                if (textframe->imageFlippedH())
319
                        dx = textframe->width() - dx;
320
                if (textframe->imageFlippedV())
13079 pierre 321
                {
18695 jghali 322
                        dy  = textframe->height() - dy;
323
                        dy1 = textframe->height() - dy1;
13079 pierre 324
                }
325
 
326
                p->save();
327
                p->translate ( textframe->xPos(), textframe->yPos() );
328
                p->rotate ( textframe->rotation() );
329
 
330
                p->setPen ( cPen );
331
                p->setRenderHint ( QPainter::Antialiasing, true );
13061 pierre 332
                // avoid displaying the cursor on the frameborder
13079 pierre 333
                dx = qMax ( ( cPen.widthF() / 2.0 ), dx );
13061 pierre 334
 
13079 pierre 335
                dy =  qMin ( qMax ( dy,0.0 ) , textframe->height() );
336
                dy1 = qMin ( qMax ( dy1,0.0 ), textframe->height() );
13061 pierre 337
 
13079 pierre 338
                p->drawLine ( QLineF ( dx,dy,dx,dy1 ) );
13061 pierre 339
 
13079 pierre 340
                p->restore();
12775 jghali 341
        }
342
}
343
 
344
void CanvasMode_Edit::enterEvent(QEvent *)
345
{
346
        if (!m_canvas->m_viewMode.m_MouseButtonPressed)
347
        {
348
                setModeCursor();
349
        }
350
}
351
 
352
void CanvasMode_Edit::leaveEvent(QEvent *e)
353
{
18921 jghali 354
 
12775 jghali 355
}
356
 
357
void CanvasMode_Edit::activate(bool fromGesture)
358
{
359
//      qDebug() << "CanvasMode_Edit::activate" << fromGesture;
360
        m_canvas->m_viewMode.m_MouseButtonPressed = false;
361
        m_canvas->resetRenderMode();
362
        m_doc->DragP = false;
363
        m_doc->leaveDrag = false;
364
        m_canvas->m_viewMode.operItemMoving = false;
365
        m_canvas->m_viewMode.operItemResizing = false;
366
        m_view->MidButt = false;
367
        Mxp = Myp = -1;
368
        Dxp = Dyp = -1;
369
        oldCp = Cp = -1;
370
        frameResizeHandle = -1;
371
        setModeCursor();
372
        if (fromGesture)
373
        {
374
                m_view->update();
375
        }
15468 craig 376
        m_RulerGuide = -1;
13106 pierre 377
        PageItem * it(0);
14817 fschmid 378
        if (GetItem(&it))
13106 pierre 379
        {
14817 fschmid 380
                if (it->asTextFrame())
16473 craig 381
                {
14817 fschmid 382
                        m_canvas->setupEditHRuler(it, true);
16473 craig 383
                        if (m_doc->appMode == modeEdit)
384
                        {
385
                                m_blinker->start(200);
386
                                m_blinkTime.start();
387
                                m_cursorVisible = true;
388
                                blinkTextCursor();
389
                        }
390
                }
13106 pierre 391
        }
12775 jghali 392
}
393
 
394
void CanvasMode_Edit::deactivate(bool forGesture)
395
{
396
//      qDebug() << "CanvasMode_Edit::deactivate" << forGesture;
397
        m_view->redrawMarker->hide();
398
        if (!forGesture)
15468 craig 399
        {
400
                m_RulerGuide = -1;
12775 jghali 401
                m_blinker->stop();
15468 craig 402
        }
12775 jghali 403
}
404
 
405
void CanvasMode_Edit::mouseDoubleClickEvent(QMouseEvent *m)
406
{
407
        m->accept();
408
        m_canvas->m_viewMode.m_MouseButtonPressed = false;
409
        m_canvas->resetRenderMode();
13285 fschmid 410
//      m_view->stopDragTimer();
12775 jghali 411
        PageItem *currItem = 0;
13054 pierre 412
        if (GetItem(&currItem) && (m_doc->appMode == modeEdit) && currItem->asTextFrame())
12775 jghali 413
        {
16342 mrdocs 414
                currItem->asTextFrame()->lastUndoAction = PageItem::NOACTION;
13054 pierre 415
                //CB if annotation, open the annotation dialog
416
                if (currItem->isAnnotation())
417
                {
418
                        m_view->requestMode(submodeAnnotProps);
419
                }
420
                //otherwise, select between the whitespace
421
                else
15949 craig 422
                {
423
                        if (m->modifiers() & Qt::ControlModifier)
424
                        {
425
                                int start=0, stop=0;
426
 
427
                                if (m->modifiers() & Qt::ShiftModifier)
428
                                {//Double click with Ctrl+Shift in a frame to select few paragraphs
429
                                        uint oldPar = currItem->itemText.nrOfParagraph(oldCp);
16638 jghali 430
                                        uint newPar = currItem->itemText.nrOfParagraph();
15949 craig 431
                                        if (oldPar < newPar)
432
                                        {
433
                                                start = currItem->itemText.startOfParagraph(oldPar);
434
                                                stop = currItem->itemText.endOfParagraph(newPar);
435
                                        }
436
                                        else
437
                                        {
438
                                                start = currItem->itemText.startOfParagraph(newPar);
439
                                                stop = currItem->itemText.endOfParagraph(oldPar);
440
                                        }
441
                                }
442
                                else
443
                                {//Double click with Ctrl in a frame to select a paragraph
16638 jghali 444
                                        oldCp = currItem->itemText.cursorPosition();
15949 craig 445
                                        uint nrPar = currItem->itemText.nrOfParagraph(oldCp);
446
                                        start = currItem->itemText.startOfParagraph(nrPar);
447
                                        stop = currItem->itemText.endOfParagraph(nrPar);
448
                                }
16019 craig 449
                                currItem->itemText.deselectAll();
15949 craig 450
                                currItem->itemText.extendSelection(start, stop);
16638 jghali 451
                                currItem->itemText.setCursorPosition(stop);
15949 craig 452
                        }
453
                        else
454
                        {       //Double click in a frame to select a word
16638 jghali 455
                                oldCp = currItem->itemText.cursorPosition();
456
                                currItem->itemText.setCursorPosition( currItem->itemText.selectWord(currItem->itemText.cursorPosition()) );
15949 craig 457
                        }
16019 craig 458
                        currItem->HasSel = (currItem->itemText.lengthOfSelection() > 0);
13054 pierre 459
                }
460
        }
461
        else
462
        {
12775 jghali 463
                mousePressEvent(m);
464
                return;
465
        }
466
}
467
 
468
 
469
void CanvasMode_Edit::mouseMoveEvent(QMouseEvent *m)
470
{
471
//      const double mouseX = m->globalX();
472
//      const double mouseY = m->globalY();
473
        const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
474
 
475
        m_lastPosWasOverGuide = false;
476
        double newX, newY;
477
        PageItem *currItem;
14636 subik 478
        //bool erf = false;
12775 jghali 479
        m->accept();
13132 pierre 480
        if (commonMouseMove(m))
13128 jghali 481
                return;
12775 jghali 482
        if (GetItem(&currItem))
483
        {
484
                newX = qRound(mousePointDoc.x()); //m_view->translateToDoc(m->x(), m->y()).x());
485
                newY = qRound(mousePointDoc.y()); //m_view->translateToDoc(m->x(), m->y()).y());
486
                if (m_doc->DragP)
487
                        return;
14372 jghali 488
                if (m_canvas->m_viewMode.m_MouseButtonPressed && (m_doc->appMode == modeEdit))
12775 jghali 489
                {
490
                        if (currItem->asImageFrame())
491
                        {
492
                                QMatrix ro;
493
                                ro.rotate(-currItem->rotation());
494
                                QPointF rota = ro.map(QPointF(newX-Mxp,newY-Myp));
495
                                currItem->moveImageInFrame(rota.x()/currItem->imageXScale(), rota.y()/currItem->imageYScale());
496
                //              m_view->updateContents(currItem->getRedrawBounding(m_canvas->scale()));
13289 jghali 497
                                currItem->update();
12775 jghali 498
                                Mxp = newX;
499
                                Myp = newY;
500
                                m_canvas->displayXYHUD(m->globalPos(), currItem->imageXOffset() * currItem->imageXScale(), currItem->imageYOffset() * currItem->imageYScale());
501
                        }
502
                        if (currItem->asTextFrame())
503
                        {
13617 pierre 504
                                int refStartSel(currItem->asTextFrame()->itemText.startOfSelection());
505
                                int refEndSel(currItem->asTextFrame()->itemText.endOfSelection());
12775 jghali 506
                                currItem->itemText.deselectAll();
507
                                currItem->HasSel = false;
13297 pierre 508
                                m_view->slotSetCurs(m->globalPos().x(), m->globalPos().y());
12775 jghali 509
                                //Make sure we dont go here if the old cursor position was not set
510
                                if (oldCp!=-1 && currItem->itemText.length() > 0)
511
                                {
16638 jghali 512
                                        int cPos = currItem->itemText.cursorPosition();
513
                                        if (currItem->itemText.cursorPosition() < oldCp)
12775 jghali 514
                                        {
16638 jghali 515
                                                currItem->itemText.select(cPos, oldCp - cPos);
12775 jghali 516
                                                currItem->HasSel = true;
517
                                        }
16638 jghali 518
                                        if (currItem->itemText.cursorPosition() > oldCp)
12775 jghali 519
                                        {
16638 jghali 520
                                                currItem->itemText.select(oldCp, cPos - oldCp);
12775 jghali 521
                                                currItem->HasSel = true;
522
                                        }
523
                                }
13617 pierre 524
 
12775 jghali 525
                                if(currItem->HasSel)
13132 pierre 526
                                {
12775 jghali 527
                                        m_ScMW->EnableTxEdit();
13132 pierre 528
                                        m_canvas->m_viewMode.operTextSelecting = true;
13617 pierre 529
                                        if((refStartSel != currItem->asTextFrame()->itemText.startOfSelection())
530
                                                || (refEndSel != currItem->asTextFrame()->itemText.endOfSelection()))
531
                                        {
532
                                                QRectF br(currItem->getBoundingRect());
533
                                                m_canvas->update(QRectF(m_canvas->canvasToLocal(br.topLeft()), br.size() * m_canvas->scale()).toRect());
534
                                        }
13132 pierre 535
                                }
12775 jghali 536
                                else
537
                                        m_ScMW->DisableTxEdit();
13617 pierre 538
 
12775 jghali 539
                        }
540
                }
541
                if (!m_canvas->m_viewMode.m_MouseButtonPressed)
542
                {
543
                        if (m_doc->m_Selection->isMultipleSelection())
544
                        {
545
                                setModeCursor();
546
                                return;
547
                        }
548
                        for (int a = 0; a < m_doc->m_Selection->count(); ++a)
549
                        {
550
                                currItem = m_doc->m_Selection->itemAt(a);
551
                                if (currItem->locked())
552
                                        break;
13297 pierre 553
                                int hitTest = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem);
554
                                if(hitTest >= 0)
12775 jghali 555
                                {
17812 craig 556
                                        if(hitTest == Canvas::INSIDE)
12775 jghali 557
                                        {
558
                                                if (currItem->asTextFrame())
18921 jghali 559
                                                        m_view->setCursor(QCursor(Qt::IBeamCursor));
12775 jghali 560
                                                if (currItem->asImageFrame())
18921 jghali 561
                                                        m_view->setCursor(QCursor(loadIcon("HandC.xpm")));
12775 jghali 562
                                        }
563
                                }
564
                                else
565
                                {
12799 pierre 566
//                                      setModeCursor();
18921 jghali 567
                                        m_view->setCursor(QCursor(Qt::ArrowCursor));
12775 jghali 568
                                }
569
                        }
570
                }
571
        }
572
        else
573
        {
574
                if ((m_canvas->m_viewMode.m_MouseButtonPressed) && (m->buttons() & Qt::LeftButton))
575
                {
576
                        newX = qRound(mousePointDoc.x()); //m_view->translateToDoc(m->x(), m->y()).x());
577
                        newY = qRound(mousePointDoc.y()); //m_view->translateToDoc(m->x(), m->y()).y());
578
                        SeRx = newX;
579
                        SeRy = newY;
580
                        /*
581
                        m_view->redrawMarker->setGeometry(QRect(Mxp, Myp, m->globalPos().x() - Mxp, m->globalPos().y() - Myp).normalized());
582
                        */
583
                        QPoint startP = m_canvas->canvasToGlobal(QPointF(Mxp, Myp));
584
                        m_view->redrawMarker->setGeometry(QRect(startP, m->globalPos()).normalized());
585
                        if (!m_view->redrawMarker->isVisible())
586
                                m_view->redrawMarker->show();
587
                        m_view->HaveSelRect = true;
588
                        return;
589
                }
590
        }
591
}
592
 
593
void CanvasMode_Edit::mousePressEvent(QMouseEvent *m)
594
{
595
        const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
596
 
597
        bool inText;
598
        PageItem *currItem;
599
        m_canvas->PaintSizeRect(QRect());
600
        FPoint npf, npf2;
601
        QMatrix pm;
602
        m_canvas->m_viewMode.m_MouseButtonPressed = true;
603
        m_canvas->m_viewMode.operItemMoving = false;
604
        m_view->HaveSelRect = false;
605
        m_doc->DragP = false;
606
        m_doc->leaveDrag = false;
607
        m->accept();
608
        m_view->registerMousePress(m->globalPos());
16886 craig 609
        Mxp = mousePointDoc.x();
610
        Myp = mousePointDoc.y();
12775 jghali 611
        SeRx = Mxp;
612
        SeRy = Myp;
613
        if (m->button() == Qt::MidButton)
614
        {
615
                m_view->MidButt = true;
13124 fschmid 616
                if (m->modifiers() & Qt::ControlModifier)
617
                        m_view->DrawNew();
12775 jghali 618
                return;
619
        }
620
 
621
        frameResizeHandle = 0;
622
        int oldP=0;
623
        if (GetItem(&currItem))
624
        {
625
//              m_view->slotDoCurs(false);
16023 jghali 626
                if ((!currItem->locked() || currItem->isTextFrame()) && !currItem->asLine())
12775 jghali 627
                {
14372 jghali 628
                        FPoint canvasPoint = m_canvas->globalToCanvas(m->globalPos());
629
                        if (m_canvas->frameHitTest(QPointF(canvasPoint.x(), canvasPoint.y()), currItem) < 0)
12775 jghali 630
                        {
15988 jghali 631
                                m_doc->m_Selection->delaySignalsOn();
12775 jghali 632
                                m_view->Deselect(true);
14255 jghali 633
                                bool wantNormal = true;
12775 jghali 634
                                if (SeleItem(m))
635
                                {
636
                                        currItem = m_doc->m_Selection->itemAt(0);
637
                                        if ((currItem->asTextFrame()) || (currItem->asImageFrame()))
13106 pierre 638
                                        {
12775 jghali 639
                                                m_view->requestMode(modeEdit);
14255 jghali 640
                                                wantNormal = false;
13106 pierre 641
                                        }
12775 jghali 642
                                        else
643
                                        {
644
                                                m_view->requestMode(submodePaintingDone);
18921 jghali 645
                                                m_view->setCursor(QCursor(Qt::ArrowCursor));
12775 jghali 646
                                        }
14255 jghali 647
                                        if (currItem->asTextFrame())
16342 mrdocs 648
                                        {
14255 jghali 649
                                                m_view->slotSetCurs(m->globalPos().x(), m->globalPos().y());
21071 jghali 650
                                                oldCp = oldP = currItem->itemText.cursorPosition();
16342 mrdocs 651
                                                currItem->asTextFrame()->lastUndoAction = PageItem::NOACTION;
652
                                        }
12775 jghali 653
                                }
654
                                else
655
                                {
656
                                        m_view->requestMode(submodePaintingDone);
18921 jghali 657
                                        m_view->setCursor(QCursor(Qt::ArrowCursor));
12775 jghali 658
                                }
15988 jghali 659
                                m_doc->m_Selection->delaySignalsOff();
14255 jghali 660
                                if (wantNormal)
661
                                        m_view->requestMode(modeNormal);
12775 jghali 662
                                return;
663
                        }
664
                }
16638 jghali 665
                oldP = currItem->itemText.cursorPosition();
12775 jghali 666
                //CB Where we set the cursor for a click in text frame
667
                if (currItem->asTextFrame())
668
                {
16342 mrdocs 669
                        currItem->asTextFrame()->lastUndoAction = PageItem::NOACTION;
13297 pierre 670
                        inText = m_view->slotSetCurs(m->globalPos().x(), m->globalPos().y());
12775 jghali 671
                        //CB If we clicked outside a text frame to go out of edit mode and deselect the frame
672
                        if (!inText)
673
                        {
674
                                currItem->invalidateLayout();
675
                                m_view->Deselect(true);
676
                                //m_view->slotDoCurs(true);
677
                                m_view->requestMode(modeNormal);
16342 mrdocs 678
                                if (currItem->isTextFrame())
679
                                        currItem->asTextFrame()->lastUndoAction = PageItem::NOACTION;
12775 jghali 680
                                return;
681
                        }
13617 pierre 682
 
13227 fschmid 683
                        if (m->button() != Qt::RightButton)
12775 jghali 684
                        {
15949 craig 685
                                //currItem->asTextFrame()->deselectAll();
13227 fschmid 686
                                //<<CB Add in shift select to text frames
15949 craig 687
                                if (m->modifiers() & Qt::ShiftModifier)
12775 jghali 688
                                {
15949 craig 689
                                        if (currItem->itemText.lengthOfSelection() > 0)
690
                                        {
16638 jghali 691
                                                if (currItem->itemText.cursorPosition() < (currItem->itemText.startOfSelection() + currItem->itemText.endOfSelection()) / 2)
16019 craig 692
                                                {
693
                                                        if (m->modifiers() & Qt::ControlModifier)
16638 jghali 694
                                                                currItem->itemText.setCursorPosition( currItem->itemText.startOfParagraph() );
15949 craig 695
                                                        oldP = currItem->itemText.startOfSelection();
16019 craig 696
                                                }
15949 craig 697
                                                else
16019 craig 698
                                                {
699
                                                        if (m->modifiers() & Qt::ControlModifier)
16638 jghali 700
                                                                currItem->itemText.setCursorPosition( currItem->itemText.endOfParagraph() );
15949 craig 701
                                                        oldP = currItem->itemText.endOfSelection();
16019 craig 702
                                                }
16638 jghali 703
                                                currItem->asTextFrame()->itemText.extendSelection(oldP, currItem->itemText.cursorPosition());
16342 mrdocs 704
                                                currItem->asTextFrame()->lastUndoAction = PageItem::NOACTION;
16638 jghali 705
                                                oldCp = currItem->itemText.cursorPosition();
15949 craig 706
                                        }
707
                                        else
708
                                        {
709
                                                int dir=1;
16638 jghali 710
                                                if (oldCp > currItem->itemText.cursorPosition())
15949 craig 711
                                                        dir=-1;
16019 craig 712
                                                if (m->modifiers() & Qt::ControlModifier) //no selection but Ctrl+Shift+click still select paragraphs
713
                                                {
714
                                                        if (dir == 1)
16638 jghali 715
                                                                currItem->itemText.setCursorPosition( currItem->itemText.endOfParagraph() );
16019 craig 716
                                                        else
16638 jghali 717
                                                                currItem->itemText.setCursorPosition( currItem->itemText.startOfParagraph() );
16019 craig 718
                                                }
719
                                                currItem->asTextFrame()->ExpandSel(dir, oldP);
16342 mrdocs 720
                                                currItem->asTextFrame()->lastUndoAction = PageItem::NOACTION;
15949 craig 721
                                                oldCp = oldP;
722
                                        }
12775 jghali 723
                                }
13227 fschmid 724
                                else //>>CB
12775 jghali 725
                                {
16638 jghali 726
                                        oldCp = currItem->itemText.cursorPosition();
13227 fschmid 727
                                        currItem->itemText.deselectAll();
16342 mrdocs 728
                                        currItem->asTextFrame()->lastUndoAction = PageItem::NOACTION;
13227 fschmid 729
                                        currItem->HasSel = false;
12775 jghali 730
                                }
13227 fschmid 731
                                currItem->emitAllToGUI();
732
                                if (m->button() == Qt::MidButton)
733
                                {
734
                                        m_canvas->m_viewMode.m_MouseButtonPressed = false;
735
                                        m_view->MidButt = false;
736
                                        QString cc;
737
                                        cc = QApplication::clipboard()->text(QClipboard::Selection);
738
                                        if (cc.isNull())
739
                                                cc = QApplication::clipboard()->text(QClipboard::Clipboard);
740
                                        if (!cc.isNull())
741
                                        {
742
                                                // K.I.S.S.:
16342 mrdocs 743
                                                currItem->oldCPos = 0;
13227 fschmid 744
                                                currItem->itemText.insertChars(0, cc, true);
16342 mrdocs 745
                                                currItem->asTextFrame()->updateUndo(PageItem::INS,cc);
13227 fschmid 746
                                                if (m_doc->docHyphenator->AutoCheck)
747
                                                        m_doc->docHyphenator->slotHyphenate(currItem);
748
                                                m_ScMW->BookMarkTxT(currItem);
749
                                                //                                                      m_ScMW->outlinePalette->BuildTree();
750
                                        }
751
                                        else
752
                                        {
753
                                                if (ScMimeData::clipboardHasScribusText())
754
                                                        m_ScMW->slotEditPaste();
755
                                        }
756
                                        currItem->update();
757
                                }
12775 jghali 758
                        }
759
                }
760
                else if (!currItem->asImageFrame() ||
761
                                 m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem) < 0)
762
                {
16342 mrdocs 763
                        m_doc->m_Selection->delaySignalsOn();
12775 jghali 764
                        m_view->Deselect(true);
765
                        if (SeleItem(m))
766
                        {
767
                                currItem = m_doc->m_Selection->itemAt(0);
768
                                if ((currItem->asTextFrame()) || (currItem->asImageFrame()))
13106 pierre 769
                                {
12775 jghali 770
                                        m_view->requestMode(modeEdit);
13106 pierre 771
                                }
12775 jghali 772
                                else
773
                                {
774
                                        m_view->requestMode(submodePaintingDone);
18921 jghali 775
                                        m_view->setCursor(QCursor(Qt::ArrowCursor));
12775 jghali 776
                                }
777
                        }
778
                        else
779
                        {
780
                                m_view->requestMode(submodePaintingDone);
18921 jghali 781
                                m_view->setCursor(QCursor(Qt::ArrowCursor));
12775 jghali 782
                        }
783
                }
784
        }
785
}
786
 
787
 
788
 
789
void CanvasMode_Edit::mouseReleaseEvent(QMouseEvent *m)
790
{
13034 pierre 791
#ifdef GESTURE_FRAME_PREVIEW
792
        clearPixmapCache();
793
#endif // GESTURE_FRAME_PREVIEW
12775 jghali 794
        const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
795
        PageItem *currItem;
796
        m_canvas->m_viewMode.m_MouseButtonPressed = false;
797
        m_canvas->resetRenderMode();
798
        m->accept();
13285 fschmid 799
//      m_view->stopDragTimer();
12775 jghali 800
        if ((GetItem(&currItem)) && (m->button() == Qt::RightButton) && (!m_doc->DragP))
801
        {
802
                createContextMenu(currItem, mousePointDoc.x(), mousePointDoc.y());
803
                return;
804
        }
805
        if (m_view->moveTimerElapsed() && (GetItem(&currItem)))
806
        {
13285 fschmid 807
//              m_view->stopDragTimer();
12775 jghali 808
                m_canvas->setRenderModeUseBuffer(false);
809
                if (!m_doc->m_Selection->isMultipleSelection())
810
                {
811
                        m_doc->setRedrawBounding(currItem);
812
                        currItem->OwnPage = m_doc->OnPage(currItem);
813
                        m_canvas->m_viewMode.operItemResizing = false;
814
                        if (currItem->asLine())
815
                                m_view->updateContents();
816
                }
817
                if (m_canvas->m_viewMode.operItemMoving)
818
                {
819
                        m_view->updatesOn(false);
820
                        if (m_doc->m_Selection->isMultipleSelection())
821
                        {
822
                                if (!m_view->groupTransactionStarted())
823
                                {
824
                                        m_view->startGroupTransaction(Um::Move, "", Um::IMove);
825
                                }
826
                                m_doc->m_Selection->setGroupRect();
827
                                double gx, gy, gh, gw;
828
                                m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
829
                                double nx = gx;
830
                                double ny = gy;
831
                                if (!m_doc->ApplyGuides(&nx, &ny))
832
                                {
833
                                        FPoint npx = m_doc->ApplyGridF(FPoint(gx, gy));
834
                                        FPoint npw = m_doc->ApplyGridF(FPoint(gx+gw, gy+gh));
835
                                        if ((fabs(gx-npx.x())) > (fabs((gx+gw)-npw.x())))
836
                                                nx = npw.x() - gw;
837
                                        else
838
                                                nx = npx.x();
839
                                        if ((fabs(gy-npx.y())) > (fabs((gy+gh)-npw.y())))
840
                                                ny = npw.y() - gh;
841
                                        else
842
                                                ny = npx.y();
843
                                }
844
                                m_doc->moveGroup(nx-gx, ny-gy, false);
845
                                m_doc->m_Selection->setGroupRect();
846
                                m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
847
                                nx = gx+gw;
848
                                ny = gy+gh;
849
                                if (m_doc->ApplyGuides(&nx, &ny))
850
                                        m_doc->moveGroup(nx-(gx+gw), ny-(gy+gh), false);
851
                                m_doc->m_Selection->setGroupRect();
852
                        }
853
                        else
854
                        {
855
                                currItem = m_doc->m_Selection->itemAt(0);
856
                                if (m_doc->useRaster)
857
                                {
858
                                        double nx = currItem->xPos();
859
                                        double ny = currItem->yPos();
860
                                        if (!m_doc->ApplyGuides(&nx, &ny))
861
                                        {
862
                                                m_doc->m_Selection->setGroupRect();
863
                                                double gx, gy, gh, gw;
864
                                                m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
865
                                                FPoint npx = m_doc->ApplyGridF(FPoint(gx, gy));
866
                                                FPoint npw = m_doc->ApplyGridF(FPoint(gx+gw, gy+gh));
867
                                                if ((fabs(gx-npx.x())) > (fabs((gx+gw)-npw.x())))
868
                                                        nx = npw.x() - gw;
869
                                                else
870
                                                        nx = npx.x();
871
                                                if ((fabs(gy-npx.y())) > (fabs((gy+gh)-npw.y())))
872
                                                        ny = npw.y() - gh;
873
                                                else
874
                                                        ny = npx.y();
875
                                        }
876
                                        m_doc->MoveItem(nx-currItem->xPos(), ny-currItem->yPos(), currItem);
877
                                }
878
                                else
879
                                        m_doc->MoveItem(0, 0, currItem, false);
880
                        }
881
                        m_canvas->m_viewMode.operItemMoving = false;
882
                        if (m_doc->m_Selection->isMultipleSelection())
883
                        {
884
                                double gx, gy, gh, gw;
885
                                m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
886
                                FPoint maxSize(gx+gw+m_doc->scratch.Right, gy+gh+m_doc->scratch.Bottom);
887
                                FPoint minSize(gx-m_doc->scratch.Left, gy-m_doc->scratch.Top);
888
                                m_doc->adjustCanvas(minSize, maxSize);
889
                        }
890
                        m_doc->setRedrawBounding(currItem);
891
                        currItem->OwnPage = m_doc->OnPage(currItem);
892
                        if (currItem->OwnPage != -1)
893
                        {
894
                                m_doc->setCurrentPage(m_doc->Pages->at(currItem->OwnPage));
895
                                m_view->setMenTxt(currItem->OwnPage);
896
                        }
897
                        //CB done with emitAllToGUI
898
                        //emit HaveSel(currItem->itemType());
899
                        //EmitValues(currItem);
900
                        //CB need this for? a moved item will send its new data with the new xpos/ypos emits
901
                        //CB TODO And what if we have dragged to a new page. Items X&Y are not updated anyway now
902
                        //currItem->emitAllToGUI();
903
                        m_view->updatesOn(true);
904
                        m_view->updateContents();
905
                }
906
        }
907
        //CB Drag selection performed here
908
        if ((m_doc->m_Selection->count() == 0) && (m_view->HaveSelRect) && (!m_view->MidButt))
909
        {
910
                QRectF Sele = QRectF(Dxp, Dyp, SeRx-Dxp, SeRy-Dyp).normalized();
911
                if (!m_doc->masterPageMode())
912
                {
913
                        uint docPagesCount=m_doc->Pages->count();
914
                        uint docCurrPageNo=m_doc->currentPageNumber();
915
                        for (uint i = 0; i < docPagesCount; ++i)
916
                        {
917
                                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))
918
                                {
919
                                        if (docCurrPageNo != i)
920
                                        {
921
                                                m_doc->setCurrentPage(m_doc->Pages->at(i));
922
                                                m_view->setMenTxt(i);
923
                                        }
924
                                        break;
925
                                }
926
                        }
927
                        m_view->setRulerPos(m_view->contentsX(), m_view->contentsY());
928
                }
929
                int docItemCount=m_doc->Items->count();
930
                if (docItemCount != 0)
931
                {
932
                        m_doc->m_Selection->delaySignalsOn();
933
                        for (int a = 0; a < docItemCount; ++a)
934
                        {
935
                                PageItem* docItem = m_doc->Items->at(a);
936
                                QMatrix p;
937
                                m_canvas->Transform(docItem, p);
938
                                QRegion apr = QRegion(docItem->Clip * p);
939
                                QRect apr2(docItem->getRedrawBounding(1.0));
940
                                if ((m_doc->masterPageMode()) && (docItem->OnMasterPage != m_doc->currentPage()->pageName()))
941
                                        continue;
942
                                if (((Sele.contains(apr.boundingRect())) || (Sele.contains(apr2))) && (docItem->LayerNr == m_doc->activeLayer()) && (!m_doc->layerLocked(docItem->LayerNr)))
943
                                {
944
                                        bool redrawSelection=false;
945
                                        m_view->SelectItemNr(a, redrawSelection);
946
                                }
947
                        }
948
                        m_doc->m_Selection->delaySignalsOff();
949
                        if (m_doc->m_Selection->count() > 1)
950
                        {
951
                                m_doc->m_Selection->setGroupRect();
952
                                double x, y, w, h;
953
                                m_doc->m_Selection->getGroupRect(&x, &y, &w, &h);
954
                                m_view->getGroupRectScreen(&x, &y, &w, &h);
955
                        }
956
                }
957
                m_view->HaveSelRect = false;
958
                m_view->redrawMarker->hide();
959
                m_view->updateContents();
960
        }
961
        if (GetItem(&currItem))
962
        {
963
                if (m_doc->m_Selection->count() > 1)
964
                {
965
                        m_doc->m_Selection->setGroupRect();
966
                        double x, y, w, h;
967
                        m_doc->m_Selection->getGroupRect(&x, &y, &w, &h);
968
                        m_canvas->m_viewMode.operItemMoving = false;
969
                        m_canvas->m_viewMode.operItemResizing = false;
970
                        m_view->updateContents(QRect(static_cast<int>(x-5), static_cast<int>(y-5), static_cast<int>(w+10), static_cast<int>(h+10)));
971
                }
972
                /*else
973
                        currItem->emitAllToGUI();*/
974
        }
975
        m_canvas->setRenderModeUseBuffer(false);
976
        m_doc->DragP = false;
977
        m_doc->leaveDrag = false;
978
        m_canvas->m_viewMode.operItemMoving = false;
979
        m_canvas->m_viewMode.operItemResizing = false;
980
        m_view->MidButt = false;
981
        if (m_view->groupTransactionStarted())
982
        {
983
                for (int i = 0; i < m_doc->m_Selection->count(); ++i)
984
                        m_doc->m_Selection->itemAt(i)->checkChanges(true);
985
                m_view->endGroupTransaction();
986
        }
987
        for (int i = 0; i < m_doc->m_Selection->count(); ++i)
988
                m_doc->m_Selection->itemAt(i)->checkChanges(true);
989
        //Commit drag created items to undo manager.
990
        if (m_doc->m_Selection->itemAt(0)!=NULL)
991
        {
992
                m_doc->itemAddCommit(m_doc->m_Selection->itemAt(0)->ItemNr);
993
        }
994
        //Make sure the Zoom spinbox and page selector dont have focus if we click on the canvas
995
        m_view->zoomSpinBox->clearFocus();
996
        m_view->pageSelector->clearFocus();
997
        if (m_doc->m_Selection->itemAt(0) != 0) // is there the old clip stored for the undo action
998
        {
999
                currItem = m_doc->m_Selection->itemAt(0);
1000
                m_doc->nodeEdit.finishTransaction(currItem);
1001
        }
1002
}
1003
 
1004
//CB-->Doc/Fix
1005
bool CanvasMode_Edit::SeleItem(QMouseEvent *m)
1006
{
1007
        const unsigned SELECT_IN_GROUP = Qt::AltModifier;
1008
        const unsigned SELECT_MULTIPLE = Qt::ShiftModifier;
1009
        const unsigned SELECT_BENEATH = Qt::ControlModifier;
1010
        QMatrix p;
14372 jghali 1011
        QRectF mpo;
12775 jghali 1012
        PageItem *currItem;
1013
        m_canvas->m_viewMode.m_MouseButtonPressed = true;
1014
        FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
16886 craig 1015
        Mxp = mousePointDoc.x();
1016
        Myp = mousePointDoc.y();
12775 jghali 1017
        double grabRadius = m_doc->guidesSettings.grabRad / m_canvas->scale();
16886 craig 1018
        int MxpS = static_cast<int>(mousePointDoc.x());
1019
        int MypS = static_cast<int>(mousePointDoc.y());
12775 jghali 1020
        mpo = QRectF(Mxp-grabRadius, Myp-grabRadius, grabRadius*2, grabRadius*2);
1021
        m_doc->nodeEdit.deselect();
1022
        if (!m_doc->masterPageMode())
1023
        {
1024
                int pgNum = -1;
1025
                int docPageCount = static_cast<int>(m_doc->Pages->count() - 1);
1026
                MarginStruct pageBleeds;
1027
                bool drawBleed = false;
1028
                if (m_doc->bleeds.hasNonZeroValue() && m_doc->guidesSettings.showBleed)
1029
                        drawBleed = true;
1030
                for (int a = docPageCount; a > -1; a--)
1031
                {
1032
                        if (drawBleed)
1033
                                m_doc->getBleeds(a, pageBleeds);
1034
                        int x = static_cast<int>(m_doc->Pages->at(a)->xOffset() - pageBleeds.Left);
1035
                        int y = static_cast<int>(m_doc->Pages->at(a)->yOffset() - pageBleeds.Top);
1036
                        int w = static_cast<int>(m_doc->Pages->at(a)->width() + pageBleeds.Left + pageBleeds.Right);
1037
                        int h = static_cast<int>(m_doc->Pages->at(a)->height() + pageBleeds.Bottom + pageBleeds.Top);
1038
                        if (QRect(x, y, w, h).contains(MxpS, MypS))
1039
                        {
1040
                                pgNum = static_cast<int>(a);
1041
                                if (drawBleed)  // check again if its really on the correct page
1042
                                {
1043
                                        for (int a2 = docPageCount; a2 > -1; a2--)
1044
                                        {
1045
                                                int xn = static_cast<int>(m_doc->Pages->at(a2)->xOffset());
1046
                                                int yn = static_cast<int>(m_doc->Pages->at(a2)->yOffset());
1047
                                                int wn = static_cast<int>(m_doc->Pages->at(a2)->width());
1048
                                                int hn = static_cast<int>(m_doc->Pages->at(a2)->height());
1049
                                                if (QRect(xn, yn, wn, hn).contains(MxpS, MypS))
1050
                                                {
1051
                                                        pgNum = static_cast<int>(a2);
1052
                                                        break;
1053
                                                }
1054
                                        }
1055
                                }
1056
                                break;
1057
                        }
1058
                }
1059
                if (pgNum >= 0)
1060
                {
1061
                        if (m_doc->currentPageNumber() != pgNum)
1062
                        {
1063
                                m_doc->setCurrentPage(m_doc->Pages->at(unsigned(pgNum)));
1064
                                m_view->setMenTxt(unsigned(pgNum));
1065
                                m_view->DrawNew();
1066
                        }
1067
                }
1068
                m_view->setRulerPos(m_view->contentsX(), m_view->contentsY());
1069
        }
1070
 
1071
        currItem = NULL;
1072
        if ((m->modifiers() & SELECT_BENEATH) != 0)
1073
        {
1074
                for (int i=0; i < m_doc->m_Selection->count(); ++i)
1075
                {
1076
                        if (m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), m_doc->m_Selection->itemAt(i)) >= 0)
1077
                        {
1078
                                currItem = m_doc->m_Selection->itemAt(i);
1079
//                              qDebug() << "select item: found BENEATH" << currItem << "groups" << currItem->Groups.count();
1080
                                if (currItem->Groups.count() > 0)
1081
                                {
1082
                                        m_doc->m_Selection->delaySignalsOn();
1083
                                        for (int ga=0; ga<m_doc->Items->count(); ++ga)
1084
                                        {
1085
                                                PageItem* item = m_doc->Items->at(ga);
1086
                                                if (item->Groups.count() != 0)
1087
                                                {
1088
                                                        if (item->Groups.top() == currItem->Groups.top())
1089
                                                        {
1090
                                                                if (m_doc->m_Selection->findItem(item) >= 0)
1091
                                                                {
1092
                                                                        m_doc->m_Selection->removeItem(item);
1093
                                                                }
1094
                                                        }
1095
                                                }
1096
                                        }
1097
                                        m_doc->m_Selection->delaySignalsOff();
1098
                                }
1099
                                else
1100
                                {
1101
                                        m_doc->m_Selection->removeItem(currItem);
1102
                                }
1103
                                break;
1104
                        }
1105
//                      else
1106
//                              qDebug() << "select item: not BENEATH" << QPointF(mousePointDoc.x(),mousePointDoc.y()) 
1107
//                                      << m_doc->m_Selection->itemAt(i)->getTransform() 
1108
//                                      << m_doc->m_Selection->itemAt(i)->getBoundingRect();
1109
                }
1110
        }
1111
        else if ( (m->modifiers() & SELECT_MULTIPLE) == Qt::NoModifier)
1112
        {
1113
                m_view->Deselect(false);
1114
        }
1115
 
1116
//      qDebug() << "select item: beneath" << (m->modifiers() & SELECT_BENEATH) << currItem 
1117
//              << "multi" << (m->modifiers() & SELECT_MULTIPLE)
1118
//              << "current sel" << m_doc->m_Selection->count();
1119
        currItem = m_canvas->itemUnderCursor(m->globalPos(), currItem, (m->modifiers() & SELECT_IN_GROUP));
1120
//      qDebug() << "item under cursor: " << currItem;
1121
        if (currItem)
1122
        {
1123
                m_doc->m_Selection->delaySignalsOn();
1124
                if (m_doc->m_Selection->containsItem(currItem))
1125
                {
1126
                        m_doc->m_Selection->removeItem(currItem);
1127
                }
1128
                else
1129
                {
1130
                        //CB: If we have a selection but the user clicks with control on another item that is not below the current
1131
                        //then clear and select the new item
1132
                        if ((m->modifiers() == SELECT_BENEATH) && m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem) >= 0)
1133
                                m_doc->m_Selection->clear();
1134
                        //CB: #7186: This was prependItem, does not seem to need to be anymore with current select code
1135
                        m_doc->m_Selection->addItem(currItem);
1136
                        if ( (m->modifiers() & SELECT_IN_GROUP) && (!currItem->isGroupControl))
1137
                        {
1138
                                currItem->isSingleSel = true;
1139
                        }
1140
                        else if (currItem->Groups.count() > 0)
1141
                        {
1142
                                for (int ga=0; ga<m_doc->Items->count(); ++ga)
1143
                                {
1144
                                        PageItem* item = m_doc->Items->at(ga);
1145
                                        if (item->Groups.count() != 0)
1146
                                        {
1147
                                                if (item->Groups.top() == currItem->Groups.top())
1148
                                                {
1149
                                                        if (item->ItemNr != currItem->ItemNr)
1150
                                                        {
1151
                                                                if (m_doc->m_Selection->findItem(item) == -1)
1152
                                                                {
1153
                                                                        m_doc->m_Selection->addItem(item, true);
1154
                                                                }
1155
                                                        }
1156
                                                        item->isSingleSel = false;
1157
                                                }
1158
                                        }
1159
                                }
1160
                        }
1161
                }
1162
 
13132 pierre 1163
//              currItem->update();
1164
                m_canvas->update();
12775 jghali 1165
                m_doc->m_Selection->delaySignalsOff();
1166
                if (m_doc->m_Selection->count() > 1)
1167
                {
13132 pierre 1168
//                      for (int aa = 0; aa < m_doc->m_Selection->count(); ++aa)
1169
//                      {
1170
//                              PageItem *bb = m_doc->m_Selection->itemAt(aa);
1171
//                              bb->update();
1172
//                      }
12775 jghali 1173
                        m_doc->m_Selection->setGroupRect();
1174
                        double x, y, w, h;
1175
                        m_doc->m_Selection->getGroupRect(&x, &y, &w, &h);
1176
                        //                                      emit ItemPos(x, y);
1177
                        //                                      emit ItemGeom(w, h);
1178
                        m_view->getGroupRectScreen(&x, &y, &w, &h);
1179
                        //                                      m_view->updateContents(QRect(static_cast<int>(x-5), static_cast<int>(y-5), static_cast<int>(w+10), static_cast<int>(h+10)));
1180
                        //                                      emit HaveSel(currItem->itemType());
1181
                }
1182
                if (m_doc->m_Selection->count() == 1)
1183
                {
1184
                        frameResizeHandle = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem);
1185
                        if ((frameResizeHandle == Canvas::INSIDE) && (!currItem->locked()))
18921 jghali 1186
                                m_view->setCursor(QCursor(Qt::SizeAllCursor));
12775 jghali 1187
                }
1188
                else
1189
                {
18921 jghali 1190
                        m_view->setCursor(QCursor(Qt::SizeAllCursor));
12775 jghali 1191
                        m_canvas->m_viewMode.operItemResizing = false;
1192
                }
1193
                return true;
1194
        }
1195
 
1196
        //m_doc->m_Selection->setIsGUISelection(true);
1197
        m_doc->m_Selection->connectItemToGUI();
1198
        if ( !(m->modifiers() & SELECT_MULTIPLE))
1199
                m_view->Deselect(true);
1200
        return false;
1201
}
1202
 
1203
void CanvasMode_Edit::createContextMenu(PageItem* currItem, double mx, double my)
1204
{
1205
        ContextMenu* cmen=NULL;
18921 jghali 1206
        m_view->setCursor(QCursor(Qt::ArrowCursor));
12775 jghali 1207
        m_view->setObjectUndoMode();
1208
        Mxp = mx;
1209
        Myp = my;
1210
        if(currItem!=NULL)
1211
                cmen = new ContextMenu(*(m_doc->m_Selection), m_ScMW, m_doc);
1212
        else
1213
                cmen = new ContextMenu(m_ScMW, m_doc, mx, my);
1214
        if (cmen)
1215
                cmen->exec(QCursor::pos());
1216
        m_view->setGlobalUndoMode();
1217
        delete cmen;
1218
}