Subversion Repositories Scribus

Rev

Rev 15372 | Rev 15377 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
12765 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_normal.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_linemove.h"
36
#include "canvasgesture_resize.h"
37
#include "canvasgesture_rulermove.h"
38
#include "contextmenu.h"
39
#include "customfdialog.h"
40
#include "fpoint.h"
41
#include "fpointarray.h"
42
#include "hyphenator.h"
43
#include "insertTable.h"
44
#include "pageitem_textframe.h"
45
#include "pageselector.h"
46
#include "prefscontext.h"
47
#include "prefsfile.h"
48
#include "prefsmanager.h"
49
#include "propertiespalette.h"
12841 jghali 50
#include "scmimedata.h"
12765 jghali 51
#include "scribus.h"
52
#include "scribusdoc.h"
53
#include "scribusview.h"
54
#include "scribusXml.h"
55
#include "selection.h"
56
#include "stencilreader.h"
57
#include "undomanager.h"
58
#include "units.h"
59
#include "util.h"
60
#include "util_icon.h"
61
#include "util_math.h"
62
#include "loadsaveplugin.h"
63
#include "fileloader.h"
64
#include "plugins/formatidlist.h"
65
 
66
 
67
 
68
CanvasMode_Normal::CanvasMode_Normal(ScribusView* view) : CanvasMode(view), m_ScMW(view->m_ScMW)
69
{
70
        GxM = GyM = -1;
71
        MoveGX = MoveGY = false;
72
        frameResizeHandle = -1;
73
        shiftSelItems = false;
74
        resizeGesture = NULL;
75
        lineMoveGesture = NULL;
76
        guideMoveGesture = NULL;
13035 jghali 77
        m_mousePressPoint.setXY(0, 0);
78
        m_mouseCurrentPoint.setXY(0, 0);
79
        m_mouseSavedPoint.setXY(0, 0);
80
        m_objectDeltaPos.setXY(0,0 );
12765 jghali 81
}
82
 
83
inline bool CanvasMode_Normal::GetItem(PageItem** pi)
84
{
85
        *pi = m_doc->m_Selection->itemAt(0);
86
        return (*pi) != NULL;
87
}
88
 
89
void CanvasMode_Normal::drawControls(QPainter* p)
90
{
91
//      qDebug() << "CanvasMode_Normal::drawControls";
92
        if (m_canvas->m_viewMode.operItemMoving)
93
        {
13035 jghali 94
                drawOutline(p, 1.0, 1.0, m_objectDeltaPos.x(), m_objectDeltaPos.y());
12765 jghali 95
        }
96
        else
97
        {
14372 jghali 98
                drawSelection(p, true);
12765 jghali 99
        }
100
}
101
 
102
void CanvasMode_Normal::enterEvent(QEvent *)
103
{
104
        if (!m_canvas->m_viewMode.m_MouseButtonPressed)
105
        {
106
                setModeCursor();
107
        }
108
}
109
 
110
void CanvasMode_Normal::leaveEvent(QEvent *e)
111
{
112
        if (!m_canvas->m_viewMode.m_MouseButtonPressed)
12858 pierre 113
        {
12765 jghali 114
                qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
12858 pierre 115
        }
12765 jghali 116
}
117
 
118
 
119
void CanvasMode_Normal::activate(bool fromGesture)
120
{
121
//      qDebug() << "CanvasMode_Normal::activate" << fromGesture;
122
        m_canvas->m_viewMode.m_MouseButtonPressed = false;
123
        m_canvas->resetRenderMode();
124
        m_doc->DragP = false;
125
        m_doc->leaveDrag = false;
126
        m_canvas->m_viewMode.operItemMoving = false;
127
        m_canvas->m_viewMode.operItemResizing = false;
128
        m_view->MidButt = false;
13035 jghali 129
        m_mousePressPoint.setXY(0, 0);
130
        m_mouseCurrentPoint.setXY(0, 0);
131
        m_mouseSavedPoint.setXY(0, 0);
132
        m_objectDeltaPos.setXY(0,0 );
12765 jghali 133
        GxM = GyM = -1;
134
        MoveGX = MoveGY = false;
135
        frameResizeHandle = -1;
136
        shiftSelItems = false;
137
        setModeCursor();
138
        if (fromGesture)
139
        {
140
                m_view->update();
141
        }
142
}
143
 
144
void CanvasMode_Normal::deactivate(bool forGesture)
145
{
146
//      qDebug() << "CanvasMode_Normal::deactivate" << forGesture;
147
        m_view->redrawMarker->hide();
148
}
149
 
150
void CanvasMode_Normal::mouseDoubleClickEvent(QMouseEvent *m)
151
{
152
        m->accept();
153
        m_canvas->m_viewMode.m_MouseButtonPressed = false;
154
        m_canvas->resetRenderMode();
13285 fschmid 155
//      m_view->stopDragTimer();
12765 jghali 156
        PageItem *currItem = 0;
157
        if (m_doc->m_Selection->isMultipleSelection())
158
        {
159
                if (GetItem(&currItem))
160
                {
161
                        /* CB: old code, removing this as shift-alt select on an unselected table selects a cell now.
162
                        //#6789 is closed by sorting this.
163
                        if (currItem->isTableItem)
164
                        {
165
                                m_view->Deselect(false);
166
                                m_doc->m_Selection->addItem(currItem);
167
                                currItem->isSingleSel = true;
168
                                //CB FIXME dont call this if the added item is item 0
169
                                if (!m_doc->m_Selection->primarySelectionIs(currItem))
170
                                        currItem->emitAllToGUI();
171
                                m_view->updateContents(currItem->getRedrawBounding(m_canvas->scale()));
172
                        }*/
173
                }
174
                return;
175
        }
176
        if (GetItem(&currItem))
177
        {
178
                if (currItem->asLatexFrame())
179
                {
180
                        if ((currItem->locked()) || (!currItem->ScaleType))
181
                        {
182
                                return;
183
                        }
184
                        if (currItem->imageShown())
185
                                m_view->requestMode(modeEdit);
186
                }
187
                else if ((currItem->itemType() == PageItem::Polygon) || (currItem->itemType() == PageItem::PolyLine) || (currItem->itemType() == PageItem::ImageFrame) || (currItem->itemType() == PageItem::PathText))
188
                {
189
                        if ((currItem->locked()) || (!currItem->ScaleType))
190
                        {
191
                                //mousePressEvent(m);
192
                                return;
193
                        }
194
                        //If we double click on an image frame and theres no image assigned, open the
195
                        //load picture dialog, else put it into edit mode if the frame is set to show the image
196
                        if (currItem->itemType() == PageItem::ImageFrame)
197
                        {
198
                                if (currItem->Pfile.isEmpty())
199
                                        m_view->requestMode(submodeLoadPic);
13097 subik 200
                                else if (!currItem->PictureIsAvailable)
12765 jghali 201
                                        m_view->requestMode(submodeStatusPic);
202
                                else if (currItem->imageShown())
203
                                        m_view->requestMode(modeEdit);
204
                        }
205
                        else if (currItem->itemType() == PageItem::TextFrame)
13106 pierre 206
                        {
12765 jghali 207
                                m_view->requestMode(modeEdit);
13106 pierre 208
                        }
12765 jghali 209
                        else
210
                                m_view->requestMode(modeEditClip);                             
211
                }
212
                else if (currItem->itemType() == PageItem::TextFrame)
213
                {
214
                        //CB old code
215
                        //emit currItem->isAnnotation() ? AnnotProps() : Amode(modeEdit);
216
                        //mousePressEvent(m);
217
                        //CB if annotation, open the annotation dialog
218
                        if (currItem->isAnnotation())
219
                        {
220
                                m_view->requestMode(submodeAnnotProps);
221
                                //mousePressEvent(m);
222
                        }
223
                        //else if not in mode edit, set mode edit
224
                        else if (m_doc->appMode != modeEdit)
225
                        {
226
                                m_view->requestMode(modeEdit);
13297 pierre 227
                                m_view->slotSetCurs(m->globalPos().x(), m->globalPos().y());
12765 jghali 228
                                //CB ignore the double click and go with a single one
229
                                //if we werent in mode edit before.
230
                                //unsure if this is correct, but its ok given we had no
231
                                //double click select until now.
232
//                              mousePressEvent(m);
233
                        }
234
                }
235
        }
236
}
237
 
238
 
239
void CanvasMode_Normal::mouseMoveEvent(QMouseEvent *m)
240
{
12858 pierre 241
//      qDebug()<<"CanvasMode_Normal::mouseMoveEvent";
12765 jghali 242
//      const double mouseX = m->globalX();
243
//      const double mouseY = m->globalY();
244
        const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
245
 
246
        m_lastPosWasOverGuide = false;
247
        double newX, newY;
248
        PageItem *currItem;
249
        bool erf = false;
250
        m->accept();
251
//      qDebug() << "legacy mode move:" << m->x() << m->y() << m_canvas->globalToCanvas(m->globalPos()).x() << m_canvas->globalToCanvas(m->globalPos()).y();
252
//      emit MousePos(m->x()/m_canvas->scale(),// + m_doc->minCanvasCoordinate.x(), 
253
//                                m->y()/m_canvas->scale()); // + m_doc->minCanvasCoordinate.y());
254
 
13132 pierre 255
        if (commonMouseMove(m))
13128 jghali 256
                return;
13035 jghali 257
        m_mouseCurrentPoint = mousePointDoc;
14999 jghali 258
        bool movingOrResizing = (m_canvas->m_viewMode.operItemMoving || m_canvas->m_viewMode.operItemResizing);
15166 jghali 259
        bool mouseIsOnPage    = (m_doc->OnPage(mousePointDoc.x(), mousePointDoc.y()) != -1);
260
        if ((m_doc->guidesSettings.guidesShown) && (!m_doc->GuideLock) && (!movingOrResizing) && (mouseIsOnPage) )
12765 jghali 261
        {
14995 jghali 262
                // #9002: Resize points undraggable when object is aligned to a guide
263
                // Allow item resize when guides are aligned to item while preserving
264
                // ability to drag guide when guis is in foreground and inside selection
265
                bool enableGuideGesture(false);
266
                Canvas::FrameHandle frameResizeHandle(Canvas::OUTSIDE);
267
                if (m_doc->m_Selection->count() > 0)
12765 jghali 268
                {
14995 jghali 269
                        double gx(0.0), gy(0.0), gw(0.0), gh(0.0);
270
                        m_doc->m_Selection->setGroupRect();
271
                        m_doc->m_Selection->getVisualGroupRect(&gx, &gy, &gw, &gh);
272
                        frameResizeHandle = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), QRectF(gx, gy, gw, gh));
273
                }
