diff options
| author | craig <craig@11d20701-8431-0410-a711-e3c959e3b870> | 2012-01-01 11:40:09 +0000 |
|---|---|---|
| committer | craig <craig@11d20701-8431-0410-a711-e3c959e3b870> | 2012-01-01 11:40:09 +0000 |
| commit | 7ed83b6c6666eb8b6b104c211ae7e52907350372 (patch) | |
| tree | 4430b556abac0ad660a0aacf1887d77f85d8be02 /scribus/scribusview.cpp | |
| download | scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.gz scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.xz scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.zip | |
Branch 1.3.5 tree to 1.4.x tree, goodbye 1.3.x
git-svn-id: svn://scribus.net/branches/Version14x/Scribus@17163 11d20701-8431-0410-a711-e3c959e3b870
Diffstat (limited to 'scribus/scribusview.cpp')
| -rw-r--r-- | scribus/scribusview.cpp | 5017 |
1 files changed, 5017 insertions, 0 deletions
diff --git a/scribus/scribusview.cpp b/scribus/scribusview.cpp new file mode 100644 index 0000000..f4f0226 --- /dev/null +++ b/scribus/scribusview.cpp @@ -0,0 +1,5017 @@ +/* +For general Scribus (>=1.3.2) copyright and licensing information please refer +to the COPYING file provided with the program. Following this notice may exist +a copyright and/or license notice that predates the release of Scribus 1.3.2 +for which a new license (GPL+exception) is in place. +*/ +/*************************************************************************** + scribusview.cpp - description + ------------------- + begin : Fre Apr 6 21:47:55 CEST 2001 + copyright : (C) 2001 by Franz Schmid + email : Franz.Schmid@altmuehlnet.de + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "scribusview.h" + +#include "scconfig.h" + +#include <QColor> +#include <QDir> +#include <QDrag> +#include <QDragEnterEvent> +#include <QDragLeaveEvent> +#include <QDragMoveEvent> +#include <QDropEvent> +#include <QEvent> +#include <QFile> +#include <QFileInfo> +#include <QFont> +#include <QFontMetrics> +#include <QImage> +#include <QImageReader> +#include <QLabel> +#include <QList> +#include <QMenu> +#include <QMimeData> +#include <QMouseEvent> +#include <QPaintEvent> +#include <QPixmap> +#include <QPolygon> +#include <QSizeGrip> +#include <QStack> +#include <QStringList> +#include <QUrl> +#include <QWheelEvent> +#include <QWidgetAction> + +#include <cstdio> +#include <cstdlib> + +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + + +#if QT_VERSION > 0x030102 + #define SPLITVC Qt::SplitHCursor + #define SPLITHC Qt::SplitVCursor +#else + #define SPLITVC Qt::SplitVCursor + #define SPLITHC Qt::SplitHCursor +#endif +#include "scribus.h" + +#include "canvas.h" +#include "canvasgesture.h" +#include "canvasmode.h" +#include "canvasmode_objimport.h" +#include "actionmanager.h" +#include "adjustcmsdialog.h" +#include "commonstrings.h" +#include "extimageprops.h" +#include "filewatcher.h" +#include "guidemanager.h" +#include "hruler.h" +#include "hyphenator.h" +#include "insertTable.h" +#include "oneclick.h" +#include "page.h" +#include "pageitem_imageframe.h" +#include "pageitem_line.h" +#include "pageitem_pathtext.h" +#include "pageitem_polygon.h" +#include "pageitem_polyline.h" +#include "pageitem_textframe.h" +#include "pageitem_latexframe.h" +#include "pageitemattributes.h" +#include "pageselector.h" +#include "prefscontext.h" +#include "prefsfile.h" +#include "prefsmanager.h" +#include "propertiespalette.h" +#include "rulermover.h" +#include "scclocale.h" +#include "scmessagebox.h" +#include "scmimedata.h" +#include "scpainter.h" +#include "scpaths.h" +#include "scrapbookpalette.h" +#include "scribuscore.h" +#include "scribusXml.h" +#include "selection.h" +#include "serializer.h" +#include "stencilreader.h" +#include "storyeditor.h" +#include "text/nlsconfig.h" +#include "undomanager.h" +#include "units.h" +#include "util.h" +#include "util_color.h" +#include "util_formats.h" +#include "util_icon.h" +#include "util_math.h" +#include "vruler.h" +#include "loadsaveplugin.h" +#include "fileloader.h" +#include "plugins/formatidlist.h" +#include <tiffio.h> + +using namespace std; + + + +ScribusView::ScribusView(QWidget* win, ScribusMainWindow* mw, ScribusDoc *doc) : + QScrollArea(win), + Doc(doc), + m_canvas(new Canvas(doc, this)), + Prefs(&(PrefsManager::instance()->appPrefs)), + undoManager(UndoManager::instance()), + m_ScMW(mw), + OldScale(0), + dragX(0), dragY(0), dragW(0), dragH(0), + oldW(-1), // oldCp(-1), + RotMode(0), + DrHY(-1), DrVX(-1), + HaveSelRect(false), + DraggedGroup(false), + DraggedGroupFirst(false), + MidButt(false), + updateOn(true), + FirstPoly(true), + Magnify(false), + RCenter(-1,-1), +// RecordP(), + Ready(false), + oldX(0), oldY(0), + m_groupTransactions(0), + m_groupTransaction(NULL), + _isGlobalMode(true), + m_vhRulerHW(17) +{ + setObjectName("s"); + setAttribute(Qt::WA_StaticContents); + setAttribute(Qt::WA_InputMethodEnabled, true); + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + setViewportMargins(m_vhRulerHW, m_vhRulerHW, 0, 0); + setWidgetResizable(false); + m_canvasMode = CanvasMode::createForAppMode(this, Doc->appMode); + setWidget(m_canvas); + //already done by QScrollArea: widget()->installEventFilter(this); + installEventFilter(this); // FIXME:av +// viewport()->setBackgroundMode(Qt::PaletteBackground); + setFocusPolicy(Qt::ClickFocus); + QFont fo = QFont(font()); + // #8058: Better not use too small font size on Windows + // in case ClearType is not enabled + int posi = fo.pointSize() - (ScCore->isWinGUI() ? 1 : 2); + fo.setPointSize(posi); + unitSwitcher = new QComboBox( this ); + unitSwitcher->setFocusPolicy(Qt::NoFocus); + unitSwitcher->setFont(fo); + int maxUindex = unitGetMaxIndex() - 2; + for (int i = 0; i <= maxUindex; ++i) + unitSwitcher->addItem(unitGetStrFromIndex(i)); + previewQualitySwitcher = new QComboBox( this ); + previewQualitySwitcher->setFocusPolicy(Qt::NoFocus); + previewQualitySwitcher->setFont(fo); + previewQualitySwitcher->addItem(tr("High")); + previewQualitySwitcher->addItem(tr("Normal")); + previewQualitySwitcher->addItem(tr("Low")); +// setCurrentComboItem(previewQualitySwitcher, tr("Normal")); + previewQualitySwitcher->setCurrentIndex(Prefs->toolSettings.lowResType); + + zoomSpinBox = new ScrSpinBox( 1, 3200, this, 6 ); + zoomSpinBox->setTabAdvance(false); + zoomSpinBox->setFont(fo); + zoomSpinBox->setValue( 100 ); + zoomSpinBox->setSingleStep(10); + zoomSpinBox->setFocusPolicy(Qt::ClickFocus); + zoomSpinBox->setSuffix( tr( " %" ) ); +#if OPTION_USE_QTOOLBUTTON + zoomOutToolbarButton = new QToolButton(this); + zoomDefaultToolbarButton = new QToolButton(this); + zoomInToolbarButton = new QToolButton(this); + cmsToolbarButton = new QToolButton(this); + previewToolbarButton = new QToolButton(this); + zoomDefaultToolbarButton->setAutoRaise(OPTION_FLAT_BUTTON); + zoomOutToolbarButton->setAutoRaise(OPTION_FLAT_BUTTON); + zoomInToolbarButton->setAutoRaise(OPTION_FLAT_BUTTON); + cmsToolbarButton->setAutoRaise(OPTION_FLAT_BUTTON); + cmsToolbarButton->setCheckable(true); + QIcon ic2; + ic2.addPixmap(loadIcon("cmsOff.png"), QIcon::Normal, QIcon::Off); + ic2.addPixmap(loadIcon("cmsOn.png"), QIcon::Normal, QIcon::On); + cmsToolbarButton->setIcon(ic2); + previewToolbarButton->setAutoRaise(OPTION_FLAT_BUTTON); + previewToolbarButton->setCheckable(true); + QIcon ic; + ic.addPixmap(loadIcon("previewOff.png"), QIcon::Normal, QIcon::Off); + ic.addPixmap(loadIcon("previewOn.png"), QIcon::Normal, QIcon::On); + previewToolbarButton->setIcon(ic); +#else + zoomDefaultToolbarButton = new QPushButton(this); + zoomDefaultToolbarButton->setFocusPolicy(Qt::NoFocus); + zoomDefaultToolbarButton->setDefault( false ); + zoomDefaultToolbarButton->setAutoDefault( false ); + zoomDefaultToolbarButton->setFlat(OPTION_FLAT_BUTTON); + zoomOutToolbarButton = new QPushButton(this); + zoomOutToolbarButton->setFocusPolicy(Qt::NoFocus); + zoomOutToolbarButton->setDefault( false ); + zoomOutToolbarButton->setAutoDefault( false ); + zoomOutToolbarButton->setFlat(OPTION_FLAT_BUTTON); + zoomInToolbarButton = new QPushButton(this); + zoomInToolbarButton->setFocusPolicy(Qt::NoFocus); + zoomInToolbarButton->setDefault( false ); + zoomInToolbarButton->setAutoDefault( false ); + zoomInToolbarButton->setFlat(OPTION_FLAT_BUTTON); + cmsToolbarButton = new QPushButton(this); + cmsToolbarButton->setFocusPolicy(Qt::NoFocus); + cmsToolbarButton->setDefault( false ); + cmsToolbarButton->setAutoDefault( false ); + cmsToolbarButton->setFlat(OPTION_FLAT_BUTTON); + cmsToolbarButton->setIcon(loadIcon("cmsOn.png")); + previewToolbarButton = new QPushButton(this); + previewToolbarButton->setFocusPolicy(Qt::NoFocus); + previewToolbarButton->setDefault( false ); + previewToolbarButton->setAutoDefault( false ); + previewToolbarButton->setFlat(OPTION_FLAT_BUTTON); + previewToolbarButton->setIcon(loadIcon("previewOn.png")); +#endif + cmsAdjustMenu = new QMenu(); + idCmsAdjustMenu = cmsAdjustMenu->addAction( "Configure CMS...", this, SLOT(adjustCMS())); + cmsToolbarButton->setMenu(cmsAdjustMenu); +#if OPTION_USE_QTOOLBUTTON + cmsToolbarButton->setPopupMode(QToolButton::DelayedPopup); +#endif + //zoomDefaultToolbarButton->setText("1:1"); + zoomDefaultToolbarButton->setIcon(QIcon(loadIcon("16/zoom-original.png"))); + zoomOutToolbarButton->setIcon(QIcon(loadIcon("16/zoom-out.png"))); + zoomOutToolbarButton->addAction(m_ScMW->scrActions["toolsZoomOut"]); + zoomInToolbarButton->setIcon(QIcon(loadIcon("16/zoom-in.png"))); + zoomInToolbarButton->addAction(m_ScMW->scrActions["toolsZoomIn"]); + pageSelector = new PageSelector(this, Doc->Pages->count()); + pageSelector->setFont(fo); + pageSelector->setFocusPolicy(Qt::ClickFocus); + layerMenu = new QComboBox( this ); + layerMenu->setEditable(false); + layerMenu->setFont(fo); + layerMenu->setFocusPolicy(Qt::NoFocus); + visualMenu = new QComboBox( this ); + visualMenu->setFocusPolicy(Qt::NoFocus); + visualMenu->setFont(fo); + visualMenu->setEnabled(false); + horizRuler = new Hruler(this, Doc); + vertRuler = new Vruler(this, Doc); + horizRuler->installEventFilter(this); + vertRuler->installEventFilter(this); + rulerMover = new RulerMover(this); + rulerMover->setFocusPolicy(Qt::NoFocus); + horizRuler->setGeometry(m_vhRulerHW, 1, width()-m_vhRulerHW-1, m_vhRulerHW); + vertRuler->setGeometry(1, m_vhRulerHW, m_vhRulerHW, height()-m_vhRulerHW-1); + rulerMover->setGeometry(1, 1, m_vhRulerHW, m_vhRulerHW); + Ready = true; + m_canvas->setMouseTracking(true); + setAcceptDrops(true); + m_canvas->setAcceptDrops(true); + // FIXME setDragAutoScroll(false); + Doc->DragP = false; + Doc->leaveDrag = false; + Doc->SubMode = -1; + storedFramesShown = Doc->guidesSettings.framesShown; + storedShowControls = Doc->guidesSettings.showControls; + m_canvas->m_viewMode.viewAsPreview = false; + m_canvas->setPreviewVisual(-1); +// shiftSelItems = false; +// inItemCreation = false; + m_previousMode = -1; + redrawMode = 0; + redrawCount = 0; + redrawMarker = new QRubberBand(QRubberBand::Rectangle); + redrawMarker->hide(); + m_canvas->newRedrawPolygon(); + m_canvas->resetRenderMode(); + m_ScMW->scrActions["viewFitPreview"]->setChecked(m_canvas->m_viewMode.viewAsPreview); +// m_SnapCounter = 0; + + Doc->regionsChanged()->connectObserver(this); + connect(zoomOutToolbarButton, SIGNAL(clicked()), this, SLOT(slotZoomOut())); + connect(zoomInToolbarButton, SIGNAL(clicked()), this, SLOT(slotZoomIn())); + connect(zoomDefaultToolbarButton, SIGNAL(clicked()), this, SLOT(slotZoom100())); + connect(zoomSpinBox, SIGNAL(valueChanged(double)), this, SLOT(setZoom())); + connect(pageSelector, SIGNAL(GotoPage(int)), this, SLOT(GotoPa(int))); + connect(layerMenu, SIGNAL(activated(int)), this, SLOT(GotoLa(int))); + connect(unitSwitcher, SIGNAL(activated(int)), this, SLOT(ChgUnit(int))); + connect(previewQualitySwitcher, SIGNAL(activated(int)), this, SLOT(changePreviewQuality(int))); + connect(previewToolbarButton, SIGNAL(clicked()), this, SLOT(togglePreview())); + connect(cmsToolbarButton, SIGNAL(clicked()), this, SLOT(toggleCMS())); + connect(visualMenu, SIGNAL(activated(int)), this, SLOT(switchPreviewVisual(int))); + connect(this, SIGNAL(HaveSel(int)), this, SLOT(selectionChanged())); + languageChange(); +// Commented out to fix bug #7865 +// m_dragTimer = new QTimer(this); +// connect(m_dragTimer, SIGNAL(timeout()), this, SLOT(dragTimerTimeOut())); +// m_dragTimer->stop(); + m_dragTimerFired = false; +} + +ScribusView::~ScribusView() +{ + while (m_canvasMode) + { + m_canvasMode->deactivate(false); + m_canvasMode = m_canvasMode->delegate(); + } +} + +void ScribusView::changeEvent(QEvent *e) +{ + if (e->type() == QEvent::LanguageChange) + { + languageChange(); + } + else + QWidget::changeEvent(e); +} + +void ScribusView::languageChange() +{ + zoomDefaultToolbarButton->setToolTip( tr("Zoom to 100%")); + zoomOutToolbarButton->setToolTip( tr("Zoom out by the stepping value in Tools preferences")); + zoomInToolbarButton->setToolTip( tr("Zoom in by the stepping value in Tools preferences")); + zoomSpinBox->setToolTip( tr("Current zoom level")); + cmsToolbarButton->setToolTip(""); + previewToolbarButton->setToolTip(""); + layerMenu->setToolTip( tr("Select the current layer")); + unitSwitcher->setToolTip( tr("Select the current unit")); + previewQualitySwitcher->setToolTip( tr("Select the image preview quality")); + visualMenu->setToolTip(""); + cmsToolbarButton->setToolTip( tr("Enable/disable Color Management")); + idCmsAdjustMenu->setText( tr("Configure CMS...")); + previewToolbarButton->setToolTip( tr("Enable/disable the Preview Mode")); + visualMenu->setToolTip( tr("Select the visual appearance of the display. You can choose between normal and several color blindness forms")); + disconnect(visualMenu, SIGNAL(activated(int)), this, SLOT(switchPreviewVisual(int))); + visualMenu->clear(); + visualMenu->addItem(CommonStrings::trVisionNormal); + visualMenu->addItem(CommonStrings::trVisionProtanopia); + visualMenu->addItem(CommonStrings::trVisionDeuteranopia); + visualMenu->addItem(CommonStrings::trVisionTritanopia); + visualMenu->addItem(CommonStrings::trVisionFullColorBlind); + visualMenu->setCurrentIndex(m_canvas->previewVisual()); + connect(visualMenu, SIGNAL(activated(int)), this, SLOT(switchPreviewVisual(int))); +} + +void ScribusView::toggleCMS() +{ + Doc->enableCMS(!Doc->HasCMS); + m_ScMW->propertiesPalette->ShowCMS(); + DrawNew(); +} + +void ScribusView::adjustCMS() +{ + AdjustCmsDialog* dia = new AdjustCmsDialog(this, Doc); + if (dia->exec()) + { + dia->tabColorManagement->updateDocSettings(Doc); + if (dia->tabColorManagement->changed) + { + Doc->enableCMS(Doc->CMSSettings.CMSinUse); + cmsToolbarButton->setChecked(Doc->HasCMS); + m_ScMW->propertiesPalette->ShowCMS(); + DrawNew(); + } + } + delete dia; +} + +void ScribusView::switchPreviewVisual(int vis) +{ + m_canvas->setPreviewVisual(vis); + Doc->recalculateColors(); + Doc->recalcPicturesRes(); + DrawNew(); +} + +void ScribusView::togglePreview() +{ + m_canvas->m_viewMode.viewAsPreview = !m_canvas->m_viewMode.viewAsPreview; + if (m_canvas->m_viewMode.viewAsPreview) + { + storedFramesShown = Doc->guidesSettings.framesShown; + Doc->guidesSettings.framesShown = false; + storedShowControls = Doc->guidesSettings.showControls; + Doc->guidesSettings.showControls = false; + // warning popping up in case colour management and out-of-gamut-display are active + // as from #4346: Add a preview for daltonian - PV + if (Doc->HasCMS && Doc->Gamut) + QMessageBox::information(m_ScMW, tr("Preview Mode"), + "<qt>" + tr("CMS is active. Therefore the color display may not match the perception by visually impaired") + "</qt>", + QMessageBox::Ok); + } + else + { + Doc->guidesSettings.framesShown = storedFramesShown; + Doc->guidesSettings.showControls = storedShowControls; + } + m_ScMW->scrActions["viewFitPreview"]->setChecked(m_canvas->m_viewMode.viewAsPreview); + m_ScMW->scrActions["viewShowMargins"]->setEnabled(!m_canvas->m_viewMode.viewAsPreview); + m_ScMW->scrActions["viewShowFrames"]->setEnabled(!m_canvas->m_viewMode.viewAsPreview); + m_ScMW->scrActions["viewShowLayerMarkers"]->setEnabled(!m_canvas->m_viewMode.viewAsPreview); + m_ScMW->scrActions["viewShowGrid"]->setEnabled(!m_canvas->m_viewMode.viewAsPreview); + m_ScMW->scrActions["viewShowGuides"]->setEnabled(!m_canvas->m_viewMode.viewAsPreview); + m_ScMW->scrActions["viewShowColumnBorders"]->setEnabled(!m_canvas->m_viewMode.viewAsPreview); + m_ScMW->scrActions["viewShowBaseline"]->setEnabled(!m_canvas->m_viewMode.viewAsPreview); + m_ScMW->scrActions["viewShowTextChain"]->setEnabled(!m_canvas->m_viewMode.viewAsPreview); + m_ScMW->scrActions["viewShowTextControls"]->setEnabled(!m_canvas->m_viewMode.viewAsPreview); +#if OPTION_USE_QTOOLBUTTON + previewToolbarButton->setChecked(m_canvas->m_viewMode.viewAsPreview); +#endif + visualMenu->setEnabled(m_canvas->m_viewMode.viewAsPreview); + ScGuardedPtr<ScribusDoc> docPtr = Doc->guardedPtr(); + Doc->recalculateColors(); + Doc->recalcPicturesRes(); +// repaintContents(QRect()); + if (docPtr) // document may have been destroyed in-between + { + DrawNew(); + } +} + +void ScribusView::changed(QRectF re, bool) +{ + double scale = m_canvas->scale(); + int newCanvasWidth = qRound((Doc->maxCanvasCoordinate.x() - Doc->minCanvasCoordinate.x()) * scale); + int newCanvasHeight = qRound((Doc->maxCanvasCoordinate.y() - Doc->minCanvasCoordinate.y()) * scale); + if (!re.isValid() && // dont check this all the time + ( m_oldCanvasWidth != newCanvasWidth || m_oldCanvasHeight != newCanvasHeight)) + { + QSize maxViewport = maximumViewportSize(); + horizontalScrollBar()->setRange(qRound(Doc->minCanvasCoordinate.x() * scale), + qRound(Doc->maxCanvasCoordinate.x() * scale) - maxViewport.width()); + verticalScrollBar()->setRange(qRound(Doc->minCanvasCoordinate.y() * scale), + qRound(Doc->maxCanvasCoordinate.y() * scale) - maxViewport.height()); + /* qDebug() << "adjustCanvas [" << m_oldCanvasWidth << m_oldCanvasHeight << " ] -> [" << newCanvasWidth << newCanvasHeight + << "] (" << Doc->minCanvasCoordinate.x() << Doc->minCanvasCoordinate.y() << ") - (" + << Doc->maxCanvasCoordinate.x() << Doc->maxCanvasCoordinate.y() << ") @" << scale << maxViewport; + */ + widget()->resize(newCanvasWidth, newCanvasHeight); + m_oldCanvasWidth = newCanvasWidth; + m_oldCanvasHeight = newCanvasHeight; + } + if (!Doc->isLoading() && !m_ScMW->scriptIsRunning()) + { +// qDebug() << "ScribusView-changed(): changed region:" << re; + m_canvas->m_viewMode.forceRedraw = true; + updateCanvas(re); + } +} + +bool ScribusView::handleObjectImport(QMimeData* mimeData, TransactionSettings* trSettings) +{ + requestMode(modeImportObject); + CanvasMode_ObjImport* objImport = dynamic_cast<CanvasMode_ObjImport*>(m_canvasMode); + if (objImport) + { + objImport->setMimeData(mimeData); + objImport->setTransactionSettings(trSettings); + return true; + } + delete trSettings; + delete mimeData; + return false; +} + +void ScribusView::startGesture(CanvasGesture* gesture) +{ +// qDebug() << "start gesture" << typeid(*m_canvasMode).name() +// << "---->" +// << typeid(*gesture).name(); + if (m_canvasMode != gesture) + { + m_canvasMode->deactivate(true); + gesture->setDelegate(m_canvasMode); + m_canvasMode = gesture; + m_canvasMode->activate(false); + if (Doc->appMode != modeEditClip) + m_canvas->repaint(); + } +} + +void ScribusView::stopGesture() +{ +// qDebug() << "stop gesture" << typeid(*m_canvasMode).name() << (m_canvasMode->delegate() != 0); + if (m_canvasMode->delegate()) + { + m_canvasMode->deactivate(false); + m_canvasMode = m_canvasMode->delegate(); + m_canvasMode->activate(true); + if (PrefsManager::instance()->appPrefs.stickyTools) + { + m_canvas->m_viewMode.forceRedraw = true; +// Doc->m_Selection->clear(); +// emit HaveSel(-1); + m_canvas->resetRenderMode(); + updateContents(); + } + else + m_canvas->repaint(); + } +} + +/** +switches between appmodes: + - for submodes, activate the appropiate dialog or palette + - set a new CanvasMode if necessary + - call ScribusMainWindow::setAppMode(), which de/activates actions + TODO:av make this simpler + */ +void ScribusView::requestMode(int appMode) +{ + bool updateNecessary = false; +// qDebug() << "request mode:" << appMode; + switch(appMode) // filter submodes + { + case submodePaintingDone: // return to normal mode +// appMode = m_previousMode < 0 ? modeNormal : m_previousMode; + appMode = modeNormal; + m_previousMode = -1; + updateNecessary = true; + break; + case submodeEndNodeEdit: // return from node/shape editing +// appMode = m_previousMode < 0 ? modeNormal : m_previousMode; + appMode = modeNormal; + m_previousMode = -1; + updateNecessary = true; + break; + /* + case submodeToggleNodeEdit: + if (Doc->appMode == modeEditClip) + { + m_ScMW->setAppMode(m_previousMode < 0 ? modeNormal : m_previousMode); + m_previousMode = -1; + } + else + { + m_previousMode = Doc->appMode; + m_ScMW->setAppMode(modeEditClip); + } + return; + */ + case submodeLoadPic: // open GetImage dialog + appMode = Doc->appMode; + m_previousMode = appMode; + m_ScMW->slotGetContent(); + break; + case submodeStatusPic: // open ManageImages dialog + appMode = Doc->appMode; + m_previousMode = appMode; + m_ScMW->StatusPic(); + break; + case submodeEditExternal: // open external image editor + appMode = Doc->appMode; + m_previousMode = appMode; + m_ScMW->callImageEditor(); + break; + case submodeAnnotProps: + appMode = Doc->appMode; + m_previousMode = appMode; + m_ScMW->ModifyAnnot(); + break; + default: + if (appMode < 0 || appMode > submodeFirstSubmode) + { +// qDebug() << "request mode: UNKNOWN" << appMode; + appMode = modeNormal; + } + m_previousMode = appMode; + break; + } + +// qDebug() << "request mode" << Doc->appMode << "-->" << appMode; + if (Doc->appMode != appMode) + { + m_ScMW->setAppMode(appMode); + CanvasMode* newCanvasMode = modeInstances.value(appMode); + if (!newCanvasMode) + { + newCanvasMode = CanvasMode::createForAppMode(this, appMode); + modeInstances[appMode] = newCanvasMode; + } + if (newCanvasMode) + { +// qDebug() << "request canvas mode" << typeid(*newCanvasMode).name(); + m_canvasMode->deactivate(false); + m_canvasMode = newCanvasMode; + m_canvasMode->activate(false); + } + updateNecessary = true; + } + else + m_ScMW->setAppMode(appMode); +// if (appMode == modeEdit) +// { +// m_ScMW->activateWindow(); +// } + if (updateNecessary) + updateCanvas(); +} + + + +/* +void ScribusView::paintEvent ( QPaintEvent * p ) +{ + #ifndef _WIN32 + if (p->spontaneous()) + evSpon = true; + #endif + QScrollArea::paintEvent(p); +// QPainter qp(viewport()); +// drawContents(&qp, p->rect().x(), p->rect().y(), p->rect().width(), p->rect().height()); +} +*/ + +void ScribusView::enterEvent(QEvent * e) +{ + m_canvasMode->enterEvent(e); + return; + /* + if (!m_canvas->m_viewMode.m_MouseButtonPressed) + { + switch (Doc->appMode) + { + case modeDrawShapes: + qApp->changeOverrideCursor(QCursor(loadIcon("DrawFrame.xpm"))); + break; + case modeDrawImage: + qApp->changeOverrideCursor(QCursor(loadIcon("DrawImageFrame.xpm"))); + break; + case modeDrawLatex: + qApp->changeOverrideCursor(QCursor(loadIcon("DrawLatexFrame.xpm"))); + break; + case modeDrawText: + qApp->changeOverrideCursor(QCursor(loadIcon("DrawTextFrame.xpm"))); + break; + case modeDrawTable: + qApp->changeOverrideCursor(QCursor(loadIcon("DrawTable.xpm"))); + break; + case modeDrawRegularPolygon: + qApp->changeOverrideCursor(QCursor(loadIcon("DrawPolylineFrame.xpm"))); + break; + case modeDrawLine: + case modeDrawBezierLine: + qApp->changeOverrideCursor(QCursor(Qt::CrossCursor)); + break; + case modeDrawFreehandLine: + qApp->changeOverrideCursor(QCursor(loadIcon("DrawFreeLine.png"), 0, 32)); + break; + case modeMagnifier: + if (Magnify) + qApp->changeOverrideCursor(QCursor(loadIcon("LupeZ.xpm"))); + else + qApp->changeOverrideCursor(QCursor(loadIcon("LupeZm.xpm"))); + break; + case modePanning: + qApp->changeOverrideCursor(QCursor(loadIcon("HandC.xpm"))); + break; + case modeMeasurementTool: + case modeEditGradientVectors: + case modeInsertPDFButton: + case modeInsertPDFTextfield: + case modeInsertPDFCheckbox: + case modeInsertPDFCombobox: + case modeInsertPDFListbox: + case modeInsertPDFTextAnnotation: + case modeInsertPDFLinkAnnotation: + qApp->changeOverrideCursor(QCursor(Qt::CrossCursor)); + break; + default: + qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor)); + break; + } + }*/ +} + +void ScribusView::leaveEvent(QEvent *e) +{ + m_canvasMode->leaveEvent(e); + return; + +/* if (BlockLeave) + return; */ + if (!m_canvas->m_viewMode.m_MouseButtonPressed) + qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor)); +/* else + { + if ((SelItem.count() != 0) && (m_canvas->m_viewMode.m_MouseButtonPressed) && (!doku->DragP) && (doku->appMode == 1)) + { + PageItem *currItem = SelItem.at(0); + if ((b->Locked) || (b->Sizing)) + return; + doku->DragP = true; + doku->leaveDrag = true; + doku->DraggedElem = b; + doku->DragElements.clear(); + for (uint dre=0; dre<SelItem.count(); ++dre) + doku->DragElements.append(SelItem.at(dre)->ItemNr); + ScriXmlDoc *ss = new ScriXmlDoc(); + QDragObject *dr = new QTextDrag(ss->WriteElem(&SelItem, doku), this); + dr->setPixmap(loadIcon("DragPix.xpm")); + dr->drag(); + delete ss; + ss=NULL; + doku->DragP = false; + doku->leaveDrag = false; + m_canvas->m_viewMode.m_MouseButtonPressed = false; + doku->DraggedElem = 0; + doku->DragElements.clear(); + } + } */ +} + +void ScribusView::contentsDragEnterEvent(QDragEnterEvent *e) +{ + QString text; + bool /* dataFound = false, */ fromFile = false; + const ScElemMimeData* elemData = dynamic_cast<const ScElemMimeData*>(e->mimeData()); + e->accept(); + if (elemData) + text = elemData->scribusElem(); + else if (e->mimeData()->hasUrls()) + { + QUrl url = e->mimeData()->urls().at(0); + QFileInfo fi(url.toLocalFile()); + if (fi.exists()) + { + fromFile = true; + text = url.toLocalFile(); + } + } + if (!text.isEmpty()) + { + e->acceptProposedAction(); + double gx, gy, gw, gh; + ScriXmlDoc *ss = new ScriXmlDoc(); + if(ss->ReadElemHeader(text, fromFile, &gx, &gy, &gw, &gh)) + { + FPoint dragPosDoc = m_canvas->globalToCanvas(widget()->mapToGlobal(e->pos())); + dragX = dragPosDoc.x(); //e->pos().x() / m_canvas->scale(); + dragY = dragPosDoc.y(); //e->pos().y() / m_canvas->scale(); + dragW = gw; + dragH = gh; + DraggedGroup = true; + DraggedGroupFirst = true; + getDragRectScreen(&gx, &gy, &gw, &gh); +// QPoint evP = viewport()->mapToGlobal(e->pos()); +// evP -= QPoint(contentsX(), contentsY()); +// redrawMarker->setGeometry(QRect(evP.x() + 1, evP.y() + 1, qRound(gw), qRound(gh)).normalized()); +// if (!redrawMarker->isVisible()) +// redrawMarker->show(); + emit ItemGeom(gw, gh); + } + delete ss; + ss=NULL; + } +} + +void ScribusView::contentsDragMoveEvent(QDragMoveEvent *e) +{ + QString text; + e->accept(); + if (e->mimeData()->hasText()) + { + e->acceptProposedAction(); + text = e->mimeData()->text(); + if (DraggedGroup) + { +// double gx, gy, gw, gh; + FPoint dragPosDoc = m_canvas->globalToCanvas(widget()->mapToGlobal(e->pos())); + dragX = dragPosDoc.x(); //e->pos().x() / m_canvas->scale(); + dragY = dragPosDoc.y(); //e->pos().y() / m_canvas->scale(); +// getDragRectScreen(&gx, &gy, &gw, &gh); +// QPoint evP = viewport()->mapToGlobal(e->pos()); +// evP -= QPoint(contentsX(), contentsY()); +// redrawMarker->setGeometry(QRect(evP.x() + 2, evP.y() + 2, qRound(gw - 2), qRound(gh - 2)).normalized()); +// if (!redrawMarker->isVisible()) +// redrawMarker->show(); + DraggedGroupFirst = false; + emit MousePos(dragX, dragY); //+Doc->minCanvasCoordinate.x(), dragY+Doc->minCanvasCoordinate.y()); + QPoint pos = m_canvas->canvasToLocal(dragPosDoc); + horizRuler->Draw(pos.x()); + vertRuler->Draw(pos.y()); +// return; + } +/* QUrl ur(text); + QFileInfo fi = QFileInfo(ur.toLocalFile()); + QString ext = fi.extension(false).toUpper(); + QStrList imfo = QImageIO::inputFormats(); + if (ext == "JPG") + ext = "JPEG"; + img = ((imfo.contains(ext))||(ext=="PS")||(ext=="EPS")||(ext=="TIF")); + if (!SeleItemPos(e->pos())) + { + if (SelItem.count() != 0) + Deselect(true); + } + else + { + b = SelItem.at(0); + if (img) + { + if (b->PType != 2) + Deselect(true); + } + else + { + if (b->PType != 4) + Deselect(true); + } + } */ + } +} + +void ScribusView::contentsDragLeaveEvent(QDragLeaveEvent *) +{ + if (DraggedGroup) + { + DraggedGroup = false; + DraggedGroupFirst = false; + m_canvas->resetRenderMode(); +// redrawMarker->hide(); + updateContents(); + } +} + +void ScribusView::contentsDropEvent(QDropEvent *e) +{ + QString text; + QUrl url; + PageItem *currItem; + UndoTransaction* activeTransaction = NULL; + bool img = false; + m_canvas->resetRenderMode(); + redrawMode = 0; +// redrawMarker->hide(); +// struct ScText *hg; +// uint a; + int re = 0; +// e->accept(Q3TextDrag::canDecode(e)); + e->accept(); + DraggedGroupFirst = false; + FPoint dropPosDoc = m_canvas->globalToCanvas(widget()->mapToGlobal(e->pos())); + QPointF dropPosDocQ(dropPosDoc.x(), dropPosDoc.y()); +// int ex = qRound(e->pos().x()/m_canvas->scale());// + Doc->minCanvasCoordinate.x()); +// int ey = qRound(e->pos().y()/m_canvas->scale());// + Doc->minCanvasCoordinate.y()); + + if (ScMimeData::clipboardHasScribusElem()) + { + text = ScMimeData::clipboardScribusElem(); + url = QUrl(text); + } + else if (e->mimeData()->hasText()) + { + text = e->mimeData()->text(); + url = QUrl(text); + } + else if (e->mimeData()->hasUrls()) + { + url = e->mimeData()->urls().at(0); + text = ""; + } +// qDebug() << "ScribusView::contentsDropEvent" << e->mimeData()->formats() << url; + if (!url.isEmpty()) + { + e->acceptProposedAction(); + //<<#3524 + activateWindow(); + if (!m_ScMW->scriptIsRunning()) + raise(); + m_ScMW->newActWin(Doc->WinHan); + updateContents(); + //>> + QFileInfo fi(url.toLocalFile()); + QString ext = fi.suffix().toUpper(); + QStringList imfo; + QList<QByteArray> imgs = QImageReader::supportedImageFormats(); + for (int i = 0; i < imgs.count(); ++i ) + { + imfo.append(QString(imgs.at(i)).toUpper()); + } + if (ext == "JPG") + ext = "JPEG"; + //CB Need to handle this ugly file extension list elsewhere... some capabilities class perhaps + img = ((imfo.contains(ext)) || extensionIndicatesPDF(ext) || extensionIndicatesEPSorPS(ext) || extensionIndicatesTIFF(ext) || extensionIndicatesJPEG(ext) || extensionIndicatesPSD(ext)); + bool selectedItemByDrag=false; +// int pscx=qRound(e->pos().x()/m_canvas->scale()), pscy=qRound(e->pos().y()/m_canvas->scale()); + //Loop through all items and see which one(s) were under the drop point on the current layer + //Should make a nice function for this. + //#9051 : loop in reverse order so that items in front of others are prioritized + Doc->m_Selection->delaySignalsOn(); + for (int i = Doc->Items->count() - 1; i >= 0 ; --i) + { + if (Doc->Items->at(i)->LayerNr==Doc->activeLayer()) + { + if (m_canvas->frameHitTest(dropPosDocQ, Doc->Items->at(i)) >= Canvas::INSIDE) + { + Deselect(false); + Doc->m_Selection->addItem(Doc->Items->at(i)); +// SelectItem(Doc->Items->at(i)); + selectedItemByDrag=true; + break; + } + } + } + Doc->m_Selection->delaySignalsOff(); + bool vectorFile = false; + if (fi.exists()) + { + if ((fi.suffix().toLower() == "sml") || (fi.suffix().toLower() == "shape") || (fi.suffix().toLower() == "sce")) + vectorFile = true; + else + { + FileLoader *fileLoader = new FileLoader(url.toLocalFile()); + int testResult = fileLoader->TestFile(); + delete fileLoader; + if ((testResult != -1) && (testResult >= FORMATID_ODGIMPORT)) + vectorFile = true; + } + } + else + { + if ((text.startsWith("<SCRIBUSELEM")) || (text.startsWith("SCRIBUSFRAGMENT"))) + vectorFile = true; + } +// qDebug() << "drop - img:" << img << "file:" << fi.exists() << "suffix:" << fi.suffix() << "select by drag:" << selectedItemByDrag; + //CB When we drag an image to a page from outside + //SeleItemPos is from 1.2.x. Needs reenabling for dragging *TO* a frame + if ((fi.exists()) && (img) && !selectedItemByDrag && !vectorFile)// && (!SeleItemPos(e->pos()))) + { + int z = Doc->itemAdd(PageItem::ImageFrame, PageItem::Unspecified, dropPosDoc.x(), dropPosDoc.y(), 1, 1, Doc->toolSettings.dWidth, Doc->toolSettings.dBrushPict, CommonStrings::None, true); + PageItem *b = Doc->Items->at(z); + b->LayerNr = Doc->activeLayer(); + Doc->LoadPict(url.toLocalFile(), b->ItemNr); + b->setWidth(static_cast<double>(b->OrigW * 72.0 / b->pixm.imgInfo.xres)); + b->setHeight(static_cast<double>(b->OrigH * 72.0 / b->pixm.imgInfo.yres)); + b->OldB2 = b->width(); + b->OldH2 = b->height(); + b->updateClip(); + emit DocChanged(); + update(); + return; + } + //if ((SeleItemPos(e->pos())) && (!text.startsWith("<SCRIBUSELEM"))) +// if (Doc->m_Selection->count()>0 && (m_canvas->frameHitTest(dropPosDocQ, Doc->m_Selection->itemAt(0)) >= Canvas::INSIDE) && !vectorFile) // && (img)) + if (selectedItemByDrag && (m_canvas->frameHitTest(dropPosDocQ, Doc->m_Selection->itemAt(0)) >= Canvas::INSIDE) && ((!vectorFile) || (img))) + { + PageItem *b = Doc->m_Selection->itemAt(0); + if (b->itemType() == PageItem::ImageFrame) + { + if ((fi.exists()) && (img)) + Doc->LoadPict(url.toLocalFile(), b->ItemNr); + } + else if (b->itemType() == PageItem::TextFrame) + { + if ((fi.exists()) && (!img)) + { + QByteArray file; + QTextCodec *codec = QTextCodec::codecForLocale(); + // TODO create a Dialog for selecting the codec + if (loadRawText(url.toLocalFile(), file)) + { + QString txt = codec->toUnicode( file.data() ); + txt.replace(QRegExp("\r"), QChar(13)); + txt.replace(QRegExp("\n"), QChar(13)); + txt.replace(QRegExp("\t"), QChar(9)); + b->itemText.insertChars(txt, true); + if (Doc->docHyphenator->AutoCheck) + Doc->docHyphenator->slotHyphenate(b); + b->invalidateLayout(); + b->update(); + } + } + } + emit DocChanged(); + update(); + } + else + { + Deselect(true); + uint oldDocItemCount = Doc->Items->count(); + if (((!img) || (vectorFile)) && (Doc->DraggedElem == 0)) + { + activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::SelectionGroup, Um::IGroup, Um::Create,"",Um::ICreate)); + if (fi.exists()) + { + QString data; + if (fi.suffix().toLower() == "sml") + { + QByteArray cf; + loadRawText(url.toLocalFile(), cf); + StencilReader *pre = new StencilReader(); + QString f = QString::fromUtf8(cf.data()); + data = pre->createObjects(f); + delete pre; + emit LoadElem(data, dropPosDoc.x(), dropPosDoc.y(), false, false, Doc, this); + } + else if (fi.suffix().toLower() == "shape") + { + QByteArray cf; + loadRawText(url.toLocalFile(), cf); + StencilReader *pre = new StencilReader(); + QString f = QString::fromUtf8(cf.data()); + data = pre->createShape(f); + delete pre; + emit LoadElem(data, dropPosDoc.x(), dropPosDoc.y(), false, false, Doc, this); + } + else if (fi.suffix().toLower() == "sce") + { + emit LoadElem(url.toLocalFile(), dropPosDoc.x(), dropPosDoc.y(), true, false, Doc, this); + } + else + { + FileLoader *fileLoader = new FileLoader(url.toLocalFile()); + int testResult = fileLoader->TestFile(); + delete fileLoader; + if ((testResult != -1) && (testResult >= FORMATID_ODGIMPORT)) + { + const FileFormat * fmt = LoadSavePlugin::getFormatById(testResult); + if( fmt ) + { + // We disable undo here as we are only interested by the item creation undo actions + // We create them manually after import + undoManager->setUndoEnabled(false); + fmt->loadFile(url.toLocalFile(), LoadSavePlugin::lfUseCurrentPage|LoadSavePlugin::lfInteractive|LoadSavePlugin::lfScripted); + undoManager->setUndoEnabled(true); + if (Doc->m_Selection->count() > 0) + { + if (UndoManager::undoEnabled()) + { + // Create undo actions for created items + for (int i = 0; i < Doc->m_Selection->count(); ++i) + { + PageItem* newItem = Doc->m_Selection->itemAt(i); + ItemState<PageItem*> *is = new ItemState<PageItem*>("Create PageItem"); + is->set("CREATE_ITEM", "create_item"); + is->setItem(newItem); + //Undo target rests with the Page for object specific undo + int pindex = (newItem->OwnPage > -1) ? newItem->OwnPage : 0; + UndoObject *target = Doc->Pages->at(pindex); + undoManager->action(target, is); + } + } + double x2, y2, w, h; + // We disable undo temporarily as move actions are not necessary + // to perform undo correctly here + undoManager->setUndoEnabled(false); + Doc->m_Selection->getGroupRect(&x2, &y2, &w, &h); + Doc->moveGroup(dropPosDoc.x() - x2, dropPosDoc.y() - y2); + m_ScMW->propertiesPalette->updateColorList(); + m_ScMW->propertiesPalette->paraStyleCombo->updateFormatList(); + m_ScMW->propertiesPalette->charStyleCombo->updateFormatList(); + m_ScMW->propertiesPalette->SetLineFormats(Doc); + undoManager->setUndoEnabled(true); + } + } + } + } + } + else + { + emit LoadElem(QString(text), dropPosDoc.x(), dropPosDoc.y(), false, false, Doc, this); + } + Selection tmpSelection(this, false); + tmpSelection.copy(*Doc->m_Selection, true); + for (int as = oldDocItemCount; as < Doc->Items->count(); ++as) + { + currItem = Doc->Items->at(as); + Doc->setRedrawBounding(currItem); + tmpSelection.addItem(currItem, true); + if (currItem->isBookmark) + emit AddBM(currItem); + } + Doc->m_Selection->copy(tmpSelection, false); + activeTransaction->commit(); + delete activeTransaction; + activeTransaction = NULL; + } + else + { + if (Doc->DraggedElem != 0) + { + if (!Doc->leaveDrag) + { + QMenu *pmen = new QMenu(); + qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor)); + pmen->addAction( tr("Copy Here")); + QAction* mov = pmen->addAction( tr("Move Here")); + pmen->addAction( tr("Cancel")); + for (int dre=0; dre<Doc->DragElements.count(); ++dre) + { + if (Doc->Items->at(Doc->DragElements[dre])->locked()) + { + mov->setEnabled(false); + break; + } + } + re = pmen->actions().indexOf(pmen->exec(QCursor::pos())); + delete pmen; + pmen=NULL; + } + else + re = 1; + if ((re == 2) || (re == -1)) + { + updateContents(); + return; + } + if ((re == 1) || (Doc->leaveDrag)) + { + QList<PageItem*> pasted; + emit LoadElem(QString(text), dropPosDoc.x(), dropPosDoc.y(), false, false, Doc, this); + for (int as = oldDocItemCount; as < Doc->Items->count(); ++as) + { + pasted.append(Doc->Items->at(as)); + } + Selection tmpSelection(this, false); + tmpSelection.copy(*Doc->m_Selection, true); + for (int dre=0; dre<Doc->DragElements.count(); ++dre) + { + tmpSelection.addItem(Doc->Items->at(Doc->DragElements[dre]), true); + } + Doc->m_Selection->copy(tmpSelection, false); + PageItem* bb; + int fin; + for (int dre=0; dre<Doc->DragElements.count(); ++dre) + { + bb = pasted.at(dre); + currItem = Doc->m_Selection->itemAt(dre); + if ((currItem->asTextFrame()) && ((currItem->nextInChain() != 0) || (currItem->prevInChain() != 0))) + { + PageItem* before = currItem->prevInChain(); + PageItem* after = currItem->nextInChain(); + currItem->unlink(); + if (before != 0) + { + fin = Doc->m_Selection->findItem(before); + if (fin != -1) + before = pasted.at(fin); + before->unlink(); + before->link(bb); + } + if (after != 0) + { + fin = Doc->m_Selection->findItem(after); + if (fin != -1) + after = pasted.at(fin); + bb->link(after); + } + } + } + pasted.clear(); + Doc->itemSelection_DeleteItem(); + } + } + if ((!img) && ((re == 0))) + emit LoadElem(QString(text), dropPosDoc.x(), dropPosDoc.y(), false, false, Doc, this); + Doc->DraggedElem = 0; + Doc->DragElements.clear(); + Selection tmpSelection(this, false); + tmpSelection.copy(*Doc->m_Selection, true); + for (int as = oldDocItemCount; as < Doc->Items->count(); ++as) + { + currItem = Doc->Items->at(as); + Doc->setRedrawBounding(currItem); + tmpSelection.addItem(currItem, true); + if (currItem->isBookmark) + emit AddBM(currItem); + } + Doc->m_Selection->copy(tmpSelection, false); + } + if (Doc->m_Selection->count() > 1) + { + Doc->m_Selection->connectItemToGUI(); + Doc->m_Selection->setGroupRect(); + double gx, gy, gh, gw; + Doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh); + double nx = gx; + double ny = gy; + if (!Doc->ApplyGuides(&nx, &ny)) + { + FPoint npx; + npx = Doc->ApplyGridF(FPoint(nx, ny)); + nx = npx.x(); + ny = npx.y(); + } + activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::SelectionGroup, Um::IGroup, Um::Move,"",Um::IMove)); + Doc->moveGroup(nx-gx, ny-gy, false); + Doc->m_Selection->setGroupRect(); + Doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh); + nx = gx+gw; + ny = gy+gh; + Doc->ApplyGuides(&nx, &ny); + Doc->moveGroup(nx-(gx+gw), ny-(gy+gh), false); + Doc->m_Selection->setGroupRect(); + Doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh); + for (int a = 0; a < Doc->m_Selection->count(); ++a) + { + PageItem *currItem = Doc->m_Selection->itemAt(a); + currItem->LayerNr = Doc->activeLayer(); + currItem->gXpos = currItem->xPos() - gx; + currItem->gYpos = currItem->yPos() - gy; + currItem->gWidth = gw; + currItem->gHeight = gh; + } + activeTransaction->commit(); + delete activeTransaction; + activeTransaction = NULL; + emit ItemPos(gx, gy); + emit ItemGeom(gw, gh); + } + else if (Doc->m_Selection->count() == 1) + { + Doc->m_Selection->connectItemToGUI(); + currItem = Doc->m_Selection->itemAt(0); + currItem->LayerNr = Doc->activeLayer(); + if (Doc->useRaster) + { + double nx = currItem->xPos(); + double ny = currItem->yPos(); + if (!Doc->ApplyGuides(&nx, &ny)) + { + FPoint npx; + npx = Doc->ApplyGridF(FPoint(nx, ny)); + nx = npx.x(); + ny = npx.y(); + } + Doc->MoveItem(nx-currItem->xPos(), ny-currItem->yPos(), currItem); + } + } + if ((Doc->m_Selection->count() > 0) && (Doc->appMode != modeNormal)) + this->requestMode(modeNormal); + updateContents(); + } + if (!Doc->masterPageMode()) + { + uint docPagesCount=Doc->Pages->count(); + uint docCurrPageNo=Doc->currentPageNumber(); + for (uint i = 0; i < docPagesCount; ++i) + { + double x = Doc->Pages->at(i)->xOffset(); + double y = Doc->Pages->at(i)->yOffset(); + double w = Doc->Pages->at(i)->width(); + double h = Doc->Pages->at(i)->height(); + if (QRectF(x, y, w, h).contains(dropPosDocQ)) + { + if (docCurrPageNo != i) + { + Doc->setCurrentPage(Doc->Pages->at(i)); + setMenTxt(i); + DrawNew(); + } + break; + } + } + setRulerPos(contentsX(), contentsY()); + } + } +} + + +/* +void ScribusView::normalizeSelectionRect() // unsused +{ + if(Mxp > SeRx) + { + int tmp = SeRx; + SeRx = Mxp; + Mxp = tmp; + } + if(Myp > SeRy) + { + int tmp = SeRy; + SeRy = Myp; + Myp = tmp; + } +} +*/ + + +void ScribusView::getDragRectScreen(double *x, double *y, double *w, double *h) +{ + QPoint in(qRound(dragX*m_canvas->scale()), qRound(dragY*m_canvas->scale())); +// in -= QPoint(qRound(Doc->minCanvasCoordinate.x() * m_canvas->scale()), qRound(Doc->minCanvasCoordinate.y() * m_canvas->scale())); + QPoint out = contentsToViewport(in); + *x = static_cast<double>(out.x()); + *y = static_cast<double>(out.y()); + *w = dragW*m_canvas->scale(); + *h = dragH*m_canvas->scale(); +} + +void ScribusView::getGroupRectScreen(double *x, double *y, double *w, double *h) +{ + double gx, gy, gh, gw; + Doc->m_Selection->getGroupRect(&gx, &gy, &gw, &gh); + QPoint in(qRound(gx*m_canvas->scale()), qRound(gy*m_canvas->scale())); +// in -= QPoint(qRound(Doc->minCanvasCoordinate.x() * m_canvas->scale()), qRound(Doc->minCanvasCoordinate.y() * m_canvas->scale())); + QPoint out = contentsToViewport(in); + *x = static_cast<double>(out.x()); + *y = static_cast<double>(out.y()); + *w = gw*m_canvas->scale(); + *h = gh*m_canvas->scale(); +} + + + +void ScribusView::RefreshGradient(PageItem *currItem, double dx, double dy) +{ + QMatrix matrix; + QRect rect = currItem->getRedrawBounding(m_canvas->scale()); + m_canvas->Transform(currItem, matrix); + FPointArray fpNew; + fpNew.setPoints(2, currItem->GrStartX, currItem->GrStartY, currItem->GrEndX, currItem->GrEndY); + fpNew.map(matrix); + if (dx < 8.0) dx = 8.0; + if (dy < 8.0) dy = 8.0; + int grl = (int) floor( qMin(fpNew.point(0).x(), fpNew.point(1).x()) - dx ); + int grr = (int) ceil ( qMax(fpNew.point(0).x(), fpNew.point(1).x()) + dx ); + int grb = (int) ceil ( qMax(fpNew.point(0).y(), fpNew.point(1).y()) + dy ); + int grt = (int) floor( qMin(fpNew.point(0).y(), fpNew.point(1).y()) - dy ); + rect |= QRect(grl, grt, grr-grl, grb-grt); + updateContents(rect); +} + + +//CB-->elsewhere, util, however, only used in the view for now +bool ScribusView::PointOnLine(QPoint Start, QPoint End, QRect MArea) +{ + QPoint an, en; + if (Start.x() == End.x()) + { + an = Start.y() > End.y() ? End : Start; + en = an == End ? Start : End; + for (int a=an.y(); a<en.y(); ++a) + { + if (MArea.contains(an.x(), a)) + return true; + } + } + if (Start.y() == End.y()) + { + an = Start.x() > End.x() ? End : Start; + en = an == End ? Start : End; + for (int a=an.x(); a<en.x(); ++a) + { + if (MArea.contains(a, an.y())) + return true; + } + } + if (abs(Start.x() - End.x()) > abs(Start.y() - End.y())) + { + an = Start.x() > End.x() ? End : Start; + en = an == End ? Start : End; + double stg = (en.y() - an.y()) / static_cast<double>((en.x() - an.x())); + for (int a = an.x(); a < en.x(); ++a) + { + if (MArea.contains(a, an.y()+qRound((a-an.x())*stg))) + return true; + } + } + else + { + an = Start.y() > End.y() ? End : Start; + en = an == End ? Start : End; + double stg = (en.x() - an.x()) / static_cast<double>((en.y() - an.y())); + for (int a = an.y(); a < en.y(); ++a) + { + if (MArea.contains(an.x()+qRound((a-an.y())*stg), a)) + return true; + } + } + return false; +} + +//CB-->Doc?? +void ScribusView::TransformPoly(int mode, int rot, double scaling) +{ + PageItem *currItem = Doc->m_Selection->itemAt(0); + currItem->ClipEdited = true; + QMatrix ma; + if (Doc->nodeEdit.isContourLine) + { + FPoint tp2(getMinClipF(&currItem->ContourLine)); + FPoint tp(getMaxClipF(&currItem->ContourLine)); + currItem->ContourLine.translate(-qRound((tp.x() + tp2.x()) / 2.0), -qRound((tp.y() + tp2.y()) / 2.0)); + switch (mode) + { + case 0: + ma.rotate(-rot); + break; + case 1: + ma.rotate(rot); + break; + case 2: + ma.scale(1.0 - (scaling / 100.0), 1.0 - (scaling / 100.0)); + break; + case 3: + ma.scale(1.0 + (scaling / 100.0), 1.0 + (scaling / 100.0)); + break; + case 4: + ma.shear(0.017455, 0); + break; + case 5: + ma.shear(-0.017455, 0); + break; + case 6: + ma.shear(0, -0.017455); + break; + case 7: + ma.shear(0, 0.017455); + break; + case 8: + { + double sx=(tp.x() - tp2.x() - scaling) / (tp.x() - tp2.x()); + double sy=(tp.y() - tp2.y() - scaling) / (tp.y() - tp2.y()); + ma.scale(sx, sy); + } + break; + case 9: + { + double sx=(tp.x() - tp2.x() + scaling) / (tp.x() - tp2.x()); + double sy=(tp.y() - tp2.y() + scaling) / (tp.y() - tp2.y()); + ma.scale(sx, sy); + } + break; + //10-13 are for scaling the contour line in shape edit mode + case 10: + { + double s=1.0 - (scaling/(tp2.x() - tp.x())); + ma.scale(s, 1); + ma.translate(-scaling/s/2,0); + } + break; + case 11: + { + double s=1.0 - (scaling/(tp2.x() - tp.x())); + ma.scale(s, 1); + ma.translate(scaling/s/2,0); + } + break; + case 12: + { + double s=1.0 - (scaling/(tp2.y() - tp.y())); + ma.scale(1, s); + ma.translate(0,-scaling/s/2); + } + break; + case 13: + { + double s=1.0 - (scaling/(tp2.y() - tp.y())); + ma.scale(1, s); + ma.translate(0,scaling/s/2); + } + break; + } + currItem->ContourLine.map(ma); + currItem->ContourLine.translate(qRound((tp.x() + tp2.x()) / 2.0), qRound((tp.y() + tp2.y()) / 2.0)); + updateContents(); + currItem->FrameOnly = true; + updateContents(currItem->getRedrawBounding(m_canvas->scale())); + if (UndoManager::undoEnabled()) + { + undoManager->setUndoEnabled(false); + currItem->checkChanges(true); + undoManager->setUndoEnabled(true); + SimpleState *ss = new SimpleState(Um::EditContourLine, "", Um::IBorder); + ss->set("EDIT_CONTOUR", "edit_contour"); + ss->set("MODE", mode); + ss->set("ROT", rot); + ss->set("SCALING", scaling); + undoManager->action(currItem, ss); + } + emit DocChanged(); + return; + } + FPoint oldPos(currItem->xyPos()); + double offsX = currItem->width() / 2.0; + double offsY = currItem->height() / 2.0; + double oldWidth = currItem->width(); + double oldHeight = currItem->height(); + ma.translate(-offsX, -offsY); + switch (mode) + { + case 0: + ma.rotate(-rot); + break; + case 1: + ma.rotate(rot); + break; + case 2: + ma.scale(1.0 - (scaling / 100.0), 1.0 - (scaling / 100.0)); + break; + case 3: + ma.scale(1.0 + (scaling / 100.0), 1.0 + (scaling / 100.0)); + break; + case 4: + ma.shear(0.017455, 0); + break; + case 5: + ma.shear(-0.017455, 0); + break; + case 6: + ma.shear(0, -0.017455); + break; + case 7: + ma.shear(0, 0.017455); + break; + case 8: + ma.scale(1.0 - (scaling / oldWidth),1.0 - (scaling / oldHeight)); + break; + case 9: + ma.scale(1.0 + (scaling / oldWidth),1.0 + (scaling / oldHeight)); + break; + } + currItem->PoLine.map(ma); + currItem->PoLine.translate(offsX, offsY); + Doc->AdjustItemSize(currItem); + QMatrix ma2; + ma2.translate(oldPos.x(), oldPos.y()); + ma2.scale(1, 1); + ma2.translate(offsX, offsY); + FPoint n(-offsX, -offsY); + switch (mode) + { + case 0: + ma2.rotate(-rot); + break; + case 1: + ma2.rotate(rot); + break; + case 2: + ma2.scale(1.0 - (scaling / 100.0), 1.0 - (scaling / 100.0)); + break; + case 3: + ma2.scale(1.0 + (scaling / 100.0), 1.0 + (scaling / 100.0)); + break; + case 4: + ma2.shear(0.017455, 0); + break; + case 5: + ma2.shear(-0.017455, 0); + break; + case 6: + ma2.shear(0, -0.017455); + break; + case 7: + ma2.shear(0, 0.017455); + break; + case 8: + ma2.scale(1.0 - (scaling / oldWidth),1.0 - (scaling / oldHeight)); + break; + case 9: + ma2.scale(1.0 + (scaling / oldWidth),1.0 + (scaling / oldHeight)); + break; + } + double x = ma2.m11() * n.x() + ma2.m21() * n.y() + ma2.dx(); + double y = ma2.m22() * n.y() + ma2.m12() * n.x() + ma2.dy(); + Doc->MoveItem(x-oldPos.x(), y-oldPos.y(), currItem); + if (currItem->asPathText()) + currItem->updatePolyClip(); + Doc->setRedrawBounding(currItem); + currItem->update(); +// MarkClip(currItem, currItem->PoLine, true); + currItem->FrameType = 3; + if (UndoManager::undoEnabled()) + { + undoManager->setUndoEnabled(false); + currItem->checkChanges(true); + undoManager->setUndoEnabled(true); + SimpleState *ss = new SimpleState(Um::EditShape, "", Um::IBorder); + ss->set("EDIT_SHAPE", "edit_shape"); + ss->set("MODE", mode); + ss->set("ROT", rot); + ss->set("SCALING", scaling); + undoManager->action(currItem, ss); + } + emit DocChanged(); +} + +/* +void ScribusView::Reset1Control() +{ + Doc->nodeEdit.reset1Control(Doc->m_Selection->itemAt(0)); +} + +void ScribusView::ResetControl() +{ + PageItem *currItem = Doc->m_Selection->itemAt(0); + Doc->nodeEdit.resetControl(currItem); +} +*/ + +/* +//CB-->Doc +void ScribusView::moveGroup(double x, double y, bool fromMP, Selection* customSelection) +{ + Selection* itemSelection = (customSelection!=0) ? customSelection : Doc->m_Selection; + Q_ASSERT(itemSelection!=0); + uint selectedItemCount=itemSelection->count(); + if (selectedItemCount == 0) + return; + + if (!_groupTransactionStarted && selectedItemCount > 1) + { + QString tooltip = Um::ItemsInvolved + "\n"; + for (uint i = 0; i < selectedItemCount; ++i) + tooltip += "\t" + itemSelection->itemAt(i)->getUName() + "\n"; + undoManager->beginTransaction(Um::SelectionGroup, Um::IGroup, + Um::Move, tooltip, Um::IMove); + _groupTransactionStarted = true; + } + + Doc->moveGroup(x, y, fromMP, itemSelection); +} + +//CB-->Doc +void ScribusView::RotateGroup(double win) +{ + if (!_groupTransactionStarted && Doc->m_Selection->count() > 1) + { + QString tooltip = Um::ItemsInvolved + "\n"; + for (int i = 0; i < Doc->m_Selection->count(); ++i) + tooltip += "\t" + Doc->m_Selection->itemAt(i)->getUName() + "\n"; + undoManager->beginTransaction(Um::SelectionGroup, Um::IGroup, + Um::Rotate, tooltip, Um::IRotate); + _groupTransactionStarted = true; + } + + Doc->rotateGroup(win, RCenter); +} + + + +void ScribusView::scaleGroup(double scx, double scy, bool scaleText, Selection* customSelection) +{ + Selection* itemSelection = (customSelection!=0) ? customSelection : Doc->m_Selection; + Q_ASSERT(itemSelection!=0); + uint selectedItemCount=itemSelection->count(); + if (selectedItemCount == 0) + return; + + if (!_groupTransactionStarted && selectedItemCount > 1) + { + QString tooltip = Um::ItemsInvolved + "\n"; + for (uint i = 0; i < selectedItemCount; ++i) + tooltip += "\t" + itemSelection->itemAt(i)->getUName() + "\n"; + undoManager->beginTransaction(Um::SelectionGroup, Um::IGroup, + Um::Resize, tooltip, Um::IResize); + _groupTransactionStarted = true; + } + + Doc->scaleGroup(scx, scy, scaleText, itemSelection); + emit DocChanged(); +} +*/ + + +bool ScribusView::slotSetCurs(int x, int y) +{ + PageItem *currItemGeneric; + if (GetItem(&currItemGeneric)) + { + if (!((currItemGeneric->asTextFrame()) || (currItemGeneric->asImageFrame()))) + return false; + // unsed by gcc warning - PV + //int xP = qRound(x/m_canvas->scale() + Doc->minCanvasCoordinate.x()); + //int yP = qRound(y/m_canvas->scale() + Doc->minCanvasCoordinate.y()); + if (currItemGeneric->asImageFrame()) + return true; + PageItem_TextFrame *currItem=currItemGeneric->asTextFrame(); + if (currItem==0) + return false; + + FPoint pf(m_canvas->globalToCanvas(QPoint(x,y))); + if( m_canvas->frameHitTest(QPointF(pf.x(),pf.y()), currItem) == Canvas::INSIDE ) + { + // #9592 : layout must be valid here, or screenToPosition() may crash + if (currItem->invalid) + currItem->layout(); + + QMatrix transform = currItem->getTransform(); + FPoint point(pf.x() - currItem->xPos(), pf.y() - currItem->yPos()); + if (transform.isInvertible() && currItem->itemText.length() > 0) + { + double tx = 0, ty = 0; + transform.inverted().map(pf.x(), pf.y(), &tx, &ty); + point.setXY(tx, ty); + } + if (currItem->reversed()) + point.setX(currItem->width() - point.x()); + currItem->itemText.setCursorPosition( currItem->itemText.length() == 0 ? 0 : + currItem->itemText.screenToPosition(point) ); + + if (currItem->itemText.length() > 0) + { + int b = qMin(currItem->itemText.cursorPosition() - 1, currItem->itemText.length()); + if (b < 0) + b = 0; + Doc->currentStyle.charStyle() = currItem->itemText.charStyle(b); + emit ItemTextStrike(Doc->currentStyle.charStyle().strikethruOffset(), Doc->currentStyle.charStyle().strikethruWidth()); + emit ItemTextUnderline(Doc->currentStyle.charStyle().underlineOffset(), Doc->currentStyle.charStyle().underlineWidth()); + emit ItemTextOutline(Doc->currentStyle.charStyle().outlineWidth()); + emit ItemTextShadow(Doc->currentStyle.charStyle().shadowXOffset(), Doc->currentStyle.charStyle().shadowYOffset()); + emit ItemTextSca(Doc->currentStyle.charStyle().scaleH()); + emit ItemTextScaV(Doc->currentStyle.charStyle().scaleV()); + emit ItemTextFarben(Doc->currentStyle.charStyle().strokeColor(), Doc->currentStyle.charStyle().fillColor(), Doc->currentStyle.charStyle().strokeShade(), Doc->currentStyle.charStyle().fillShade()); + emit ItemTextFont(Doc->currentStyle.charStyle().font().scName()); + emit ItemTextSize(Doc->currentStyle.charStyle().fontSize()); + emit ItemTextUSval(Doc->currentStyle.charStyle().tracking()); + emit ItemTextStil(Doc->currentStyle.charStyle().effects()); + emit ItemTextAbs(currItem->itemText.paragraphStyle(b).alignment()); + emit ItemTextBase(Doc->currentStyle.charStyle().baselineOffset()); + return true; + } + else + { + Doc->currentStyle.charStyle() = currItem->itemText.defaultStyle().charStyle(); + emit ItemTextStrike(currItem->itemText.defaultStyle().charStyle().strikethruOffset(), currItem->itemText.defaultStyle().charStyle().strikethruWidth()); + emit ItemTextUnderline(currItem->itemText.defaultStyle().charStyle().underlineOffset(), currItem->itemText.defaultStyle().charStyle().underlineWidth()); + emit ItemTextOutline(currItem->itemText.defaultStyle().charStyle().outlineWidth()); + emit ItemTextShadow(currItem->itemText.defaultStyle().charStyle().shadowXOffset(), currItem->itemText.defaultStyle().charStyle().shadowYOffset()); + emit ItemTextSca(currItem->itemText.defaultStyle().charStyle().scaleH()); + emit ItemTextScaV(currItem->itemText.defaultStyle().charStyle().scaleV()); + emit ItemTextFarben(currItem->itemText.defaultStyle().charStyle().strokeColor(), currItem->itemText.defaultStyle().charStyle().fillColor(), currItem->itemText.defaultStyle().charStyle().strokeShade(), currItem->itemText.defaultStyle().charStyle().fillShade()); + emit ItemTextFont(currItem->itemText.defaultStyle().charStyle().font().scName()); + emit ItemTextSize(currItem->itemText.defaultStyle().charStyle().fontSize()); + emit ItemTextUSval(currItem->itemText.defaultStyle().charStyle().tracking()); + emit ItemTextStil(currItem->itemText.defaultStyle().charStyle().effects()); + emit ItemTextAbs( 0 ); + emit ItemTextBase(currItem->itemText.defaultStyle().charStyle().baselineOffset()); + return true; + } + } + } + return false; +} + + +void ScribusView::dragTimerTimeOut() +{ + m_dragTimerFired = true; + // #0007865 +// qApp->changeOverrideCursor(QCursor(loadIcon("DragPix.xpm"))); +} + +void ScribusView::HandleCurs(PageItem *currItem, QRect mpo) +{ + QPoint tx, tx2; + QMatrix ma; +// ma.translate(-Doc->minCanvasCoordinate.x()*m_canvas->scale(), -Doc->minCanvasCoordinate.y()*m_canvas->scale()); + m_canvas->Transform(currItem, ma); + tx = ma.map(QPoint(static_cast<int>(currItem->width()), 0)); + tx2 = ma.map(QPoint(0, static_cast<int>(currItem->height()))); + if (mpo.contains(tx) || mpo.contains(tx2)) + { + if (Doc->appMode == modeRotation) + qApp->changeOverrideCursor(QCursor(loadIcon("Rotieren2.png"))); + else + { + double rr = fabs(currItem->rotation()); + if (((rr >= 0.0) && (rr < 45.0)) || ((rr >= 135.0) && (rr < 225.0)) || ((rr >=315.0) && (rr <= 360.0))) + qApp->changeOverrideCursor(QCursor(Qt::SizeBDiagCursor)); + if (((rr >= 45.0) && (rr < 135.0)) || ((rr >= 225.0) && (rr < 315.0))) + qApp->changeOverrideCursor(QCursor(Qt::SizeFDiagCursor)); + } + } + tx = ma.map(QPoint(static_cast<int>(currItem->width()), static_cast<int>(currItem->height())/2)); + tx2 = ma.map(QPoint(0, static_cast<int>(currItem->height())/2)); + if (mpo.contains(tx) || mpo.contains(tx2)) + { + double rr = fabs(currItem->rotation()); + if (((rr >= 0.0) && (rr < 45.0)) || ((rr >= 135.0) && (rr < 225.0)) || ((rr >= 315.0) && (rr <= 360.0))) + qApp->changeOverrideCursor(QCursor(Qt::SizeHorCursor)); + if (((rr >= 45.0) && (rr < 135.0)) || ((rr >= 225.0) && (rr < 315.0))) + qApp->changeOverrideCursor(QCursor(Qt::SizeVerCursor)); + } + tx = ma.map(QPoint(static_cast<int>(currItem->width())/2, 0)); + tx2 = ma.map(QPoint(static_cast<int>(currItem->width())/2, static_cast<int>(currItem->height()))); + if (mpo.contains(tx) || mpo.contains(tx2)) + { + double rr = fabs(currItem->rotation()); + if (((rr >= 0.0) && (rr < 45.0)) || ((rr >= 135.0) && (rr < 225.0)) || ((rr >= 315.0) && (rr <= 360.0))) + qApp->changeOverrideCursor(QCursor(Qt::SizeVerCursor)); + if (((rr >= 45.0) && (rr < 135.0)) || ((rr >= 225.0) && (rr < 315.0))) + qApp->changeOverrideCursor(QCursor(Qt::SizeHorCursor)); + } + tx = ma.map(QPoint(static_cast<int>(currItem->width()), static_cast<int>(currItem->height()))); + tx2 = ma.map(QPoint(0, 0)); + if (mpo.contains(tx) || mpo.contains(tx2)) + { + if (Doc->appMode == modeRotation) + qApp->changeOverrideCursor(QCursor(loadIcon("Rotieren2.png"))); + else + { + double rr = fabs(currItem->rotation()); + if (((rr >= 0.0) && (rr < 45.0)) || ((rr >= 135.0) && (rr < 225.0)) || + ((rr >= 315.0) && (rr <= 360.0))) + qApp->changeOverrideCursor(QCursor(Qt::SizeFDiagCursor)); + if (((rr >= 45.0) && (rr < 135.0)) || ((rr >= 225.0) && (rr < 315.0))) + qApp->changeOverrideCursor(QCursor(Qt::SizeBDiagCursor)); + } + } + if (Doc->appMode == modeEditClip) + qApp->changeOverrideCursor(QCursor(Qt::CrossCursor)); +} + +void ScribusView::SelectItemNr(uint nr, bool draw, bool single) +{ + if (nr < static_cast<uint>(Doc->Items->count())) + SelectItem(Doc->Items->at(nr), draw, single); +} + +//CB-->Doc/Fix +void ScribusView::SelectItem(PageItem *currItem, bool draw, bool single) +{ + if (!currItem->isSelected()) + { + if (single) + { + Doc->m_Selection->addItem(currItem); + currItem->isSingleSel = true; + updateContents(currItem->getRedrawBounding(m_canvas->scale())); + } + else + { + if (currItem->Groups.count() != 0) + { + if (Doc->m_Selection->findItem(currItem) == -1) + Doc->m_Selection->addItem(currItem); + + for (int ga=0; ga < Doc->Items->count(); ++ga) + { + if (Doc->Items->at(ga)->Groups.count() <= 0) + continue; + if (Doc->Items->at(ga)->Groups.top() != currItem->Groups.top()) + continue; + if (Doc->Items->at(ga)->ItemNr != currItem->ItemNr) + { + if (Doc->m_Selection->findItem(Doc->Items->at(ga)) == -1) + Doc->m_Selection->addItem(Doc->Items->at(ga)); + } + if (draw) + { + updateContents(currItem->getRedrawBounding(m_canvas->scale())); + } + } + } + else + { + Doc->m_Selection->addItem(currItem); + if (draw) + { + updateContents(currItem->getRedrawBounding(m_canvas->scale())); + } + } + //CB FIXME/TODO We are surely prepending here and we have turned off + //emitting in prepend below so do it here. + //Doc->m_Selection->itemAt(0)->emitAllToGUI(); + } + } + else + { + //CB Prepend used to occur to enable level changes to work properly, however with + //current selection code we dont seem to need that anymore + /* + if (Doc->m_Selection->count() > 1) + { + PageItem *bb = Doc->m_Selection->itemAt(0); + Doc->m_Selection->removeItem(currItem); + Doc->m_Selection->prependItem(currItem, false); + currItem->paintObj(); + bb->paintObj(); + }*/ + } + if (draw) + { + if (Doc->m_Selection->count() > 1) + { + Doc->m_Selection->setGroupRect(); + double x, y, w, h; + Doc->m_Selection->getGroupRect(&x, &y, &w, &h); + emit ItemPos(x, y); + emit ItemGeom(w, h); + getGroupRectScreen(&x, &y, &w, &h); + updateContents(QRect(static_cast<int>(x-5), static_cast<int>(y-5), static_cast<int>(w+10), static_cast<int>(h+10))); + //CB move in here as the emitAllToGUI will do it otherwise + emit HaveSel(currItem->itemType()); + } + //CB done by addItem for single selection or the frame data is already there + //else + //EmitValues(currItem); + //currItem->emitAllToGUI(); + } +} + +void ScribusView::selectionChanged() +{ + if (m_ScMW->isObjectSpecificUndo()) + { + uint docSelectionCount=Doc->m_Selection->count(); + if (docSelectionCount == 1) + undoManager->showObject(Doc->m_Selection->itemAt(0)->getUId()); + else if (docSelectionCount == 0) + undoManager->showObject(Doc->currentPage()->getUId()); + else + undoManager->showObject(Um::NO_UNDO_STACK); + } +} + +bool ScribusView::GetItem(PageItem **currItem, int nr) +{ + int n=nr; + if (n == -1) + n=0; + *(currItem) = Doc->m_Selection->itemAt(n); + return (*(currItem)!=NULL); +} + +//CB Remove bookmark interaction here, item/doc should do it +void ScribusView::Deselect(bool prop) +{ + if (!Doc->m_Selection->isEmpty()) + { + const double scale = m_canvas->scale(); + PageItem* currItem=NULL; + for (int a = 0; a < Doc->m_Selection->count(); ++a) + { + currItem = Doc->m_Selection->itemAt(a); + if ((currItem->asTextFrame()) && (currItem->isBookmark)) + emit ChBMText(currItem); + } + if (Doc->m_Selection->isMultipleSelection()) + { + double x, y, w, h; + Doc->m_Selection->getGroupRect(&x, &y, &w, &h); + Doc->m_Selection->clear(); + updateCanvas(x - 5/scale, y - 5/scale, w + 10/scale, h + 10/scale); + } + else + { + currItem = Doc->m_Selection->itemAt(0); + if (currItem != NULL) + { + currItem->itemText.deselectAll(); + currItem->HasSel = false; + } + Doc->m_Selection->clear(); + if (currItem != NULL) + updateContents(currItem->getRedrawBounding(scale)); + } + } + if (prop && !Doc->m_Selection->signalsDelayed()) + emit HaveSel(-1); +} + + +//CB-->Doc/Fix +void ScribusView::ToggleBookmark() +{ + uint docSelectionCount=Doc->m_Selection->count(); + if (docSelectionCount != 0) + { + for (uint a = 0; a < docSelectionCount; ++a) + { + PageItem* currItem = Doc->m_Selection->itemAt(a); + if (currItem->asTextFrame()) + { + if (currItem->OwnPage != -1) + { + bool old = currItem->isBookmark; + currItem->isBookmark = !currItem->isBookmark; + if (currItem->isBookmark) + { + currItem->setIsAnnotation(false); + emit AddBM(currItem); + } + else + { + if (old) + emit DelBM(currItem); + } + } + } + } + m_ScMW->actionManager->setPDFActions(this); + emit DocChanged(); + } +} + +//CB-->Doc/Fix +void ScribusView::ToggleAnnotation() +{ + if (Doc->m_Selection->count() != 0) + { + for (int a = 0; a < Doc->m_Selection->count(); ++a) + { + PageItem* currItem = Doc->m_Selection->itemAt(a); + if (currItem->asTextFrame()) + { + bool old = currItem->isBookmark; + currItem->setIsAnnotation(!currItem->isAnnotation()); + if (currItem->isAnnotation()) + { + currItem->AutoName = false; + if (Doc->masterPageMode()) + { + currItem->annotation().setType(11); + currItem->annotation().setZiel(0); + currItem->annotation().setAction("0 0"); + } + if (old) + emit DelBM(currItem); + currItem->isBookmark = false; + } + } + } + m_ScMW->actionManager->setPDFActions(this); + emit DocChanged(); + } +} + +//CB Unused +// void ScribusView::sentToScrap() +// { +// ScriXmlDoc *ss = new ScriXmlDoc(); +// emit ToScrap(ss->WriteElem(Doc, this, Doc->m_Selection)); +// delete ss; +// ss=NULL; +// } + +//CB-->Doc/Fix +void ScribusView::ToBack() +{ + if (Doc->sendItemSelectionToBack()) + { +// m_ScMW->outlinePalette->BuildTree(); + emit LevelChanged(0); + emit DocChanged(); + m_canvas->m_viewMode.forceRedraw = true; + updateContents(); + } +} + +//CB-->Doc/Fix +void ScribusView::ToFront() +{ + if (Doc->bringItemSelectionToFront()) + { +// m_ScMW->outlinePalette->BuildTree(); + emit LevelChanged(Doc->m_Selection->itemAt(0)->ItemNr); + emit DocChanged(); + m_canvas->m_viewMode.forceRedraw = true; + updateContents(); + } +} + +//CB-->Doc/Fix +void ScribusView::LowerItem() +{ + uint low = Doc->Items->count(); + uint high = 0; + int d; + QMap<int, uint> ObjOrder; + PageItem *currItem; + PageItem *item2; + uint docSelectionCount=Doc->m_Selection->count(); + if ((Doc->Items->count() > 1) && (docSelectionCount != 0)) + { + for (uint c = 0; c < docSelectionCount; ++c) + { + currItem = Doc->m_Selection->itemAt(c); + if (currItem->isTableItem && currItem->isSingleSel) + return; + low = qMin(currItem->ItemNr, low); + high = qMax(currItem->ItemNr, high); + } + if (low == 0) + return; + bool wasSignalDelayed = !Doc->m_Selection->signalsDelayed(); + Doc->m_Selection->delaySignalsOn(); + if (!wasSignalDelayed) + Doc->m_Selection->disconnectAllItemsFromGUI(); + Selection tempSelection(*Doc->m_Selection); + if (Doc->Items->at(high)->Groups.count() != 0) + { + int groupID = Doc->Items->at(high)->Groups.top(); + while ((high + 1) < Doc->Items->count()) + { + if (Doc->Items->at(high + 1)->Groups.count() == 0) + break; + if (Doc->Items->at(high + 1)->Groups.count() != groupID) + break; + high += 1; + } + } + item2 = Doc->Items->at(high); + Doc->m_Selection->clear(); + if (Doc->Items->at(low)->Groups.count() != 0) + { + int groupID = Doc->Items->at(low)->Groups.top(); + while (low > 0) + { + if (Doc->Items->at(low - 1)->Groups.count() == 0) + break; + if (Doc->Items->at(low - 1)->Groups.count() != groupID) + break; + low -= 1; + } + if (low == 0) return; + } + SelectItemNr(low - 1, false); + for (int c = 0; c < Doc->m_Selection->count(); ++c) + { + currItem = Doc->m_Selection->itemAt(c); + ObjOrder.insert(currItem->ItemNr, c); + d = Doc->Items->indexOf(currItem); + Doc->Items->takeAt(d); + } + d = Doc->Items->indexOf(item2); + QList<uint> Oindex = ObjOrder.values(); + for (int c = static_cast<int>(Oindex.count()-1); c > -1; c--) + { + Doc->Items->insert(d+1, Doc->m_Selection->itemAt(Oindex[c])); + } + Doc->m_Selection->clear(); + Doc->renumberItemsInListOrder(); +// m_ScMW->outlinePalette->BuildTree(); + /*if (wasGUISelection) + tempSelection.setIsGUISelection(true);*/ + *Doc->m_Selection=tempSelection; + Doc->m_Selection->delaySignalsOff(); + emit LevelChanged(Doc->m_Selection->itemAt(0)->ItemNr); + emit DocChanged(); + m_canvas->m_viewMode.forceRedraw = true; + updateContents(); + } +} + +//CB-->Doc/Fix +void ScribusView::RaiseItem() +{ + uint low = Doc->Items->count(); + uint high = 0; + int d; + QMap<int, uint> ObjOrder; + PageItem *currItem; + PageItem *item2; + uint docSelectionCount=Doc->m_Selection->count(); + if ((Doc->Items->count() > 1) && (docSelectionCount != 0)) + { + for (uint c = 0; c < docSelectionCount; ++c) + { + currItem = Doc->m_Selection->itemAt(c); + if (currItem->isTableItem && currItem->isSingleSel) + return; + low = qMin(currItem->ItemNr, low); + high = qMax(currItem->ItemNr, high); + } + if (high == static_cast<uint>(Doc->Items->count()-1)) + return; + bool wasSignalDelayed = !Doc->m_Selection->signalsDelayed(); + Doc->m_Selection->delaySignalsOn(); + if (!wasSignalDelayed) + Doc->m_Selection->disconnectAllItemsFromGUI(); + Selection tempSelection(*Doc->m_Selection); + if (Doc->Items->at(low)->Groups.count() != 0) + { + int groupID = Doc->Items->at(low)->Groups.top(); + while (low > 0) + { + if (Doc->Items->at(low - 1)->Groups.count() == 0) + break; + if (Doc->Items->at(low - 1)->Groups.count() != groupID) + break; + low -= 1; + } + } + item2 = Doc->Items->at(low); + Doc->m_Selection->clear(); + if (Doc->Items->at(high)->Groups.count() != 0) + { + int groupID = Doc->Items->at(high)->Groups.top(); + while ((high + 1) < Doc->Items->count()) + { + if (Doc->Items->at(high + 1)->Groups.count() == 0) + break; + if (Doc->Items->at(high + 1)->Groups.count() != groupID) + break; + high += 1; + } + } + SelectItemNr(high + 1, false); + for (int c = 0; c < Doc->m_Selection->count(); ++c) + { + currItem = Doc->m_Selection->itemAt(c); + ObjOrder.insert(currItem->ItemNr, c); + d = Doc->Items->indexOf(currItem); + Doc->Items->takeAt(d); + } + d = Doc->Items->indexOf(item2); + if (d == -1) + d = 0; + QList<uint> Oindex = ObjOrder.values(); + for (int c = 0; c <static_cast<int>(Oindex.count()); ++c) + { + Doc->Items->insert(d + c, Doc->m_Selection->itemAt(Oindex[c])); + } + Doc->m_Selection->clear(); + Doc->renumberItemsInListOrder(); +// m_ScMW->outlinePalette->BuildTree(); + /*if (wasGUISelection) + tempSelection.setIsGUISelection(true);*/ + *Doc->m_Selection=tempSelection; + Doc->m_Selection->delaySignalsOff(); + emit LevelChanged(Doc->m_Selection->itemAt(0)->ItemNr); + emit DocChanged(); + m_canvas->m_viewMode.forceRedraw = true; + updateContents(); + } +} + + // FIXME:av -> CanvasMode_legacy / Doc +//CB Remove emit/start pasting objects +void ScribusView::PasteToPage() +{ + UndoTransaction* activeTransaction = NULL; + int ac = Doc->Items->count(); + if (UndoManager::undoEnabled()) + activeTransaction = new UndoTransaction(undoManager->beginTransaction(Doc->currentPage()->getUName(), 0, Um::Paste, "", Um::IPaste)); + if (ScMimeData::clipboardHasScribusFragment()) + { + bool savedAlignGrid = Doc->useRaster; + bool savedAlignGuides = Doc->SnapGuides; + QByteArray fragment = ScMimeData::clipboardScribusFragment(); + Selection pastedObjects = Serializer(*Doc).deserializeObjects(fragment); + Doc->useRaster = savedAlignGrid; + Doc->SnapGuides = savedAlignGuides; + pastedObjects.setGroupRect(); + double gx, gy, gh, gw; + pastedObjects.getGroupRect(&gx, &gy, &gw, &gh); + Doc->moveGroup(dragX - gx, dragY - gy, false, &pastedObjects); + Doc->m_Selection->clear(); + } + else + { + QString buffer = ScMimeData::clipboardScribusElem(); + emit LoadElem(buffer, dragX, dragY, false, false, Doc, this); + } + Doc->DraggedElem = 0; + Doc->DragElements.clear(); + updateContents(); + Selection newObjects(this, false); + for (int as = ac; as < Doc->Items->count(); ++as) + { + PageItem* currItem = Doc->Items->at(as); + if (currItem->isBookmark) + emit AddBM(currItem); + newObjects.addItem(currItem); + currItem->LayerNr = Doc->activeLayer(); + } + if (newObjects.count() > 1) + { + newObjects.setGroupRect(); + double gx, gy, gh, gw; + newObjects.getGroupRect(&gx, &gy, &gw, &gh); + double nx = gx; + double ny = gy; + if (!Doc->ApplyGuides(&nx, &ny)) + { + FPoint npx; + npx = Doc->ApplyGridF(FPoint(nx, ny)); + nx = npx.x(); + ny = npx.y(); + } + Doc->moveGroup(nx-gx, ny-gy, false, &newObjects); + newObjects.setGroupRect(); + newObjects.getGroupRect(&gx, &gy, &gw, &gh); + nx = gx+gw; + ny = gy+gh; + Doc->ApplyGuides(&nx, &ny); + Doc->moveGroup(nx-(gx+gw), ny-(gy+gh), false, &newObjects); + newObjects.setGroupRect(); + newObjects.getGroupRect(&gx, &gy, &gw, &gh); + emit ItemPos(gx, gy); + emit ItemGeom(gw, gh); + emit HaveSel(newObjects.itemAt(0)->itemType()); + } + else if (newObjects.count() == 1) + { + PageItem *currItem = newObjects.itemAt(0); + if (Doc->useRaster) + { + double nx = currItem->xPos(); + double ny = currItem->yPos(); + if (!Doc->ApplyGuides(&nx, &ny)) + { + FPoint npx; + npx = Doc->ApplyGridF(FPoint(nx, ny)); + nx = npx.x(); + ny = npx.y(); + } + Doc->MoveItem(nx-currItem->xPos(), ny-currItem->yPos(), currItem); + } + currItem->emitAllToGUI(); + } + else // newObjects.count() == 0 + { + if (activeTransaction) + { + activeTransaction->cancel(); + delete activeTransaction; + activeTransaction = NULL; + } + return; + } + newObjects.clear(); + if (activeTransaction) + { + activeTransaction->commit(); + delete activeTransaction; + activeTransaction = NULL; + } + emit DocChanged(); +} + +void ScribusView::resizeEvent ( QResizeEvent * event ) +{ +// qDebug() << "ScribusView::resizeEvent"; + QScrollArea::resizeEvent(event); + horizRuler->setGeometry(m_vhRulerHW, 1, width()-m_vhRulerHW-1, m_vhRulerHW); + vertRuler->setGeometry(1, m_vhRulerHW, m_vhRulerHW, height()-m_vhRulerHW-1); + rulerMover->setGeometry(1, 1, m_vhRulerHW, m_vhRulerHW); + m_canvas->m_viewMode.forceRedraw = true; + m_canvas->resetRenderMode(); + // Per Qt doc, not painting should be done in a resizeEvent, + // a paint event will be emitted right afterwards + // m_canvas->update(); +} + + +/** Waagrechter Scrollbalken */ +void ScribusView::setHBarGeometry(QScrollBar &bar, int x, int y, int w, int h) +{ + bar.setGeometry(x, y, w, h); + if (Ready) + horizRuler->setGeometry(m_vhRulerHW, 1, w-m_vhRulerHW-1, m_vhRulerHW); +} + +/** Senkrechter Scrollbalken */ +void ScribusView::setVBarGeometry(QScrollBar &bar, int x, int y, int w, int h) +{ + bar.setGeometry(x, y, w, h); + if (Ready) + { + vertRuler->setGeometry(1, m_vhRulerHW, m_vhRulerHW, h-m_vhRulerHW-1); + rulerMover->setGeometry(1, 1, m_vhRulerHW, m_vhRulerHW); + } +} + +bool ScribusView::mousePressed() +{ + return m_canvas->m_viewMode.m_MouseButtonPressed; +} + +void ScribusView::resetMousePressed() +{ + m_canvas->m_viewMode.m_MouseButtonPressed = false; +} + + +void ScribusView::startGroupTransaction(const QString& action, const QString& description, QPixmap* actionIcon, Selection* customSelection) +{ + Selection* itemSelection = (customSelection!=0) ? customSelection : Doc->m_Selection; + assert(itemSelection!=0); + uint selectedItemCount=itemSelection->count(); + Q_ASSERT(selectedItemCount > 0); + if (!m_groupTransaction) + { + QString tooltip = description; + QString target = Um::SelectionGroup; + QPixmap* targetIcon = Um::IGroup; + if (tooltip.isEmpty() && selectedItemCount > 1) + { + if (selectedItemCount <= Um::ItemsInvolvedLimit) + { + tooltip = Um::ItemsInvolved + "\n"; + for (uint i = 0; i < selectedItemCount; ++i) + tooltip += "\t" + itemSelection->itemAt(i)->getUName() + "\n"; + } + else + { + tooltip = Um::ItemsInvolved2 + "\n"; + } + } + if (selectedItemCount == 1) + { + target = itemSelection->itemAt(0)->getUName(); + targetIcon = itemSelection->itemAt(0)->getUPixmap(); + } + m_groupTransaction = new UndoTransaction(undoManager->beginTransaction(target, targetIcon, + action, tooltip, actionIcon)); + } + ++m_groupTransactions; +} + + +/** + +*/ +void ScribusView::endGroupTransaction() +{ + if(m_groupTransactions > 0) + { + --m_groupTransactions; + } + if (m_groupTransaction && m_groupTransactions == 0) + { + m_groupTransaction->commit(); + delete m_groupTransaction; + m_groupTransaction = NULL; + } +} + +/** + Always cancels the toplevel transaction and all enclosed ones + */ +void ScribusView::cancelGroupTransaction() +{ + if(m_groupTransaction && m_groupTransactions == 1) + { + m_groupTransaction->cancel(); + delete m_groupTransaction; + m_groupTransaction = NULL; + } + else if (m_groupTransaction) + { + m_groupTransaction->markFailed(); + } + if (m_groupTransactions > 0) + --m_groupTransactions; +} + + +// jjsa 27-03-2004 add for better setting while zooming +//CB find a new name +void ScribusView::rememberOldZoomLocation(int mx, int my) +{ + oldX = mx; + oldY = my; +} + +void ScribusView::setRulerPos(int x, int y) +{ + if (m_ScMW->scriptIsRunning()) + return; + if (Doc->guidesSettings.rulerMode) + { + horizRuler->shift(x / m_canvas->scale() - Doc->currentPage()->xOffset()); + vertRuler->shift(y / m_canvas->scale() - Doc->currentPage()->yOffset()); + } + else + { + horizRuler->shift(x / m_canvas->scale()); + vertRuler->shift(y / m_canvas->scale()); + } +// horizRuler->offs += qRound(Doc->minCanvasCoordinate.x() - 1 - Doc->rulerXoffset); +// vertRuler->offs += qRound(Doc->minCanvasCoordinate.y() - 1 - Doc->rulerYoffset); + horizRuler->shiftRel(0*Doc->minCanvasCoordinate.x() - Doc->rulerXoffset); + vertRuler->shiftRel(0*Doc->minCanvasCoordinate.y() - Doc->rulerYoffset); + horizRuler->update(); + vertRuler->update(); +// evSpon = true; + QString newStatusBarText(" "); + if ((verticalScrollBar()->isSliderDown()) || (horizontalScrollBar()->isSliderDown())) + { + QList<int> pag; + pag.clear(); + uint docPageCount=Doc->Pages->count(); + for (uint a = 0; a < docPageCount; ++a) + { + int xs = static_cast<int>(Doc->Pages->at(a)->xOffset() * m_canvas->scale()); + int ys = static_cast<int>(Doc->Pages->at(a)->yOffset() * m_canvas->scale()); + int ws = static_cast<int>(Doc->Pages->at(a)->width() * m_canvas->scale()); + int hs = static_cast<int>(Doc->Pages->at(a)->height() * m_canvas->scale()); + QRect drawRect = QRect(x, y, visibleWidth(), visibleHeight()); +// drawRect.moveBy(qRound(-Doc->minCanvasCoordinate.x() * m_canvas->scale()), qRound(-Doc->minCanvasCoordinate.y() * m_canvas->scale())); + if (drawRect.intersects(QRect(xs, ys, ws, hs))) + pag.append(a+1); + } + if (!pag.isEmpty()) + newStatusBarText=( tr("Page %1 to %2").arg(pag.first()).arg(pag.last())); + } + m_ScMW->setStatusBarInfoText(newStatusBarText); +} + + +//CB This MUST now be called AFTER a call to doc->addPage or doc->addMasterPage as it +//does NOT create a page anymore. +Page* ScribusView::addPage(int nr, bool mov) +{ + Page* fe=Doc->Pages->at(nr); + Q_ASSERT(fe!=0); + if (fe==0) + return 0; + //Note this picks up the new page or master page depending on the mode. +// reformPages(mov); + Doc->reformPages(mov); + setMenTxt(nr); + m_canvas->m_viewMode.m_MouseButtonPressed = false; + Doc->DragP = false; + Doc->leaveDrag = false; + m_canvas->m_viewMode.operItemMoving = false; + MidButt = false; + HaveSelRect = false; + Magnify = false; + FirstPoly = true; + Doc->nodeEdit.EdPoints = true; + //GroupSel = false; + DraggedGroup = false; +//FIXME:av MoveGY = false; +//FIXME:av MoveGX = false; + Doc->nodeEdit.isContourLine = false; + return fe; +} + +void ScribusView::reformPages(bool moveObjects) +{ + Doc->reformPages(moveObjects); + if (!m_ScMW->scriptIsRunning()) + setContentsPos(qRound((Doc->currentPage()->xOffset()-10 - 0*Doc->minCanvasCoordinate.x()) * m_canvas->scale()), qRound((Doc->currentPage()->yOffset()-10 - 0*Doc->minCanvasCoordinate.y()) * m_canvas->scale())); + if (!Doc->isLoading()) + { + setRulerPos(contentsX(), contentsY()); + setMenTxt(Doc->currentPage()->pageNr()); + } +} + +void ScribusView::updatesOn(bool on) +{ + updateOn = on; + setUpdatesEnabled(on); + viewport()->setUpdatesEnabled(on); +} + + +/*! + paints the canvas inside the box given in canvas coordinates + */ +void ScribusView::updateCanvas(QRectF box) +{ + if (box.isValid()) + { + QPoint upperLeft = m_canvas->canvasToLocal(box.topLeft()); + QPoint lowerRight = m_canvas->canvasToLocal(box.bottomRight()); + upperLeft.setX(qMax(0, upperLeft.x()-10)); + upperLeft.setY(qMax(0, upperLeft.y()-10)); + lowerRight.setX(qMax(0, lowerRight.x()+10)); + lowerRight.setY(qMax(0, lowerRight.y()+10)); +// qDebug() << "updateCanvas:" << upperLeft << lowerRight; + m_canvas->update(upperLeft.x(), upperLeft.y(), lowerRight.x()-upperLeft.x(), lowerRight.y()-upperLeft.y()); +/* double scale = m_canvas->scale(); + double x = box.x() * scale; + double y = box.y() * scale; + double w = box.width() * scale; + double h = box.height() * scale; + double sbx = horizontalScrollBar()->value(); + double sby = verticalScrollBar()->value(); + if (x < sbx) + { + w -= (sbx - x); + x = sbx; + } + else + { + w += (x - static_cast<int>(x)); // since x will be rounded down below + } + if (y < sby) + { + h -= (sby - y); + y = sby; + } + else + { + h += (y - static_cast<int>(y)); // since y will be rounded down below + } + // enlarge the rectangle when rounding to int: + m_canvas->update(static_cast<int>(x), static_cast<int>(y), + qMin(qRound(h + 0.5), viewport()->width()), + qMin(qRound(w + 0.5), viewport()->height())); +*/ } + else + { + m_canvas->update(horizontalScrollBar()->value(), verticalScrollBar()->value(), viewport()->width(), viewport()->height()); + } +} + + +/*! + Scrolls the canvas so (x,y) becomes the origin + */ +void ScribusView::setCanvasOrigin(double x, double y) +{ + double scale = m_canvas->scale(); + horizontalScrollBar()->setValue(qRound(x * scale)); + verticalScrollBar()->setValue(qRound(y * scale)); + // fix ranges + QSize maxViewport = maximumViewportSize(); + horizontalScrollBar()->setRange(qRound(Doc->minCanvasCoordinate.x() * scale), + qRound(Doc->maxCanvasCoordinate.x() * scale) - maxViewport.width()); + verticalScrollBar()->setRange(qRound(Doc->minCanvasCoordinate.y() * scale), + qRound(Doc->maxCanvasCoordinate.y() * scale) - maxViewport.height()); +} + + +/*! + Scrolls the canvas so (x,y) is in the center of the viewport + */ +void ScribusView::setCanvasCenter(double x, double y) +{ + double scale = m_canvas->scale(); + setCanvasOrigin(x - viewport()->width() / scale, + y - viewport()->height() / scale); +} + +/*! + Scrolls canvas relatively + */ +void ScribusView::scrollCanvasBy(double deltaX, double deltaY) +{ + double scale = m_canvas->scale(); + horizontalScrollBar()->setValue(qRound(horizontalScrollBar()->value() + deltaX * scale)); + verticalScrollBar()->setValue(qRound(verticalScrollBar()->value() + deltaX * scale)); +} + + +/*! + returns the canvas's origin in canvas coordinates. + Doc->minCanvasCoordinate <= result <= Doc->maxCanvasCoordinate + */ +FPoint ScribusView::canvasOrigin() const +{ + double scale = m_canvas->scale(); + return FPoint(horizontalScrollBar()->value() / scale, verticalScrollBar()->value() / scale); +} + + +/*! + returns the visible part of the canvas in canvas coordinates + */ +QRectF ScribusView::visibleCanvas() const +{ + double scale = m_canvas->scale(); + return QRectF(horizontalScrollBar()->value() / scale, + verticalScrollBar()->value() / scale, + viewport()->width() / scale, + viewport()->height() / scale); +} + + +/*! + Legacy. + Now ignores the parameters and just adjusts the canvas widget according to min/maxCanvasCoordinate + */ +/* +void ScribusView::adjustCanvas(double width, double height, double dX, double dY) +{ + QSize maxViewport = maximumViewportSize(); + double scale = m_canvas->scale(); + horizontalScrollBar()->setRange(qRound(Doc->minCanvasCoordinate.x() * scale), + qRound(Doc->maxCanvasCoordinate.x() * scale) - maxViewport.width()); + verticalScrollBar()->setRange(qRound(Doc->minCanvasCoordinate.y() * scale), + qRound(Doc->maxCanvasCoordinate.y() * scale) - maxViewport.height()); +// qDebug() << "adjustCanvas" << width << height << dX << dY +// << "(" << Doc->minCanvasCoordinate.x() << Doc->minCanvasCoordinate.y() << ") - (" +// << Doc->maxCanvasCoordinate.x() << Doc->maxCanvasCoordinate.y() << ") @" << scale << maxViewport; + widget()->resize(qRound((Doc->maxCanvasCoordinate.x()-Doc->minCanvasCoordinate.x())*scale), + qRound((Doc->maxCanvasCoordinate.y()-Doc->minCanvasCoordinate.y())*scale)); + + if (false && !m_canvas->m_viewMode.operItemMoving) + { + bool updback = updateOn; + updatesOn(false); + int oldDX = contentsX(); + int oldDY = contentsY(); + int nw = qMax(qRound(width * scale), contentsWidth() + qRound(dX * scale) * 2); + int nh = qMax(qRound(height * scale), contentsHeight() + qRound(dY * scale) * 2); + resizeContents(qMax(nw, visibleWidth() + qRound(dX * scale) * 2), qMax(nh, visibleHeight() + qRound(dY * scale) * 2)); + setContentsPos(oldDX + qRound(dX * scale), oldDY + qRound(dY * scale)); +// setRulerPos(contentsX(), contentsY()); + updatesOn(updback); + } +// evSpon = false; +}*/ + +void ScribusView::setMenTxt(int Seite) +{ + if (m_ScMW->scriptIsRunning()) + return; + disconnect(pageSelector, SIGNAL(GotoPage(int)), this, SLOT(GotoPa(int))); + pageSelector->setMaximum(Doc->masterPageMode() ? 1 : Doc->Pages->count()); + if ((!Doc->isLoading()) && (!Doc->masterPageMode())) + pageSelector->GotoPg(Seite); + connect(pageSelector, SIGNAL(GotoPage(int)), this, SLOT(GotoPa(int))); +} + +void ScribusView::setZoom() +{ + int x = qRound(qMax(contentsX() / m_canvas->scale(), 0.0)); + int y = qRound(qMax(contentsY() / m_canvas->scale(), 0.0)); + int w = qRound(qMin(visibleWidth() / m_canvas->scale(), Doc->currentPage()->width())); + int h = qRound(qMin(visibleHeight() / m_canvas->scale(), Doc->currentPage()->height())); + rememberOldZoomLocation(w / 2 + x,h / 2 + y); + zoom(oldX, oldY, zoomSpinBox->value() / 100.0 * Prefs->DisScale, false); + setFocus(); +} + +void ScribusView::slotZoom100() +{ + int x = qRound(qMax(contentsX() / m_canvas->scale(), Doc->minCanvasCoordinate.x())); + int y = qRound(qMax(contentsY() / m_canvas->scale(), Doc->minCanvasCoordinate.y())); + int w = qRound(qMin(visibleWidth() / m_canvas->scale(), Doc->maxCanvasCoordinate.x() - Doc->minCanvasCoordinate.x())); + int h = qRound(qMin(visibleHeight() / m_canvas->scale(), Doc->maxCanvasCoordinate.y() - Doc->minCanvasCoordinate.y())); + rememberOldZoomLocation(w / 2 + x,h / 2 + y); + zoom(oldX, oldY, Prefs->DisScale, false); +} + +void ScribusView::slotZoomIn(int mx,int my) +{ + // FIXME : mx and my should really be ScribusView local coordinates or global coordinates + if ((mx == 0) && (my == 0)) + { + int x = qRound(qMax(contentsX() / m_canvas->scale(), Doc->minCanvasCoordinate.x())); + int y = qRound(qMax(contentsY() / m_canvas->scale(), Doc->minCanvasCoordinate.y())); + int w = qRound(qMin(visibleWidth() / m_canvas->scale(), Doc->maxCanvasCoordinate.x() - Doc->minCanvasCoordinate.x())); + int h = qRound(qMin(visibleHeight() / m_canvas->scale(), Doc->maxCanvasCoordinate.y() - Doc->minCanvasCoordinate.y())); + rememberOldZoomLocation(w/2+x, h/2+y); + } + else + rememberOldZoomLocation(mx,my); + double newScale = m_canvas->scale() * static_cast<double>(Doc->toolSettings.magStep)/100.0; + zoom(oldX, oldY, newScale, true); +} + +/** Verkleinert die Ansicht */ +void ScribusView::slotZoomOut(int mx,int my) +{ + // FIXME : mx and my should really be ScribusView local coordinates or global coordinates + if ((mx == 0) && (my == 0)) + { + int x = qRound(qMax(contentsX() / m_canvas->scale(), Doc->minCanvasCoordinate.x())); + int y = qRound(qMax(contentsY() / m_canvas->scale(), Doc->minCanvasCoordinate.y())); + int w = qRound(qMin(visibleWidth() / m_canvas->scale(), Doc->maxCanvasCoordinate.x() - Doc->minCanvasCoordinate.x())); + int h = qRound(qMin(visibleHeight() / m_canvas->scale(), Doc->maxCanvasCoordinate.y() - Doc->minCanvasCoordinate.y())); + rememberOldZoomLocation(w/2+x, h/2+y); + } + else + rememberOldZoomLocation(mx,my); + double newScale = m_canvas->scale() / (static_cast<double>(Doc->toolSettings.magStep)/100.0); + zoom(oldX, oldY, newScale, true); +} + +#if 0 +FPoint ScribusView::translateToView(double x, double y) // deprecated +{ + return FPoint((x - 0*Doc->minCanvasCoordinate.x()) * m_canvas->scale(), (y - 0*Doc->minCanvasCoordinate.y())* m_canvas->scale()); +} + +FPoint ScribusView::translateToView(FPoint in) // deprecated +{ + return translateToView(in.x(), in.y()); +} + +FPoint ScribusView::translateToDoc(double x, double y) // deprecated +{ + return FPoint(x / m_canvas->scale() + 0*Doc->minCanvasCoordinate.x(), y / m_canvas->scale() + 0*Doc->minCanvasCoordinate.y()); +} + +FPoint ScribusView::translateToDoc(FPoint in) // deprecated +{ + return translateToDoc(in.x(), in.y()); +} + +FPoint ScribusView::translateFromViewport(double x, double y) // deprecated +{ + return FPoint((x + contentsX()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.x(), (y + contentsY()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.y()); +} + +FPoint ScribusView::translateFromViewport(FPoint in) // deprecated +{ + return translateFromViewport(in.x(), in.y()); +} + +FPoint ScribusView::translateToViewport(double x, double y) // deprecated +{ + return FPoint((x - 0*Doc->minCanvasCoordinate.x()) * m_canvas->scale() - contentsX(), (y - 0*Doc->minCanvasCoordinate.y())* m_canvas->scale() - contentsY()); +} + +FPoint ScribusView::translateToViewport(FPoint in) // deprecated +{ + return translateToViewport(in.x(), in.y()); +} +#endif + + +void ScribusView::DrawNew() +{ +// qDebug("ScribusView::DrawNew"); +// printBacktrace(24); + if (m_ScMW->scriptIsRunning()) + return; + m_canvas->m_viewMode.forceRedraw = true; + m_canvas->resetRenderMode(); + updateContents(); + setRulerPos(contentsX(), contentsY()); + setMenTxt(Doc->currentPage()->pageNr()); + disconnect(zoomSpinBox, SIGNAL(valueChanged(double)), this, SLOT(setZoom())); + zoomSpinBox->setValue(m_canvas->scale()/Prefs->DisScale*100); + connect(zoomSpinBox, SIGNAL(valueChanged(double)), this, SLOT(setZoom())); +} + +void ScribusView::SetCCPo(double x, double y) +{ + if (m_ScMW->scriptIsRunning()) + return; + QPoint nx = m_canvas->canvasToLocal(FPoint(x, y)); + QSize viewsize = viewport()->size(); +// qDebug() << "setCCPo" << nx << viewsize; + setContentsPos(nx.x() - viewsize.width() / 2, nx.y() - viewsize.height() / 2); +} + +void ScribusView::SetCPo(double x, double y) +{ + if (m_ScMW->scriptIsRunning()) + return; + QPoint nx = m_canvas->canvasToLocal(FPoint(x, y)); + setContentsPos(nx.x(), nx.y()); +} + +void ScribusView::updateLayerMenu() +{ + disconnect(layerMenu, SIGNAL(activated(int)), this, SLOT(GotoLa(int))); + layerMenu->clear(); + QStringList newNames; + Doc->orderedLayerList(&newNames); + for (QStringList::Iterator it=newNames.begin(); it!=newNames.end(); ++it) + { + QPixmap pm(20,15); + pm.fill(Doc->Layers.layerByName(*it)->markerColor); + layerMenu->addItem(pm, *it); + } + connect(layerMenu, SIGNAL(activated(int)), this, SLOT(GotoLa(int))); +} + +void ScribusView::setLayerMenuText(const QString &layerName) +{ + disconnect(layerMenu, SIGNAL(activated(int)), this, SLOT(GotoLa(int))); + if (layerMenu->count() != 0) + setCurrentComboItem(layerMenu, layerName); + connect(layerMenu, SIGNAL(activated(int)), this, SLOT(GotoLa(int))); +} + +void ScribusView::GotoLa(int l) +{ + int level = Doc->layerCount()-l-1; + int layerNumber=Doc->layerNumberFromLevel(level); + if (layerNumber==-1) + return; + Doc->setActiveLayer(layerNumber); + //CB TODO fix this to use view calls after 1.3.2 release + m_ScMW->changeLayer(Doc->activeLayer()); + emit changeLA(layerNumber); +} + +void ScribusView::ChgUnit(int art) +{ + emit changeUN(art); + unitChange(); + vertRuler->update(); + horizRuler->update(); +} + +void ScribusView::changePreviewQuality(int index) +{ + Doc->allItems_ChangePreviewResolution(index); + DrawNew(); +} + +void ScribusView::GotoPa(int Seite) +{ + Deselect(); + GotoPage(Seite-1); + setFocus(); +} + +void ScribusView::GotoPage(int Seite) +{ + Doc->setCurrentPage(Doc->Pages->at(Seite)); + if (m_ScMW->scriptIsRunning()) + return; + setMenTxt(Seite); + SetCPo(Doc->currentPage()->xOffset() - 10, Doc->currentPage()->yOffset() - 10); +} + +void ScribusView::showMasterPage(int nr) +{ + // #9684 : we need Deselect() to emit HaveSel() when switching masterpage + Deselect(true); + OldScale = m_canvas->scale(); + if (!Doc->masterPageMode()) + this->requestMode(modeNormal); + Doc->setMasterPageMode(true); + Doc->setCurrentPage(Doc->Pages->at(nr)); + pageSelector->setEnabled(false); + updateOn = false; +// reformPages(); + zoom(); + oldX = qRound(Doc->currentPage()->xOffset()- 10); + oldY = qRound(Doc->currentPage()->yOffset()- 10); + SetCPo(Doc->currentPage()->xOffset() - 10, Doc->currentPage()->yOffset() - 10); + updateOn = true; + DrawNew(); +} + +void ScribusView::hideMasterPage() +{ + Deselect(true); + if (Doc->masterPageMode()) + this->requestMode(modeNormal); + Doc->setMasterPageMode(false); +// Doc->currentPage = Doc->Pages->at(0); + pageSelector->setEnabled(true); + resizeContents(qRound((Doc->maxCanvasCoordinate.x() - Doc->minCanvasCoordinate.x()) * m_canvas->scale()), qRound((Doc->maxCanvasCoordinate.y() - Doc->minCanvasCoordinate.y()) * m_canvas->scale())); +// setScale(OldScale); +// updateOn = false; +// GotoPage(0); +// slotDoZoom(); +// oldX = qRound(Doc->currentPage->xOffset()- 10); +// oldY = qRound(Doc->currentPage->yOffset()- 10); +// SetCPo(oldX, oldY); +// updateOn = true; +// DrawNew(); +} + +QImage ScribusView::MPageToPixmap(QString name, int maxGr, bool drawFrame) +{ + QImage pm; + QImage im; + int Nr = Doc->MasterNames[name]; + int clipx = static_cast<int>(Doc->scratch.Left); + int clipy = static_cast<int>(Doc->scratch.Top); + int clipw = qRound(Doc->MasterPages.at(Nr)->width()); + int cliph = qRound(Doc->MasterPages.at(Nr)->height()); + if ((clipw > 0) && (cliph > 0)) + { + double sca = m_canvas->scale(); + bool frs = Doc->guidesSettings.framesShown; + double cx = Doc->minCanvasCoordinate.x(); + double cy = Doc->minCanvasCoordinate.y(); + Doc->minCanvasCoordinate = FPoint(0, 0); + Page* act = Doc->currentPage(); + bool mMode = Doc->masterPageMode(); + Doc->setMasterPageMode(true); + Doc->setCurrentPage(Doc->MasterPages.at(Nr)); + bool ctrls = Doc->guidesSettings.showControls; + Doc->guidesSettings.showControls = false; + Doc->guidesSettings.framesShown = false; + setScale(1.0); + m_canvas->m_viewMode.previewMode = true; + m_canvas->m_viewMode.forceRedraw = true; + pm = QImage(clipw, cliph, QImage::Format_ARGB32); + ScPainter *painter = new ScPainter(&pm, pm.width(), pm.height(), 1.0, 0); + painter->clear(Doc->papColor); + painter->translate(-clipx, -clipy); + painter->setLineWidth(1); + if (drawFrame) + { + painter->setPen(Qt::black, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin); + painter->setBrush(Doc->papColor); + painter->drawRect(clipx, clipy, clipw, cliph); + } + painter->beginLayer(1.0, 0); + m_canvas->DrawPageItems(painter, QRect(clipx, clipy, clipw, cliph)); + painter->endLayer(); + painter->end(); + double sx = pm.width() / static_cast<double>(maxGr); + double sy = pm.height() / static_cast<double>(maxGr); + if (sy < sx) + im = pm.scaled(static_cast<int>(pm.width() / sx), static_cast<int>(pm.height() / sx), Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + else + im = pm.scaled(static_cast<int>(pm.width() / sy), static_cast<int>(pm.height() / sy), Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + delete painter; + painter=NULL; + m_canvas->m_viewMode.previewMode = false; + m_canvas->m_viewMode.forceRedraw = false; + Doc->guidesSettings.framesShown = frs; + Doc->guidesSettings.showControls = ctrls; + setScale(sca); + Doc->setMasterPageMode(mMode); + Doc->setCurrentPage(act); + Doc->minCanvasCoordinate = FPoint(cx, cy); + } + return im; +} + +QImage ScribusView::PageToPixmap(int Nr, int maxGr, bool drawFrame) +{ + QImage im; + double sx = maxGr / Doc->DocPages.at(Nr)->width(); + double sy = maxGr / Doc->DocPages.at(Nr)->height(); + double sc = qMin(sx, sy); + int clipx = static_cast<int>(Doc->DocPages.at(Nr)->xOffset() * sc); + int clipy = static_cast<int>(Doc->DocPages.at(Nr)->yOffset() * sc); + int clipw = qRound(Doc->DocPages.at(Nr)->width() * sc); + int cliph = qRound(Doc->DocPages.at(Nr)->height() * sc); + if ((clipw > 0) && (cliph > 0)) + { + im = QImage(clipw, cliph, QImage::Format_ARGB32); + if (!im.isNull()) + { + double oldScale = m_canvas->scale(); + double cx = Doc->minCanvasCoordinate.x(); + double cy = Doc->minCanvasCoordinate.y(); + Doc->minCanvasCoordinate = FPoint(0, 0); + bool oldFramesShown = Doc->guidesSettings.framesShown; + bool oldShowControls = Doc->guidesSettings.showControls; + Doc->guidesSettings.framesShown = false; + Doc->guidesSettings.showControls = false; + m_canvas->setScale(sc); + m_canvas->m_viewMode.previewMode = true; + m_canvas->m_viewMode.forceRedraw = true; + Page* act = Doc->currentPage(); + bool mMode = Doc->masterPageMode(); + Doc->setMasterPageMode(false); + Doc->setLoading(true); + Doc->setCurrentPage(Doc->DocPages.at(Nr)); + ScPainter *painter = new ScPainter(&im, im.width(), im.height(), 1.0, 0); + painter->clear(Doc->papColor); + painter->translate(-clipx, -clipy); + painter->setFillMode(ScPainter::Solid); + if (drawFrame) + { + painter->setPen(Qt::black, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin); + painter->setBrush(Doc->papColor); + painter->drawRect(clipx, clipy, clipw, cliph); + } + painter->beginLayer(1.0, 0); + painter->setZoomFactor(m_canvas->scale()); + + QList<QPair<PageItem*, int> > changedList; + Page* page = Doc->DocPages.at(Nr); + PageItem* currItem; + if (page->FromMaster.count() != 0) + { + uint pageFromMasterCount = page->FromMaster.count(); + for (uint a = 0; a < pageFromMasterCount; ++a) + { + currItem = page->FromMaster.at(a); + if (currItem->asImageFrame()) + { + if (currItem->PictureIsAvailable) + { + if (currItem->pixm.imgInfo.lowResType != 0) + { + changedList.append(qMakePair(currItem, currItem->pixm.imgInfo.lowResType)); + currItem->pixm.imgInfo.lowResType = 0; + int fho = currItem->imageFlippedH(); + int fvo = currItem->imageFlippedV(); + Doc->loadPict(currItem->Pfile, currItem, true); + currItem->setImageFlippedH(fho); + currItem->setImageFlippedV(fvo); + currItem->AdjustPictScale(); + } + } + } + } + } + if (Doc->Items->count() != 0) + { + FPoint orig = m_canvas->localToCanvas(QPoint(clipx, clipy)); + QRectF cullingArea = QRectF(orig.x(), orig.y(), qRound(clipw / sc + 0.5), qRound(cliph / sc + 0.5)); + for (int it = 0; it < Doc->Items->count(); ++it) + { + currItem = Doc->Items->at(it); + if (cullingArea.intersects(currItem->getBoundingRect().adjusted(0.0, 0.0, 1.0, 1.0))) + { + if (currItem->asImageFrame()) + { + if (currItem->PictureIsAvailable) + { + if (currItem->pixm.imgInfo.lowResType != 0) + { + changedList.append(qMakePair(currItem, currItem->pixm.imgInfo.lowResType)); + currItem->pixm.imgInfo.lowResType = 0; + int fho = currItem->imageFlippedH(); + int fvo = currItem->imageFlippedV(); + Doc->loadPict(currItem->Pfile, currItem, true); + currItem->setImageFlippedH(fho); + currItem->setImageFlippedV(fvo); + currItem->AdjustPictScale(); + } + } + } + } + } + } + + m_canvas->DrawMasterItems(painter, Doc->DocPages.at(Nr), QRect(clipx, clipy, clipw, cliph)); + m_canvas->DrawPageItems(painter, QRect(clipx, clipy, clipw, cliph)); + painter->endLayer(); + painter->end(); + delete painter; + painter=NULL; + + if (changedList.count() != 0) + { + QPair<PageItem*, int> itemPair; + for (int it = 0; it < changedList.count(); it++) + { + itemPair = changedList.at(it); + currItem = itemPair.first; + currItem->pixm.imgInfo.lowResType = itemPair.second; + int fho = currItem->imageFlippedH(); + int fvo = currItem->imageFlippedV(); + Doc->loadPict(currItem->Pfile, currItem, true); + currItem->setImageFlippedH(fho); + currItem->setImageFlippedV(fvo); + currItem->AdjustPictScale(); + } + } + + Doc->guidesSettings.framesShown = oldFramesShown; + Doc->guidesSettings.showControls = oldShowControls; + m_canvas->setScale(oldScale); + Doc->setMasterPageMode(mMode); + Doc->setCurrentPage(act); + Doc->setLoading(false); + m_canvas->m_viewMode.previewMode = false; + m_canvas->m_viewMode.forceRedraw = false; + Doc->minCanvasCoordinate = FPoint(cx, cy); + } + } + return im; +} +#if 0 +void ScribusView::rulerMove(QMouseEvent *m) +{ + QPoint py(viewport()->mapFromGlobal(m->globalPos())); + int newY = py.y(); + int newX = py.x(); + QPoint out = viewportToContents(py); + emit MousePos((py.x() + contentsX())/m_canvas->scale(), (py.y() + contentsY())/m_canvas->scale()); + horizRuler->Draw(out.x()); + vertRuler->Draw(out.y()); + m_canvas->newRedrawPolygon() << QPoint(newX, newY); + updateContents(); + DrHY = newY; + DrVX = newX; +} +#endif + +void ScribusView::setNewRulerOrigin(QMouseEvent *m) +{ + QPoint py = viewport()->mapFromGlobal(m->globalPos()); + Doc->rulerXoffset = (py.x() + contentsX()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.x(); + Doc->rulerYoffset = (py.y() + contentsY()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.y(); + if (Doc->guidesSettings.rulerMode) + { + Doc->rulerXoffset -= Doc->currentPage()->xOffset(); + Doc->rulerYoffset -= Doc->currentPage()->yOffset(); + } + setRulerPos(contentsX(), contentsY()); + m_canvas->newRedrawPolygon(); + int docSelectionCount=Doc->m_Selection->count(); + if (docSelectionCount != 0) + { + if (docSelectionCount > 1) + { + double x, y, w, h; + Doc->m_Selection->getGroupRect(&x, &y, &w, &h); + emit ItemPos(x, y); + emit ItemGeom(w, h); + } + else + Doc->m_Selection->itemAt(0)->emitAllToGUI(); + } +} + +#if 0 +void ScribusView::FromHRuler(QMouseEvent *m) +{ + QPoint py = viewport()->mapFromGlobal(m->globalPos()); + int newY = py.y(); + QPoint out = viewportToContents(py); + emit MousePos((py.x() + contentsX())/m_canvas->scale(), (py.y() + 2 + contentsY())/m_canvas->scale()); + horizRuler->Draw(out.x()); + vertRuler->Draw(out.y() + 2); + if (!redrawMarker->isVisible()) + redrawMarker->show(); + if (QRect(0, 0, visibleWidth(), visibleHeight()).contains(py)) + redrawMarker->setGeometry(QRect(viewport()->mapToGlobal(QPoint(0, 0)).x(), m->globalPos().y(), visibleWidth(), 1)); + DrHY = newY; + double newXp = (py.x() + contentsX()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.x(); + double newYp = (py.y() + contentsY()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.y(); + int pg = Doc->OnPage(newXp, newYp); + if ((pg == -1) || (!QRect(0, 0, visibleWidth(), visibleHeight()).contains(py))) + qApp->changeOverrideCursor(QCursor(loadIcon("DelPoint.png"))); + else + qApp->changeOverrideCursor(QCursor(SPLITHC)); +} + +void ScribusView::FromVRuler(QMouseEvent *m) +{ + QPoint py = viewport()->mapFromGlobal(m->globalPos()); + int newY = py.x(); + QPoint out = viewportToContents(py); + emit MousePos((py.x() + 2 + contentsX())/m_canvas->scale(), (py.y() + contentsY())/m_canvas->scale()); + horizRuler->Draw(out.x() + 2); + vertRuler->Draw(out.y()); + if (!redrawMarker->isVisible()) + redrawMarker->show(); + if (QRect(0, 0, visibleWidth(), visibleHeight()).contains(py)) + redrawMarker->setGeometry(QRect(m->globalPos().x(), viewport()->mapToGlobal(QPoint(0, 0)).y(), 1, visibleHeight())); + DrVX = newY; + double newXp = (py.x() + contentsX()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.x(); + double newYp = (py.y() + contentsY()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.y(); + int pg = Doc->OnPage(newXp, newYp); + if ((pg == -1) || (!QRect(0, 0, visibleWidth(), visibleHeight()).contains(py))) + qApp->changeOverrideCursor(QCursor(loadIcon("DelPoint.png"))); + else + qApp->changeOverrideCursor(QCursor(SPLITVC)); +} +#endif + +#if 0 +// TODO: PV - guides refactoring +void ScribusView::SetYGuide(QMouseEvent *m, int oldIndex) +{ + QPoint py = viewport()->mapFromGlobal(m->globalPos()); + double newX = (py.x() + contentsX()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.x(); + double newY = (py.y() + contentsY()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.y(); + int pg = Doc->OnPage(newX, newY); + if ((pg != -1) && (QRect(0, 0, visibleWidth(), visibleHeight()).contains(py))) + { + if (oldIndex < 0) + { + Doc->Pages->at(pg)->guides.addHorizontal(newY-Doc->Pages->at(pg)->yOffset(), GuideManagerCore::Standard); + emit signalGuideInformation(0, qRound((newY-Doc->Pages->at(pg)->yOffset()) * 10000.0) / 10000.0); + } + else + { + if (pg == Doc->currentPageNumber()) + { + Doc->currentPage()->guides.moveHorizontal( Doc->currentPage()->guides.horizontal(oldIndex, GuideManagerCore::Standard), + newY-Doc->currentPage()->yOffset(), GuideManagerCore::Standard); + emit signalGuideInformation(0, qRound((newY-Doc->Pages->at(pg)->yOffset()) * 10000.0) / 10000.0); + } + else + { + Doc->currentPage()->guides.deleteHorizontal( Doc->currentPage()->guides.horizontal(oldIndex, GuideManagerCore::Standard), GuideManagerCore::Standard); + emit signalGuideInformation(-1, 0.0); + Doc->Pages->at(pg)->guides.addHorizontal(newY-Doc->Pages->at(pg)->yOffset(), GuideManagerCore::Standard); + } + } + m_ScMW->guidePalette->clearRestoreHorizontalList(); + } + else + { + if (oldIndex >= 0) + { + Doc->currentPage()->guides.deleteHorizontal( Doc->currentPage()->guides.horizontal(oldIndex, GuideManagerCore::Standard), GuideManagerCore::Standard); + emit signalGuideInformation(-1, 0.0); + m_ScMW->guidePalette->clearRestoreHorizontalList(); + } + } + emit DocChanged(); +/* + if ((pg != -1) && (pg == Doc->currentPageNumber()) && (QRect(0, 0, visibleWidth(), visibleHeight()).contains(py))) + { + if (oldIndex < 0) + Doc->Pages->at(pg)->guides.addHorizontal(newY-Doc->Pages->at(pg)->yOffset(), GuideManagerCore::Standard); + else + Doc->Pages->at(pg)->guides.moveHorizontal( + Doc->Pages->at(pg)->guides.horizontal(oldIndex, GuideManagerCore::Standard), + newY-Doc->Pages->at(pg)->yOffset(), + GuideManagerCore::Standard); + m_ScMW->guidePalette->clearRestoreHorizontalList(); + emit signalGuideInformation(0, qRound((newY-Doc->Pages->at(pg)->yOffset()) * 10000.0) / 10000.0); + } + else if (oldIndex >= 0) + { + Doc->currentPage()->guides.deleteHorizontal( Doc->currentPage()->guides.horizontal(oldIndex, GuideManagerCore::Standard), GuideManagerCore::Standard); + emit signalGuideInformation(-1, 0.0); + m_ScMW->guidePalette->clearRestoreHorizontalList(); + } + emit DocChanged(); +*/ +} + +void ScribusView::SetXGuide(QMouseEvent *m, int oldIndex) +{ + QPoint py = viewport()->mapFromGlobal(m->globalPos()); + double newX = (py.x() + contentsX()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.x(); + double newY = (py.y() + contentsY()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.y(); + int pg = Doc->OnPage(newX, newY); + if ((pg != -1) && (QRect(0, 0, visibleWidth(), visibleHeight()).contains(py))) + { + if (oldIndex < 0) + { + Doc->Pages->at(pg)->guides.addVertical(newX-Doc->Pages->at(pg)->xOffset(), GuideManagerCore::Standard); + emit signalGuideInformation(0, qRound((newX-Doc->Pages->at(pg)->xOffset()) * 10000.0) / 10000.0); + } + else + { + if (pg == Doc->currentPageNumber()) + { + Doc->currentPage()->guides.moveVertical( Doc->currentPage()->guides.vertical(oldIndex, GuideManagerCore::Standard), + newX-Doc->currentPage()->xOffset(), GuideManagerCore::Standard); + emit signalGuideInformation(0, qRound((newX-Doc->Pages->at(pg)->xOffset()) * 10000.0) / 10000.0); + } + else + { + Doc->currentPage()->guides.deleteVertical( Doc->currentPage()->guides.vertical(oldIndex, GuideManagerCore::Standard), GuideManagerCore::Standard); + emit signalGuideInformation(-1, 0.0); + Doc->Pages->at(pg)->guides.addVertical(newX-Doc->Pages->at(pg)->xOffset(), GuideManagerCore::Standard); + } + } + m_ScMW->guidePalette->clearRestoreVerticalList(); + } + else + { + if (oldIndex >= 0) + { + Doc->currentPage()->guides.deleteVertical( Doc->currentPage()->guides.vertical(oldIndex, GuideManagerCore::Standard), GuideManagerCore::Standard); + emit signalGuideInformation(-1, 0.0); + m_ScMW->guidePalette->clearRestoreVerticalList(); + } + } + emit DocChanged(); +/* + if ((pg != -1) && (pg == Doc->currentPageNumber()) && (QRect(0, 0, visibleWidth(), visibleHeight()).contains(py))) + { + if (oldIndex < 0) + Doc->Pages->at(pg)->guides.addVertical(newX-Doc->Pages->at(pg)->xOffset(), GuideManagerCore::Standard); + else + Doc->Pages->at(pg)->guides.moveVertical( + Doc->Pages->at(pg)->guides.vertical(oldIndex, GuideManagerCore::Standard), + newX-Doc->Pages->at(pg)->xOffset(), + GuideManagerCore::Standard); + m_ScMW->guidePalette->clearRestoreVerticalList(); + emit signalGuideInformation(1, qRound((newX-Doc->Pages->at(pg)->xOffset()) * 10000.0) / 10000.0); + } + else if (oldIndex >= 0) + { + Doc->currentPage()->guides.deleteVertical( Doc->currentPage()->guides.vertical(oldIndex, GuideManagerCore::Standard), GuideManagerCore::Standard); + emit signalGuideInformation(-1, 0.0); + m_ScMW->guidePalette->clearRestoreVerticalList(); + } + emit DocChanged(); +*/ +} +#endif + +//CB-->Doc +void ScribusView::SetFrameRect() +{ + Doc->nodeEdit.deselect(); + PageItem *currItem; + if (GetItem(&currItem)) + { + currItem->SetRectFrame(); + Doc->setRedrawBounding(currItem); + updateContents(currItem->getRedrawBounding(m_canvas->scale())); + } +} + +//CB-->Doc +void ScribusView::SetFrameRounded() +{ + Doc->nodeEdit.deselect(); + PageItem *currItem; + if (GetItem(&currItem)) + { + if (currItem->cornerRadius() == 0) + { + SetFrameRect(); + return; + } + currItem->SetFrameRound(); + Doc->setRedrawBounding(currItem); + updateContents(currItem->getRedrawBounding(m_canvas->scale())); + } +} + +//CB-->Doc +void ScribusView::SetFrameOval() +{ + Doc->nodeEdit.deselect(); + PageItem *currItem; + if (GetItem(&currItem)) + { + currItem->SetOvalFrame(); + Doc->setRedrawBounding(currItem); + updateContents(currItem->getRedrawBounding(m_canvas->scale())); + } +} + +void ScribusView::editExtendedImageProperties() +{ + if (Doc->m_Selection->count() != 0) + { + PageItem *currItem = Doc->m_Selection->itemAt(0); + if (currItem->pixm.imgInfo.valid) + { + ExtImageProps* dia = new ExtImageProps(this, &currItem->pixm.imgInfo, currItem, this); + dia->exec(); + delete dia; + dia=NULL; + m_ScMW->propertiesPalette->setTextFlowMode(currItem->textFlowMode()); + } + } +} + +//CB Stop using this for putting items on pages apart from pasting +//IE write a more generic function in the doc +void ScribusView::PasteItem(struct CopyPasteBuffer *Buffer, bool loading, bool drag, bool resize) +{ + QColor tmp; + if (!loading) + Deselect(true); + double x = Buffer->Xpos; + double y = Buffer->Ypos; + double w = Buffer->Width; + double h = Buffer->Height; + double pw = Buffer->Pwidth; + int z = 0; +// qDebug() << "Pasting frame of type " << Buffer->PType; + switch (Buffer->PType) + { + // OBSOLETE CR 2005-02-06 + case PageItem::ItemType1: + z = Doc->itemAdd(PageItem::Polygon, PageItem::Ellipse, x, y, w, h, pw, Buffer->Pcolor, Buffer->Pcolor2, true); + break; + // + case PageItem::ImageFrame: + z = Doc->itemAdd(PageItem::ImageFrame, PageItem::Unspecified, x, y, w, h, 1, Doc->toolSettings.dBrushPict, CommonStrings::None, true); + undoManager->setUndoEnabled(false); + Doc->Items->at(z)->setImageXYScale(Buffer->LocalScX, Buffer->LocalScY); + Doc->Items->at(z)->setImageXYOffset(Buffer->LocalX, Buffer->LocalY); + Doc->Items->at(z)->Pfile = Buffer->Pfile; + Doc->Items->at(z)->IProfile = Buffer->IProfile; + Doc->Items->at(z)->EmProfile = Buffer->EmProfile; + Doc->Items->at(z)->IRender = Buffer->IRender; + Doc->Items->at(z)->UseEmbedded = Buffer->UseEmbedded; + if (!Doc->Items->at(z)->Pfile.isEmpty()) + Doc->LoadPict(Doc->Items->at(z)->Pfile, z); + Doc->Items->at(z)->setImageXYScale(Buffer->LocalScX, Buffer->LocalScY); + Doc->Items->at(z)->setImageShown(Buffer->PicArt); +/* Doc->Items->at(z)->BBoxX = Buffer->BBoxX; + Doc->Items->at(z)->BBoxH = Buffer->BBoxH; */ + Doc->Items->at(z)->ScaleType = Buffer->ScaleType; + Doc->Items->at(z)->AspectRatio = Buffer->AspectRatio; + Doc->Items->at(z)->setLineWidth(Buffer->Pwidth); + undoManager->setUndoEnabled(true); + break; + // OBSOLETE CR 2005-02-06 + case PageItem::ItemType3: + z = Doc->itemAdd(PageItem::Polygon, PageItem::Rectangle, x, y, w, h, pw, Buffer->Pcolor, Buffer->Pcolor2, true); + break; + // + case PageItem::PathText: + case PageItem::TextFrame: +#ifndef NLS_PROTO + if (Buffer->PType == PageItem::PathText) + z = Doc->itemAdd(PageItem::PathText, PageItem::Unspecified, x, y, w, h, pw, CommonStrings::None, Buffer->Pcolor, true); + else + z = Doc->itemAdd(PageItem::TextFrame, PageItem::Unspecified, x, y, w, h, pw, CommonStrings::None, Buffer->Pcolor, true); + undoManager->setUndoEnabled(false); + if ((Buffer->m_isAnnotation) && (Buffer->m_annotation.UseIcons())) + { + Doc->Items->at(z)->setImageXYScale(Buffer->LocalScX, Buffer->LocalScY); + Doc->Items->at(z)->setImageXYOffset(Buffer->LocalX, Buffer->LocalY); + Doc->Items->at(z)->Pfile = Buffer->Pfile; + Doc->Items->at(z)->Pfile2 = Buffer->Pfile2; + Doc->Items->at(z)->Pfile3 = Buffer->Pfile3; + Doc->Items->at(z)->IProfile = Buffer->IProfile; + Doc->Items->at(z)->EmProfile = Buffer->EmProfile; + Doc->Items->at(z)->IRender = Buffer->IRender; + Doc->Items->at(z)->UseEmbedded = Buffer->UseEmbedded; + Doc->LoadPict(Doc->Items->at(z)->Pfile, z); + Doc->Items->at(z)->setImageXYScale(Buffer->LocalScX, Buffer->LocalScY); + Doc->Items->at(z)->setImageShown(Buffer->PicArt); + } + if (!Buffer->itemText.isEmpty()) + { + QTextStream t(&Buffer->itemText, QIODevice::ReadOnly); + QString cc; + while (!t.atEnd()) + { + cc = t.readLine(); + if (cc.isEmpty()) + continue; + QStringList wt; + QStringList::Iterator it; + wt = cc.split("\t", QString::SkipEmptyParts); + it = wt.begin(); + CharStyle nstyle; + QString ch = (*it); + if (ch == QChar(5)) + ch = SpecialChars::PARSEP; + if (ch == QChar(4)) + ch = SpecialChars::TAB; + it++; + nstyle.setFont((*Doc->AllFonts)[*it]); + it++; + nstyle.setFontSize(qRound(ScCLocale::toDoubleC((*it)) * 10)); + it++; + nstyle.setFillColor(*it); + it++; + nstyle.setTracking((*it).toInt()); + it++; + nstyle.setFillShade((*it).toInt()); + it++; + nstyle.setFeatures(static_cast<StyleFlag>(it == wt.end() ? 0 : (*it).toInt()).featureList()); + it++; + int cab = it == wt.end() ? 0 : (*it).toInt(); + it++; + nstyle.setStrokeColor(it == wt.end() ? CommonStrings::None : *it); + it++; + nstyle.setStrokeShade(it == wt.end() ? 100 : (*it).toInt()); + it++; + if (it == wt.end()) + nstyle.setScaleH(1000); + else + nstyle.setScaleH(qMin(qMax((*it).toInt(), 100), 4000)); + it++; + if (it == wt.end()) + nstyle.setScaleV(1000); + else + nstyle.setScaleV(qMin(qMax((*it).toInt(), 100), 4000)); + it++; + nstyle.setBaselineOffset(it == wt.end() ? 0 : (*it).toInt()); + it++; + nstyle.setShadowXOffset(it == wt.end() ? 50 : (*it).toInt()); + it++; + nstyle.setShadowYOffset(it == wt.end() ? -50 : (*it).toInt()); + it++; + nstyle.setOutlineWidth(it == wt.end() ? 10 : (*it).toInt()); + it++; + nstyle.setUnderlineOffset(it == wt.end() ? -1 : (*it).toInt()); + it++; + nstyle.setUnderlineWidth(it == wt.end() ? -1 : (*it).toInt()); + it++; + nstyle.setStrikethruOffset(it == wt.end() ? -1 : (*it).toInt()); + it++; + nstyle.setStrikethruWidth(it == wt.end() ? -1 : (*it).toInt()); + uint pos = Doc->Items->at(z)->itemText.length(); + Doc->Items->at(z)->itemText.insertChars(pos, ch); + if (ch == SpecialChars::PARSEP && cab > 0) { + ParagraphStyle pstyle; + pstyle.setParent(Doc->paragraphStyles()[cab].name()); + Doc->Items->at(z)->itemText.applyStyle(pos, pstyle); + } + else { + Doc->Items->at(z)->itemText.applyCharStyle(pos, 1, nstyle); + } + } + } + { + ParagraphStyle pstyle; + pstyle.setAlignment(static_cast<ParagraphStyle::AlignmentType>(Buffer->textAlignment)); + pstyle.setLineSpacing(Buffer->LineSp); + pstyle.setLineSpacingMode(static_cast<ParagraphStyle::LineSpacingMode>(Buffer->LineSpMode)); + if (Doc->AllFonts->contains(Buffer->IFont)) + pstyle.charStyle().setFont((*Doc->AllFonts)[Buffer->IFont]); + else + pstyle.charStyle().setFont((*Doc->AllFonts)[Doc->toolSettings.defFont]); + pstyle.charStyle().setFontSize(Buffer->ISize); + pstyle.charStyle().setFillColor(Buffer->TxtFill); + pstyle.charStyle().setStrokeColor(Buffer->TxtStroke); + pstyle.charStyle().setFillShade(Buffer->ShTxtFill); + pstyle.charStyle().setStrokeShade(Buffer->ShTxtStroke); + pstyle.charStyle().setScaleH(Buffer->TxtScale); + pstyle.charStyle().setScaleV(Buffer->TxtScaleV); + pstyle.charStyle().setBaselineOffset(Buffer->TxTBase); + pstyle.charStyle().setFeatures(StyleFlag(Buffer->TxTStyle).featureList()); + pstyle.charStyle().setShadowXOffset(Buffer->TxtShadowX); + pstyle.charStyle().setShadowYOffset(Buffer->TxtShadowY); + pstyle.charStyle().setOutlineWidth(Buffer->TxtOutline); + pstyle.charStyle().setUnderlineOffset(Buffer->TxtUnderPos); + pstyle.charStyle().setUnderlineWidth(Buffer->TxtUnderWidth); + pstyle.charStyle().setStrikethruOffset(Buffer->TxtStrikePos); + pstyle.charStyle().setStrikethruWidth(Buffer->TxtStrikeWidth); + Doc->Items->at(z)->itemText.setDefaultStyle(pstyle); + } + undoManager->setUndoEnabled(true); +#endif + break; + case PageItem::Line: + z = Doc->itemAdd(PageItem::Line, PageItem::Unspecified, x, y, w ,0, pw, CommonStrings::None, Buffer->Pcolor2, true); + break; + case PageItem::Polygon: + z = Doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, x, y, w, h, pw, Buffer->Pcolor, Buffer->Pcolor2, true); + break; + case PageItem::PolyLine: + z = Doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, x, y, w, h, pw, Buffer->Pcolor, Buffer->Pcolor2, true); + break; + case PageItem::Multiple: + Q_ASSERT(false); + break; + case PageItem::LatexFrame: + z = Doc->itemAdd(PageItem::LatexFrame, PageItem::Unspecified, x, y, w, h, 1, Doc->toolSettings.dBrushPict, CommonStrings::None, true); + undoManager->setUndoEnabled(false); + Doc->Items->at(z)->setImageXYScale(Buffer->LocalScX, Buffer->LocalScY); + Doc->Items->at(z)->setImageXYOffset(Buffer->LocalX, Buffer->LocalY); + Doc->Items->at(z)->Pfile = Buffer->Pfile; + Doc->Items->at(z)->IProfile = Buffer->IProfile; + Doc->Items->at(z)->EmProfile = Buffer->EmProfile; + Doc->Items->at(z)->IRender = Buffer->IRender; + Doc->Items->at(z)->UseEmbedded = Buffer->UseEmbedded; + if (!Doc->Items->at(z)->Pfile.isEmpty()) + Doc->LoadPict(Doc->Items->at(z)->Pfile, z); + Doc->Items->at(z)->setImageXYScale(Buffer->LocalScX, Buffer->LocalScY); + Doc->Items->at(z)->setImageShown(Buffer->PicArt); + Doc->Items->at(z)->ScaleType = Buffer->ScaleType; + Doc->Items->at(z)->AspectRatio = Buffer->AspectRatio; + Doc->Items->at(z)->setLineWidth(Buffer->Pwidth); + PageItem_LatexFrame *latexframe = Doc->Items->at(z)->asLatexFrame(); + latexframe->setFormula(Buffer->itemText); //itemText seems to be a good choice... + undoManager->setUndoEnabled(true); + break; + + } + PageItem *currItem = Doc->Items->at(z); + undoManager->setUndoEnabled(false); +/*FIXME + currItem->setLineSpacingMode(Buffer->LineSpMode); + if (currItem->lineSpacingMode() == 3) + { + currItem->setLineSpacing(Doc->typographicSettings.valueBaseGrid-1); + } + */ + currItem->setImageFlippedH(Buffer->flippedH); + currItem->setImageFlippedV(Buffer->flippedV); + currItem->setCornerRadius(Buffer->RadRect); + currItem->FrameType = Buffer->FrameType; + currItem->ClipEdited = Buffer->ClipEdited; + currItem->setFillColor(Buffer->Pcolor); + currItem->setLineColor(Buffer->Pcolor2); + currItem->setFillShade(Buffer->Shade); + currItem->setLineShade(Buffer->Shade2); + currItem->fillRule = Buffer->FillRule; +/* currItem->TxtStroke = Buffer->TxtStroke; + currItem->TxtFill = Buffer->TxtFill; + currItem->ShTxtStroke = Buffer->ShTxtStroke; + currItem->ShTxtFill = Buffer->ShTxtFill; + currItem->TxtScale = Buffer->TxtScale; + currItem->TxtScaleV = Buffer->TxtScaleV; + currItem->TxTStyle = Buffer->TxTStyle; + currItem->TxtShadowX = Buffer->TxtShadowX; + currItem->TxtShadowY = Buffer->TxtShadowY; + currItem->TxtOutline = Buffer->TxtOutline; + currItem->TxtUnderPos = Buffer->TxtUnderPos; + currItem->TxtUnderWidth = Buffer->TxtUnderWidth; + currItem->TxtStrikePos = Buffer->TxtStrikePos; + currItem->TxtStrikeWidth = Buffer->TxtStrikeWidth; +*/ + currItem->setRotation(Buffer->Rot); + currItem->setTextToFrameDist(Buffer->Extra, Buffer->RExtra, Buffer->TExtra, Buffer->BExtra); + currItem->PLineArt = Qt::PenStyle(Buffer->PLineArt); + currItem->PLineEnd = Qt::PenCapStyle(Buffer->PLineEnd); + currItem->PLineJoin = Qt::PenJoinStyle(Buffer->PLineJoin); + currItem->setPrintEnabled(Buffer->isPrintable); + currItem->isBookmark = Buffer->isBookmark; +// currItem->BMnr = Buffer->BMnr; + currItem->Groups = Buffer->Groups; + currItem->setIsAnnotation(Buffer->m_isAnnotation); + currItem->setAnnotation(Buffer->m_annotation); + if (!Buffer->AnName.isEmpty()) + { + if (!drag) + { + if (currItem->itemName() == Buffer->AnName) + currItem->AutoName = true; + else + currItem->setItemName(Buffer->AnName); + } + else + currItem->setItemName(Buffer->AnName); + } + else + { + if (currItem->isGroupControl) + currItem->setItemName( tr("Group%1").arg(currItem->Groups.top())); + } + + currItem->TopLine = Buffer->TopLine; + currItem->RightLine = Buffer->RightLine; + currItem->LeftLine = Buffer->LeftLine; + currItem->BottomLine = Buffer->BottomLine; + currItem->isTableItem = Buffer->isTableItem; + currItem->TopLinkID = Buffer->TopLinkID; + currItem->LeftLinkID = Buffer->LeftLinkID; + currItem->RightLinkID = Buffer->RightLinkID; + currItem->BottomLinkID = Buffer->BottomLinkID; + currItem->Clip = Buffer->Clip; //irrelevant, overwritten below + currItem->PoShow = Buffer->PoShow; + currItem->BaseOffs = Buffer->BaseOffs; + currItem->textPathFlipped = Buffer->textPathFlipped; + currItem->textPathType = Buffer->textPathType; + //currItem->setTextFlowsAroundFrame(Buffer->Textflow); + //currItem->setTextFlowUsesBoundingBox(Buffer->Textflow2); + currItem->setTextFlowMode((PageItem::TextFlowMode) Buffer->TextflowMode); +// currItem->textAlignment = Buffer->textAlignment; +// currItem->setFont(Buffer->IFont); +// currItem->setFontSize(Buffer->ISize); +// currItem->ExtraV = Buffer->ExtraV; +// currItem->TabValues = Buffer->TabValues; + currItem->DashValues = Buffer->DashValues; + currItem->DashOffset = Buffer->DashOffset; + currItem->setLocked(Buffer->Locked); + currItem->setSizeLocked(Buffer->LockRes); + currItem->setFillTransparency(Buffer->Transparency); + currItem->setLineTransparency(Buffer->TranspStroke); + currItem->setFillBlendmode(Buffer->TransBlend); + currItem->setLineBlendmode(Buffer->TransBlendS); + currItem->setStartArrowIndex(Buffer->startArrowIndex); + currItem->setEndArrowIndex(Buffer->endArrowIndex); + currItem->setReversed(Buffer->Reverse); + currItem->NamedLStyle = Buffer->NamedLStyle; +// currItem->Language = m_ScMW->GetLang(Buffer->Language); + currItem->Cols = Buffer->Cols; + currItem->ColGap = Buffer->ColGap; + currItem->setFirstLineOffset(Buffer->firstLineOffsetP); + if (Buffer->LayerNr != -1) + currItem->LayerNr = Buffer->LayerNr; + currItem->PoLine = Buffer->PoLine.copy(); + //currItem->setTextFlowUsesContourLine(Buffer->UseContour); + currItem->setTextFlowMode((PageItem::TextFlowMode) Buffer->TextflowMode); + if (Buffer->ContourLine.size() == 0) + currItem->ContourLine = currItem->PoLine.copy(); + else + currItem->ContourLine = Buffer->ContourLine.copy(); + if (!currItem->asLine()) + { + // OBSOLETE CR 2005-02-06 + if ((currItem->PoLine.size() == 0) && (currItem->itemType() != PageItem::ItemType1)) + currItem->convertClip(); + else + // + currItem->Clip = FlattenPath(currItem->PoLine, currItem->Segments); + } + else + { + int ph = static_cast<int>(qMax(1.0, currItem->lineWidth() / 2.0)); + currItem->Segments.clear(); + currItem->PoLine.resize(0); + currItem->Clip.setPoints(4, -ph,-ph, static_cast<int>(currItem->width()+ph),-ph, + static_cast<int>(currItem->width()+ph),static_cast<int>(currItem->height()+ph), + -ph,static_cast<int>(currItem->height()+ph)); + currItem->setHeight(1.0); + } + // OBSOLETE CR 2005-02-06 + if (currItem->itemType() == PageItem::ItemType1) + { + currItem->SetOvalFrame(); + Doc->setRedrawBounding(currItem); + } + // OBSOLETE CR 2005-02-06 + if (currItem->itemType() == PageItem::ItemType3) + { + if (currItem->cornerRadius() != 0.0) + { + Doc->nodeEdit.deselect(); + currItem->SetFrameRound(); + Doc->setRedrawBounding(currItem); + } + else + { + currItem->SetRectFrame(); + Doc->setRedrawBounding(currItem); + } + currItem->ClipEdited = true; + } + if (currItem->asImageFrame()) + currItem->AdjustPictScale(); +// if (!(currItem->asTextFrame()) && !(currItem->asPathText())) +// currItem->setFont(Doc->toolSettings.defFont); + if (currItem->asPathText()) + { + currItem->ClipEdited = true; + currItem->FrameType = 3; + currItem->updatePolyClip(); + currItem->Frame = true; + } + if (Buffer->GrType != 0) + { + if (Buffer->GrType == 8) + { + currItem->setPattern(Buffer->pattern); + currItem->GrType = Buffer->GrType; + currItem->setPatternTransform(Buffer->patternScaleX, Buffer->patternScaleY, Buffer->patternOffsetX, Buffer->patternOffsetY, Buffer->patternRotation); + } + else + { + if ((!Buffer->GrColor.isEmpty()) && (!Buffer->GrColor2.isEmpty())) + { + currItem->fill_gradient.clearStops(); + if (Buffer->GrType == 5) + { + if ((Buffer->GrColor != CommonStrings::None) && (!Buffer->GrColor.isEmpty())) + currItem->SetQColor(&tmp, Buffer->GrColor, Buffer->GrShade); + currItem->fill_gradient.addStop(tmp, 0.0, 0.5, 1.0, Buffer->GrColor, Buffer->GrShade); + if ((Buffer->GrColor2 != CommonStrings::None) && (!Buffer->GrColor2.isEmpty())) + currItem->SetQColor(&tmp, Buffer->GrColor2, Buffer->GrShade2); + currItem->fill_gradient.addStop(tmp, 1.0, 0.5, 1.0, Buffer->GrColor2, Buffer->GrShade2); + } + else + { + if ((Buffer->GrColor2 != CommonStrings::None) && (!Buffer->GrColor2.isEmpty())) + currItem->SetQColor(&tmp, Buffer->GrColor2, Buffer->GrShade2); + currItem->fill_gradient.addStop(tmp, 0.0, 0.5, 1.0, Buffer->GrColor2, Buffer->GrShade2); + if ((Buffer->GrColor != CommonStrings::None) && (!Buffer->GrColor.isEmpty())) + currItem->SetQColor(&tmp, Buffer->GrColor, Buffer->GrShade); + currItem->fill_gradient.addStop(tmp, 1.0, 0.5, 1.0, Buffer->GrColor, Buffer->GrShade); + } + } + else + currItem->fill_gradient = Buffer->fill_gradient; + currItem->GrType = Buffer->GrType; + currItem->GrStartX = Buffer->GrStartX; + currItem->GrStartY = Buffer->GrStartY; + currItem->GrEndX = Buffer->GrEndX; + currItem->GrEndY = Buffer->GrEndY; + currItem->updateGradientVectors(); + } + } + currItem->setObjectAttributes(&(Buffer->pageItemAttributes)); + if (resize) + Doc->setRedrawBounding(currItem); + currItem->OwnPage = Doc->OnPage(currItem); + undoManager->setUndoEnabled(true); + if (!loading) + { + Doc->m_Selection->addItem(currItem); + emit HaveSel(currItem->itemType()); + currItem->emitAllToGUI(); + emit DocChanged(); + updateContents(); + } +} + +void ScribusView::ToPicFrame() +{ + Selection tempSelection(*Doc->m_Selection); + Doc->m_Selection->delaySignalsOn(); + updatesOn(false); + Deselect(true); + Selection restoreSelection(this); + Doc->itemSelection_convertItemsTo(PageItem::ImageFrame, &restoreSelection, &tempSelection); + Doc->m_Selection->copy(restoreSelection, true); + updatesOn(true); + Doc->m_Selection->delaySignalsOff(); +} + +void ScribusView::ToPolyFrame() +{ + Selection tempSelection(*Doc->m_Selection); + Doc->m_Selection->delaySignalsOn(); + updatesOn(false); + Deselect(true); + Selection restoreSelection(this); + Doc->itemSelection_convertItemsTo(PageItem::Polygon, &restoreSelection, &tempSelection); + Doc->m_Selection->copy(restoreSelection, true); + updatesOn(true); + Doc->m_Selection->delaySignalsOff(); +} + +void ScribusView::ToTextFrame() +{ + Selection tempSelection(*Doc->m_Selection); + Doc->m_Selection->delaySignalsOn(); + updatesOn(false); + Deselect(true); + Selection restoreSelection(this); + Doc->itemSelection_convertItemsTo(PageItem::TextFrame, &restoreSelection, &tempSelection); + Doc->m_Selection->copy(restoreSelection, true); + updatesOn(true); + Doc->m_Selection->delaySignalsOff(); +} + +void ScribusView::ToBezierFrame() +{ + Selection tempSelection(*Doc->m_Selection); + Doc->m_Selection->delaySignalsOn(); + updatesOn(false); + Deselect(true); + Selection restoreSelection(this); + Doc->itemSelection_convertItemsTo(PageItem::PolyLine, &restoreSelection, &tempSelection); + Doc->m_Selection->copy(restoreSelection, true); + updatesOn(true); + Doc->m_Selection->delaySignalsOff(); +} + +void ScribusView::Bezier2Poly() +{ + Selection tempSelection(*Doc->m_Selection); + Doc->m_Selection->delaySignalsOn(); + updatesOn(false); + Deselect(true); + Selection restoreSelection(this); + Doc->itemSelection_convertItemsTo(PageItem::Polygon, &restoreSelection, &tempSelection); + Doc->m_Selection->copy(restoreSelection, true); + updatesOn(true); + Doc->m_Selection->delaySignalsOff(); +} + +void ScribusView::ToPathText() +{ + if (Doc->m_Selection->count() > 1) + { + PageItem* currItem=Doc->m_Selection->itemAt(0); + PageItem *polyLineItem; + if (currItem->asTextFrame()) + polyLineItem=Doc->m_Selection->itemAt(1); + else + { + polyLineItem=Doc->m_Selection->itemAt(0); + currItem=Doc->m_Selection->itemAt(1); + } + ParagraphStyle dstyle(currItem->itemText.defaultStyle()); + if (polyLineItem->asPolyLine() || polyLineItem->asPolygon()) + { + Deselect(true); + PageItem* newItem=Doc->convertItemTo(currItem, PageItem::PathText, polyLineItem); + newItem->itemText.setDefaultStyle(dstyle); + newItem->itemText.applyCharStyle(0, newItem->itemText.length(), dstyle.charStyle()); + newItem->invalid = true; + newItem->update(); + SelectItem(newItem); + emit DocChanged(); + } + } +} + +void ScribusView::FromPathText() +{ + PageItem *currItem; + if (GetItem(&currItem)) + { + Deselect(true); + PageItem* newItem=Doc->convertItemTo(currItem, PageItem::TextFrame); + SelectItem(newItem); + ToFront(); + update(); + } +} + +void ScribusView::TextToPath() +{ +#ifndef NLS_PROTO + if (Doc->appMode == modeEditClip) + requestMode(submodeEndNodeEdit); + Selection tmpSelection(this, false); + tmpSelection.copy(*Doc->m_Selection, false); + PageItem *currItem = tmpSelection.itemAt(0); + if ((currItem->prevInChain() != 0) || (currItem->nextInChain() != 0)) + { + // select whole chain + PageItem *backItem = currItem; + while (backItem->prevInChain() != 0) + backItem = backItem->prevInChain(); + currItem = backItem; + Deselect(true); + tmpSelection.addItem(currItem); + backItem = currItem->nextInChain(); + while (backItem != 0) + { + tmpSelection.addItem(backItem); + if (backItem->nextInChain() != 0) + backItem = backItem->nextInChain(); + else + break; + } + } + QList<PageItem*> delItems,newGroupedItems; + newGroupedItems.clear(); + uint selectedItemCount = tmpSelection.count(); + if (selectedItemCount != 0) + { + UndoTransaction trans(undoManager->beginTransaction(currItem->getUName(), currItem->getUPixmap(), Um::ToOutlines, "", 0)); + uint offset=0; + for(uint i=0; i<selectedItemCount; ++i) + { + PageItem *currItem = tmpSelection.itemAt(offset); + bool cont=false; + if ((!((currItem->asTextFrame()) || (currItem->asPathText()))) || (currItem->isTableItem && currItem->isSingleSel) || (currItem->locked()) || currItem->itemText.length() == 0) + cont=true; + if (currItem==m_ScMW->storyEditor->currentItem() && Doc==m_ScMW->storyEditor->currentDocument()) + { + QMessageBox::information(m_ScMW, tr("Cannot Convert In-Use Item"), "<qt>" + tr("The item %1 is currently being edited by Story Editor. The convert to outlines operation for this item will be skipped").arg(currItem->itemName()) + "</qt>", QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton); + cont=true; + } + //Deselect(); + if (cont) + { + ++offset; + continue; + } +// newGroupedItems.clear(); + FPointArray pts; + double x, y, wide; + QString chstr, ccounter; + PageItem* bb; + + if (currItem->asPathText()) + { + for (int a = 0; a < currItem->itemText.length(); ++a) + { + pts.resize(0); + x = 0.0; + y = 0.0; + ScText * hl = currItem->itemText.item(a); + const CharStyle& charStyle(currItem->itemText.charStyle(a)); + chstr = currItem->itemText.text(a,1); + if ((chstr == QChar(13)) || (chstr == QChar(29))) + continue; + if (chstr == QChar(30)) + chstr = currItem->ExpandToken(a); + double chs = charStyle.fontSize(); + if (hl->effects() & ScStyle_SmallCaps) + { + if (chstr[0].toUpper() != chstr[0]) + { + chs = qMax(static_cast<int>(hl->fontSize() * Doc->typographicSettings.valueSmallCaps / 100), 1); + chstr = chstr.toUpper(); + } + } + else if (hl->effects() & ScStyle_AllCaps) + chstr = chstr[0].toUpper(); +// double csi = static_cast<double>(chs) / 100.0; + uint chr = chstr[0].unicode(); + QPointF tangt = QPointF( cos(hl->PRot), sin(hl->PRot) ); + QMatrix chma, chma2, chma3, chma4, chma6; + QMatrix trafo = QMatrix( 1, 0, 0, -1, -hl->PDx, 0 ); + if (currItem->textPathFlipped) + trafo *= QMatrix(1, 0, 0, -1, 0, 0); + if (currItem->textPathType == 0) + trafo *= QMatrix( tangt.x(), tangt.y(), tangt.y(), -tangt.x(), hl->PtransX, hl->PtransY ); + else if (currItem->textPathType == 1) + trafo *= QMatrix(1, 0, 0, -1, hl->PtransX, hl->PtransY ); + else if (currItem->textPathType == 2) + { + double a = 1; + double b = -1; + if (tangt.x() < 0) + { + a = -1; + b = 1; + } + if (fabs(tangt.x()) > 0.1) + trafo *= QMatrix( a, (tangt.y() / tangt.x()) * b, 0, -1, hl->PtransX, hl->PtransY ); // ID's Skew mode + else + trafo *= QMatrix( a, 6 * b, 0, -1, hl->PtransX, hl->PtransY ); + } + //trafo *= QMatrix( hl->PtransX, hl->PtransY, hl->PtransY, -hl->PtransX, hl->glyph.xoffset, hl->glyph.yoffset); + if (currItem->rotation() != 0) + { + QMatrix sca; + sca.translate(-currItem->xPos(), -currItem->yPos()); + sca.rotate(currItem->rotation()); + trafo *= sca; + } + chma.scale(hl->glyph.scaleH * charStyle.fontSize() / 100.00, hl->glyph.scaleV * charStyle.fontSize() / 100.0); + if (currItem->reversed()) + { + if (a < currItem->itemText.length()-1) + wide = hl->font().charWidth(chstr[0], hl->fontSize(), currItem->itemText.text(a+1)); + else + wide = hl->font().charWidth(chstr[0], hl->fontSize()); + chma3.scale(-1, 1); + chma3.translate(-wide, 0); + } + chma4.translate(0, currItem->BaseOffs - (charStyle.fontSize() / 10.0) * hl->glyph.scaleV); + if (charStyle.effects() & (ScStyle_Subscript | ScStyle_Superscript)) + chma6.translate(0, hl->glyph.yoffset); + if (hl->baselineOffset() != 0) + chma6.translate(0, (-charStyle.fontSize() / 10.0) * (charStyle.baselineOffset() / 1000.0)); + uint gl = hl->font().char2CMap(chr); + QMatrix finalMat = QMatrix(chma * chma2 * chma3 * chma4 * chma6 * trafo); + if (currItem->rotation() != 0) + { + QMatrix sca; + sca.translate(currItem->xPos(), currItem->yPos()); + pts.map(sca); + } + QChar chstc = hl->ch; + if (((charStyle.effects() & ScStyle_Underline) && !SpecialChars::isBreak(chstc)) + || ((charStyle.effects() & ScStyle_UnderlineWords) && !chstc.isSpace() && !SpecialChars::isBreak(chstc))) + { + QMatrix stro = QMatrix(chma2 * chma3 * chma6 * trafo); + if (currItem->rotation() != 0) + { + QMatrix sca; + sca.translate(currItem->xPos(), currItem->yPos()); + stro *= sca; + } + double Ulen = hl->glyph.xadvance; + double Upos, Uwid, kern; + if (hl->effects() & ScStyle_StartOfLine) + kern = 0; + else + kern = charStyle.fontSize() * charStyle.tracking() / 10000.0; + if ((charStyle.underlineOffset() != -1) || (charStyle.underlineWidth() != -1)) + { + if (charStyle.underlineOffset() != -1) + Upos = (charStyle.underlineOffset() / 1000.0) * (charStyle.font().descent(charStyle.fontSize() / 10.0)); + else + Upos = charStyle.font().underlinePos(charStyle.fontSize() / 10.0); + if (charStyle.underlineWidth() != -1) + Uwid = (charStyle.underlineWidth() / 1000.0) * (charStyle.fontSize() / 10.0); + else + Uwid = qMax(charStyle.font().strokeWidth(charStyle.fontSize() / 10.0), 1.0); + } + else + { + Upos = charStyle.font().underlinePos(charStyle.fontSize() / 10.0); + Uwid = qMax(charStyle.font().strokeWidth(charStyle.fontSize() / 10.0), 1.0); + } + if (charStyle.baselineOffset() != 0) + Upos += (charStyle.fontSize() / 10.0) * (charStyle.baselineOffset() / 1000.0); + uint z = Doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, currItem->xPos(), currItem->yPos(), currItem->width(), currItem->height(), currItem->lineWidth(), currItem->lineColor(), currItem->fillColor(), true); + bb = Doc->Items->at(z); + undoManager->setUndoEnabled(false); + bb->setTextFlowMode(currItem->textFlowMode()); + bb->setSizeLocked(currItem->sizeLocked()); + bb->setLocked(currItem->locked()); + bb->NamedLStyle = currItem->NamedLStyle; + bb->setItemName(currItem->itemName()+"+U"+ccounter.setNum(a)); + FPoint start, stop; + if (charStyle.effects() & ScStyle_Subscript) + { + start = FPoint(hl->glyph.xoffset-kern, -Upos); + stop = FPoint(hl->glyph.xoffset+Ulen, -Upos); + } + else + { + start = FPoint(hl->glyph.xoffset-kern, -(Upos + hl->glyph.yoffset)); + stop = FPoint(hl->glyph.xoffset+Ulen, -(Upos + hl->glyph.yoffset)); + } + bb->PoLine.resize(0); + bb->PoLine.addQuadPoint(start, start, stop, stop); + bb->PoLine.map(stro); + bb->setLineColor(hl->fillColor()); + bb->setLineShade(hl->fillShade()); + bb->setLineWidth(Uwid); + Doc->AdjustItemSize(bb); + bb->ContourLine = bb->PoLine.copy(); + bb->ClipEdited = true; + Doc->setRedrawBounding(bb); + undoManager->setUndoEnabled(true); + newGroupedItems.append(Doc->Items->takeAt(z)); + } + if ((chstr.length() > 0) && (!chstr.at(0).isSpace())) + { + pts = hl->font().glyphOutline(gl); + if (pts.size() < 4) + continue; + if ((charStyle.effects() & ScStyle_Shadowed) && (charStyle.strokeColor() != CommonStrings::None)) + { + double glxTr = charStyle.fontSize() * charStyle.shadowXOffset() / 10000.0; + double glyTr = -charStyle.fontSize() * charStyle.shadowYOffset() / 10000.0; + uint z = Doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, currItem->xPos(), currItem->yPos(), currItem->width(), currItem->height(), currItem->lineWidth(), currItem->lineColor(), currItem->fillColor(), true); + bb = Doc->Items->at(z); + undoManager->setUndoEnabled(false); + bb->setTextFlowMode(currItem->textFlowMode()); + bb->setSizeLocked(currItem->sizeLocked()); + bb->setLocked(currItem->locked()); + bb->NamedLStyle = currItem->NamedLStyle; + bb->setItemName(currItem->itemName()+"+Sh"+ccounter.setNum(a)); + bb->PoLine = pts.copy(); + QMatrix shmap; + shmap.translate(glxTr, glyTr); + bb->PoLine.map(finalMat * shmap); + bb->setFillColor(hl->strokeColor()); + bb->setFillShade(hl->strokeShade()); + if (currItem->itemText.charStyle(a).effects() & ScStyle_Outline) + { + bb->setLineColor(hl->strokeColor()); + bb->setLineShade(hl->strokeShade()); + } + else + { + bb->setLineColor(CommonStrings::None); + bb->setLineShade(100); + } + bb->setLineWidth(chs * hl->outlineWidth() / 10000.0); + Doc->AdjustItemSize(bb); + bb->ContourLine = bb->PoLine.copy(); + bb->ClipEdited = true; + Doc->setRedrawBounding(bb); + undoManager->setUndoEnabled(true); + newGroupedItems.append(Doc->Items->takeAt(z)); + } + pts.map(finalMat); + uint z = Doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, currItem->xPos(), currItem->yPos(), currItem->width(), currItem->height(), currItem->lineWidth(), currItem->lineColor(), currItem->fillColor(), true); + bb = Doc->Items->at(z); + //bb->setTextFlowsAroundFrame(currItem->textFlowsAroundFrame()); + //bb->setTextFlowUsesBoundingBox(currItem->textFlowUsesBoundingBox()); + undoManager->setUndoEnabled(false); + bb->setTextFlowMode(currItem->textFlowMode()); + bb->setSizeLocked(currItem->sizeLocked()); + bb->setLocked(currItem->locked()); + bb->NamedLStyle = currItem->NamedLStyle; + bb->setItemName(currItem->itemName()+"+"+ccounter.setNum(a)); + bb->PoLine = pts.copy(); + if (!currItem->asPathText()) + bb->setRotation(currItem->rotation()); + bb->setFillColor(hl->fillColor()); + bb->setFillShade(hl->fillShade()); + if (currItem->itemText.charStyle(a).effects() & ScStyle_Outline) + { + bb->setLineColor(hl->strokeColor()); + bb->setLineShade(hl->strokeShade()); + } + else + { + bb->setLineColor(CommonStrings::None); + bb->setLineShade(100); + } + bb->setLineWidth(chs * hl->outlineWidth() / 10000.0); + Doc->AdjustItemSize(bb); + bb->ContourLine = bb->PoLine.copy(); + bb->ClipEdited = true; + Doc->setRedrawBounding(bb); + undoManager->setUndoEnabled(true); + newGroupedItems.append(Doc->Items->takeAt(z)); + } + if (charStyle.effects() & ScStyle_Strikethrough) + { + QMatrix stro = QMatrix(chma2 * chma3 * chma6 * trafo); + if (currItem->rotation() != 0) + { + QMatrix sca; + sca.translate(currItem->xPos(), currItem->yPos()); + stro *= sca; + } + double Ulen = hl->glyph.xadvance; + double Upos, Uwid, kern; + if (hl->effects() & ScStyle_StartOfLine) + kern = 0; + else + kern = charStyle.fontSize() * charStyle.tracking() / 10000.0; + if ((charStyle.strikethruOffset() != -1) || (charStyle.strikethruWidth() != -1)) + { + if (charStyle.strikethruOffset() != -1) + Upos = (charStyle.strikethruOffset() / 1000.0) * (charStyle.font().ascent(charStyle.fontSize() / 10.0)); + else + Upos = charStyle.font().strikeoutPos(charStyle.fontSize() / 10.0); + if (charStyle.strikethruWidth() != -1) + Uwid = (charStyle.strikethruWidth() / 1000.0) * (charStyle.fontSize() / 10.0); + else + Uwid = qMax(charStyle.font().strokeWidth(charStyle.fontSize() / 10.0), 1.0); + } + else + { + Upos = charStyle.font().strikeoutPos(charStyle.fontSize() / 10.0); + Uwid = qMax(charStyle.font().strokeWidth(charStyle.fontSize() / 10.0), 1.0); + } + if (charStyle.baselineOffset() != 0) + Upos += (charStyle.fontSize() / 10.0) * (charStyle.baselineOffset() / 1000.0); + uint z = Doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, currItem->xPos(), currItem->yPos(), currItem->width(), currItem->height(), currItem->lineWidth(), currItem->lineColor(), currItem->fillColor(), true); + bb = Doc->Items->at(z); + undoManager->setUndoEnabled(false); + bb->setTextFlowMode(currItem->textFlowMode()); + bb->setSizeLocked(currItem->sizeLocked()); + bb->setLocked(currItem->locked()); + bb->NamedLStyle = currItem->NamedLStyle; + bb->setItemName(currItem->itemName()+"+S"+ccounter.setNum(a)); + FPoint start = FPoint(hl->glyph.xoffset-kern, -Upos); + FPoint stop = FPoint(hl->glyph.xoffset+Ulen, -Upos); + bb->PoLine.resize(0); + bb->PoLine.addQuadPoint(start, start, stop, stop); + bb->PoLine.map(stro); + bb->setLineColor(hl->fillColor()); + bb->setLineShade(hl->fillShade()); + bb->setLineWidth(Uwid); + Doc->AdjustItemSize(bb); + bb->ContourLine = bb->PoLine.copy(); + bb->ClipEdited = true; + Doc->setRedrawBounding(bb); + bb->setItemName(currItem->itemName()+"+S"+ccounter.setNum(a)); + undoManager->setUndoEnabled(true); + newGroupedItems.append(Doc->Items->takeAt(z)); + } + } + } + else + { + for (uint ll=0; ll < currItem->itemText.lines(); ++ll) + { + LineSpec ls = currItem->itemText.line(ll); + double CurX = ls.x; + for (int a = ls.firstItem; a <= ls.lastItem; ++a) + { + pts.resize(0); + x = 0.0; + y = 0.0; + ScText * hl = currItem->itemText.item(a); + const CharStyle& charStyle(currItem->itemText.charStyle(a)); + chstr = currItem->itemText.text(a,1); + if ((chstr == QChar(13)) || (chstr == QChar(29))) + { + if (chstr == QChar(29)) + CurX += hl->glyph.wide(); + continue; + } + if (chstr == QChar(30)) + chstr = currItem->ExpandToken(a); + double chs = charStyle.fontSize(); + if (hl->effects() & ScStyle_SmallCaps) + { + if (chstr[0].toUpper() != chstr[0]) + { + chs = qMax(static_cast<int>(hl->fontSize() * Doc->typographicSettings.valueSmallCaps / 100), 1); + chstr = chstr[0].toUpper(); + } + } + else if (hl->effects() & ScStyle_AllCaps) + chstr = chstr[0].toUpper(); + double csi = static_cast<double>(chs) / 100.0; + uint chr = chstr[0].unicode(); + QMatrix chma, chma2, chma3, chma4, chma6; + uint gl = hl->font().char2CMap(chr); + FPoint origin = hl->font().glyphOrigin(gl); + x = origin.x() * csi; + y = origin.y() * csi; + if ((charStyle.effects() & ScStyle_Underline) + || ((charStyle.effects() & ScStyle_UnderlineWords) + // Qt4 added toInt() ??? + && chstr.toUInt() != charStyle.font().char2CMap(QChar(' ')))) + { + double st, lw; + if ((charStyle.underlineOffset() != -1) || (charStyle.underlineWidth() != -1)) + { + if (charStyle.underlineOffset() != -1) + st = (charStyle.underlineOffset() / 1000.0) * (charStyle.font().descent(charStyle.fontSize() / 10.0)); + else + st = charStyle.font().underlinePos(charStyle.fontSize() / 10.0); + if (charStyle.underlineWidth() != -1) + lw = (charStyle.underlineWidth() / 1000.0) * (charStyle.fontSize() / 10.0); + else + lw = qMax(charStyle.font().strokeWidth(charStyle.fontSize() / 10.0), 1.0); + } + else + { + st = charStyle.font().underlinePos(charStyle.fontSize() / 10.0); + lw = qMax(charStyle.font().strokeWidth(charStyle.fontSize() / 10.0), 1.0); + } + if (charStyle.baselineOffset() != 0) + st += (charStyle.fontSize() / 10.0) * hl->glyph.scaleV * (charStyle.baselineOffset() / 1000.0); + uint z = Doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, currItem->xPos(), currItem->yPos(), currItem->width(), currItem->height(), currItem->lineWidth(), currItem->lineColor(), currItem->fillColor(), true); + bb = Doc->Items->at(z); + undoManager->setUndoEnabled(false); + bb->setTextFlowMode(currItem->textFlowMode()); + bb->setSizeLocked(currItem->sizeLocked()); + bb->setLocked(currItem->locked()); + bb->NamedLStyle = currItem->NamedLStyle; + bb->setItemName(currItem->itemName()+"+U"+ccounter.setNum(a)); + bb->setRotation(currItem->rotation()); + bb->PoLine.addQuadPoint(FPoint(0, 0), FPoint(0, 0), FPoint(hl->glyph.xadvance, 0), FPoint(hl->glyph.xadvance, 0)); + bb->setLineColor(hl->fillColor()); + bb->setLineShade(hl->fillShade()); + bb->setLineWidth(lw); + FPoint tp2(getMinClipF(&bb->PoLine)); + bb->PoLine.translate(-tp2.x(), -tp2.y()); + FPoint tp(getMaxClipF(&bb->PoLine)); + bb->setWidthHeight(tp.x(), tp.y()); + bb->Clip = FlattenPath(bb->PoLine, bb->Segments); + double textX = CurX; + double textY = ls.y - st; // + hl->glyph.yoffset; + if (charStyle.effects() & ScStyle_Subscript) + textY += hl->glyph.yoffset; + if (charStyle.baselineOffset() != 0) + textY -= (charStyle.fontSize() / 10.0) * (charStyle.baselineOffset() / 1000.0); + if (a < currItem->itemText.length()-1) + wide = hl->font().charWidth(chstr[0], charStyle.fontSize(), currItem->itemText.text(a+1)); + else + wide = hl->font().charWidth(chstr[0], charStyle.fontSize()); + if (currItem->imageFlippedH()) + textX = currItem->width() - textX - wide; + if (currItem->imageFlippedV()) + textY = currItem->height() - textY + y - (bb->height() - y); + FPoint npo(textX, textY, 0.0, 0.0, currItem->rotation(), 1.0, 1.0); + bb->moveBy(npo.x(),npo.y()); + bb->ContourLine = bb->PoLine.copy(); + bb->ClipEdited = true; + bb->FrameType = 3; + Doc->setRedrawBounding(bb); + undoManager->setUndoEnabled(true); + newGroupedItems.append(Doc->Items->takeAt(z)); + } + if ((chstr.length() > 0) && (!chstr.at(0).isSpace())) + { + pts = hl->font().glyphOutline(gl); + if (pts.size() < 4) + continue; + chma = QMatrix(); + chma.scale(hl->glyph.scaleH * charStyle.fontSize() / 100.00, hl->glyph.scaleV * charStyle.fontSize() / 100.0); + pts.map(chma); + chma = QMatrix(); + if (currItem->imageFlippedH() && (!currItem->reversed())) + chma.scale(-1, 1); + if (currItem->imageFlippedV()) + chma.scale(1, -1); + pts.map(chma); + if ((charStyle.effects() & ScStyle_Shadowed) && (charStyle.strokeColor() != CommonStrings::None)) + { + double glxTr = charStyle.fontSize() * charStyle.shadowXOffset() / 10000.0; + double glyTr = -charStyle.fontSize() * charStyle.shadowYOffset() / 10000.0; + uint z = Doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, currItem->xPos() + glxTr, currItem->yPos() + glyTr, currItem->width(), currItem->height(), currItem->lineWidth(), currItem->lineColor(), currItem->fillColor(), true); + bb = Doc->Items->at(z); + undoManager->setUndoEnabled(false); + bb->setTextFlowMode(currItem->textFlowMode()); + bb->setSizeLocked(currItem->sizeLocked()); + bb->setLocked(currItem->locked()); + bb->NamedLStyle = currItem->NamedLStyle; + bb->setItemName(currItem->itemName()+"+Sh"+ccounter.setNum(a)); + bb->PoLine = pts.copy(); + bb->setRotation(currItem->rotation()); + bb->setFillColor(hl->strokeColor()); + bb->setFillShade(hl->strokeShade()); + bb->setLineColor(CommonStrings::None); + bb->setLineShade(100); + bb->setLineWidth(chs * hl->outlineWidth() / 10000.0); + FPoint tp2(getMinClipF(&bb->PoLine)); + bb->PoLine.translate(-tp2.x(), -tp2.y()); + FPoint tp(getMaxClipF(&bb->PoLine)); + bb->setWidthHeight(tp.x(), tp.y()); + bb->Clip = FlattenPath(bb->PoLine, bb->Segments); + double textX = CurX + hl->glyph.xoffset; + double textY = ls.y; // + hl->glyph.yoffset; + if (charStyle.effects() & (ScStyle_Subscript | ScStyle_Superscript)) + { + textY += hl->glyph.yoffset; + x *= hl->glyph.scaleH; + y *= hl->glyph.scaleV; + } + chma6 = QMatrix(); + if (charStyle.baselineOffset() != 0) + textY -= (charStyle.fontSize() / 10.0) * (charStyle.baselineOffset() / 1000.0); + if (a < currItem->itemText.length()-1) + wide = hl->font().charWidth(chstr[0], charStyle.fontSize(), currItem->itemText.text(a+1)); + else + wide = hl->font().charWidth(chstr[0], charStyle.fontSize()); + if (currItem->imageFlippedH()) + textX = currItem->width() - textX - wide; + if (currItem->imageFlippedV()) + textY = currItem->height() - textY + y - (bb->height() - y); + FPoint npo(textX+x, textY-y, 0.0, 0.0, currItem->rotation(), 1.0, 1.0); + bb->moveBy(npo.x(),npo.y()); + bb->ContourLine = bb->PoLine.copy(); + bb->ClipEdited = true; + Doc->setRedrawBounding(bb); + undoManager->setUndoEnabled(true); + newGroupedItems.append(Doc->Items->takeAt(z)); + } + uint z = Doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, currItem->xPos(), currItem->yPos(), currItem->width(), currItem->height(), currItem->lineWidth(), currItem->lineColor(), currItem->fillColor(), true); + bb = Doc->Items->at(z); + undoManager->setUndoEnabled(false); + //bb->setTextFlowsAroundFrame(currItem->textFlowsAroundFrame()); + //bb->setTextFlowUsesBoundingBox(currItem->textFlowUsesBoundingBox()); + bb->setTextFlowMode(currItem->textFlowMode()); + bb->setSizeLocked(currItem->sizeLocked()); + bb->setLocked(currItem->locked()); + bb->NamedLStyle = currItem->NamedLStyle; + bb->setItemName(currItem->itemName()+"+"+ccounter.setNum(a)); + bb->PoLine = pts.copy(); + bb->setRotation(currItem->rotation()); + bb->setFillColor(hl->fillColor()); + bb->setFillShade(hl->fillShade()); + if (currItem->itemText.charStyle(a).effects() & ScStyle_Outline) + { + bb->setLineColor(hl->strokeColor()); + bb->setLineShade(hl->strokeShade()); + } + else + { + bb->setLineColor(CommonStrings::None); + bb->setLineShade(100); + } + bb->setLineWidth(chs * hl->outlineWidth() / 10000.0); + FPoint tp2(getMinClipF(&bb->PoLine)); + bb->PoLine.translate(-tp2.x(), -tp2.y()); + FPoint tp(getMaxClipF(&bb->PoLine)); + bb->setWidthHeight(tp.x(), tp.y()); + bb->Clip = FlattenPath(bb->PoLine, bb->Segments); + double textX = CurX + hl->glyph.xoffset; + double textY = ls.y; // + hl->glyph.yoffset; + if (charStyle.effects() & (ScStyle_Subscript | ScStyle_Superscript)) + { + textY += hl->glyph.yoffset; + x *= hl->glyph.scaleH; + y *= hl->glyph.scaleV; + } + chma6 = QMatrix(); + if (charStyle.baselineOffset() != 0) + textY -= (charStyle.fontSize() / 10.0) * (charStyle.baselineOffset() / 1000.0); + if (a < currItem->itemText.length()-1) + wide = hl->font().charWidth(chstr[0], charStyle.fontSize(), currItem->itemText.text(a+1)); + else + wide = hl->font().charWidth(chstr[0], charStyle.fontSize()); + if (currItem->imageFlippedH()) + textX = currItem->width() - textX - wide; + if (currItem->imageFlippedV()) + textY = currItem->height() - textY + y - (bb->height() - y); + FPoint npo(textX+x, textY-y, 0.0, 0.0, currItem->rotation(), 1.0, 1.0); + bb->moveBy(npo.x(),npo.y()); + bb->ContourLine = bb->PoLine.copy(); + bb->ClipEdited = true; + Doc->setRedrawBounding(bb); + undoManager->setUndoEnabled(true); + newGroupedItems.append(Doc->Items->takeAt(z)); + } + if (charStyle.effects() & ScStyle_Strikethrough) + { + double st, lw; + if ((charStyle.strikethruOffset() != -1) || (charStyle.strikethruWidth() != -1)) + { + if (charStyle.strikethruOffset() != -1) + st = (charStyle.strikethruOffset() / 1000.0) * (charStyle.font().ascent(charStyle.fontSize() / 10.0)); + else + st = charStyle.font().strikeoutPos(charStyle.fontSize() / 10.0); + if (charStyle.strikethruWidth() != -1) + lw = (charStyle.strikethruWidth() / 1000.0) * (charStyle.fontSize() / 10.0); + else + lw = qMax(charStyle.font().strokeWidth(charStyle.fontSize() / 10.0), 1.0); + } + else + { + st = charStyle.font().strikeoutPos(charStyle.fontSize() / 10.0); + lw = qMax(charStyle.font().strokeWidth(charStyle.fontSize() / 10.0), 1.0); + } + if (charStyle.baselineOffset() != 0) + st += (charStyle.fontSize() / 10.0) * hl->glyph.scaleV * (charStyle.baselineOffset() / 1000.0); + uint z = Doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, currItem->xPos(), currItem->yPos(), currItem->width(), currItem->height(), currItem->lineWidth(), currItem->lineColor(), currItem->fillColor(), true); + bb = Doc->Items->at(z); + undoManager->setUndoEnabled(false); + bb->setTextFlowMode(currItem->textFlowMode()); + bb->setSizeLocked(currItem->sizeLocked()); + bb->setLocked(currItem->locked()); + bb->NamedLStyle = currItem->NamedLStyle; + bb->setItemName(currItem->itemName()+"+S"+ccounter.setNum(a)); + bb->setRotation(currItem->rotation()); + bb->PoLine.addQuadPoint(FPoint(0, 0), FPoint(0, 0), FPoint(hl->glyph.xadvance, 0), FPoint(hl->glyph.xadvance, 0)); + bb->setLineColor(hl->fillColor()); + bb->setLineShade(hl->fillShade()); + bb->setLineWidth(lw); + FPoint tp2(getMinClipF(&bb->PoLine)); + bb->PoLine.translate(-tp2.x(), -tp2.y()); + FPoint tp(getMaxClipF(&bb->PoLine)); + bb->setWidthHeight(tp.x(), tp.y()); + bb->Clip = FlattenPath(bb->PoLine, bb->Segments); + double textX = CurX; + double textY = ls.y - st + hl->glyph.yoffset; + if (charStyle.baselineOffset() != 0) + textY -= (charStyle.fontSize() / 10.0) * (charStyle.baselineOffset() / 1000.0); + if (a < currItem->itemText.length()-1) + wide = hl->font().charWidth(chstr[0], charStyle.fontSize(), currItem->itemText.text(a+1)); + else + wide = hl->font().charWidth(chstr[0], charStyle.fontSize()); + if (currItem->imageFlippedH()) + textX = currItem->width() - textX - wide; + if (currItem->imageFlippedV()) + textY = currItem->height() - textY + y - (bb->height() - y); + FPoint npo(textX, textY, 0.0, 0.0, currItem->rotation(), 1.0, 1.0); + bb->moveBy(npo.x(),npo.y()); + bb->ContourLine = bb->PoLine.copy(); + bb->ClipEdited = true; + bb->FrameType = 3; + Doc->setRedrawBounding(bb); + undoManager->setUndoEnabled(true); + newGroupedItems.append(Doc->Items->takeAt(z)); + } + CurX += hl->glyph.wide(); + } + } + } + if ((currItem->asPathText()) && (currItem->PoShow)) + { + uint z = Doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, currItem->xPos(), currItem->yPos(), currItem->width(), currItem->height(), currItem->lineWidth(), CommonStrings::None, currItem->lineColor(), true); + PageItem *bb = Doc->Items->at(z); + undoManager->setUndoEnabled(false); + bb->PoLine = currItem->PoLine.copy(); + bb->ClipEdited = true; + bb->FrameType = 3; + bb->setRotation(currItem->rotation()); +// bb->setPolyClip(qRound(qMax(bb->lineWidth() / 2, 1))); + Doc->AdjustItemSize(bb); + undoManager->setUndoEnabled(true); + newGroupedItems.append(Doc->Items->takeAt(z)); + } + delItems.append(tmpSelection.takeItem(offset)); + } + tmpSelection.clear(); + if (newGroupedItems.count() > 1) + { + for (int ag = 0; ag < newGroupedItems.count(); ++ag) + { + Doc->Items->insert(currItem->ItemNr+1+ag, newGroupedItems.at(ag)); + tmpSelection.addItem(newGroupedItems.at(ag)); + } + Doc->renumberItemsInListOrder(); + Doc->itemSelection_GroupObjects(true, false, &tmpSelection); + } + else if (newGroupedItems.count() > 0) + { + Doc->Items->insert(currItem->ItemNr+1, newGroupedItems.at(0)); + Doc->renumberItemsInListOrder(); + } + int toDeleteItemCount=delItems.count(); + if (toDeleteItemCount != 0) + { + tmpSelection.clear(); + for(int i=0; i<toDeleteItemCount; ++i) + tmpSelection.addItem(delItems.takeAt(0)); //yes, 0, remove the first + Doc->itemSelection_DeleteItem(&tmpSelection); + } + Doc->m_Selection->copy(tmpSelection, true); + m_ScMW->HaveNewSel(-1); + trans.commit(); + } +#endif +} + +void ScribusView::keyPressEvent(QKeyEvent *k) +{ + m_ScMW->keyPressEvent(k); +} + +void ScribusView::keyReleaseEvent(QKeyEvent *k) +{ + m_ScMW->keyReleaseEvent(k); +} + +void ScribusView::inputMethodEvent ( QInputMethodEvent * event ) +{ +// qDebug() << "IME" << event->commitString() << event->preeditString() << "attributes:" << event->attributes().count(); + // #9682 : Avoid parameter type ambiguity in QKeyEvent constructor with Qt3Support enabled Qt builds + Qt::KeyboardModifiers modifiers = Qt::NoModifier; + for(int i = 0; i < event->commitString().length(); ++i) + { + QKeyEvent ev( QEvent::KeyPress, 0, modifiers, event->commitString().mid(i,1)); + keyPressEvent(&ev); + } +} + +QVariant ScribusView::inputMethodQuery ( Qt::InputMethodQuery query ) const +{ +// qDebug() << "IMQ" << query; + return QVariant(); +} + +void ScribusView::wheelEvent(QWheelEvent *w) +{ + //QScrollArea::contentsWheelEvent(w); +// evSpon = true; + + + if (w->modifiers() == Qt::ControlModifier) + { + FPoint mp = m_canvas->globalToCanvas(w->globalPos()); + w->delta() > 0 ? slotZoomIn(mp.x(), mp.y()) : slotZoomOut(mp.x(), mp.y()); + + } + else + { + int dX=0,dY=0; + int moveBy=(w->delta() < 0) ? Prefs->Wheelval : -Prefs->Wheelval; + if ((w->orientation() != Qt::Vertical) || ( w->modifiers() == Qt::ShiftModifier )) + dX = moveBy; + else + dY = moveBy; + scrollBy(dX, dY); + } + w->accept(); +} + +void ScribusView::setObjectUndoMode() +{ + _isGlobalMode = undoManager->isGlobalMode(); + if (m_ScMW->HaveDoc) + { + //qDebug(QString("%1 %2").arg((int)m_ScMW).arg(m_ScMW->scrActions.contains("editActionMode"))); + m_ScMW->scrActions["editActionMode"]->setChecked(true); + uint docSelectionCount=Doc->m_Selection->count(); + if (docSelectionCount == 1) + undoManager->showObject(Doc->m_Selection->itemAt(0)->getUId()); + else if (docSelectionCount > 1) + undoManager->showObject(Um::NO_UNDO_STACK); + else if (docSelectionCount == 0) + undoManager->showObject(Doc->currentPage()->getUId()); + } +} + +void ScribusView::setGlobalUndoMode() +{ + if (m_ScMW->HaveDoc) + { + m_ScMW->scrActions["editActionMode"]->setChecked(!_isGlobalMode); + if (_isGlobalMode) + undoManager->showObject(Um::GLOBAL_UNDO_MODE); + else + { + uint docSelectionCount=Doc->m_Selection->count(); + if (docSelectionCount == 1) + undoManager->showObject(Doc->m_Selection->itemAt(0)->getUId()); + else if (docSelectionCount > 1) + undoManager->showObject(Um::NO_UNDO_STACK); + else if (docSelectionCount == 0) + undoManager->showObject(Doc->currentPage()->getUId()); + } + } +} + +void ScribusView::unitChange() +{ + vertRuler->unitChange(); + horizRuler->unitChange(); +} + +void ScribusView::setRulersShown(bool isShown) +{ + vertRuler->setShown(isShown); + horizRuler->setShown(isShown); + rulerMover->setShown(isShown); + int newTopLeftMargin = isShown ? m_vhRulerHW : 0; + setViewportMargins(newTopLeftMargin, newTopLeftMargin, 0, 0); +} + +void ScribusView::slotUpdateContents() // deprecated +{ + updateContents(); +} + +void ScribusView::slotUpdateContents(const QRect &r) // deprecated +{ + updateContents(r); +} + + +void ScribusView::setScale(const double newScale) +{ + double Scale=newScale; + if (Scale < Doc->toolSettings.magMin*Prefs->DisScale/100.0) + Scale=Doc->toolSettings.magMin*Prefs->DisScale/100.0; + + if (Scale > Doc->toolSettings.magMax*Prefs->DisScale/100.0) + Scale=Doc->toolSettings.magMax*Prefs->DisScale/100.0; + + if (Scale > 32*Prefs->DisScale) + Scale=32*Prefs->DisScale; + + m_canvas->setScale(Scale); + + zoomSpinBox->blockSignals(true); + zoomSpinBox->setValue(m_canvas->scale()/Prefs->DisScale*100); + zoomSpinBox->blockSignals(false); + + unitChange(); +} + + + +double ScribusView::scale() const +{ + return m_canvas->scale(); +} + + + +bool ScribusView::eventFilter(QObject *obj, QEvent *event) +{ +// if (obj == horizRuler || obj == vertRuler || obj == rulerMover) +// return true; // FIXME:av + + if (obj == widget() && event->type() == QEvent::MouseMove) + { + QMouseEvent* m = static_cast<QMouseEvent*> (event); + FPoint p = m_canvas->localToCanvas(QPoint(m->x(),m->y())); + emit MousePos(p.x(),p.y()); + horizRuler->Draw(m->x() + qRound(Doc->minCanvasCoordinate.x() * m_canvas->scale())); // - 2 * contentsX()); + vertRuler->Draw(m->y() + qRound(Doc->minCanvasCoordinate.y() * m_canvas->scale())); + m_canvasMode->mouseMoveEvent(m); + return true; + } + else if (obj == widget() && event->type() == QEvent::MouseButtonRelease) + { + QMouseEvent* m = static_cast<QMouseEvent*> (event); + m_canvasMode->mouseReleaseEvent(m); + m_canvas->m_viewMode.m_MouseButtonPressed = false; + return true; + } + else if (obj == widget() && event->type() == QEvent::MouseButtonPress) + { + QMouseEvent* m = static_cast<QMouseEvent*> (event); + m_canvasMode->mousePressEvent(m); + m_canvas->m_viewMode.m_MouseButtonPressed = true; + return true; + } + else if (obj == widget() && event->type() == QEvent::MouseButtonDblClick) + { + QMouseEvent* m = static_cast<QMouseEvent*> (event); + m_canvasMode->mouseDoubleClickEvent(m); + return true; + } + else if (/* obj == widget() && */ event->type() == QEvent::KeyPress) + { + QKeyEvent* m = static_cast<QKeyEvent*> (event); + m_ScMW->keyPressEvent(m); + return true; + } + else if (/* obj == widget() && */ event->type() == QEvent::KeyRelease) + { + QKeyEvent* m = static_cast<QKeyEvent*> (event); + m_ScMW->keyReleaseEvent(m); + return true; + } + else if (obj == widget() && event->type() == QEvent::DragEnter) + { + QDragEnterEvent* d = static_cast<QDragEnterEvent*> (event); + contentsDragEnterEvent(d); + return true; + } + else if (obj == widget() && event->type() == QEvent::DragLeave) + { + QDragLeaveEvent* d = static_cast<QDragLeaveEvent*> (event); + contentsDragLeaveEvent(d); + return true; + } + else if (obj == widget() && event->type() == QEvent::DragMove) + { + QDragMoveEvent* d = static_cast<QDragMoveEvent*> (event); + contentsDragMoveEvent(d); + return true; + } + else if (obj == widget() && event->type() == QEvent::Drop) + { + QDropEvent* d = static_cast<QDropEvent*> (event); + contentsDropEvent(d); + return true; + } + + // rulermover events + // hruler events + // vruler events + + return QScrollArea::eventFilter(obj, event); +} + +//Legacy + +void ScribusView::updateContents(QRect box) +{ + if (box.isValid()) + m_canvas->update(box); + else + m_canvas->update(); +} + +void ScribusView::updateContents(int x, int y, int w, int h) +{ + updateContents(QRect(x,y,w,h)); +} + +void ScribusView::repaintContents(QRect box) +{ + if (box.isValid()) + m_canvas->repaint(box); + else + m_canvas->repaint(); +} + +void ScribusView::resizeContents(int w, int h) // deprecated +{ +// qDebug() << "ScribusView::resizeContents(" << w << "," << h << ")"; + int originX = qRound(Doc->minCanvasCoordinate.x() * scale()); + int originY = qRound(Doc->minCanvasCoordinate.y() * scale()); + widget()->resize(w - 0*originX, h - 0*originY); +} + +QPoint ScribusView::contentsToViewport(QPoint p) // deprecated +{ + return p + viewport()->pos(); +} + +QPoint ScribusView::viewportToContents(QPoint p) // deprecated +{ + return p - viewport()->pos(); +} + +int ScribusView::contentsX() // deprecated +{ + int originX = qRound(Doc->minCanvasCoordinate.x() * scale()); + return horizontalScrollBar()->value() + originX; +} + +int ScribusView::contentsY() // deprecated +{ + int originY = qRound(Doc->minCanvasCoordinate.y() * scale()); + return verticalScrollBar()->value() + originY; +} + +int ScribusView::contentsWidth() +{ + return horizontalScrollBar()->maximum() - horizontalScrollBar()->minimum(); +} + +int ScribusView::contentsHeight() +{ + return verticalScrollBar()->maximum() - verticalScrollBar()->minimum(); +} + +void ScribusView::setContentsPos(int x, int y) +{ + horizontalScrollBar()->setValue(x); + verticalScrollBar()->setValue(y); + setRulerPos(contentsX(), contentsY()); +} + + +void ScribusView::scrollContentsBy(int dx, int dy) +{ + QScrollArea::scrollContentsBy (dx, dy); + setRulerPos(contentsX(), contentsY()); +} + +void ScribusView::scrollBy(int x, int y) // deprecated +{ + setContentsPos(horizontalScrollBar()->value() + x, verticalScrollBar()->value() + y); +} + +void ScribusView::zoom(double scale) +{ + double zPointX = oldX, zPointY = oldY; + if (scale <= 0.0) + scale = m_canvas->scale(); + if (Doc->m_Selection->count() != 0) + { + PageItem *currItem = Doc->m_Selection->itemAt(0); + zPointX = currItem->xPos() + currItem->width() / 2.0; + zPointY = currItem->yPos() + currItem->height() / 2.0; + } + zoom( qRound(zPointX), qRound(zPointY), scale, false); +} + +void ScribusView::zoom(int canvasX, int canvasY, double scale, bool preservePoint) +{ + QPoint canvasPoint; + QPoint globalPoint = m_canvas->canvasToGlobal(QPointF(canvasX, canvasY)); + double newScale = (scale > 32*Prefs->DisScale) ? (32*Prefs->DisScale) : scale; + undoManager->setUndoEnabled(false); + updatesOn(false); + setScale(newScale); + QPoint localPoint = m_canvas->canvasToLocal( QPointF(canvasX, canvasY) ); + int nw = qMax(qRound((Doc->maxCanvasCoordinate.x() - Doc->minCanvasCoordinate.x()) * m_canvas->scale()), visibleWidth()); + int nh = qMax(qRound((Doc->maxCanvasCoordinate.y() - Doc->minCanvasCoordinate.y()) * m_canvas->scale()), visibleHeight()); + resizeContents(nw, nh); // FIXME : should be avoided here, cause an unnecessary paintEvent despite updates disabled + if (preservePoint) + canvasPoint = viewport()->mapFromGlobal(globalPoint); + else + { + QSize viewsize = viewport()->size(); + canvasPoint = QPoint(viewsize.width() / 2, viewsize.height() / 2); + } + setContentsPos(localPoint.x() - canvasPoint.x(), localPoint.y() - canvasPoint.y()); + updatesOn(true); + undoManager->setUndoEnabled(true); +} + + +void ScribusView::stopAllDrags() // deprecated +{ + m_canvas->m_viewMode.m_MouseButtonPressed = false; + m_canvas->m_viewMode.operItemMoving = false; + m_canvas->m_viewMode.operItemResizing = false; +//FIXME:av inItemCreation = false; + MidButt = false; +} |