274
                enableGuideGesture |= (frameResizeHandle == Canvas::OUTSIDE);
275
                enableGuideGesture |= ((!m_doc->guidesSettings.before) && (frameResizeHandle == Canvas::INSIDE));
276
                if (enableGuideGesture)
277
                {
12765 jghali 278
                        if (!guideMoveGesture)
279
                        {
280
                                guideMoveGesture = new RulerGesture(m_view, RulerGesture::HORIZONTAL);
13165 fschmid 281
                                connect(guideMoveGesture,SIGNAL(guideInfo(int, qreal)), m_ScMW->alignDistributePalette,SLOT(setGuide(int, qreal)));
12765 jghali 282
                        }
283
                        if (guideMoveGesture->mouseHitsGuide(mousePointDoc))
284
                        {
285
                                m_lastPosWasOverGuide = true;
286
                                switch (guideMoveGesture->getMode())
287
                                {
288
                                        case RulerGesture::HORIZONTAL:
289
                                                qApp->changeOverrideCursor(QCursor(Qt::SplitVCursor));
290
                                                break;
291
                                        case RulerGesture::VERTICAL:
292
                                                qApp->changeOverrideCursor(QCursor(Qt::SplitHCursor));
293
                                                break;
294
                                        default:
295
                                                qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
296
                                }
297
                                return;
298
                        }
299
                        // Here removed a bunch of comments which made reading code difficult,
300
                        // there is svn for tracking changes after all. pm
301
                        qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
302
                }
303
        }
15166 jghali 304
        else if (!mouseIsOnPage)
305
        {
306
                QCursor* cursor = qApp->overrideCursor();
307
                if (cursor && ((cursor->shape() == Qt::SplitHCursor) || (cursor->shape() == Qt::SplitVCursor)))
308
                {
309
                        qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
310
                }
311
        }
12765 jghali 312
        if ((GetItem(&currItem)) && (!shiftSelItems))
313
        {
314
                newX = qRound(mousePointDoc.x()); //m_view->translateToDoc(m->x(), m->y()).x());
315
                newY = qRound(mousePointDoc.y()); //m_view->translateToDoc(m->x(), m->y()).y());
13282 pierre 316
                // #0007865
317
                if (/*(((m_view->dragTimerElapsed()) && (m->buttons() & Qt::LeftButton)) ||*/
318
                        (m_view->moveTimerElapsed())
319
                        && (m->buttons() & Qt::RightButton)
12765 jghali 320
                        && (m_canvas->m_viewMode.m_MouseButtonPressed)
321
                        && (!m_doc->DragP)  
322
                        && (!(currItem->isSingleSel)))
323
                {
324
                        // start drag
13285 fschmid 325
//                      m_view->stopDragTimer();
13035 jghali 326
                        if ((fabs(m_mousePressPoint.x() - newX) > 10) || (fabs(m_mousePressPoint.y() - newY) > 10))
12765 jghali 327
                        {
328
                                m_canvas->setRenderMode(Canvas::RENDER_NORMAL);
13285 fschmid 329
//                              m_view->resetDragTimer();
12765 jghali 330
                                m_doc->DragP = true;
331
                                m_doc->leaveDrag = false;
332
                                m_doc->DraggedElem = currItem;
333
                                m_doc->DragElements.clear();
334
                                for (int dre=0; dre<m_doc->m_Selection->count(); ++dre)
335
                                        m_doc->DragElements.append(m_doc->m_Selection->itemAt(dre)->ItemNr);
336
                                ScriXmlDoc *ss = new ScriXmlDoc();
12841 jghali 337
                                ScElemMimeData* md = new ScElemMimeData();
338
                                md->setScribusElem(ss->WriteElem(m_doc, m_view, m_doc->m_Selection));
13035 jghali 339
                                delete ss;
340
                                ss = NULL;
12765 jghali 341
                                QDrag* dr = new QDrag(m_view);
342
                                dr->setMimeData(md);
343
                                const QPixmap& pm = loadIcon("DragPix.xpm");
344
                                dr->setDragCursor(pm, Qt::CopyAction);
345
                                dr->setDragCursor(pm, Qt::MoveAction);
346
                                dr->setDragCursor(pm, Qt::LinkAction);
347
                                dr->exec();
348
                                m_doc->DragP = false;
349
                                m_doc->leaveDrag = false;
350
                                m_canvas->m_viewMode.m_MouseButtonPressed = false;
351
                                m_doc->DraggedElem = 0;
352
                                m_doc->DragElements.clear();
353
                                qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
354
                                m_view->updateContents();
355
                        }
356
                        return;
357
                }
358
                if (m_doc->DragP)
359
                        return;
360
                //Operations run here:
361
                //Item resize, esp after creating a new one
362
                if (m_view->moveTimerElapsed() && m_canvas->m_viewMode.m_MouseButtonPressed && (m->buttons() & Qt::LeftButton) &&
363
                        ((m_doc->appMode == modeNormal)) && (!currItem->locked()))
364
                {
13285 fschmid 365
//                      m_view->stopDragTimer();
13035 jghali 366
                        if (!m_canvas->m_viewMode.operItemResizing)
12765 jghali 367
                        {
368
                                //Dragging an item (plus more?)
369
                                QRectF newPlace;
370
                                newX = mousePointDoc.x(); //static_cast<int>(m->x()/sc);
371
                                newY = mousePointDoc.y(); //static_cast<int>(m->y()/sc);
372
                                m_canvas->m_viewMode.operItemMoving = true;
12858 pierre 373
                                qApp->changeOverrideCursor(Qt::ClosedHandCursor);
12765 jghali 374
                                erf = false;
13035 jghali 375
                                int dX = qRound(newX - m_mousePressPoint.x()), dY = qRound(newY - m_mousePressPoint.y());
12765 jghali 376
                                if (!m_doc->m_Selection->isMultipleSelection())
377
                                {
378
                                        erf=true;
379
                                        currItem = m_doc->m_Selection->itemAt(0);
380
                                        //Control Alt drag image in frame without being in edit mode
381
                                        if ((currItem->asImageFrame()) && (m->modifiers() & Qt::ControlModifier) && (m->modifiers() & Qt::AltModifier))
382
                                        {
383
                                                currItem->moveImageInFrame(dX/currItem->imageXScale(),dY/currItem->imageYScale());
384
                                                m_view->updateContents(currItem->getRedrawBounding(m_canvas->scale()));
385
                                        }
386
                                        else
387
                                        {
388
                                                //Dragging orthogonally - Ctrl Drag
389
                                                if ((m->modifiers() & Qt::ControlModifier) && !(m->modifiers() & Qt::ShiftModifier) && !(m->modifiers() & Qt::AltModifier))
390
                                                {
391
                                                        if (abs(dX) > abs(dY))
392
                                                                dY=0;
393
                                                        else
394
                                                        if (abs(dY) > abs(dX))
395
                                                                dX=0;
396
                                                        erf=false;
397
                                                        dX+=qRound(dragConstrainInitPtX-currItem->xPos());
398
                                                        dY+=qRound(dragConstrainInitPtY-currItem->yPos());
399
                                                }
400
                                                if (!(currItem->isTableItem && currItem->isSingleSel))
401
                                                {
402
                                                        double gx, gy, gh, gw;
13035 jghali 403
                                                        m_objectDeltaPos.setXY(dX, dY);
12765 jghali 404
                                                        m_doc->m_Selection->setGroupRect();
405
                                                        m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
406
                                                        if (m_doc->SnapGuides)
407
                                                        {
13035 jghali 408
                                                                double nx = gx + m_objectDeltaPos.x();
409
                                                                double ny = gy + m_objectDeltaPos.y();
410
                                                                double nxo = nx, nyo = ny;
12765 jghali 411
                                                                m_doc->ApplyGuides(&nx, &ny);
13035 jghali 412
                                                                m_objectDeltaPos += FPoint(nx - nxo, ny - nyo);
413
                                                                nx = nxo = gx + gw + m_objectDeltaPos.x();
414
                                                                ny = nyo = gy + gh + m_objectDeltaPos.y();
12765 jghali 415
                                                                m_doc->ApplyGuides(&nx, &ny);
13035 jghali 416
                                                                m_objectDeltaPos += FPoint(nx-nxo, ny-nyo);
12765 jghali 417
                                                        }
418
                                                        if (m_doc->useRaster)
419
                                                        {
420
                                                                m_doc->m_Selection->setGroupRect();
421
                                                                double gx, gy, gh, gw, gxo, gyo;
422
                                                                m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
13035 jghali 423
                                                                gx += m_objectDeltaPos.x();
424
                                                                gy += m_objectDeltaPos.y();
12765 jghali 425
                                                                gxo = gx;
426
                                                                gyo = gy;
427
                                                                FPoint npx = m_doc->ApplyGridF(FPoint(gx, gy));
428
                                                                FPoint npw = m_doc->ApplyGridF(FPoint(gx+gw, gy+gh));
429
                                                                if ((fabs(gx-npx.x())) > (fabs((gx+gw)-npw.x())))
430
                                                                        gx = npw.x() - gw;
431
                                                                else
432
                                                                        gx = npx.x();
433
                                                                if ((fabs(gy-npx.y())) > (fabs((gy+gh)-npw.y())))
434
                                                                        gy = npw.y() - gh;
435
                                                                else
436
                                                                        gy = npx.y();
13035 jghali 437
                                                                if ((fabs(gx - gxo) < (m_doc->guidesSettings.guideRad) / m_canvas->scale()) && (fabs(gy - gyo) < (m_doc->guidesSettings.guideRad) / m_canvas->scale()))
438
                                                                        m_objectDeltaPos += FPoint(gx-gxo, gy-gyo);
12765 jghali 439
                                                        }
440
                                                }
441
                                        }
442
                                }
443
                                else
444
                                {
445
                                        double gx, gy, gh, gw;
446
                                        m_doc->m_Selection->setGroupRect();
447
                                        m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
13035 jghali 448
                                        int dX=qRound(newX - m_mousePressPoint.x()), dY=qRound(newY - m_mousePressPoint.y());
12765 jghali 449
                                        erf = true;
450
                                        if (m->modifiers() & Qt::ControlModifier)
451
                                        {
452
                                                if (abs(dX)>abs(dY))
453
                                                        dY=0;
454
                                                else
455
                                                if (abs(dY)>abs(dX))
456
                                                        dX=0;
457
                                                erf=false;
458
                                                dX+=dragConstrainInitPtX-qRound(gx);
459
                                                dY+=dragConstrainInitPtY-qRound(gy);
460
                                        }
13035 jghali 461
                                        m_objectDeltaPos.setXY(dX, dY);
12765 jghali 462
                                        if (m_doc->SnapGuides)
463
                                        {
464
                                                m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
13035 jghali 465
                                                double nx = gx + m_objectDeltaPos.x();
466
                                                double ny = gy + m_objectDeltaPos.y();
467
                                                double nxo = nx, nyo = ny;
12765 jghali 468
                                                m_doc->ApplyGuides(&nx, &ny);
13035 jghali 469
                                                m_objectDeltaPos += FPoint(nx-nxo, ny-nyo);
470
                                                nx = nxo = gx + gw + m_objectDeltaPos.x();
471
                                                ny = nyo = gy + gh + m_objectDeltaPos.y();
472
                                                m_doc->ApplyGuides(&nx, &ny);
473
                                                m_objectDeltaPos += FPoint(nx-nxo, ny-nyo);
12765 jghali 474
                                        }
475
                                        if (m_doc->useRaster)
476
                                        {
477
                                                double gx, gy, gh, gw, gxo, gyo;
478
                                                m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
13035 jghali 479
                                                gx += m_objectDeltaPos.x();
480
                                                gy += m_objectDeltaPos.y();
12765 jghali 481
                                                gxo = gx;
482
                                                gyo = gy;
483
                                                FPoint npx = m_doc->ApplyGridF(FPoint(gx, gy));
484
                                                FPoint npw = m_doc->ApplyGridF(FPoint(gx+gw, gy+gh));
485
                                                if ((fabs(gx-npx.x())) > (fabs((gx+gw)-npw.x())))
486
                                                        gx = npw.x() - gw;
487
                                                else
488
                                                        gx = npx.x();
489
                                                if ((fabs(gy-npx.y())) > (fabs((gy+gh)-npw.y())))
490
                                                        gy = npw.y() - gh;
491
                                                else
492
                                                        gy = npx.y();
13035 jghali 493
                                                if ((fabs(gx - gxo) < (m_doc->guidesSettings.guideRad) / m_canvas->scale()) && (fabs(gy - gyo) < (m_doc->guidesSettings.guideRad) / m_canvas->scale()))
494
                                                        m_objectDeltaPos += FPoint(gx-gxo, gy-gyo);
12765 jghali 495
                                        }
496
                                }
497
                                if (erf)
498
                                {
13035 jghali 499
                                        m_mouseCurrentPoint.setXY(newX, newY);
12765 jghali 500
                                }
501
 
502
                                {
503
                                        double gx, gy, gh, gw;
504
                                        m_doc->m_Selection->getVisualGroupRect(&gx, &gy, &gw, &gh);
505
                                        m_doc->adjustCanvas(FPoint(gx,gy), FPoint(gx+gw, gy+gh));
506
                                        QPoint selectionCenter = m_canvas->canvasToLocal(QPointF(gx+gw/2, gy+gh/2));
507
                                        QPoint localMousePos = m_canvas->canvasToLocal(mousePointDoc);
508
                                        int localwidth = static_cast<int>(gw * m_canvas->scale());
509
                                        int localheight = static_cast<int>(gh * m_canvas->scale());
510
                                        if (localwidth > 200)
511
                                        {
512
                                                localwidth = 0;
513
                                                selectionCenter.setX(localMousePos.x());
514
                                        }
515
                                        if (localheight > 200)
516
                                        {
517
                                                localheight = 0;
518
                                                selectionCenter.setY(localMousePos.y());
519
                                        }
520
                                        m_view->ensureVisible(selectionCenter.x(), selectionCenter.y(), localwidth/2 + 20, localheight/2 + 20);
521
                                        m_canvas->repaint();
13218 fschmid 522
                                        m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
523
                                        m_canvas->displayCorrectedXYHUD(m->globalPos(), gx + m_objectDeltaPos.x(), gy + m_objectDeltaPos.y());
12765 jghali 524
                                }
525
                        }
526
                }
527
                if ((!m_canvas->m_viewMode.m_MouseButtonPressed) && (m_doc->appMode != modeDrawBezierLine))
528
                {
529
                        if (m_doc->m_Selection->isMultipleSelection())
530
                        {
531
//                              QRect mpo = QRect(qRound(m->x()/m_canvas->scale())-m_doc->guidesSettings.grabRad, qRound(m->y()/m_canvas->scale())-m_doc->guidesSettings.grabRad, m_doc->guidesSettings.grabRad*2, m_doc->guidesSettings.grabRad*2);
532
//                              mpo.moveBy(qRound(m_doc->minCanvasCoordinate.x()), qRound(m_doc->minCanvasCoordinate.y()));
533
                                double gx, gy, gh, gw;
534
                                m_doc->m_Selection->getVisualGroupRect(&gx, &gy, &gw, &gh);
535
                                int how = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), QRectF(gx, gy, gw, gh));
536
//                              if ((QRect(static_cast<int>(gx), static_cast<int>(gy), static_cast<int>(gw), static_cast<int>(gh)).intersects(mpo))
537
                                if (how >= 0)
538
                                {
539
                                        if (how > 0)
540
                                        {
541
                                                setResizeCursor(how);
542
                                        }
543
                                        else
544
                                        {
12858 pierre 545
                                                qApp->changeOverrideCursor(QCursor(Qt::OpenHandCursor));
12765 jghali 546
                                        }
547
                                }
548
                                else
549
                                {
550
                                        setModeCursor();
551
                                }
552
                                return;
553
                        }
554
                        for (int a = 0; a < m_doc->m_Selection->count(); ++a)
555
                        {
556
                                currItem = m_doc->m_Selection->itemAt(a);
557
                                if (currItem->locked())
558
                                        break;
559
                                QMatrix p;
560
                                m_canvas->Transform(currItem, p);
561
                                QRect mpo = QRect(m->x()-m_doc->guidesSettings.grabRad, m->y()-m_doc->guidesSettings.grabRad, m_doc->guidesSettings.grabRad*2, m_doc->guidesSettings.grabRad*2);
562
//                              mpo.moveBy(qRound(m_doc->minCanvasCoordinate.x() * m_canvas->scale()), qRound(m_doc->minCanvasCoordinate.y() * m_canvas->scale()));
563
                                if ((QRegion(p.map(QPolygon(QRect(-3, -3, static_cast<int>(currItem->width()+6), static_cast<int>(currItem->height()+6))))).contains(mpo)))
564
                                {
13035 jghali 565
                                        QRect tx = p.mapRect(QRect(0, 0, static_cast<int>(currItem->width()), static_cast<int>(currItem->height())));
12765 jghali 566
                                        if ((tx.intersects(mpo)) && (!currItem->locked()))
567
                                        {
12858 pierre 568
                                                qApp->changeOverrideCursor(QCursor(Qt::OpenHandCursor));
12765 jghali 569
                                                if (!currItem->sizeLocked())
570
                                                        m_view->HandleCurs(currItem, mpo);
571
                                        }
572
                                }
573
                                else
574
                                {
575
//                                      setModeCursor();
576
                                }
577
                        }
578
                        if (GetItem(&currItem) && m_doc->appMode == modeNormal)
579
                        {
580
                                int how = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem);
581
                                if (how > 0)
12858 pierre 582
                                {
583
                                        if(currItem->asLine())
584
                                                qApp->changeOverrideCursor(QCursor(Qt::SizeAllCursor));
13355 cbradney 585
                                        else if(!currItem->locked() && !currItem->sizeLocked())
12858 pierre 586
                                                setResizeCursor(how, currItem->rotation());
587
                                }
12765 jghali 588
                                else if (how == 0)
12858 pierre 589
                                        qApp->changeOverrideCursor(QCursor(Qt::OpenHandCursor));
12765 jghali 590
                                else
12858 pierre 591
                                {
12765 jghali 592
                                        qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
12858 pierre 593
                                }
12765 jghali 594
                        }
595
                }
596
        }
597
        else
598
        {
599
                if ((m_canvas->m_viewMode.m_MouseButtonPressed) && (m->buttons() & Qt::LeftButton) && (GyM == -1) && (GxM == -1))
600
                {
601
                        newX = qRound(mousePointDoc.x()); //m_view->translateToDoc(m->x(), m->y()).x());
12905 jghali 602
                        newY = qRound(mousePointDoc.y()); //m_view->translateToDoc(m->x(), m->y()).y());
13035 jghali 603
                        m_mouseSavedPoint.setXY(newX, newY);
604
                        QPoint startP = m_canvas->canvasToGlobal(m_mousePressPoint);
12765 jghali 605
                        m_view->redrawMarker->setGeometry(QRect(startP, m->globalPos()).normalized());
606
                        if (!m_view->redrawMarker->isVisible())
607
                                m_view->redrawMarker->show();
608
                        m_view->HaveSelRect = true;
609
                        return;
610
                }
611
        }
612
}
613
 
614
void CanvasMode_Normal::mousePressEvent(QMouseEvent *m)
615
{
12820 pierre 616
//      qDebug("CanvasMode_Normal::mousePressEvent");
12765 jghali 617
        const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
13035 jghali 618
        PageItem *currItem;
12765 jghali 619
 
13035 jghali 620
        m_objectDeltaPos  = FPoint(0, 0);
621
        m_mousePressPoint = m_mouseCurrentPoint = mousePointDoc;
622
        m_mouseSavedPoint = mousePointDoc;
12765 jghali 623
        m_canvas->m_viewMode.m_MouseButtonPressed = true;
624
        m_canvas->m_viewMode.operItemMoving = false;
625
        m_view->HaveSelRect = false;
626
        m_doc->DragP = false;
627
        m_doc->leaveDrag = false;
628
        MoveGX = MoveGY = false;
629
        m->accept();
630
        m_view->registerMousePress(m->globalPos());
631
        QRect mpo(m->x()-m_doc->guidesSettings.grabRad, m->y()-m_doc->guidesSettings.grabRad, m_doc->guidesSettings.grabRad*2, m_doc->guidesSettings.grabRad*2);
632
//      mpo.moveBy(qRound(m_doc->minCanvasCoordinate.x() * m_canvas->scale()), qRound(m_doc->minCanvasCoordinate.y() * m_canvas->scale()));
13035 jghali 633
 
12765 jghali 634
        if (m->button() == Qt::MidButton)
635
        {
636
                m_view->MidButt = true;
13124 fschmid 637
                if (m->modifiers() & Qt::ControlModifier)
638
                        m_view->DrawNew();
12765 jghali 639
                return;
640
        }
641
 
642
        if ((GetItem(&currItem)) && (!m_lastPosWasOverGuide))
643
        {
644
                if ((currItem->asLine()) && (!m_doc->m_Selection->isMultipleSelection()))
645
                {
646
                        if (!lineMoveGesture)
647
                                lineMoveGesture = new LineMove(this);
648
 
649
                        lineMoveGesture->mousePressEvent(m);
650
                        if (lineMoveGesture->haveLineItem())
651
                        {
652
                                m_view->startGesture(lineMoveGesture);
653
                                return;
654
                        }
655
                }
656
                else
657
                {
13355 cbradney 658
                        bool isMS=m_doc->m_Selection->isMultipleSelection();
659
                        if (isMS || (!isMS && (!currItem->locked() && !currItem->sizeLocked())))
12765 jghali 660
                        {
13355 cbradney 661
                                if (!resizeGesture)
662
                                        resizeGesture = new ResizeGesture(this);
663
 
664
                                resizeGesture->mousePressEvent(m);
665
                                if (resizeGesture->frameHandle() > 0)
666
                                {
667
                                        m_view->startGesture(resizeGesture);
668
                                        return;
669
                                }
670
                        }
13377 cbradney 671
//#7928                 else
672
//#7928                         return;
12765 jghali 673
                }
12858 pierre 674
 
675
                qApp->changeOverrideCursor(Qt::ClosedHandCursor);
12765 jghali 676
#if 1                           
677
                if (m_doc->m_Selection->isMultipleSelection())
678
                {
679
                        m_canvas->PaintSizeRect(QRect());
680
                        double gx, gy, gh, gw;
681
                        bool shiftSel = true;
682
                        m_doc->m_Selection->getVisualGroupRect(&gx, &gy, &gw, &gh);
683
                        dragConstrainInitPtX = qRound(gx);
684
                        dragConstrainInitPtY = qRound(gy);
685
                        frameResizeHandle = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), QRectF(gx, gy, gw, gh));
13035 jghali 686
                        if (frameResizeHandle == Canvas::OUTSIDE ||
687
                                (frameResizeHandle == Canvas::INSIDE && m->modifiers() != Qt::NoModifier))
12765 jghali 688
                        {
689
                                frameResizeHandle = 0;
690
                                m_doc->m_Selection->delaySignalsOn();
691
                                m_view->updatesOn(false);
692
                                shiftSel = SeleItem(m);
693
                                m_view->updatesOn(true);
694
                                m_doc->m_Selection->delaySignalsOff();
695
                        }
696
                        if (((m_doc->m_Selection->count() == 0) || (!shiftSel)) && (m->modifiers() == Qt::ShiftModifier))
697
                        {
698
                                shiftSelItems = true;
13035 jghali 699
                                m_mouseCurrentPoint = m_mousePressPoint = m_mouseSavedPoint = mousePointDoc;
12765 jghali 700
                        }
701
                        else
702
                                shiftSelItems = false;
703
                        m_canvas->setRenderModeFillBuffer();
704
                }
705
                else // not multiple selection
706
                {
707
                        dragConstrainInitPtX = qRound(currItem->xPos());
708
                        dragConstrainInitPtY = qRound(currItem->yPos());
709
 
710
                        // dont call SeleItem() without need here:
711
                        frameResizeHandle = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem);
712
                        //#6797
713
                        if (frameResizeHandle <= 0 || m->modifiers() != Qt::NoModifier)
714
                        {
715
                                m_doc->m_Selection->delaySignalsOn();
716
                                m_view->updatesOn(false);
717
                                SeleItem(m); //Where we send the mouse press event to select an item
718
                                if (GetItem(&currItem))
719
                                        frameResizeHandle = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem);
720
                                else
721
                                        frameResizeHandle = 0;
722
                                m_view->updatesOn(true);
723
                                m_doc->m_Selection->delaySignalsOff();
724
                        }
13035 jghali 725
                        if ((currItem && !currItem->locked() && frameResizeHandle > 0) == false)
12765 jghali 726
                        {
13035 jghali 727
                                m_mouseCurrentPoint = m_mousePressPoint = m_mouseSavedPoint = mousePointDoc;
12765 jghali 728
                        }
729
                }
730
                m_canvas->setRenderModeFillBuffer();
731
#endif
732
        }
733
        else // !GetItem()
734
        {
735
                SeleItem(m);
736
                if (m_doc->m_Selection->count() == 0)
737
                {
13035 jghali 738
                        m_mouseCurrentPoint = m_mousePressPoint = m_mouseSavedPoint = mousePointDoc;
12765 jghali 739
                        m_view->redrawMarker->setGeometry(m->globalPos().x(), m->globalPos().y(), 1, 1);
740
                        m_view->redrawMarker->show();
741
                }
742
                else
743
                {
744
                        m_canvas->setRenderModeFillBuffer();
745
                }
746
        }
13035 jghali 747
/*      if (m->button() == MidButton)
12765 jghali 748
        {
749
                MidButt = true;
750
                if (m_doc->m_Selection->count() != 0)
751
                        m_view->Deselect(true);
752
                DrawNew();
753
        } */
754
        if ((m_doc->m_Selection->count() != 0) && (m->button() == Qt::RightButton))
755
        {
756
                m_canvas->m_viewMode.m_MouseButtonPressed = true;
13035 jghali 757
                m_mousePressPoint = m_mouseCurrentPoint;
12765 jghali 758
        }
13285 fschmid 759
// Commented out to fix bug #7865
760
//      if ((m_doc->m_Selection->count() != 0) && (m->button() == Qt::LeftButton) && (frameResizeHandle == 0))
761
//      {
762
//              m_view->startDragTimer();
763
//      }
12820 pierre 764
        m_canvas->PaintSizeRect(QRect());
12765 jghali 765
}
766
 
767
 
768
 
769
void CanvasMode_Normal::mouseReleaseEvent(QMouseEvent *m)
770
{
12820 pierre 771
//      qDebug("CanvasMode_Normal::mouseReleaseEvent");
13034 pierre 772
#ifdef GESTURE_FRAME_PREVIEW
773
        clearPixmapCache();
774
#endif // GESTURE_FRAME_PREVIEW
12765 jghali 775
        const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
776
        PageItem *currItem;
777
        m_canvas->m_viewMode.m_MouseButtonPressed = false;
778
        m_canvas->resetRenderMode();
779
        m->accept();
14693 fschmid 780
        m_view->redrawMarker->hide();
13285 fschmid 781
//      m_view->stopDragTimer();
12765 jghali 782
        //m_canvas->update(); //ugly in a mouseReleaseEvent!!!!!!!
783
        if ((!GetItem(&currItem)) && (m->button() == Qt::RightButton) && (!m_doc->DragP))
784
        {
785
                createContextMenu(NULL, mousePointDoc.x(), mousePointDoc.y());
786
                return;
787
        }
788
        if ((GetItem(&currItem)) && (m->button() == Qt::RightButton) && (!m_doc->DragP))
789
        {
790
                createContextMenu(currItem, mousePointDoc.x(), mousePointDoc.y());
791
                return;
792
        }
793
        if (m_view->moveTimerElapsed() && (GetItem(&currItem)))
794
        {
13285 fschmid 795
//              m_view->stopDragTimer();
12765 jghali 796
                m_canvas->setRenderModeUseBuffer(false);
797
                if (!m_doc->m_Selection->isMultipleSelection())
798
                {
799
                        m_doc->setRedrawBounding(currItem);
800
                        currItem->OwnPage = m_doc->OnPage(currItem);
801
                        m_canvas->m_viewMode.operItemResizing = false;
802
                        if (currItem->asLine())
803
                                m_view->updateContents();
804
                }
805
                if (m_canvas->m_viewMode.operItemMoving)
806
                {
12820 pierre 807
                        // we want to invalidate all frames under the moved frame
12850 pierre 808
                        // hm, I will try to be more explicit :) - pm
13706 jghali 809
                        int itemIndex = m_doc->Items->count();
810
                        PageItem* underItem( m_canvas->itemUnderItem(currItem, itemIndex) );
12850 pierre 811
                        while(underItem)
12820 pierre 812
                        {
813
                                if(underItem->asTextFrame())
814
                                        underItem->asTextFrame()->invalidateLayout();
815
                                else
816
                                        underItem->invalidateLayout();
12850 pierre 817
 
13706 jghali 818
                                underItem =  m_canvas->itemUnderItem(currItem, itemIndex);
12820 pierre 819
                        }
820
 
12765 jghali 821
                        m_view->updatesOn(false);
13035 jghali 822
                        if (!m_view->groupTransactionStarted())
823
                        {
824
                                m_view->startGroupTransaction(Um::Move, "", Um::IMove);
825
                        }
12765 jghali 826
                        if (m_doc->m_Selection->isMultipleSelection())
827
                        {
13035 jghali 828
                                m_doc->moveGroup(m_objectDeltaPos.x(), m_objectDeltaPos.y());
12765 jghali 829
                                m_doc->m_Selection->setGroupRect();
830
                                double gx, gy, gh, gw;
831
                                m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
832
                                double nx = gx;
833
                                double ny = gy;
834
                                if (!m_doc->ApplyGuides(&nx, &ny))
835
                                {
836
                                        FPoint npx = m_doc->ApplyGridF(FPoint(gx, gy));
837
                                        FPoint npw = m_doc->ApplyGridF(FPoint(gx+gw, gy+gh));
838
                                        if ((fabs(gx-npx.x())) > (fabs((gx+gw)-npw.x())))
839
                                                nx = npw.x() - gw;
840
                                        else
841
                                                nx = npx.x();
842
                                        if ((fabs(gy-npx.y())) > (fabs((gy+gh)-npw.y())))
843
                                                ny = npw.y() - gh;
844
                                        else
845
                                                ny = npx.y();
846
                                }
847
                                m_doc->moveGroup(nx-gx, ny-gy, false);
848
                                m_doc->m_Selection->setGroupRect();
849
                                m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
850
                                nx = gx+gw;
851
                                ny = gy+gh;
852
                                if (m_doc->ApplyGuides(&nx, &ny))
853
                                        m_doc->moveGroup(nx-(gx+gw), ny-(gy+gh), false);
854
                                m_doc->m_Selection->setGroupRect();
855
                        }
856
                        else
857
                        {
858
                                currItem = m_doc->m_Selection->itemAt(0);
13035 jghali 859
                                m_doc->MoveItem(m_objectDeltaPos.x(), m_objectDeltaPos.y(), currItem);
12765 jghali 860
                                if (m_doc->useRaster)
861
                                {
862
                                        double nx = currItem->xPos();
863
                                        double ny = currItem->yPos();
864
                                        if (!m_doc->ApplyGuides(&nx, &ny))
865
                                        {
866
                                                m_doc->m_Selection->setGroupRect();
13035 jghali 867
                                                double gx, gy, gh, gw, gxo, gyo;
12765 jghali 868
                                                m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
13035 jghali 869
                                                gxo = gx;
870
                                                gyo = gy;
12765 jghali 871
                                                FPoint npx = m_doc->ApplyGridF(FPoint(gx, gy));
872
                                                FPoint npw = m_doc->ApplyGridF(FPoint(gx+gw, gy+gh));
873
                                                if ((fabs(gx-npx.x())) > (fabs((gx+gw)-npw.x())))
13035 jghali 874
                                                        gx = npw.x() - gw;
12765 jghali 875
                                                else
13035 jghali 876
                                                        gx = npx.x();
12765 jghali 877
                                                if ((fabs(gy-npx.y())) > (fabs((gy+gh)-npw.y())))
13035 jghali 878
                                                        gy = npw.y() - gh;
12765 jghali 879
                                                else
13035 jghali 880
                                                        gy = npx.y();
881
                                                if ((fabs(gx - gxo) < (m_doc->guidesSettings.guideRad) / m_canvas->scale()) && (fabs(gy - gyo) < (m_doc->guidesSettings.guideRad) / m_canvas->scale()))
882
                                                {
883
                                                        nx += (gx - gxo);
884
                                                        ny += (gy - gyo);
885
                                                }
12765 jghali 886
                                        }
887
                                        m_doc->MoveItem(nx-currItem->xPos(), ny-currItem->yPos(), currItem);
888
                                }
889
                        }
890
                        m_canvas->m_viewMode.operItemMoving = false;
891
                        if (m_doc->m_Selection->isMultipleSelection())
892
                        {
893
                                double gx, gy, gh, gw;
894
                                m_doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh);
895
                                FPoint maxSize(gx+gw+m_doc->scratch.Right, gy+gh+m_doc->scratch.Bottom);
896
                                FPoint minSize(gx-m_doc->scratch.Left, gy-m_doc->scratch.Top);
897
                                m_doc->adjustCanvas(minSize, maxSize);
898
                        }
899
                        m_doc->setRedrawBounding(currItem);
900
                        currItem->OwnPage = m_doc->OnPage(currItem);
901
                        if (currItem->OwnPage != -1)
902
                        {
903
                                m_doc->setCurrentPage(m_doc->Pages->at(currItem->OwnPage));
904
                                m_view->setMenTxt(currItem->OwnPage);
905
                        }
906
                        //CB done with emitAllToGUI
907
                        //emit HaveSel(currItem->itemType());
908
                        //EmitValues(currItem);
909
                        //CB need this for? a moved item will send its new data with the new xpos/ypos emits
910
                        //CB TODO And what if we have dragged to a new page. Items X&Y are not updated anyway now
911
                        //currItem->emitAllToGUI();
912
                        m_view->updatesOn(true);
913
                        m_view->updateContents();
914
                }
915
        }
916
        //CB Drag selection performed here
917
        if (((m_doc->m_Selection->count() == 0) && (m_view->HaveSelRect) && (!m_view->MidButt)) || ((shiftSelItems) && (m_view->HaveSelRect) && (!m_view->MidButt)))
918
        {
13046 jghali 919
                double dx = m_mouseSavedPoint.x() - m_mousePressPoint.x();
13035 jghali 920
                double dy = m_mouseSavedPoint.y() - m_mousePressPoint.y();
13046 jghali 921
                QRectF Sele = QRectF(m_mousePressPoint.x(), m_mousePressPoint.y(), dx, dy);
922
                Sele = m_canvas->canvasToLocal(Sele).normalized();
12765 jghali 923
                if (!m_doc->masterPageMode())
924
                {
925
                        uint docPagesCount=m_doc->Pages->count();
926
                        uint docCurrPageNo=m_doc->currentPageNumber();
927
                        for (uint i = 0; i < docPagesCount; ++i)
928
                        {
929
                                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))
930
                                {
931
                                        if (docCurrPageNo != i)
932
                                        {
933
                                                m_doc->setCurrentPage(m_doc->Pages->at(i));
934
                                                m_view->setMenTxt(i);
935
                                        }
936
                                        break;
937
                                }
938
                        }
939
                        m_view->setRulerPos(m_view->contentsX(), m_view->contentsY());
940
                }
941
                int docItemCount=m_doc->Items->count();
942
                if (docItemCount != 0)
943
                {
944
                        m_doc->m_Selection->delaySignalsOn();
945
                        for (int a = 0; a < docItemCount; ++a)
946
                        {
947
                                PageItem* docItem = m_doc->Items->at(a);
13046 jghali 948
                                if ((m_doc->masterPageMode()) && (docItem->OnMasterPage != m_doc->currentPage()->pageName()))
949
                                        continue;
12765 jghali 950
                                QMatrix p;
951
                                m_canvas->Transform(docItem, p);
13288 fschmid 952
                        //      QRegion apr = QRegion(docItem->Clip * p);
14591 jghali 953
                                QRect  apr2 = m_canvas->canvasToLocal( docItem->getCurrentBoundingRect(docItem->lineWidth()) );
13288 fschmid 954
                        //      if (((Sele.contains(apr.boundingRect())) || (Sele.contains(apr2))) && (docItem->LayerNr == m_doc->activeLayer()) && (!m_doc->layerLocked(docItem->LayerNr)))
955
                                if ((Sele.contains(apr2)) && (docItem->LayerNr == m_doc->activeLayer()) && (!m_doc->layerLocked(docItem->LayerNr)))
12765 jghali 956
                                {
957
                                        bool redrawSelection=false;
958
                                        m_view->SelectItemNr(a, redrawSelection);
959
                                }
960
                        }
961
                        m_doc->m_Selection->delaySignalsOff();
962
                        if (m_doc->m_Selection->count() > 1)
963
                        {
964
                                m_doc->m_Selection->setGroupRect();
965
                                double x, y, w, h;
966
                                m_doc->m_Selection->getGroupRect(&x, &y, &w, &h);
967
                                m_view->getGroupRectScreen(&x, &y, &w, &h);
15372 cbradney 968
                                m_ScMW->propertiesPalette->setXY(x,y);
969
                                m_ScMW->propertiesPalette->setBH(w,h);
12765 jghali 970
                        }
971
                }
972
                m_view->HaveSelRect = false;
973
                shiftSelItems = false;
14693 fschmid 974
//              m_view->redrawMarker->hide();
12765 jghali 975
                m_view->updateContents();
976
        }
977
        if (m_doc->appMode != modeEdit)
978
        {
979
                if (!PrefsManager::instance()->appPrefs.stickyTools)
980
                        m_view->requestMode(modeNormal);
981
                else
982
                {
983
                        int appMode = m_doc->appMode;
984
                        m_view->requestMode(appMode);
985
                }
986
        }
987
        if (GetItem(&currItem))
988
        {
12858 pierre 989
                qApp->changeOverrideCursor(QCursor(Qt::OpenHandCursor));
12765 jghali 990
                if (m_doc->m_Selection->count() > 1)
991
                {
992
                        m_doc->m_Selection->setGroupRect();
993
                        double x, y, w, h;
994
                        m_doc->m_Selection->getGroupRect(&x, &y, &w, &h);
995
                        m_canvas->m_viewMode.operItemMoving = false;
996
                        m_canvas->m_viewMode.operItemResizing = false;
997
                        m_view->updateContents(QRect(static_cast<int>(x-5), static_cast<int>(y-5), static_cast<int>(w+10), static_cast<int>(h+10)));
15374 cbradney 998
                        m_ScMW->propertiesPalette->setXY(x,y);
999
                        m_ScMW->propertiesPalette->setBH(w,h);
12765 jghali 1000
                }
12881 jghali 1001
                /*else
1002
                        currItem->emitAllToGUI();*/
12765 jghali 1003
        }
12875 fschmid 1004
        else
1005
                m_view->Deselect(true);
12765 jghali 1006
        m_canvas->setRenderModeUseBuffer(false);
1007
        m_doc->DragP = false;
1008
        m_doc->leaveDrag = false;
1009
        m_canvas->m_viewMode.operItemMoving = false;
1010
        m_canvas->m_viewMode.operItemResizing = false;
1011
        m_view->MidButt = false;
1012
        shiftSelItems = false;
1013
        if (m_view->groupTransactionStarted())
1014
        {
1015
                for (int i = 0; i < m_doc->m_Selection->count(); ++i)
1016
                        m_doc->m_Selection->itemAt(i)->checkChanges(true);
1017
                m_view->endGroupTransaction();
1018
        }
1019
        for (int i = 0; i < m_doc->m_Selection->count(); ++i)
1020
                m_doc->m_Selection->itemAt(i)->checkChanges(true);
1021
        //Commit drag created items to undo manager.
1022
        if (m_doc->m_Selection->itemAt(0)!=NULL)
1023
        {
1024
                m_doc->itemAddCommit(m_doc->m_Selection->itemAt(0)->ItemNr);
1025
        }
1026
        //Make sure the Zoom spinbox and page selector dont have focus if we click on the canvas
1027
        m_view->zoomSpinBox->clearFocus();
1028
        m_view->pageSelector->clearFocus();
1029
        if (m_doc->m_Selection->itemAt(0) != 0) // is there the old clip stored for the undo action
1030
        {
1031
                currItem = m_doc->m_Selection->itemAt(0);
1032
                m_doc->nodeEdit.finishTransaction(currItem);
1033
        }
1034
}
1035
 
1036
//CB-->Doc/Fix
1037
bool CanvasMode_Normal::SeleItem(QMouseEvent *m)
1038
{
12855 pierre 1039
//      qDebug()<<"CanvasMode_Normal::SeleItem";
1040
        m_canvas->m_viewMode.operItemSelecting = true;
12765 jghali 1041
        const unsigned SELECT_IN_GROUP = Qt::AltModifier;
1042
        const unsigned SELECT_MULTIPLE = Qt::ShiftModifier;
1043
        const unsigned SELECT_BENEATH = Qt::ControlModifier;
1044
        QMatrix p;
1045
        PageItem *currItem;
1046
        m_canvas->m_viewMode.m_MouseButtonPressed = true;
1047
        FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
13035 jghali 1048
        m_mouseCurrentPoint  = mousePointDoc;
12765 jghali 1049
        double grabRadius = m_doc->guidesSettings.grabRad / m_canvas->scale();
1050
        int MxpS = static_cast<int>(mousePointDoc.x()); //m->x()/m_canvas->scale() + 0*m_doc->minCanvasCoordinate.x());
1051
        int MypS = static_cast<int>(mousePointDoc.y()); //m->y()/m_canvas->scale() + 0*m_doc->minCanvasCoordinate.y());
13035 jghali 1052
        QRectF mpo(m_mouseCurrentPoint.x()-grabRadius, m_mouseCurrentPoint.y()-grabRadius, grabRadius*2, grabRadius*2);
12765 jghali 1053
//      mpo.translate(m_doc->minCanvasCoordinate.x() * m_canvas->scale(), m_doc->minCanvasCoordinate.y() * m_canvas->scale());
1054
        m_doc->nodeEdit.deselect();
13035 jghali 1055
 
12765 jghali 1056
        if(!m_doc->guidesSettings.before) // guides are on foreground and want to be processed first
1057
        {
14995 jghali 1058
                if ((m_doc->guidesSettings.guidesShown) && (m_doc->OnPage(MxpS, MypS) != -1))
12765 jghali 1059
                {
14995 jghali 1060
                        // #9002: Resize points undraggable when object is aligned to a guide
1061
                        // Allow item resize when guides are aligned to item while preserving
1062
                        // ability to drag guide when guis is in foreground and inside selection
1063
                        bool enableGuideGesture(true);
1064
                        if (m_doc->m_Selection->count() > 0)
12765 jghali 1065
                        {
14995 jghali 1066
                                double gx(0.0), gy(0.0), gw(0.0), gh(0.0);
1067
                                m_doc->m_Selection->setGroupRect();
1068
                                m_doc->m_Selection->getVisualGroupRect(&gx, &gy, &gw, &gh);
1069
                                Canvas::FrameHandle frameResizeHandle = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), QRectF(gx, gy, gw, gh));
1070
                                enableGuideGesture = (frameResizeHandle == Canvas::INSIDE);
12765 jghali 1071
                        }
14995 jghali 1072
                        if (enableGuideGesture)
12765 jghali 1073
                        {
14995 jghali 1074
                                if (!guideMoveGesture)
1075
                                {
1076
                                        guideMoveGesture = new RulerGesture(m_view, RulerGesture::HORIZONTAL);
1077
                                        connect(guideMoveGesture,SIGNAL(guideInfo(int, qreal)), m_ScMW->alignDistributePalette,SLOT(setGuide(int, qreal)));
1078
                                }
1079
                                if ( (!m_doc->GuideLock) && (guideMoveGesture->mouseHitsGuide(mousePointDoc)) )
1080
                                {
1081
                                        m_view->startGesture(guideMoveGesture);
1082
                                        guideMoveGesture->mouseMoveEvent(m);
1083
                                        m_doc->m_Selection->connectItemToGUI();
1084
                                //      qDebug()<<"Out Of SeleItem"<<__LINE__;
1085
                                        return true;
1086
                                }
1087
                                else
1088
                                {
1089
                                //      If we call startGesture now, a new guide is created each time.
1090
                                //      ### could be a weakness to avoid calling it tho.
1091
                                //      m_view->startGesture(guideMoveGesture);
1092
                                        guideMoveGesture->mouseSelectGuide(m);
1093
                                }
12765 jghali 1094
                        }
1095
                }
1096
        }
12855 pierre 1097
        bool pageChanged(false);
12765 jghali 1098
        if (!m_doc->masterPageMode())
1099
        {
1100
                int pgNum = -1;
1101
                int docPageCount = static_cast<int>(m_doc->Pages->count() - 1);
1102
                MarginStruct pageBleeds;
1103
                bool drawBleed = false;
1104
                if (m_doc->bleeds.hasNonZeroValue() && m_doc->guidesSettings.showBleed)
1105
                        drawBleed = true;
1106
                for (int a = docPageCount; a > -1; a--)
1107
                {
1108
                        if (drawBleed)
1109
                                m_doc->getBleeds(a, pageBleeds);
1110
                        int x = static_cast<int>(m_doc->Pages->at(a)->xOffset() - pageBleeds.Left);
1111
                        int y = static_cast<int>(m_doc->Pages->at(a)->yOffset() - pageBleeds.Top);
1112
                        int w = static_cast<int>(m_doc->Pages->at(a)->width() + pageBleeds.Left + pageBleeds.Right);
1113
                        int h = static_cast<int>(m_doc->Pages->at(a)->height() + pageBleeds.Bottom + pageBleeds.Top);
1114
                        if (QRect(x, y, w, h).contains(MxpS, MypS))
1115
                        {
1116
                                pgNum = static_cast<int>(a);
1117
                                if (drawBleed)  // check again if its really on the correct page
1118
                                {
1119
                                        for (int a2 = docPageCount; a2 > -1; a2--)
1120
                                        {
1121
                                                int xn = static_cast<int>(m_doc->Pages->at(a2)->xOffset());
1122
                                                int yn = static_cast<int>(m_doc->Pages->at(a2)->yOffset());
1123
                                                int wn = static_cast<int>(m_doc->Pages->at(a2)->width());
1124
                                                int hn = static_cast<int>(m_doc->Pages->at(a2)->height());
1125
                                                if (QRect(xn, yn, wn, hn).contains(MxpS, MypS))
1126
                                                {
1127
                                                        pgNum = static_cast<int>(a2);
1128
                                                        break;
1129
                                                }
1130
                                        }
1131
                                }
1132
                                break;
1133
                        }
1134
                }
1135
                if (pgNum >= 0)
1136
                {
1137
                        if (m_doc->currentPageNumber() != pgNum)
1138
                        {
1139
                                m_doc->setCurrentPage(m_doc->Pages->at(unsigned(pgNum)));
1140
                                m_view->setMenTxt(unsigned(pgNum));
12855 pierre 1141
                                pageChanged = true;
12765 jghali 1142
                        }
1143
                }
1144
                m_view->setRulerPos(m_view->contentsX(), m_view->contentsY());
1145
        }
1146
 
1147
        currItem = NULL;
1148
        if ((m->modifiers() & SELECT_BENEATH) != 0)
1149
        {
1150
                for (int i=0; i < m_doc->m_Selection->count(); ++i)
1151
                {
1152
                        if (m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), m_doc->m_Selection->itemAt(i)) >= 0)
1153
                        {
1154
                                currItem = m_doc->m_Selection->itemAt(i);
1155
//                              qDebug() << "select item: found BENEATH" << currItem << "groups" << currItem->Groups.count();
1156
                                if (currItem->Groups.count() > 0)
1157
                                {
1158
                                        m_doc->m_Selection->delaySignalsOn();
1159
                                        for (int ga=0; ga<m_doc->Items->count(); ++ga)
1160
                                        {
1161
                                                PageItem* item = m_doc->Items->at(ga);
1162
                                                if (item->Groups.count() != 0)
1163
                                                {
1164
                                                        if (item->Groups.top() == currItem->Groups.top())
1165
                                                        {
1166
                                                                if (m_doc->m_Selection->findItem(item) >= 0)
1167
                                                                {
1168
                                                                        m_doc->m_Selection->removeItem(item);
1169
                                                                }
1170
                                                        }
1171
                                                }
1172
                                        }
1173
                                        m_doc->m_Selection->delaySignalsOff();
1174
                                }
1175
                                else
1176
                                {
1177
                                        m_doc->m_Selection->removeItem(currItem);
1178
                                }
1179
                                break;
1180
                        }
1181
//                      else
1182
//                              qDebug() << "select item: not BENEATH" << QPointF(mousePointDoc.x(),mousePointDoc.y()) 
1183
//                                      << m_doc->m_Selection->itemAt(i)->getTransform() 
1184
//                                      << m_doc->m_Selection->itemAt(i)->getBoundingRect();
1185
                }
1186
        }
1187
        else if ( (m->modifiers() & SELECT_MULTIPLE) == Qt::NoModifier)
1188
        {
1189
                m_view->Deselect(false);
1190
        }
1191
 
1192
//      qDebug() << "select item: beneath" << (m->modifiers() & SELECT_BENEATH) << currItem 
1193
//              << "multi" << (m->modifiers() & SELECT_MULTIPLE)
1194
//              << "current sel" << m_doc->m_Selection->count();
1195
        currItem = m_canvas->itemUnderCursor(m->globalPos(), currItem, (m->modifiers() & SELECT_IN_GROUP));
1196
//      qDebug() << "item under cursor: " << currItem;
1197
        if (currItem)
1198
        {
1199
                m_doc->m_Selection->delaySignalsOn();
1200
                if (m_doc->m_Selection->containsItem(currItem))
1201
                {
1202
                        m_doc->m_Selection->removeItem(currItem);
1203
                }
1204
                else
1205
                {
1206
                        //CB: If we have a selection but the user clicks with control on another item that is not below the current
1207
                        //then clear and select the new item
1208
                        if ((m->modifiers() == SELECT_BENEATH) && m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem) >= 0)
1209
                                m_doc->m_Selection->clear();
1210
                        //CB: #7186: This was prependItem, does not seem to need to be anymore with current select code
1211
                        m_doc->m_Selection->addItem(currItem);
1212
                        if ( (m->modifiers() & SELECT_IN_GROUP) && (!currItem->isGroupControl))
1213
                        {
1214
                                currItem->isSingleSel = true;
1215
                        }
1216
                        else if (currItem->Groups.count() > 0)
1217
                        {
1218
                                for (int ga=0; ga<m_doc->Items->count(); ++ga)
1219
                                {
1220
                                        PageItem* item = m_doc->Items->at(ga);
1221
                                        if (item->Groups.count() != 0)
1222
                                        {
1223
                                                if (item->Groups.top() == currItem->Groups.top())
1224
                                                {
1225
                                                        if (item->ItemNr != currItem->ItemNr)
1226
                                                        {
1227
                                                                if (m_doc->m_Selection->findItem(item) == -1)
1228
                                                                {
1229
                                                                        m_doc->m_Selection->addItem(item, true);
1230
                                                                }
1231
                                                        }
1232
                                                        item->isSingleSel = false;
1233
                                                }
1234
                                        }
1235
                                }
1236
                        }
1237
                }
12855 pierre 1238
                if(pageChanged)
1239
                {
1240
                        m_canvas->m_viewMode.forceRedraw = true;
1241
                        m_canvas->update();
1242
                }
1243
                else
13132 pierre 1244
//                      currItem->update();
1245
                        m_canvas->update();
12850 pierre 1246
 
12765 jghali 1247
                m_doc->m_Selection->delaySignalsOff();
1248
                if (m_doc->m_Selection->count() > 1)
1249
                {
14404 jghali 1250
                        m_doc->beginUpdate();
12765 jghali 1251
                        for (int aa = 0; aa < m_doc->m_Selection->count(); ++aa)
1252
                        {
1253
                                PageItem *bb = m_doc->m_Selection->itemAt(aa);
12850 pierre 1254
                                bb->update();
12765 jghali 1255
                        }
14404 jghali 1256
                        m_doc->endUpdate();
12765 jghali 1257
                        m_doc->m_Selection->setGroupRect();
1258
                        double x, y, w, h;
1259
                        m_doc->m_Selection->getGroupRect(&x, &y, &w, &h);
1260
                        //                                      emit ItemPos(x, y);
1261
                        //                                      emit ItemGeom(w, h);
1262
                        m_view->getGroupRectScreen(&x, &y, &w, &h);
1263
                        //                                      m_view->updateContents(QRect(static_cast<int>(x-5), static_cast<int>(y-5), static_cast<int>(w+10), static_cast<int>(h+10)));
1264
                        //                                      emit HaveSel(currItem->itemType());
1265
                }
12858 pierre 1266
//              if (m_doc->m_Selection->count() == 1)
1267
//              {
1268
//                      frameResizeHandle = m_canvas->frameHitTest(QPointF(mousePointDoc.x(),mousePointDoc.y()), currItem); // HandleSizer(currItem, mpo.toRect(), m);
1269
//                      if ((frameResizeHandle == Canvas::INSIDE) && (!currItem->locked()))
1270
//                      {
1271
//                              qDebug()<<__LINE__<< "QCursor(Qt::OpenHandCursor)"; 
1272
//                              qApp->changeOverrideCursor(QCursor(Qt::OpenHandCursor));
1273
//                      }
1274
//              }
1275
//              else
1276
//              {
1277
//                      qDebug()<<__LINE__<< "QCursor(Qt::OpenHandCursor)";
1278
//                      qApp->changeOverrideCursor(QCursor(Qt::OpenHandCursor));
1279
//              }
12855 pierre 1280
//              qDebug()<<"Out Of SeleItem"<<__LINE__;
12765 jghali 1281
                return true;
1282
        }
1283
        if ((m_doc->guidesSettings.guidesShown) /*&& (!m_doc->GuideLock)*/ && (m_doc->OnPage(MxpS, MypS) != -1))
1284
        {
1285
                if (!guideMoveGesture)
1286
                {
1287
                        guideMoveGesture = new RulerGesture(m_view, RulerGesture::HORIZONTAL);
13165 fschmid 1288
                        connect(guideMoveGesture,SIGNAL(guideInfo(int, qreal)), m_ScMW->alignDistributePalette,SLOT(setGuide(int, qreal)));
12765 jghali 1289
                }
1290
                if ( (!m_doc->GuideLock) && (guideMoveGesture->mouseHitsGuide(mousePointDoc)) )
1291
                {
1292
                        m_view->startGesture(guideMoveGesture);
1293
                        guideMoveGesture->mouseMoveEvent(m);
1294
                        //m_doc->m_Selection->setIsGUISelection(true);
1295
                        m_doc->m_Selection->connectItemToGUI();
12855 pierre 1296
//                      qDebug()<<"Out Of SeleItem"<<__LINE__;
12765 jghali 1297
                        return true;
1298
                }
1299
                else
1300
                {
1301
                        // If we call startGesture now, a new guide is created each time.
1302
                        // ### could be a weakness to avoid calling it tho.
1303
//                      m_view->startGesture(guideMoveGesture);
1304
                        guideMoveGesture->mouseSelectGuide(m);
1305
                }
1306
/*              GxM = -1;
1307
                GyM = -1;
1308
                QMap<double, uint> tmpGuidesSel;
1309
                Guides tmpGuides = m_doc->currentPage()->guides.horizontals(GuideManagerCore::Standard);
1310
                Guides::iterator it;
1311
                uint yg = 0;
1312
                uint xg = 0;
1313
                double lowX = ((m->x() - m_doc->guidesSettings.grabRad) / m_canvas->scale()) + 0*m_doc->minCanvasCoordinate.x();
1314
                double highX = ((m->x() + m_doc->guidesSettings.grabRad) / m_canvas->scale()) + 0*m_doc->minCanvasCoordinate.x();
1315
                double lowY = ((m->y() - m_doc->guidesSettings.grabRad) / m_canvas->scale()) + 0*m_doc->minCanvasCoordinate.y();
1316
                double highY = ((m->y() + m_doc->guidesSettings.grabRad) / m_canvas->scale()) + 0*m_doc->minCanvasCoordinate.y();
1317
                for (it = tmpGuides.begin(); it != tmpGuides.end(); ++it, ++yg)
1318
                {
1319
                        if (((*it) + m_doc->currentPage()->yOffset() < highY) && ((*it)+m_doc->currentPage()->yOffset() > lowY))
1320
                                tmpGuidesSel.insert(fabs(((*it)+m_doc->currentPage()->yOffset()) - MypS), yg);
1321
                }
1322
                if (tmpGuidesSel.count() != 0)
1323
                {
1324
                        GyM = tmpGuidesSel.begin().value();
1325
                        QPoint py = m_view->viewport()->mapFromGlobal(m->globalPos());
1326
                        m_view->DrHY = py.y();
1327
                }
1328
                tmpGuidesSel.clear();
1329
                tmpGuides = m_doc->currentPage()->guides.verticals(GuideManagerCore::Standard);
1330
                for (it = tmpGuides.begin(); it != tmpGuides.end(); ++it, ++xg)
1331
                {
1332
                        if (((*it) + m_doc->currentPage()->xOffset() < highX) && ((*it)+m_doc->currentPage()->xOffset() > lowX))
1333
                                tmpGuidesSel.insert(fabs(((*it)+m_doc->currentPage()->xOffset()) - MypS), xg);
1334
                }
1335
                if (tmpGuidesSel.count() != 0)
1336
                {
1337
                        GxM = tmpGuidesSel.begin().value();
1338
                        QPoint py = m_view->viewport()->mapFromGlobal(m->globalPos());
1339
                        m_view->DrVX = py.x();
1340
                }
1341
                if (GxM!=-1 || GyM!=-1)
1342
                {
1343
                        if (GxM==-1)
1344
                        {
1345
                                // Horizontal Guide
1346
                                MoveGY = true;
1347
//FIXME:av                              emit signalGuideInformation(0, qRound(m_doc->currentPage()->guides.horizontal(GyM, GuideManagerCore::Standard) * 10000.0) / 10000.0);
1348
                        }
1349
                        else
1350
                        {
1351
                                // Vertical Guide
1352
                                MoveGX = true;
1353
//FIXME:av                              emit signalGuideInformation(1, qRound(m_doc->currentPage()->guides.vertical(GxM, GuideManagerCore::Standard) * 10000.0) / 10000.0);
1354
                        }
1355
                }
1356
                */
1357
        }
1358
        //m_doc->m_Selection->setIsGUISelection(true);
1359
        m_doc->m_Selection->connectItemToGUI();
1360
        if ( !(m->modifiers() & SELECT_MULTIPLE))
12855 pierre 1361
        {
1362
                if(m_doc->m_Selection->isEmpty())
1363
                {
1364
                        m_canvas->m_viewMode.forceRedraw = true;
1365
                        m_canvas->update();
1366
                }
1367
                else
1368
                        m_view->Deselect(true);
1369
        }
1370
//      qDebug()<<"Out Of SeleItem"<<__LINE__;
12765 jghali 1371
        return false;
1372
}
1373
 
1374
void CanvasMode_Normal::importToPage()
1375
{
1376
        QString fileName;
1377
        QString allFormats = tr("All Supported Formats")+" (";
1378
        QString formats = "";
1379
        int fmtCode = FORMATID_ODGIMPORT;
1380
        const FileFormat *fmt = LoadSavePlugin::getFormatById(fmtCode);
1381
        while (fmt != 0)
1382
        {
1383
                if (fmt->load)
1384
                {
1385
                        formats += fmt->filter + ";;";
1386
                        int an = fmt->filter.indexOf("(");
1387
                        int en = fmt->filter.indexOf(")");
1388
                        while (an != -1)
1389
                        {
1390
                                allFormats += fmt->filter.mid(an+1, en-an-1)+" ";
1391
                                an = fmt->filter.indexOf("(", en);
1392
                                en = fmt->filter.indexOf(")", an);
1393
                        }
1394
                }
1395
                fmtCode++;
1396
                fmt = LoadSavePlugin::getFormatById(fmtCode);
1397
        }
1398
        allFormats += "*.sce *.SCE ";
1399
        allFormats += "*.shape *.SHAPE ";
1400
        allFormats += "*.sml *.SML);;";
1401
        formats += "Scribus Objects (*.sce *.SCE);;";
1402
        formats += "Dia Shapes (*.shape *.SHAPE);;";
1403
        formats += "Kivio Stencils (*.sml *.SML)";
1404
        allFormats += formats;
1405
        PrefsContext* dirs = PrefsManager::instance()->prefsFile->getContext("dirs");
1406
        QString wdir = dirs->get("pastefile", ".");
13166 fschmid 1407
        FPoint pastePoint = m_mouseCurrentPoint;
12765 jghali 1408
        CustomFDialog dia(m_view, wdir, tr("Open"), allFormats, fdHidePreviewCheckBox | fdExistingFiles);
1409
        if (dia.exec() == QDialog::Accepted)
1410
                fileName = dia.selectedFile();
1411
        else
1412
                return;
1413
        if (!fileName.isEmpty())
1414
        {
1415
                PrefsManager::instance()->prefsFile->getContext("dirs")->set("pastefile", fileName.left(fileName.lastIndexOf("/")));
1416
                m_doc->setLoading(true);
1417
                QFileInfo fi(fileName);
1418
                if (fi.suffix().toLower() == "sml")
1419
                {
1420
                        QString f = "";
1421
                        loadText(fileName, &f);
1422
                        StencilReader *pre = new StencilReader();
1423
                        fileName = pre->createObjects(f);
1424
                        delete pre;
1425
                }
1426
                else if (fi.suffix().toLower() == "shape")
1427
                {
1428
                        QString f = "";
1429
                        loadText(fileName, &f);
1430
                        StencilReader *pre = new StencilReader();
1431
                        fileName = pre->createShape(f);
1432
                        delete pre;
1433
                }
1434
                bool savedAlignGrid = m_doc->useRaster;
1435
                bool savedAlignGuides = m_doc->SnapGuides;
1436
                m_doc->useRaster = false;
1437
                m_doc->SnapGuides = false;
1438
                if (fi.suffix().toLower() == "sce")
13166 fschmid 1439
                        m_ScMW->slotElemRead(fileName, pastePoint.x(), pastePoint.y(), true, false, m_doc, m_doc->view());
12765 jghali 1440
                else if ((fi.suffix().toLower() == "shape") || (fi.suffix().toLower() == "sml"))
13166 fschmid 1441
                        m_ScMW->slotElemRead(fileName, pastePoint.x(), pastePoint.y(), false, true, m_doc, m_doc->view());
12765 jghali 1442
                else
1443
                {
1444
                        FileLoader *fileLoader = new FileLoader(fileName);
1445
                        int testResult = fileLoader->TestFile();
1446
                        delete fileLoader;
1447
                        if ((testResult != -1) && (testResult >= FORMATID_ODGIMPORT))
1448
                        {
1449
                                const FileFormat * fmt = LoadSavePlugin::getFormatById(testResult);
1450
                                if( fmt )
1451
                                        fmt->loadFile(fileName, LoadSavePlugin::lfUseCurrentPage|LoadSavePlugin::lfInteractive|LoadSavePlugin::lfScripted);
1452
                        }
1453
                        if (m_doc->m_Selection->count() > 0)
1454
                        {
1455
                                double x2, y2, w, h;
1456
                                m_doc->m_Selection->getGroupRect(&x2, &y2, &w, &h);
13166 fschmid 1457
                                m_doc->moveGroup(pastePoint.x() - x2, pastePoint.y() - y2);
12765 jghali 1458
                                m_ScMW->propertiesPalette->updateColorList();
1459
                                m_ScMW->propertiesPalette->paraStyleCombo->updateFormatList();
1460
                                m_ScMW->propertiesPalette->charStyleCombo->updateFormatList();
1461
                                m_ScMW->propertiesPalette->SetLineFormats(m_doc);
1462
                        }
1463
                }
1464
                for (int a = 0; a < m_doc->m_Selection->count(); ++a)
1465
                {
1466
                        PageItem *currItem = m_doc->m_Selection->itemAt(a);
1467
                        currItem->LayerNr = m_doc->activeLayer();
1468
                }
1469
                m_doc->useRaster = savedAlignGrid;
1470
                m_doc->SnapGuides = savedAlignGuides;
1471
                m_doc->setLoading(false);
1472
                m_doc->view()->DrawNew();
1473
                if (m_doc->m_Selection->count() > 0)
1474
                {
1475
                        m_doc->m_Selection->connectItemToGUI();
1476
                        m_ScMW->HaveNewSel(m_doc->m_Selection->itemAt(0)->itemType());
1477
                }
1478
        }
1479
}
1480
 
1481
void CanvasMode_Normal::createContextMenu(PageItem* currItem, double mx, double my)
1482
{
1483
        ContextMenu* cmen=NULL;
1484
        qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
1485
        m_view->setObjectUndoMode();
13035 jghali 1486
        m_mouseCurrentPoint.setXY(mx, my);
12765 jghali 1487
        if(currItem!=NULL)
1488
                cmen = new ContextMenu(*(m_doc->m_Selection), m_ScMW, m_doc);
1489
        else
1490
                cmen = new ContextMenu(m_ScMW, m_doc, mx, my);
1491
        if (cmen)
1492
                cmen->exec(QCursor::pos());
1493
        m_view->setGlobalUndoMode();
1494
        delete cmen;
1495
}