diff --git a/kpresenter/CHANGES b/kpresenter/CHANGES index 5a770bd42ea..224cbcd67c3 100644 --- a/kpresenter/CHANGES +++ b/kpresenter/CHANGES @@ -1,245 +1,246 @@ Changes after KPresenter 1.3 ============================ - Fixed possible crash in presentation mode if not all slides are shown - fixed wrong clipping of fullscreen presentation (#73943) - Fixed show the duration for the correct page if not all slides are shown +- Fixed crash in infinite loop presentation mode when first slide is not shown Changes: - If a page is shown more than once during a presentation add the time for the duration instead of showing only the last duration. Changes after KPresenter 1.3 RC1 ================================ - during a presentation variables on the sticky page were not updated (#67515) - font sizes are lost after reload (#72120) - duplicate slide doesn't exactly duplicate it, some formats are lost (#72126) - text style is not used if text field is empty (#72129) Changes after KPresenter 1.3 beta 4 =================================== Fixes: - Fixed When resizing a frame it does not snap to the grid (#63032) - Fixed after resize/undo size of object is not the same - Fixed after move/undo position of object is not the same - Fixed resizing of poly line objects - Fixed after reload of some objects moved up a little bit - Fixed moving with key left used y grid - Fixed header/footer moved in undo Changes after KPresenter 1.3 beta 3 =================================== Fixes: - Fixed cursor not blinking in some cases - Fixed "blinking cursor erases formatting characters" bug - "Adjust object to contents" works as intended now - Purpose of the 'Notebar' is unknown (#63037) - kpresenter crashed when I tried to insert the variable "section title" (#61735) - large footer from kpresenter 1.2.1 will crash kpresenter (#61449) - embedded spreadsheet (table button) appears at wrong size (#58498) - embedded kspread object displayed with wrong size (#33233) - KPresenter hangs when inserted text wraps to newline (#56946) - layer lowering is incorrect (#53277) - resize handles deceptive when zoomed out (#61602) - fixed painting garbage at a side of the screen in the presentation mode (on weird DPIs) Changes after KPresenter 1.3 beta 2 =================================== Fixes: - KPR 'forgets' solid line attribute of text frames (#61343) - fix pasting text objects screwing UTF-8 text - snap to Grid function aligns relatively, not absolutely (#56181) - when cutting&pasting a vertically centred text frame, the vertical position changes (#61330) Changes: - grid, snap to grid are on now by default, with a finer step of 5mm (#60011 and #60013) Changes after KPresenter 1.3 beta 1 =================================== Fixes: - fixed loading of old documents with invalid paragraph indents - paste image gives tiny initial object (#59058) - setting the font size in the toolbar doesn't work (#39786) - objects disappears on the rightside of a dinA0 presentation (#37370) - large unwanted offset in print preview and printing (#56123) New features: - flip groups horizontally/vertically (#45561) Changes after KPresenter 1.2 ============================ - Add "add to bookmark" feature - Add font properties : change relative font size when we sub/super script font - Add support to add offset from baseline - Now koinsertlink use 'recent document' - Add support to insert cursor directly - Add autocorrection : "Capitalize name of days" - Added support for global language - Use new kospell API - Added support for naming objects - Added flipping support for most objects (not yet for text autoform and kpart) Visual stuff: - objects use "forbidden" cursor when they're protected (new) - display an "End of presentation"-slide at end of presentation; configurable (new) - transition effect dialog with preview (new) Text boxes: - can spellcheck in selection only (new) - shadow is a text property now (bugfix) - link manipulation (add/copy/remove) (new) - access to spellcheck result via context menu - text formats now include language information (new) - new line spacing types: at least / exactly / multiple of (new) - new font attributes: small caps, uppercase, lowercase (new) - new underline and strikethru type: word by word Images: - properly draw images with alpha channels (bugfix) - better loading of background pictures; especially for remote files (new) Variables: - created/modified/printed document date (bug #24242) - added time/date variable offset (new) - added new variables: Next page number, Previous page number (new) Configurability: - whether and where to create backup files (new) - path to pictures (new) - personal dictionary (new) - list of ignored words when spellchecking (new) - go with a per-slide default when inserting a new one (wish #22629) - printing of slide notes (wish #56120) Misc: - web presentation: better HTML generation, usability improvement of the wizard (new) - copy/paste image/embedded objects between different instances (bugfix) - comment text can be copied now (bugfix) - undo/redo shows history of commands (new) Changes between KPresenter-1.2-RC1 and KPresenter-1.2 ===================================================== Bugfixes: - Fix undo/redo move object. - Fix #45966 kpresenter refuses to update image with same name - Fix #45991: problems w.r.t. font color and bullets - Fix mouse move event + vertical alignment - Fix resize to height : Don't create command when it's not necessary. - Fix availableHeight + vertical alignment - Fix save variable. - Fix recalc page number + sticky object - Fix draw gradient + rectangle object - Fix presentation mode : Don't draw grid and helpline in this mode - Fix update ruler tabs when we switch between two text object - Fix move up/down style - Fix restore style shortcut when we remove/rename/add style Changes between KPresenter-1.2-beta2 and KPresenter-1.2-RC1 =========================================================== New: - Like all of KOffice: a readonly GUI for embedding into Konqueror - More DCOP calls Bugfixes: - Fix resize text object - Fix webpresentation => display real variable value - Fix autocorrection (crash/change language etc...) - Fix update sidebar - Fix key event when text object is protect content. - Fix group object : allow to change text object attribute, fix load close object etc... - Width and height spin boxes in the style dialog are now coupled when keep aspect ratio is in effect. - Fix unselect object : use right button + shift - Fixed rounded rectangle + gradient - Fixed saving shadowed objects (when only their color differed from the defaults) - Restored a lot of backwards compatibility (formatting, bullets, numbers, whitespace handling etc.) - Speedup in displaying of the pixmap objects - Fixed the drawing of the background (no gradient when background is an image or a clipart) Crashes: - Fixed crash when we close kword and "special char dialogbox" is not closed - Fixed several memory leaks - Fixed crash when we cancel insert time/date variable. - Fixed crash when we duplicate page and there was an embedded document. - Fixed crash when we split view and we try to open menu when factory() is null - Fixed crash when we didn't select a slide and try to launch presentation KPresenter 1.2beta1 -> 1.2 beta 2 --------------------------------- - Add support for flip polyline object - Add support for "protect size and postion" - When we create a line object and we press shift we draw horizontal/vertical - Added support for dnd between text objects - Added support for keeping ratio of objects - Added dialog for duplicatiing objects - Add "Apply AutoFormat" - Add new type of begin/end line (line arrow, Dimension line... ) - Add support for find/replace with format - Now we can create directly a style from a selection - Add support for protect content of text object - Now we can close polyline object - Fix save/load variable - Use tripleState in styledia - Removed settings-toolbar and corresponding menu-entries - Added tab to properties-dialog according to selected object - Moved default-settings for rectangles, pies and polygons to 'Settings' -> 'Configure KPresenter' - Now we can change grid color - Add option to "Snap to grid" - Add support for text object margins - Improve font style - New transition effects: Strips - Add support for vertical alignment - Now we can change tab stop value - Now we can save picture from file to disk - Add Closed Line Object (freehand, polyline, quadric bezier curve, cubic bezier curve) - Add New Cursor for rotate tool and freehand tool - Merged actions for lines, shapes and arrangement of objects into an appropriate drop-down menu - Add support for autocorrect with format - Add option "Allow cursor in text object protected content" - Add import text style support - Add save page background image on disk - Add display field code (for variable) - We can change autoformat language Changes after KPresenter 1.1 ============================ - Port to kotext - New effect : kpresenter can play sounds - Thumbnail mode for the sidebar - Add notebar - Add a real statusbar - Add New Tool : freehand, polyline, quadric bezier curve, cubic bezier curve, convex/concave polygon - Add zoom support - Improve undo/redo (now we can undo/redo "insert new page"/"delete page"/"paste page"/"Duplicate page") - Now kpresenter has real page - Limit position/size object to page - spell checking/search/find works on all page - Add "Show Presentation Duration" - Add dcop interface : now we can insert text, change text format, etc... - Add support for style - Add support for background spell checking - Add support for manual completion (use CTRL + E ) - Add Help line - New transition effect: Blinds, Box In/Out, Checkboard, Cover, Uncover, Dissolve, Random,... - Add grid support - Add Help Point - Add support to change zoom with mouse (zoom selected area) - Add Configure Picture Dialog diff --git a/kpresenter/kprcanvas.cc b/kpresenter/kprcanvas.cc index 229cd82086f..b4b9c0618ee 100644 --- a/kpresenter/kprcanvas.cc +++ b/kpresenter/kprcanvas.cc @@ -1,7031 +1,7036 @@ // -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*- /* This file is part of the KDE project Copyright (C) 1998, 1999 Reginald Stadlbauer This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "styledia.h" #include "kpresenter_view.h" #include "kpbackground.h" #include "kppixmapobject.h" #include "kpfreehandobject.h" #include "kpcubicbeziercurveobject.h" #include "kpquadricbeziercurveobject.h" #include "gotopage.h" #include "kptextobject.h" #include "kpresenter_sound_player.h" #include "notebar.h" #include "kppartobject.h" #include "kpresenter_utils.h" #include "kppageeffects.h" #include "kprcommand.h" #include "kppolylineobject.h" #include "kpclosedlineobject.h" #include "kprpage.h" #include "kprvariable.h" #include "kpgroupobject.h" #include "kprcanvas.h" #include "kprcanvas.moc" KPrCanvas::KPrCanvas( QWidget *parent, const char *name, KPresenterView *_view ) : QWidget( parent, name, WStaticContents|WResizeNoErase|WRepaintNoErase ), buffer( size() ) { presMenu = 0; m_currentTextObjectView=0L; m_activePage=0L; m_xOffset = 0; m_yOffset = 0; m_tmpHorizHelpline = -1; m_tmpVertHelpline = -1; tmpHelpLinePosX = -1; tmpHelpLinePosY = -1; m_tmpHelpPoint = -1; tmpHelpPointPos = KoPoint( -1, -1); m_keyPressEvent = false; m_drawSymetricObject = false; if ( parent ) { showingLastSlide = false; mousePressed = false; drawContour = false; modType = MT_NONE; resizeObjNum = 0L; editNum = 0L; rotateNum = 0L; setBackgroundMode( Qt::NoBackground ); m_view = _view; setupMenus(); setMouseTracking( true ); show(); editMode = true; currPresPage = 1; currPresStep = 0; subPresStep = 0; _presFakt = 1.0; goingBack = false; drawMode = false; fillBlack = true; drawRubber = false; m_zoomRubberDraw = false; toolEditMode = TEM_MOUSE; tmpObjs.setAutoDelete( false ); setAcceptDrops( true ); inEffect = false; ratio = 0.0; keepRatio = false; mouseSelectedObject = false; selectedObjectPosition = -1; nextPageTimer = true; drawLineInDrawMode = false; soundPlayer = 0; m_drawPolyline = false; m_drawCubicBezierCurve = false; m_drawLineWithCubicBezierCurve = true; m_oldCubicBezierPointArray.putPoints( 0, 4, (double)0,(double)0, (double)0,(double)0, (double)0,(double)0, (double)0,(double)0 ); } else { m_view = 0; hide(); } setFocusPolicy( QWidget::StrongFocus ); setFocus(); setKeyCompression( true ); installEventFilter( this ); KCursor::setAutoHideCursor( this, true, true ); m_zoomBeforePresentation=100; if( m_view) { m_activePage=m_view->kPresenterDoc()->pageList().getFirst(); connect( m_view->kPresenterDoc(), SIGNAL( sig_terminateEditing( KPTextObject * ) ), this, SLOT( terminateEditing( KPTextObject * ) ) ); } } KPrCanvas::~KPrCanvas() { // block all signals (save for destroyed()) to avoid crashes on exit // (exitEditMode) emits signals blockSignals(true); // deactivate possible opened textobject to avoid double deletion, KPTextObject deletes this already exitEditMode(); delete presMenu; stopSound(); delete soundPlayer; blockSignals(false); } void KPrCanvas::scrollX( int x ) { int oldXOffset = m_xOffset; m_xOffset = x; scroll( oldXOffset - x, 0 ); } void KPrCanvas::scrollY( int y ) { int oldYOffset = m_yOffset; m_yOffset = y; scroll( 0, oldYOffset - y ); } bool KPrCanvas::eventFilter( QObject *o, QEvent *e ) { if ( !o || !e ) return TRUE; if ( m_currentTextObjectView ) KCursor::autoHideEventFilter( o, e ); switch ( e->type() ) { case QEvent::AccelOverride: { QKeyEvent * keyev = static_cast(e); if ( m_currentTextObjectView && (keyev->key()==Key_Home ||keyev->key()==Key_End || keyev->key()==Key_Tab || keyev->key()==Key_Prior || keyev->key()==Key_Next) ) { m_currentTextObjectView->keyPressEvent( keyev ); return true; } else if ( !m_currentTextObjectView && keyev->key()==Key_Tab ) { keyPressEvent(keyev); return true; } } case QEvent::FocusIn: if ( m_currentTextObjectView ) m_currentTextObjectView->focusInEvent(); return TRUE; case QEvent::FocusOut: if ( m_currentTextObjectView ) m_currentTextObjectView->focusOutEvent(); return TRUE; case QEvent::KeyPress: { #ifndef NDEBUG QKeyEvent * keyev = static_cast(e); // Debug keys if ( ( keyev->state() & ControlButton ) && ( keyev->state() & ShiftButton ) ) { switch ( keyev->key() ) { case Key_P: // 'P' -> paragraph debug printRTDebug( 0 ); break; case Key_V: // 'V' -> verbose parag debug printRTDebug( 1 ); break; default: break; } } #endif } break; default: break; } return QWidget::eventFilter(o,e); } bool KPrCanvas::focusNextPrevChild( bool ) { return TRUE; // Don't allow to go out of the canvas widget by pressing "Tab" } void KPrCanvas::paintEvent( QPaintEvent* paintEvent ) { if ( isUpdatesEnabled() ) { QPainter bufPainter; bufPainter.begin( &buffer, this ); // double-buffering - (the buffer is as big as the widget) bufPainter.translate( -diffx(), -diffy() ); bufPainter.setBrushOrigin( -diffx(), -diffy() ); QRect crect( paintEvent->rect() ); // the rectangle that needs to be repainted, in widget coordinates //kdDebug(33001) << "KPrCanvas::paintEvent " << DEBUGRECT( crect ) << endl; crect.moveBy( diffx(), diffy() ); // now in contents coordinates //kdDebug(33001) << "KPrCanvas::paintEvent after applying diffx/diffy: " << DEBUGRECT( crect ) << endl; if ( editMode || !fillBlack ) bufPainter.fillRect( crect, white ); else bufPainter.fillRect( crect, black ); drawBackground( &bufPainter, crect ); SelectionMode selectionMode; if ( toolEditMode == TEM_MOUSE || toolEditMode == TEM_ZOOM ) selectionMode = SM_MOVERESIZE; else if ( toolEditMode == TEM_ROTATE ) selectionMode = SM_ROTATE; else selectionMode = SM_NONE; KPresenterDoc *doc =m_view->kPresenterDoc(); if ( editMode ) { if ( doc->showGrid() && !doc->gridToFront()) drawGrid( &bufPainter, crect); if ( doc->showHelplines() && !doc->helpLineToFront() && editMode) { drawHelplines( &bufPainter, crect); drawHelpPoints( &bufPainter, crect); } } if ( !editMode ) selectionMode = SM_NONE; // case of screen presentation mode drawObjects( &bufPainter, crect, true, selectionMode, true ); if ( editMode ) { if ( doc->showGrid() && doc->gridToFront()) drawGrid( &bufPainter, crect); if ( doc->showHelplines() && doc->helpLineToFront()) { drawHelplines( &bufPainter, crect); drawHelpPoints( &bufPainter, crect); } } bufPainter.end(); bitBlt( this, paintEvent->rect().topLeft(), &buffer, paintEvent->rect() ); } //else kdDebug(33001) << "KPrCanvas::paintEvent with updates disabled" << endl; } void KPrCanvas::drawBackground( QPainter *painter, const QRect& rect ) const { QRegion grayRegion( rect ); if ( editMode ) { //kdDebug(33001) << "KPrCanvas::drawBackground drawing bg for page " << i+1 << " editMode=" << editMode << endl; QRect pageRect = m_activePage->getZoomPageRect(); //kdDebug(33001) << "KPrCanvas::drawBackground pageRect=" << DEBUGRECT(pageRect) << endl; //kdDebug(33001) << "KPrCanvas::drawBackground rect=" << DEBUGRECT(rect) << endl; if ( rect.intersects( pageRect ) ) m_activePage->background()->draw( painter, m_view->zoomHandler(), rect, true ); // Include the border now pageRect.rLeft() -= 1; pageRect.rTop() -= 1; pageRect.rRight() += 1; pageRect.rBottom() += 1; grayRegion -= pageRect; // In edit mode we also want to draw the gray area out of the pages if ( !grayRegion.isEmpty() ) eraseEmptySpace( painter, grayRegion, QApplication::palette().active().brush( QColorGroup::Mid ) ); } else // TODO use m_pageList m_view->kPresenterDoc()->pageList().at( currPresPage-1 )->background()->draw( painter, m_view->zoomHandler(), rect, false ); } // 100% stolen from KWord void KPrCanvas::eraseEmptySpace( QPainter * painter, const QRegion & emptySpaceRegion, const QBrush & brush ) const { painter->save(); painter->setClipRegion( emptySpaceRegion, QPainter::CoordPainter ); painter->setPen( Qt::NoPen ); //kdDebug(33001) << "KWDocument::eraseEmptySpace emptySpaceRegion: " << DEBUGRECT( emptySpaceRegion.boundingRect() ) << endl; painter->fillRect( emptySpaceRegion.boundingRect(), brush ); painter->restore(); } // Draw all object in page : draw object in current page and sticky objects void KPrCanvas::drawObjectsInPage(QPainter *painter, const KoRect& rect2, bool drawCursor, SelectionMode selectMode, bool doSpecificEffects, const QPtrList & obj) const { QPtrListIterator it( obj ); for ( ; it.current() ; ++it ) { SelectionMode selectionMode=selectMode; if ( objectIsAHeaderFooterHidden(it.current())) continue; //don't draw rotate indicator when we are a header or footer if( m_view->kPresenterDoc()->isHeaderFooter(it.current()) || it.current()->isProtect()) selectionMode=SM_PROTECT; if ( ( rect2.intersects( it.current()->getBoundingRect() ) && editMode ) || ( !editMode && it.current()->getPresNum() <= static_cast( currPresStep ) && ( !it.current()->getDisappear() || it.current()->getDisappear() && it.current()->getDisappearNum() > static_cast( currPresStep ) ) ) ) { if ( inEffect && it.current()->getPresNum() >= static_cast( currPresStep ) ) continue; if ( !editMode && doSpecificEffects && !goingBack && static_cast( currPresStep ) == it.current()->getPresNum() ) { //kdDebug(33001) << " setSubPresStep " << subPresStep << endl; it.current()->setSubPresStep( subPresStep ); it.current()->doSpecificEffects( true, false ); } //kdDebug(33001) << " drawing object at " << diffx() << "," << diffy() << " and setting subpresstep to 0 !" << endl; if ( drawCursor && it.current()->getType() == OT_TEXT && m_currentTextObjectView ) { KPTextObject* textObject = static_cast( it.current() ); if ( m_currentTextObjectView->kpTextObject() == textObject ) // This is the object we are editing textObject->paintEdited( painter,m_view->zoomHandler(), false /*onlyChanged. Pass as param ?*/, m_currentTextObjectView->cursor(), true /* idem */ ); else it.current()->draw( painter, m_view->zoomHandler(), selectionMode, ((it.current())->isSelected()) && drawContour ); } else it.current()->draw( painter, m_view->zoomHandler(), selectionMode, ((it.current())->isSelected()) && drawContour ); it.current()->setSubPresStep( 0 ); it.current()->doSpecificEffects( false ); } } } void KPrCanvas::drawObjects( QPainter *painter, const QRect& rect, bool drawCursor, SelectionMode selectionMode, bool doSpecificEffects ) const { int pgNum = editMode ? (int)m_view->getCurrPgNum() : currPresPage; KoRect rect2 = m_view->zoomHandler()->unzoomRect(rect); //objects in current page drawObjectsInPage( painter, rect2, drawCursor, selectionMode, doSpecificEffects, m_view->kPresenterDoc()->pageList().at(pgNum-1)->objectList()); //draw sticky object drawObjectsInPage( painter, rect2, drawCursor, selectionMode, doSpecificEffects, stickyPage()->objectList()); } void KPrCanvas::drawGrid(QPainter *painter, const QRect &rect2) const { KPresenterDoc *doc=m_view->kPresenterDoc(); if(!doc->isReadWrite()) return; QPen _pen = QPen( doc->gridColor(), 6, Qt::DotLine ); painter->save(); painter->setPen( _pen ); QRect pageRect=activePage()->getZoomPageRect(); int zoomedX, zoomedY; double offsetX = doc->getGridX(); double offsetY = doc->getGridY(); for ( double i = offsetX; ( zoomedX = m_view->zoomHandler()->zoomItX( i ) ) < pageRect.width(); i += offsetX ) for ( double j = offsetY; ( zoomedY = m_view->zoomHandler()->zoomItY( j ) ) < pageRect.height(); j += offsetY ) if( rect2.contains( zoomedX, zoomedY ) ) painter->drawPoint( zoomedX, zoomedY ); painter->restore(); } void KPrCanvas::drawHelpPoints( QPainter *painter, const QRect &rect2) const { KPresenterDoc *doc=m_view->kPresenterDoc(); if(!doc->isReadWrite()) return; KoRect rect = m_view->zoomHandler()->unzoomRect(rect2); QValueList::Iterator i; QPen _pen = QPen( Qt::black, 1, Qt::DotLine ); painter->save(); painter->setPen( _pen ); for(i = doc->helpPoints().begin(); i != doc->helpPoints().end(); ++i) { KoPoint vi = *i ; if( rect.contains( vi ) ) { QPoint point=m_view->zoomHandler()->zoomPoint( vi); painter->drawLine( point.x(), point.y()-20, point.x(), point.y()+20); painter->drawLine( point.x()-20, point.y(), point.x()+20, point.y()); } } painter->restore(); } void KPrCanvas::drawHelplines(QPainter *painter, const QRect &rect2) const { KPresenterDoc *doc=m_view->kPresenterDoc(); if(!doc->isReadWrite()) return; KoRect rect = m_view->zoomHandler()->unzoomRect(rect2); QValueList::ConstIterator i; QPen _pen = QPen( Qt::black, 1, Qt::DotLine ); painter->save(); painter->setPen( _pen ); QRect pageRect=activePage()->getZoomPageRect(); for(i = doc->horizHelplines().begin(); i != doc->horizHelplines().end(); ++i) { double vi = *i ; if( rect.contains(rect.x(), vi) ) painter->drawLine(pageRect.left(), m_view->zoomHandler()->zoomItY(vi), pageRect.right(), m_view->zoomHandler()->zoomItY(vi)); } for(i = doc->vertHelplines().begin(); i != doc->vertHelplines().end(); ++i) { double vi = *i ; if( rect.contains(vi, rect.y()) ) painter->drawLine(m_view->zoomHandler()->zoomItX(vi), pageRect.top(), m_view->zoomHandler()->zoomItX(vi), pageRect.bottom()); } painter->restore(); } // This one is used to generate the pixmaps for the HTML presentation, // for the pres-structure-dialog, for the sidebar previews, for template icons. void KPrCanvas::drawAllObjectsInPage( QPainter *painter, const QPtrList & obj ) const { QPtrListIterator it( obj ); for ( ; it.current(); ++it ) { if ( objectIsAHeaderFooterHidden( it.current() ) ) continue; it.current()->draw( painter, m_view->zoomHandler(), SM_NONE, false ); } } QRect KPrCanvas::getOldBoundingRect( const KPObject *obj ) { KoRect oldKoBoundingRect = obj->getBoundingRect(); double _dx = oldKoBoundingRect.x() - 5.0; double _dy = oldKoBoundingRect.y() - 5.0; double _dw = oldKoBoundingRect.width() + 10.0; double _dh = oldKoBoundingRect.height() + 10.0; oldKoBoundingRect.setRect( _dx, _dy, _dw, _dh ); oldBoundingRect = m_view->zoomHandler()->zoomRect( oldKoBoundingRect ); return oldBoundingRect; } void KPrCanvas::mousePressEvent( QMouseEvent *e ) { if(!m_view->koDocument()->isReadWrite()) return; moveStartPosMouse = objectSelectedBoundingRect().topLeft(); QPoint contentsPoint( e->pos().x()+diffx(), e->pos().y()+diffy() ); KoPoint docPoint = m_view->zoomHandler()->unzoomPoint( contentsPoint ); if(m_currentTextObjectView) { KPTextObject *txtObj=m_currentTextObjectView->kpTextObject(); Q_ASSERT(txtObj); if(txtObj->contains( docPoint )) { KoPoint pos = docPoint - txtObj->innerRect().topLeft(); // in pt, but now translated into the object's coordinate system mousePressed=true; if(e->button() == RightButton) { m_currentTextObjectView->showPopup( m_view, QCursor::pos(), m_view->actionList() ); mousePressed=false; } else if( e->button() == MidButton ) { QApplication::clipboard()->setSelectionMode( true ); m_currentTextObjectView->paste(); QApplication::clipboard()->setSelectionMode( false ); } else m_currentTextObjectView->mousePressEvent(e, m_view->zoomHandler()->ptToLayoutUnitPix( pos ) ); // in LU pixels return; } } if ( e->state() & ControlButton ) keepRatio = true; KPObject *kpobject = 0; oldMx = contentsPoint.x(); oldMy = contentsPoint.y(); QPoint rasterPoint=applyGrid( e->pos(), true ); resizeObjNum = 0L; exitEditMode(); if ( editMode ) { if ( e->button() == LeftButton ) { mousePressed = true; if ( m_drawPolyline && ( toolEditMode == INS_POLYLINE || toolEditMode == INS_CLOSED_POLYLINE ) ) { m_dragStartPoint = rasterPoint; m_pointArray.putPoints( m_indexPointArray, 1,m_view->zoomHandler()->unzoomItX( m_dragStartPoint.x()), m_view->zoomHandler()->unzoomItY(m_dragStartPoint.y()) ); ++m_indexPointArray; return; } if ( m_drawCubicBezierCurve && ( toolEditMode == INS_CUBICBEZIERCURVE || toolEditMode == INS_QUADRICBEZIERCURVE || toolEditMode == INS_CLOSED_CUBICBEZIERCURVE || toolEditMode == INS_CLOSED_QUADRICBEZIERCURVE ) ) { if ( m_drawLineWithCubicBezierCurve ) { QPainter p( this ); p.setPen( QPen( Qt::black, 1, Qt::SolidLine ) ); p.setBrush( Qt::NoBrush ); p.setRasterOp( Qt::NotROP ); QPoint oldStartPoint = m_dragStartPoint; m_dragStartPoint = rasterPoint; p.drawLine( oldStartPoint, m_dragStartPoint ); // erase old line p.end(); m_pointArray.putPoints( m_indexPointArray, 1, m_view->zoomHandler()->unzoomItX( m_dragStartPoint.x()), m_view->zoomHandler()->unzoomItY( m_dragStartPoint.y()) ); ++m_indexPointArray; m_drawLineWithCubicBezierCurve = false; } else { QPoint _oldEndPoint = rasterPoint; QPainter p( this ); QPen _pen = QPen( Qt::black, 1, Qt::DashLine ); p.setPen( _pen ); p.setBrush( Qt::NoBrush ); p.setRasterOp( Qt::NotROP ); p.save(); double _angle = KoPoint::getAngle( _oldEndPoint, m_dragStartPoint ); //FIXME drawFigure( L_SQUARE, &p, m_view->zoomHandler()->unzoomPoint( _oldEndPoint ), _pen.color(), _pen.width(), _angle,m_view->zoomHandler() ); // erase old figure p.restore(); p.drawLine( m_dragStartPoint, _oldEndPoint ); // erase old line int p_x = m_dragStartPoint.x() * 2 - _oldEndPoint.x(); int p_y = m_dragStartPoint.y() * 2 - _oldEndPoint.y(); QPoint _oldSymmetricEndPoint = QPoint( p_x, p_y ); p.save(); _angle = KoPoint::getAngle( _oldSymmetricEndPoint, m_dragStartPoint ); drawFigure( L_SQUARE, &p, m_view->zoomHandler()->unzoomPoint( _oldSymmetricEndPoint ), _pen.color(), _pen.width(), _angle,m_view->zoomHandler() ); // erase old figure p.restore(); p.drawLine( m_dragStartPoint, _oldSymmetricEndPoint ); // erase old line m_pointArray.putPoints( m_indexPointArray, 3, m_CubicBezierSecondPoint.x(), m_CubicBezierSecondPoint.y(), m_CubicBezierThirdPoint.x(), m_CubicBezierThirdPoint.y(), m_view->zoomHandler()->unzoomItX(m_dragStartPoint.x()), m_view->zoomHandler()->unzoomItY(m_dragStartPoint.y()) ); m_indexPointArray += 3; m_drawLineWithCubicBezierCurve = true; m_oldCubicBezierPointArray = KoPointArray(); m_oldCubicBezierPointArray.putPoints( 0, 4, (double)0,(double)0, (double)0,(double)0, (double)0,(double)0, (double)0,(double)0 ); m_dragEndPoint = m_dragStartPoint; } return; } switch ( toolEditMode ) { case TEM_MOUSE: { bool overObject = false; bool deSelAll = true; bool _resizeObj = false; KPObject *kpobject = 0; firstX = contentsPoint.x(); firstY = contentsPoint.y(); kpobject = m_activePage->getObjectResized( docPoint, modType, deSelAll, overObject, _resizeObj ); if ( kpobject ) { if(_resizeObj) { oldBoundingRect = getOldBoundingRect( kpobject ); resizeObjNum = kpobject; } } else { _resizeObj = false; kpobject = stickyPage()->getObjectResized( docPoint, modType, deSelAll, overObject, _resizeObj ); if( kpobject && m_view->kPresenterDoc()->isHeaderFooter(kpobject)) { if(objectIsAHeaderFooterHidden(kpobject)) { kpobject=0L; overObject=false; } } if( kpobject && _resizeObj ) { oldBoundingRect = getOldBoundingRect( kpobject ); resizeObjNum = kpobject; } } if ( resizeObjNum ) keepRatio = keepRatio || resizeObjNum->isKeepRatio(); if ( deSelAll && !( e->state() & ShiftButton ) && !( e->state() & ControlButton ) ) deSelectAllObj(); if ( overObject && kpobject) { if ( !(e->state() & ShiftButton)) { selectObj( kpobject ); raiseObject( kpobject ); moveStartPosMouse = objectSelectedBoundingRect().topLeft(); } else deSelectObj( kpobject ); } else { modType = MT_NONE; if( editMode && m_view->kPresenterDoc()->showHelplines()) { m_tmpHorizHelpline = m_view->kPresenterDoc()->indexOfHorizHelpline(m_view->zoomHandler()->unzoomItY(e->pos().y()+diffy())); m_tmpVertHelpline = m_view->kPresenterDoc()->indexOfVertHelpline(m_view->zoomHandler()->unzoomItX(e->pos().x()+diffx())); m_tmpHelpPoint = m_view->kPresenterDoc()->indexOfHelpPoint( KoPoint(m_view->zoomHandler()->unzoomItX(e->pos().x()+diffx()), m_view->zoomHandler()->unzoomItX(e->pos().y()+diffy())) ); tmpHelpLinePosX=m_view->zoomHandler()->unzoomItX(e->pos().x()); tmpHelpLinePosY=m_view->zoomHandler()->unzoomItY(e->pos().y()); tmpHelpPointPos=m_view->zoomHandler()->unzoomPoint( e->pos()); } else { m_tmpVertHelpline = -1; m_tmpHorizHelpline = -1; m_tmpHelpPoint = -1; } if ( !( e->state() & ShiftButton ) && !( e->state() & ControlButton ) ) deSelectAllObj(); if (m_tmpHorizHelpline == -1 && m_tmpVertHelpline ==-1 && m_tmpHelpPoint == -1) { drawRubber = true; rubber = QRect( e->x(), e->y(), 0, 0 ); tmpHelpLinePosX=-1; tmpHelpLinePosY=-1; tmpHelpPointPos=KoPoint( -1, -1 ); } } // update hotspot calcBoundingRect(); m_hotSpot = docPoint - m_boundingRect.topLeft(); m_origPos = QPoint(e->x() + diffx(), e->y() + diffy()); } break; case TEM_ZOOM: { modType = MT_NONE; drawRubber = true; m_zoomRubberDraw = false; rubber = QRect( e->x(), e->y(), 0, 0 ); }break; case TEM_ROTATE: { //bool deSelAll = true; //bool _resizeObj = false; KPObject *kpobject = 0; firstX = contentsPoint.x(); firstY = contentsPoint.y(); // find object on active page kpobject = m_activePage->getObjectAt( docPoint ); // find object on sticky page (ignore header/footer) if ( !kpobject ) { kpobject = stickyPage()->getObjectAt( docPoint ); if( kpobject && m_view->kPresenterDoc()->isHeaderFooter(kpobject)) if(objectIsAHeaderFooterHidden(kpobject)) kpobject=0L; } // clear old selections even if shift or control are pressed // we don't support rotating multiple objects yet deSelectAllObj(); // deselect all if no object is found if ( !kpobject ) deSelectAllObj(); // select and raise object else { rotateNum = kpobject; startAngle = -kpobject->getAngle(); selectObj( kpobject ); raiseObject( kpobject ); } // set axis to center of selected objects bounding rect if ( kpobject ) { calcBoundingRect(); axisX = m_boundingRect.center().x(); axisY = m_boundingRect.center().y(); } } break; case INS_FREEHAND: case INS_CLOSED_FREEHAND: { deSelectAllObj(); mousePressed = true; QPoint tmp = applyGrid ( e->pos(),true ); insRect = QRect( tmp.x(),tmp.y(), 0, 0 ); m_indexPointArray = 0; m_dragStartPoint = tmp; m_dragEndPoint = m_dragStartPoint; m_pointArray.putPoints( m_indexPointArray, 1, m_view->zoomHandler()->unzoomItX(m_dragStartPoint.x()), m_view->zoomHandler()->unzoomItY(m_dragStartPoint.y()) ); ++m_indexPointArray; } break; case INS_POLYLINE: case INS_CLOSED_POLYLINE: { deSelectAllObj(); mousePressed = true; QPoint tmp = applyGrid ( e->pos(),true ); insRect = QRect( tmp.x(),tmp.y(), 0, 0 ); m_drawPolyline = true; m_indexPointArray = 0; m_dragStartPoint = tmp; m_dragEndPoint = m_dragStartPoint; m_pointArray.putPoints( m_indexPointArray, 1, m_view->zoomHandler()->unzoomItX(m_dragStartPoint.x()), m_view->zoomHandler()->unzoomItY(m_dragStartPoint.y()) ); ++m_indexPointArray; } break; case INS_CUBICBEZIERCURVE: case INS_QUADRICBEZIERCURVE: case INS_CLOSED_CUBICBEZIERCURVE: case INS_CLOSED_QUADRICBEZIERCURVE: { deSelectAllObj(); mousePressed = true; QPoint tmp = applyGrid ( e->pos(),true ); insRect = QRect( tmp.x(), tmp.y(), 0, 0 ); m_drawCubicBezierCurve = true; m_drawLineWithCubicBezierCurve = true; m_indexPointArray = 0; m_oldCubicBezierPointArray.putPoints( 0, 4, (double)0,(double)0, (double)0,(double)0, (double)0,(double)0, (double)0,(double)0 ); m_dragStartPoint = tmp; m_dragEndPoint = m_dragStartPoint; m_pointArray.putPoints( m_indexPointArray, 1, m_view->zoomHandler()->unzoomItX(m_dragStartPoint.x()), m_view->zoomHandler()->unzoomItY(m_dragStartPoint.y() )); ++m_indexPointArray; } break; case INS_POLYGON: { deSelectAllObj(); mousePressed = true; QPoint tmp = applyGrid ( e->pos(),true ); insRect = QRect( tmp.x(), tmp.y(), 0, 0 ); m_indexPointArray = 0; m_dragStartPoint = tmp; m_dragEndPoint = m_dragStartPoint; } break; default: { deSelectAllObj(); mousePressed = true; QPoint tmp = applyGrid ( e->pos(),true ); insRect = QRect( tmp.x(), tmp.y(), 0, 0 ); } break; } } if ( e->button() == RightButton && ( toolEditMode == INS_POLYLINE || toolEditMode == INS_CLOSED_POLYLINE ) && !m_pointArray.isNull() && m_drawPolyline ) { if( m_indexPointArray > 1) { QPainter p( this ); p.setPen( QPen( black, 1, SolidLine ) ); p.setBrush( NoBrush ); p.save(); p.setRasterOp( NotROP ); p.drawLine( m_dragStartPoint, m_dragEndPoint ); // p.drawLine( m_dragStartPoint, m_view->zoomHandler()->zoomPoint( m_pointArray.at(m_indexPointArray - 2)) ); p.restore(); m_indexPointArray= QMAX(1,m_indexPointArray-1); m_pointArray.resize(m_indexPointArray); m_dragStartPoint=m_view->zoomHandler()->zoomPoint( m_pointArray.at(m_indexPointArray - 1)); p.drawLine( m_dragStartPoint, m_dragEndPoint ); p.end(); } else if( m_indexPointArray == 1) { QPainter p( this ); p.setPen( QPen( black, 1, SolidLine ) ); p.setBrush( NoBrush ); p.setRasterOp( NotROP ); p.drawLine( m_dragStartPoint, m_dragEndPoint ); // p.end(); m_pointArray = KoPointArray(); m_indexPointArray = 0; m_drawPolyline = false; mousePressed = false; } return; } if ( e->button() == RightButton && ( toolEditMode == INS_CUBICBEZIERCURVE || toolEditMode == INS_QUADRICBEZIERCURVE || toolEditMode == INS_CLOSED_CUBICBEZIERCURVE || toolEditMode == INS_CLOSED_QUADRICBEZIERCURVE ) && !m_pointArray.isNull() && m_drawCubicBezierCurve ) { if ( m_drawLineWithCubicBezierCurve ) { QPoint point = applyGrid( e->pos(), true); m_pointArray.putPoints( m_indexPointArray, 1, m_view->zoomHandler()->unzoomItX(point.x()), m_view->zoomHandler()->unzoomItY(point.y()) ); ++m_indexPointArray; } else { m_pointArray.putPoints( m_indexPointArray, 2, m_CubicBezierSecondPoint.x(), m_CubicBezierSecondPoint.y(), m_CubicBezierThirdPoint.x(), m_CubicBezierThirdPoint.y() ); m_indexPointArray += 2; } if ( toolEditMode == INS_CUBICBEZIERCURVE || toolEditMode == INS_QUADRICBEZIERCURVE || toolEditMode == INS_CLOSED_CUBICBEZIERCURVE || toolEditMode == INS_CLOSED_QUADRICBEZIERCURVE ) endDrawCubicBezierCurve(); mouseMoveEvent( e ); return; } if ( e->button() == RightButton && toolEditMode == TEM_MOUSE ) { KPObject*obj = getObjectAt( docPoint ); if(objectIsAHeaderFooterHidden(obj)) obj=0L; if ( obj ) { kpobject = obj; QPoint pnt = QCursor::pos(); mousePressed = false; bool state=!( e->state() & ShiftButton ) && !( e->state() & ControlButton ) && !kpobject->isSelected(); ObjType objectType = kpobject->getType(); if ( objectType == OT_PICTURE || objectType == OT_CLIPART ) { deSelectAllObj(); selectObj( kpobject ); m_view->openPopupMenuObject( "picmenu_popup", pnt ); } else if ( objectType == OT_TEXT ) { if ( state ) deSelectAllObj(); KPTextObject *obj=dynamic_cast(kpobject); selectObj( kpobject ); if ( obj ) m_view->changeVerticalAlignmentStatus( obj->verticalAlignment() ); m_view->openPopupMenuObject( "textobject_popup", pnt ); } else if ( objectType == OT_PIE ) { if ( state ) deSelectAllObj(); selectObj( kpobject ); m_view->openPopupMenuObject( "piemenu_popup", pnt ); } else if ( objectType == OT_RECT || objectType == OT_ELLIPSE ) { if ( state ) deSelectAllObj(); selectObj( kpobject ); m_view->openPopupMenuObject( "rectangleobject_popup", pnt ); } else if ( objectType == OT_PART ) { if ( state ) deSelectAllObj(); selectObj( kpobject ); m_view->openPopupMenuObject( "partobject_popup", pnt ); } else if ( objectType == OT_POLYGON ) { if ( state ) deSelectAllObj(); selectObj( kpobject ); m_view->openPopupMenuObject( "polygonobject_popup", pnt ); } else if ( objectType == OT_POLYLINE ) { if ( state ) deSelectAllObj(); selectObj( kpobject ); KPPolylineObject *tmpObj=dynamic_cast(kpobject); if ( tmpObj ) { if (!tmpObj->isClosed()) m_view->openPopupMenuObject( "closed_popup", pnt ); else m_view->openPopupMenuObject( "flip_popup", pnt ); } } else if ( objectType == OT_CUBICBEZIERCURVE ) { if ( state ) deSelectAllObj(); selectObj( kpobject ); KPCubicBezierCurveObject *tmpObj=dynamic_cast(kpobject); if ( tmpObj ) { if (!tmpObj->isClosed()) m_view->openPopupMenuObject( "closed_popup", pnt ); else m_view->openPopupMenuObject( "flip_popup", pnt ); } } else if ( objectType == OT_QUADRICBEZIERCURVE ) { if ( state ) deSelectAllObj(); selectObj( kpobject ); KPQuadricBezierCurveObject *tmpObj=dynamic_cast(kpobject); if ( tmpObj ) { if (!tmpObj->isClosed()) m_view->openPopupMenuObject( "closed_popup", pnt ); else m_view->openPopupMenuObject( "flip_popup", pnt ); } } else if ( objectType == OT_FREEHAND ) { if ( state ) deSelectAllObj(); selectObj( kpobject ); KPFreehandObject *tmpObj=dynamic_cast(kpobject); if ( tmpObj ) { if (!tmpObj->isClosed()) m_view->openPopupMenuObject( "closed_popup", pnt ); else m_view->openPopupMenuObject( "flip_popup", pnt ); } } else if ( objectType == OT_LINE ){ if ( state ) deSelectAllObj(); selectObj( kpobject ); m_view->openPopupMenuObject( "flip_popup", pnt ); } else if ( objectType == OT_CLOSED_LINE ) { if ( state ) deSelectAllObj(); selectObj( kpobject ); KPClosedLineObject *tmpObj=dynamic_cast(kpobject); if ( tmpObj ) m_view->openPopupMenuObject( "flip_popup", pnt ); } else if ( objectType == OT_GROUP ) { KPGroupObject *obj=dynamic_cast(kpobject); if ( state ) deSelectAllObj(); selectObj( kpobject ); if ( obj && oneObjectTextSelected()) m_view->openPopupMenuObject( "textobject_popup", pnt ); else m_view->openPopupMenuObject( "flip_popup", pnt ); } else { if ( state ) deSelectAllObj(); selectObj( kpobject ); m_view->openPopupMenuObject( "graphmenu_popup", pnt ); } } else { QPoint pnt = QCursor::pos(); if( m_view->kPresenterDoc()->showHelplines()) { m_tmpHorizHelpline = m_view->kPresenterDoc()->indexOfHorizHelpline(m_view->zoomHandler()->unzoomItY(e->pos().y()+diffy())); m_tmpVertHelpline = m_view->kPresenterDoc()->indexOfVertHelpline(m_view->zoomHandler()->unzoomItX(e->pos().x()+diffx())); m_tmpHelpPoint = m_view->kPresenterDoc()->indexOfHelpPoint( KoPoint(m_view->zoomHandler()->unzoomItX(e->pos().x()+diffx()), m_view->zoomHandler()->unzoomItX(e->pos().y()+diffy())) ); if (m_tmpVertHelpline != -1 || m_tmpHorizHelpline != -1) { m_view->openPopupMenuHelpLine( pnt ); } else if( m_tmpHelpPoint != -1 ) m_view->openPopupMenuHelpPoint( pnt ); else m_view->openPopupMenuMenuPage( pnt ); } else m_view->openPopupMenuMenuPage( pnt ); mousePressed = false; } modType = MT_NONE; } else if( e->button() == RightButton && toolEditMode == TEM_ZOOM ) { QPoint pnt = QCursor::pos(); mousePressed = false; m_view->openPopupMenuZoom( pnt ); } else if( e->button() == RightButton && toolEditMode != TEM_MOUSE ) { //deactivate tools when you click on right button setToolEditMode( TEM_MOUSE ); } } else { oldMx = e->x(); oldMy = e->y(); if ( e->button() == LeftButton ) { if ( presMenu->isVisible() ) { presMenu->hide(); setCursor( blankCursor ); } else { if ( drawMode ) { setCursor( KPresenterUtils::penCursor() ); drawLineInDrawMode = true; } else m_view->screenNext(); } } else if ( e->button() == MidButton ) m_view->screenPrev(); else if ( e->button() == RightButton ) { if ( !drawMode && !spManualSwitch() ) m_view->autoScreenPresStopTimer(); setCursor( arrowCursor ); QPoint pnt = QCursor::pos(); presMenu->popup( pnt ); } } #if 0 // Where do you need this ? (toshitaka) // ME: I have no idea why this is needed at all if ( toolEditMode == TEM_MOUSE ) mouseMoveEvent( e ); #endif if ( modType != MT_NONE && modType != MT_MOVE ) { KPObject *kpobject=resizeObjNum; if ( kpobject ) { ratio = static_cast( kpobject->getSize().width() ) / static_cast( kpobject->getSize().height() ); resizeRect = kpobject->getRect(); } } } void KPrCanvas::calcBoundingRect() { m_boundingRect = KoRect(); m_boundingRect=m_activePage->getBoundingRect(m_boundingRect); m_boundingRect=stickyPage()->getBoundingRect(m_boundingRect); m_origBRect = m_boundingRect; } KoRect KPrCanvas::objectSelectedBoundingRect() const { KoRect objBoundingRect=KoRect(); objBoundingRect = m_activePage->getBoundingRect( objBoundingRect); objBoundingRect = stickyPage()->getBoundingRect( objBoundingRect); return objBoundingRect; } KoRect KPrCanvas::getAlignBoundingRect() const { KoRect boundingRect; for ( int i = 0; i < 2; ++i ) { QPtrListIterator it( i == 0 ? activePage()->objectList() : stickyPage()->objectList() ); for ( ; it.current() ; ++it ) { if ( it.current() == m_view->kPresenterDoc()->header() || it.current() == m_view->kPresenterDoc()->footer() ) continue; if( it.current()->isSelected() && !it.current()->isProtect() ) { boundingRect |= it.current()->getRealRect(); } } } return boundingRect; } void KPrCanvas::mouseReleaseEvent( QMouseEvent *e ) { QPoint contentsPoint( e->pos().x()+diffx(), e->pos().y()+diffy() ); if(m_currentTextObjectView) { m_currentTextObjectView->mouseReleaseEvent( e, contentsPoint ); emit objectSelectedChanged(); mousePressed=false; return; } if ( e->button() != LeftButton ) { ratio = 0.0; keepRatio = false; return; } if ( drawMode ) { drawLineInDrawMode = false; return; } bool state = m_view->kPresenterDoc()->snapToGrid(); int mx = state ? applyGridOnPosX( contentsPoint.x()) : contentsPoint.x(); int my = state ? applyGridOnPosY( contentsPoint.y()) : contentsPoint.y(); firstX = state ? applyGridOnPosX( firstX) : firstX; firstY = state ? applyGridOnPosY( firstY) : firstY; QPtrList _objects; _objects.setAutoDelete( false ); KPObject *kpobject = 0; if ( ( m_drawPolyline && ( toolEditMode == INS_POLYLINE || toolEditMode == INS_CLOSED_POLYLINE ) ) || ( m_drawCubicBezierCurve && ( toolEditMode == INS_CUBICBEZIERCURVE || toolEditMode == INS_QUADRICBEZIERCURVE || toolEditMode == INS_CLOSED_CUBICBEZIERCURVE || toolEditMode == INS_CLOSED_QUADRICBEZIERCURVE ) ) ) { return; } if ( toolEditMode != INS_LINE ) insRect = insRect.normalize(); KoPoint mv; KoSize sz; if ( toolEditMode == TEM_MOUSE && modType != MT_NONE && modType != MT_MOVE && resizeObjNum ) { kpobject = resizeObjNum; if ( kpobject ) { mv = KoPoint( kpobject->getOrig().x() - resizeRect.x(), kpobject->getOrig().y() - resizeRect.y() ); sz = KoSize( kpobject->getSize().width() - resizeRect.width(), kpobject->getSize().height() - resizeRect.height() ); } kpobject = 0L; } switch ( toolEditMode ) { case TEM_MOUSE: { drawContour = FALSE; switch ( modType ) { case MT_NONE: { if ( drawRubber ) { QPainter p; p.begin( this ); p.setRasterOp( NotROP ); p.setPen( QPen( black, 0, DotLine ) ); p.drawRect( rubber ); p.end(); drawRubber = false; rubber = rubber.normalize(); rubber.moveBy(diffx(),diffy()); QPtrListIterator it( getObjectList() ); for ( ; it.current() ; ++it ) { if ( it.current()->intersects( m_view->zoomHandler()->unzoomRect(rubber) ) ) selectObj( it.current() ); } QPtrListIterator sIt(stickyPage()->objectList() ); for ( ; sIt.current() ; ++sIt ) { if ( sIt.current()->intersects( m_view->zoomHandler()->unzoomRect(rubber) ) ) { if( m_view->kPresenterDoc()->isHeaderFooter(sIt.current())) { if( objectIsAHeaderFooterHidden(sIt.current())) continue; } selectObj( sIt.current() ); } } } if ( m_tmpVertHelpline != -1 || m_tmpHorizHelpline != -1) moveHelpLine( e->pos() ); else if ( m_tmpHelpPoint != -1 ) moveHelpPoint( e->pos() ); } break; case MT_MOVE: { if ( firstX != mx || firstY != my ) { KMacroCommand *macro=0L; KoPoint move( objectSelectedBoundingRect().topLeft() - moveStartPosMouse ); KCommand *cmd=m_activePage->moveObject(m_view, move.x(), move.y()); if(cmd) { if ( !macro ) macro=new KMacroCommand(i18n("Move Objects")); macro->addCommand(cmd); } cmd=stickyPage()->moveObject(m_view, move.x(), move.y()); if(cmd) { if ( !macro ) macro=new KMacroCommand(i18n("Move Objects")); macro->addCommand(cmd); } if(macro) m_view->kPresenterDoc()->addCommand(macro ); } else { stickyPage()->repaintObj(); m_activePage->repaintObj(); } } break; case MT_RESIZE_UP: { if ( !resizeObjNum ) break; kpobject = resizeObjNum; if ( firstX != mx || firstY != my ) { ResizeCmd *resizeCmd = new ResizeCmd( i18n( "Resize Object Up" ), mv, sz, kpobject, m_view->kPresenterDoc() ); resizeCmd->unexecute( false ); resizeCmd->execute(); m_view->kPresenterDoc()->addCommand( resizeCmd ); } _repaint( oldBoundingRect ); m_view->kPresenterDoc()->layout(kpobject); _repaint( kpobject ); } break; case MT_RESIZE_DN: { if ( !resizeObjNum ) break; kpobject = resizeObjNum; if ( firstX != mx || firstY != my ) { ResizeCmd *resizeCmd = new ResizeCmd( i18n( "Resize Object Down" ), mv, sz, kpobject, m_view->kPresenterDoc() ); resizeCmd->unexecute( false ); resizeCmd->execute(); m_view->kPresenterDoc()->addCommand( resizeCmd ); } _repaint( oldBoundingRect ); _repaint( kpobject ); } break; case MT_RESIZE_LF: { if ( !resizeObjNum ) break; kpobject = resizeObjNum; if ( firstX != mx || firstY != my ) { ResizeCmd *resizeCmd = new ResizeCmd( i18n( "Resize Object Left" ), mv, sz, kpobject, m_view->kPresenterDoc() ); resizeCmd->unexecute( false ); resizeCmd->execute(); m_view->kPresenterDoc()->addCommand( resizeCmd ); } _repaint( oldBoundingRect ); m_view->kPresenterDoc()->layout(kpobject); _repaint( kpobject ); } break; case MT_RESIZE_RT: { if ( !resizeObjNum ) break; kpobject = resizeObjNum ; if ( firstX != mx || firstY != my ) { ResizeCmd *resizeCmd = new ResizeCmd( i18n( "Resize Object Right" ), mv, sz, kpobject, m_view->kPresenterDoc() ); resizeCmd->unexecute( false ); resizeCmd->execute(); m_view->kPresenterDoc()->addCommand( resizeCmd ); } _repaint( oldBoundingRect ); m_view->kPresenterDoc()->layout(kpobject); _repaint( kpobject ); } break; case MT_RESIZE_LU: { if ( !resizeObjNum ) break; kpobject = resizeObjNum; if ( firstX != mx || firstY != my ) { ResizeCmd *resizeCmd = new ResizeCmd( i18n( "Resize Object Left && Up" ), mv, sz, kpobject, m_view->kPresenterDoc() ); resizeCmd->unexecute( false ); resizeCmd->execute(); m_view->kPresenterDoc()->addCommand( resizeCmd ); } _repaint( oldBoundingRect ); m_view->kPresenterDoc()->layout(kpobject); _repaint( kpobject ); } break; case MT_RESIZE_LD: { if ( !resizeObjNum ) break; kpobject = resizeObjNum; if ( firstX != mx || firstY != my ) { ResizeCmd *resizeCmd = new ResizeCmd( i18n( "Resize Object Left && Down" ), mv, sz, kpobject, m_view->kPresenterDoc() ); resizeCmd->unexecute( false ); resizeCmd->execute(); m_view->kPresenterDoc()->addCommand( resizeCmd ); } _repaint( oldBoundingRect ); m_view->kPresenterDoc()->layout(kpobject); _repaint( kpobject ); } break; case MT_RESIZE_RU: { if ( !resizeObjNum ) break; kpobject = resizeObjNum; if ( firstX != mx || firstY != my ) { ResizeCmd *resizeCmd = new ResizeCmd( i18n( "Resize Object Right && Up" ), mv, sz, kpobject, m_view->kPresenterDoc() ); resizeCmd->unexecute( false ); resizeCmd->execute(); m_view->kPresenterDoc()->addCommand( resizeCmd ); } _repaint( oldBoundingRect ); m_view->kPresenterDoc()->layout(kpobject); _repaint( kpobject ); } break; case MT_RESIZE_RD: { if ( !resizeObjNum ) break; kpobject = resizeObjNum; if ( firstX != mx || firstY != my ) { ResizeCmd *resizeCmd = new ResizeCmd( i18n( "Resize Object Right && Down" ), mv, sz, kpobject, m_view->kPresenterDoc() ); resizeCmd->unexecute( false ); resizeCmd->execute(); m_view->kPresenterDoc()->addCommand( resizeCmd ); } _repaint( oldBoundingRect ); m_view->kPresenterDoc()->layout(kpobject); _repaint( kpobject ); } break; } } break; case INS_TEXT: { if ( !insRect.isNull() ) { rectSymetricalObjet(); KPTextObject* kptextobject = insertTextObject( insRect ); setToolEditMode( TEM_MOUSE ); // User-friendlyness: automatically start editing this textobject activePage()->deSelectAllObj(); stickyPage()->deSelectAllObj(); createEditing( kptextobject ); //setTextBackground( kptextobject ); //setCursor( arrowCursor ); } } break; case TEM_ZOOM:{ drawContour = FALSE; if( modType == MT_NONE && drawRubber ) { QPainter p; p.begin( this ); p.setRasterOp( NotROP ); p.setPen( QPen( black, 0, DotLine ) ); p.drawRect( rubber ); p.end(); drawRubber = false; rubber = rubber.normalize(); rubber.moveBy(diffx(),diffy()); m_view->setZoomRect(rubber, m_zoomRubberDraw ); m_zoomRubberDraw = false; } }break; case TEM_ROTATE: { drawContour = FALSE; if ( !rotateNum ) break; if ( startAngle != rotateNum->getAngle() ) { QPtrList list; RotateCmd::RotateValues *v = new RotateCmd::RotateValues; v->angle = startAngle; list.append( v ); QPtrList objects; objects.append( rotateNum ); RotateCmd *rotateCmd = new RotateCmd( i18n( "Change Rotation" ), list, rotateNum->getAngle(), objects, m_view->kPresenterDoc() ); m_view->kPresenterDoc()->addCommand( rotateCmd ); } }break; case INS_LINE: { if ( insRect.width() != 0 && insRect.height() != 0 ) { rectSymetricalObjet(); if ( insRect.top() == insRect.bottom() ) { bool reverse = insRect.left() > insRect.right(); insRect = insRect.normalize(); insRect.setRect( insRect.left(), insRect.top() - static_cast(m_view->zoomHandler()->zoomItY(m_view->kPresenterDoc()->getGridY()) / 2), insRect.width(), m_view->zoomHandler()->zoomItY(m_view->kPresenterDoc()->getGridY()) ); insertLineH( insRect, reverse ); } else if ( insRect.left() == insRect.right() ) { bool reverse = insRect.top() > insRect.bottom(); insRect = insRect.normalize(); insRect.setRect( insRect.left() - static_cast(m_view->zoomHandler()->zoomItX(m_view->kPresenterDoc()->getGridX()) / 2), insRect.top(), m_view->zoomHandler()->zoomItX(m_view->kPresenterDoc()->getGridX()), insRect.height() ); insertLineV( insRect, reverse ); } else if ( insRect.left() < insRect.right() && insRect.top() < insRect.bottom() || insRect.left() > insRect.right() && insRect.top() > insRect.bottom() ) { bool reverse = insRect.left() > insRect.right() && insRect.top() > insRect.bottom(); insertLineD1( insRect.normalize(), reverse ); } else { bool reverse = insRect.right() < insRect.left() && insRect.top() < insRect.bottom(); insertLineD2( insRect.normalize(), reverse ); } } } break; case INS_RECT: if ( !insRect.isNull() ) { rectSymetricalObjet(); insertRect( insRect ); } break; case INS_ELLIPSE: if ( !insRect.isNull() ) { rectSymetricalObjet(); insertEllipse( insRect ); } break; case INS_PIE: if ( !insRect.isNull() ) { rectSymetricalObjet(); insertPie( insRect ); } break; case INS_OBJECT: case INS_DIAGRAMM: case INS_TABLE: case INS_FORMULA: { if ( !insRect.isNull() ) { rectSymetricalObjet(); KPPartObject *kpPartObject = insertObject( insRect ); setToolEditMode( TEM_MOUSE ); activePage()->deSelectAllObj(); stickyPage()->deSelectAllObj(); if ( kpPartObject ) { kpPartObject->activate( m_view ); editNum = kpPartObject; } } } break; case INS_AUTOFORM: { bool reverse = insRect.left() > insRect.right() || insRect.top() > insRect.bottom(); if ( !insRect.isNull() ) { rectSymetricalObjet(); insertAutoform( insRect, reverse ); } setToolEditMode( TEM_MOUSE ); } break; case INS_FREEHAND: if ( !m_pointArray.isNull() ) insertFreehand( m_pointArray ); break; case INS_POLYGON: if ( !m_pointArray.isNull() ) insertPolygon( m_pointArray ); break; case INS_PICTURE: case INS_CLIPART: { if ( insRect.width() > 10 && insRect.height() > 10 ) insertPicture( insRect ); else insertPicture( QRect(), insRect.topLeft() ); // use the default size setToolEditMode( TEM_MOUSE ); } break; case INS_CLOSED_FREEHAND: { if ( !m_pointArray.isNull() ) insertClosedLine( m_pointArray ); }break; default: break; } emit objectSelectedChanged(); if ( toolEditMode != TEM_MOUSE && editMode ) repaint( false ); mousePressed = false; modType = MT_NONE; resizeObjNum = 0L; mouseMoveEvent( e ); ratio = 0.0; keepRatio = false; calcBoundingRect(); } void KPrCanvas::mouseMoveEvent( QMouseEvent *e ) { QPoint contentsPoint( e->pos().x()+diffx(), e->pos().y()+diffy() ); KoPoint docPoint = m_view->zoomHandler()->unzoomPoint( contentsPoint ); if(m_currentTextObjectView) { KPTextObject *txtObj=m_currentTextObjectView->kpTextObject(); Q_ASSERT(txtObj); if(txtObj->contains( docPoint )&&mousePressed) { KoPoint pos = docPoint - txtObj->innerRect().topLeft(); m_currentTextObjectView->mouseMoveEvent( e, m_view->zoomHandler()->ptToLayoutUnitPix( pos ) ); // in LU pixels } return; } if ( editMode ) { m_view->setRulerMousePos( e->x(), e->y() ); KPObject *kpobject; if ( ( !mousePressed || ( m_tmpHorizHelpline !=-1 && m_tmpVertHelpline != -1 && modType == MT_NONE ) )&& ( !mousePressed || ( !drawRubber && modType == MT_NONE ) ) && toolEditMode == TEM_MOUSE ) { bool cursorAlreadySet = false; if ( (int)objectList().count() - 1 >= 0 || (int)stickyPage()->objectList().count() -1>=0 ) { kpobject=m_activePage->getCursor(docPoint); if( kpobject) { setCursor( kpobject->getCursor( docPoint, modType,m_view->kPresenterDoc()) ); cursorAlreadySet = true; } else { kpobject=stickyPage()->getCursor(docPoint ); if( kpobject) { setCursor( kpobject->getCursor( docPoint, modType,m_view->kPresenterDoc() ) ); cursorAlreadySet = true; } } } if( editMode && m_view->kPresenterDoc()->showHelplines()) { if( m_view->kPresenterDoc()->indexOfHorizHelpline(m_view->zoomHandler()->unzoomItY(e->pos().y()+diffy()))!=-1) { setCursor ( Qt::sizeVerCursor ); cursorAlreadySet = true; } else if ( m_view->kPresenterDoc()->indexOfVertHelpline(m_view->zoomHandler()->unzoomItX(e->pos().x()+diffx()))!=-1) { setCursor ( Qt::sizeHorCursor ); cursorAlreadySet = true; } else if ( m_view->kPresenterDoc()->indexOfHelpPoint(KoPoint( m_view->zoomHandler()->unzoomItX(e->pos().x()+diffx()), m_view->zoomHandler()->unzoomItY(e->pos().y()+diffy())))!=-1) { setCursor ( Qt::SizeAllCursor ); cursorAlreadySet = true; } } if ( !cursorAlreadySet ) setCursor( arrowCursor ); else return; } else if ( mousePressed ) { switch ( toolEditMode ) { case TEM_MOUSE: { drawContour = TRUE; if ( modType == MT_NONE ) { if ( m_tmpVertHelpline !=-1 || m_tmpHorizHelpline !=-1) { tmpMoveHelpLine( e->pos() ); } else if ( m_tmpHelpPoint != -1 ) { tmpDrawMoveHelpPoint( e->pos() ); } else if ( drawRubber ) { QPainter p; p.begin( this ); p.setRasterOp( NotROP ); p.setPen( QPen( black, 0, DotLine ) ); p.drawRect( rubber ); rubber.setRight( e->x() ); rubber.setBottom( e->y() ); p.drawRect( rubber ); p.end(); } } else if ( modType == MT_MOVE ) { m_hotSpot = docPoint - m_boundingRect.topLeft(); int x = e->x() + diffx(); int y = e->y() + diffy(); moveObject( x - m_origPos.x(), y - m_origPos.y(), false ); } else if ( modType != MT_NONE && resizeObjNum ) { int mx = e->x()+diffx(); int my = e->y()+diffy(); if ( m_view->kPresenterDoc()->snapToGrid() ) { mx = applyGridOnPosX( mx ); my = applyGridOnPosY( my ); oldMx = applyGridOnPosX( oldMx ); oldMy = applyGridOnPosY( oldMy ); } resizeObject( modType, mx - oldMx, my - oldMy ); oldMx = e->x()+diffx(); oldMy = e->y()+diffy(); } } break; case TEM_ZOOM : { if ( drawRubber ) { QPainter p; p.begin( this ); p.setRasterOp( NotROP ); p.setPen( QPen( black, 0, DotLine ) ); p.drawRect( rubber ); rubber.setRight( e->x() ); rubber.setBottom( e->y() ); p.drawRect( rubber ); p.end(); m_zoomRubberDraw = true; } }break; case TEM_ROTATE: { drawContour = TRUE; double angle = KoPoint::getAngle( KoPoint( e->x() + diffx(), e->y() + diffy() ), KoPoint( axisX, axisY ) ); double angle1 = KoPoint::getAngle( KoPoint( firstX, firstY ), KoPoint( axisX, axisY ) ); angle -= angle1; angle -= startAngle; if ( angle < 0 ) angle += 360; else if ( angle > 360 ) angle -= 360; activePage()->rotateObj( angle ); stickyPage()->rotateObj( angle ); }break; case INS_TEXT: case INS_OBJECT: case INS_TABLE: case INS_DIAGRAMM: case INS_FORMULA: case INS_AUTOFORM: case INS_PICTURE: case INS_CLIPART: { QPainter p( this ); p.setPen( QPen( black, 1, SolidLine ) ); p.setBrush( NoBrush ); p.setRasterOp( NotROP ); if ( insRect.width() != 0 && insRect.height() != 0 ) { if ( !m_drawSymetricObject) p.drawRect( insRect ); else { QRect tmpRect( insRect ); tmpRect.moveBy( -insRect.width(), -insRect.height()); tmpRect.setSize( 2*insRect.size() ); p.drawRect( tmpRect ); } } QPoint tmp = applyGrid( e->pos(), true); insRect.setRight( tmp.x() ); insRect.setBottom( tmp.y() ); limitSizeOfObject(); QRect tmpRect( insRect ); if ( e->state() & AltButton ) { m_drawSymetricObject = true; tmpRect.moveBy( -insRect.width(), -insRect.height()); tmpRect.setSize( 2*insRect.size() ); } else m_drawSymetricObject = false; p.drawRect( tmpRect ); p.end(); mouseSelectedObject = true; m_view->penColorChanged( m_view->getPen() ); m_view->brushColorChanged( m_view->getBrush() ); } break; case INS_ELLIPSE: { QPainter p( this ); p.setPen( QPen( black, 1, SolidLine ) ); p.setBrush( NoBrush ); p.setRasterOp( NotROP ); if ( insRect.width() != 0 && insRect.height() != 0 ) { if ( !m_drawSymetricObject) p.drawEllipse( insRect ); else { QRect tmpRect( insRect ); tmpRect.moveBy( -insRect.width(), -insRect.height()); tmpRect.setSize( 2*insRect.size() ); p.drawEllipse( tmpRect ); } } QPoint tmp = applyGrid( e->pos(), true); insRect.setRight( tmp.x() ); insRect.setBottom( tmp.y() ); limitSizeOfObject(); QRect tmpRect( insRect ); if ( e->state() & AltButton ) { m_drawSymetricObject = true; tmpRect.moveBy( -insRect.width(), -insRect.height()); tmpRect.setSize( 2*insRect.size() ); } else m_drawSymetricObject = false; p.drawEllipse( tmpRect ); p.end(); mouseSelectedObject = true; m_view->penColorChanged( m_view->getPen() ); m_view->brushColorChanged( m_view->getBrush() ); } break; case INS_RECT: { QPainter p( this ); p.setPen( QPen( black, 1, SolidLine ) ); p.setBrush( NoBrush ); p.setRasterOp( NotROP ); if ( insRect.width() != 0 && insRect.height() != 0 ) { if ( !m_drawSymetricObject) p.drawRoundRect( insRect, m_view->getRndX(), m_view->getRndY() ); else { QRect tmpRect( insRect ); tmpRect.moveBy( -insRect.width(), -insRect.height()); tmpRect.setSize( 2*insRect.size() ); p.drawRoundRect( tmpRect, m_view->getRndX(), m_view->getRndY() ); } } QPoint tmp = applyGrid( e->pos(), true); insRect.setRight( tmp.x() ); insRect.setBottom( tmp.y() ); limitSizeOfObject(); QRect tmpRect( insRect ); if ( e->state() & AltButton ) { m_drawSymetricObject = true; tmpRect.moveBy( -insRect.width(), -insRect.height()); tmpRect.setSize( 2*insRect.size() ); } else m_drawSymetricObject = false; p.drawRoundRect( tmpRect, m_view->getRndX(), m_view->getRndY() ); p.end(); mouseSelectedObject = true; m_view->penColorChanged( m_view->getPen() ); m_view->brushColorChanged( m_view->getBrush() ); } break; case INS_LINE: { QPainter p( this ); p.setPen( QPen( black, 1, SolidLine ) ); p.setBrush( NoBrush ); p.setRasterOp( NotROP ); if ( insRect.width() != 0 && insRect.height() != 0 ) { if ( !m_drawSymetricObject) p.drawLine( insRect.topLeft(), insRect.bottomRight() ); else { QRect tmpRect( insRect ); tmpRect.moveBy( -insRect.width(), -insRect.height()); tmpRect.setSize( 2*insRect.size() ); p.drawLine( tmpRect.topLeft(), tmpRect.bottomRight() ); } } QPoint tmp = applyGrid( e->pos(), true); int right = tmp.x(); int bottom = tmp.y(); if ( e->state() & ShiftButton ) { int witdh = QABS( right -insRect.left() ); int height = QABS( bottom - insRect.top() ); if ( witdh > height ) bottom = insRect.top(); else if ( witdh < height ) right = insRect.left(); } insRect.setRight( right ); insRect.setBottom( bottom ); limitSizeOfObject(); QRect lineRect( insRect ); if ( e->state() & AltButton ) { m_drawSymetricObject = true; lineRect.moveBy( -insRect.width(), -insRect.height()); lineRect.setSize( 2*insRect.size() ); } else m_drawSymetricObject = false; p.drawLine( lineRect.topLeft(), lineRect.bottomRight() ); p.end(); mouseSelectedObject = true; m_view->penColorChanged( m_view->getPen() ); m_view->brushColorChanged( m_view->getBrush() ); } break; case INS_PIE: { QPainter p( this ); p.setPen( QPen( black, 1, SolidLine ) ); p.setBrush( NoBrush ); p.setRasterOp( NotROP ); if ( insRect.width() != 0 && insRect.height() != 0 ) { if ( !m_drawSymetricObject) drawPieObject(&p, insRect); else { QRect tmpRect( insRect ); tmpRect.moveBy( -insRect.width(), -insRect.height()); tmpRect.setSize( 2*insRect.size() ); drawPieObject(&p, tmpRect); } } QPoint tmp = applyGrid( e->pos(), true); insRect.setRight( tmp.x()); insRect.setBottom( tmp.y()); limitSizeOfObject(); QRect lineRect( insRect ); if ( e->state() & AltButton ) { m_drawSymetricObject = true; lineRect.moveBy( -insRect.width(), -insRect.height()); lineRect.setSize( 2*insRect.size() ); } else m_drawSymetricObject = false; drawPieObject(&p, lineRect); p.end(); mouseSelectedObject = true; m_view->penColorChanged( m_view->getPen() ); m_view->brushColorChanged( m_view->getBrush() ); } break; case INS_FREEHAND: case INS_CLOSED_FREEHAND: { m_dragEndPoint = QPoint( e->x() , e->y() ); QPainter p( this ); p.setPen( QPen( black, 1, SolidLine ) ); p.setBrush( NoBrush ); p.setRasterOp( NotROP ); m_dragEndPoint=limitOfPoint(m_dragEndPoint); p.drawLine( m_dragStartPoint, m_dragEndPoint ); p.end(); m_pointArray.putPoints( m_indexPointArray, 1, m_view->zoomHandler()->unzoomItX(m_dragStartPoint.x()), m_view->zoomHandler()->unzoomItY(m_dragStartPoint.y()) ); ++m_indexPointArray; m_dragStartPoint = m_dragEndPoint; mouseSelectedObject = true; m_view->penColorChanged( m_view->getPen() ); m_view->brushColorChanged( m_view->getBrush() ); } break; case INS_POLYLINE: case INS_CLOSED_POLYLINE: { QPainter p( this ); p.setPen( QPen( black, 1, SolidLine ) ); p.setBrush( NoBrush ); p.setRasterOp( NotROP ); p.drawLine( m_dragStartPoint, m_dragEndPoint ); // QPoint tmp = applyGrid( e->pos(), true); int posX = tmp.x(); int posY = tmp.y(); if ( e->state() & ShiftButton ) { int witdh = QABS( posX -m_dragStartPoint.x() ); int height = QABS( posY - m_dragStartPoint.y() ); if ( witdh > height ) posY = m_dragStartPoint.y(); else if ( witdh < height ) posX = m_dragStartPoint.x(); } m_dragEndPoint = QPoint( posX, posY); m_dragEndPoint=limitOfPoint(m_dragEndPoint); p.drawLine( m_dragStartPoint, m_dragEndPoint ); p.end(); mouseSelectedObject = true; m_view->penColorChanged( m_view->getPen() ); m_view->brushColorChanged( m_view->getBrush() ); } break; case INS_CUBICBEZIERCURVE: case INS_QUADRICBEZIERCURVE: case INS_CLOSED_CUBICBEZIERCURVE: case INS_CLOSED_QUADRICBEZIERCURVE:{ QPoint tmp = applyGrid( e->pos(), true); drawCubicBezierCurve( tmp.x(), tmp.y()); mouseSelectedObject = true; m_view->penColorChanged( m_view->getPen() ); m_view->brushColorChanged( m_view->getBrush() ); } break; case INS_POLYGON: { drawPolygon( m_view->zoomHandler()->unzoomPoint( m_dragStartPoint ), m_view->zoomHandler()->unzoomPoint( m_dragEndPoint ) ); // erase old polygon QPoint tmp = applyGrid( e->pos(), true); m_dragEndPoint = QPoint( tmp.x(), tmp.y() ); m_dragEndPoint=limitOfPoint(m_dragEndPoint); drawPolygon( m_view->zoomHandler()->unzoomPoint( m_dragStartPoint ), m_view->zoomHandler()->unzoomPoint( m_dragEndPoint ) ); // draw new polygon mouseSelectedObject = true; m_view->penColorChanged( m_view->getPen() ); m_view->brushColorChanged( m_view->getBrush() ); } break; default: break; } } } else if ( !editMode && drawMode && drawLineInDrawMode ) { QPainter p; p.begin( this ); p.setPen( m_view->kPresenterDoc()->presPen() ); p.drawLine( oldMx, oldMy, e->x(), e->y() ); oldMx = e->x(); oldMy = e->y(); p.end(); } if ( !editMode && !drawMode && !presMenu->isVisible() && fillBlack ) setCursor( blankCursor ); } void KPrCanvas::mouseDoubleClickEvent( QMouseEvent *e ) { if(!m_view->koDocument()->isReadWrite()) return; QPoint contentsPoint( e->pos().x()+diffx(), e->pos().y()+diffy() ); KoPoint docPoint = m_view->zoomHandler()->unzoomPoint( contentsPoint ); if(m_currentTextObjectView) { KPTextObject *txtObj=m_currentTextObjectView->kpTextObject(); Q_ASSERT(txtObj); if(txtObj->contains( docPoint )) { KoPoint pos = contentsPoint - txtObj->getOrig(); //pos=m_view->zoomHandler()->pixelToLayoutUnit(QPoint(pos.x(),pos.y())); m_currentTextObjectView->mouseDoubleClickEvent( e, m_view->zoomHandler()->ptToLayoutUnitPix( pos ) ); return; } } //disallow activating objects outside the "page" if ( !m_activePage->getPageRect().contains(docPoint,m_view->zoomHandler())) return; if ( ( toolEditMode == INS_POLYLINE || toolEditMode == INS_CLOSED_POLYLINE ) && !m_pointArray.isNull() && m_drawPolyline ) { m_dragStartPoint = applyGrid( e->pos(), true); m_pointArray.putPoints( m_indexPointArray, 1, m_view->zoomHandler()->unzoomItX(m_dragStartPoint.x()), m_view->zoomHandler()->unzoomItY(m_dragStartPoint.y() )); ++m_indexPointArray; endDrawPolyline(); mouseMoveEvent( e ); return; } if ( toolEditMode != TEM_MOUSE || !editMode ) return; deSelectAllObj(); KPObject *kpobject = 0; kpobject=m_activePage->getObjectAt(docPoint); if( !kpobject) { kpobject=stickyPage()->getObjectAt(docPoint ); if( kpobject && m_view->kPresenterDoc()->isHeaderFooter(kpobject)) { if( objectIsAHeaderFooterHidden(kpobject)) kpobject=0L; } } if(kpobject) { if ( kpobject->getType() == OT_TEXT ) { KPTextObject *kptextobject = dynamic_cast( kpobject ); if(kptextobject && (!kptextobject->isProtectContent() || kptextobject->isProtectContent() && m_view->kPresenterDoc()->cursorInProtectedArea())) { if(m_currentTextObjectView) { m_currentTextObjectView->terminate(); delete m_currentTextObjectView; } m_currentTextObjectView=kptextobject->createKPTextView(this); //setTextBackground( kptextobject ); setCursor( arrowCursor ); editNum = kpobject; } } else if ( kpobject->getType() == OT_PART ) { KPPartObject * obj=dynamic_cast(kpobject); if(obj) { obj->activate( m_view ); editNum = obj; } } } } void KPrCanvas::drawPieObject(QPainter *p, const QRect & rect) { switch ( m_view->getPieType() ) { case PT_PIE: p->drawPie( rect.x(), rect.y(), rect.width() - 2, rect.height() - 2, m_view->getPieAngle(), m_view->getPieLength() ); break; case PT_ARC: p->drawArc( rect.x(), insRect.y(), rect.width() - 2, rect.height() - 2, m_view->getPieAngle(), m_view->getPieLength() ); break; case PT_CHORD: p->drawChord( rect.x(), rect.y(), rect.width() - 2, rect.height() - 2, m_view->getPieAngle(), m_view->getPieLength() ); break; default: break; } } void KPrCanvas::limitSizeOfObject() { QRect pageRect=m_activePage->getZoomPageRect(); if(insRect.right()>pageRect.right()-1) insRect.setRight(pageRect.width()-1); else if( insRect.right()pageRect.bottom()-1) insRect.setBottom(pageRect.height()-1); else if( insRect.bottom()getZoomPageRect(); QPoint point(_point); if(point.x()>pageRect.right()-1) point.setX(pageRect.width()-1); else if( point.x()pageRect.bottom()-1) point.setY(pageRect.height()-1); else if( point.y()delta() == -120 ) // wheel down m_view->screenNext(); else if ( e->delta() == 120 ) // wheel up m_view->screenPrev(); e->accept(); } else if ( editMode ) emit sigMouseWheelEvent( e ); } void KPrCanvas::keyPressEvent( QKeyEvent *e ) { if ( !editMode ) { switch ( e->key() ) { case Key_Space: case Key_Right: case Key_Down: case Key_Next: m_view->screenNext(); break; case Key_Backspace: case Key_Left: case Key_Up: case Key_Prior: m_view->screenPrev(); break; case Key_Escape: case Key_Q: case Key_X: m_view->screenStop(); break; case Key_G: if ( !spManualSwitch() ) m_view->autoScreenPresStopTimer(); slotGotoPage(); break; case Key_Home: // go to first page if ( slideListIterator != slideList.begin() ) { - gotoPage( *slideList.begin() ); + presGotoFirstPage(); if ( !spManualSwitch() ) { m_view->setCurrentTimer( 1 ); setNextPageTimer( true ); } } break; case Key_End: // go to last page if ( slideListIterator != slideList.end() ) { gotoPage( *(--slideList.end()) ); if ( !spManualSwitch() ) { m_view->setCurrentTimer( 1 ); setNextPageTimer( true ); } } break; default: break; } } else if ( editNum ) { if ( e->key() == Key_Escape ) { exitEditMode(); } else if ( m_currentTextObjectView ) { if ( !m_currentTextObjectView->kpTextObject()->isProtectContent() || (e->text().length() == 0)) m_currentTextObjectView->keyPressEvent( e ); else KMessageBox::information(this, i18n("Read-only content cannot be changed. No modifications will be accepted.")); } } else if ( mouseSelectedObject ) { m_hotSpot = KoPoint(0,0); if ( e->state() & ControlButton ) { int offsetx, offsety; if( !m_view->kPresenterDoc()->snapToGrid() ) { offsetx = QMAX(1,m_view->zoomHandler()->zoomItX(10)); offsety = QMAX(1,m_view->zoomHandler()->zoomItY(10)); } else { offsetx = QMAX(1,m_view->zoomHandler()->zoomItX(m_view->kPresenterDoc()->getGridX())); offsety = QMAX(1,m_view->zoomHandler()->zoomItY(m_view->kPresenterDoc()->getGridY())); } if ( !m_keyPressEvent ) { moveStartPosKey = m_boundingRect.topLeft(); } switch ( e->key() ) { case Key_Up: m_keyPressEvent = true; moveObject( 0, -offsety, false ); m_origBRect = m_boundingRect; break; case Key_Down: m_keyPressEvent = true; moveObject( 0, offsety, false ); m_origBRect = m_boundingRect; break; case Key_Right: m_keyPressEvent = true; moveObject( offsetx, 0, false ); m_origBRect = m_boundingRect; break; case Key_Left: m_keyPressEvent = true; moveObject( -offsetx, 0, false ); m_origBRect = m_boundingRect; break; default: break; } } else { int offsetx, offsety; if( !m_view->kPresenterDoc()->snapToGrid() ) { offsetx = 1; offsety = 1; } else { offsetx = QMAX(1,m_view->zoomHandler()->zoomItX(m_view->kPresenterDoc()->getGridX())); offsety = QMAX(1,m_view->zoomHandler()->zoomItY(m_view->kPresenterDoc()->getGridY())); } if ( !m_keyPressEvent ) { moveStartPosKey = m_boundingRect.topLeft(); } switch ( e->key() ) { case Key_Up: m_keyPressEvent = true; moveObject( 0, -offsety, false ); m_origBRect = m_boundingRect; break; case Key_Down: m_keyPressEvent = true; moveObject( 0, offsety, false ); m_origBRect = m_boundingRect; break; case Key_Right: m_keyPressEvent = true; moveObject( offsetx, 0, false ); m_origBRect = m_boundingRect; break; case Key_Left: m_keyPressEvent = true; moveObject( -offsetx, 0, false ); m_origBRect = m_boundingRect; break; case Key_Delete: case Key_Backspace: m_view->editDelete(); break; case Key_Escape: setToolEditMode( TEM_MOUSE ); break; default: break; } } } else { switch ( e->key() ) { case Key_Next: m_view->nextPage(); break; case Key_Prior: m_view->prevPage(); break; case Key_Down: m_view->getVScrollBar()->addLine(); break; case Key_Up: m_view->getVScrollBar()->subtractLine(); break; case Key_Right: m_view->getHScrollBar()->addLine(); break; case Key_Left: m_view->getHScrollBar()->subtractLine(); break; case Key_Tab: selectNext(); break; case Key_Backtab: selectPrev(); break; case Key_Home: m_view->getVScrollBar()->setValue( 0 ); break; case Key_End: m_view->getVScrollBar()->setValue( m_view->getVScrollBar()->maxValue()); break; case Key_Escape: if ( toolEditMode == TEM_ZOOM ) setToolEditMode( TEM_MOUSE ); break; default: break; } } } void KPrCanvas::keyReleaseEvent( QKeyEvent *e ) { if ( editMode && m_currentTextObjectView ) m_currentTextObjectView->keyReleaseEvent( e ); else { if ( mouseSelectedObject ) { if(e->key()==Key_Up || e->key()==Key_Down || e->key()==Key_Right || e->key()==Key_Left) { if ( !e->isAutoRepeat() ) { KMacroCommand *macro=0L; KoPoint move( m_boundingRect.topLeft() - moveStartPosKey); KCommand *cmd=m_activePage->moveObject(m_view, move.x(), move.y()); if(cmd) { if ( ! macro ) macro=new KMacroCommand(i18n("Move Objects")); macro->addCommand(cmd); } cmd=stickyPage()->moveObject(m_view, move.x(), move.y()); if(cmd) { if ( ! macro ) macro=new KMacroCommand(i18n("Move Objects")); macro->addCommand(cmd); } if(macro) m_view->kPresenterDoc()->addCommand(macro ); m_keyPressEvent = false; } emit objectSelectedChanged(); } } } } void KPrCanvas::resizeEvent( QResizeEvent *e ) { if ( editMode ) QWidget::resizeEvent( e ); else #if KDE_IS_VERSION(3,1,90) QWidget::resizeEvent( new QResizeEvent( KGlobalSettings::desktopGeometry(this).size(), e->oldSize() ) ); #else QWidget::resizeEvent( new QResizeEvent( QApplication::desktop()->screenGeometry(this).size(), e->oldSize() ) ); #endif buffer.resize( size() ); } KPObject* KPrCanvas::getObjectAt( const KoPoint&pos ) { KPObject *kpobject=m_activePage->getObjectAt(pos); if( !kpobject) kpobject=stickyPage()->getObjectAt(pos); return kpobject; } void KPrCanvas::selectObj( KPObject *kpobject ) { kpobject->setSelected( true ); m_view->penColorChanged( m_activePage->getPen( QPen( Qt::black, 1, Qt::SolidLine ) ) ); m_view->brushColorChanged( m_activePage->getBrush( QBrush( Qt::white, Qt::SolidPattern ) ) ); _repaint( kpobject ); emit objectSelectedChanged(); mouseSelectedObject = true; } void KPrCanvas::deSelectObj( KPObject *kpobject ) { kpobject->setSelected( false ); _repaint( kpobject ); mouseSelectedObject = false; emit objectSelectedChanged(); } void KPrCanvas::selectAllObj() { int nbObj=objectList().count()+stickyPage()->objectList().count(); if(nbObj==(stickyPage()->numSelected()+m_activePage->numSelected())) return; QProgressDialog progress( i18n( "Selecting..." ), 0, nbObj, this ); int i=0; QPtrListIterator it( stickyPage()->objectList() ); for ( ; it.current() ; ++it ) { if ( !objectIsAHeaderFooterHidden(it.current()) ) selectObj(it.current()); progress.setProgress( i ); kapp->processEvents(); i++; } it= m_activePage->objectList(); for ( ; it.current() ; ++it ) { selectObj(it.current()); progress.setProgress( i ); kapp->processEvents(); i++; } mouseSelectedObject = true; emit objectSelectedChanged(); } void KPrCanvas::deSelectAllObj() { if( m_activePage->numSelected()==0 && stickyPage()->numSelected() == 0 ) return; if ( !m_view->kPresenterDoc()->raiseAndLowerObject && selectedObjectPosition != -1 ) { lowerObject(); selectedObjectPosition = -1; } else m_view->kPresenterDoc()->raiseAndLowerObject = false; m_activePage->deSelectAllObj(); stickyPage()->deSelectAllObj(); //desactivate kptextview when we switch of page if(m_currentTextObjectView) { m_currentTextObjectView->terminate(); m_currentTextObjectView->kpTextObject()->setEditingTextObj( false ); delete m_currentTextObjectView; m_currentTextObjectView=0L; } mouseSelectedObject = false; emit objectSelectedChanged(); } void KPrCanvas::setMouseSelectedObject(bool b) { mouseSelectedObject = b; emit objectSelectedChanged(); } void KPrCanvas::setupMenus() { // create right button presentation menu presMenu = new QPopupMenu(); Q_CHECK_PTR( presMenu ); presMenu->setCheckable( true ); PM_SM = presMenu->insertItem( i18n( "&Switching Mode" ), this, SLOT( switchingMode() ) ); PM_DM = presMenu->insertItem( i18n( "&Drawing Mode" ), this, SLOT( drawingMode() ) ); presMenu->insertSeparator(); presMenu->insertItem( SmallIcon("goto"), i18n( "&Goto Slide..." ), this, SLOT( slotGotoPage() ) ); presMenu->insertSeparator(); presMenu->insertItem( i18n( "&End Slide Show" ), this, SLOT( slotExitPres() ) ); presMenu->setItemChecked( PM_SM, true ); presMenu->setItemChecked( PM_DM, false ); presMenu->setMouseTracking( true ); } void KPrCanvas::clipCut() { if ( m_currentTextObjectView ) m_currentTextObjectView->cut(); m_view->editCut(); } void KPrCanvas::clipCopy() { if ( m_currentTextObjectView ) m_currentTextObjectView->copy(); m_view->editCopy(); } void KPrCanvas::clipPaste() { if ( m_currentTextObjectView ) m_currentTextObjectView->paste(); m_view->editPaste(); } void KPrCanvas::chPic() { bool state=m_activePage->chPic( m_view); if( state) return; stickyPage()->chPic(m_view); } void KPrCanvas::savePicture() { bool state=m_activePage->savePicture( m_view); if( state) return; stickyPage()->savePicture(m_view); } void KPrCanvas::setTextFormat(const KoTextFormat &format, int flags) { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; KMacroCommand* macroCmd = new KMacroCommand( i18n("Change Text Font") ); QPtrListIterator it( lst ); for ( ; it.current() ; ++it ) { KCommand *cmd = it.current()->setFormatCommand(&format, flags, true); if (cmd) macroCmd->addCommand( cmd ); } m_view->kPresenterDoc()->addCommand( macroCmd ); } void KPrCanvas::setTextColor( const QColor &color ) { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); KMacroCommand* macroCmd = new KMacroCommand( i18n("Set Text Color") ); for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setTextColorCommand( color ); if (cmd) macroCmd->addCommand( cmd ); } m_view->kPresenterDoc()->addCommand( macroCmd ); } void KPrCanvas::setTextBackgroundColor( const QColor &color ) { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); KMacroCommand* macroCmd = 0L; for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setTextBackgroundColorCommand( color ); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Set Text Background Color") ); macroCmd->addCommand( cmd ); } } if (macroCmd ) m_view->kPresenterDoc()->addCommand( macroCmd ); } void KPrCanvas::setTextBold( bool b ) { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); KMacroCommand* macroCmd = 0L; for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setBoldCommand( b ); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Make Text Bold") ); macroCmd->addCommand( cmd ); } } if ( macroCmd ) m_view->kPresenterDoc()->addCommand( macroCmd ); } void KPrCanvas::setTextItalic( bool b ) { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); KMacroCommand* macroCmd = 0L; for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setItalicCommand( b ); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Make Text Italic") ); macroCmd->addCommand( cmd ); } } if (macroCmd ) m_view->kPresenterDoc()->addCommand( macroCmd ); } void KPrCanvas::setTextUnderline( bool b ) { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); KMacroCommand* macroCmd = 0L; for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setUnderlineCommand( b ); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Underline Text") ); macroCmd->addCommand( cmd ); } } if ( macroCmd ) m_view->kPresenterDoc()->addCommand( macroCmd ); } void KPrCanvas::setTextStrikeOut( bool b ) { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; KMacroCommand* macroCmd = 0L; QPtrListIterator it( lst ); for ( ; it.current() ; ++it ) { KCommand *cmd = it.current()->setStrikeOutCommand( b ); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Make Text Italic") ); macroCmd->addCommand( cmd ); } } if ( macroCmd ) m_view->kPresenterDoc()->addCommand( macroCmd ); } void KPrCanvas::setTextFamily( const QString &f ) { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; KMacroCommand* macroCmd = 0L; QPtrListIterator it( lst ); for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setFamilyCommand( f ); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Set Text Font") ); macroCmd->addCommand( cmd ); } } if ( macroCmd) m_view->kPresenterDoc()->addCommand( macroCmd ); } void KPrCanvas::setTextPointSize( int s ) { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; KMacroCommand* macroCmd = 0L; QPtrListIterator it( lst ); for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setPointSizeCommand( s ); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Change Text Size") ); macroCmd->addCommand( cmd ); } } if (macroCmd) m_view->kPresenterDoc()->addCommand( macroCmd ); } void KPrCanvas::setTextSubScript( bool b ) { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); KMacroCommand* macroCmd = 0L; for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setTextSubScriptCommand( b ); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Set Text Subscript") ); macroCmd->addCommand( cmd ); } } if ( macroCmd ) m_view->kPresenterDoc()->addCommand( macroCmd ); } void KPrCanvas::setTextSuperScript( bool b ) { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); KMacroCommand* macroCmd = 0L; for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setTextSuperScriptCommand( b ); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Set Text Superscript") ); macroCmd->addCommand( cmd ); } } if ( macroCmd ) m_view->kPresenterDoc()->addCommand( macroCmd ); } void KPrCanvas::setTextDefaultFormat( ) { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); KMacroCommand* macroCmd = 0L; for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setDefaultFormatCommand( ); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Apply Default Format") ); macroCmd->addCommand( cmd ); } } if (macroCmd) m_view->kPresenterDoc()->addCommand( macroCmd ); } void KPrCanvas::setIncreaseFontSize() { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); int size = it.current()->currentFormat()->pointSize(); KMacroCommand* macroCmd =0L; for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setPointSizeCommand( size+1 ); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Increase Font Size") ); macroCmd->addCommand( cmd ); } } if ( macroCmd) m_view->kPresenterDoc()->addCommand( macroCmd ); } void KPrCanvas::setDecreaseFontSize() { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); int size = it.current()->currentFormat()->pointSize(); KMacroCommand* macroCmd = 0L; for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setPointSizeCommand( size-1 ); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Decrease Font Size") ); macroCmd->addCommand( cmd ); } } if ( macroCmd ) m_view->kPresenterDoc()->addCommand( macroCmd ); } void KPrCanvas::setTextAlign( int align ) { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); KMacroCommand* macroCmd = 0L; for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setAlignCommand(align); if ( cmd ) { if ( !macroCmd) macroCmd = new KMacroCommand( i18n("Set Text Align") ); macroCmd->addCommand( cmd ); } } if ( macroCmd ) m_view->kPresenterDoc()->addCommand( macroCmd ); } void KPrCanvas::setTabList( const KoTabulatorList & tabList ) { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); KMacroCommand* macroCmd = 0L; for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setTabListCommand(tabList ); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Change Tabulators") ); macroCmd->addCommand( cmd ); } } if ( macroCmd) m_view->kPresenterDoc()->addCommand( macroCmd ); } void KPrCanvas::setTextDepthPlus() { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; double leftMargin=0.0; if(!lst.isEmpty()) leftMargin=lst.first()->currentParagLayoutFormat()->margins[QStyleSheetItem::MarginLeft]; double indent = m_view->kPresenterDoc()->getIndentValue(); double newVal = leftMargin + indent; QPtrListIterator it( lst ); KMacroCommand* macroCmd = 0L; for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setMarginCommand(QStyleSheetItem::MarginLeft, newVal); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Increase Paragraph Depth") ); macroCmd->addCommand( cmd ); } } if ( macroCmd ) m_view->kPresenterDoc()->addCommand( macroCmd ); if(!lst.isEmpty()) { const KoParagLayout *layout=lst.first()->currentParagLayoutFormat(); m_view->showRulerIndent( layout->margins[QStyleSheetItem::MarginLeft], layout->margins[QStyleSheetItem::MarginFirstLine], layout->margins[QStyleSheetItem::MarginRight], lst.first()->rtl()); } } void KPrCanvas::setTextDepthMinus() { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; double leftMargin=0.0; if(!lst.isEmpty()) leftMargin=lst.first()->currentParagLayoutFormat()->margins[QStyleSheetItem::MarginLeft]; double indent = m_view->kPresenterDoc()->getIndentValue(); QPtrListIterator it( lst ); double newVal = leftMargin - indent; KMacroCommand* macroCmd = 0L; for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setMarginCommand(QStyleSheetItem::MarginLeft, QMAX( newVal, 0 )); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Decrease Paragraph Depth") ); macroCmd->addCommand( cmd ); } } if (macroCmd ) m_view->kPresenterDoc()->addCommand( macroCmd ); if(!lst.isEmpty()) { const KoParagLayout *layout=lst.first()->currentParagLayoutFormat(); m_view->showRulerIndent( layout->margins[QStyleSheetItem::MarginLeft], layout->margins[QStyleSheetItem::MarginFirstLine], layout->margins[QStyleSheetItem::MarginRight], lst.first()->rtl()); } } void KPrCanvas::setNewFirstIndent(double _firstIndent) { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); KMacroCommand* macroCmd = 0L; for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setMarginCommand(QStyleSheetItem::MarginFirstLine, _firstIndent); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Change First Line Indent") ); macroCmd->addCommand( cmd ); } } if ( macroCmd ) m_view->kPresenterDoc()->addCommand( macroCmd ); } void KPrCanvas::setNewLeftIndent(double _leftIndent) { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); KMacroCommand* macroCmd = 0L; for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setMarginCommand(QStyleSheetItem::MarginLeft, _leftIndent); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Change Left Indent") ); macroCmd->addCommand( cmd ); } } if ( macroCmd ) m_view->kPresenterDoc()->addCommand( macroCmd ); } void KPrCanvas::setNewRightIndent(double _rightIndent) { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); KMacroCommand* macroCmd = 0L; for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setMarginCommand(QStyleSheetItem::MarginRight, _rightIndent); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Change Right Indent") ); macroCmd->addCommand( cmd ); } } if ( macroCmd ) m_view->kPresenterDoc()->addCommand( macroCmd ); } /*void KPrCanvas::setTextCounter(KoParagCounter counter) { QPtrList lst = applicableTextInterfaces(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); KMacroCommand* macroCmd = 0L; for ( ; it.current() ; ++it ) { KCommand* cmd = it.current()->setCounterCommand(counter ); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Change Paragraph Type") ); macroCmd->addCommand( cmd ); } } if ( macroCmd ) m_view->kPresenterDoc()->addCommand( macroCmd ); }*/ #ifndef NDEBUG void KPrCanvas::printRTDebug( int info ) { KPTextObject *kpTxtObj = 0; if ( m_currentTextObjectView ) kpTxtObj = m_currentTextObjectView->kpTextObject(); else kpTxtObj = selectedTextObjs().first(); if ( kpTxtObj ) kpTxtObj->textObject()->printRTDebug( info ); } #endif bool KPrCanvas::haveASelectedPartObj() const { return m_activePage->haveASelectedPartObj() || stickyPage()->haveASelectedPartObj(); } bool KPrCanvas::haveASelectedGroupObj() const { return m_activePage->haveASelectedGroupObj() || stickyPage()->haveASelectedGroupObj(); } bool KPrCanvas::haveASelectedPixmapObj() const { return m_activePage->haveASelectedPixmapObj() || stickyPage()->haveASelectedPixmapObj(); } QPtrList KPrCanvas::applicableTextObjects() const { QPtrList lst; // If we're editing a text object, then that's the one we return if ( m_currentTextObjectView ) lst.append( m_currentTextObjectView->kpTextObject() ); else lst = selectedTextObjs(); return lst; } QPtrList KPrCanvas::applicableTextInterfaces() const { QPtrList lst; QPtrList lstObj; // If we're editing a text object, then that's the one we return if ( m_currentTextObjectView ) { if ( !m_currentTextObjectView->kpTextObject()->isProtectContent()) lst.append( m_currentTextObjectView ); } else { m_activePage->getAllObjectSelectedList(lstObj); QPtrListIterator it(lstObj); for ( ; it.current(); ++it ) { if ( it.current()->getType() == OT_TEXT ) { KPTextObject * obj = static_cast( it.current() ); if ( !obj->isProtectContent() ) lst.append( obj->textObject() ); } } //get sticky obj lstObj.clear(); stickyPage()->getAllObjectSelectedList(lstObj); it=QPtrListIterator( lstObj ); for ( ; it.current(); ++it ) { if ( it.current()->getType() == OT_TEXT ) { KPTextObject * obj = static_cast( it.current() ); if ( !obj->isProtectContent() ) lst.append( obj->textObject() ); } } } return lst; } QPtrList KPrCanvas::selectedTextObjs() const { QPtrList lst; QPtrListIterator it(getObjectList()); for ( ; it.current(); ++it ) { if ( it.current()->isSelected() && it.current()->getType() == OT_TEXT ) lst.append( static_cast( it.current() ) ); } //get sticky obj it=stickyPage()->objectList(); for ( ; it.current(); ++it ) { if ( it.current()->isSelected() && it.current()->getType() == OT_TEXT ) lst.append( static_cast( it.current() )); } return lst; } void KPrCanvas::startScreenPresentation( float presFakt, int curPgNum /* 1-based */) { _presFakt = presFakt; //kdDebug(33001) << "KPrCanvas::startScreenPresentation curPgNum=" << curPgNum << endl; //kdDebug(33001) << " _presFakt=" << _presFakt << endl; presMenu->setItemChecked( PM_SM, true ); presMenu->setItemChecked( PM_DM, false ); setCursor( waitCursor ); tmpObjs.clear(); exitEditMode(); //kdDebug(33001) << "Page::startScreenPresentation Zooming backgrounds" << endl; // Zoom backgrounds to the correct size for full screen KPresenterDoc * doc = m_view->kPresenterDoc(); m_activePageBeforePresentation = doc->activePage(); doc->displayActivePage( doc->pageList().at( curPgNum-1 ) ); m_zoomBeforePresentation=doc->zoomHandler()->zoom(); // ## TODO get rid of presFakt doc->zoomHandler()->setZoomAndResolution( qRound(_presFakt*m_zoomBeforePresentation), QPaintDevice::x11AppDpiX(), QPaintDevice::x11AppDpiY() ); doc->newZoomAndResolution(false,false); QPtrListIterator oIt(doc->pageList().at( curPgNum-1 )->objectList()); for (; oIt.current(); ++oIt ) tmpObjs.append( oIt.current() ); // add all selected slides slideList.clear(); QValueList selected = doc->selectedSlides(); for ( QValueList::Iterator it = selected.begin() ; it != selected.end(); ++ it ) { // ARGLLLRGLRLGRLG selectedSlides gets us 0-based numbers, // and here we want 1-based numbers ! int slideno = *it + 1; slideList.append( slideno ); } // no slide selected ? end the slide show immediately... if( !slideList.count() ) { //kdDebug(33001) << "No slide: end the slide show" << endl; stopScreenPresentation(); return; } // find first selected slide after curPgNum unsigned slide = 0; for( unsigned i = 0; i= curPgNum ) { slide = slideList[i]; break; } setCursor( blankCursor ); currPresPage = (unsigned int) -1; // force gotoPage to do something gotoPage( slide ); //kdDebug(33001) << "Page::startScreenPresentation - done" << endl; } void KPrCanvas::stopScreenPresentation() { //kdDebug(33001) << "KPrCanvas::stopScreenPresentation m_showOnlyPage=" << m_showOnlyPage << endl; setCursor( waitCursor ); KPresenterDoc * doc = m_view->kPresenterDoc(); doc->displayActivePage( m_activePageBeforePresentation ); _presFakt = 1.0; doc->zoomHandler()->setZoomAndResolution( m_zoomBeforePresentation, QPaintDevice::x11AppDpiX(), QPaintDevice::x11AppDpiY() ); doc->newZoomAndResolution(false,false); goingBack = false; currPresPage = 1; editMode = true; drawMode = false; repaint( false ); setToolEditMode( toolEditMode ); tmpObjs.clear(); setWFlags( WResizeNoErase ); } bool KPrCanvas::pNext( bool ) { //bool clearSubPres = false; goingBack = false; //kdDebug(33001) << "\n-------\nKPrCanvas::pNext currPresStep=" << currPresStep << " subPresStep=" << subPresStep << endl; // First try to go one sub-step further, if any object requires it QPtrListIterator oit(getObjectList()); for ( int i = 0 ; oit.current(); ++oit, ++i ) { KPObject *kpobject = oit.current(); if ( kpobject->getPresNum() == static_cast( currPresStep ) && kpobject->getType() == OT_TEXT && kpobject->getEffect2() != EF2_NONE ) { if ( static_cast( subPresStep + 1 ) < kpobject->getSubPresSteps() ) { //kdDebug(33001) << "Page::pNext addSubPres subPresStep is now " << subPresStep+1 << endl; subPresStep++; doObjEffects(); return false; } } } // Then try to see if there is still one step to do in the current page if ( (int)currPresStep < *( --presStepList.end() ) ) { QValueList::ConstIterator it = presStepList.find( currPresStep ); currPresStep = *( ++it ); subPresStep = 0; //kdDebug(33001) << "Page::pNext setting currPresStep to " << currPresStep << endl; if ( currPresStep == 0 ) { QPainter p; p.begin( this ); drawBackground( &p, QRect( 0, 0, kapp->desktop()->width(), kapp->desktop()->height() ) ); p.end(); } doObjEffects(); return false; } // No more steps in this page, try to go to the next page QValueList::ConstIterator test( slideListIterator ); if ( ++test != slideList.end() ) { KPresenterDoc * doc = m_view->kPresenterDoc(); if ( !spManualSwitch() && nextPageTimer ) { QValueList::ConstIterator it( slideListIterator ); m_view->setCurrentTimer( doc->pageList().at((*it) - 1 )->getPageTimer() * doc->getPresSpeed() ); nextPageTimer = false; return false; } #if KDE_IS_VERSION(3,1,90) QRect desk = KGlobalSettings::desktopGeometry(this); #else QRect desk = QApplication::desktop()->screenGeometry(this); #endif QPixmap _pix1( desk.width(), desk.height() ); drawCurrentPageInPix( _pix1 ); m_view->setPresentationDuration( currPresPage - 1 ); currPresPage = *( ++slideListIterator ); subPresStep = 0; //kdDebug(33001) << "Page::pNext going to page " << currPresPage << endl; tmpObjs.clear(); doc->displayActivePage( doc->pageList().at( currPresPage-1 ) ); setActivePage(doc->pageList().at(currPresPage-1)); QPtrListIterator oIt( getObjectList() ); for (; oIt.current(); ++oIt ) tmpObjs.append(oIt.current()); presStepList = doc->reorderPage( currPresPage-1 ); currPresStep = *presStepList.begin(); #if KDE_IS_VERSION(3,1,90) QPixmap _pix2( desk.width(), desk.height() ); #else QPixmap _pix2( QApplication::desktop()->width(), QApplication::desktop()->height() ); #endif int pageHeight = doc->pageList().at(currPresPage-1)->getZoomPageRect().height(); int yOffset = ( presPage() - 1 ) * pageHeight; if ( height() > pageHeight ) yOffset -= ( height() - pageHeight ) / 2; drawCurrentPageInPix( _pix2 ); QValueList::ConstIterator it( slideListIterator ); --it; if ( !spManualSwitch() ) m_view->autoScreenPresStopTimer(); KPBackGround * backtmp=doc->pageList().at( ( *it ) - 1 )->background(); PageEffect _pageEffect = backtmp->getPageEffect(); bool _soundEffect = backtmp->getPageSoundEffect(); QString _soundFileName = backtmp->getPageSoundFileName(); if ( _pageEffect != PEF_NONE && _soundEffect && !_soundFileName.isEmpty() ) { stopSound(); playSound( _soundFileName ); } kPchangePages( this, _pix1, _pix2, _pageEffect, pageSpeedFakt() ); if ( !spManualSwitch() ) m_view->autoScreenPresReStartTimer(); return true; } //kdDebug(33001) << "Page::pNext last slide -> End of presentation" << endl; // When we are in manual mode or in automatic mode with no infinite loop // we display the 'End of presentation' slide. if ( ( spManualSwitch() || !spInfiniteLoop() ) && !showingLastSlide ) { m_view->setPresentationDuration( currPresPage - 1 ); #if KDE_IS_VERSION(3,1,90) QRect desk = KGlobalSettings::desktopGeometry(this); #else QRect desk = QApplication::desktop()->screenGeometry(this); #endif QPixmap lastSlide( desk.width(), desk.height() ); QFont font( m_view->kPresenterDoc()->defaultFont().family() ); QPainter p( &lastSlide ); p.setFont( font ); p.setPen( white ); p.fillRect( p.viewport(), black ); p.drawText( 50, 50, i18n( "End of presentation. Click to exit." ) ); bitBlt( this, 0, 0, &lastSlide, 0, 0, lastSlide.width(), lastSlide.height() ); showingLastSlide = true; emit stopPres(); // no automatic mode for last slide } else if ( showingLastSlide ) // after last slide stop presentation { showingLastSlide = false; m_view->screenStop(); } else { m_view->setPresentationDuration( currPresPage - 1 ); emit stopPres(); // tells automatic mode to restart } return false; } bool KPrCanvas::pPrev( bool /*manual*/ ) { goingBack = true; subPresStep = 0; if ( (int)currPresStep > *presStepList.begin() ) { QValueList::ConstIterator it = presStepList.find( currPresStep ); currPresStep = *( --it ); repaint( false ); return false; } else { if ( slideListIterator == slideList.begin() ) { presStepList = m_view->kPresenterDoc()->reorderPage( currPresPage - 1 ); currPresStep = *presStepList.begin(); repaint( false ); return false; } m_view->setPresentationDuration( currPresPage - 1); currPresPage = *( --slideListIterator ); tmpObjs.clear(); KPresenterDoc * doc = m_view->kPresenterDoc(); doc->displayActivePage( doc->pageList().at( currPresPage-1 ) ); //change active page. setActivePage(doc->pageList().at( currPresPage - 1 ) ); QPtrListIterator oIt( getObjectList() ); for (; oIt.current(); ++oIt ) tmpObjs.append(oIt.current()); presStepList = doc->reorderPage( currPresPage - 1 ); currPresStep = *( --presStepList.end() ); return true; } return false; } bool KPrCanvas::canAssignEffect( QPtrList &objs ) const { QPtrListIterator oIt( m_activePage->objectList() ); for (; oIt.current(); ++oIt ) if ( oIt.current()->isSelected() ) objs.append( oIt.current() ); oIt = stickyPage()->objectList(); for (; oIt.current(); ++oIt ) { //can't assign a effect to header/footer if(m_view->kPresenterDoc()->isHeaderFooter(oIt.current())) continue; if ( oIt.current()->isSelected() ) objs.append( oIt.current() ); } return !objs.isEmpty(); } bool KPrCanvas::isOneObjectSelected() const { bool state=m_activePage->isOneObjectSelected(); if( state) return true; return stickyPage()->isOneObjectSelected(); } // This one is used to generate the pixmaps for the HTML presentation, // for the pres-structure-dialog, for the sidebar previews, for template icons. void KPrCanvas::drawPageInPix( QPixmap &_pix, int pgnum, int zoom, bool forceRealVariableValue ) { //kdDebug(33001) << "Page::drawPageInPix" << endl; currPresPage = pgnum + 1; int oldZoom = m_view->kPresenterDoc()->zoomHandler()->zoom(); bool oldDisplayFieldValue = false; m_view->zoomDocument(zoom); if ( forceRealVariableValue ) { oldDisplayFieldValue = m_view->kPresenterDoc()->getVariableCollection()->variableSetting()->displayFieldCode(); if ( oldDisplayFieldValue ) { m_view->kPresenterDoc()->getVariableCollection()->variableSetting()->setDisplayFieldCode(false); m_view->kPresenterDoc()->recalcVariables( VT_ALL ); } } QRect rect = m_view->kPresenterDoc()->pageList().at(pgnum)->getZoomPageRect( ); _pix.resize( rect.size() ); _pix.fill( Qt::white ); QPainter p; p.begin( &_pix ); bool _editMode = editMode; editMode = false; drawBackground( &p, _pix.rect() ); //objects in current page QPtrList _list = m_view->kPresenterDoc()->pageList().at( currPresPage-1 )->objectList(); // check if object is selected, if so put it on the right place for the output if( _list.count() > 1 && (int)_list.count() > selectedObjectPosition && selectedObjectPosition >= 0) { _list.setAutoDelete( false ); KPObject *kpobject = _list.last(); if ( kpobject->isSelected() ) { _list.take( _list.count() - 1 ); _list.insert( selectedObjectPosition, kpobject ); } } drawAllObjectsInPage( &p, _list ); //draw sticky object //the numbers for the sticky page have to be recalculated KPrPage* saveActivePage = m_activePage; KPresenterDoc *doc = m_view->kPresenterDoc(); doc->displayActivePage( doc->pageList().at( currPresPage-1 ) ); setActivePage(doc->pageList().at( currPresPage - 1 ) ); //setActivePage(m_view->kPresenterDoc()->pageList().at(currPresPage-1)); drawAllObjectsInPage( &p, stickyPage()->objectList() ); setActivePage( saveActivePage ); editMode = _editMode; p.end(); if ( forceRealVariableValue ) { if ( oldDisplayFieldValue ) { m_view->kPresenterDoc()->getVariableCollection()->variableSetting()->setDisplayFieldCode(true); m_view->kPresenterDoc()->recalcVariables( VT_ALL ); } } m_view->zoomDocument(oldZoom); } // This one is used in fullscreenmode, to generate the pixmaps used for the // page effects. void KPrCanvas::drawCurrentPageInPix( QPixmap &_pix ) const { //kdDebug(33001) << "Page::drawCurrentPageInPix" << endl; _pix.fill(Qt::black); // avoid garbage on "weird" DPIs QPainter p; p.begin( &_pix ); drawBackground( &p, _pix.rect() ); drawObjects( &p, _pix.rect(), false/*no cursor*/, SM_NONE, true/*obj-specific effects*/ ); p.end(); } void KPrCanvas::printPage( QPainter* painter, int pageNum ) { //kdDebug(33001) << "KPrCanvas::printPage" << endl; KPrPage* saveActivePage = m_activePage; KPresenterDoc *doc = m_view->kPresenterDoc(); KPrPage* page = doc->pageList().at( pageNum ); QRect rect = page->getZoomPageRect(); doc->displayActivePage( page ); setActivePage( page ); drawBackground( painter, rect ); drawObjects( painter, rect, false, SM_NONE, false/*no specific effects*/ ); setActivePage( saveActivePage ); } void KPrCanvas::doObjEffects() { /// ### Note: this is for full-screen mode only. /// ### There should be NO use of diffx(), diffy() anywhere in this method! QPixmap screen_orig( kapp->desktop()->width(), kapp->desktop()->height() ); bool drawn = false; // YABADABADOOOOOOO.... That's a hack :-) if ( subPresStep == 0 && currPresPage > 0 ) { //kdDebug(33001) << "Page::doObjEffects - in the strange hack" << endl; inEffect = true; QPainter p; p.begin( &screen_orig ); QRect desktopRect = QRect( 0, 0, kapp->desktop()->width(), kapp->desktop()->height() ); drawBackground( &p, desktopRect ); drawObjects( &p, desktopRect, false, SM_NONE, true ); p.end(); inEffect = false; bitBlt( this, 0, 0, &screen_orig, 0, 0, screen_orig.width(), screen_orig.height() ); drawn = true; } QPtrList _objList; QTime _time; int _step = 0, _steps1 = 0, _steps2 = 0, x_pos1 = 0, y_pos1 = 0; int x_pos2 = kapp->desktop()->width(), y_pos2 = kapp->desktop()->height(), _step_width = 0, _step_height = 0; int w_pos1 = 0, h_pos1; bool effects = false; bool nothingHappens = false; int timer = 0; bool _soundEffect = false; QString _soundFileName = QString::null; if ( !drawn ) bitBlt( &screen_orig, 0, 0, this, 0, 0, kapp->desktop()->width(), kapp->desktop()->height() ); QPixmap *screen = new QPixmap( screen_orig ); QPtrListIterator oit(getObjectList()); for ( int i = 0 ; oit.current(); ++oit, ++i ) { KPObject *kpobject = oit.current(); if ( kpobject->getPresNum() == static_cast( currPresStep ) ) { if ( !spManualSwitch() ) timer = kpobject->getAppearTimer(); if ( kpobject->getEffect() != EF_NONE ) { _soundEffect = kpobject->getAppearSoundEffect(); _soundFileName = kpobject->getAppearSoundEffectFileName(); _objList.append( kpobject ); QRect br = m_view->zoomHandler()->zoomRect( kpobject->getBoundingRect() ); int x = br.x(); int y = br.y(); int w = br.width(); int h = br.height(); switch ( kpobject->getEffect() ) { case EF_COME_LEFT: x_pos1 = QMAX( x_pos1, x - diffx() + w ); break; case EF_COME_TOP: y_pos1 = QMAX( y_pos1, y - diffy() + h ); break; case EF_COME_RIGHT: x_pos2 = QMIN( x_pos2, x - diffx() ); break; case EF_COME_BOTTOM: y_pos2 = QMIN( y_pos2, y - diffy() ); break; case EF_COME_LEFT_TOP: { x_pos1 = QMAX( x_pos1, x - diffx() + w ); y_pos1 = QMAX( y_pos1, y - diffy() + h ); } break; case EF_COME_LEFT_BOTTOM: { x_pos1 = QMAX( x_pos1, x - diffx() + w ); y_pos2 = QMIN( y_pos2, y - diffy() ); } break; case EF_COME_RIGHT_TOP: { x_pos2 = QMIN( x_pos2, x - diffx() ); y_pos1 = QMAX( y_pos1, y - diffy() + h ); } break; case EF_COME_RIGHT_BOTTOM: { x_pos2 = QMIN( x_pos2, x - diffx() ); y_pos2 = QMIN( y_pos2, y - diffy() ); } break; case EF_WIPE_LEFT: x_pos1 = QMAX( x_pos1, w ); break; case EF_WIPE_RIGHT: x_pos1 = QMAX( x_pos1, w ); break; case EF_WIPE_TOP: y_pos1 = QMAX( y_pos1, h ); break; case EF_WIPE_BOTTOM: y_pos1 = QMAX( y_pos1, h ); break; default: break; } effects = true; } } else if ( kpobject->getDisappear() && kpobject->getDisappearNum() == static_cast( currPresStep ) ) { if ( !spManualSwitch() ) timer = kpobject->getDisappearTimer(); if ( kpobject->getEffect3() != EF3_NONE ) { _soundEffect = kpobject->getDisappearSoundEffect(); _soundFileName = kpobject->getDisappearSoundEffectFileName(); _objList.append( kpobject ); int x = 0, y = 0, w = 0, h = 0; QRect br = m_view->zoomHandler()->zoomRect( kpobject->getBoundingRect() ); x = br.x(); y = br.y(); w = br.width(); h = br.height(); switch ( kpobject->getEffect3() ) { case EF3_GO_LEFT: x_pos1 = QMAX( x_pos1, x - diffx() + w ); break; case EF3_GO_TOP: y_pos1 = QMAX( y_pos1, y - diffy() + h ); break; case EF3_GO_RIGHT: x_pos2 = QMIN( x_pos2, x - diffx() ); break; case EF3_GO_BOTTOM: y_pos2 = QMIN( y_pos2, y - diffy() ); break; case EF3_GO_LEFT_TOP: { x_pos1 = QMAX( x_pos1, x - diffx() + w ); y_pos1 = QMAX( y_pos1, y - diffy() + h ); } break; case EF3_GO_LEFT_BOTTOM: { x_pos1 = QMAX( x_pos1, x - diffx() + w ); y_pos2 = QMIN( y_pos2, y - diffy() ); } break; case EF3_GO_RIGHT_TOP: { x_pos2 = QMIN( x_pos2, x - diffx() ); y_pos1 = QMAX( y_pos1, y - diffy() + h ); } break; case EF3_GO_RIGHT_BOTTOM: { x_pos2 = QMIN( x_pos2, x - diffx() ); y_pos2 = QMIN( y_pos2, y - diffy() ); } break; case EF3_WIPE_LEFT: x_pos1 = QMAX( x_pos1, w ); break; case EF3_WIPE_RIGHT: x_pos1 = QMAX( x_pos1, w ); break; case EF3_WIPE_TOP: y_pos1 = QMAX( y_pos1, h ); break; case EF3_WIPE_BOTTOM: y_pos1 = QMAX( y_pos1, h ); break; default: break; } effects = true; } } } if ( effects ) { if ( !spManualSwitch() && timer > 0 ) m_view->autoScreenPresStopTimer(); if ( _soundEffect && !_soundFileName.isEmpty() ) { stopSound(); playSound( _soundFileName ); } _step_width = static_cast( ( static_cast( kapp->desktop()->width() ) / objSpeedFakt() ) ); _step_height = static_cast( ( static_cast( kapp->desktop()->height() ) / objSpeedFakt() ) ); _steps1 = x_pos1 > y_pos1 ? x_pos1 / _step_width : y_pos1 / _step_height; _steps2 = kapp->desktop()->width() - x_pos2 > kapp->desktop()->height() - y_pos2 ? ( kapp->desktop()->width() - x_pos2 ) / _step_width : ( kapp->desktop()->height() - y_pos2 ) / _step_height; _time.start(); QPtrList xy; xy.setAutoDelete( true ); for ( ; ; ) { kapp->processEvents(); if ( nothingHappens ) break; // || _step >= _steps1 && _step >= _steps2 ) break; QPtrList changes; changes.setAutoDelete( true ); if ( _time.elapsed() >= 1 ) { nothingHappens = true; _step++; changes.clear(); for ( int i = 0; i < static_cast( _objList.count() ); i++ ) { KPObject * kpobject = _objList.at( i ); // Origin of the object, in pixels QPoint objectOrig = m_view->zoomHandler()->zoomPoint( kpobject->getOrig() ); // Distance from object to bottom right position of the screen... int _w = kapp->desktop()->width() - ( objectOrig.x() /*- diffx()*/ ); int _h = kapp->desktop()->height() - ( objectOrig.y() /*- diffy()*/ ); QRect objectRect = m_view->zoomHandler()->zoomRect( kpobject->getRect() ); int ox = objectRect.x(); int oy = objectRect.y(); int ow = objectRect.width(); int oh = objectRect.height(); QRect br = m_view->zoomHandler()->zoomRect( kpobject->getBoundingRect() ); int bx = br.x(); int by = br.y(); int bw = br.width(); int bh = br.height(); QRect oldRect; QRect newRect; if ( static_cast( xy.count() - 1 ) < i ) { xy.append( new QRect( 0, 0, 0, 0 ) ); oldRect.setRect( bx - diffx(), by - diffy(), bw, bh ); } else oldRect.setRect( bx - ( diffx() - xy.at( i )->x() ), by - ( diffy() - xy.at( i )->y() ), bw - xy.at( i )->width(), bh - xy.at( i )->height() ); ObjType objectType = kpobject->getType(); Effect2 effect2 = kpobject->getEffect2(); if ( !kpobject->getDisappear() || kpobject->getDisappear() && kpobject->getDisappearNum() != static_cast( currPresStep ) ) { switch ( kpobject->getEffect() ) { case EF_NONE: { if ( subPresStep == 0 || subPresStep != 0 && objectType == OT_TEXT && effect2 == EF2T_PARA ) drawObject( kpobject, screen, ox, oy, 0, 0, 0, 0 ); } break; case EF_COME_LEFT: { if ( subPresStep == 0 || subPresStep != 0 && objectType == OT_TEXT && effect2 == EF2T_PARA ) { x_pos1 = _step_width * _step < ox - diffx() + ow ? ox - diffx() + ow - _step_width * _step : 0; y_pos1 = 0; drawObject( kpobject, screen, -x_pos1, y_pos1, 0, 0, 0, 0 ); if ( x_pos1 != 0 ) nothingHappens = false; xy.at( i )->setX( -x_pos1 ); xy.at( i )->setY( y_pos1 ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( 0 ); } } break; case EF_COME_TOP: { if ( subPresStep == 0 || subPresStep != 0 && objectType == OT_TEXT && effect2 == EF2T_PARA ) { y_pos1 = _step_height * _step < oy - diffy() + oh ? oy - diffy() + oh - _step_height * _step : 0; x_pos1 = 0; drawObject( kpobject, screen, x_pos1, -y_pos1, 0, 0, 0, 0 ); if ( y_pos1 != 0 ) nothingHappens = false; xy.at( i )->setX( x_pos1 ); xy.at( i )->setY( -y_pos1 ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( 0 ); } } break; case EF_COME_RIGHT: { if ( subPresStep == 0 || subPresStep != 0 && objectType == OT_TEXT && effect2 == EF2T_PARA ) { x_pos2 = _w - ( _step_width * _step ) + ( ox - diffx() ) > ox - diffx() ? _w - ( _step_width * _step ) : 0; y_pos2 = 0; drawObject( kpobject, screen, x_pos2, y_pos2, 0, 0, 0, 0 ); if ( x_pos2 != 0 ) nothingHappens = false; xy.at( i )->setX( x_pos2 ); xy.at( i )->setY( y_pos2 ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( 0 ); } } break; case EF_COME_BOTTOM: { if ( subPresStep == 0 || subPresStep != 0 && objectType == OT_TEXT && effect2 == EF2T_PARA ) { y_pos2 = _h - ( _step_height * _step ) + ( oy - diffy() ) > oy - diffy() ? _h - ( _step_height * _step ) : 0; x_pos2 = 0; drawObject( kpobject, screen, x_pos2, y_pos2, 0, 0, 0, 0 ); if ( y_pos2 != 0 ) nothingHappens = false; xy.at( i )->setX( x_pos2 ); xy.at( i )->setY( y_pos2 ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( 0 ); } } break; case EF_COME_LEFT_TOP: { if ( subPresStep == 0 || subPresStep != 0 && objectType == OT_TEXT && effect2 == EF2T_PARA ) { x_pos1 = _step_width * _step < ox - diffx() + ow ? ox - diffx() + ow - _step_width * _step : 0; y_pos1 = _step_height * _step < oy - diffy() + oh ? oy - diffy() + oh - _step_height * _step : 0; drawObject( kpobject, screen, -x_pos1, -y_pos1, 0, 0, 0, 0 ); if ( x_pos1 != 0 || y_pos1 != 0 ) nothingHappens = false; xy.at( i )->setX( -x_pos1 ); xy.at( i )->setY( -y_pos1 ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( 0 ); } } break; case EF_COME_LEFT_BOTTOM: { if ( subPresStep == 0 || subPresStep != 0 && objectType == OT_TEXT && effect2 == EF2T_PARA ) { x_pos1 = _step_width * _step < ox - diffx() + ow ? ox - diffx() + ow - _step_width * _step : 0; y_pos2 = _h - ( _step_height * _step ) + ( oy - diffy() ) > oy - diffy() ? _h - ( _step_height * _step ) : 0; drawObject( kpobject, screen, -x_pos1, y_pos2, 0, 0, 0, 0 ); if ( x_pos1 != 0 || y_pos2 != 0 ) nothingHappens = false; xy.at( i )->setX( -x_pos1 ); xy.at( i )->setY( y_pos2 ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( 0 ); } } break; case EF_COME_RIGHT_TOP: { if ( subPresStep == 0 || subPresStep != 0 && objectType == OT_TEXT && effect2 == EF2T_PARA ) { x_pos2 = _w - ( _step_width * _step ) + ( ox - diffx() ) > ox - diffx() ? _w - ( _step_width * _step ) : 0; y_pos1 = _step_height * _step < oy - diffy() + oh ? oy - diffy() + oh - _step_height * _step : 0; drawObject( kpobject, screen, x_pos2, -y_pos1, 0, 0, 0, 0 ); if ( x_pos2 != 0 || y_pos1 != 0 ) nothingHappens = false; xy.at( i )->setX( x_pos2 ); xy.at( i )->setY( -y_pos1 ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( 0 ); } } break; case EF_COME_RIGHT_BOTTOM: { if ( subPresStep == 0 || subPresStep != 0 && objectType == OT_TEXT && effect2 == EF2T_PARA ) { x_pos2 = _w - ( _step_width * _step ) + ( ox - diffx() ) > ox - diffx() ? _w - ( _step_width * _step ) : 0; y_pos2 = _h - ( _step_height * _step ) + ( oy - diffy() ) > oy - diffy() ? _h - ( _step_height * _step ) : 0; drawObject( kpobject, screen, x_pos2, y_pos2, 0, 0, 0, 0 ); if ( x_pos2 != 0 || y_pos2 != 0 ) nothingHappens = false; xy.at( i )->setX( x_pos2 ); xy.at( i )->setY( y_pos2 ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( 0 ); } } break; case EF_WIPE_LEFT: { if ( subPresStep == 0 || subPresStep != 0 && objectType == OT_TEXT && effect2 == EF2T_PARA ) { w_pos1 = _step_width * ( _steps1 - _step ) > 0 ? _step_width * ( _steps1 - _step ) : 0; drawObject( kpobject, screen, 0, 0, w_pos1, 0, 0, 0 ); if ( w_pos1 != 0 ) nothingHappens = false; xy.at( i )->setX( 0 ); xy.at( i )->setY( 0 ); xy.at( i )->setWidth( w_pos1 ); xy.at( i )->setHeight( 0 ); } } break; case EF_WIPE_RIGHT: { if ( subPresStep == 0 || subPresStep != 0 && objectType == OT_TEXT && effect2 == EF2T_PARA ) { w_pos1 = _step_width * ( _steps1 - _step ) > 0 ? _step_width * ( _steps1 - _step ) : 0; x_pos1 = w_pos1; drawObject( kpobject, screen, 0, 0, w_pos1, 0, x_pos1, 0 ); if ( w_pos1 != 0 ) nothingHappens = false; xy.at( i )->setX( x_pos1 ); xy.at( i )->setY( 0 ); xy.at( i )->setWidth( w_pos1 ); xy.at( i )->setHeight( 0 ); } } break; case EF_WIPE_TOP: { if ( subPresStep == 0 || subPresStep != 0 && objectType == OT_TEXT && effect2 == EF2T_PARA ) { h_pos1 = _step_height * ( _steps1 - _step ) > 0 ? _step_height * ( _steps1 - _step ) : 0; drawObject( kpobject, screen, 0, 0, 0, h_pos1, 0, 0 ); if ( h_pos1 != 0 ) nothingHappens = false; xy.at( i )->setX( 0 ); xy.at( i )->setY( 0 ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( h_pos1 ); } } break; case EF_WIPE_BOTTOM: { if ( subPresStep == 0 || subPresStep != 0 && objectType == OT_TEXT && effect2 == EF2T_PARA ) { h_pos1 = _step_height * ( _steps1 - _step ) > 0 ? _step_height * ( _steps1 - _step ) : 0; y_pos1 = h_pos1; drawObject( kpobject, screen, 0, 0, 0, h_pos1, 0, y_pos1 ); if ( h_pos1 != 0 ) nothingHappens = false; xy.at( i )->setX( 0 ); xy.at( i )->setY( y_pos1 ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( h_pos1 ); } } break; default: break; } } else { if ( subPresStep == 0 ) { switch ( kpobject->getEffect3() ) { case EF3_NONE: //drawObject( kpobject, screen, ox, oy, 0, 0, 0, 0 ); break; case EF3_GO_LEFT: { x_pos1 = _step_width * _step < ox - diffx() + ow ? ox - diffx() + ow - _step_width * _step : 0; y_pos1 = 0; drawObject( kpobject, screen, -( ox + ow - x_pos1 ), y_pos1, 0, 0, 0, 0 ); if ( x_pos1 != 0 ) nothingHappens = false; xy.at( i )->setX( -( ox + ow - x_pos1 ) ); xy.at( i )->setY( y_pos1 ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( 0 ); } break; case EF3_GO_TOP: { y_pos1 = _step_height * _step < oy - diffy() + oh ? oy - diffy() + oh - _step_height * _step : 0; x_pos1 = 0; drawObject( kpobject, screen, x_pos1, -( ( oy - diffy() ) + oh - y_pos1 ), 0, 0, 0, 0 ); if ( y_pos1 != 0 ) nothingHappens = false; xy.at( i )->setX( x_pos1 ); xy.at( i )->setY( -( ( oy - diffy() ) + oh - y_pos1 ) ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( 0 ); } break; case EF3_GO_RIGHT: { x_pos2 = _w - ( _step_width * _step ) + ( ox - diffx() ) > ox - diffx() ? _w - ( _step_width * _step ) : 0; y_pos2 = 0; int __w = kapp->desktop()->width() - ox; drawObject( kpobject, screen, __w - x_pos2, y_pos2, 0, 0, 0, 0 ); if ( x_pos2 != 0 ) nothingHappens = false; xy.at( i )->setX( __w - x_pos2 ); xy.at( i )->setY( y_pos2 ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( 0 ); } break; case EF3_GO_BOTTOM: { y_pos2 = _h - ( _step_height * _step ) + ( oy - diffy() ) > oy - diffy() ? _h - ( _step_height * _step ) : 0; x_pos2 = 0; int __h = kapp->desktop()->height() - ( oy - diffy() ); drawObject( kpobject, screen, x_pos2, __h - y_pos2, 0, 0, 0, 0 ); if ( y_pos2 != 0 ) nothingHappens = false; xy.at( i )->setX( x_pos2 ); xy.at( i )->setY( __h - y_pos2 ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( 0 ); } break; case EF3_GO_LEFT_TOP: { x_pos1 = _step_width * _step < ox - diffx() + ow ? ox - diffx() + ow - _step_width * _step : 0; y_pos1 = _step_height * _step < oy - diffy() + oh ? oy - diffy() + oh - _step_height * _step : 0; drawObject( kpobject, screen, -( ox + ow - x_pos1 ), -( ( oy - diffy() ) + oh - y_pos1 ), 0, 0, 0, 0 ); if ( x_pos1 != 0 || y_pos1 != 0 ) nothingHappens = false; xy.at( i )->setX( -( ox + ow - x_pos1 ) ); xy.at( i )->setY( -( ( oy - diffy() ) + oh - y_pos1 ) ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( 0 ); } break; case EF3_GO_LEFT_BOTTOM: { x_pos1 = _step_width * _step < ox - diffx() + ow ? ox - diffx() + ow - _step_width * _step : 0; y_pos2 = _h - ( _step_height * _step ) + ( oy - diffy() ) > oy - diffy() ? _h - ( _step_height * _step ) : 0; int __h = kapp->desktop()->height() - ( oy - diffy() ); drawObject( kpobject, screen, -( ox + ow - x_pos1 ), __h - y_pos2, 0, 0, 0, 0 ); if ( x_pos1 != 0 || y_pos2 != 0 ) nothingHappens = false; xy.at( i )->setX( -( ox + ow - x_pos1 ) ); xy.at( i )->setY( __h - y_pos2 ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( 0 ); } break; case EF3_GO_RIGHT_TOP: { x_pos2 = _w - ( _step_width * _step ) + ( ox - diffx() ) > ox - diffx() ? _w - ( _step_width * _step ) : 0; y_pos1 = _step_height * _step < oy - diffy() + oh ? oy - diffy() + oh - _step_height * _step : 0; int __w = kapp->desktop()->width() - ox; drawObject( kpobject, screen, __w - x_pos2, -( ( oy - diffy() ) + oh - y_pos1 ), 0, 0, 0, 0 ); if ( x_pos2 != 0 || y_pos1 != 0 ) nothingHappens = false; xy.at( i )->setX( __w - x_pos2 ); xy.at( i )->setY( -( ( oy - diffy() ) + oh - y_pos1 ) ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( 0 ); } break; case EF3_GO_RIGHT_BOTTOM: { x_pos2 = _w - ( _step_width * _step ) + ( ox - diffx() ) > ox - diffx() ? _w - ( _step_width * _step ) : 0; y_pos2 = _h - ( _step_height * _step ) + ( oy - diffy() ) > oy - diffy() ? _h - ( _step_height * _step ) : 0; int __w = kapp->desktop()->width() - ox; int __h = kapp->desktop()->height() - ( oy - diffy() ); drawObject( kpobject, screen, __w - x_pos2, __h - y_pos2, 0, 0, 0, 0 ); if ( x_pos2 != 0 || y_pos2 != 0 ) nothingHappens = false; xy.at( i )->setX( __w - x_pos2 ); xy.at( i )->setY( __h - y_pos2 ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( 0 ); } break; case EF3_WIPE_LEFT: { if ( subPresStep == 0 || subPresStep != 0 && objectType == OT_TEXT && effect2 == EF2T_PARA ) { w_pos1 = _step_width * ( _step - 1 ); x_pos1 = w_pos1; drawObject( kpobject, screen, 0, 0, w_pos1, 0, x_pos1, 0 ); if ( ( _step_width * ( _steps1 - _step ) ) != 0 ) nothingHappens = false; xy.at( i )->setX( x_pos1 ); xy.at( i )->setY( 0 ); xy.at( i )->setWidth( w_pos1 ); xy.at( i )->setHeight( 0 ); } } break; case EF3_WIPE_RIGHT: { if ( subPresStep == 0 || subPresStep != 0 && objectType == OT_TEXT && effect2 == EF2T_PARA ) { w_pos1 = _step_width * ( _step - 1 ); drawObject( kpobject, screen, 0, 0, w_pos1, 0, 0, 0 ); if ( ( _step_width * ( _steps1 - _step ) ) != 0 ) nothingHappens = false; xy.at( i )->setX( 0 ); xy.at( i )->setY( 0 ); xy.at( i )->setWidth( w_pos1 ); xy.at( i )->setHeight( 0 ); } } break; case EF3_WIPE_TOP: { if ( subPresStep == 0 || subPresStep != 0 && objectType == OT_TEXT && effect2 == EF2T_PARA ) { h_pos1 = _step_height * ( _step - 1 ); y_pos1 = h_pos1; drawObject( kpobject, screen, 0, 0, 0, h_pos1, 0, y_pos1 ); if ( ( _step_height * ( _steps1 - _step ) ) != 0 ) nothingHappens = false; xy.at( i )->setX( 0 ); xy.at( i )->setY( y_pos1 ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( h_pos1 ); } } break; case EF3_WIPE_BOTTOM: { if ( subPresStep == 0 || subPresStep != 0 && objectType == OT_TEXT && effect2 == EF2T_PARA ) { h_pos1 = _step_height * ( _step - 1 ); drawObject( kpobject, screen, 0, 0, 0, h_pos1, 0, 0 ); if ( ( _step_height * ( _steps1 - _step ) ) != 0 ) nothingHappens = false; xy.at( i )->setX( 0 ); xy.at( i )->setY( 0 ); xy.at( i )->setWidth( 0 ); xy.at( i )->setHeight( h_pos1 ); } } break; default: break; } } } newRect.setRect( bx - ( diffx() - xy.at( i )->x() ), by - ( diffy() - xy.at( i )->y() ), bw - xy.at( i )->width(), bh - xy.at( i )->height() ); newRect = newRect.unite( oldRect ); bool append = true; for ( unsigned j = 0; j < changes.count(); j++ ) { if ( changes.at( j )->intersects( newRect ) ) { QRect r = changes.at( j )->intersect( newRect ); int s1 = r.width() * r.height(); int s2 = newRect.width() * newRect.height(); int s3 = changes.at( j )->width() * changes.at( j )->height(); if ( s1 > ( s2 / 100 ) * 50 || s1 > ( s3 / 100 ) * 50 ) { QRect rr = changes.at( j )->unite( newRect ); changes.at( j )->setRect( rr.x(), rr.y(), rr.width(), rr.height() ); append = false; } break; } } if ( append ) changes.append( new QRect( newRect ) ); } QRect *changed; for ( int i = 0; i < static_cast( changes.count() ); i++ ) { changed = changes.at( i ); bitBlt( this, changed->x(), changed->y(), screen, changed->x(), changed->y(), changed->width(), changed->height() ); } delete screen; screen = new QPixmap( screen_orig ); _time.restart(); } } } if ( !effects ) { //kdDebug(33001) << "KPrCanvas::doObjEffects no effects" << endl; QPainter p; p.begin( this ); p.drawPixmap( 0, 0, screen_orig ); drawObjects( &p, QRect( 0, 0, kapp->desktop()->width(), kapp->desktop()->height() ), false, SM_NONE, true ); p.end(); } else { //kdDebug(33001) << "KPrCanvas::doObjEffects effects" << endl; QPainter p; p.begin( screen ); drawObjects( &p, QRect( 0, 0, kapp->desktop()->width(), kapp->desktop()->height() ), false, SM_NONE, true ); p.end(); bitBlt( this, 0, 0, screen ); } if ( !spManualSwitch() && timer > 0 ) m_view->setCurrentTimer( timer ); delete screen; } void KPrCanvas::drawObject( KPObject *kpobject, QPixmap *screen, int _x, int _y, int _w, int _h, int _cx, int _cy ) { if ( kpobject->getDisappear() && kpobject->getDisappearNum() < static_cast( currPresStep ) ) return; int ox, oy, ow, oh; KoRect br = kpobject->getBoundingRect(); QRect brpix = m_view->zoomHandler()->zoomRect( br ); ox = brpix.x(); oy = brpix.y(); ow = brpix.width(); oh = brpix.height(); bool ownClipping = true; QPainter p; p.begin( screen ); if ( _w != 0 || _h != 0 ) { p.setClipping( true ); p.setClipRect( ox + _cx, oy + _cy, ow - _w, oh - _h, QPainter::CoordPainter ); ownClipping = false; } if ( !editMode && static_cast( currPresStep ) == kpobject->getPresNum() && !goingBack ) { kpobject->setSubPresStep( subPresStep ); kpobject->doSpecificEffects( true ); kpobject->setOwnClipping( ownClipping ); } p.translate(_x,_y); kpobject->draw( &p, m_view->zoomHandler(), SM_NONE, ( kpobject->isSelected()) && drawContour ); kpobject->setSubPresStep( 0 ); kpobject->doSpecificEffects( false ); kpobject->setOwnClipping( true ); KPObject *obj = 0; for ( unsigned int i = tmpObjs.findRef( kpobject ) +1 ; i < tmpObjs.count(); i++ ) { obj = tmpObjs.at( i ); if ( kpobject->getBoundingRect().intersects( obj->getBoundingRect() ) && obj->getPresNum() < static_cast( currPresStep ) ) obj->draw( &p, m_view->zoomHandler(), SM_NONE, (obj->isSelected()) && drawContour); } p.end(); } void KPrCanvas::print( QPainter *painter, KPrinter *printer, float /*left_margin*/, float /*top_margin*/ ) { //deSelectAllObj(); // already done in KPresenterView::setupPrinter printer->setFullPage( true ); int i = 0; repaint( false ); kapp->processEvents(); editMode = false; fillBlack = false; _presFakt = 1.0; //int _xOffset = diffx(); //int _yOffset = diffy(); currPresStep = 1000; subPresStep = 1000; //m_view->setDiffX( -static_cast( MM_TO_POINT( left_margin ) ) ); //m_view->setDiffY( -static_cast( MM_TO_POINT( top_margin ) ) ); QProgressDialog progress( i18n( "Printing..." ), i18n( "Cancel" ), printer->toPage() - printer->fromPage() + 2, this ); int j = 0; progress.setProgress( 0 ); /*if ( printer->fromPage() > 1 ) m_view->setDiffY( ( printer->fromPage() - 1 ) * ( getPageRect( 1, 1.0, false ).height() ) - (int)MM_TO_POINT( top_margin ) );*/ QValueList list=printer->pageList(); // 1-based QValueList::iterator it; for( it=list.begin();it!=list.end();++it) { i=(*it); progress.setProgress( ++j ); kapp->processEvents(); if ( progress.wasCancelled() ) break; currPresPage = i; if ( !list.isEmpty() && i > list.first() ) printer->newPage(); painter->resetXForm(); painter->fillRect( m_activePage->getZoomPageRect(), white ); printPage( painter, i - 1 ); kapp->processEvents(); painter->resetXForm(); kapp->processEvents(); /*m_view->setDiffY( i * ( getPageRect( 1, 1.0, false ).height() ) - static_cast( MM_TO_POINT( top_margin ) ) );*/ } KConfig *config=KPresenterFactory::global()->config(); config->setGroup("Misc"); bool printNotes = config->readBoolEntry("PrintNotes", true); NoteBar *noteBar = m_view->getNoteBar(); //don't print notes when there is no note to print or it's disabled if ( noteBar && !noteBar->getNotesTextForPrinting(list).isEmpty() && !progress.wasCancelled() && printNotes ) { printer->newPage(); painter->resetXForm(); noteBar->printNotes( painter, printer, list ); painter->resetXForm(); } setToolEditMode( toolEditMode ); //m_view->setDiffX( _xOffset ); //m_view->setDiffY( _yOffset ); progress.setProgress( printer->toPage() - printer->fromPage() + 2 ); currPresPage = 1; currPresStep = 0; subPresStep = 0; _presFakt = 1.0; fillBlack = true; editMode = true; repaint( false ); } KPTextObject* KPrCanvas::insertTextObject( const QRect& _r ) { QRect r(_r); r.moveBy(diffx(),diffy()); KoRect rect=m_view->zoomHandler()->unzoomRect(r); KPTextObject* obj = m_activePage->insertTextObject( rect ); selectObj( obj ); return obj; } void KPrCanvas::insertLineH( const QRect& _r, bool rev ) { QRect r(_r); r.moveBy(diffx(),diffy()); KoRect rect=m_view->zoomHandler()->unzoomRect(r); m_activePage->insertLine( rect, m_view->getPen(), !rev ? m_view->getLineBegin() : m_view->getLineEnd(), !rev ? m_view->getLineEnd() : m_view->getLineBegin(), LT_HORZ ); } void KPrCanvas::insertLineV( const QRect &_r, bool rev ) { QRect r(_r); r.moveBy(diffx(),diffy()); KoRect rect=m_view->zoomHandler()->unzoomRect(r); m_activePage->insertLine( rect, m_view->getPen(), !rev ? m_view->getLineBegin() : m_view->getLineEnd(), !rev ? m_view->getLineEnd() : m_view->getLineBegin(), LT_VERT ); } void KPrCanvas::insertLineD1( const QRect &_r, bool rev ) { QRect r(_r); r.moveBy(diffx(),diffy()); KoRect rect=m_view->zoomHandler()->unzoomRect(r); m_activePage->insertLine( rect, m_view->getPen(), !rev ? m_view->getLineBegin() : m_view->getLineEnd(), !rev ? m_view->getLineEnd() : m_view->getLineBegin(), LT_LU_RD ); } void KPrCanvas::insertLineD2( const QRect &_r, bool rev ) { QRect r(_r); r.moveBy(diffx(),diffy()); KoRect rect=m_view->zoomHandler()->unzoomRect(r); m_activePage->insertLine(rect, m_view->getPen(), !rev ? m_view->getLineBegin() : m_view->getLineEnd(), !rev ? m_view->getLineEnd() : m_view->getLineBegin(), LT_LD_RU ); } void KPrCanvas::insertRect( const QRect& _r ) { QRect r(_r); r.moveBy(diffx(),diffy()); KoRect rect=m_view->zoomHandler()->unzoomRect(r); m_activePage->insertRectangle( rect, m_view->getPen(), m_view->getBrush(), m_view->getFillType(), m_view->getGColor1(), m_view->getGColor2(), m_view->getGType(), m_view->getRndX(), m_view->getRndY(), m_view->getGUnbalanced(), m_view->getGXFactor(), m_view->getGYFactor() ); } void KPrCanvas::insertEllipse( const QRect &_r ) { QRect r(_r); r.moveBy(diffx(),diffy()); KoRect rect=m_view->zoomHandler()->unzoomRect(r); m_activePage->insertCircleOrEllipse( rect, m_view->getPen(), m_view->getBrush(), m_view->getFillType(), m_view->getGColor1(), m_view->getGColor2(), m_view->getGType(), m_view->getGUnbalanced(), m_view->getGXFactor(), m_view->getGYFactor() ); } void KPrCanvas::insertPie( const QRect &_r ) { QRect r(_r); r.moveBy(diffx(),diffy()); KoRect rect=m_view->zoomHandler()->unzoomRect(r); m_activePage->insertPie( rect, m_view->getPen(), m_view->getBrush(), m_view->getFillType(), m_view->getGColor1(), m_view->getGColor2(), m_view->getGType(), m_view->getPieType(), m_view->getPieAngle(), m_view->getPieLength(), m_view->getLineBegin(), m_view->getLineEnd(), m_view->getGUnbalanced(), m_view->getGXFactor(), m_view->getGYFactor() ); } void KPrCanvas::insertAutoform( const QRect &_r, bool rev ) { rev = false; QRect r(_r); r.moveBy(diffx(),diffy()); KoRect rect=m_view->zoomHandler()->unzoomRect(r); m_activePage->insertAutoform( rect, m_view->getPen(), m_view->getBrush(), !rev ? m_view->getLineBegin() : m_view->getLineEnd(), !rev ? m_view->getLineEnd() : m_view->getLineBegin(), m_view->getFillType(), m_view->getGColor1(), m_view->getGColor2(), m_view->getGType(), autoform, m_view->getGUnbalanced(), m_view->getGXFactor(), m_view->getGYFactor() ); } KPPartObject* KPrCanvas::insertObject( const QRect &_r ) { QRect r(_r); r.moveBy(diffx(),diffy()); KoRect rect=m_view->zoomHandler()->unzoomRect(r); KPPartObject *kpPartObject = m_activePage->insertObject( rect, partEntry ); return kpPartObject; } void KPrCanvas::insertFreehand( const KoPointArray &_pointArray ) { KoRect rect = _pointArray.boundingRect(); double ox = rect.x(); double oy = rect.y(); unsigned int index = 0; KoPointArray points( _pointArray ); KoPointArray tmpPoints; KoPointArray::ConstIterator it; for ( it = points.begin(); it != points.end(); ++it ) { KoPoint point = (*it); double tmpX = point.x() - ox ; double tmpY = point.y() - oy ; tmpPoints.putPoints( index, 1, tmpX,tmpY ); ++index; } rect.moveBy(m_view->zoomHandler()->unzoomItX(diffx()),m_view->zoomHandler()->unzoomItY(diffy())); m_activePage->insertFreehand( tmpPoints, rect, m_view->getPen(), m_view->getLineBegin(), m_view->getLineEnd() ); m_pointArray = KoPointArray(); m_indexPointArray = 0; } void KPrCanvas::insertPolyline( const KoPointArray &_pointArray ) { if( _pointArray.count()> 1) { KoRect rect = _pointArray.boundingRect(); double ox = rect.x(); double oy = rect.y(); unsigned int index = 0; KoPointArray points( _pointArray ); KoPointArray tmpPoints; KoPointArray::ConstIterator it; for ( it = points.begin(); it != points.end(); ++it ) { KoPoint point = (*it); double tmpX = point.x() - ox ; double tmpY = point.y() - oy ; tmpPoints.putPoints( index, 1, tmpX,tmpY ); ++index; } rect.moveBy(m_view->zoomHandler()->unzoomItX(diffx()),m_view->zoomHandler()->unzoomItY(diffy())); m_activePage->insertPolyline( tmpPoints, rect, m_view->getPen(), m_view->getLineBegin(), m_view->getLineEnd() ); } m_pointArray = KoPointArray(); m_indexPointArray = 0; } void KPrCanvas::insertCubicBezierCurve( const KoPointArray &_pointArray ) { if( _pointArray.count()> 1) { KoPointArray _points( _pointArray ); KoPointArray _allPoints; unsigned int pointCount = _points.count(); KoRect _rect; if ( pointCount == 2 ) { // line _rect = _points.boundingRect(); _allPoints = _points; } else { // cubic bezier curve KoPointArray tmpPointArray; unsigned int _tmpIndex = 0; unsigned int count = 0; while ( count < pointCount ) { if ( pointCount >= ( count + 4 ) ) { // for cubic bezier curve double _firstX = _points.at( count ).x(); double _firstY = _points.at( count ).y(); double _fourthX = _points.at( count + 1 ).x(); double _fourthY = _points.at( count + 1 ).y(); double _secondX = _points.at( count + 2 ).x(); double _secondY = _points.at( count + 2 ).y(); double _thirdX = _points.at( count + 3 ).x(); double _thirdY = _points.at( count + 3 ).y(); KoPointArray _cubicBezierPoint; _cubicBezierPoint.putPoints( 0, 4, _firstX,_firstY, _secondX,_secondY, _thirdX,_thirdY, _fourthX,_fourthY ); _cubicBezierPoint = _cubicBezierPoint.cubicBezier(); KoPointArray::ConstIterator it; for ( it = _cubicBezierPoint.begin(); it != _cubicBezierPoint.end(); ++it ) { KoPoint _point = (*it); tmpPointArray.putPoints( _tmpIndex, 1, _point.x(), _point.y() ); ++_tmpIndex; } count += 4; } else { // for line double _x1 = _points.at( count ).x(); double _y1 = _points.at( count ).y(); double _x2 = _points.at( count + 1 ).x(); double _y2 = _points.at( count + 1 ).y(); tmpPointArray.putPoints( _tmpIndex, 2, _x1,_y1, _x2,_y2 ); _tmpIndex += 2; count += 2; } } _rect = tmpPointArray.boundingRect(); _allPoints = tmpPointArray; } double ox = _rect.x(); double oy = _rect.y(); unsigned int index = 0; KoPointArray points( _pointArray ); KoPointArray tmpPoints; KoPointArray::ConstIterator it; for ( it = points.begin(); it != points.end(); ++it ) { KoPoint point = (*it); double tmpX = point.x() - ox; double tmpY = point.y() - oy; tmpPoints.putPoints( index, 1, tmpX,tmpY ); ++index; } index = 0; KoPointArray tmpAllPoints; for ( it = _allPoints.begin(); it != _allPoints.end(); ++it ) { KoPoint point = (*it); double tmpX = point.x() - ox ; double tmpY = point.y() - oy; tmpAllPoints.putPoints( index, 1, tmpX,tmpY ); ++index; } _rect.moveBy(m_view->zoomHandler()->unzoomItX(diffx()),m_view->zoomHandler()->unzoomItY(diffy())); if ( toolEditMode == INS_CUBICBEZIERCURVE ) m_activePage->insertCubicBezierCurve( tmpPoints, tmpAllPoints, _rect, m_view->getPen(), m_view->getLineBegin(), m_view->getLineEnd() ); else if ( toolEditMode == INS_QUADRICBEZIERCURVE ) m_activePage->insertQuadricBezierCurve( tmpPoints, tmpAllPoints, _rect, m_view->getPen(), m_view->getLineBegin(), m_view->getLineEnd() ); else if ( toolEditMode == INS_CLOSED_CUBICBEZIERCURVE || toolEditMode == INS_CLOSED_QUADRICBEZIERCURVE ) m_activePage->insertClosedLine( tmpAllPoints, _rect, m_view->getPen(), m_view->getBrush(), m_view->getFillType(), m_view->getGColor1(), m_view->getGColor2(), m_view->getGType(), m_view->getGUnbalanced(), m_view->getGXFactor(), m_view->getGYFactor(), toolEditMode ); } m_pointArray = KoPointArray(); m_indexPointArray = 0; } void KPrCanvas::insertPolygon( const KoPointArray &_pointArray ) { KoPointArray points( _pointArray ); KoRect rect= points.boundingRect(); double ox = rect.x(); double oy = rect.y(); unsigned int index = 0; KoPointArray tmpPoints; KoPointArray::ConstIterator it; for ( it = points.begin(); it != points.end(); ++it ) { KoPoint point = (*it); double tmpX = point.x() - ox; double tmpY = point.y() - oy; tmpPoints.putPoints( index, 1, tmpX,tmpY ); ++index; } rect.moveBy(m_view->zoomHandler()->unzoomItX(diffx()),m_view->zoomHandler()->unzoomItY(diffy())); m_activePage->insertPolygon( tmpPoints, rect, m_view->getPen(), m_view->getBrush(), m_view->getFillType(), m_view->getGColor1(), m_view->getGColor2(), m_view->getGType(), m_view->getGUnbalanced(), m_view->getGXFactor(), m_view->getGYFactor(), m_view->getCheckConcavePolygon(), m_view->getCornersValue(), m_view->getSharpnessValue() ); m_pointArray = KoPointArray(); m_indexPointArray = 0; } void KPrCanvas::insertPicture( const QRect &_r, const QPoint & tl ) { QString file = m_activePage->insPictureFile(); QCursor c = cursor(); setCursor( waitCursor ); if ( !file.isEmpty() ) { if (_r.isValid()) { QRect r( _r ); r.moveBy( diffx(), diffy() ); KoRect rect = m_view->zoomHandler()->unzoomRect( r ); m_activePage->insertPicture( file, rect ); } else { QPoint topleft(tl); topleft += QPoint(diffx(), diffy()); m_activePage->insertPicture(file, topleft.x(), topleft.y()); } m_activePage->setInsPictureFile( QString::null ); } setCursor( c ); } void KPrCanvas::insertClosedLine( const KoPointArray &_pointArray ) { KoPointArray points( _pointArray ); KoRect rect = points.boundingRect(); double ox = rect.x(); double oy = rect.y(); unsigned int index = 0; KoPointArray tmpPoints; KoPointArray::ConstIterator it; for ( it = points.begin(); it != points.end(); ++it ) { KoPoint point = (*it); double tmpX = point.x() - ox; double tmpY = point.y() - oy; tmpPoints.putPoints( index, 1, tmpX,tmpY ); ++index; } rect.moveBy( m_view->zoomHandler()->unzoomItX( diffx() ), m_view->zoomHandler()->unzoomItY( diffy() ) ); m_activePage->insertClosedLine( tmpPoints, rect, m_view->getPen(), m_view->getBrush(), m_view->getFillType(), m_view->getGColor1(), m_view->getGColor2(), m_view->getGType(), m_view->getGUnbalanced(), m_view->getGXFactor(), m_view->getGYFactor(), toolEditMode ); m_pointArray = KoPointArray(); m_indexPointArray = 0; } void KPrCanvas::setToolEditMode( ToolEditMode _m, bool updateView ) { //store m_pointArray if !m_pointArray.isNull() if ( ( toolEditMode == INS_POLYLINE || toolEditMode == INS_CLOSED_POLYLINE ) && !m_pointArray.isNull()) endDrawPolyline(); if ( ( toolEditMode == INS_CUBICBEZIERCURVE || toolEditMode == INS_QUADRICBEZIERCURVE || toolEditMode == INS_CLOSED_CUBICBEZIERCURVE || toolEditMode == INS_CLOSED_QUADRICBEZIERCURVE ) && !m_pointArray.isNull() ) endDrawCubicBezierCurve(); exitEditMode(); toolEditMode = _m; if ( toolEditMode == TEM_MOUSE ) { setCursor( arrowCursor ); QPoint pos=QCursor::pos(); KPObject *obj=m_activePage->getCursor( pos); if(obj) setCursor( obj->getCursor( pos, modType,m_view->kPresenterDoc() ) ); else { obj=stickyPage()->getCursor( pos ); if(obj) setCursor( obj->getCursor( pos, modType,m_view->kPresenterDoc() ) ); } } else if ( toolEditMode == INS_FREEHAND || toolEditMode == INS_CLOSED_FREEHAND ) setCursor( KPresenterUtils::penCursor() ); else if ( toolEditMode == TEM_ROTATE ) setCursor( KPresenterUtils::rotateCursor() ); else setCursor( crossCursor ); if ( updateView ) m_view->setTool( toolEditMode ); repaint(); } void KPrCanvas::endDrawPolyline() { m_drawPolyline = false; if ( toolEditMode == INS_POLYLINE ) insertPolyline( m_pointArray ); else if ( toolEditMode == INS_CLOSED_POLYLINE ) insertClosedLine( m_pointArray ); emit objectSelectedChanged(); if ( toolEditMode != TEM_MOUSE && editMode ) repaint( false ); mousePressed = false; modType = MT_NONE; resizeObjNum = 0L; ratio = 0.0; keepRatio = false; } void KPrCanvas::endDrawCubicBezierCurve() { m_drawCubicBezierCurve = false; m_oldCubicBezierPointArray = KoPointArray(); insertCubicBezierCurve( m_pointArray ); emit objectSelectedChanged(); if ( toolEditMode != TEM_MOUSE && editMode ) repaint( false ); mousePressed = false; modType = MT_NONE; resizeObjNum = 0L; ratio = 0.0; keepRatio = false; } void KPrCanvas::selectNext() { if ( objectList().count() == 0 ) return; if ( m_activePage->numSelected() == 0 ) objectList().at( 0 )->setSelected( true ); else { int i = objectList().findRef( m_activePage->getSelectedObj() ); if ( i < static_cast( objectList().count() ) - 1 ) { m_view->kPresenterDoc()->deSelectAllObj(); objectList().at( ++i )->setSelected( true ); } else { m_view->kPresenterDoc()->deSelectAllObj(); objectList().at( 0 )->setSelected( true ); } } QRect r = m_view->zoomHandler()->zoomRect( m_activePage->getSelectedObj()->getBoundingRect() ); if ( !QRect( diffx(), diffy(), width(), height() ).contains( r ) ) m_view->makeRectVisible( r ); _repaint( false ); } void KPrCanvas::selectPrev() { if ( objectList().count() == 0 ) return; if ( m_activePage->numSelected() == 0 ) objectList().at( objectList().count() - 1 )->setSelected( true ); else { int i = objectList().findRef( m_activePage->getSelectedObj() ); if ( i > 0 ) { m_view->kPresenterDoc()->deSelectAllObj(); objectList().at( --i )->setSelected( true ); } else { m_view->kPresenterDoc()->deSelectAllObj(); objectList().at( objectList().count() - 1 )->setSelected( true ); } } m_view->makeRectVisible( m_view->zoomHandler()->zoomRect(m_activePage->getSelectedObj()->getBoundingRect()) ); _repaint( false ); } void KPrCanvas::dragEnterEvent( QDragEnterEvent *e ) { if ( m_currentTextObjectView ) m_currentTextObjectView->dragEnterEvent( e ); else if ( QTextDrag::canDecode( e ) || QImageDrag::canDecode( e ) || KURLDrag::canDecode(e)) { e->accept(); } else e->ignore(); } void KPrCanvas::dragMoveEvent( QDragMoveEvent *e ) { if( m_currentTextObjectView) { KPTextObject * obj = textUnderMouse( e->pos()); bool emitChanged = false; if ( obj ) emitChanged = checkCurrentTextEdit( obj ); if ( m_currentTextObjectView ) { m_currentTextObjectView->dragMoveEvent( e, QPoint() ); if ( emitChanged ) emit currentObjectEditChanged(); } } else if ( QTextDrag::canDecode( e ) || QImageDrag::canDecode( e ) || KURLDrag::canDecode(e)) { e->accept(); } else e->ignore(); } void KPrCanvas::dropImage( QMimeSource * data, bool resizeImageToOriginalSize, int posX, int posY ) { setToolEditMode( TEM_MOUSE ); deSelectAllObj(); QImage pix; QImageDrag::decode( data, pix ); KTempFile tmpFile; tmpFile.setAutoDelete(true); if( tmpFile.status() != 0 ) return; pix.save( tmpFile.name(), "PNG" ); QCursor c = cursor(); setCursor( waitCursor ); m_activePage->insertPicture( tmpFile.name(), posX, posY ); tmpFile.close(); if ( resizeImageToOriginalSize ) picViewOriginalSize(); setCursor( c ); } void KPrCanvas::dropEvent( QDropEvent *e ) { //disallow dropping objects outside the "page" KoPoint docPoint = m_view->zoomHandler()->unzoomPoint( e->pos()+QPoint(diffx(),diffy()) ); if ( !m_activePage->getZoomPageRect().contains(e->pos())) return; if ( QImageDrag::canDecode( e ) ) { dropImage( e, true, e->pos().x(), e->pos().y() ); e->accept(); } else if ( KURLDrag::canDecode( e ) ) { setToolEditMode( TEM_MOUSE ); deSelectAllObj(); KURL::List lst; KURLDrag::decode( e, lst ); KURL::List::ConstIterator it = lst.begin(); for ( ; it != lst.end(); ++it ) { const KURL &url( *it ); QString filename; if ( !url.isLocalFile() ) { if ( !KIO::NetAccess::download( url, filename ) ) continue; } else { filename = url.path(); } KMimeMagicResult *res = KMimeMagic::self()->findFileType( filename ); if ( res && res->isValid() ) { QString mimetype = res->mimeType(); if ( mimetype.contains( "image" ) ) { QCursor c = cursor(); setCursor( waitCursor ); m_activePage->insertPicture( filename, e->pos().x(), e->pos().y() ); setCursor( c ); } else if ( mimetype.contains( "text" ) ) { QCursor c = cursor(); setCursor( waitCursor ); QFile f( filename ); QTextStream t( &f ); QString text = QString::null, tmp; if ( f.open( IO_ReadOnly ) ) { while ( !t.eof() ) { tmp = t.readLine(); tmp += "\n"; text.append( tmp ); } f.close(); } m_activePage->insertTextObject( m_view->zoomHandler()->unzoomRect(QRect( e->pos().x(), e->pos().y(), 250, 250 )), text, m_view ); setCursor( c ); } } KIO::NetAccess::removeTempFile( filename ); } } else if (m_currentTextObjectView) { m_currentTextObjectView->dropEvent( e ); } else if ( QTextDrag::canDecode( e ) ) { setToolEditMode( TEM_MOUSE ); deSelectAllObj(); QString text; QTextDrag::decode( e, text ); m_activePage->insertTextObject( m_view->zoomHandler()->unzoomRect( QRect( e->pos().x(), e->pos().y(), 250, 250 )), text, m_view ); e->accept(); } else e->ignore(); } void KPrCanvas::slotGotoPage() { setCursor( blankCursor ); int pg = currPresPage; m_view->setPresentationDuration( pg - 1 ); pg = KPGotoPage::gotoPage( m_view->kPresenterDoc(), slideList, pg, this ); gotoPage( pg ); if ( !spManualSwitch() ) { m_view->setCurrentTimer( 1 ); setNextPageTimer( true ); } if ( presMenu->isItemChecked ( PM_DM ) ) setCursor( KPresenterUtils::penCursor() ); } void KPrCanvas::gotoPage( int pg ) { if ( pg != static_cast( currPresPage ) ) { currPresPage = pg; kdDebug(33001) << "Page::gotoPage currPresPage=" << currPresPage << endl; slideListIterator = slideList.find( currPresPage ); editMode = false; drawMode = false; presStepList = m_view->kPresenterDoc()->reorderPage( currPresPage-1); currPresStep = *presStepList.begin(); subPresStep = 0; //change active page m_activePage=m_view->kPresenterDoc()->pageList().at(currPresPage-1); //recalculate the page numbers m_view->kPresenterDoc()->recalcPageNum(); #if KDE_IS_VERSION(3,1,90) QRect desk = KGlobalSettings::desktopGeometry(this); resize( desk.width(), desk.height() ); #else resize( QApplication::desktop()->screenGeometry(this).size()); #endif repaint( false ); setFocus(); m_view->refreshPageButton(); } } +void KPrCanvas::presGotoFirstPage() +{ + gotoPage( *slideList.begin() ); +} + KPTextObject* KPrCanvas::kpTxtObj() const { return ( ( editNum && editNum->getType() == OT_TEXT ) ? dynamic_cast( editNum ) : 0 ); // ### return m_currentTextObjectView->kpTextObject() } void KPrCanvas::copyObjs() { QDomDocument doc("DOC"); QDomElement presenter=doc.createElement("DOC"); presenter.setAttribute("editor", "KPresenter"); presenter.setAttribute("mime", "application/x-kpresenter"); doc.appendChild(presenter); QPtrList embeddedObjectsActivePage; QPtrList embeddedObjectsStickyPage; KoStoreDrag *kd = new KoStoreDrag( "application/x-kpresenter", 0L ); QDragObject* dragObject = kd; QByteArray arr; QBuffer buffer(arr); KoStore* store = KoStore::createStore( &buffer, KoStore::Write, "application/x-kpresenter" ); m_activePage->getAllEmbeddedObjectSelected(embeddedObjectsActivePage ); stickyPage()->getAllEmbeddedObjectSelected(embeddedObjectsStickyPage ); // Save internal embedded objects first, since it might change their URL int i = 0; QValueList savePictures; QPtrListIterator chl( embeddedObjectsActivePage ); for( ; chl.current(); ++chl ) { KoDocument* childDoc = chl.current()->document(); if ( childDoc && !childDoc->isStoredExtern() ) (void) childDoc->saveToStore( store, QString::number( i++ ) ); } QPtrListIterator chl2( embeddedObjectsStickyPage ); for( ; chl2.current(); ++chl2 ) { KoDocument* childDoc = chl2.current()->document(); if ( childDoc && !childDoc->isStoredExtern() ) (void) childDoc->saveToStore( store, QString::number( i++ ) ); } m_activePage->copyObjs(doc, presenter, savePictures); stickyPage()->copyObjs(doc, presenter, savePictures); KPresenterDoc* kprdoc = m_view->kPresenterDoc(); if ( !embeddedObjectsStickyPage.isEmpty() ) { kprdoc->saveEmbeddedObject(stickyPage(), embeddedObjectsStickyPage, doc, presenter ); } if ( !embeddedObjectsActivePage.isEmpty()) { kprdoc->saveEmbeddedObject(m_activePage, embeddedObjectsActivePage,doc,presenter); } if ( !savePictures.isEmpty() ) { // Save picture list at the end of the main XML presenter.appendChild( kprdoc->pictureCollection()->saveXML( KoPictureCollection::CollectionPicture, doc, savePictures ) ); // Save the actual picture data into the store kprdoc->pictureCollection()->saveToStore( KoPictureCollection::CollectionPicture, store, savePictures ); // Single image -> put it in dragobject too if ( savePictures.count() == 1 ) { KoPicture pic = kprdoc->pictureCollection()->findPicture( savePictures.first() ); QDragObject* picDrag = pic.dragObject( 0L ); if ( picDrag ) { KMultipleDrag* multipleDrag = new KMultipleDrag( 0L ); multipleDrag->addDragObject( kd ); multipleDrag->addDragObject( picDrag ); dragObject = multipleDrag; } } } if ( store->open( "root" ) ) { QCString s = doc.toCString(); // this is already Utf8! //kdDebug(33001) << "KPrCanvas::copyObject: " << s << endl; (void)store->write( s.data(), s.size()-1 ); store->close(); } delete store; kd->setEncodedData( arr ); QApplication::clipboard()->setData( dragObject, QClipboard::Clipboard ); } void KPrCanvas::deleteObjs() { KMacroCommand *macro=0L; KCommand *cmd=m_activePage->deleteObjs(); if( cmd) { if ( !macro ) macro=new KMacroCommand(i18n( "Delete Objects" )); macro->addCommand(cmd); } cmd=stickyPage()->deleteObjs(); if( cmd) { if ( !macro ) macro=new KMacroCommand(i18n( "Delete Objects" )); macro->addCommand(cmd); } m_view->kPresenterDoc()->deSelectAllObj(); if(macro) m_view->kPresenterDoc()->addCommand(macro); emit objectSelectedChanged(); setToolEditMode( toolEditMode ); } void KPrCanvas::rotateObjs() { m_view->extraRotate(); setToolEditMode( toolEditMode ); } void KPrCanvas::shadowObjs() { m_view->extraShadow(); setToolEditMode( toolEditMode ); } void KPrCanvas::enterEvent( QEvent *e ) { m_view->setRulerMousePos( ( ( QMouseEvent* )e )->x(), ( ( QMouseEvent* )e )->y() ); m_view->setRulerMouseShow( true ); } void KPrCanvas::leaveEvent( QEvent * /*e*/ ) { m_view->setRulerMouseShow( false ); } QPtrList KPrCanvas::objectList() const { return m_activePage->objectList(); } const QPtrList &KPrCanvas::getObjectList() const { return m_activePage->objectList(); } unsigned int KPrCanvas::currPgNum() const { return m_view->getCurrPgNum(); } QColor KPrCanvas::txtBackCol() const { return m_view->kPresenterDoc()->txtBackCol(); } bool KPrCanvas::spInfiniteLoop() const { return m_view->kPresenterDoc()->spInfiniteLoop(); } bool KPrCanvas::spManualSwitch() const { return m_view->kPresenterDoc()->spManualSwitch(); } QRect KPrCanvas::getPageRect( bool decBorders ) const { return m_view->kPresenterDoc()->getPageRect( decBorders ); } unsigned int KPrCanvas::pageNums() const { return m_view->kPresenterDoc()->getPageNums(); } float KPrCanvas::objSpeedFakt() const { /* Used to be 0(slow)->70, 1(medium)->50, 2(fast)->30. It's now 0->75, 1->50, 2->37, etc. That's the reason for this strange formula :) */ return 150.0 / static_cast( m_view->kPresenterDoc()->getPresSpeed() + 2 ); //return ObjSpeed[ static_cast( m_view->kPresenterDoc()->getPresSpeed() ) ]; } float KPrCanvas::pageSpeedFakt() const { /* Used to be 0(slow)->8, 1(medium)->16, 2(fast)->32. It's now 0->10, 1->20, 2->30, 3->40, 4->50...... */ return 10.0 * ( m_view->kPresenterDoc()->getPresSpeed() + 1 ); //return PageSpeed[ static_cast( m_view->kPresenterDoc()->getPresSpeed() ) ]; } void KPrCanvas::_repaint( bool /*erase*/ ) { m_view->kPresenterDoc()->repaint( false ); } void KPrCanvas::_repaint( const QRect &r ) { m_view->kPresenterDoc()->repaint( r ); } void KPrCanvas::_repaint( KPObject *o ) { m_view->kPresenterDoc()->repaint( o ); } void KPrCanvas::slotExitPres() { m_view->screenStop(); } void KPrCanvas::drawingMode() { setCursor( KPresenterUtils::penCursor() ); if(!presMenu->isItemChecked ( PM_DM )) { presMenu->setItemChecked( PM_DM, true ); presMenu->setItemChecked( PM_SM, false ); drawMode = true; //setCursor( KPresenterUtils::penCursor() ); } } void KPrCanvas::switchingMode() { if(!presMenu->isItemChecked ( PM_SM )) { presMenu->setItemChecked( PM_DM, false ); presMenu->setItemChecked( PM_SM, true ); drawMode = false; setCursor( blankCursor ); if ( !spManualSwitch() ) m_view->autoScreenPresIntervalTimer(); } } void KPrCanvas::calcRatio( double &dx, double &dy, ModifyType _modType, double ratio ) const { if ( fabs( dy ) > fabs( dx ) ) { if ( _modType == MT_RESIZE_LD || _modType == MT_RESIZE_RU ) dx = ( dy ) * -ratio ; else dx = ( dy ) * ratio ; } else { if ( _modType == MT_RESIZE_LD || _modType == MT_RESIZE_RU ) dy = -dx / ratio; else dy = dx / ratio; } } void KPrCanvas::exitEditMode() { if ( editNum ) { if ( editNum->getType() == OT_TEXT ) { if(m_currentTextObjectView) { m_currentTextObjectView->clearSelection(); //hide cursor when we desactivate textObjectView m_currentTextObjectView->drawCursor( false ); m_currentTextObjectView->terminate(); KPTextObject *kpTextObj = m_currentTextObjectView->kpTextObject(); kpTextObj->setEditingTextObj( false ); delete m_currentTextObjectView; m_currentTextObjectView=0L; _repaint( static_cast( kpTextObj ) ); } // Title of slide may have changed emit updateSideBarItem( currPgNum()-1 ); emit objectSelectedChanged(); editNum=0L; } else if (editNum->getType() == OT_PART ) { static_cast(editNum)->deactivate(); _repaint( editNum ); editNum=0L; return; } } } bool KPrCanvas::getPixmapOrigAndCurrentSize( KPPixmapObject *&obj, KoSize *origSize, KoSize *currentSize ) { *origSize = KoSize(obj->originalSize().width(),obj->originalSize().height()); *currentSize = obj->getSize(); return true; } void KPrCanvas::picViewOriginalSize() { picViewOrigHelper( -1, -1 ); } void KPrCanvas::picViewOrig640x480() { picViewOrigHelper(640, 480); } void KPrCanvas::picViewOrig800x600() { picViewOrigHelper(800, 600); } void KPrCanvas::picViewOrig1024x768() { picViewOrigHelper(1024, 768); } void KPrCanvas::picViewOrig1280x1024() { picViewOrigHelper(1280, 1024); } void KPrCanvas::picViewOrig1600x1200() { picViewOrigHelper(1600, 1200); } void KPrCanvas::picViewOrigHelper(int x, int y) { KPPixmapObject *obj = 0; KoSize origSize; KoSize currentSize; obj=m_activePage->picViewOrigHelper(); if (!obj) obj=stickyPage()->picViewOrigHelper(); if ( obj && !getPixmapOrigAndCurrentSize( obj, &origSize, ¤tSize ) ) return; KoSize pgSize = m_activePage->getPageRect().size(); if ( x == -1 && y == -1 ) { x = (int)origSize.width(); y = (int)origSize.height(); } QSize presSize( x, y ); scalePixmapToBeOrigIn( currentSize, pgSize, presSize, obj ); } void KPrCanvas::picViewOrigFactor() { } void KPrCanvas::scalePixmapToBeOrigIn( const KoSize ¤tSize, const KoSize &pgSize, const QSize &presSize, KPPixmapObject *obj ) { #if KDE_IS_VERSION(3,1,90) QRect desk = KGlobalSettings::desktopGeometry(this); double faktX = (double)presSize.width() / (double)desk.width(); double faktY = (double)presSize.height() / (double)desk.height(); #else double faktX = (double)presSize.width() / (double)QApplication::desktop()->screenGeometry(this).width(); double faktY = (double)presSize.height() / (double)QApplication::desktop()->screenGeometry(this).height(); #endif double w = pgSize.width() * faktX; double h = pgSize.height() * faktY; ResizeCmd *resizeCmd = new ResizeCmd( i18n( "Scale Picture to be Shown 1:1 in Presentation Mode" ), KoPoint( 0, 0 ), KoSize( w - currentSize.width(), h - currentSize.height() ), obj, m_view->kPresenterDoc() ); resizeCmd->execute(); m_view->kPresenterDoc()->addCommand( resizeCmd ); } void KPrCanvas::setTextBackground( KPTextObject */*obj*/ ) { // This is called when double-clicking on a text object. // What should happen exactly ? (DF) #if 0 QPixmap pix( m_activePage->getZoomPageRect().size() ); QPainter painter( &pix ); m_activePage->background()->draw( &painter, FALSE ); QPixmap bpix( obj->getSize().toQSize() ); // ## zoom it ! bitBlt( &bpix, 0, 0, &pix, obj->getOrig().x(), obj->getOrig().y() - m_activePage->getZoomPageRect().height() * ( m_view->getCurrPgNum() - 1 ), bpix.width(), bpix.height() ); QBrush b( white, bpix ); QPalette pal( obj->textObjectView()->palette() ); pal.setBrush( QColorGroup::Base, b ); obj->textObjectView()->setPalette( pal ); #endif } QValueList KPrCanvas::pages(const QString &range) const { if(range.isEmpty()) return QValueList (); QValueList list; int start=-1; int end=range.find(','); bool ok=true; QString tmp; while(end!=-1 && start!=end && ok) { tmp=range.mid(start+1, end-start-1); ok=pagesHelper(tmp, list); start=range.find(',', end); end=range.find(',', start+1); } pagesHelper(range.mid(start+1), list); return list; } bool KPrCanvas::pagesHelper(const QString &chunk, QValueList &list) const { bool ok=true; int mid=chunk.find('-'); if(mid!=-1) { int start=chunk.left(mid).toInt(&ok); int end=chunk.mid(mid+1).toInt(&ok); while(ok && start<=end) list.append(start++); } else list.append(chunk.toInt(&ok)); return ok; } void KPrCanvas::moveObject( int x, int y, bool key ) { double newPosX=m_view->zoomHandler()->unzoomItX(x); double newPosY=m_view->zoomHandler()->unzoomItY(y); KoRect boundingRect = m_boundingRect; m_boundingRect = m_origBRect; KoPoint point( m_boundingRect.topLeft() ); KoRect pageRect=m_activePage->getPageRect(); point.setX( m_boundingRect.x()+newPosX ); m_boundingRect.moveTopLeft( point ); if ( ( boundingRect.left()+m_hotSpot.x() < pageRect.left() ) || ( m_boundingRect.left() < pageRect.left() ) ) { point.setX( pageRect.left() ); m_boundingRect.moveTopLeft( point ); } else if ( ( boundingRect.left()+m_hotSpot.x() > pageRect.width() ) || ( m_boundingRect.right() > pageRect.width() ) ) { point.setX( pageRect.width()-m_boundingRect.width() ); m_boundingRect.moveTopLeft( point ); } point = m_boundingRect.topLeft(); point.setY( m_boundingRect.y()+newPosY ); m_boundingRect.moveTopLeft( point ); if ( ( boundingRect.top()+m_hotSpot.y() < pageRect.top() ) || ( m_boundingRect.top() < pageRect.top() ) ) { point.setY( pageRect.top() ); m_boundingRect.moveTopLeft( point ); } else if( ( boundingRect.top()+m_hotSpot.y() > pageRect.height() ) || ( m_boundingRect.bottom() > pageRect.height() ) ) { point.setY( pageRect.height() - m_boundingRect.height() ); m_boundingRect.moveTopLeft( point ); } point = applyGrid(m_boundingRect.topLeft()); m_boundingRect.moveTopLeft(point); if( m_boundingRect.topLeft() == boundingRect.topLeft() ) return; // nothing happende (probably due to the grid) scrollCanvas(boundingRect); KoPoint _move=m_boundingRect.topLeft()-boundingRect.topLeft(); KMacroCommand *macro=0L; KCommand *cmd=m_activePage->moveObject(m_view,_move,key); if( cmd && key) { if ( !macro) macro=new KMacroCommand(i18n( "Move Objects" )); macro->addCommand(cmd); } cmd=stickyPage()->moveObject(m_view,_move,key); if( cmd && key) { if ( !macro) macro=new KMacroCommand(i18n( "Move Objects" )); macro->addCommand(cmd); } if(macro) m_view->kPresenterDoc()->addCommand(macro); } void KPrCanvas::resizeObject( ModifyType _modType, int _dx, int _dy ) { double dx = m_view->zoomHandler()->unzoomItX( _dx); double dy = m_view->zoomHandler()->unzoomItY( _dy); KPObject *kpobject=resizeObjNum; //keepRatio = keepRatio || kpobject->isKeepRatio(); KoSize objSize = kpobject->getSize(); KoRect objRect=kpobject->getBoundingRect(); KoRect pageRect=m_activePage->getPageRect(); QPainter p; p.begin( this ); kpobject->moveBy(m_view->zoomHandler()->unzoomItX(-diffx()),m_view->zoomHandler()->unzoomItY(-diffy())); kpobject->draw( &p, m_view->zoomHandler(), SM_MOVERESIZE, (kpobject->isSelected()) && drawContour); switch ( _modType ) { case MT_RESIZE_LU: { // let the edge of the page be on the grid, this makes it // also possible to resize a object which is close to the edge if( (objRect.left() + dx) < (pageRect.left() - 1) ) dx = pageRect.left() - objRect.left(); if( (objRect.top() + dy) < (pageRect.top() - 1) ) dy = pageRect.top() - objRect.top(); // align to the grid dx = applyGridX( objRect.left() + dx ) - objRect.left(); dy = applyGridY( objRect.top() + dy ) - objRect.top(); if ( keepRatio && ratio != 0.0 ) calcRatio( dx, dy, _modType, ratio ); kpobject->resizeBy( -dx, -dy ); if ( objSize.width() != (kpobject->getSize()).width() ) kpobject->moveBy( KoPoint( dx, 0 ) ); if ( objSize.height() != (kpobject->getSize()).height() ) kpobject->moveBy( KoPoint( 0, dy ) ); } break; case MT_RESIZE_LF: { dy = 0; if( (objRect.left() + dx) < (pageRect.left() - 1)) dx = pageRect.left() - objRect.left(); dx = applyGridX( objRect.left() + dx ) - objRect.left(); if ( keepRatio && ratio != 0.0 ) calcRatio( dx, dy, _modType, ratio ); kpobject->resizeBy( -dx, -dy ); if ( objSize != kpobject->getSize() ) kpobject->moveBy( KoPoint( dx, 0 ) ); } break; case MT_RESIZE_LD: { if( (objRect.bottom() + dy) > pageRect.height()) dy = pageRect.bottom() - objRect.bottom(); if( (objRect.left() + dx) < (pageRect.left() - 1) ) dx = pageRect.left() - objRect.left(); dx = applyGridX( objRect.left() + dx ) - objRect.left(); dy = applyGridY( objRect.bottom() + dy ) - objRect.bottom(); if ( keepRatio && ratio != 0.0 ) calcRatio( dx, dy, _modType, ratio ); kpobject->resizeBy( -dx, dy ); if ( objSize.width() != (kpobject->getSize()).width() ) kpobject->moveBy( KoPoint( dx, 0 ) ); } break; case MT_RESIZE_RU: { if( (objRect.right() + dx) > pageRect.width() ) dx = pageRect.right() - objRect.right(); if( (objRect.top() + dy) < (pageRect.top() - 1) ) dy = pageRect.top() - objRect.top(); dx = applyGridX( objRect.right() + dx ) - objRect.right(); dy = applyGridY( objRect.top() + dy ) - objRect.top(); if ( keepRatio && ratio != 0.0 ) calcRatio( dx, dy, _modType, ratio ); kpobject->resizeBy( dx, -dy ); if ( objSize.height() != (kpobject->getSize()).height() ) kpobject->moveBy( KoPoint( 0, dy ) ); } break; case MT_RESIZE_RT: { dy = 0; if( (objRect.right() + dx) > pageRect.width() ) dx = pageRect.right() - objRect.right(); dx = applyGridX( objRect.right() + dx ) - objRect.right(); if ( keepRatio && ratio != 0.0 ) calcRatio( dx, dy, _modType, ratio ); kpobject->resizeBy( dx, dy ); } break; case MT_RESIZE_RD: { if( (objRect.bottom() + dy) > pageRect.height() ) dy = pageRect.bottom() - objRect.bottom(); if( (objRect.right() + dx) > pageRect.width() ) dx = pageRect.right() - objRect.right(); dx = applyGridX( objRect.right() + dx ) - objRect.right(); dy = applyGridY( objRect.bottom() + dy ) - objRect.bottom(); if ( keepRatio && ratio != 0.0 ) calcRatio( dx, dy, _modType, ratio ); kpobject->resizeBy( dx, dy ); } break; case MT_RESIZE_UP: { dx = 0; if( (objRect.top() + dy) < (pageRect.top() - 1) ) dy = pageRect.top() - objRect.top(); dy = applyGridY( objRect.top() + dy) - objRect.top(); if ( keepRatio && ratio != 0.0 ) calcRatio( dx, dy, _modType, ratio ); kpobject->resizeBy( -dx, -dy ); if ( objSize != kpobject->getSize() ) kpobject->moveBy( KoPoint( 0, dy ) ); } break; case MT_RESIZE_DN: { dx = 0; if( (objRect.bottom() + dy) > pageRect.height() ) dy = pageRect.bottom() - objRect.bottom(); dy = applyGridY( objRect.bottom() + dy ) - objRect.bottom(); if ( keepRatio && ratio != 0.0 ) calcRatio( dx, dy, _modType, ratio ); kpobject->resizeBy( dx, dy ); } break; default: break; } kpobject->draw( &p, m_view->zoomHandler(), SM_MOVERESIZE, (kpobject->isSelected()) && drawContour ); kpobject->moveBy(m_view->zoomHandler()->unzoomItX(diffx()),m_view->zoomHandler()->unzoomItY(diffy())); p.end(); _repaint( oldBoundingRect ); _repaint( kpobject ); emit objectSizeChanged(); oldBoundingRect = getOldBoundingRect(kpobject); } void KPrCanvas::raiseObject( KPObject *_kpobject ) { if( objectList().count() <= 1 ) return; if ( selectedObjectPosition == -1 ) { if ( m_activePage->numSelected() == 1 ) { // execute this if user selected is one object. QPtrList _list = objectList(); _list.setAutoDelete( false ); if ( _kpobject->isSelected() ) { selectedObjectPosition = objectList().findRef( _kpobject ); _list.take( selectedObjectPosition ); _list.append( _kpobject ); } m_activePage->setObjectList( _list ); } else selectedObjectPosition = -1; } } void KPrCanvas::lowerObject() { if( objectList().count() <= 1 || (int)objectList().count() <= selectedObjectPosition ) return; KPObject *kpobject = objectList().last(); QPtrList _list = objectList(); _list.setAutoDelete( false ); if ( kpobject->isSelected() ) { _list.take( _list.count() - 1 ); if ( objectList().findRef( kpobject ) != -1 ) _list.insert( selectedObjectPosition, kpobject ); } m_activePage->setObjectList( _list ); } void KPrCanvas::playSound( const QString &soundFileName ) { if(soundPlayer) delete soundPlayer; soundPlayer = new KPresenterSoundPlayer( soundFileName ); soundPlayer->play(); } void KPrCanvas::stopSound() { if ( soundPlayer ) { soundPlayer->stop(); delete soundPlayer; soundPlayer = 0; } } void KPrCanvas::setXimPosition( int x, int y, int w, int h, QFont *f ) { QWidget::setMicroFocusHint( x - diffx(), y - diffy(), w, h, true, f ); } void KPrCanvas::createEditing( KPTextObject *textObj ) { if( m_currentTextObjectView) { m_currentTextObjectView->terminate(); delete m_currentTextObjectView; m_currentTextObjectView = 0L; editNum = 0L; } m_currentTextObjectView=textObj->createKPTextView( this ); editNum=textObj; } void KPrCanvas::terminateEditing( KPTextObject *textObj ) { if ( m_currentTextObjectView && m_currentTextObjectView->kpTextObject() == textObj ) { m_currentTextObjectView->terminate(); delete m_currentTextObjectView; m_currentTextObjectView = 0L; editNum = 0L; } } void KPrCanvas::drawCubicBezierCurve( int _dx, int _dy ) { QPoint oldEndPoint = m_dragEndPoint; m_dragEndPoint = QPoint( _dx, _dy ); unsigned int pointCount = m_pointArray.count(); QPainter p( this ); if ( !m_drawLineWithCubicBezierCurve ) { QPen _pen = QPen( Qt::black, 1, Qt::DashLine ); p.setPen( _pen ); p.setBrush( Qt::NoBrush ); p.setRasterOp( Qt::NotROP ); p.save(); double _angle = KoPoint::getAngle( oldEndPoint, m_dragStartPoint ); drawFigure( L_SQUARE, &p, m_view->zoomHandler()->unzoomPoint( oldEndPoint ), _pen.color(), _pen.width(), _angle,m_view->zoomHandler() ); // erase old figure p.restore(); p.drawLine( m_dragStartPoint, oldEndPoint ); // erase old line int p_x = m_dragStartPoint.x() * 2 - oldEndPoint.x(); int p_y = m_dragStartPoint.y() * 2 - oldEndPoint.y(); m_dragSymmetricEndPoint = QPoint( p_x, p_y ); p.save(); _angle = KoPoint::getAngle( m_dragSymmetricEndPoint, m_dragStartPoint ); drawFigure( L_SQUARE, &p, m_view->zoomHandler()->unzoomPoint( m_dragSymmetricEndPoint ), _pen.color(), _pen.width(), _angle,m_view->zoomHandler() ); // erase old figure p.restore(); p.drawLine( m_dragStartPoint, m_dragSymmetricEndPoint ); // erase old line p.save(); _angle = KoPoint::getAngle( m_dragEndPoint, m_dragStartPoint ); drawFigure( L_SQUARE, &p, m_view->zoomHandler()->unzoomPoint( m_dragEndPoint ), _pen.color(), _pen.width(), _angle,m_view->zoomHandler() ); // draw new figure p.restore(); p.drawLine( m_dragStartPoint, m_dragEndPoint ); // draw new line p_x = m_dragStartPoint.x() * 2 - m_dragEndPoint.x(); p_y = m_dragStartPoint.y() * 2 - m_dragEndPoint.y(); m_dragSymmetricEndPoint = QPoint( p_x, p_y ); p.save(); _angle = KoPoint::getAngle( m_dragSymmetricEndPoint, m_dragStartPoint ); drawFigure( L_SQUARE, &p, m_view->zoomHandler()->unzoomPoint( m_dragSymmetricEndPoint ), _pen.color(), _pen.width(), _angle,m_view->zoomHandler() ); // draw new figure p.restore(); p.drawLine( m_dragStartPoint, m_dragSymmetricEndPoint ); // draw new line } else if ( m_drawLineWithCubicBezierCurve ) { p.setPen( QPen( Qt::black, 1, Qt::SolidLine ) ); p.setBrush( Qt::NoBrush ); p.setRasterOp( Qt::NotROP ); QPoint startPoint( m_view->zoomHandler()->zoomItX( m_pointArray.at( m_indexPointArray - 1 ).x() ), m_view->zoomHandler()->zoomItY( m_pointArray.at( m_indexPointArray - 1 ).y() ) ); p.drawLine( startPoint, oldEndPoint ); // erase old line p.drawLine( startPoint, m_dragEndPoint ); // draw new line } if ( !m_drawLineWithCubicBezierCurve && ( ( pointCount % 2 ) == 0 ) ) { p.save(); p.setPen( QPen( Qt::black, 1, Qt::SolidLine ) ); p.setBrush( Qt::NoBrush ); p.setRasterOp( Qt::NotROP ); // erase old cubic bezier curve p.drawCubicBezier( m_oldCubicBezierPointArray.zoomPointArray( m_view->zoomHandler() ) ); double _firstX = m_pointArray.at( m_indexPointArray - 2 ).x(); double _firstY = m_pointArray.at( m_indexPointArray - 2 ).y(); double _fourthX = m_pointArray.at( m_indexPointArray - 1 ).x(); double _fourthY = m_pointArray.at( m_indexPointArray - 1 ).y(); double _midpointX = (_firstX + _fourthX ) / 2; double _midpointY = (_firstY + _fourthY ) / 2; double _diffX = _fourthX - _midpointX; double _diffY = _fourthY - _midpointY; double _secondX = m_view->zoomHandler()->unzoomItX( m_dragEndPoint.x() ) - _diffX; double _secondY = m_view->zoomHandler()->unzoomItY( m_dragEndPoint.y() ) - _diffY; m_CubicBezierSecondPoint = KoPoint( _secondX, _secondY ); double _thirdX = m_view->zoomHandler()->unzoomItX( m_dragSymmetricEndPoint.x() ) - _diffX; double _thirdY = m_view->zoomHandler()->unzoomItY( m_dragSymmetricEndPoint.y() ) - _diffY; m_CubicBezierThirdPoint = KoPoint( _thirdX, _thirdY ); if ( toolEditMode == INS_QUADRICBEZIERCURVE || toolEditMode == INS_CLOSED_QUADRICBEZIERCURVE ) { _secondX = _thirdX; _secondY = _thirdY; m_CubicBezierSecondPoint = KoPoint( _secondX, _secondY ); } KoPointArray points; points.putPoints( 0, 4, _firstX,_firstY, _secondX,_secondY, _thirdX,_thirdY, _fourthX,_fourthY ); // draw new cubic bezier curve p.drawCubicBezier( points.zoomPointArray( m_view->zoomHandler() ) ); m_oldCubicBezierPointArray = points; p.restore(); } p.end(); } void KPrCanvas::drawPolygon( const KoPoint &startPoint, const KoPoint &endPoint ) { bool checkConcavePolygon = m_view->getCheckConcavePolygon(); int cornersValue = m_view->getCornersValue(); int sharpnessValue = m_view->getSharpnessValue(); QPainter p; p.begin( this ); p.setPen( QPen( Qt::black, 1, Qt::SolidLine ) ); p.setRasterOp( Qt::NotROP ); double angle = 2 * M_PI / cornersValue; double dx = QABS( startPoint.x () - endPoint.x () ); double dy = QABS( startPoint.y () - endPoint.y () ); double radius = ( dx > dy ? dx / 2.0 : dy / 2.0 ); //xoff / yoff : coordinate of centre of the circle. double xoff = startPoint.x() + ( startPoint.x() < endPoint.x() ? radius : -radius ); double yoff = startPoint.y() + ( startPoint.y() < endPoint.y() ? radius : -radius ); KoPointArray points( checkConcavePolygon ? cornersValue * 2 : cornersValue ); points.setPoint( 0, xoff, -radius + yoff ); if ( checkConcavePolygon ) { angle = angle / 2.0; double a = angle; double r = radius - ( sharpnessValue / 100.0 * radius ); for ( int i = 1; i < cornersValue * 2; ++i ) { double xp, yp; if ( i % 2 ) { xp = r * sin( a ); yp = -r * cos( a ); } else { xp = radius * sin( a ); yp = -radius * cos( a ); } a += angle; points.setPoint( i, xp + xoff, yp + yoff ); } } else { double a = angle; for ( int i = 1; i < cornersValue; ++i ) { double xp = radius * sin( a ); double yp = -radius * cos( a ); a += angle; points.setPoint( i, xp + xoff, yp + yoff ); } } p.drawPolygon( points.zoomPointArray( m_view->zoomHandler() ) ); p.end(); m_pointArray = points; } bool KPrCanvas::oneObjectTextSelected() const { return m_activePage->oneObjectTextSelected() || stickyPage()->oneObjectTextSelected(); } bool KPrCanvas::oneObjectTextExist() const { return m_activePage->oneObjectTextExist() || stickyPage()->oneObjectTextExist(); } KPrPage* KPrCanvas::activePage() const { return m_activePage; } void KPrCanvas::setActivePage( KPrPage* active ) { Q_ASSERT(active); //kdDebug(33001)<<"KPrCanvas::setActivePage( KPrPage* active) :"<kPresenterDoc()->recalcPageNum(); } //return true if object is a header/footer hidden bool KPrCanvas::objectIsAHeaderFooterHidden(KPObject *obj) const { if ((obj==m_view->kPresenterDoc()->header() && !m_view->kPresenterDoc()->hasHeader()) || (obj==m_view->kPresenterDoc()->footer() && !m_view->kPresenterDoc()->hasFooter())) return true; return false; } int KPrCanvas::numberOfObjectSelected() const { int nb=activePage()->numSelected(); nb+=stickyPage()->numSelected(); return nb; } KPObject *KPrCanvas::getSelectedObj() const { KPObject *obj=activePage()->getSelectedObj(); if(obj) return obj; obj=stickyPage()->getSelectedObj(); return obj; } int KPrCanvas::getPenBrushFlags() const { int flags=0; flags=activePage()->getPenBrushFlags(activePage()->objectList()); flags=flags |stickyPage()->getPenBrushFlags(stickyPage()->objectList()); if(flags==0) flags = StyleDia::SdAll; return flags; } void KPrCanvas::ungroupObjects() { KMacroCommand *macro = new KMacroCommand(i18n( "Ungroup Objects" )); KCommand *cmd = m_activePage->ungroupObjects(); if ( cmd ) { macro = new KMacroCommand(i18n( "Ungroup Objects" )); macro->addCommand( cmd ); } cmd = stickyPage()->ungroupObjects(); if ( cmd ) { if ( !macro) macro = new KMacroCommand(i18n( "Ungroup Objects" )); macro->addCommand( cmd ); } if ( macro ) m_view->kPresenterDoc()->addCommand( macro ); } void KPrCanvas::groupObjects() { m_activePage->groupObjects(); stickyPage()->groupObjects(); } KPrPage *KPrCanvas::stickyPage() const { return m_view->kPresenterDoc()->stickyPage(); } void KPrCanvas::scrollTopLeftPoint( const QPoint & pos ) { m_view->getHScrollBar()->setValue( pos.x() ); m_view->getVScrollBar()->setValue( pos.y() ); } void KPrCanvas::scrollCanvas(const KoRect & oldPos) { QRect rect = m_view->zoomHandler()->zoomRect( oldPos ); KoRect visiblePage = m_view->zoomHandler()->unzoomRect( visibleRect() ); double tmpdiffx = m_view->zoomHandler()->unzoomItX( diffx() ); double tmpdiffy = m_view->zoomHandler()->unzoomItY( diffy() ); if( m_boundingRect.bottom() > ( visiblePage.bottom() + tmpdiffy ) ) { m_view->kPresenterDoc()->repaint( rect ); int y = m_view->zoomHandler()->zoomItY( m_boundingRect.bottom() ) - m_view->zoomHandler()->zoomItY( visiblePage.bottom() + tmpdiffy ); m_view->getVScrollBar()->setValue( m_view->getVScrollBar()->value() + y ); } else if( m_boundingRect.top() < visiblePage.top() + tmpdiffy ) { m_view->kPresenterDoc()->repaint( rect ); int y = m_view->zoomHandler()->zoomItY( visiblePage.top() + tmpdiffy ) - m_view->zoomHandler()->zoomItY( m_boundingRect.top() ); m_view->getVScrollBar()->setValue( m_view->getVScrollBar()->value() - y ); } if( m_boundingRect.left() < ( visiblePage.left() + tmpdiffx ) ) { m_view->kPresenterDoc()->repaint( rect ); int x = m_view->zoomHandler()->zoomItX( visiblePage.left() + tmpdiffx ) - m_view->zoomHandler()->zoomItX( m_boundingRect.left() ); m_view->getHScrollBar()->setValue( m_view->getHScrollBar()->value() - x ); } else if ( m_boundingRect.right() > ( visiblePage.right() + tmpdiffx ) ) { m_view->kPresenterDoc()->repaint( rect ); int x = m_view->zoomHandler()->zoomItX( m_boundingRect.right() ) - m_view->zoomHandler()->zoomItX( visiblePage.right() + tmpdiffx ); m_view->getHScrollBar()->setValue( m_view->getHScrollBar()->value() + x ); } } void KPrCanvas::changePicture( const KURL & url ) { m_activePage->changePicture( url ); stickyPage()->changePicture( url ); } unsigned int KPrCanvas::objNums() const { return (m_activePage->objNums() + stickyPage()->objNums()); } void KPrCanvas::moveHelpLine( const QPoint & pos) { QRect rect = m_activePage->getZoomPageRect(); if ( m_tmpHorizHelpline != -1) { double vi = m_view->kPresenterDoc()->horizHelplines()[m_tmpHorizHelpline]; m_view->kPresenterDoc()->repaint(QRect( rect.left(), m_view->zoomHandler()->zoomItY(vi) -4, rect.right(), m_view->zoomHandler()->zoomItY(vi) + 4 )); if( pos.y() + diffy() <= 0) removeHelpLine(); else m_view->kPresenterDoc()->updateHorizHelpline( m_tmpHorizHelpline, m_view->zoomHandler()->unzoomItY(pos.y()+diffy())); } else if ( m_tmpVertHelpline != -1 ) { double vi = m_view->kPresenterDoc()->vertHelplines()[m_tmpVertHelpline]; m_view->kPresenterDoc()->repaint(QRect( m_view->zoomHandler()->zoomItX(vi) - 4, rect.top(), m_view->zoomHandler()->zoomItX(vi) + 4 , rect.bottom())); if( pos.x() + diffx() <= 0) removeHelpLine(); else m_view->kPresenterDoc()->updateVertHelpline( m_tmpVertHelpline, m_view->zoomHandler()->unzoomItX(pos.x()+diffx())); } m_tmpVertHelpline = -1; m_tmpHorizHelpline = -1; tmpHelpLinePosX = -1; tmpHelpLinePosY = -1; } void KPrCanvas::tmpDrawMoveHelpLine( const QPoint & newPos, bool _horizontal ) { QPainter p; p.begin( this ); p.setRasterOp( NotROP ); p.setPen( QPen( black, 0, DotLine ) ); QRect rect = m_activePage->getZoomPageRect(); if ( _horizontal ) { double vi = tmpHelpLinePosY ; p.drawLine(rect.left(), m_view->zoomHandler()->zoomItY(vi), rect.right(), m_view->zoomHandler()->zoomItY(vi)); p.setPen( QPen( black, 1, DotLine ) ); vi = m_view->zoomHandler()->unzoomItY(newPos.y()); p.drawLine(rect.left(), m_view->zoomHandler()->zoomItY(vi), rect.right(), m_view->zoomHandler()->zoomItY(vi)); tmpHelpLinePosY = vi; } else { double vi = tmpHelpLinePosX; p.drawLine(m_view->zoomHandler()->zoomItX(vi), rect.top(), m_view->zoomHandler()->zoomItX(vi), rect.bottom()); p.setPen( QPen( black, 1, DotLine ) ); vi = m_view->zoomHandler()->unzoomItX(newPos.x()); p.drawLine(m_view->zoomHandler()->zoomItX(vi), rect.top(), m_view->zoomHandler()->zoomItX(vi), rect.bottom()); tmpHelpLinePosX = vi; } p.end(); m_view->kPresenterDoc()->setModified(true); } void KPrCanvas::tmpMoveHelpLine( const QPoint & newPos) { if( m_tmpHorizHelpline != -1 ) tmpDrawMoveHelpLine( newPos, true ); else if( m_tmpVertHelpline != -1 ) tmpDrawMoveHelpLine( newPos, false ); } void KPrCanvas::removeHelpLine() { if ( m_tmpVertHelpline != -1) m_view->kPresenterDoc()->removeVertHelpline( m_tmpVertHelpline ); else if ( m_tmpHorizHelpline != -1) m_view->kPresenterDoc()->removeHorizHelpline( m_tmpHorizHelpline ); m_tmpHorizHelpline = -1; m_tmpVertHelpline = -1; tmpHelpLinePosX = -1; tmpHelpLinePosY = -1; m_view->kPresenterDoc()->setModified(true); m_view->kPresenterDoc()->repaint(false); } void KPrCanvas::changeHelpLinePosition( double newPos ) { if ( m_tmpVertHelpline != -1) { if( newPos < 0) m_view->kPresenterDoc()->removeVertHelpline( m_tmpVertHelpline ); else m_view->kPresenterDoc()->updateVertHelpline( m_tmpVertHelpline, newPos ); } else if ( m_tmpHorizHelpline != -1) { if( newPos < 0) m_view->kPresenterDoc()->removeHorizHelpline( m_tmpHorizHelpline ); else m_view->kPresenterDoc()->updateHorizHelpline( m_tmpHorizHelpline, newPos ); } m_tmpHorizHelpline = -1; m_tmpVertHelpline = -1; tmpHelpLinePosX = -1; tmpHelpLinePosY = -1; m_view->kPresenterDoc()->setModified(true); m_view->kPresenterDoc()->repaint(false); } void KPrCanvas::changeHelpPointPosition( KoPoint newPos) { if ( m_tmpHelpPoint != -1) m_view->kPresenterDoc()->updateHelpPoint( m_tmpHelpPoint, newPos); m_tmpHelpPoint = -1; tmpHelpPointPos = KoPoint( -1, -1 ); m_view->kPresenterDoc()->setModified(true); m_view->kPresenterDoc()->repaint(false); } void KPrCanvas::removeHelpPoint() { if ( m_tmpHelpPoint != -1) m_view->kPresenterDoc()->removeHelpPoint( m_tmpHelpPoint ); m_tmpHelpPoint = -1; tmpHelpPointPos = KoPoint( -1, -1 ); m_view->kPresenterDoc()->setModified(true); m_view->kPresenterDoc()->repaint(false); } void KPrCanvas::tmpDrawMoveHelpPoint( const QPoint & newPos ) { QPainter p; p.begin( this ); p.setRasterOp( NotROP ); p.setPen( QPen( black, 0, DotLine ) ); KoPoint vi = tmpHelpPointPos; QPoint point=m_view->zoomHandler()->zoomPoint( vi ); p.drawLine( point.x(), point.y()-20, point.x(), point.y()+20); p.drawLine( point.x()-20, point.y(), point.x()+20, point.y()); p.setPen( QPen( black, 1, DotLine ) ); vi = m_view->zoomHandler()->unzoomPoint(newPos); point=m_view->zoomHandler()->zoomPoint( vi ); p.drawLine( point.x(), point.y()-20, point.x(), point.y()+20); p.drawLine( point.x()-20, point.y(), point.x()+20, point.y()); tmpHelpPointPos = vi; p.end(); m_view->kPresenterDoc()->setModified(true); } void KPrCanvas::moveHelpPoint( const QPoint & newPos ) { if ( m_tmpHelpPoint != -1) { KoPoint vi = m_view->kPresenterDoc()->helpPoints()[m_tmpHelpPoint]; m_view->kPresenterDoc()->repaint(QRect( m_view->zoomHandler()->zoomItX(vi.x())-25, m_view->zoomHandler()->zoomItY(vi.y())-25, 50, 50)); m_view->kPresenterDoc()->updateHelpPoint( m_tmpHelpPoint , m_view->zoomHandler()->unzoomPoint( QPoint( newPos.x()+diffx(),newPos.y()+diffy()))); } m_tmpHelpPoint = -1; tmpHelpPointPos = KoPoint( -1, -1); } void KPrCanvas::ensureVisible( int x, int y, int xmargin, int ymargin ) { int newy= (y+ymargin)-(visibleRect().bottom()+diffy()); if( newy > 0) m_view->getVScrollBar()->setValue(m_view->getVScrollBar()->value()+newy); else { newy= (y )-(visibleRect().top()+diffy()); if( newy < 0) m_view->getVScrollBar()->setValue(m_view->getVScrollBar()->value()+newy - ymargin); } int newx= (x+xmargin)-(visibleRect().right()+diffx()); if( newx > 0) m_view->getHScrollBar()->setValue(m_view->getHScrollBar()->value()+newx); else { newx= x -(visibleRect().left()+diffx()); if( newx < 0) m_view->getHScrollBar()->setValue(m_view->getHScrollBar()->value()+newx - xmargin ); } } // "Extend Contents to Object Height" void KPrCanvas::textContentsToHeight() { QPtrList lst = applicableTextObjects(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); KMacroCommand * macro = 0L; for ( ; it.current() ; ++it ) { KCommand *cmd= it.current()->textContentsToHeight(); if( cmd ) { if ( !macro ) macro = new KMacroCommand(i18n("Extend Text Contents to Height")); macro->addCommand( cmd); _repaint( it.current() ); } } if( macro ) { macro->execute(); m_view->kPresenterDoc()->addCommand( macro ); m_view->kPresenterDoc()->repaint(this); } } // "Resize Object to fit Contents" void KPrCanvas::textObjectToContents() { QPtrList lst = applicableTextObjects(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); KMacroCommand * macro = 0L; for ( ; it.current() ; ++it ) { KCommand *cmd= it.current()->textObjectToContents(); if( cmd ) { if (!macro ) macro = new KMacroCommand(i18n("Extend Text to Contents")); macro->addCommand( cmd); } } if( macro) { macro->execute(); m_view->kPresenterDoc()->addCommand( macro ); m_view->kPresenterDoc()->repaint(this); } } void KPrCanvas::flipObject( bool _horizontal ) { QPtrList lst; QPtrListIterator it(getObjectList()); for ( ; it.current(); ++it ) { if ( it.current()->isSelected() && it.current()->getType() != OT_AUTOFORM && it.current()->getType() != OT_PART && it.current()->getType() != OT_TEXT ) { lst.append( it.current() ); } } //get sticky obj it=stickyPage()->objectList(); for ( ; it.current(); ++it ) { if ( it.current()->isSelected() && it.current()->getType() != OT_AUTOFORM && it.current()->getType() != OT_PART && it.current()->getType() != OT_TEXT ) { lst.append( it.current() ); } } if ( lst.isEmpty() ) return; KPrFlipObjectCommand *flipCmd = new KPrFlipObjectCommand( i18n("Flip Objects"), m_view->kPresenterDoc(), _horizontal, lst ); flipCmd->execute(); m_view->kPresenterDoc()->addCommand( flipCmd ); } KCommand *KPrCanvas::setKeepRatioObj( bool p ) { QPtrList lst; QValueList listKeepRatio; QPtrListIterator it(getObjectList()); for ( ; it.current(); ++it ) { if ( it.current()->isSelected() ) { lst.append( it.current() ); listKeepRatio.append( it.current()->isKeepRatio()); } } //get sticky obj it=stickyPage()->objectList(); for ( ; it.current(); ++it ) { if ( it.current()->isSelected() ) { lst.append( it.current() ); listKeepRatio.append( it.current()->isKeepRatio()); } } if ( lst.isEmpty()) return 0L; KCommand *cmd= new KPrGeometryPropertiesCommand( i18n("Keep Ratio"), listKeepRatio, lst, p, m_view->kPresenterDoc(), KPrGeometryPropertiesCommand::KeepRatio); cmd->execute(); return cmd; } KCommand *KPrCanvas::setProtectSizeObj(bool protect) { QPtrList lst; QValueList listProt; QPtrListIterator it(getObjectList()); for ( ; it.current(); ++it ) { if ( it.current()->isSelected() ) { lst.append( it.current() ); listProt.append( it.current()->isProtect()); } } //get sticky obj it=stickyPage()->objectList(); for ( ; it.current(); ++it ) { if ( it.current()->isSelected() ) { lst.append( it.current() ); listProt.append( it.current()->isProtect()); } } if ( lst.isEmpty()) return 0L; KCommand *cmd= new KPrGeometryPropertiesCommand( i18n("Protect Object"), listProt, lst, protect, m_view->kPresenterDoc(),KPrGeometryPropertiesCommand::ProtectSize ); cmd->execute(); return cmd; } KoRect KPrCanvas::zoomAllObject() { KoRect objBoundingRect=KoRect(); objBoundingRect = m_activePage->getBoundingAllObjectRect( objBoundingRect); objBoundingRect = stickyPage()->getBoundingAllObjectRect( objBoundingRect); return objBoundingRect; } QPtrList KPrCanvas::listOfTextObjs() const { QPtrList lst; QPtrListIterator it(getObjectList()); for ( ; it.current(); ++it ) { if ( it.current()->getType() == OT_TEXT ) lst.append( static_cast( it.current() ) ); } //get sticky obj it=stickyPage()->objectList(); for ( ; it.current(); ++it ) { if ( it.current()->getType() == OT_TEXT ) { if ( objectIsAHeaderFooterHidden(it.current())) continue; else lst.append( static_cast( it.current() )); } } return lst; } KPTextObject * KPrCanvas::textObjectByPos( int pos ) const { if ( pos < 0 ) return 0L; return listOfTextObjs().at( pos ); } int KPrCanvas::textObjectNum( KPTextObject * obj ) const { int num = 0; QPtrList obj2 = listOfTextObjs(); QPtrListIterator it2(obj2 ); for ( ; it2.current() ; ++it2, num++ ) { if ( it2.current() == obj ) { return num; } } return -1; } KPTextObject* KPrCanvas::textUnderMouse( const QPoint & point ) { QPtrList obj = listOfTextObjs(); QPtrListIterator it2(obj ); for ( ; it2.current() ; ++it2 ) { QRect outerRect( m_view->kPresenterDoc()->zoomHandler()->zoomRect( it2.current()->getRect()) ); if ( !it2.current()->isProtectContent() && outerRect.contains( point) ) return it2.current(); } return 0L; } bool KPrCanvas::checkCurrentTextEdit( KPTextObject * textObj ) { bool emitChanged = false; if ( textObj && m_currentTextObjectView && m_currentTextObjectView->kpTextObject() != textObj ) { m_currentTextObjectView->kpTextObject()->setEditingTextObj( false ); _repaint( m_currentTextObjectView->kpTextObject() ); //don't remove selection otherwise break dnd. m_currentTextObjectView->terminate(false); delete m_currentTextObjectView; m_currentTextObjectView = 0L; emitChanged = true; } // Edit the frameset under the mouse, if any if ( textObj && !m_currentTextObjectView ) { m_currentTextObjectView = textObj->createKPTextView( this ); emitChanged = true; } return emitChanged; } void KPrCanvas::alignObjLeft() { KMacroCommand *macro= 0L; KCommand *cmd=0L; KPresenterDoc *doc =m_view->kPresenterDoc(); KoRect rect = (numberOfObjectSelected() > 1) ? getAlignBoundingRect() : activePage()->getPageRect(); cmd=activePage()->alignObjsLeft(rect); if(cmd) { if ( !macro ) macro= new KMacroCommand(i18n( "Align Objects Left" )); macro->addCommand(cmd); } cmd=stickyPage()->alignObjsLeft(rect); if(cmd) { if ( !macro ) macro= new KMacroCommand(i18n( "Align Objects Left" )); macro->addCommand(cmd); } if(macro) doc->addCommand(macro); } void KPrCanvas::alignObjCenterH() { KMacroCommand *macro= 0L; KCommand *cmd=0L; KPresenterDoc *doc =m_view->kPresenterDoc(); KoRect rect = (numberOfObjectSelected() > 1) ? getAlignBoundingRect() : activePage()->getPageRect(); cmd=activePage()->alignObjsCenterH(rect); if(cmd) { if ( !macro ) macro= new KMacroCommand(i18n( "Align Objects Centered (horizontal)")); macro->addCommand(cmd); } cmd=doc->stickyPage()->alignObjsCenterH(rect); if(cmd) { if ( !macro ) macro= new KMacroCommand(i18n( "Align Objects Centered (horizontal)")); macro->addCommand(cmd); } if(macro) doc->addCommand(macro); } void KPrCanvas::alignObjRight() { KMacroCommand *macro= 0L; KCommand *cmd=0L; KPresenterDoc *doc =m_view->kPresenterDoc(); KoRect rect = (numberOfObjectSelected() > 1) ? getAlignBoundingRect() : activePage()->getPageRect(); cmd=activePage()->alignObjsRight(rect); if(cmd) { if ( !macro ) macro= new KMacroCommand(i18n( "Align Objects Right" )); macro->addCommand(cmd); } cmd=doc->stickyPage()->alignObjsRight(rect); if(cmd) { if ( !macro ) macro= new KMacroCommand(i18n( "Align Objects Right" )); macro->addCommand(cmd); } if(macro) doc->addCommand(macro); } void KPrCanvas::alignObjTop() { KMacroCommand *macro= new KMacroCommand(i18n( "Align Objects Top" )); KCommand *cmd=0L; KPresenterDoc *doc =m_view->kPresenterDoc(); KoRect rect = (numberOfObjectSelected() > 1) ? getAlignBoundingRect() : activePage()->getPageRect(); cmd=activePage()->alignObjsTop(rect); if(cmd) { if ( !macro ) macro= new KMacroCommand(i18n( "Align Objects Top" )); macro->addCommand(cmd); } cmd=doc->stickyPage()->alignObjsTop(rect); if(cmd) { if ( !macro ) macro= new KMacroCommand(i18n( "Align Objects Top" )); macro->addCommand(cmd); } if(macro) doc->addCommand(macro); } void KPrCanvas::alignObjCenterV() { KMacroCommand *macro= 0L; KCommand *cmd=0L; KPresenterDoc *doc =m_view->kPresenterDoc(); KoRect rect = (numberOfObjectSelected() > 1) ? getAlignBoundingRect() : activePage()->getPageRect(); cmd=activePage()->alignObjsCenterV(rect); if(cmd) { if ( !macro ) macro= new KMacroCommand(i18n( "Align Objects Center/Vertical" )); macro->addCommand(cmd); } cmd=doc->stickyPage()->alignObjsCenterV(rect); if(cmd) { if ( !macro ) macro= new KMacroCommand(i18n( "Align Objects Center/Vertical" )); macro->addCommand(cmd); } if(macro) doc->addCommand(macro); } void KPrCanvas::alignObjBottom() { KMacroCommand *macro=0L; KCommand *cmd=0L; KPresenterDoc *doc =m_view->kPresenterDoc(); KoRect rect = (numberOfObjectSelected() > 1) ? getAlignBoundingRect() : activePage()->getPageRect(); cmd=activePage()->alignObjsBottom(rect); if(cmd) { if ( !macro ) macro= new KMacroCommand(i18n( "Align Objects Bottom" )); macro->addCommand(cmd); } cmd=doc->stickyPage()->alignObjsBottom(rect); if(cmd) { if ( !macro ) macro= new KMacroCommand(i18n( "Align Objects Bottom" )); macro->addCommand(cmd); } if(macro) doc->addCommand(macro); } bool KPrCanvas::canMoveOneObject() const { return (m_activePage->canMoveOneObject() || stickyPage()->canMoveOneObject()); } void KPrCanvas::rectSymetricalObjet() { if ( m_drawSymetricObject ) { m_drawSymetricObject = false; insRect.moveBy( -insRect.width(), -insRect.height()); insRect.setSize( 2*insRect.size() ); } } bool KPrCanvas::getSticky( bool sticky ) const { bool result =m_activePage->getSticky( sticky ); if ( result != sticky) return result; return stickyPage()->getSticky( sticky ); } bool KPrCanvas::getProtect( bool prot ) const { bool result =m_activePage->getProtect( prot ); if ( result != prot) return result; return stickyPage()->getProtect( prot ); } bool KPrCanvas::differentProtect( bool p )const { bool result = m_activePage->differentProtect( p ); if ( result ) return true; return stickyPage()->differentProtect( p ); } bool KPrCanvas::getKeepRatio( bool _ratio ) const { bool result =m_activePage->getKeepRatio( _ratio ); if ( result != _ratio) return result; return stickyPage()->getKeepRatio( _ratio ); } bool KPrCanvas::differentKeepRatio( bool p )const { bool result = m_activePage->differentKeepRatio( p ); if ( result ) return true; return stickyPage()->differentKeepRatio( p ); } QPen KPrCanvas::getPen( const QPen & _pen )const { QPen pen = m_activePage->getPen( _pen ); if ( pen != _pen ) return pen; return stickyPage()->getPen( _pen); } QBrush KPrCanvas::getBrush( const QBrush & _brush )const { QBrush brush = m_activePage->getBrush( _brush ); if ( brush != _brush ) return brush; return stickyPage()->getBrush( _brush); } LineEnd KPrCanvas::getLineBegin( LineEnd _end )const { LineEnd end = m_activePage->getLineBegin( _end ); if ( end != _end ) return end; return stickyPage()->getLineBegin( _end); } LineEnd KPrCanvas::getLineEnd( LineEnd _end )const { LineEnd end = m_activePage->getLineEnd( _end ); if ( end != _end ) return end; return stickyPage()->getLineEnd( _end); } FillType KPrCanvas::getFillType( FillType _fillType ) const { FillType fill = m_activePage->getFillType( _fillType ); if ( fill != _fillType ) return fill; return stickyPage()->getFillType( _fillType); } QColor KPrCanvas::getGColor1( const QColor & _col )const { QColor col = m_activePage->getGColor1( _col ); if ( col != _col ) return col; return stickyPage()->getGColor1( _col); } QColor KPrCanvas::getGColor2( const QColor & _col )const { QColor col = m_activePage->getGColor2( _col ); if ( col != _col ) return col; return stickyPage()->getGColor2( _col); } BCType KPrCanvas::getGType( BCType _gt )const { BCType type = m_activePage->getGType( _gt ); if ( type != _gt ) return type; return stickyPage()->getGType( _gt); } bool KPrCanvas::getGUnbalanced( bool _g )const { bool type= m_activePage->getGUnbalanced( _g ); if ( type != _g ) return type; return stickyPage()->getGUnbalanced( _g); } int KPrCanvas::getGXFactor( int _g )const { int type= m_activePage->getGXFactor( _g ); if ( type != _g ) return type; return stickyPage()->getGXFactor( _g); } int KPrCanvas::getGYFactor( int _g )const { int type= m_activePage->getGYFactor( _g ); if ( type != _g ) return type; return stickyPage()->getGYFactor( _g); } int KPrCanvas::getRndY( int _ry )const { int value = m_activePage->getRndY(_ry); if (value != _ry) return value; return stickyPage()->getRndY(_ry); } int KPrCanvas::getRndX( int _rx )const { int value = m_activePage->getRndX(_rx); if (value != _rx) return value; return stickyPage()->getRndX(_rx); } int KPrCanvas::getPieAngle( int pieAngle )const { int value = m_activePage->getPieAngle(pieAngle); if (value != pieAngle) return value; return stickyPage()->getPieAngle(pieAngle); } int KPrCanvas::getPieLength( int pieLength )const { int value = m_activePage->getPieLength(pieLength); if (value != pieLength) return value; return stickyPage()->getPieLength(pieLength); } PieType KPrCanvas::getPieType( PieType pieType )const { PieType type = m_activePage->getPieType(pieType); if (type != pieType) return type; return stickyPage()->getPieType(pieType); } bool KPrCanvas::getCheckConcavePolygon( bool check ) const { bool value = m_activePage->getCheckConcavePolygon(check); if (value != check) return value; return stickyPage()->getCheckConcavePolygon(check); } int KPrCanvas::getCornersValue( int corners ) const { int value = m_activePage->getCornersValue(corners); if (value != corners) return value; return stickyPage()->getCornersValue(corners); } int KPrCanvas::getSharpnessValue( int sharpness ) const { int value = m_activePage->getSharpnessValue(sharpness); if (value != sharpness) return value; return stickyPage()->getSharpnessValue(sharpness); } PictureMirrorType KPrCanvas::getPictureMirrorType( PictureMirrorType type ) const { PictureMirrorType value = m_activePage->getPictureMirrorType(type); if (value != type) return value; return stickyPage()->getPictureMirrorType(type); } int KPrCanvas::getPictureDepth( int depth ) const { int value = m_activePage->getPictureDepth(depth); if (value != depth) return value; return stickyPage()->getPictureDepth(depth); } bool KPrCanvas::getPictureSwapRGB( bool swapRGB ) const { bool value = m_activePage->getPictureSwapRGB(swapRGB); if (value != swapRGB) return value; return stickyPage()->getPictureSwapRGB(swapRGB); } bool KPrCanvas::getPictureGrayscal( bool grayscal ) const { bool value = m_activePage->getPictureGrayscal(grayscal); if (value != grayscal) return value; return stickyPage()->getPictureGrayscal(grayscal); } int KPrCanvas::getPictureBright( int bright ) const { int value = m_activePage->getPictureBright(bright); if (value != bright) return value; return stickyPage()->getPictureBright(bright); } QPixmap KPrCanvas::getPicturePixmap() const { QPixmap pixmap = m_activePage->getPicturePixmap(); if (!pixmap.isNull()) return pixmap; return stickyPage()->getPicturePixmap(); } KCommand *KPrCanvas::setProtectContent( bool b ) { KMacroCommand *macro = 0L; QPtrList list; QPtrListIterator it(getObjectList()); for ( ; it.current(); ++it ) { if ( it.current()->isSelected() && it.current()->getType()==OT_TEXT) { if ( !macro ) macro = new KMacroCommand( i18n("Protect Content")); KPrProtectContentCommand * cmd = new KPrProtectContentCommand( i18n("Protect Content"), b, static_cast(it.current()), m_view->kPresenterDoc() ); cmd->execute(); macro->addCommand( cmd ); } } //get sticky obj it=stickyPage()->objectList(); for ( ; it.current(); ++it ) { if ( it.current()->isSelected() && it.current()->getType()==OT_TEXT) { if ( !macro ) macro = new KMacroCommand( i18n("Protect Content")); KPrProtectContentCommand * cmd = new KPrProtectContentCommand( i18n("Protect Content"), b, static_cast(it.current()), m_view->kPresenterDoc() ); cmd->execute(); macro->addCommand( cmd ); } } return macro; } bool KPrCanvas::getProtectContent(bool prot) const { bool result =m_activePage->getProtectContent(prot); if ( result != prot) return result; return stickyPage()->getProtectContent( prot ); } void KPrCanvas::closeObject(bool /*close*/) { QPtrList lst; QPtrListIterator it(getObjectList()); for ( ; it.current(); ++it ) { if ( it.current()->isSelected() && (it.current()->getType() == OT_POLYLINE || it.current()->getType() == OT_FREEHAND || it.current()->getType() == OT_QUADRICBEZIERCURVE || it.current()->getType() == OT_CUBICBEZIERCURVE )) lst.append( it.current() ); } //get sticky obj it=stickyPage()->objectList(); for ( ; it.current(); ++it ) { if ( it.current()->isSelected() && (it.current()->getType() == OT_POLYLINE ||it.current()->getType() == OT_FREEHAND || it.current()->getType() == OT_QUADRICBEZIERCURVE || it.current()->getType() == OT_CUBICBEZIERCURVE )) lst.append( it.current() ); } if ( lst.isEmpty()) return; KMacroCommand *macro = new KMacroCommand( i18n("Close Object")); QPtrListIterator it2( lst ); for ( ; it2.current() ; ++it2 ) { KCommand * cmd= new KPrCloseObjectCommand(i18n("Close Object"), it2.current(), m_view->kPresenterDoc()); macro->addCommand(cmd); } macro->execute(); m_view->kPresenterDoc()->addCommand(macro); } void KPrCanvas::layout() { QPtrListIterator it(getObjectList()); for ( ; it.current(); ++it ) { if ( it.current()->getType() == OT_TEXT ) static_cast( it.current() )->layout(); } it=stickyPage()->objectList(); for ( ; it.current(); ++it ) { if ( it.current()->getType() == OT_TEXT ) static_cast( it.current() )->layout(); } } QPoint KPrCanvas::applyGrid( const QPoint &pos,bool offset ) { bool state =m_view->kPresenterDoc()->snapToGrid(); if ( !state && offset ) return pos; double gridX = m_view->kPresenterDoc()->getGridX(); double gridY = m_view->kPresenterDoc()->getGridY(); if ( !state && ! offset ) { gridX = 1.0; gridY = 1.0; } KoPoint newPos; if (offset ) newPos = m_view->kPresenterDoc()->zoomHandler()->unzoomPoint( pos+QPoint(diffx(),diffy()) ); else newPos = m_view->kPresenterDoc()->zoomHandler()->unzoomPoint( pos ); newPos.setX( static_cast( newPos.x() / gridX ) * gridX ); newPos.setY( static_cast( newPos.y() / gridY ) * gridY ); QPoint point( m_view->kPresenterDoc()->zoomHandler()->zoomPoint( newPos ) ); if ( offset ) point -= QPoint( diffx(), diffy() ); return point; } int KPrCanvas::applyGridOnPosX( int pos ) const { double gridX = m_view->kPresenterDoc()->getGridX(); double point = m_view->kPresenterDoc()->zoomHandler()->unzoomItX( pos ); double result = static_cast( point / gridX ) * gridX; return m_view->kPresenterDoc()->zoomHandler()->zoomItX( result ); } int KPrCanvas::applyGridOnPosY( int pos ) const { double gridY = m_view->kPresenterDoc()->getGridY(); double point = m_view->kPresenterDoc()->zoomHandler()->unzoomItY( pos ); double result = static_cast( point / gridY ) * gridY; return m_view->kPresenterDoc()->zoomHandler()->zoomItY( result ); } void KPrCanvas::alignVertical( VerticalAlignmentType _type ) { KMacroCommand *macro = 0L; KCommand *cmd = m_activePage->alignVertical( _type ); if ( cmd ) { if ( !macro ) macro = new KMacroCommand( i18n("Change Vertical Alignment")); macro->addCommand(cmd ); } cmd = stickyPage()->alignVertical( _type ); if ( cmd ) { if ( !macro ) macro = new KMacroCommand( i18n("Change Vertical Alignment")); macro->addCommand(cmd ); } if ( macro ) m_view->kPresenterDoc()->addCommand( macro ); } ImageEffect KPrCanvas::getImageEffect(ImageEffect eff) const { ImageEffect value = m_activePage->getImageEffect(eff); if (value != eff) return value; return stickyPage()->getImageEffect(eff); } KPPixmapObject * KPrCanvas::getSelectedImage() const { KPPixmapObject *obj=activePage()->getSelectedImage(); if(obj) return obj; obj=stickyPage()->getSelectedImage(); return obj; } double KPrCanvas::applyGridX( double x ) { if ( !m_view->kPresenterDoc()->snapToGrid() ) return x; double gridX = m_view->kPresenterDoc()->getGridX(); return qRound( x / gridX ) * gridX; } double KPrCanvas::applyGridY( double y ) { if ( !m_view->kPresenterDoc()->snapToGrid() ) return y; double gridY = m_view->kPresenterDoc()->getGridY(); return qRound( y / gridY ) * gridY; } KoPoint KPrCanvas::applyGrid( const KoPoint &pos ) { if ( !m_view->kPresenterDoc()->snapToGrid() ) return pos; KoPoint newPos; newPos.setX( applyGridX( pos.x() ) ); newPos.setY( applyGridY( pos.y() ) ); return newPos; } diff --git a/kpresenter/kprcanvas.h b/kpresenter/kprcanvas.h index e4720337d31..13a4a392ec3 100644 --- a/kpresenter/kprcanvas.h +++ b/kpresenter/kprcanvas.h @@ -1,592 +1,599 @@ // -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*- /* This file is part of the KDE project Copyright (C) 1998, 1999 Reginald Stadlbauer This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef __KPRCANVAS__ #define __KPRCANVAS__ #include #include #include #include #include #include #include #include "koPointArray.h" #include "global.h" #include #include class KURL; class KoTextFormatInterface; class KPresenterView; class KPresenterDoc; class QPainter; class KTextEdit; class KPTextObject; class KPObject; class QPopupMenu; class QResizeEvent; class QPaintEvent; class QDragEnterEvent; class QDragMoveEvent; class QDropEvent; class QFocusEvent; class QMouseEvent; class QWheelEvent; class QKeyEvent; class KPPixmapObject; class KPBackGround; class QRect; class QSize; class QPoint; class KPresenterSoundPlayer; class KoTextObject; class KoParagCounter; class KPrPage; class KPrinter; class KPTextView; class KPPartObject; class KCommand; /** * Class KPCanvas - There is a single instance of this class for a given view. * * It manages the graphical representation of all the objects. */ class KPrCanvas : public QWidget { Q_OBJECT public: // constructor - destructor KPrCanvas( QWidget *parent=0,const char *name=0,KPresenterView *_view=0 ); ~KPrCanvas(); KPresenterView * getView()const { return m_view; } // The equivalent of contentsX() and contentsY() for a QScrollView // The Canvas is a widget, not a scrollview (because we handle the scrollbars ourselves, // to have the "goto page" buttons at the bottom of the scrollbars etc.) int diffx() const { return m_xOffset; } int diffy() const { return m_yOffset; } void setDiffX( int _diffX ) { m_xOffset = _diffX; } void setDiffY( int _diffY ) { m_yOffset = _diffY; } void scrollX( int x ); void scrollY( int y ); // public functions void selectAllObj(); void deSelectAllObj(); void selectObj( KPObject* ); void deSelectObj( KPObject* ); void setTextFormat(const KoTextFormat &format, int flags); void setTextColor( const QColor & ); void setTextBackgroundColor( const QColor & ); void setTextAlign( int ); void setTextDepthPlus(); void setTextDepthMinus(); void setNewRightIndent(double _rightIndent); void setNewLeftIndent(double _leftIndent); void setNewFirstIndent(double _firstIndent); //void setTextCounter(KoParagCounter counter); void setTabList( const KoTabulatorList & tabList ); void setTextBold( bool b ); void setTextItalic( bool b ); void setTextUnderline( bool b ); void setTextStrikeOut( bool b ); void setTextFamily( const QString &f ); void setTextPointSize( int s ); void setTextSubScript( bool b ); void setTextSuperScript( bool b ); void setTextDefaultFormat( ); void setIncreaseFontSize(); void setDecreaseFontSize(); KPTextObject* kpTxtObj() const; // Start a screen presentation // All pages if curPgNum is -1, otherwise just curPgNum (1-based) void startScreenPresentation( float presFakt, int curPgNum = -1); void stopScreenPresentation(); bool pNext( bool ); bool pPrev( bool ); void setNextPageTimer( bool _nextPageTimer ) { nextPageTimer = _nextPageTimer; } unsigned int presPage() const { return currPresPage; } // 1 based int presStep() const { return currPresStep; } float presFakt() const { return _presFakt; } int numPresSteps() const { return presStepList.count(); } int numPresPages() const { return slideList.count(); } bool canAssignEffect( QPtrList &objs ) const; void print( QPainter*, KPrinter*, float, float ); void setPartEntry( KoDocumentEntry& _e ) { partEntry = _e; } void setToolEditMode( ToolEditMode _m, bool updateView = true ); void setAutoForm( const QString &_autoform ) { autoform = _autoform; } void drawPageInPix( QPixmap&, int pgnum, int zoom, bool forceRealVariableValue = false ); void gotoPage( int pg ); + /** + * Go to first slide of presentation. + * Used in presentation mode. + */ + void presGotoFirstPage(); + + KPrPage* activePage() const; bool oneObjectTextExist() const; bool oneObjectTextSelected() const; bool isOneObjectSelected() const; /** Returns the list of selected text objects */ QPtrList selectedTextObjs() const; /** * Returns the list of interfaces to use for changing the text format. * This can be either the currently edited text object, * or the list of text objects currently selected */ QPtrList applicableTextInterfaces() const; /** * Returns the list of text objects, either selected or activated. */ QPtrList applicableTextObjects() const; void setMouseSelectedObject(bool b); bool haveASelectedPartObj() const; bool haveASelectedGroupObj() const; bool haveASelectedPixmapObj() const; KPTextView *currentTextObjectView() const { return m_currentTextObjectView; } QPtrList objectList() const; // get - set data const QPtrList & getObjectList() const; void stopSound(); //for KPTextView void dragStarted() { mousePressed = false; } void setXimPosition( int x, int y, int w, int h, QFont *f ); void createEditing( KPTextObject *textObj ); void insertLineH( const QRect&, bool ); void insertLineV( const QRect&, bool ); void insertLineD1( const QRect&, bool ); void insertLineD2( const QRect&, bool ); void insertRect( const QRect& ); void insertEllipse( const QRect& ); void insertPie( const QRect& ); KPTextObject* insertTextObject( const QRect& ); void insertPicture( const QRect &_r, const QPoint & tl = QPoint()); void changePicture( const KURL & url ); int numberOfObjectSelected() const; KPObject *getSelectedObj() const; KPPixmapObject *getSelectedImage() const; int getPenBrushFlags() const; bool getEditMode() const { return editMode; } void ungroupObjects(); void groupObjects(); unsigned int objNums() const; void removeHelpLine(); void changeHelpLinePosition( double newPos); int tmpHorizHelpLine() const { return m_tmpHorizHelpline;} int tmpVertHelpLine() const { return m_tmpVertHelpline;} void tmpDrawMoveHelpLine( const QPoint & newPos, bool _horizontal ); void setTmpHelpLinePosX( double pos) { tmpHelpLinePosX = pos ;} void setTmpHelpLinePosY( double pos) { tmpHelpLinePosY = pos;} void changeHelpPointPosition( KoPoint newPos); void removeHelpPoint(); int tmpHelpPoint() const { return m_tmpHelpPoint;} void setTmpHelpPointPos( KoPoint pos) { tmpHelpPointPos = pos ;} void tmpDrawMoveHelpPoint( const QPoint & newPos ); void ensureVisible( int x, int y, int xmargin, int ymargin ); KoRect objectSelectedBoundingRect() const; void scrollTopLeftPoint( const QPoint & pos ); void textContentsToHeight(); void textObjectToContents(); void flipObject( bool _horizontal ); KCommand *setKeepRatioObj( bool p ); KCommand *setProtectSizeObj(bool protect); KoRect zoomAllObject(); //return pos of kptextobj int textObjectNum( KPTextObject * obj ) const; KPTextObject * textObjectByPos( int pos ) const; void alignObjLeft(); void alignObjCenterH(); void alignObjRight(); void alignObjTop(); void alignObjCenterV(); void alignObjBottom(); bool canMoveOneObject()const; QPtrList listOfTextObjs() const; bool getSticky( bool sticky ) const; bool getProtect( bool prot ) const; bool getKeepRatio( bool _ratio ) const; //return true if we are selected several object and there are not //the same "keep ratio" properties" bool differentKeepRatio( bool p )const; bool differentProtect( bool p )const; bool getProtectContent(bool prot) const; QPen getPen( const QPen & _pen )const; QBrush getBrush( const QBrush & _brush )const; LineEnd getLineBegin( LineEnd _end )const; LineEnd getLineEnd( LineEnd _end )const; FillType getFillType( FillType _fillType ) const; QColor getGColor1( const QColor & _col )const; QColor getGColor2( const QColor & _col )const; BCType getGType( BCType _gt )const; bool getGUnbalanced( bool _g )const; int getGXFactor( int _g )const; int getGYFactor( int _g )const; int getRndY( int _ry )const; int getRndX( int _rx )const; int getPieAngle( int pieAngle )const; int getPieLength( int pieLength )const; PieType getPieType( PieType pieType )const; bool getCheckConcavePolygon( bool check ) const; int getCornersValue( int corners ) const; int getSharpnessValue( int sharpness ) const; PictureMirrorType getPictureMirrorType( PictureMirrorType type ) const; int getPictureDepth( int depth ) const; bool getPictureSwapRGB( bool swapRGB ) const; bool getPictureGrayscal( bool grayscal ) const; int getPictureBright( int bright ) const; ImageEffect getImageEffect(ImageEffect eff) const; QPixmap getPicturePixmap() const; KCommand *setProtectContent( bool b ); void closeObject(bool _close); void layout(); void alignVertical( VerticalAlignmentType _type ); void savePicture(); void dropImage( QMimeSource * data, bool resizeImageToOriginalSize = false , int posX = 10, int posX=10 ); public slots: void exitEditMode(); void clipCut(); void clipCopy(); void clipPaste(); void deleteObjs(); void copyObjs(); void rotateObjs(); void shadowObjs(); void chPic(); void picViewOriginalSize(); void picViewOrig640x480(); void picViewOrig800x600(); void picViewOrig1024x768(); void picViewOrig1280x1024(); void picViewOrig1600x1200(); void picViewOrigFactor(); void setActivePage( KPrPage* active ); signals: // signals to notify of changes void fontChanged( const QFont & ); void colorChanged( const QColor & ); void alignChanged( int ); void updateSideBarItem( int ); void stopPres(); void objectSelectedChanged(); void objectSizeChanged(); // Emitted when the current frameset edit changes void currentObjectEditChanged(); void selectionChanged( bool hasSelection ); void sigMouseWheelEvent( QWheelEvent * ); protected: struct PicCache { QPicture pic; int num; int subPresStep; }; // functions for displaying virtual void paintEvent( QPaintEvent* ); void drawBackground( QPainter*, const QRect& ) const; //draw all object : object in current page + object in sticky page void drawObjects( QPainter*, const QRect&, bool drawCursor, SelectionMode selectionMode, bool doSpecificEffects ) const; void drawObjectsInPage(QPainter *painter, const KoRect& rect2, bool drawCursor, SelectionMode selectionMode, bool doSpecificEffects, const QPtrList & obj) const; void drawAllObjectsInPage( QPainter *painter, const QPtrList & obj ) const; // draw all helpline void drawHelplines(QPainter *painter, const QRect &rect2) const; void drawHelpPoints( QPainter *painter, const QRect &rect2) const; // draw grid void drawGrid(QPainter *painter, const QRect &rect2) const; QRect getOldBoundingRect( const KPObject *obj ); void drawCurrentPageInPix( QPixmap& ) const; virtual void mousePressEvent( QMouseEvent *e ); virtual void mouseReleaseEvent( QMouseEvent *e ); virtual void mouseMoveEvent( QMouseEvent *e ); virtual void mouseDoubleClickEvent( QMouseEvent *e ); virtual void wheelEvent( QWheelEvent *e ); virtual void resizeEvent( QResizeEvent *e ); KPObject *getObjectAt( const KoPoint&pos ); virtual void focusInEvent( QFocusEvent* ) {} virtual void focusOutEvent( QFocusEvent* ) {} virtual void enterEvent( QEvent *e ); virtual void leaveEvent( QEvent *e ); virtual void dragEnterEvent( QDragEnterEvent *e ); virtual void dragMoveEvent( QDragMoveEvent *e ); virtual void dropEvent( QDropEvent *e ); virtual void keyPressEvent( QKeyEvent *e ); virtual void keyReleaseEvent( QKeyEvent *e ); void eraseEmptySpace( QPainter * painter, const QRegion & emptySpaceRegion, const QBrush & brush ) const; // setup popupmenus void setupMenus(); unsigned int currPgNum() const; QColor txtBackCol() const; bool spInfiniteLoop() const; bool spManualSwitch() const; QRect getPageRect( bool decBorders = true ) const; unsigned int pageNums() const; float objSpeedFakt() const; float pageSpeedFakt() const; void calcRatio( double &dx, double &dy, ModifyType _modType, double ratio ) const; void _repaint( bool erase=true ); void _repaint( const QRect &r ); void _repaint( KPObject *o ); void printPage( QPainter*, int pageNum ); void doObjEffects(); void drawObject( KPObject*, QPixmap*, int, int, int, int, int, int ); KPPartObject *insertObject( const QRect& ); void insertAutoform( const QRect&, bool ); void insertFreehand( const KoPointArray &_pointArray ); void insertPolyline( const KoPointArray &_pointArray ); void insertCubicBezierCurve( const KoPointArray &_pointArray ); void insertPolygon( const KoPointArray &_pointArray ); void insertClosedLine( const KoPointArray &_pointArray ); void selectNext(); void selectPrev(); void scalePixmapToBeOrigIn( const KoSize ¤tSize, const KoSize &pgSize, const QSize &presSize, KPPixmapObject *obj ); bool getPixmapOrigAndCurrentSize( KPPixmapObject *&obj, KoSize *origSize, KoSize *currentSize ); void setTextBackground( KPTextObject *obj ); virtual bool eventFilter( QObject *o, QEvent *e ); virtual bool focusNextPrevChild( bool ); void endDrawPolyline(); void drawCubicBezierCurve( int _dx, int _dy ); void endDrawCubicBezierCurve(); #ifndef NDEBUG void printRTDebug( int info ); #endif KPrPage *stickyPage() const; void moveHelpLine(const QPoint & pos); void tmpMoveHelpLine( const QPoint & newPos); void moveHelpPoint( const QPoint & newPos ); void scrollCanvas(const KoRect& oldPos); KoRect getAlignBoundingRect() const; private: QValueList pages(const QString &range) const; bool pagesHelper(const QString &chunk, QValueList &list) const; void picViewOrigHelper(int x, int y); void moveObject( int x, int y, bool key ); void resizeObject( ModifyType _modType, int _dx, int _dy ); void raiseObject( KPObject *_kpobject ); void lowerObject(); int selectedObjectPosition; bool nextPageTimer; void playSound( const QString &soundFileName ); void drawPolygon( const KoPoint &startPoint, const KoPoint &endPoint ); void drawPieObject(QPainter *p, const QRect & ); void limitSizeOfObject(); QPoint limitOfPoint(const QPoint& _point) const; void calcBoundingRect(); bool objectIsAHeaderFooterHidden(KPObject *obj) const; KPTextObject* textUnderMouse( const QPoint & point ); bool checkCurrentTextEdit( KPTextObject * textObj ); void rectSymetricalObjet(); QPoint applyGrid( const QPoint &pos,bool offset); KoPoint applyGrid( const KoPoint &pos); double applyGridX( double x ); double applyGridY( double y ); int applyGridOnPosX( int pos ) const; int applyGridOnPosY( int pos ) const; private slots: void toFontChanged( const QFont &font ) { emit fontChanged( font ); } void toColorChanged( const QColor &color ) { emit colorChanged( color ); } void toAlignChanged( int a ) { emit alignChanged( a ); } void drawingMode(); void switchingMode(); void slotGotoPage(); void slotExitPres(); void terminateEditing( KPTextObject * ); private: // variables QPopupMenu *presMenu; bool showingLastSlide; bool mousePressed; bool drawContour; double startAngle; ModifyType modType; unsigned int oldMx, oldMy; KPObject *resizeObjNum, *editNum, *rotateNum; bool fillBlack; KPresenterView *m_view; bool editMode, goingBack, drawMode; bool drawLineInDrawMode; bool mouseSelectedObject; unsigned int currPresPage, currPresStep, subPresStep; unsigned int oldPresPage, oldPresStep, oldSubPresStep; float _presFakt; int m_showOnlyPage; // 1-based (-1 = all) QValueList presStepList, slideList; QValueList::Iterator slideListIterator; int PM_DM, PM_SM; int firstX, firstY; double axisX, axisY; int delPageId; bool drawRubber; QRect rubber, oldBoundingRect; KoRect resizeRect; ToolEditMode toolEditMode; QRect insRect; KoDocumentEntry partEntry; // List of objects to draw, from the previous step in the presentation // (those that remain on screen between two steps) QPtrList tmpObjs; QString autoform; bool inEffect, keepRatio; double ratio; QPixmap buffer; KPTextView *m_currentTextObjectView; KPresenterSoundPlayer *soundPlayer; KoPointArray m_pointArray, m_oldCubicBezierPointArray; QPoint m_dragStartPoint, m_dragEndPoint, m_dragSymmetricEndPoint; KoPoint m_CubicBezierSecondPoint, m_CubicBezierThirdPoint; unsigned int m_indexPointArray; bool m_drawPolyline; bool m_drawCubicBezierCurve; bool m_drawLineWithCubicBezierCurve; bool m_zoomRubberDraw; KPrPage *m_activePage; int m_xOffset, m_yOffset; int m_xOffsetSaved, m_yOffsetSaved; // saved when going fullscreen KoRect m_boundingRect; // when moving object(s) KoPoint m_hotSpot; // when moving frame(s) KoPoint moveStartPosMouse; // start position for move with mouse KoPoint moveStartPosKey; // start position for move with key int m_tmpHelpPoint; KoPoint tmpHelpPointPos; KPrPage * m_activePageBeforePresentation; int m_zoomBeforePresentation; int m_tmpHorizHelpline; int m_tmpVertHelpline; double tmpHelpLinePosX; double tmpHelpLinePosY; bool m_keyPressEvent; bool m_drawSymetricObject; KoRect m_origBRect; // Start rect for move QPoint m_origPos; // Start point for move }; #endif // __KPRCANVAS__ diff --git a/kpresenter/kpresenter_view.cc b/kpresenter/kpresenter_view.cc index 3e69e09ea20..2163a9fdb74 100644 --- a/kpresenter/kpresenter_view.cc +++ b/kpresenter/kpresenter_view.cc @@ -1,7182 +1,7182 @@ /* This file is part of the KDE project Copyright (C) 1998, 1999 Reginald Stadlbauer This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "backdia.h" #include "autoformEdit/afchoose.h" #include "styledia.h" #include "pgconfdia.h" #include "effectdia.h" #include "rotationdialogimpl.h" #include "shadowdialogimpl.h" #include "imageEffectDia.h" #include #include "transeffectdia.h" #include "confpiedia.h" #include "confrectdia.h" #include "confpolygondia.h" #include "confpicturedia.h" #include "presdurationdia.h" #include "kppartobject.h" #include "sidebar.h" #include "notebar.h" #include #include #include #include #include #include #include #include #include #include #include "kpresenter_view.h" #include "webpresentation.h" #include "kptextobject.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "KPresenterViewIface.h" #include "kpresenter_dlg_config.h" #include #include #include "kprcommand.h" #include #include #include #include #include #include #include #include #include #include #include "kprtextdocument.h" #include #include #include #include "searchdia.h" #include "kprvariable.h" #include "kprcanvas.h" #include #include #include "kprstylemanager.h" #include "kppixmapobject.h" #include #include "kprhelplinedia.h" #include "kprduplicateobjdia.h" #include #include #include #include "kprimportstyledia.h" #include #include #include #include #include #define DEBUG static const char * const pageup_xpm[] = { " 14 14 2 1", ". c #000000", "# c none", "##############", "##############", "######..######", "#####....#####", "####......####", "###........###", "##############", "######..######", "#####....#####", "####......####", "###........###", "##############", "##############", "##############" }; static const char * const pagedown_xpm[] = { " 14 14 2 1", ". c #000000", "# c none", "##############", "##############", "##############", "###........###", "####......####", "#####....#####", "######..######", "##############", "###........###", "####......####", "#####....#####", "######..######", "##############", "##############" }; KPresenterView::KPresenterView( KPresenterDoc* _doc, QWidget *_parent, const char *_name ) : KoView( _doc, _parent, _name ) { setInstance( KPresenterFactory::global() ); if ( !_doc->isReadWrite() ) setXMLFile( "kpresenter_readonly.rc" ); else setXMLFile( "kpresenter.rc" ); dcop = 0; dcopObject(); // build it m_bDisplayFieldCode=false; // init afChoose = 0; styleDia = 0; pgConfDia = 0; transEffectDia = 0; rotateDia = 0; shadowDia = 0; imageEffectDia = 0; presDurationDia = 0; v_ruler = 0; h_ruler = 0; pen = QPen( black, 1, SolidLine ); brush = QBrush( white, SolidPattern ); lineBegin = L_NORMAL; lineEnd = L_NORMAL; gColor1 = red; gColor2 = green; gType = BCT_GHORZ; gUnbalanced = false; gXFactor = 100; gYFactor = 100; fillType = FT_BRUSH; pieType = PT_PIE; pieLength = 90 * 16; pieAngle = 45 * 16; setMouseTracking( true ); m_bShowGUI = true; m_bRectSelection = false; presStarted = false; continuePres = false; exitPres = false; rndX = 0; rndY = 0; allowWebPres = true; currPg = 0; sidebar = 0; notebar = 0; splitter = 0; pageBase = 0; sticky = FALSE; protect = FALSE; keepRatio = FALSE; protectContent = FALSE; m_canvas = 0L; m_spell.kospell = 0; automaticScreenPresFirstTimer = true; m_actionList.setAutoDelete( true ); checkConcavePolygon = false; cornersValue = 3; sharpnessValue = 0; tbAlign = Qt::AlignLeft; tbFont = font(); tbColor = black; mirrorType = PM_NORMAL; depth = 0; swapRGB = false; grayscal = false; bright = 0; m_currentLineTool = LtLine; m_currentShapeTool = StRectangle; m_currentClosedLineTool = CltFreehand; m_searchEntry = 0L; m_replaceEntry = 0L; m_findReplace = 0L; m_switchPage=-1; m_fontDlg=0L; m_paragDlg=0L; m_pKPresenterDoc = _doc; createGUI(); setKeyCompression( true ); m_specialCharDlg=0L; if ( shell() ) changeNbOfRecentFiles( m_pKPresenterDoc->maxRecentFiles() ); connect(this, SIGNAL(embeddImage(const QString &)), SLOT(insertPicture(const QString &))); connect( m_pKPresenterDoc, SIGNAL( sig_refreshMenuCustomVariable()), this, SLOT( refreshCustomMenu())); // Cut and copy are directly connected to the selectionChanged signal if ( m_pKPresenterDoc->isReadWrite() ) connect( m_canvas, SIGNAL(selectionChanged(bool)), this, SLOT(slotChangeCutState(bool )/*setEnabled(bool)*/) ); else actionEditCut->setEnabled( false ); connect( m_canvas, SIGNAL(selectionChanged(bool)), actionEditCopy, SLOT(setEnabled(bool)) ); connect (m_canvas, SIGNAL(selectionChanged(bool)), actionChangeCase, SLOT(setEnabled(bool))); //connect (m_canvas, SIGNAL(selectionChanged(bool)), // actionCreateStyleFromSelection, SLOT(setEnabled(bool))); connect( m_canvas, SIGNAL( currentObjectEditChanged() ), this, SLOT( slotObjectEditChanged())); connect( h_ruler, SIGNAL( tabListChanged( const KoTabulatorList & ) ), this, SLOT( tabListChanged( const KoTabulatorList & ) ) ); //statusbar stuff connect( m_pKPresenterDoc, SIGNAL( pageNumChanged() ), this, SLOT( pageNumChanged()) ); connect( this, SIGNAL( currentPageChanged(int) ), this, SLOT( pageNumChanged()) ); connect( m_canvas, SIGNAL( objectSizeChanged() ), this, SLOT( updateObjectStatusBarItem() )); connect( m_canvas, SIGNAL( objectSelectedChanged() ), this, SLOT( updateObjectStatusBarItem() )); connect (m_pKPresenterDoc, SIGNAL(sig_updateRuler()),this, SLOT( slotUpdateRuler())); connect (m_pKPresenterDoc, SIGNAL(sig_updateRuler()),this, SLOT( slotUpdateScrollBarRanges())); connect (m_pKPresenterDoc, SIGNAL(sig_updateMenuBar()),this, SLOT(updateSideBarMenu())); KStatusBar * sb = statusBar(); m_sbPageLabel = 0L; if ( sb ) // No statusbar in e.g. konqueror { m_sbPageLabel = new KStatusBarLabel( QString::null, 0, sb ); addStatusBarItem( m_sbPageLabel, 0 ); } m_sbObjectLabel = 0L; // Only added when objects are selected m_sbSavingLabel = 0L; // use when saving file //when kword is embedded into konqueror apply a zoom=100 //in konqueror we can't change zoom -- ### TODO ? if(!m_pKPresenterDoc->isReadWrite()) { setZoom( 100, true ); slotUpdateRuler(); initGui(); m_pKPresenterDoc->updateZoomRuler(); } setAcceptDrops( TRUE ); } DCOPObject* KPresenterView::dcopObject() { if ( !dcop ) dcop = new KPresenterViewIface( this ); return dcop; } KPresenterView::~KPresenterView() { delete m_findReplace; m_findReplace = 0L; if(sidebar) { KConfig *config=KGlobal::config(); config->setGroup("Global"); config->writeEntry("Sidebar", sidebar->isVisible()); } if(notebar) { KConfig *config=KGlobal::config(); config->setGroup("Global"); config->writeEntry("Notebar", notebar->isVisible()); } if(m_spell.kospell) { KPTextObject * objtxt = 0L; if(m_spell.spellCurrTextObjNum !=-1) { objtxt =m_spell.textObject.at( m_spell.spellCurrTextObjNum ) ; Q_ASSERT( objtxt ); if ( objtxt ) objtxt->removeHighlight(); } delete m_spell.kospell; } delete rb_oalign; delete rb_lbegin; delete rb_lend; delete dcop; delete m_sbPageLabel; delete notebar; delete m_searchEntry; m_searchEntry = 0L; delete m_replaceEntry; m_replaceEntry = 0L; delete m_specialCharDlg; delete styleDia; delete pgConfDia; delete transEffectDia; delete rotateDia; delete shadowDia; delete rb_pstyle; delete rb_pwidth; delete afChoose; delete m_fontDlg; delete m_paragDlg; delete m_arrangeObjectsPopup; if ( m_specialCharDlg ) m_specialCharDlg->closeDialog(); // will call slotSpecialCharDlgClosed } void KPresenterView::setupPrinter( KPrinter &prt ) { deSelectAllObjects(); m_pKPresenterDoc->recalcVariables( VT_TIME ); m_pKPresenterDoc->recalcVariables( VT_DATE ); prt.setMinMax( 1, m_pKPresenterDoc->getPageNums() ); prt.setFromTo( 1, m_pKPresenterDoc->getPageNums() ); prt.setOption( "kde-range", m_pKPresenterDoc->selectedForPrinting() ); prt.setPageSelection(KPrinter::ApplicationSide); KoPageLayout layout = m_pKPresenterDoc->pageLayout(); prt.setOption( "kde-margin-top", QString::number(layout.ptTop) ); prt.setOption( "kde-margin-bottom", QString::number(layout.ptBottom) ); prt.setOption( "kde-margin-left", QString::number(layout.ptLeft) ); prt.setOption( "kde-margin-right", QString::number(layout.ptRight) ); KoFormat pageFormat = layout.format; prt.setPageSize( static_cast( KoPageFormat::printerPageSize( pageFormat ) ) ); if ( m_pKPresenterDoc->pageLayout().orientation == PG_LANDSCAPE || pageFormat == PG_SCREEN ) prt.setOrientation( KPrinter::Landscape ); else prt.setOrientation( KPrinter::Portrait ); } void KPresenterView::unZoomDocument(int &dpiX,int &dpiY) { // ### HACK: disable zooming-when-printing if embedded parts are used. // No koffice app supports zooming in paintContent currently. // Disable in ALL cases now bool doZoom=false; dpiX = doZoom ? 300 : QPaintDevice::x11AppDpiX(); dpiY = doZoom ? 300 : QPaintDevice::x11AppDpiY(); zoomHandler()->setZoomAndResolution( 100, dpiX, dpiY ); m_pKPresenterDoc->newZoomAndResolution( false, true /* for printing*/ ); } void KPresenterView::zoomDocument(int zoom) { zoomHandler()->setZoomAndResolution( zoom, QPaintDevice::x11AppDpiX(), QPaintDevice::x11AppDpiY() ); m_pKPresenterDoc->newZoomAndResolution( false, false ); updateRuler(); } void KPresenterView::print( KPrinter &prt ) { float left_margin = 0.0; float top_margin = 0.0; int dpiX=0; int dpiY=0; int oldZoom = zoomHandler()->zoom(); bool displayFieldCode = m_pKPresenterDoc->getVariableCollection()->variableSetting()->displayFieldCode(); if ( displayFieldCode ) { m_pKPresenterDoc->getVariableCollection()->variableSetting()->setDisplayFieldCode(false); m_pKPresenterDoc->recalcVariables( VT_ALL ); } QPaintDeviceMetrics metrics( &prt ); unZoomDocument(dpiX,dpiY); if ( m_pKPresenterDoc->pageLayout().format == PG_SCREEN ) { left_margin = 28.5; top_margin = 15.0; } QPainter painter; painter.begin( &prt ); kdDebug(33001) << "KPresenterView::print scaling by " << (double)metrics.logicalDpiX() / (double)dpiX << "," << (double)metrics.logicalDpiY() / (double)dpiY << endl; painter.scale( (double)metrics.logicalDpiX() / (double)dpiX, (double)metrics.logicalDpiY() / (double)dpiY ); m_canvas->print( &painter, &prt, left_margin, top_margin ); painter.end(); zoomDocument(oldZoom); if ( displayFieldCode ) { m_pKPresenterDoc->getVariableCollection()->variableSetting()->setDisplayFieldCode(true); m_pKPresenterDoc->recalcVariables( VT_ALL ); } m_canvas->repaint(); kdDebug(33001) << "KPresenterView::print zoom&res reset" << endl; m_pKPresenterDoc->getVariableCollection()->variableSetting()->setLastPrintingDate(QDateTime::currentDateTime()); m_pKPresenterDoc->recalcVariables( VT_DATE ); } void KPresenterView::editCut() { if ( !m_canvas->currentTextObjectView() ) { m_canvas->setToolEditMode( TEM_MOUSE ); m_canvas->copyObjs(); m_canvas->deleteObjs(); } else { if ( !m_canvas->currentTextObjectView()->kpTextObject()->isProtectContent()) m_canvas->currentTextObjectView()->cut(); } } void KPresenterView::editCopy() { if ( !m_canvas->currentTextObjectView() ) { m_canvas->setToolEditMode( TEM_MOUSE ); m_canvas->copyObjs(); } else m_canvas->currentTextObjectView()->copy(); } void KPresenterView::editPaste() { if ( !m_canvas->currentTextObjectView() ) { m_canvas->setToolEditMode( TEM_MOUSE ); deSelectAllObjects(); QMimeSource *data = QApplication::clipboard()->data(); if ( data->provides( "text/uri-list" ) ) { m_pKPresenterDoc->pastePage( data, currPg ); setRanges(); skipToPage( currPg ); updateSideBarMenu(); } else if (QImageDrag::canDecode (data)) { m_canvas->dropImage( data ); } else if ( data->provides( KoStoreDrag::mimeType("application/x-kpresenter" ) )) { // TODO: it would be nice to have no offset when pasting onto a different page... m_canvas->activePage()->pasteObjs( data->encodedData(KoStoreDrag::mimeType("application/x-kpresenter")), 1, 0.0, 0.0, 0.0, 20.0, 20.0); m_canvas->setMouseSelectedObject(true); emit objectSelectedChanged(); } } else { if ( !m_canvas->currentTextObjectView()->kpTextObject()->isProtectContent()) m_canvas->currentTextObjectView()->paste(); } } void KPresenterView::editDelete() { m_canvas->setToolEditMode( TEM_MOUSE ); m_canvas->deleteObjs(); } void KPresenterView::editSelectAll() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( !edit ) { m_canvas->setToolEditMode( TEM_MOUSE ); m_canvas->selectAllObj(); } else edit->selectAll(); } void KPresenterView::editDeSelectAll() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( !edit ) { m_canvas->setToolEditMode( TEM_MOUSE ); deSelectAllObjects(); } else edit->selectAll(false); } void KPresenterView::editCopyPage() { m_pKPresenterDoc->copyPageToClipboard( currPg ); } void KPresenterView::editDuplicatePage() { m_pKPresenterDoc->copyPage( currPg, currPg+1 ); setRanges(); skipToPage( currPg ); // go to the new page updateSideBarMenu(); } void KPresenterView::updateSideBarMenu() { actionEditDelPage->setEnabled( m_pKPresenterDoc->getPageNums() > 1 ); } void KPresenterView::editDelPage() { if ( KMessageBox::questionYesNo( this, i18n( "Do you want to remove the current slide?") ) != KMessageBox::Yes ) return; m_canvas->exitEditMode(); m_pKPresenterDoc->deletePage( currPg ); setRanges(); currPg = QMIN( currPg, (int)m_pKPresenterDoc->getPageNums() - 1 ); skipToPage( currPg ); updateSideBarMenu(); } void KPresenterView::insertPage() { InsertPageDia dia( this, 0, TRUE ); QString templ = locateLocal( "appdata", "default.kpr" ); if ( !QFile::exists( templ ) ) { dia.radioDifferent->setChecked( TRUE ); dia.radioDefault->setEnabled( FALSE ); } if ( dia.exec() != QDialog::Accepted ) return; if (dia.radioCurrentDefault->isChecked()) { QString file = locateLocal( "appdata", "default.kpr" ); m_pKPresenterDoc->savePage( file, currPg, true /*ignore stickies*/ ); } InsertPos pos = (InsertPos)dia.locationCombo->currentItem(); int pg = m_pKPresenterDoc->insertNewPage( i18n("Insert new slide"), currPg, pos, dia.radioDifferent->isChecked(), QString::null ); setRanges(); if ( pg != -1 ) skipToPage( pg ); updateSideBarMenu(); } void KPresenterView::insertPicture() { m_canvas->setToolEditMode( INS_PICTURE ); deSelectAllObjects(); QStringList mimetypes; mimetypes += KImageIO::mimeTypes( KImageIO::Reading ); mimetypes += KoPictureFilePreview::clipartMimeTypes(); KFileDialog fd( m_pKPresenterDoc->picturePath(), QString::null, 0, 0, true ); fd.setCaption( i18n( "Insert Picture" ) ); fd.setMimeFilter( mimetypes ); fd.setPreviewWidget( new KoPictureFilePreview( &fd ) ); KURL url; if ( fd.exec() == QDialog::Accepted ) url = fd.selectedURL(); if( url.isEmpty() || !url.isValid() ) { m_canvas->setToolEditMode( TEM_MOUSE, false ); return; } QString file; if ( !KIO::NetAccess::download( url, file ) ) { m_canvas->setToolEditMode( TEM_MOUSE, false ); return; } if ( !file.isEmpty() ) m_canvas->activePage()->setInsPictureFile( file ); } void KPresenterView::insertPicture(const QString &file) { m_canvas->setToolEditMode( INS_PICTURE ); deSelectAllObjects(); if ( !file.isEmpty() ) m_canvas->activePage()->setInsPictureFile( file ); } void KPresenterView::savePicture() { m_canvas->savePicture(); } void KPresenterView::savePicture( const QString& oldName, KoPicture& picture) { QString oldFile(oldName); KURL url; url.setPath( oldFile ); if (!QDir(url.directory()).exists()) oldFile = url.fileName(); QString mimetype=picture.getMimeType(); kdDebug(33001) << "Picture has mime type: " << mimetype << endl; QStringList mimetypes; mimetypes << mimetype; KFileDialog fd( oldFile, QString::null, 0, 0, TRUE ); fd.setMimeFilter( mimetypes ); fd.setCaption(i18n("Save Picture")); if ( fd.exec() == QDialog::Accepted ) { url = fd.selectedURL(); if( url.isEmpty() ) { KMessageBox::sorry( this, i18n("File name is empty."), i18n("Save Picture")); return; } QFile file( url.path() ); if ( file.open( IO_ReadWrite ) ) { picture.save( &file ); file.close(); } else KMessageBox::error(this, i18n("Error during saving."), i18n("Save Picture")); } } void KPresenterView::savePicture( KPPixmapObject* obj ) { QString oldFile=obj->getFileName(); KoPicture picture(obj->picture()); savePicture(oldFile, picture); } void KPresenterView::toolsMouse() { if ( actionToolsMouse->isChecked() ) m_canvas->setToolEditMode( TEM_MOUSE, false ); else actionToolsMouse->setChecked(true); //deSelectAllObjects(); } void KPresenterView::toolsRotate() { if ( actionToolsRotate->isChecked() ) m_canvas->setToolEditMode( TEM_ROTATE, false ); else actionToolsRotate->setChecked(true); } void KPresenterView::toolsZoom() { if ( actionToolsZoom->isChecked() ) m_canvas->setToolEditMode( TEM_ZOOM, false ); else actionToolsZoom->setChecked(true); } void KPresenterView::toolsLinePopup() { switch (m_currentLineTool) { case LtLine: actionToolsLine->activate(); break; case LtFreehand: actionToolsFreehand->activate(); break; case LtPolyline: actionToolsPolyline->activate(); break; case LtQuadricBezier: actionToolsQuadricBezierCurve->activate(); break; case LtCubicBezier: actionToolsCubicBezierCurve->activate(); break; } } void KPresenterView::toolsLine() { if ( actionToolsLine->isChecked() ) { m_canvas->setToolEditMode( INS_LINE, false ); deSelectAllObjects(); m_currentLineTool = LtLine; actionToolsLinePopup->setIcon("line"); } else actionToolsLine->setChecked(true); } void KPresenterView::toolsShapePopup() { switch (m_currentShapeTool) { case StRectangle: actionToolsRectangle->activate(); break; case StCircle: actionToolsCircleOrEllipse->activate(); break; case StPie: actionToolsPie->activate(); break; case StPolygon: actionToolsConvexOrConcavePolygon->activate(); break; } } void KPresenterView::toolsRectangle() { if ( actionToolsRectangle->isChecked() ) { deSelectAllObjects(); m_canvas->setToolEditMode( INS_RECT, false ); m_currentShapeTool = StRectangle; actionToolsShapePopup->setIcon("rectangle"); } else actionToolsRectangle->setChecked(true); } void KPresenterView::toolsCircleOrEllipse() { if ( actionToolsCircleOrEllipse->isChecked() ) { deSelectAllObjects(); m_canvas->setToolEditMode( INS_ELLIPSE, false ); m_currentShapeTool = StCircle; actionToolsShapePopup->setIcon("circle"); } else actionToolsCircleOrEllipse->setChecked(true); } void KPresenterView::toolsPie() { if ( actionToolsPie->isChecked() ) { deSelectAllObjects(); m_canvas->setToolEditMode( INS_PIE, false ); m_currentShapeTool = StPie; actionToolsShapePopup->setIcon("pie"); } else actionToolsPie->setChecked(true); } void KPresenterView::toolsDiagramm() { if ( actionToolsDiagramm->isChecked() ) { deSelectAllObjects(); m_canvas->setToolEditMode( INS_DIAGRAMM, false ); KoDocumentEntry entry = KoDocumentEntry::queryByMimeType( "application/x-kchart" ); if (entry.isEmpty()) { KMessageBox::sorry( this, i18n( "No chart component registered" ) ); m_canvas->setToolEditMode( TEM_MOUSE ); } else m_canvas->setPartEntry( entry ); } else actionToolsDiagramm->setChecked(true); } void KPresenterView::toolsTable() { if ( actionToolsTable->isChecked() ) { deSelectAllObjects(); m_canvas->setToolEditMode( INS_TABLE, false ); KoDocumentEntry entry = KoDocumentEntry::queryByMimeType( "application/x-kspread" ); if (entry.isEmpty()) { KMessageBox::sorry( this, i18n( "No table component registered" ) ); m_canvas->setToolEditMode( TEM_MOUSE ); } else m_canvas->setPartEntry( entry ); } else actionToolsTable->setChecked(true); } void KPresenterView::toolsFormula() { if ( actionToolsFormula->isChecked() ) { deSelectAllObjects(); m_canvas->setToolEditMode( INS_FORMULA, false ); KoDocumentEntry entry = KoDocumentEntry::queryByMimeType( "application/x-kformula" ); if (entry.isEmpty()) { KMessageBox::sorry( this, i18n( "No formula component registered" ) ); m_canvas->setToolEditMode( TEM_MOUSE ); } else m_canvas->setPartEntry( entry ); } else actionToolsFormula->setChecked(true); } void KPresenterView::toolsText() { if ( actionToolsText->isChecked() ) { deSelectAllObjects(); m_canvas->setToolEditMode( INS_TEXT, false ); } else actionToolsText->setChecked(true); } void KPresenterView::toolsAutoform() { if ( actionToolsAutoform->isChecked() ) { deSelectAllObjects(); m_canvas->setToolEditMode( TEM_MOUSE, false ); if ( afChoose ) { delete afChoose; afChoose = 0; } afChoose = new AFChoose( this, i18n( "Autoform-Choose" ) ); afChoose->resize( 400, 300 ); afChoose->setCaption( i18n( "Insert Autoform" ) ); QObject::connect( afChoose, SIGNAL( formChosen( const QString & ) ), this, SLOT( afChooseOk( const QString & ) ) ); QObject::connect( afChoose, SIGNAL( afchooseCanceled()), this,SLOT(slotAfchooseCanceled())); afChoose->exec(); QObject::disconnect( afChoose, SIGNAL( formChosen( const QString & ) ), this, SLOT( afChooseOk( const QString & ) ) ); delete afChoose; afChoose = 0; } else actionToolsAutoform->setChecked(true); } void KPresenterView::toolsObject() { KoDocumentEntry pe = actionToolsObject->documentEntry(); if ( pe.isEmpty() ) { m_canvas->setToolEditMode( TEM_MOUSE ); return; } m_canvas->setToolEditMode( INS_OBJECT ); m_canvas->setPartEntry( pe ); } void KPresenterView::toolsFreehand() { if ( actionToolsFreehand->isChecked() ) { m_canvas->setToolEditMode( INS_FREEHAND, false ); deSelectAllObjects(); m_currentLineTool = LtFreehand; actionToolsLinePopup->setIcon("freehand"); } else actionToolsFreehand->setChecked(true); } void KPresenterView::toolsPolyline() { if ( actionToolsPolyline->isChecked() ) { m_canvas->setToolEditMode( INS_POLYLINE, false ); deSelectAllObjects(); m_currentLineTool = LtPolyline; actionToolsLinePopup->setIcon("polyline"); } else actionToolsPolyline->setChecked(true); } void KPresenterView::toolsQuadricBezierCurve() { if ( actionToolsQuadricBezierCurve->isChecked() ) { m_canvas->setToolEditMode( INS_QUADRICBEZIERCURVE, false ); deSelectAllObjects(); m_currentLineTool = LtQuadricBezier; actionToolsLinePopup->setIcon("quadricbeziercurve"); } else actionToolsQuadricBezierCurve->setChecked(true); } void KPresenterView::toolsCubicBezierCurve() { if ( actionToolsCubicBezierCurve->isChecked() ) { m_canvas->setToolEditMode( INS_CUBICBEZIERCURVE, false ); deSelectAllObjects(); m_currentLineTool = LtCubicBezier; actionToolsLinePopup->setIcon("cubicbeziercurve"); } else actionToolsCubicBezierCurve->setChecked(true); } void KPresenterView::toolsConvexOrConcavePolygon() { if ( actionToolsConvexOrConcavePolygon->isChecked() ) { m_canvas->setToolEditMode( INS_POLYGON, false ); deSelectAllObjects(); m_currentShapeTool = StPolygon; actionToolsShapePopup->setIcon("polygon"); } else actionToolsConvexOrConcavePolygon->setChecked(true); } void KPresenterView::toolsClosedLinePopup() { switch (m_currentClosedLineTool) { case CltFreehand: actionToolsClosedFreehand->activate(); break; case CltPolyline: actionToolsClosedPolyline->activate(); break; case CltQuadricBezier: actionToolsClosedQuadricBezierCurve->activate(); break; case CltCubicBezier: actionToolsClosedCubicBezierCurve->activate(); break; } } void KPresenterView::toolsClosedFreehand() { if ( actionToolsClosedFreehand->isChecked() ) { m_canvas->setToolEditMode( INS_CLOSED_FREEHAND, false ); deSelectAllObjects(); m_currentClosedLineTool = CltFreehand; actionToolsClosedLinePopup->setIcon("closed_freehand"); } else actionToolsClosedFreehand->setChecked( true ); } void KPresenterView::toolsClosedPolyline() { if ( actionToolsClosedPolyline->isChecked() ) { m_canvas->setToolEditMode( INS_CLOSED_POLYLINE, false ); deSelectAllObjects(); m_currentClosedLineTool = CltPolyline; actionToolsClosedLinePopup->setIcon("closed_polyline"); } else actionToolsClosedPolyline->setChecked( true ); } void KPresenterView::toolsClosedQuadricBezierCurve() { if ( actionToolsClosedQuadricBezierCurve->isChecked() ) { m_canvas->setToolEditMode( INS_CLOSED_QUADRICBEZIERCURVE, false ); deSelectAllObjects(); m_currentClosedLineTool = CltQuadricBezier; actionToolsClosedLinePopup->setIcon("closed_quadricbeziercurve"); } else actionToolsClosedQuadricBezierCurve->setChecked( true ); } void KPresenterView::toolsClosedCubicBezierCurve() { if ( actionToolsClosedCubicBezierCurve->isChecked() ) { m_canvas->setToolEditMode( INS_CLOSED_CUBICBEZIERCURVE, false ); deSelectAllObjects(); m_currentClosedLineTool = CltCubicBezier; actionToolsClosedLinePopup->setIcon("closed_cubicbeziercurve"); } else actionToolsClosedCubicBezierCurve->setChecked( true ); } void KPresenterView::extraPenBrush() { delete styleDia; styleDia =0L; bool canHaveStickyObj = true; bool state = (m_canvas->numberOfObjectSelected()==1); QString objectName( QString::null ); if(state) { KPObject *obj=m_canvas->getSelectedObj(); //disable this action when we select a header/footer objectName = obj->getObjectName(); if (obj==m_pKPresenterDoc->header() ||obj==m_pKPresenterDoc->footer()) canHaveStickyObj = false; } bool txtObj = (m_canvas->selectedTextObjs().count()> 0 ); styleDia = new StyleDia( this, "StyleDia", m_pKPresenterDoc, canHaveStickyObj, state,txtObj && state ); if ( state ) { styleDia->setSize( m_canvas->getSelectedObj()->getRect()); styleDia->setObjectName( objectName ); } int nbStickyObjSelected= m_pKPresenterDoc->stickyPage()->numSelected(); int nbActivePageObjSelected = m_canvas->activePage()->numSelected(); if ( nbActivePageObjSelected >0 && nbStickyObjSelected>0) styleDia->setSticky( STATE_UNDEF ); else if ( nbStickyObjSelected == 0) styleDia->setSticky( STATE_OFF ); else if ( nbStickyObjSelected> 0 && nbActivePageObjSelected == 0) styleDia->setSticky( STATE_ON ); bool result = m_canvas->getProtect( protect ); if ( m_canvas->differentProtect( result ) ) styleDia->setProtected(STATE_UNDEF); else { if (result) styleDia->setProtected( STATE_ON ); else styleDia->setProtected( STATE_OFF ); } result = m_canvas->getKeepRatio( keepRatio ); if ( m_canvas->differentKeepRatio( result ) ) styleDia->setKeepRatio(STATE_UNDEF); else { if ( result ) styleDia->setKeepRatio( STATE_ON ); else styleDia->setKeepRatio( STATE_OFF); } styleDia->setProtectContent( m_canvas->getProtectContent(protectContent)); if ( state ) { KPTextObject * obj = dynamic_cast(m_canvas->getSelectedObj()); if ( obj ) styleDia->setMargins( obj->bLeft(), obj->bRight(), obj->bTop(), obj->bBottom()); } styleDia->setCaption( i18n( "Properties" ) ); QObject::connect( styleDia, SIGNAL( styleOk() ), this, SLOT( styleOk() ) ); m_canvas->setToolEditMode( TEM_MOUSE ); styleDia->exec(); QObject::disconnect( styleDia, SIGNAL( styleOk() ), this, SLOT( styleOk() ) ); delete styleDia; styleDia = 0; } void KPresenterView::extraRaise() { m_canvas->setToolEditMode( TEM_MOUSE ); m_canvas->activePage()->raiseObjs( true ); } void KPresenterView::extraLower() { m_canvas->setToolEditMode( TEM_MOUSE ); m_canvas->activePage()->lowerObjs( true ); } void KPresenterView::extraRotate() { if ( m_canvas->numberOfObjectSelected() > 0 ) { if ( !rotateDia ) { rotateDia = new RotationDialogImpl( this ); connect( rotateDia, SIGNAL( apply() ), this, SLOT( rotateOk() ) ); } rotateDia->setAngle( m_canvas->getSelectedObj()->getAngle() ); m_canvas->setToolEditMode( TEM_MOUSE ); rotateDia->exec(); } } void KPresenterView::extraShadow() { if ( m_canvas->numberOfObjectSelected() > 0 ) { if ( !shadowDia ) { shadowDia = new ShadowDialogImpl( this ); shadowDia->resize( shadowDia->minimumSize() ); connect( shadowDia, SIGNAL( apply() ), this, SLOT( shadowOk() ) ); } KPObject *object=m_canvas->getSelectedObj(); shadowDia->setShadowDirection( object->getShadowDirection() ); if ( object->getShadowDistance() != 0 ) shadowDia->setShadowDistance( object->getShadowDistance() ); else shadowDia->setShadowDistance( 3 ); shadowDia->setShadowColor( object->getShadowColor() ); m_canvas->setToolEditMode( TEM_MOUSE ); shadowDia->exec(); } } void KPresenterView::extraAlignObjs() { m_canvas->setToolEditMode( TEM_MOUSE ); QPoint pnt( QCursor::pos() ); rb_oalign->popup( pnt ); } void KPresenterView::extraBackground() { KPrPage *page=m_canvas->activePage(); BackDia* backDia = new BackDia( this, "InfoDia", page->getBackType( ), page->getBackColor1( ), page->getBackColor2( ), page->getBackColorType( ), page->getBackPicture( ), page->getBackView(), page->getBackUnbalanced(), page->getBackXFactor(), page->getBackYFactor( ), page ); backDia->setCaption( i18n( "Slide Background" ) ); QObject::connect( backDia, SIGNAL( backOk( BackDia*, bool ) ), this, SLOT( backOk( BackDia*, bool ) ) ) ; backDia->exec(); QObject::disconnect( backDia, SIGNAL( backOk( BackDia*, bool ) ), this, SLOT( backOk( BackDia*, bool ) ) ); delete backDia; } void KPresenterView::extraLayout() { KoPageLayout pgLayout = m_pKPresenterDoc->pageLayout(); KoPageLayout oldLayout = pgLayout; KoHeadFoot hf; KoUnit::Unit oldUnit = m_pKPresenterDoc->getUnit(); KoUnit::Unit unit = oldUnit; if ( KoPageLayoutDia::pageLayout( pgLayout, hf, FORMAT_AND_BORDERS, unit ) ) { PgLayoutCmd *pgLayoutCmd = new PgLayoutCmd( i18n( "Set Page Layout" ), pgLayout, oldLayout, oldUnit, unit,kPresenterDoc() ); pgLayoutCmd->execute(); kPresenterDoc()->addCommand( pgLayoutCmd ); updateRuler(); } } void KPresenterView::extraConfigure() { KPConfig configDia( this ); configDia.exec(); } void KPresenterView::extraCreateTemplate() { int width = 60; int height = 60; QPixmap pix = m_pKPresenterDoc->generatePreview(QSize(width, height)); KTempFile tempFile( QString::null, ".kpt" ); tempFile.setAutoDelete( true ); m_pKPresenterDoc->savePage( tempFile.name(), getCurrPgNum() - 1); KoTemplateCreateDia::createTemplate( "kpresenter_template", KPresenterFactory::global(), tempFile.name(), pix, this); KPresenterFactory::global()->dirs()->addResourceType("kpresenter_template", KStandardDirs::kde_default( "data" ) + "kpresenter/templates/"); } void KPresenterView::extraDefaultTemplate() { QString file = locateLocal( "appdata", "default.kpr" ); m_pKPresenterDoc->savePage( file, currPg ); } void KPresenterView::extraWebPres() { if ( !allowWebPres ) return; KURL url; QString config = QString::null; int ret =KMessageBox::questionYesNoCancel( this, i18n( "Do you want to load a previously saved configuration" " which will be used for this HTML Presentation?" ), i18n( "Create HTML Presentation" ) ); if( ret == KMessageBox::Cancel ) return; else if ( ret == KMessageBox::Yes ) { url = KFileDialog::getOpenURL( QString::null, i18n("*.kpweb|KPresenter HTML Presentation (*.kpweb)") ); if( url.isEmpty() ) return; if( !url.isLocalFile() ) { KMessageBox::sorry( this, i18n( "Only local files are currently supported." ) ); return; } config = url.path(); } KPWebPresentationWizard::createWebPresentation( config, m_pKPresenterDoc, this ); } void KPresenterView::extraLineBegin() { m_canvas->setToolEditMode( TEM_MOUSE ); QPoint pnt( QCursor::pos() ); rb_lbegin->popup( pnt ); } void KPresenterView::extraLineEnd() { m_canvas->setToolEditMode( TEM_MOUSE ); QPoint pnt( QCursor::pos() ); rb_lend->popup( pnt ); } void KPresenterView::extraGroup() { m_canvas->setToolEditMode( TEM_MOUSE ); m_canvas->groupObjects(); objectSelectedChanged(); } void KPresenterView::extraUnGroup() { m_canvas->setToolEditMode( TEM_MOUSE ); m_canvas->ungroupObjects(); objectSelectedChanged(); } void KPresenterView::extraPenStyle() { m_canvas->setToolEditMode( TEM_MOUSE ); QPoint pnt( QCursor::pos() ); rb_pstyle->popup( pnt ); } void KPresenterView::extraPenWidth() { m_canvas->setToolEditMode( TEM_MOUSE ); QPoint pnt( QCursor::pos() ); rb_pwidth->popup( pnt ); } void KPresenterView::screenConfigPages() { delete pgConfDia; pgConfDia = 0; pgConfDia = new PgConfDia( this, kPresenterDoc() ); pgConfDia->setCaption( i18n( "Configure Slide Show" ) ); QObject::connect( pgConfDia, SIGNAL( pgConfDiaOk() ), this, SLOT( pgConfOk() ) ); pgConfDia->exec(); QObject::disconnect( pgConfDia, SIGNAL( pgConfDiaOk() ), this, SLOT( pgConfOk() ) ); delete pgConfDia; pgConfDia = 0; } void KPresenterView::screenTransEffect() { if( transEffectDia ) { delete transEffectDia; transEffectDia = 0; } transEffectDia = new KPTransEffectDia( this, "slideTransitionDialog", kPresenterDoc(), this ); transEffectDia->setCaption( i18n("Slide Transition") ); QObject::connect( transEffectDia, SIGNAL( transEffectDiaOk() ), this, SLOT( transEffectOk() ) ); transEffectDia->exec(); QObject::disconnect( transEffectDia, SIGNAL( transEffectDiaOk() ), this, SLOT( transEffectOk() ) ); delete transEffectDia; transEffectDia = 0; } void KPresenterView::screenAssignEffect() { m_canvas->setToolEditMode( TEM_MOUSE ); QPtrList objs; if ( m_canvas->canAssignEffect( objs ) ) { EffectDia *effectDia = new EffectDia( this, "Object Effect", objs, this ); effectDia->setCaption( i18n( "Object Effect" ) ); effectDia->exec(); //the dialog executes the command itself delete effectDia; } } void KPresenterView::screenStart() { startScreenPres( getCurrPgNum() ); } void KPresenterView::screenStartFromFirst() { startScreenPres( 1 ); } void KPresenterView::startScreenPres( int pgNum /*1-based*/ ) { // no slide is selected ? if( !kPresenterDoc()->selectedSlides().count() ) { KMessageBox::sorry( this, i18n("You didn't select any slide." ), i18n("No Slide") ); return; } m_canvas->setToolEditMode( TEM_MOUSE ); if ( m_canvas && !presStarted ) { QByteArray data; QByteArray replyData; QCString replyType; m_screenSaverWasEnabled = false; // is screensaver enabled? if (kapp->dcopClient()->call("kdesktop", "KScreensaverIface", "isEnabled()", data, replyType, replyData) && replyType=="bool") { QDataStream replyArg(replyData, IO_ReadOnly); replyArg >> m_screenSaverWasEnabled; if ( m_screenSaverWasEnabled ) { // disable screensaver QDataStream arg(data, IO_WriteOnly); arg << false; if (!kapp->dcopClient()->send("kdesktop", "KScreensaverIface", "enable(bool)", data)) kdWarning(33001) << "Couldn't disable screensaver (using dcop to kdesktop)!" << endl; else kdDebug(33001) << "Screensaver successfully disabled" << endl; } } deSelectAllObjects(); presStarted = true; #if KDE_IS_VERSION(3,1,90) QRect desk = KGlobalSettings::desktopGeometry(this); #else QRect desk = QApplication::desktop()->screenGeometry(this); #endif QRect pgRect = kPresenterDoc()->pageList().at(0)->getZoomPageRect(); float _presFaktW = static_cast( desk.width() ) / static_cast( pgRect.width() ); float _presFaktH = static_cast( desk.height() ) / static_cast( pgRect.height() ); float _presFakt = QMIN(_presFaktW,_presFaktH); kdDebug(33001) << "KPresenterView::startScreenPres page->setPresFakt " << _presFakt << endl; xOffsetSaved = canvasXOffset(); yOffsetSaved = canvasYOffset(); m_bDisplayFieldCode = m_pKPresenterDoc->getVariableCollection()->variableSetting()->displayFieldCode(); if ( m_bDisplayFieldCode ) { m_pKPresenterDoc->getVariableCollection()->variableSetting()->setDisplayFieldCode(false); m_pKPresenterDoc->recalcVariables( VT_ALL ); } setCanvasXOffset( 0 ); setCanvasYOffset( 0 ); // Center the slide in the screen, if it's smaller... pgRect = kPresenterDoc()->pageList().at(0)->getZoomPageRect(); kdDebug(33001) << " pgRect: " << pgRect.x() << "," << pgRect.y() << " " << pgRect.width() << "x" << pgRect.height() << endl; /*if ( deskw > pgRect.width() ) xOffset -= ( deskw - pgRect.width() ) / 2; if ( deskh > pgRect.height() ) yOffset -= ( deskh - pgRect.height() ) / 2;*/ vert->setEnabled( false ); horz->setEnabled( false ); m_bShowGUI = false; m_canvas->reparent( ( QWidget* )0L, 0, QPoint( 0, 0 ), FALSE ); m_canvas->setPaletteBackgroundColor( Qt::white ); m_canvas->showFullScreen(); m_canvas->setFocusPolicy( QWidget::StrongFocus ); m_canvas->startScreenPresentation( _presFakt, pgNum ); actionScreenStart->setEnabled( false ); if ( kPresenterDoc()->presentationDuration() ) { m_presentationDuration.start(); // ### make m_presentationDuration a QMemArray for ( unsigned int i = 0; i < kPresenterDoc()->pageList().count(); ++i ) m_presentationDurationList.append( 0 ); // initialization } if ( !kPresenterDoc()->spManualSwitch() ) { continuePres = true; exitPres = false; m_pKPresenterDoc->repaint( false ); if ( automaticScreenPresFirstTimer ) { connect( &automaticScreenPresTimer, SIGNAL( timeout() ), SLOT( doAutomaticScreenPres() ) ); automaticScreenPresTime.start(); automaticScreenPresWaitTime = 0; setCurrentTimer( 1 ); automaticScreenPresTimer.start( currentTimer ); automaticScreenPresFirstTimer = false; } else autoScreenPresReStartTimer(); } } } void KPresenterView::screenStop() { if ( presStarted ) { continuePres = false; exitPres = true; m_canvas->setNextPageTimer( true ); m_canvas->stopSound(); m_canvas->showNormal(); m_canvas->hide(); m_canvas->reparent( pageBase, 0, QPoint( 0, 0 ), true ); m_canvas->lower(); setCanvasXOffset( xOffsetSaved ); setCanvasYOffset( yOffsetSaved ); if ( m_bDisplayFieldCode ) { m_pKPresenterDoc->getVariableCollection()->variableSetting()->setDisplayFieldCode(true); m_pKPresenterDoc->recalcVariables( VT_ALL ); } // if ( kPresenterDoc()->presentationDuration() && !m_presentationDurationList.isEmpty() ) // setPresentationDuration( m_canvas->presPage() - 1 ); m_canvas->stopScreenPresentation(); presStarted = false; vert->setEnabled( true ); horz->setEnabled( true ); m_bShowGUI = true; m_canvas->setMouseTracking( true ); m_canvas->setBackgroundMode( Qt::NoBackground ); if ( m_screenSaverWasEnabled ) { // start screensaver again QByteArray data; QDataStream arg(data, IO_WriteOnly); arg << true; if (!kapp->dcopClient()->send("kdesktop", "KScreensaverIface", "enable(bool)", data)) kdWarning(33001) << "Couldn't re-enabled screensaver (using dcop to kdesktop)" << endl; } actionScreenStart->setEnabled( true ); pageBase->resizeEvent( 0 ); m_canvas->setActivePage( m_pKPresenterDoc->pageList().at( getCurrPgNum() - 1 ) ); if ( kPresenterDoc()->presentationDuration() && !m_presentationDurationList.isEmpty() ) { openThePresentationDurationDialog(); m_presentationDurationList.clear(); } } } void KPresenterView::screenPause() { } void KPresenterView::screenFirst() { if ( m_canvas->currentTextObjectView() ) #if 0 m_canvas->currentTextObjectView()->home(); #else ; #endif else { if ( !presStarted ) skipToPage( 0 ); else gotoPresPage( 1 ); } } void KPresenterView::screenPrev() { if ( m_canvas->currentTextObjectView() ) return; if ( presStarted ) { if ( !kPresenterDoc()->spManualSwitch() ) { setCurrentTimer( 1 ); m_canvas->setNextPageTimer( true ); } #if KDE_IS_VERSION(3,1,90) QRect desk = KGlobalSettings::desktopGeometry(this); #else QRect desk = QApplication::desktop()->screenGeometry(this); #endif if ( m_canvas->pPrev( true ) ) { #if 0 // TODO currentPage-- instead QRect pgRect = kPresenterDoc()->getPageRect( 0, 0, 0, m_canvas->presFakt(), false ); yOffset = ( m_canvas->presPage() - 1 ) * pgRect.height(); if ( m_canvas->height() > pgRect.height() ) yOffset -= ( m_canvas->height() - pgRect.height() ) / 2; #endif m_canvas->resize( desk.width(), desk.height() ); m_canvas->repaint( false ); m_canvas->setFocus(); } else { m_canvas->resize( desk.width(), desk.height() ); m_canvas->setFocus(); } } else prevPage(); } void KPresenterView::screenNext() { if ( m_canvas->currentTextObjectView() ) return; if ( presStarted ) { #if KDE_IS_VERSION(3,1,90) QRect desk = KGlobalSettings::desktopGeometry(this); #else QRect desk = QApplication::desktop()->screenGeometry(this); #endif if ( m_canvas->pNext( true ) ) { #if 0 // TODO currentPage-- instead QRect pgRect = kPresenterDoc()->getPageRect( 0, 0, 0, m_canvas->presFakt(), false ); yOffset = ( m_canvas->presPage() - 1 ) * pgRect.height(); if ( m_canvas->height() > pgRect.height() ) yOffset -= ( m_canvas->height() - pgRect.height() ) / 2; #endif m_canvas->resize( desk.width(), desk.height() ); m_canvas->setFocus(); if ( !kPresenterDoc()->spManualSwitch() ) { setCurrentTimer( 1 ); m_canvas->setNextPageTimer( true ); } } else { m_canvas->resize( desk.width(), desk.height() ); m_canvas->setFocus(); } } else { nextPage(); } } void KPresenterView::screenLast() { if ( m_canvas->currentTextObjectView() ) #if 0 m_canvas->currentTextObjectView()->end(); #else ; #endif else { if ( !presStarted ) skipToPage( m_pKPresenterDoc->getPageNums() - 1 ); else gotoPresPage( getNumPresPages() ); } } void KPresenterView::screenSkip() { } void KPresenterView::sizeSelected( int size ) { tbFont.setPointSize( size ); m_canvas->setTextPointSize( size ); m_canvas->setFocus(); } void KPresenterView::fontSelected( const QString &fontFamily ) { tbFont.setFamily( fontFamily ); m_canvas->setTextFamily( fontFamily ); m_canvas->setFocus(); } void KPresenterView::textBold() { bool b=actionTextBold->isChecked(); tbFont.setBold( b ); m_canvas->setTextBold(b ); } void KPresenterView::textStrikeOut() { bool b=actionFormatStrikeOut->isChecked(); tbFont.setStrikeOut( b ); m_canvas->setTextStrikeOut( b ); } void KPresenterView::textItalic() { bool b=actionTextItalic->isChecked(); tbFont.setItalic( b ); m_canvas->setTextItalic( b ); } void KPresenterView::textUnderline() { bool b=actionTextUnderline->isChecked(); tbFont.setUnderline( b ); m_canvas->setTextUnderline( b ); } void KPresenterView::textColor() { tbColor = actionTextColor->color(); m_canvas->setTextColor( tbColor ); } void KPresenterView::textAlignLeft() { if ( actionTextAlignLeft->isChecked() ) { tbAlign = Qt::AlignLeft; m_canvas->setTextAlign( tbAlign ); } else actionTextAlignLeft->setChecked(true); } void KPresenterView::textAlignCenter() { if ( actionTextAlignCenter->isChecked() ) { tbAlign = Qt::AlignHCenter; m_canvas->setTextAlign(tbAlign); } else actionTextAlignCenter->setChecked(true); } void KPresenterView::textAlignRight() { if ( actionTextAlignRight->isChecked() ) { tbAlign = Qt::AlignRight; m_canvas->setTextAlign(tbAlign); } else actionTextAlignRight->setChecked(true); } void KPresenterView::textAlignBlock() { if ( actionTextAlignBlock->isChecked() ) { tbAlign = Qt::AlignJustify; m_canvas->setTextAlign(tbAlign); } else actionTextAlignBlock->setChecked(true); } void KPresenterView::textInsertPageNum() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit ) edit->insertVariable( VT_PGNUM, KoPgNumVariable::VST_PGNUM_CURRENT ); } void KPresenterView::mtextFont() { KoTextFormatInterface* textIface = m_canvas->applicableTextInterfaces().first(); QColor col; if (textIface) col = textIface->textBackgroundColor(); col = col.isValid() ? col : QApplication::palette().color( QPalette::Active, QColorGroup::Base ); if( m_fontDlg ) { delete m_fontDlg; m_fontDlg = 0L; } m_fontDlg = new KoFontDia( *textIface->currentFormat(), this, 0L ); connect( m_fontDlg, SIGNAL( applyFont() ), this, SLOT( slotApplyFont() ) ); m_fontDlg->exec(); delete m_fontDlg; m_fontDlg=0L; } void KPresenterView::slotApplyFont() { int flags = m_fontDlg->changedFlags(); if ( flags ) { m_canvas->setTextFormat(m_fontDlg->newFormat(), flags); } } void KPresenterView::slotCounterStyleSelected() { QString actionName = QString::fromLatin1(sender()->name()); if ( actionName.startsWith( "counterstyle_" ) ) { QString styleStr = actionName.mid(13); //kdDebug(33001) << "KWView::slotCounterStyleSelected styleStr=" << styleStr << endl; KoParagCounter::Style style = (KoParagCounter::Style)(styleStr.toInt()); KoParagCounter c; if ( style == KoParagCounter::STYLE_NONE ) c.setNumbering( KoParagCounter::NUM_NONE ); else { c.setNumbering( KoParagCounter::NUM_LIST ); c.setStyle( style ); if ( c.isBullet() ) c.setSuffix( QString::null ); // else the suffix remains the default, '.' // TODO save this setting, to use the last one selected in the dialog? // (same for custom bullet char etc.) } QPtrList lst = m_canvas->applicableTextInterfaces(); QPtrListIterator it( lst ); KMacroCommand* macroCmd = 0L; for ( ; it.current() ; ++it ) { KCommand *cmd = it.current()->setCounterCommand( c ); if ( cmd ) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Change List Type") ); macroCmd->addCommand( cmd ); } } if( macroCmd) m_pKPresenterDoc->addCommand( macroCmd ); } } void KPresenterView::textDepthPlus() { m_canvas->setTextDepthPlus(); } void KPresenterView::textDepthMinus() { m_canvas->setTextDepthMinus(); } void KPresenterView::textContentsToHeight() { m_canvas->textContentsToHeight(); } void KPresenterView::textObjectToContents() { m_canvas->textObjectToContents(); } void KPresenterView::penChosen() { QColor c = actionPenColor->color(); if ( !m_canvas->currentTextObjectView() ) { KPrPage *page = m_canvas->activePage(); QPen e_pen = QPen(c, page->getPen(pen).width(), page->getPen(pen).style()); KMacroCommand *macro= 0L; KCommand *cmd=page->setPen( e_pen, page->getLineBegin( lineBegin ), page->getLineEnd( lineEnd ), PenCmd::Color, page->objectList() ); if(cmd) { macro= new KMacroCommand(i18n( "Change Pen Color" )); macro->addCommand(cmd); } cmd=stickyPage()->setPen( e_pen, page->getLineBegin( lineBegin ), page->getLineEnd( lineEnd ), PenCmd::Color, page->objectList() ); if(cmd) { if (!macro ) macro= new KMacroCommand(i18n( "Change Pen Color" )); macro->addCommand(cmd); } if(macro) m_pKPresenterDoc->addCommand(macro); else pen.setColor( c ); } else { tbColor = c; m_canvas->setTextColor( tbColor ); } } void KPresenterView::brushChosen() { QColor c = actionBrushColor->color(); KPTextView *edit=m_canvas->currentTextObjectView(); if ( !edit ) { bool fill = true; KMacroCommand *macro= 0L; KCommand *cmd=0L; cmd=m_canvas->activePage()->setBrushColor( c, fill,m_canvas->activePage()->objectList() ); if(cmd) { if ( !macro ) macro= new KMacroCommand(i18n( "Change Brush Color" )); macro->addCommand(cmd); } cmd=stickyPage()->setBrushColor( c, fill,stickyPage()->objectList() ); if(cmd) { if ( !macro ) macro= new KMacroCommand(i18n( "Change Brush Color" )); macro->addCommand(cmd); } if(macro) m_pKPresenterDoc->addCommand(macro); else { if ( fill ) brush.setColor( c ); else brush = NoBrush; } } else { tbColor = c; m_canvas->setTextBackgroundColor(c); } } void KPresenterView::extraAlignObjLeft() { m_canvas->alignObjLeft(); } void KPresenterView::extraAlignObjCenterH() { m_canvas->alignObjCenterH(); } void KPresenterView::extraAlignObjRight() { m_canvas->alignObjRight(); } void KPresenterView::extraAlignObjTop() { m_canvas->alignObjTop(); } void KPresenterView::extraAlignObjCenterV() { m_canvas->alignObjCenterV(); } void KPresenterView::extraAlignObjBottom() { m_canvas->alignObjBottom(); } void KPresenterView::extraLineBeginNormal() { setExtraLineBegin(L_NORMAL); } void KPresenterView::extraLineBeginArrow() { setExtraLineBegin(L_ARROW); } void KPresenterView::extraLineBeginRect() { setExtraLineBegin(L_SQUARE); } void KPresenterView::extraLineBeginCircle() { setExtraLineBegin(L_CIRCLE); } void KPresenterView::extraLineBeginLineArrow() { setExtraLineBegin( L_LINE_ARROW ); } void KPresenterView::extraLineBeginDimensionLine() { setExtraLineBegin( L_DIMENSION_LINE ); } void KPresenterView::extraLineBeginDoubleArrow() { setExtraLineBegin( L_DOUBLE_ARROW ); } void KPresenterView::extraLineBeginDoubleLineArrow() { setExtraLineBegin( L_DOUBLE_LINE_ARROW ); } void KPresenterView::setExtraLineBegin(LineEnd lb) { KPrPage *page=m_canvas->activePage(); QPen e_pen = QPen(page->getPen(pen).color(), page->getPen(pen).width(), page->getPen(pen).style()); KMacroCommand *macro=0L; KCommand *cmd=page->setPen( e_pen, lb, page->getLineEnd( lineEnd ), PenCmd::LineBegin, page->objectList() ); if(cmd) { if ( !macro ) macro=new KMacroCommand(i18n("Change Line Begin")); macro->addCommand(cmd); } cmd=stickyPage()->setPen( e_pen, lb, page->getLineEnd( lineEnd ), PenCmd::LineBegin, stickyPage()->objectList() ); if(cmd) { if ( !macro ) macro=new KMacroCommand(i18n("Change Line Begin")); macro->addCommand(cmd); } if(macro) kPresenterDoc()->addCommand(macro); else lineBegin = lb; } void KPresenterView::extraLineEndNormal() { setExtraLineEnd(L_NORMAL); } void KPresenterView::extraLineEndArrow() { setExtraLineEnd(L_ARROW); } void KPresenterView::extraLineEndRect() { setExtraLineEnd(L_SQUARE); } void KPresenterView::extraLineEndCircle() { setExtraLineEnd(L_CIRCLE); } void KPresenterView::extraLineEndLineArrow() { setExtraLineEnd( L_LINE_ARROW ); } void KPresenterView::extraLineEndDimensionLine() { setExtraLineEnd( L_DIMENSION_LINE ); } void KPresenterView::extraLineEndDoubleArrow() { setExtraLineEnd( L_DOUBLE_ARROW ); } void KPresenterView::extraLineEndDoubleLineArrow() { setExtraLineEnd( L_DOUBLE_LINE_ARROW ); } void KPresenterView::setExtraLineEnd(LineEnd le) { KPrPage *page=m_canvas->activePage(); QPen e_pen = QPen(page->getPen(pen).color(), page->getPen(pen).width(), page->getPen(pen).style()); KMacroCommand *macro=0L; KCommand *cmd=page->setPen( e_pen, page->getLineBegin( lineBegin ), le, PenCmd::LineEnd, page->objectList() ); if(cmd) { if (!macro ) macro=new KMacroCommand(i18n("Change Line End")); macro->addCommand(cmd); } cmd=stickyPage()->setPen( e_pen, page->getLineBegin( lineBegin ), le, PenCmd::LineEnd, stickyPage()->objectList() ); if(cmd) { if (!macro ) macro=new KMacroCommand(i18n("Change Line End")); macro->addCommand(cmd); } if(macro) kPresenterDoc()->addCommand(macro); else lineEnd = le; } void KPresenterView::extraPenStyleSolid() { setExtraPenStyle( Qt::SolidLine ); } void KPresenterView::extraPenStyleDash() { setExtraPenStyle( Qt::DashLine ); } void KPresenterView::extraPenStyleDot() { setExtraPenStyle( Qt::DotLine ); } void KPresenterView::extraPenStyleDashDot() { setExtraPenStyle( Qt::DashDotLine ); } void KPresenterView::extraPenStyleDashDotDot() { setExtraPenStyle( Qt::DashDotDotLine ); } void KPresenterView::extraPenStyleNoPen() { setExtraPenStyle( Qt::NoPen ); } void KPresenterView::setExtraPenStyle( Qt::PenStyle style ) { KPrPage *page = m_canvas->activePage(); QPen e_pen = QPen(page->getPen(pen).color(), page->getPen(pen).width(), style ); KMacroCommand *macro=0L; KCommand *cmd=page->setPen( e_pen, page->getLineBegin( lineBegin ), page->getLineEnd( lineEnd ), PenCmd::Style, page->objectList() ); if(cmd) { if ( !macro ) macro=new KMacroCommand(i18n("Change Pen Style")); macro->addCommand(cmd); } cmd=stickyPage()->setPen( e_pen, page->getLineBegin( lineBegin ), page->getLineEnd( lineEnd ), PenCmd::Style, stickyPage()->objectList() ); if(cmd) { if ( !macro ) macro=new KMacroCommand(i18n("Change Pen Style")); macro->addCommand(cmd); } if(macro) kPresenterDoc()->addCommand(macro); else pen = e_pen; } void KPresenterView::extraPenWidth1() { setExtraPenWidth( 1 ); } void KPresenterView::extraPenWidth2() { setExtraPenWidth( 2 ); } void KPresenterView::extraPenWidth3() { setExtraPenWidth( 3 ); } void KPresenterView::extraPenWidth4() { setExtraPenWidth( 4 ); } void KPresenterView::extraPenWidth5() { setExtraPenWidth( 5 ); } void KPresenterView::extraPenWidth6() { setExtraPenWidth( 6 ); } void KPresenterView::extraPenWidth7() { setExtraPenWidth( 7 ); } void KPresenterView::extraPenWidth8() { setExtraPenWidth( 8 ); } void KPresenterView::extraPenWidth9() { setExtraPenWidth( 9 ); } void KPresenterView::extraPenWidth10() { setExtraPenWidth( 10 ); } void KPresenterView::setExtraPenWidth( unsigned int width ) { KPrPage *page=m_canvas->activePage(); QPen e_pen = QPen(page->getPen(pen).color(), width, page->getPen(pen).style()); KMacroCommand *macro=0L; KCommand *cmd=page->setPen( e_pen, page->getLineBegin( lineBegin ), page->getLineEnd( lineEnd ), PenCmd::Width, page->objectList() ); if(cmd) { if ( !macro ) macro=new KMacroCommand(i18n("Change Pen Width")); macro->addCommand(cmd); } cmd=stickyPage()->setPen( e_pen, page->getLineBegin( lineBegin ), page->getLineEnd( lineEnd ), PenCmd::Width, stickyPage()->objectList() ); if(cmd) { if ( !macro ) macro=new KMacroCommand(i18n("Change Pen Width")); macro->addCommand(cmd); } if(macro) kPresenterDoc()->addCommand(macro); else pen = e_pen; } void KPresenterView::newPageLayout( KoPageLayout _layout ) { KoPageLayout oldLayout = m_pKPresenterDoc->pageLayout(); KoUnit::Unit unit = m_pKPresenterDoc->getUnit(); // unchanged PgLayoutCmd *pgLayoutCmd = new PgLayoutCmd( i18n( "Set Page Layout" ), _layout, oldLayout, unit, unit,kPresenterDoc() ); pgLayoutCmd->execute(); kPresenterDoc()->addCommand( pgLayoutCmd ); updateRuler(); } void KPresenterView::updateRuler() { //update koruler QRect r=m_canvas->activePage()->getZoomPageRect(); getHRuler()->setFrameStartEnd( r.left(), r.right()/*+m_canvas->diffx()*/ ); getVRuler()->setFrameStartEnd( r.top(), r.bottom()/*+m_canvas->diffy()*/ ); } void KPresenterView::createGUI() { splitter = new QSplitter( this ); if ( !m_pKPresenterDoc->isEmbedded() && !m_pKPresenterDoc->isSingleViewMode() ) // No sidebar if the document is embedded { sidebar = new SideBar( splitter, m_pKPresenterDoc, this ); connect( sidebar, SIGNAL( movePage( int, int ) ), m_pKPresenterDoc, SLOT( movePage( int, int ) ) ); connect( sidebar, SIGNAL( selectPage( int, bool ) ), m_pKPresenterDoc, SLOT( selectPage( int, bool ) ) ); connect( sidebar, SIGNAL( showPage( int ) ), this, SLOT( skipToPage( int ) ) ); // This sucks when resizing the window //splitter->setResizeMode( sidebar, QSplitter::FollowSizeHint ); //splitter->setResizeMode( pageBase, QSplitter::Stretch ); splitter->setResizeMode( sidebar, QSplitter::KeepSize ); } QSplitter *splitterVertical = new QSplitter( QSplitter::Vertical, splitter ); // setup page pageBase = new PageBase( splitterVertical, this ); pageBase->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); m_canvas=new KPrCanvas( pageBase, "Canvas", this ); QObject::connect( m_canvas, SIGNAL( fontChanged( const QFont & ) ), this, SLOT( fontChanged( const QFont & ) ) ); QObject::connect( m_canvas, SIGNAL( colorChanged( const QColor & ) ), this, SLOT( colorChanged( const QColor & ) ) ); QObject::connect( m_canvas, SIGNAL( alignChanged( int ) ), this, SLOT( alignChanged( int ) ) ); QObject::connect( m_canvas, SIGNAL( updateSideBarItem( int ) ), this, SLOT( updateSideBarItem( int ) ) ); QObject::connect( m_canvas, SIGNAL( objectSelectedChanged()), this, SLOT( objectSelectedChanged())); QObject::connect( m_canvas, SIGNAL( sigMouseWheelEvent( QWheelEvent* ) ), this, SLOT( getPageMouseWheelEvent( QWheelEvent* ) ) ); // setup notebar. if ( !m_pKPresenterDoc->isEmbedded() && !m_pKPresenterDoc->isSingleViewMode() ) // No notebar if the document is embedded { notebar = new NoteBar( splitterVertical, this ); QValueList tmpList; tmpList << 100 << 10; splitterVertical->setSizes( tmpList ); } // setup GUI setupActions(); setupPopupMenus(); setupScrollbars(); setRanges(); setupRulers(); if ( m_pKPresenterDoc && m_canvas ) QObject::connect( m_canvas, SIGNAL( stopPres() ), this, SLOT( stopPres() ) ); if ( sidebar ) { sidebar->outline()->setCurrentItem( sidebar->outline()->firstChild() ); sidebar->outline()->setSelected( sidebar->outline()->firstChild(), TRUE ); KConfig *config=KGlobal::config(); config->setGroup("Global"); if(!config->readBoolEntry("Sidebar", true)) { sidebar->hide(); actionViewShowSideBar->setChecked(false); } } if ( notebar ) { KConfig *config=KGlobal::config(); config->setGroup("Global"); if(!config->readBoolEntry("Notebar", true)) { notebar->hide(); actionViewShowNoteBar->setChecked(false); } } KPrPage *initPage=m_pKPresenterDoc->initialActivePage(); if ( !initPage ) m_pKPresenterDoc->pageList().at( 0 ); // first page skipToPage( m_pKPresenterDoc->pageList().findRef( initPage ) ); } void KPresenterView::initGui() { tbColor = Qt::black; actionTextColor->setCurrentColor( Qt::black ); actionBrushColor->setCurrentColor( Qt::white ); actionPenColor->setCurrentColor( Qt::black ); updateSideBarMenu(); objectSelectedChanged(); refreshPageButton(); KStatusBar * sb = statusBar(); if ( sb ) sb->show(); showZoom( zoomHandler()->zoom() ); updateHeaderFooterButton(); actionAllowAutoFormat->setChecked( m_pKPresenterDoc->allowAutoFormat() ); actionViewFormattingChars->setChecked( m_pKPresenterDoc->viewFormattingChars() ); updateHelpLineButton(); updateGridButton(); m_pKPresenterDoc->updateZoomRuler(); updatePageInfo(); actionAllowBgSpellCheck->setChecked( m_pKPresenterDoc->backgroundSpellCheckEnabled()); updateDirectCursorButton(); m_pKPresenterDoc->updatePresentationButton(); } void KPresenterView::updateHeaderFooterButton() { actionViewHeader->setChecked(m_pKPresenterDoc->hasHeader()); actionViewFooter->setChecked(m_pKPresenterDoc->hasFooter()); } void KPresenterView::guiActivateEvent( KParts::GUIActivateEvent *ev ) { if ( ev->activated() ) initGui(); KoView::guiActivateEvent( ev ); } void KPresenterView::setupActions() { actionEditCut = KStdAction::cut( this, SLOT( editCut() ), actionCollection(), "edit_cut" ); actionEditCopy = KStdAction::copy( this, SLOT( editCopy() ), actionCollection(), "edit_copy" ); actionEditPaste = KStdAction::paste( this, SLOT( editPaste() ), actionCollection(), "edit_paste" ); connect( m_pKPresenterDoc, SIGNAL( enablePaste( bool ) ), actionEditPaste, SLOT( setEnabled( bool ) ) ); m_pKPresenterDoc->clipboardDataChanged(); // set paste's initial state actionEditDelete = new KAction( i18n( "&Delete" ), "editdelete", CTRL + Key_Delete, this, SLOT( editDelete() ), actionCollection(), "edit_delete" ); actionEditSelectAll = KStdAction::selectAll( this, SLOT( editSelectAll() ), actionCollection(), "edit_selectall" ); actionEditDeSelectAll= KStdAction::deselect( this, SLOT( editDeSelectAll()), actionCollection(), "edit_deselectall"); /*actionEditCopyPage = */new KAction( i18n( "Copy Slide" ), "editcopy", 0, this, SLOT( editCopyPage() ), actionCollection(), "edit_copypage" ); /*actionEditDuplicatePage =*/ new KAction( i18n( "Duplicate Slide" ), "newslide", 0, this, SLOT( editDuplicatePage() ), actionCollection(), "edit_duplicatepage" ); actionEditDelPage = new KAction( i18n( "Delete Slide" ), "delslide", 0, this, SLOT( editDelPage() ), actionCollection(), "edit_delpage" ); actionEditFind=KStdAction::find( this, SLOT( editFind() ), actionCollection(), "edit_find" ); actionEditFindNext = KStdAction::findNext( this, SLOT( editFindNext() ), actionCollection(), "edit_findnext" ); actionEditFindPrevious = KStdAction::findPrev( this, SLOT( editFindPrevious() ), actionCollection(), "edit_findprevious" ); actionEditReplace=KStdAction::replace( this, SLOT( editReplace() ), actionCollection(), "edit_replace" ); // ---------------- View actions if ( !m_pKPresenterDoc->isEmbedded() ) { actionViewShowSideBar = new KToggleAction( i18n("Show Sidebar"), 0, this, SLOT( viewShowSideBar() ), actionCollection(), "view_showsidebar" ); actionViewShowSideBar->setChecked(true); actionViewShowNoteBar = new KToggleAction( i18n("Show Notebar"), 0, this, SLOT( viewShowNoteBar() ), actionCollection(), "view_shownotebar" ); actionViewShowNoteBar->setChecked(true); } actionViewFormattingChars = new KToggleAction( i18n( "&Formatting Characters" ), 0, this, SLOT( slotViewFormattingChars() ), actionCollection(), "view_formattingchars" ); actionViewFormattingChars->setToolTip( i18n( "Toggle the display of non-printing characters." ) ); actionViewFormattingChars->setWhatsThis( i18n( "Toggle the display of non-printing characters.

When this is enabled, KPresenter shows you tabs, spaces, carriage returns and other non-printing characters." ) ); actionViewHeader = new KToggleAction( i18n( "Show &Header" ), 0, this, SLOT( viewHeader() ), actionCollection(), "view_header" ); actionViewFooter = new KToggleAction( i18n( "Show Foo&ter" ), 0, this, SLOT( viewFooter() ), actionCollection(), "view_footer" ); actionViewShowHelpLine= new KToggleAction( i18n( "Help Lines" ), 0, this, SLOT( viewHelpLines() ), actionCollection(), "view_helplines" ); actionViewShowGrid = new KToggleAction( i18n( "Grid" ), 0, this, SLOT( viewGrid() ), actionCollection(), "view_grid" ); actionViewGridToFront= new KToggleAction( i18n( "Grid to Front" ), 0, this, SLOT( viewGridToFront() ), actionCollection(), "view_gridtofront" ); actionViewSnapToGrid= new KToggleAction( i18n( "Snap to Grid" ), 0, this, SLOT(viewSnapToGrid() ), actionCollection(), "view_snaptogrid" ); actionViewHelpLineToFront= new KToggleAction( i18n( "Help Line to Front" ), 0, this, SLOT( viewHelpLineToFront() ), actionCollection(), "view_helplinetofront" ); // ---------------- insert actions actionInsertPage = new KAction( i18n( "&Slide..." ), "newslide", Key_F2, this, SLOT( insertPage() ), actionCollection(), "insert_page" ); new KAction( i18n( "Insert &Slide..." ), "newslide", 0, this, SLOT( insertPage() ), actionCollection(), "insert_page_popup" ); actionInsertPicture = new KAction( i18n( "P&icture..." ), "frame_image", SHIFT+Key_F5, this, SLOT( insertPicture() ), actionCollection(), "insert_picture" ); // ----------------- tools actions actionToolsMouse = new KToggleAction( i18n( "Select" ), "select", 0, this, SLOT( toolsMouse() ), actionCollection(), "tools_mouse" ); actionToolsMouse->setExclusiveGroup( "tools" ); actionToolsMouse->setChecked( true ); actionToolsRotate = new KToggleAction( i18n( "&Rotate" ), "rotate", 0, this, SLOT( toolsRotate() ), actionCollection(), "tools_rotate" ); actionToolsRotate->setExclusiveGroup( "tools" ); actionToolsZoom = new KToggleAction( i18n( "&Zoom" ), "viewmag", 0, this, SLOT( toolsZoom() ), actionCollection(), "tools_zoom" ); actionToolsZoom->setExclusiveGroup( "tools" ); actionToolsShapePopup = new KActionMenu( i18n( "&Shape" ), "rectangle", actionCollection(), "tools_shapepopup" ); actionToolsShapePopup->setDelayed(true); connect(actionToolsShapePopup, SIGNAL(activated()), this, SLOT(toolsShapePopup())); actionToolsRectangle = new KToggleAction( i18n( "&Rectangle" ), "rectangle", 0, this, SLOT( toolsRectangle() ), actionCollection(), "tools_rectangle" ); actionToolsRectangle->setExclusiveGroup( "tools" ); actionToolsCircleOrEllipse = new KToggleAction( i18n( "&Circle/Ellipse" ), "circle", 0, this, SLOT( toolsCircleOrEllipse() ), actionCollection(), "tools_circle" ); actionToolsCircleOrEllipse->setExclusiveGroup( "tools" ); actionToolsPie = new KToggleAction( i18n( "&Pie/Arc/Chord" ), "pie", 0, this, SLOT( toolsPie() ), actionCollection(), "tools_pie" ); actionToolsPie->setExclusiveGroup( "tools" ); actionToolsText = new KToggleAction( i18n( "&Text" ), "frame_text", Key_F10, // same shortcut as KWord this, SLOT( toolsText() ), actionCollection(), "tools_text" ); actionToolsText->setExclusiveGroup( "tools" ); actionToolsAutoform = new KToggleAction( i18n( "&Autoform" ), "autoform", 0, this, SLOT( toolsAutoform() ), actionCollection(), "tools_autoform" ); actionToolsAutoform->setExclusiveGroup( "tools" ); actionToolsDiagramm = new KToggleAction( i18n( "&Chart" ), "frame_chart", Key_F12, this, SLOT( toolsDiagramm() ), actionCollection(), "tools_diagramm" ); actionToolsDiagramm->setExclusiveGroup( "tools" ); actionToolsTable = new KToggleAction( i18n( "Ta&ble"), "frame_spreadsheet", Key_F5 /*same as kword*/, this, SLOT( toolsTable() ), actionCollection(), "tools_table" ); actionToolsTable->setExclusiveGroup( "tools" ); actionToolsObject = new KoPartSelectAction( i18n( "&Object" ), "frame_query", this, SLOT( toolsObject() ), actionCollection(), "tools_object" ); actionToolsLinePopup = new KActionMenu( i18n( "&Line" ), "line", actionCollection(), "tools_linepopup" ); actionToolsLinePopup->setDelayed(true); connect(actionToolsLinePopup, SIGNAL(activated()), this, SLOT(toolsLinePopup())); actionToolsLine = new KToggleAction( i18n( "&Line" ), "line", 0, this, SLOT( toolsLine() ), actionCollection(), "tools_line" ); actionToolsLine->setExclusiveGroup( "tools" ); actionToolsFreehand = new KToggleAction( i18n( "&Freehand" ), "freehand", 0, this, SLOT( toolsFreehand() ), actionCollection(), "tools_freehand" ); actionToolsFreehand->setExclusiveGroup( "tools" ); actionToolsPolyline = new KToggleAction( i18n( "Po&lyline" ), "polyline", 0, this, SLOT( toolsPolyline() ), actionCollection(), "tools_polyline" ); actionToolsPolyline->setExclusiveGroup( "tools" ); actionToolsQuadricBezierCurve = new KToggleAction( i18n( "&Quadric Bezier Curve" ), "quadricbeziercurve", 0, this, SLOT( toolsQuadricBezierCurve() ), actionCollection(), "tools_quadricbeziercurve" ); actionToolsQuadricBezierCurve->setExclusiveGroup( "tools" ); actionToolsCubicBezierCurve = new KToggleAction( i18n( "C&ubic Bezier Curve" ), "cubicbeziercurve", 0, this, SLOT( toolsCubicBezierCurve() ), actionCollection(), "tools_cubicbeziercurve" ); actionToolsCubicBezierCurve->setExclusiveGroup( "tools" ); actionToolsConvexOrConcavePolygon = new KToggleAction( i18n( "Co&nvex/Concave Polygon" ), "polygon", 0, this, SLOT( toolsConvexOrConcavePolygon() ), actionCollection(), "tools_polygon" ); actionToolsConvexOrConcavePolygon->setExclusiveGroup( "tools" ); actionToolsClosedLinePopup = new KActionMenu( i18n( "&Closed Line" ), "closed_freehand", actionCollection(), "tools_closed_linepopup" ); actionToolsClosedLinePopup->setDelayed(true); connect(actionToolsClosedLinePopup, SIGNAL(activated()), this, SLOT(toolsClosedLinePopup())); actionToolsClosedFreehand = new KToggleAction( i18n( "Closed &Freehand" ), "closed_freehand", 0, this, SLOT( toolsClosedFreehand() ), actionCollection(), "tools_closed_freehand" ); actionToolsClosedFreehand->setExclusiveGroup( "tools" ); actionToolsClosedPolyline = new KToggleAction( i18n( "Closed Po&lyline" ), "closed_polyline", 0, this, SLOT( toolsClosedPolyline() ), actionCollection(), "tools_closed_polyline" ); actionToolsClosedPolyline->setExclusiveGroup( "tools" ); actionToolsClosedQuadricBezierCurve = new KToggleAction( i18n( "Closed &Quadric Bezier Curve" ), "closed_quadricbeziercurve", 0, this, SLOT( toolsClosedQuadricBezierCurve() ), actionCollection(), "tools_closed_quadricbeziercurve" ); actionToolsClosedQuadricBezierCurve->setExclusiveGroup( "tools" ); actionToolsClosedCubicBezierCurve = new KToggleAction( i18n( "Closed C&ubic Bezier Curve" ), "closed_cubicbeziercurve", 0, this, SLOT( toolsClosedCubicBezierCurve() ), actionCollection(), "tools_closed_cubicbeziercurve" ); actionToolsClosedCubicBezierCurve->setExclusiveGroup( "tools" ); // ----------------- text actions actionTextFont = new KAction( i18n( "&Font..." ), 0, this, SLOT( mtextFont() ), actionCollection(), "text_font" ); actionTextFontSize = new KFontSizeAction( i18n( "Font Size" ), 0, actionCollection(), "text_fontsize" ); connect( actionTextFontSize, SIGNAL( fontSizeChanged( int ) ), this, SLOT( sizeSelected( int ) ) ); actionTextFontFamily = new KFontAction( i18n( "Font Family" ), 0, actionCollection(), "text_fontfamily" ); connect( actionTextFontFamily , SIGNAL( activated( const QString & ) ), this, SLOT( fontSelected( const QString & ) ) ); actionTextBold = new KToggleAction( i18n( "&Bold" ), "text_bold", CTRL + Key_B, this, SLOT( textBold() ), actionCollection(), "text_bold" ); actionTextItalic = new KToggleAction( i18n( "&Italic" ), "text_italic", CTRL + Key_I, this, SLOT( textItalic() ), actionCollection(), "text_italic" ); actionTextUnderline = new KToggleAction( i18n( "&Underline" ), "text_under", CTRL + Key_U, this, SLOT( textUnderline() ), actionCollection(), "text_underline" ); actionFormatStrikeOut = new KToggleAction( i18n( "&Strike Out" ), "text_strike", 0 , this, SLOT( textStrikeOut() ), actionCollection(), "format_strike" ); actionTextColor = new TKSelectColorAction( i18n( "&Color..." ), TKSelectColorAction::TextColor, actionCollection(), "text_color" ,true); connect( actionTextColor, SIGNAL( activated() ), SLOT( textColor() ) ); actionTextColor->setDefaultColor(QColor()); actionTextAlignLeft = new KToggleAction( i18n( "Align &Left" ), "text_left", ALT + Key_L, this, SLOT( textAlignLeft() ), actionCollection(), "text_alignleft" ); actionTextAlignLeft->setExclusiveGroup( "align" ); actionTextAlignLeft->setChecked( true ); actionTextAlignCenter = new KToggleAction( i18n( "Align &Center" ), "text_center", ALT + Key_C, this, SLOT( textAlignCenter() ), actionCollection(), "text_aligncenter" ); actionTextAlignCenter->setExclusiveGroup( "align" ); actionTextAlignRight = new KToggleAction( i18n( "Align &Right" ), "text_right", ALT + Key_R, this, SLOT( textAlignRight() ), actionCollection(), "text_alignright" ); actionTextAlignRight->setExclusiveGroup( "align" ); actionTextAlignBlock = new KToggleAction( i18n( "Align &Block" ), "text_block", CTRL + Key_J, this, SLOT( textAlignBlock() ), actionCollection(), "text_alignblock" ); actionTextAlignBlock->setExclusiveGroup( "align" ); actionFormatNumber = new KActionMenu( i18n( "Number" ), "enumList", actionCollection(), "format_number" ); actionFormatNumber->setDelayed( false ); actionFormatBullet = new KActionMenu( i18n( "Bullet" ), "unsortedList", actionCollection(), "format_bullet" ); actionFormatBullet->setDelayed( false ); QPtrList stylesList; KoCounterStyleWidget::makeCounterRepresenterList( stylesList ); QPtrListIterator styleIt( stylesList ); for ( ; styleIt.current() ; ++styleIt ) { // Dynamically create toggle-actions for each list style. // This approach allows to edit toolbars and extract separate actions from this menu KToggleAction* act = new KToggleAction( styleIt.current()->name(), /*TODO icon,*/ 0, this, SLOT( slotCounterStyleSelected() ), actionCollection(), QString("counterstyle_%1").arg( styleIt.current()->style() ).latin1() ); act->setExclusiveGroup( "counterstyle" ); // Add to the right menu: both for "none", bullet for bullets, numbers otherwise if ( styleIt.current()->style() == KoParagCounter::STYLE_NONE ) { actionFormatBullet->insert( act ); actionFormatNumber->insert( act ); } else if ( styleIt.current()->isBullet() ) actionFormatBullet->insert( act ); else actionFormatNumber->insert( act ); } actionTextDepthPlus = new KAction( i18n( "&Increase Depth" ), QApplication::reverseLayout() ?"format_decreaseindent" : "format_increaseindent", CTRL + Key_Plus, this, SLOT( textDepthPlus() ), actionCollection(), "text_depthPlus" ); actionTextDepthMinus = new KAction( i18n( "&Decrease Depth" ), QApplication::reverseLayout() ?"format_increaseindent" : "format_decreaseindent", CTRL + Key_Minus, this, SLOT( textDepthMinus() ), actionCollection(), "text_depthMinus" ); actionTextExtentCont2Height = new KAction( i18n( "Extend Contents to Object &Height" ), 0, this, SLOT( textContentsToHeight() ), actionCollection(), "text_con2hei" ); actionTextExtendObj2Cont = new KAction( i18n( "&Extend Object to Fit Contents" ), 0, this, SLOT( textObjectToContents() ), actionCollection(), "text_obj2cont" ); actionTextInsertPageNum = new KAction( i18n( "&Insert Page Number" ), "pgnum", 0, this, SLOT( textInsertPageNum() ), actionCollection(), "text_inspgnum" ); // ----------------- format actions actionExtraPenBrush = new KAction( i18n( "&Properties" ), "penbrush", 0, this, SLOT( extraPenBrush() ), actionCollection(), "extra_properties" ); actionExtraArrangePopup = new KAction( i18n( "Arra&nge Objects" ), "arrange", 0, this, SLOT(extraArrangePopup()), actionCollection(), "extra_arrangepopup" ); actionExtraRaise = new KAction( i18n( "Ra&ise Objects" ), "raise", CTRL+SHIFT+Key_R, this, SLOT( extraRaise() ), actionCollection(), "extra_raise" ); actionExtraLower = new KAction( i18n( "&Lower Objects" ), "lower", CTRL +SHIFT+ Key_L, this, SLOT( extraLower() ), actionCollection(), "extra_lower" ); actionExtraBringForward= new KAction( i18n( "Bring to Front" ), "bring_forward", 0, this, SLOT( extraBringForward() ), actionCollection(), "extra_bring_forward" ); actionExtraSendBackward= new KAction( i18n( "Send to Back" ), "send_backward", 0, this, SLOT( extraSendBackward() ), actionCollection(), "extra_send_backward" ); actionExtraRotate = new KAction( i18n( "R&otate Objects..." ), "rotate_cw", 0, this, SLOT( extraRotate() ), actionCollection(), "extra_rotate" ); actionExtraShadow = new KAction( i18n( "&Shadow Objects..." ), "shadow", 0, this, SLOT( extraShadow() ), actionCollection(), "extra_shadow" ); actionExtraAlignObjLeft = new KAction( i18n( "Align &Left" ), "aoleft", 0, this, SLOT( extraAlignObjLeft() ), actionCollection(), "extra_alignleft" ); actionExtraAlignObjCenterH = new KAction( i18n( "Align Center (&horizontally)" ), "aocenterh", 0, this, SLOT( extraAlignObjCenterH() ), actionCollection(), "extra_aligncenterh" ); actionExtraAlignObjRight = new KAction( i18n( "Align &Right" ), "aoright", 0, this, SLOT( extraAlignObjRight() ), actionCollection(), "extra_alignright" ); actionExtraAlignObjTop = new KAction( i18n( "Align &Top" ), "aotop", 0, this, SLOT( extraAlignObjTop() ), actionCollection(), "extra_aligntop" ); actionExtraAlignObjCenterV = new KAction( i18n( "Align Center (&vertically)" ), "aocenterv", 0, this, SLOT( extraAlignObjCenterV() ), actionCollection(), "extra_aligncenterv" ); actionExtraAlignObjBottom = new KAction( i18n( "Align &Bottom" ), "aobottom", 0, this, SLOT( extraAlignObjBottom() ), actionCollection(), "extra_alignbottom" ); actionExtraBackground = new KAction( i18n( "Slide Bac&kground..." ), "background", 0, this, SLOT( extraBackground() ), actionCollection(), "extra_background" ); actionExtraLayout = new KAction( i18n( "Page &Layout..." ), 0, this, SLOT( extraLayout() ), actionCollection(), "extra_layout" ); actionExtraConfigure = new KAction( i18n( "Configure KPresenter..." ), "configure", 0, this, SLOT( extraConfigure() ), actionCollection(), "extra_configure" ); actionExtraWebPres = new KAction( i18n( "Create &HTML Slideshow..." ), "webpres", 0, this, SLOT( extraWebPres() ), actionCollection(), "extra_webpres" ); actionExtraCreateTemplate = new KAction( i18n( "Template Manager" ), 0, this, SLOT( extraCreateTemplate() ), actionCollection(), "extra_template" ); actionExtraDefaultTemplate = new KAction( i18n( "Use Current Slide as Default Template" ), 0, this, SLOT( extraDefaultTemplate() ), actionCollection(), "extra_defaulttemplate" ); actionExtraAlignObjs = new KAction( i18n("Align O&bjects"), "alignobjs", 0, this, SLOT( extraAlignObjs() ), actionCollection(), "extra_alignobjs" ); actionExtraLineBegin = new KAction( i18n("Line Begin"), "line_begin", 0, this, SLOT( extraLineBegin() ), actionCollection(), "extra_linebegin" ); actionExtraLineEnd = new KAction( i18n("Line End"), "line_end", 0, this, SLOT( extraLineEnd() ), actionCollection(), "extra_lineend" ); actionExtraPenStyle = new KAction( i18n("Pen Style"), "pen_style", 0, this, SLOT( extraPenStyle() ), actionCollection(), "extra_penstyle" ); actionExtraPenWidth = new KAction( i18n("Pen Width"), "pen_width", 0, this, SLOT( extraPenWidth() ), actionCollection(), "extra_penwidth" ); actionExtraGroup = new KAction( i18n( "&Group Objects" ), "group", 0, this, SLOT( extraGroup() ), actionCollection(), "extra_group" ); actionExtraUnGroup = new KAction( i18n( "&Ungroup Objects" ), "ungroup", 0, this, SLOT( extraUnGroup() ), actionCollection(), "extra_ungroup" ); // ----------------- slideshow actions actionScreenConfigPages = new KAction( i18n( "&Configure Slide Show..." ), "configure", 0, this, SLOT( screenConfigPages() ), actionCollection(), "screen_configpages" ); actionScreenAssignEffect = new KAction( i18n( "Edit &Object Effect" ), "effect", 0, this, SLOT( screenAssignEffect() ), actionCollection(), "screen_assigneffect"); actionScreenTransEffect = new KAction( i18n( "Edit Slide &Transition" ), "effect", 0, this, SLOT( screenTransEffect() ), actionCollection(), "screen_transeffect"); actionScreenStart = new KAction( i18n( "&Start" ), "2rightarrow", 0, this, SLOT( screenStart() ), actionCollection(), "screen_start" ); actionScreenStartFromFirst = new KAction( i18n( "Start From &First Slide" ), "1rightarrow", 0, this, SLOT( screenStartFromFirst() ), actionCollection(), "screen_startfromfirst" ); actionScreenFirst = new KAction( i18n( "&Go to Start" ), "start", Key_Home, this, SLOT( screenFirst() ), actionCollection(), "screen_first" ); actionScreenPrev = new KAction( i18n( "&Previous Slide" ), "back", Key_Prior, this, SLOT( screenPrev() ), actionCollection(), "screen_prev" ); actionScreenNext = new KAction( i18n( "&Next Slide" ), "forward", Key_Next, this, SLOT( screenNext() ), actionCollection(), "screen_next" ); actionScreenLast = new KAction( i18n( "Go to &End" ), "finish", Key_End, this, SLOT( screenLast() ), actionCollection(), "screen_last" ); actionScreenSkip = new KAction( i18n( "Goto &Slide..." ), "goto", 0, this, SLOT( screenSkip() ), actionCollection(), "screen_skip" ); // ----------------- colorbar(Brush and Pen) action actionBrushColor = new TKSelectColorAction( i18n( "Brush Color..." ), TKSelectColorAction::FillColor, actionCollection(), "brush_color" ,true); connect( actionBrushColor, SIGNAL( activated() ), SLOT( brushChosen() ) ); actionBrushColor->setDefaultColor(QColor()); actionPenColor = new TKSelectColorAction( i18n( "Pen Color..." ), TKSelectColorAction::LineColor, actionCollection(), "pen_color" ); connect( actionPenColor, SIGNAL( activated() ), SLOT( penChosen() ) ); actionPenColor->setDefaultColor(QColor()); actionExtendObjectHeight = new KAction( i18n( "&Extend Contents to Object Height" ),0, this, SLOT( textContentsToHeight() ), actionCollection(), "extendobjectheight" ); actionResizeTextObject = new KAction( i18n( "&Resize Object to Fit Contents" ),0, this, SLOT( textObjectToContents() ), actionCollection(), "resizetextobject" ); // actionObjectProperties = new KAction( i18n( "&Properties..." ), "penbrush", 0, // this, SLOT( extraPenBrush() ), // actionCollection(), "object_properties" ); actionRenamePage=new KAction(i18n( "&Rename Slide..." ),0,this, SLOT( renamePageTitle() ), actionCollection(), "rename_page" ); actionPicOriginalSize = new KAction( i18n( "Sca&le to Original Size" ), 0, this, SLOT( picViewOriginalSize() ), actionCollection(), "pic_original_size" ); actionPic640x480=new KAction(i18n( "640x480" ),0,this, SLOT( picViewOrig640x480() ), actionCollection(), "pic_640_480" ); actionPic800x600=new KAction(i18n( "800x600" ),0,this, SLOT( picViewOrig800x600() ), actionCollection(), "pic_800_600" ); actionPic1024x768=new KAction(i18n( "1024x768" ),0,this, SLOT( picViewOrig1024x768() ), actionCollection(), "pic_1024_768" ); actionPic1280x1024=new KAction(i18n( "1280x1024" ),0,this, SLOT( picViewOrig1280x1024() ), actionCollection(), "pic_1280_1024" ); actionPic1600x1200=new KAction(i18n( "1600x1200" ),0,this, SLOT( picViewOrig1600x1200() ), actionCollection(), "pic_1600_1200" ); actionChangePic=new KAction( i18n( "&Change Picture..." ),"frame_image",0,this, SLOT( chPic() ), actionCollection(), "change_picture" ); actionImageEffect = new KAction( i18n("Image &Effect..."), 0, this, SLOT(imageEffect()), actionCollection(), "image_effect"); actionFormatSuper = new KToggleAction( i18n( "Superscript" ), "super", 0, this, SLOT( textSuperScript() ), actionCollection(), "format_super" ); actionFormatSuper->setExclusiveGroup( "valign" ); actionFormatSub = new KToggleAction( i18n( "Subscript" ), "sub", 0, this, SLOT( textSubScript() ), actionCollection(), "format_sub" ); actionFormatSub->setExclusiveGroup( "valign" ); actionInsertSpecialChar = new KAction( i18n( "Sp&ecial Character..." ), "char", ALT + SHIFT + Key_C, this, SLOT( insertSpecialChar() ), actionCollection(), "insert_specialchar" ); actionInsertLink = new KAction( i18n( "Link..." ), 0, this, SLOT( insertLink() ), actionCollection(), "insert_link" ); #if 0 //code from page.cc //not implemented picResizeMenu->insertSeparator(); picResizeMenu->insertItem( i18n( "Enter Custom Factor..." ), this, SLOT( picViewOrigFactor() ) ); #endif (void) new KAction( i18n( "Configure &Autocorrection..." ), 0, this, SLOT( extraAutoFormat() ), actionCollection(), "extra_autocorrection" ); actionExtraSpellCheck = KStdAction::spelling( this, SLOT( extraSpelling() ), actionCollection(), "extra_spellcheck" ); actionFormatParag = new KAction( i18n( "&Paragraph..." ), ALT + CTRL + Key_P, this, SLOT( formatParagraph() ), actionCollection(), "format_paragraph" ); actionFormatDefault=new KAction( i18n( "Default Format" ), 0, this, SLOT( textDefaultFormat() ), actionCollection(), "text_default" ); actionOpenLink = new KAction( i18n( "Open Link" ), 0, this, SLOT( openLink() ), actionCollection(), "open_link" ); actionChangeLink=new KAction( i18n("Change Link..."), 0, this,SLOT(changeLink()), actionCollection(), "change_link"); actionCopyLink = new KAction( i18n( "Copy Link" ), 0, this, SLOT( copyLink() ), actionCollection(), "copy_link" ); actionRemoveLink = new KAction( i18n( "Remove Link" ), 0, this, SLOT( removeLink() ), actionCollection(), "remove_link" ); actionAddLinkToBookmak = new KAction( i18n( "Add to Bookmark" ), 0, this, SLOT( addToBookmark() ), actionCollection(), "add_to_bookmark" ); actionEditCustomVarsEdit = new KAction( i18n( "&Custom Variables..." ), 0, this, SLOT( editCustomVars() ), actionCollection(), "edit_vars" ); actionEditCustomVars = new KAction( i18n( "Edit Variable..." ), 0, this, SLOT( editCustomVariable() ), actionCollection(), "edit_customvars" ); m_variableDefMap.clear(); actionInsertVariable = new KActionMenu( i18n( "&Variable" ), actionCollection(), "insert_variable" ); // The last argument is only needed if a submenu is to be created addVariableActions( VT_FIELD, KoFieldVariable::actionTexts(), actionInsertVariable, i18n("&Property") ); addVariableActions( VT_DATE, KoDateVariable::actionTexts(), actionInsertVariable, i18n("&Date") ); addVariableActions( VT_TIME, KoTimeVariable::actionTexts(), actionInsertVariable, i18n("&Time") ); actionInsertCustom = new KActionMenu( i18n( "&Custom" ), actionCollection(), "insert_custom" ); actionInsertVariable->insert(actionInsertCustom); refreshCustomMenu(); addVariableActions( VT_PGNUM, KoPgNumVariable::actionTexts(), actionInsertVariable, i18n("&Page") ); actionInsertVariable->popupMenu()->insertSeparator(); actionRefreshAllVariable = new KAction( i18n( "&Refresh All Variables" ), 0, this, SLOT( refreshAllVariable() ), actionCollection(), "refresh_all_variable" ); actionInsertVariable->insert(actionRefreshAllVariable); actionIncreaseFontSize = new KAction( i18n("Increase Font Size"),"fontsizeup", 0, this, SLOT( increaseFontSize() ), actionCollection(), "increaseFontSize" ); actionDecreaseFontSize = new KAction( i18n("Decrease Font Size"),"fontsizedown", 0, this, SLOT( decreaseFontSize() ), actionCollection(), "decreaseFontSize" ); actionChangeCase=new KAction( i18n( "Change Case..." ), 0, this, SLOT( changeCaseOfText() ), actionCollection(), "change_case" ); actionViewZoom = new KSelectAction( i18n( "Zoom" ), "viewmag", 0, actionCollection(), "view_zoom" ); connect( actionViewZoom, SIGNAL( activated( const QString & ) ), this, SLOT( viewZoom( const QString & ) ) ); actionViewZoom->setEditable(true); changeZoomMenu( ); actionFormatStylist = new KAction( i18n( "&Style Manager" ), ALT + CTRL + Key_S, this, SLOT( extraStylist() ), actionCollection(), "format_stylist" ); actionFormatStyleMenu = new KActionMenu( i18n( "St&yle" ), 0, actionCollection(), "format_stylemenu" ); actionFormatStyle = new KSelectAction( i18n( "St&yle" ), 0, actionCollection(), "format_style" ); connect( actionFormatStyle, SIGNAL( activated( int ) ), this, SLOT( textStyleSelected( int ) ) ); actionFormatStyle->setRemoveAmpersandsInCombo( true ); updateStyleList(); actionAllowAutoFormat = new KToggleAction( i18n( "Enable Autocorrection" ), 0, this, SLOT( slotAllowAutoFormat() ), actionCollection(), "enable_autocorrection" ); // ------------------- Actions with a key binding and no GUI item new KAction( i18n( "Insert Non-Breaking Space" ), CTRL+Key_Space, this, SLOT( slotNonbreakingSpace() ), actionCollection(), "nonbreaking_space" ); new KAction( i18n( "Insert Soft Hyphen" ), CTRL+Key_Minus, this, SLOT( slotSoftHyphen() ), actionCollection(), "soft_hyphen" ); new KAction( i18n( "Line Break" ), SHIFT+Key_Return, this, SLOT( slotLineBreak() ), actionCollection(), "line_break" ); new KAction( i18n( "Completion" ), KStdAccel::shortcut(KStdAccel::TextCompletion), this, SLOT( slotCompletion() ), actionCollection(), "completion" ); actionInsertComment = new KAction( i18n( "Comment..." ), 0, this, SLOT( insertComment() ), actionCollection(), "insert_comment" ); actionEditComment = new KAction( i18n("Edit Comment..."), 0, this,SLOT(editComment()), actionCollection(), "edit_comment"); actionRemoveHelpLine = new KAction( i18n( "Remove Help Line" ), 0, this, SLOT( removeHelpLine() ), actionCollection(), "remove_helpline" ); actionChangeHelpLinePosition= new KAction( i18n( "Change Help Line Position..." ), 0, this, SLOT( changeHelpLinePosition() ), actionCollection(), "change_helplinepos" ); actionAddHelpLine = new KAction( i18n( "Add New Help Line..."), 0, this, SLOT(addHelpLine()), actionCollection(), "add_helpline"); actionRemoveHelpPoint = new KAction( i18n( "Remove Help Point" ), 0, this, SLOT( removeHelpPoint() ), actionCollection(), "remove_helppoint" ); actionChangeHelpPointPosition= new KAction( i18n( "Change Help Point Position..." ), 0, this, SLOT( changeHelpPointPosition() ), actionCollection(), "change_helppointpos" ); actionAddHelpLine = new KAction( i18n( "Add New Help Point..."), 0, this, SLOT(addHelpPoint()), actionCollection(), "add_helppoint"); actionRemoveComment = new KAction( i18n("Remove Comment"), 0, this,SLOT(removeComment()), actionCollection(), "remove_comment"); actionCopyTextOfComment = new KAction( i18n("Copy Text of Comment..."), 0, this,SLOT(copyTextOfComment()), actionCollection(), "copy_text_comment"); actionConfigureCompletion = new KAction( i18n( "&Configure Completion..." ), 0, this, SLOT( configureCompletion() ), actionCollection(), "configure_completion" ); actionZoomMinus = new KAction( i18n( "Zoom Out" ), "viewmag-",0, this, SLOT( zoomMinus() ), actionCollection(), "zoom_minus" ); actionZoomPlus = new KAction( i18n( "Zoom In" ), "viewmag+",0, this, SLOT( zoomPlus() ), actionCollection(), "zoom_plus" ); actionZoomEntirePage = new KAction( i18n( "Zoom Entire Slide" ), 0, this, SLOT( zoomEntirePage() ), actionCollection(), "zoom_entire_page" ); actionZoomMinus = new KAction( i18n( "Zoom Slide Width" ), 0, this, SLOT( zoomPageWidth() ), actionCollection(), "zoom_page_width" ); actionZoomSelectedObject= new KAction( i18n( "Zoom Selected Object" ), "viewmagfit",0, this, SLOT( zoomSelectedObject() ), actionCollection(), "zoom_selected_object" ); actionZoomPageHeight= new KAction( i18n( "Zoom Slide Height" ), 0, this, SLOT( zoomPageHeight() ), actionCollection(), "zoom_page_height" ); actionZoomAllObject= new KAction( i18n( "Zoom All Objects" ), 0, this, SLOT( zoomAllObject() ), actionCollection(), "zoom_all_object" ); actionFlipHorizontal= new KAction( i18n( "Horizontal Flip" ), 0, this, SLOT( flipHorizontal() ), actionCollection(), "horizontal_flip" ); actionFlipVertical= new KAction( i18n( "Vertical Flip" ), 0, this, SLOT( flipVertical() ), actionCollection(), "vertical_flip" ); actionDuplicateObj = new KAction( i18n( "Duplicate Object..." ), 0, this, SLOT( duplicateObj() ), actionCollection(), "duplicate_obj" ); actionApplyAutoFormat= new KAction( i18n( "Apply Autocorrection..." ), 0, this, SLOT( applyAutoFormat() ), actionCollection(), "apply_autoformat" ); actionCreateStyleFromSelection = new KAction( i18n( "Create Style From Selection" ), 0, this, SLOT( createStyleFromSelection()), actionCollection(), "create_style" ); actionCloseObject = new KAction( i18n( "Close Object" ), 0, this, SLOT( closeObject()), actionCollection(), "close_object" ); actionAlignVerticalTop = new KToggleAction( i18n( "Align Top" ), 0, this, SLOT( alignVerticalTop() ), actionCollection(), "align_top" ); actionAlignVerticalTop->setExclusiveGroup( "vertical_alignment" ); actionAlignVerticalTop->setChecked( true ); actionAlignVerticalBottom = new KToggleAction( i18n( "Align Bottom" ), 0, this, SLOT( alignVerticalBottom() ), actionCollection(), "align_bottom" ); actionAlignVerticalBottom->setExclusiveGroup( "vertical_alignment" ); actionAlignVerticalCenter = new KToggleAction( i18n( "Align Middle" ), 0, this, SLOT( alignVerticalCenter() ), actionCollection(), "align_center" ); actionAlignVerticalCenter->setExclusiveGroup( "vertical_alignment" ); actionSavePicture= new KAction( i18n("Save Picture..."), 0, this, SLOT( savePicture() ), actionCollection(), "save_picture"); actionAllowBgSpellCheck = new KToggleAction( i18n( "Autospellcheck" ), 0, this, SLOT( autoSpellCheck() ), actionCollection(), "tool_auto_spellcheck" ); actionInsertFile= new KAction( i18n( "File..." ), 0, this, SLOT( insertFile() ), actionCollection(), "insert_file" ); actionImportStyle= new KAction( i18n( "Import Style..." ), 0, this, SLOT( importStyle() ), actionCollection(), "import_style" ); actionSaveBackgroundPicture= new KAction( i18n( "Save Background Picture..." ), 0, this, SLOT(backgroundPicture() ), actionCollection(), "save_bgpicture" ); actionInsertDirectCursor = new KToggleAction( i18n( "Type Anywhere Cursor" ), 0, this, SLOT( insertDirectCursor() ), actionCollection(), "direct_cursor" ); actionSpellIgnoreAll = new KAction( i18n( "Ignore All" ), 0, this, SLOT( slotAddIgnoreAllWord() ), actionCollection(), "ignore_all" ); actionAddWordToPersonalDictionary=new KAction( i18n( "Add Word to Dictionary" ),0, this, SLOT( addWordToDictionary() ), actionCollection(), "add_word_to_dictionary" ); } void KPresenterView::textSubScript() { m_canvas->setTextSubScript(actionFormatSub->isChecked()); } void KPresenterView::textSuperScript() { m_canvas->setTextSuperScript(actionFormatSuper->isChecked()); } void KPresenterView::decreaseFontSize() { m_canvas->setDecreaseFontSize(); } void KPresenterView::increaseFontSize() { m_canvas->setIncreaseFontSize(); } void KPresenterView::objectSelectedChanged() { bool state=m_canvas->isOneObjectSelected(); bool headerfooterselected=false; bool state2=false; if (m_canvas->numberOfObjectSelected()==1) { KPObject *obj=m_canvas->getSelectedObj(); //disable this action when we select a header/footer if (obj==m_pKPresenterDoc->header() || obj==m_pKPresenterDoc->footer()) headerfooterselected=true; else headerfooterselected=false; ObjType objtype = obj->getType(); if (objtype == OT_RECT || objtype == OT_ELLIPSE || objtype == OT_TEXT || objtype == OT_AUTOFORM || objtype == OT_PIE || objtype == OT_CLOSED_LINE) state2=true; } actionScreenAssignEffect->setEnabled(state && !headerfooterselected); actionEditDelete->setEnabled(state && !headerfooterselected); actionEditCut->setEnabled(state && !headerfooterselected); actionBrushColor->setEnabled(state && state2); // no brush button for objects that don't support it actionExtraPenBrush->setEnabled(state && !headerfooterselected); actionExtraRotate->setEnabled(state && !headerfooterselected); actionExtraShadow->setEnabled(state && !m_canvas->haveASelectedPartObj() && !headerfooterselected); actionExtraAlignObjs->setEnabled(state && !headerfooterselected); actionExtraGroup->setEnabled(state && m_canvas->numberOfObjectSelected()>1); actionExtraUnGroup->setEnabled(state && m_canvas->haveASelectedGroupObj()); bool enableAlign = m_canvas->canMoveOneObject() && state && !headerfooterselected; actionExtraAlignObjLeft->setEnabled(enableAlign); actionExtraAlignObjCenterH->setEnabled(enableAlign); actionExtraAlignObjRight->setEnabled(enableAlign); actionExtraAlignObjTop->setEnabled(enableAlign); actionExtraAlignObjCenterV->setEnabled(enableAlign); actionExtraAlignObjBottom->setEnabled(enableAlign); //actionEditDelete->setEnabled(state); int nbobj=m_canvas->numberOfObjectSelected(); actionDuplicateObj->setEnabled(state && (nbobj>=1)); state = state && (nbobj==1); actionExtraArrangePopup->setEnabled(state); actionExtraRaise->setEnabled(state); actionExtraLower->setEnabled(state); actionExtraBringForward->setEnabled(state); actionExtraSendBackward->setEnabled(state); //actionExtraConfigPicture->setEnabled( state && m_canvas->haveASelectedPixmapObj() ); //actionPenColor->setEnabled(state); //actionExtraPenStyle->setEnabled(state); //actionExtraPenWidth->setEnabled(state); actionApplyAutoFormat->setEnabled(m_canvas->oneObjectTextExist()); slotObjectEditChanged(); } void KPresenterView::backOk( BackDia* backDia, bool takeGlobal ) { KPrPage *page=m_canvas->activePage(); SetBackCmd *setBackCmd = new SetBackCmd( i18n( "Set Background" ), backDia->getBackColor1(), backDia->getBackColor2(), backDia->getBackColorType(), backDia->getBackUnbalanced(), backDia->getBackXFactor(), backDia->getBackYFactor(), backDia->getBackPicture().getKey(), backDia->getBackView(), backDia->getBackType(), page->getBackColor1( ), page->getBackColor2( ), page->getBackColorType( ), page->getBackUnbalanced( ), page->getBackXFactor( ), page->getBackYFactor( ), page->getBackPictureKey( ), page->getBackView( ), page->getBackType( ), takeGlobal, m_pKPresenterDoc,page); setBackCmd->execute(); m_pKPresenterDoc->addCommand( setBackCmd ); } void KPresenterView::afChooseOk( const QString & c ) { QFileInfo fileInfo( c ); QString fileName = locate( "autoforms", fileInfo.dirPath( false ) + "/" + fileInfo.baseName() + ".atf", KPresenterFactory::global() ); deSelectAllObjects(); m_canvas->setToolEditMode( INS_AUTOFORM ); m_canvas->setAutoForm( fileName ); } void KPresenterView::slotAfchooseCanceled() { setTool( TEM_MOUSE ); } void KPresenterView::styleOk() { ConfPenDia *confPenDia; ConfPieDia *confPieDia; ConfRectDia *confRectDia; ConfBrushDia *confBrushDia; ConfPictureDia *confPictureDia; ConfPolygonDia *confPolygonDia; KCommand *cmd; KMacroCommand *macro=0L; if ((confPenDia = styleDia->getConfPenDia())) { cmd=m_canvas->activePage()->setPen(confPenDia->getPen(), confPenDia->getLineBegin(), confPenDia->getLineEnd(), confPenDia->getPenConfigChange(), m_canvas->activePage()->objectList()); if(cmd) { if ( !macro) macro=new KMacroCommand(i18n( "Apply Properties" ) ); macro->addCommand(cmd); } cmd=stickyPage()->setPen(confPenDia->getPen(), confPenDia->getLineBegin(), confPenDia->getLineEnd(), confPenDia->getPenConfigChange(), stickyPage()->objectList()); if(cmd) { if ( !macro) macro=new KMacroCommand(i18n( "Apply Properties" ) ); macro->addCommand(cmd); } } if ((confBrushDia = styleDia->getConfBrushDia())) { cmd=m_canvas->activePage()->setBrush(confBrushDia->getBrush(), confBrushDia->getFillType(), confBrushDia->getGColor1(), confBrushDia->getGColor2(), confBrushDia->getGType(), confBrushDia->getGUnbalanced(), confBrushDia->getGXFactor(), confBrushDia->getGYFactor(), confBrushDia->getBrushConfigChange(), m_canvas->activePage()->objectList()); if(cmd) { if ( !macro) macro=new KMacroCommand(i18n( "Apply Properties" ) ); macro->addCommand(cmd); } cmd=stickyPage()->setBrush(confBrushDia->getBrush(), confBrushDia->getFillType(), confBrushDia->getGColor1(), confBrushDia->getGColor2(), confBrushDia->getGType(), confBrushDia->getGUnbalanced(), confBrushDia->getGXFactor(), confBrushDia->getGYFactor(), confBrushDia->getBrushConfigChange(), stickyPage()->objectList()); if(cmd) { if ( !macro) macro=new KMacroCommand(i18n( "Apply Properties" ) ); macro->addCommand(cmd); } } if ( !styleDia->protectNoChange() ) { cmd= m_canvas->setProtectSizeObj(styleDia->isProtected()); if (cmd) { if ( !macro) macro=new KMacroCommand(i18n( "Apply Properties" ) ); macro->addCommand( cmd ); } } if ( !styleDia->keepRatioNoChange()) { cmd= m_canvas->setKeepRatioObj(styleDia->isKeepRatio()); if (cmd) { if ( !macro) macro=new KMacroCommand(i18n( "Apply Properties" ) ); macro->addCommand( cmd ); } } // stick has to be done before the object name is set, // so that the name is set in the right page bool bSticky=styleDia->isSticky(); if ( !styleDia->stickyNoChange()) { bSticky=styleDia->isSticky(); //all sticky obj are sticky page => when sticky=false test sticky page if(bSticky) cmd=m_canvas->activePage()->stickyObj(bSticky,m_canvas->activePage() ); else cmd=stickyPage()->stickyObj(bSticky,m_canvas->activePage()); if(cmd) { if ( !macro) macro=new KMacroCommand(i18n( "Apply Properties" ) ); macro->addCommand(cmd); } } if ( styleDia->isOneObject()) { KoRect rect = styleDia->getNewSize(); KoRect oldRect = m_canvas->getSelectedObj()->getRect(); cmd = new ResizeCmd( i18n("Change Size"), rect.topLeft()-oldRect.topLeft(), rect.size() - oldRect.size(), m_canvas->getSelectedObj(), m_pKPresenterDoc ); cmd->execute(); macro->addCommand(cmd); QString objectName = styleDia->getObjectName(); cmd = new KPrNameObjectCommand( i18n("Name Object"), objectName, m_canvas->getSelectedObj(), m_pKPresenterDoc ); cmd->execute(); macro->addCommand(cmd); // set object name again, as it can be changed by the KPrNameObjectCommand objectName = m_canvas->getSelectedObj()->getObjectName(); styleDia->setObjectName( objectName ); if ( styleDia->isAllTextObject() ) { bool state = styleDia->isProtectContent(); cmd = m_canvas->setProtectContent( state ); if ( !macro) macro=new KMacroCommand(i18n( "Apply Properties" ) ); if (cmd ) macro->addCommand(cmd); KPTextObject *obj=dynamic_cast(m_canvas->getSelectedObj()); if (obj && !state ) { MarginsStruct _MarginsBegin(obj); MarginsStruct _MarginsEnd( styleDia->marginsLeft(), styleDia->marginsTop(), styleDia->marginsRight(), styleDia->marginsBottom()); KPrChangeMarginCommand * cmd = new KPrChangeMarginCommand( i18n("Change Margins"), obj, _MarginsBegin, _MarginsEnd,kPresenterDoc() ); cmd->execute(); macro->addCommand(cmd); } } } if ((confPieDia = styleDia->getConfPieDia())) { cmd=m_canvas->activePage()->setPieSettings( confPieDia->getType(), confPieDia->getAngle(), confPieDia->getLength(), confPieDia->getPieConfigChange() ); if(cmd) { if ( !macro) macro=new KMacroCommand(i18n( "Apply Properties" ) ); macro->addCommand(cmd); } cmd=stickyPage()->setPieSettings( confPieDia->getType(), confPieDia->getAngle(), confPieDia->getLength(), confPieDia->getPieConfigChange() ); if(cmd) { if ( !macro) macro=new KMacroCommand(i18n( "Apply Properties" ) ); macro->addCommand(cmd); } updateObjectStatusBarItem(); //the type might have changed } if ((confPolygonDia = styleDia->getConfPolygonDia())) { cmd=m_canvas->activePage()->setPolygonSettings( confPolygonDia->getCheckConcavePolygon(), confPolygonDia->getCornersValue(), confPolygonDia->getSharpnessValue(), confPolygonDia->getPolygonConfigChange() ); if(cmd) { if ( !macro) macro=new KMacroCommand(i18n( "Apply Properties" ) ); macro->addCommand(cmd); } cmd=stickyPage()->setPolygonSettings( confPolygonDia->getCheckConcavePolygon(), confPolygonDia->getCornersValue(), confPolygonDia->getSharpnessValue(), confPolygonDia->getPolygonConfigChange() ); if(cmd) { if ( !macro) macro=new KMacroCommand(i18n( "Apply Properties" ) ); macro->addCommand(cmd); } } if ((confPictureDia = styleDia->getConfPictureDia())) { cmd = m_canvas->activePage()->setPictureSettings( confPictureDia->getPictureMirrorType(), confPictureDia->getPictureDepth(), confPictureDia->getPictureSwapRGB(), confPictureDia->getPictureGrayscal(), confPictureDia->getPictureBright() ); if (cmd ) { if ( !macro) macro=new KMacroCommand(i18n( "Apply Properties" ) ); macro->addCommand( cmd ); } cmd = stickyPage()->setPictureSettings( confPictureDia->getPictureMirrorType(), confPictureDia->getPictureDepth(), confPictureDia->getPictureSwapRGB(), confPictureDia->getPictureGrayscal(), confPictureDia->getPictureBright() ); if (cmd) { if ( !macro) macro=new KMacroCommand(i18n( "Apply Properties" ) ); macro->addCommand( cmd ); } } if ((confRectDia = styleDia->getConfRectangleDia())) { cmd=m_canvas->activePage()->setRectSettings( confRectDia->getRndX(), confRectDia->getRndY(), confRectDia->getRectangleConfigChange() ); if(cmd) { if ( !macro) macro=new KMacroCommand(i18n( "Apply Properties" ) ); macro->addCommand(cmd); } cmd=stickyPage()->setRectSettings( confRectDia->getRndX(), confRectDia->getRndY(), confRectDia->getRectangleConfigChange() ); if(cmd) { if ( !macro) macro=new KMacroCommand(i18n( "Apply Properties" ) ); macro->addCommand(cmd); } } if(macro) kPresenterDoc()->addCommand(macro); else { if (confPieDia) { pieType = confPieDia->getType(); pieAngle = confPieDia->getAngle(); pieLength = confPieDia->getLength(); } if (confPolygonDia) { checkConcavePolygon = confPolygonDia->getCheckConcavePolygon(); cornersValue = confPolygonDia->getCornersValue(); sharpnessValue = confPolygonDia->getSharpnessValue(); } if (confPictureDia) { mirrorType = confPictureDia->getPictureMirrorType(); depth = confPictureDia->getPictureDepth(); swapRGB = confPictureDia->getPictureSwapRGB(); grayscal = confPictureDia->getPictureGrayscal(); bright = confPictureDia->getPictureBright(); } if (confRectDia) { rndX = confRectDia->getRndX(); rndY = confRectDia->getRndY(); } pen = confPenDia->getPen(); brush = confBrushDia->getBrush(); lineBegin = confPenDia->getLineBegin(); lineEnd = confPenDia->getLineEnd(); fillType = confBrushDia->getFillType(); gColor1 = confBrushDia->getGColor1(); gColor2 = confBrushDia->getGColor2(); gType = confBrushDia->getGType(); gUnbalanced = confBrushDia->getGUnbalanced(); gXFactor = confBrushDia->getGXFactor(); gYFactor = confBrushDia->getGYFactor(); sticky = bSticky; keepRatio = styleDia->isSticky(); protect = styleDia->isProtected(); protectContent = styleDia->isProtectContent(); actionBrushColor->setCurrentColor( (confBrushDia->getBrush()).color() ); actionPenColor->setCurrentColor( (confPenDia->getPen()).color() ); } } void KPresenterView::pgConfOk() { QValueList selectedSlides; for( unsigned i = 0; i < kPresenterDoc()->pageList().count(); i++ ) selectedSlides.append( kPresenterDoc()->pageList().at( i )->isSlideSelected() ); PgConfCmd *pgConfCmd = new PgConfCmd( i18n( "Configure Slide Show" ), pgConfDia->getManualSwitch(), pgConfDia->getInfiniteLoop(), pgConfDia->getPresentationDuration(), pgConfDia->getPen(), pgConfDia->getPresSpeed(), pgConfDia->getSelectedSlides(), kPresenterDoc()->spManualSwitch(), kPresenterDoc()->spInfiniteLoop(), kPresenterDoc()->presentationDuration(), kPresenterDoc()->presPen(), kPresenterDoc()->getPresSpeed(), selectedSlides, kPresenterDoc() ); pgConfCmd->execute(); kPresenterDoc()->addCommand( pgConfCmd ); } void KPresenterView::transEffectOk() { //kdDebug(33001) << "======= KPresenterView::transEffectOK\n"; KPrPage *page=m_canvas->activePage(); TransEffectCmd *transEffectCmd = new TransEffectCmd( i18n( "Slide Transition" ), transEffectDia->getPageEffect(), transEffectDia->getPresSpeed(), transEffectDia->getSoundEffect(), transEffectDia->getSoundFileName(), transEffectDia->getAutoAdvance(), transEffectDia->getSlideTime(), page->getPageEffect(), kPresenterDoc()->getPresSpeed(), page->getPageSoundEffect(), page->getPageSoundFileName(), /* TODO page->getAutoAdvance() */ false, page->getPageTimer(), page ); transEffectCmd->execute(); kPresenterDoc()->addCommand( transEffectCmd ); } void KPresenterView::rotateOk() { float _newAngle=rotateDia->angle(); KMacroCommand *macro=0L; KCommand *cmd=m_canvas->activePage()->rotateObj(_newAngle); if( cmd) { if ( !macro ) macro=new KMacroCommand(i18n( "Change Rotation" )); macro->addCommand(cmd); } cmd=stickyPage()->rotateObj(_newAngle); if( cmd) { if ( !macro ) macro=new KMacroCommand(i18n( "Change Rotation" )); macro->addCommand(cmd); } if(macro) kPresenterDoc()->addCommand(macro); } void KPresenterView::shadowOk() { KMacroCommand *macro=0L; KCommand *cmd=m_canvas->activePage()->shadowObj(shadowDia->shadowDirection(), shadowDia->shadowDistance(), shadowDia->shadowColor()); if( cmd) { if ( !macro ) macro=new KMacroCommand(i18n( "Change Shadow" )); macro->addCommand(cmd); } cmd=stickyPage()->shadowObj(shadowDia->shadowDirection(), shadowDia->shadowDistance(), shadowDia->shadowColor()); if( cmd) { if ( !macro ) macro=new KMacroCommand(i18n( "Change Shadow" )); macro->addCommand(cmd); } if(macro) kPresenterDoc()->addCommand(macro); } unsigned int KPresenterView::getCurrPgNum() const { return currPg + 1; } void KPresenterView::scrollH( int value ) { if ( !presStarted ) { m_canvas->scrollX( value ); if ( h_ruler ) h_ruler->setOffset( value, 0 ); } } void KPresenterView::scrollV( int value ) { if ( !presStarted ) { m_canvas->scrollY( value ); if ( v_ruler ) v_ruler->setOffset( 0, value ); } } void KPresenterView::fontChanged( const QFont &font ) { tbFont.setFamily( font.family() ); tbFont.setBold( font.bold() ); tbFont.setItalic( font.italic() ); tbFont.setUnderline( font.underline() ); tbFont.setPointSize( font.pointSize() ); actionTextFontFamily->setFont( tbFont.family() ); actionTextFontSize->setFontSize( tbFont.pointSize() ); actionTextBold->setChecked( tbFont.bold() ); actionTextItalic->setChecked( tbFont.italic() ); actionTextUnderline->setChecked( tbFont.underline() ); } void KPresenterView::colorChanged( const QColor &color ) { tbColor = color; actionTextColor->setEnabled( true ); actionTextColor->setCurrentColor( tbColor ); } void KPresenterView::alignChanged( int align ) { if ( align != tbAlign ) { tbAlign = align; if ( ( align & AlignLeft ) == AlignLeft ) { actionTextAlignLeft->blockSignals( true ); actionTextAlignLeft->setChecked( true ); actionTextAlignLeft->blockSignals( false ); } else if ( ( align & AlignHCenter ) == AlignHCenter || ( align & AlignCenter ) == AlignCenter ) { actionTextAlignCenter->blockSignals( true ); actionTextAlignCenter->setChecked( true ); actionTextAlignCenter->blockSignals( false ); } else if ( ( align & AlignRight ) == AlignRight ) { actionTextAlignRight->blockSignals( true ); actionTextAlignRight->setChecked( true ); actionTextAlignRight->blockSignals( false ); } else if ( (align & AlignJustify ) == AlignJustify ) { actionTextAlignBlock->blockSignals( true ); actionTextAlignBlock->setChecked( true ); actionTextAlignBlock->blockSignals( false ); } } } void KPresenterView::changePicture( const QString & filename ) { QStringList mimetypes; mimetypes += KImageIO::mimeTypes( KImageIO::Reading ); mimetypes += KoPictureFilePreview::clipartMimeTypes(); KFileDialog fd( filename, QString::null, 0, 0, true ); fd.setCaption(i18n("Select New Picture")); fd.setMimeFilter( mimetypes ); fd.setPreviewWidget( new KoPictureFilePreview( &fd ) ); KURL url; if ( fd.exec() == QDialog::Accepted ) url = fd.selectedURL(); if( url.isEmpty() || !url.isValid()) return; m_canvas->changePicture( url ); } void KPresenterView::resizeEvent( QResizeEvent *e ) { if ( !presStarted ) QWidget::resizeEvent( e ); QSize s = e ? e->size() : size(); splitter->setGeometry( 0, 0, s.width(), s.height() ); } void KPresenterView::reorganize() { if (m_bShowGUI ) { horz->show(); vert->show(); pgNext->show(); pgPrev->show(); if(kPresenterDoc()->showRuler()) { m_canvas->move( 20, 20 ); if ( h_ruler ) { h_ruler->show(); h_ruler->setGeometry( 20, 0, m_canvas->width(), 20 ); } if (v_ruler ) { v_ruler->show(); v_ruler->setGeometry( 0, 20, 20, m_canvas->height() ); } if(getTabChooser()) { getTabChooser()->setGeometry(0,0,20,20); getTabChooser()->show(); } } else { m_canvas->move( 0, 0 ); if ( h_ruler ) h_ruler->hide(); if ( v_ruler ) v_ruler->hide(); getTabChooser()->hide(); } if( statusBar()) { if(m_pKPresenterDoc->showStatusBar()) statusBar()->show(); else statusBar()->hide(); } setRanges(); } else { horz->hide(); vert->hide(); pgNext->hide(); pgPrev->hide(); h_ruler->hide(); v_ruler->hide(); getTabChooser()->hide(); m_canvas->move( 0, 0 ); } } void PageBase::resizeEvent( QResizeEvent *e ) { if ( !view->presStarted ) QWidget::resizeEvent( e ); QSize s = e ? e->size() : size(); if ( view->m_bShowGUI ) { view->m_canvas->resize( s.width() - 36, s.height() - 36 ); view->vert->setGeometry( s.width() - 16, 0, 16, s.height() - 32 ); view->pgPrev->setGeometry( s.width() - 15, s.height() - 32, 15, 16 ); view->pgNext->setGeometry( s.width() - 15, s.height() - 16, 15, 16 ); view->horz->setGeometry( 0, s.height() - 16, s.width() - 16, 16 ); } else { view->m_canvas->move( 0, 0 ); view->m_canvas->resize( s.width(), s.height() ); } view->reorganize(); } void KPresenterView::dragEnterEvent( QDragEnterEvent *e ) { QApplication::sendEvent( m_canvas, e ); } void KPresenterView::dragMoveEvent( QDragMoveEvent *e ) { QApplication::sendEvent( m_canvas, e ); } void KPresenterView::dragLeaveEvent( QDragLeaveEvent *e ) { QApplication::sendEvent( m_canvas, e ); } void KPresenterView::dropEvent( QDropEvent *e ) { QApplication::sendEvent( m_canvas, e ); } void KPresenterView::getPageMouseWheelEvent( QWheelEvent *e ) { QApplication::sendEvent( vert, e ); } void KPresenterView::keyPressEvent( QKeyEvent *e ) { if ( e->key() == Key_Delete && !m_canvas->currentTextObjectView() ) editDelete(); else QApplication::sendEvent( m_canvas, e ); } void KPresenterView::doAutomaticScreenPres() { if ( exitPres ) // A user pushed Escape key or clicked "Exit presentation" menu. return; else if ( !continuePres && kPresenterDoc()->spInfiniteLoop() ) { continuePres = true; - m_canvas->gotoPage( 1 ); // return to first page. + m_canvas->presGotoFirstPage(); // return to first page. setCurrentTimer( 1 ); m_canvas->setNextPageTimer( true ); } else if ( !continuePres ) return; else screenNext(); } void KPresenterView::updateReadWrite( bool readwrite ) { // First disable or enable everything QValueList actions = actionCollection()->actions(); // Also grab actions from the document actions += m_pKPresenterDoc->actionCollection()->actions(); QValueList::ConstIterator aIt = actions.begin(); QValueList::ConstIterator aEnd = actions.end(); for (; aIt != aEnd; ++aIt ) (*aIt)->setEnabled( readwrite ); if ( !readwrite ) { // Readonly -> re-enable a few harmless actions refreshPageButton(); actionViewFormattingChars->setEnabled( true ); actionViewZoom->setEnabled( true ); actionEditFind->setEnabled( true ); actionEditFindNext->setEnabled( true ); actionEditFindPrevious->setEnabled( true ); actionEditReplace->setEnabled( true ); actionEditSelectAll->setEnabled( true ); actionEditDeSelectAll->setEnabled( true ); } else { refreshPageButton(); objectSelectedChanged(); refreshCustomMenu(); // Correctly enable or disable undo/redo actions again m_pKPresenterDoc->commandHistory()->updateActions(); updateSideBarMenu(); } } void KPresenterView::setupPopupMenus() { // create right button object align menu rb_oalign = new QPopupMenu(); Q_CHECK_PTR( rb_oalign ); rb_oalign->insertItem( KPBarIcon("aoleft" ), this, SLOT( extraAlignObjLeft() ) ); rb_oalign->insertSeparator(); rb_oalign->insertItem( KPBarIcon("aocenterh" ), this, SLOT( extraAlignObjCenterH() ) ); rb_oalign->insertSeparator(); rb_oalign->insertItem( KPBarIcon("aoright" ), this, SLOT( extraAlignObjRight() ) ); rb_oalign->insertSeparator(); rb_oalign->insertItem( KPBarIcon("aotop" ) , this, SLOT( extraAlignObjTop() ) ); rb_oalign->insertSeparator(); rb_oalign->insertItem( KPBarIcon("aocenterv" ), this, SLOT( extraAlignObjCenterV() ) ); rb_oalign->insertSeparator(); rb_oalign->insertItem( KPBarIcon("aobottom" ), this, SLOT( extraAlignObjBottom() ) ); rb_oalign->setMouseTracking( true ); rb_oalign->setCheckable( false ); // create right button line begin rb_lbegin = new QPopupMenu(); Q_CHECK_PTR( rb_lbegin ); rb_lbegin->insertItem( KPBarIcon("line_normal_begin" ), this, SLOT( extraLineBeginNormal() ) ); rb_lbegin->insertSeparator(); rb_lbegin->insertItem( KPBarIcon("line_arrow_begin" ), this, SLOT( extraLineBeginArrow() ) ); rb_lbegin->insertSeparator(); rb_lbegin->insertItem( KPBarIcon("line_rect_begin" ), this, SLOT( extraLineBeginRect() ) ); rb_lbegin->insertSeparator(); rb_lbegin->insertItem( KPBarIcon("line_circle_begin" ), this, SLOT( extraLineBeginCircle() ) ); rb_lbegin->insertSeparator(); rb_lbegin->insertItem( KPBarIcon("line_line_arrow_begin" ), this, SLOT( extraLineBeginLineArrow() ) ); rb_lbegin->insertSeparator(); rb_lbegin->insertItem( KPBarIcon("line_dimension_line_begin" ), this, SLOT( extraLineBeginDimensionLine() ) ); rb_lbegin->insertSeparator(); rb_lbegin->insertItem( KPBarIcon("line_double_arrow_begin" ), this, SLOT( extraLineBeginDoubleArrow() ) ); rb_lbegin->insertSeparator(); rb_lbegin->insertItem( KPBarIcon("line_double_line_arrow_begin" ), this, SLOT( extraLineBeginDoubleLineArrow() ) ); rb_lbegin->setMouseTracking( true ); rb_lbegin->setCheckable( false ); // create right button line end rb_lend = new QPopupMenu(); Q_CHECK_PTR( rb_lend ); rb_lend->insertItem( KPBarIcon("line_normal_end" ), this, SLOT( extraLineEndNormal() ) ); rb_lend->insertSeparator(); rb_lend->insertItem( KPBarIcon("line_arrow_end" ), this, SLOT( extraLineEndArrow() ) ); rb_lend->insertSeparator(); rb_lend->insertItem( KPBarIcon("line_rect_end" ), this, SLOT( extraLineEndRect() ) ); rb_lend->insertSeparator(); rb_lend->insertItem( KPBarIcon("line_circle_end" ), this, SLOT( extraLineEndCircle() ) ); rb_lend->insertSeparator(); rb_lend->insertItem( KPBarIcon("line_line_arrow_end" ), this, SLOT( extraLineEndLineArrow() ) ); rb_lend->insertSeparator(); rb_lend->insertItem( KPBarIcon("line_dimension_line_end" ), this, SLOT( extraLineEndDimensionLine() ) ); rb_lend->insertSeparator(); rb_lend->insertItem( KPBarIcon("line_double_arrow_end" ), this, SLOT( extraLineEndDoubleArrow() ) ); rb_lend->insertSeparator(); rb_lend->insertItem( KPBarIcon("line_double_line_arrow_end" ), this, SLOT( extraLineEndDoubleLineArrow() ) ); rb_lend->setMouseTracking( true ); rb_lend->setCheckable( false ); // create right button pen style rb_pstyle = new QPopupMenu(); Q_CHECK_PTR( rb_pstyle ); rb_pstyle->insertItem( KPBarIcon( "pen_style_solid" ), this, SLOT( extraPenStyleSolid() ) ); rb_pstyle->insertSeparator(); rb_pstyle->insertItem( KPBarIcon( "pen_style_dash" ), this, SLOT( extraPenStyleDash() ) ); rb_pstyle->insertSeparator(); rb_pstyle->insertItem( KPBarIcon( "pen_style_dot" ), this, SLOT( extraPenStyleDot() ) ); rb_pstyle->insertSeparator(); rb_pstyle->insertItem( KPBarIcon( "pen_style_dashdot" ), this, SLOT( extraPenStyleDashDot() ) ); rb_pstyle->insertSeparator(); rb_pstyle->insertItem( KPBarIcon( "pen_style_dashdotdot" ), this, SLOT( extraPenStyleDashDotDot() ) ); rb_pstyle->insertSeparator(); rb_pstyle->insertItem( KPBarIcon( "pen_style_nopen" ), this, SLOT( extraPenStyleNoPen() ) ); rb_pstyle->setMouseTracking( true ); rb_pstyle->setCheckable( false ); // create right button pen width rb_pwidth = new QPopupMenu(); Q_CHECK_PTR( rb_pwidth ); rb_pwidth->insertItem( KPBarIcon( "pen_width1" ), this, SLOT( extraPenWidth1() ) ); rb_pwidth->insertSeparator(); rb_pwidth->insertItem( KPBarIcon( "pen_width2" ), this, SLOT( extraPenWidth2() ) ); rb_pwidth->insertSeparator(); rb_pwidth->insertItem( KPBarIcon( "pen_width3" ), this, SLOT( extraPenWidth3() ) ); rb_pwidth->insertSeparator(); rb_pwidth->insertItem( KPBarIcon( "pen_width4" ), this, SLOT( extraPenWidth4() ) ); rb_pwidth->insertSeparator(); rb_pwidth->insertItem( KPBarIcon( "pen_width5" ), this, SLOT( extraPenWidth5() ) ); rb_pwidth->insertSeparator(); rb_pwidth->insertItem( KPBarIcon( "pen_width6" ), this, SLOT( extraPenWidth6() ) ); rb_pwidth->insertSeparator(); rb_pwidth->insertItem( KPBarIcon( "pen_width7" ), this, SLOT( extraPenWidth7() ) ); rb_pwidth->insertSeparator(); rb_pwidth->insertItem( KPBarIcon( "pen_width8" ), this, SLOT( extraPenWidth8() ) ); rb_pwidth->insertSeparator(); rb_pwidth->insertItem( KPBarIcon( "pen_width9" ), this, SLOT( extraPenWidth9() ) ); rb_pwidth->insertSeparator(); rb_pwidth->insertItem( KPBarIcon( "pen_width10" ), this, SLOT( extraPenWidth10() ) ); rb_pwidth->setMouseTracking( true ); rb_pwidth->setCheckable( false ); // create arrange-objects popup m_arrangeObjectsPopup = new QPopupMenu(); Q_CHECK_PTR(m_arrangeObjectsPopup); m_arrangeObjectsPopup->insertItem(KPBarIcon("lower"), this, SLOT(extraLower())); m_arrangeObjectsPopup->insertSeparator(); m_arrangeObjectsPopup->insertItem(KPBarIcon("send_backward"), this, SLOT(extraSendBackward())); m_arrangeObjectsPopup->insertSeparator(); m_arrangeObjectsPopup->insertItem(KPBarIcon("bring_forward"), this, SLOT(extraBringForward())); m_arrangeObjectsPopup->insertSeparator(); m_arrangeObjectsPopup->insertItem(KPBarIcon("raise"), this, SLOT(extraRaise())); m_arrangeObjectsPopup->setMouseTracking(true); m_arrangeObjectsPopup->setCheckable(false); // create insert-line popup actionToolsLinePopup->insert(actionToolsLine); actionToolsLinePopup->insert(actionToolsFreehand); actionToolsLinePopup->insert(actionToolsPolyline); actionToolsLinePopup->insert(actionToolsCubicBezierCurve); actionToolsLinePopup->insert(actionToolsQuadricBezierCurve); // create insert-shape popup actionToolsShapePopup->insert(actionToolsRectangle); actionToolsShapePopup->insert(actionToolsCircleOrEllipse); actionToolsShapePopup->insert(actionToolsPie); actionToolsShapePopup->insert(actionToolsConvexOrConcavePolygon); // create insert-closed-line popup actionToolsClosedLinePopup->insert(actionToolsClosedFreehand); actionToolsClosedLinePopup->insert(actionToolsClosedPolyline); actionToolsClosedLinePopup->insert(actionToolsClosedQuadricBezierCurve); actionToolsClosedLinePopup->insert(actionToolsClosedCubicBezierCurve); } void KPresenterView::setupScrollbars() { vert = new QScrollBar( QScrollBar::Vertical, pageBase ); horz = new QScrollBar( QScrollBar::Horizontal, pageBase ); vert->show(); horz->show(); QObject::connect( vert, SIGNAL( valueChanged( int ) ), this, SLOT( scrollV( int ) ) ); QObject::connect( horz, SIGNAL( valueChanged( int ) ), this, SLOT( scrollH( int ) ) ); vert->setValue(vert->maxValue()); horz->setValue(horz->maxValue()); vert->setValue(vert->minValue()); horz->setValue(horz->minValue()); pgNext = new QToolButton( pageBase ); pgNext->setPixmap( QPixmap( pagedown_xpm ) ); pgNext->setAutoRepeat( TRUE ); QToolTip::add( pgNext, i18n( "Next slide" ) ); connect( pgNext, SIGNAL( clicked() ), this, SLOT( nextPage() ) ); pgPrev = new QToolButton( pageBase ); pgPrev->setPixmap( QPixmap( pageup_xpm ) ); pgPrev->setAutoRepeat( TRUE ); QToolTip::add( pgPrev, i18n( "Previous slide" ) ); connect( pgPrev, SIGNAL( clicked() ), this, SLOT( prevPage() ) ); } void KPresenterView::setupRulers() { tabChooser = new KoTabChooser( pageBase, KoTabChooser::TAB_ALL ); tabChooser->setReadWrite(kPresenterDoc()->isReadWrite()); h_ruler = new KoRuler( pageBase, m_canvas, Qt::Horizontal, kPresenterDoc()->pageLayout(), KoRuler::F_INDENTS | KoRuler::F_TABS, kPresenterDoc()->getUnit(), tabChooser ); h_ruler->changeFlags(0); h_ruler->setReadWrite(kPresenterDoc()->isReadWrite()); v_ruler = new KoRuler( pageBase, m_canvas, Qt::Vertical, kPresenterDoc()->pageLayout(), 0, kPresenterDoc()->getUnit() ); v_ruler->setReadWrite(kPresenterDoc()->isReadWrite()); m_canvas->resize( m_canvas->width() - 20, m_canvas->height() - 20 ); m_canvas->move( 20, 20 ); h_ruler->setGeometry( 20, 0, m_canvas->width(), 20 ); v_ruler->setGeometry( 0, 20, 20, m_canvas->height() ); QObject::connect( h_ruler, SIGNAL( unitChanged( QString ) ), this, SLOT( unitChanged( QString ) ) ); QObject::connect( h_ruler, SIGNAL( newPageLayout( KoPageLayout ) ), this, SLOT( newPageLayout( KoPageLayout ) ) ); QObject::connect( h_ruler, SIGNAL( addHelpline( const QPoint &, bool ) ), this, SLOT( addHelpline( const QPoint &, bool ) ) ); QObject::connect( h_ruler, SIGNAL( moveHelpLines( const QPoint &, bool ) ), this, SLOT( drawTmpHelpLine( const QPoint &, bool ) ) ); connect( h_ruler, SIGNAL( doubleClicked() ), this, SLOT( slotHRulerDoubleClicked() ) ); connect( h_ruler, SIGNAL( doubleClicked(double) ), this, SLOT( slotHRulerDoubleClicked(double) ) ); QObject::connect( v_ruler, SIGNAL( unitChanged( QString ) ), this, SLOT( unitChanged( QString ) ) ); QObject::connect( v_ruler, SIGNAL( newPageLayout( KoPageLayout ) ), this, SLOT( newPageLayout( KoPageLayout ) ) ); QObject::connect( v_ruler, SIGNAL( doubleClicked() ), this, SLOT( openPageLayoutDia() ) ); QObject::connect( v_ruler, SIGNAL( addHelpline(const QPoint &, bool ) ), this, SLOT( addHelpline( const QPoint &, bool ) ) ); QObject::connect( v_ruler, SIGNAL( moveHelpLines( const QPoint &, bool ) ), this, SLOT( drawTmpHelpLine( const QPoint &, bool ) ) ); connect( h_ruler, SIGNAL( newLeftIndent( double ) ), this, SLOT( newLeftIndent( double ) ) ); connect( h_ruler, SIGNAL( newFirstIndent( double ) ), this, SLOT( newFirstIndent( double ) ) ); connect( h_ruler, SIGNAL( newRightIndent( double ) ), this, SLOT( newRightIndent( double ) ) ); } void KPresenterView::unitChanged( QString u ) { m_pKPresenterDoc->setUnit(KoUnit::unit( u ) ); } void KPresenterView::setRanges() { if ( vert && horz && m_canvas && m_pKPresenterDoc ) { vert->setSteps( 10, m_canvas->height() ); vert->setRange( 0, QMAX( 0, m_canvas->activePage()->getZoomPageRect().height() - m_canvas->height() ) ); horz->setSteps( 10, m_canvas->width() ); horz->setRange( 0, QMAX( 0, m_canvas->activePage()->getZoomPageRect().width() + 16 - m_canvas->width() ) ); } } void KPresenterView::skipToPage( int num ) { if ( num < 0 || num > static_cast( m_pKPresenterDoc->getPageNums() ) - 1 || !m_canvas ) return; m_canvas->exitEditMode(); currPg = num; emit currentPageChanged( currPg ); if( sidebar ) sidebar->setCurrentPage( currPg ); KPrPage* page = m_pKPresenterDoc->pageList().at( currPg ); m_canvas->setActivePage( page ); // don't scroll before new active page is set, // the page active until then might have been deleted vert->setValue( 0 ); horz->setValue( 0 ); if ( notebar ) { QString text = page->noteText( ); notebar->setCurrentNoteText( text ); } refreshPageButton(); //(Laurent) deselect object when we change page. //otherwise you can change object properties on other page deSelectAllObjects(); m_pKPresenterDoc->repaint( FALSE ); m_pKPresenterDoc->displayActivePage( page ); m_pKPresenterDoc->recalcPageNum(); m_pKPresenterDoc->slotRepaintVariable(); updatePageParameter(); } //update color gradient etc... when we skip page void KPresenterView::updatePageParameter() { KPrPage *page=m_canvas->activePage(); if(page) { pieType = page->getPieType(pieType); pieAngle = page->getPieAngle(pieAngle); pieLength = page->getPieLength(pieLength); rndX = page->getRndX( rndX ); rndY = page->getRndY( rndY ); checkConcavePolygon = page->getCheckConcavePolygon(checkConcavePolygon); cornersValue = page->getCornersValue(cornersValue); sharpnessValue = page->getSharpnessValue(sharpnessValue); mirrorType = page->getPictureMirrorType(mirrorType); depth = page->getPictureDepth(depth); swapRGB = page->getPictureSwapRGB(swapRGB); grayscal = page->getPictureGrayscal(grayscal); bright = page->getPictureBright(bright); lineBegin=page->getLineEnd( lineBegin ); lineEnd=page->getLineBegin( lineEnd ); gUnbalanced=page->getBackUnbalanced(); gColor1=page->getBackColor1(); gColor2=page->getBackColor2(); gXFactor=page->getBackXFactor(); gYFactor=page->getBackYFactor(); gType=page->getBackColorType(); } } void KPresenterView::refreshPageButton() { bool state = (currPg > 0); pgPrev->setEnabled( state ); actionScreenFirst->setEnabled(state); actionScreenPrev->setEnabled(state); state=(currPg < (int)m_pKPresenterDoc->getPageNums() - 1); pgNext->setEnabled( state ); actionScreenLast->setEnabled(state); actionScreenNext->setEnabled(state); } void KPresenterView::makeRectVisible( QRect _rect ) { horz->setValue( _rect.x() ); vert->setValue( _rect.y() ); } void KPresenterView::setTool( ToolEditMode toolEditMode ) { switch ( toolEditMode ) { case TEM_MOUSE: actionToolsMouse->setChecked( true ); break; case TEM_ROTATE: actionToolsRotate->setChecked( true ); break; case TEM_ZOOM: actionToolsZoom->setChecked( true ); break; case INS_LINE: actionToolsLine->setChecked( true ); break; case INS_RECT: actionToolsRectangle->setChecked( true ); break; case INS_ELLIPSE: actionToolsCircleOrEllipse->setChecked( true ); break; case INS_PIE: actionToolsPie->setChecked( true ); break; case INS_DIAGRAMM: actionToolsDiagramm->setChecked( true ); break; case INS_TABLE: actionToolsTable->setChecked( true ); break; case INS_FORMULA: actionToolsFormula->setChecked( true ); break; case INS_TEXT: actionToolsText->setChecked( true ); break; case INS_AUTOFORM: actionToolsAutoform->setChecked( true ); break; default: // Shut up gcc -Wall break; // Shut up gcc 3.x } } void KPresenterView::setRulerMouseShow( bool _show ) { v_ruler->showMousePos( _show ); h_ruler->showMousePos( _show ); } void KPresenterView::setRulerMousePos( int mx, int my ) { v_ruler->setMousePos( mx, my ); h_ruler->setMousePos( mx, my ); } void KPresenterView::enableWebPres() { } bool KPresenterView::doubleClickActivation() const { return true; } QWidget* KPresenterView::canvas() { return m_canvas; } int KPresenterView::canvasXOffset() const { return m_canvas->diffx(); } int KPresenterView::canvasYOffset() const { return m_canvas->diffy(); } void KPresenterView::setCanvasXOffset( int _x ) { m_canvas->setDiffX( _x ); } void KPresenterView::setCanvasYOffset( int _y ) { m_canvas->setDiffY( _y ); } int KPresenterView::getCurrentPresPage() const { if ( !presStarted ) return -1; return m_canvas->presPage(); } int KPresenterView::getCurrentPresStep() const { if ( !presStarted ) return -1; return m_canvas->presStep(); } int KPresenterView::getPresStepsOfPage() const { if ( !presStarted ) return -1; return m_canvas->numPresSteps(); } int KPresenterView::getNumPresPages() const { if ( !presStarted ) return -1; return m_canvas->numPresPages(); } float KPresenterView::getCurrentFaktor() const { if ( !presStarted ) return 1.0; return m_canvas->presFakt(); } bool KPresenterView::gotoPresPage( int pg ) { if ( !presStarted ) return false; m_canvas->gotoPage( pg ); return true; } void KPresenterView::nextPage() { if ( currPg >= (int)m_pKPresenterDoc->getPageNums() - 1 ) return; //kdDebug(33001)<<"currPg :"<getPageNums() :"<getPageNums()<blockSignals( TRUE ); sidebar->thumbBar()->uptodate = false; sidebar->outline()->rebuildItems(); sidebar->thumbBar()->rebuildItems(); sidebar->blockSignals( FALSE ); } } void KPresenterView::updateSideBarItem( int pagenr, bool sticky ) { //kdDebug(33001) << "KPresenterView::updateSideBarItem " << pagenr << endl; if (sidebar) sidebar->updateItem( pagenr, sticky ); } void KPresenterView::addSideBarItem( int pos ) { if ( sidebar ) { sidebar->blockSignals( TRUE ); sidebar->addItem( pos ); sidebar->blockSignals( FALSE ); } } void KPresenterView::moveSideBarItem( int oldPos, int newPos ) { if ( sidebar ) { sidebar->blockSignals( TRUE ); sidebar->moveItem( oldPos, newPos ); sidebar->blockSignals( FALSE ); } } void KPresenterView::removeSideBarItem( int pos ) { if ( sidebar ) { sidebar->blockSignals( TRUE ); sidebar->removeItem( pos ); sidebar->blockSignals( FALSE ); } } void KPresenterView::updatePageInfo() { if (m_sbPageLabel) m_sbPageLabel->setText( QString(" ") + i18n("Slide %1/%2").arg(getCurrPgNum()).arg(m_pKPresenterDoc->getPageNums())+ QString(" ") ); } void KPresenterView::updateObjectStatusBarItem() { KStatusBar * sb = statusBar(); int nbObjects = m_canvas->objNums(); if ( m_pKPresenterDoc->showStatusBar() && sb && nbObjects > 0 ) { if ( !m_sbObjectLabel ) { m_sbObjectLabel = sb ? new KStatusBarLabel( QString::null, 0, sb ) : 0; addStatusBarItem( m_sbObjectLabel ); } int nbSelected = m_canvas->numberOfObjectSelected(); if (nbSelected == 1) { KPObject * obj = m_canvas->getSelectedObj(); KoSize size = obj->getSize(); m_sbObjectLabel->setText( i18n( "Statusbar info", "Object: %1 - (width: %2; height: %3)(%4)" ) .arg(obj->getTypeString()) .arg(KGlobal::locale()->formatNumber(KoUnit::ptToUnit( size.width(), m_pKPresenterDoc->getUnit())), 2) .arg(KGlobal::locale()->formatNumber(KoUnit::ptToUnit( size.height(), m_pKPresenterDoc->getUnit())), 2) .arg(m_pKPresenterDoc->getUnitName()) ); } else m_sbObjectLabel->setText( i18n("1 object selected", "%n objects selected", nbSelected) ); } else if ( sb && m_sbObjectLabel ) { removeStatusBarItem( m_sbObjectLabel ); delete m_sbObjectLabel; m_sbObjectLabel = 0L; } } void KPresenterView::pageNumChanged() { updatePageInfo(); } void KPresenterView::viewShowSideBar() { if ( !sidebar ) return; if ( sidebar->isVisible() ) sidebar->hide(); else sidebar->show(); } void KPresenterView::viewShowNoteBar() { if ( !notebar ) return; if ( notebar->isVisible() ) notebar->hide(); else notebar->show(); } void KPresenterView::openPopupMenuMenuPage( const QPoint & _point ) { if(!koDocument()->isReadWrite() || !factory()) return; QPtrList actionList= QPtrList(); KActionSeparator *separator=new KActionSeparator(); switch( m_canvas->activePage()->getBackType()) { case BT_COLOR: break; case BT_PICTURE: case BT_CLIPART: actionList.append(separator); actionList.append(actionSaveBackgroundPicture); break; } if ( actionList.count()>0) plugActionList( "picture_action", actionList ); QPopupMenu* menu = dynamic_cast(factory()->container("menupage_popup",this)); if ( menu ) menu->exec(_point); unplugActionList( "picture_action" ); delete separator; } void KPresenterView::openPopupMenuObject( const QString & name, const QPoint & _point ) { if(!koDocument()->isReadWrite() || !factory()) return; dynamic_cast(factory()->container(name, this))->popup(_point); } void KPresenterView::openPopupMenuSideBar(const QPoint & _point) { if(!koDocument()->isReadWrite() || !factory()) return; dynamic_cast(factory()->container("sidebarmenu_popup", this))->popup(_point); } void KPresenterView::renamePageTitle() { if(sidebar) sidebar->renamePageTitle(); } void KPresenterView::picViewOriginalSize() { m_canvas->picViewOriginalSize(); } void KPresenterView::picViewOrig640x480() { m_canvas->picViewOrig640x480(); } void KPresenterView::picViewOrig800x600() { m_canvas->picViewOrig800x600(); } void KPresenterView::picViewOrig1024x768() { m_canvas->picViewOrig1024x768(); } void KPresenterView::picViewOrig1280x1024() { m_canvas->picViewOrig1280x1024(); } void KPresenterView::picViewOrig1600x1200() { m_canvas->picViewOrig1600x1200(); } void KPresenterView::chPic() { m_canvas->chPic(); } void KPresenterView::penColorChanged( const QPen & _pen ) { //actionPenColor->setEnabled( true ); actionPenColor->setCurrentColor( _pen.color() ); } void KPresenterView::brushColorChanged( const QBrush & _brush ) { //actionBrushColor->setEnabled( true ); actionBrushColor->setCurrentColor(_brush.style ()==Qt::NoBrush ? Qt::white : _brush.color() ); } void KPresenterView::autoScreenPresReStartTimer() { automaticScreenPresTime.start(); automaticScreenPresWaitTime = 0; automaticScreenPresTimer.changeInterval( currentTimer ); } void KPresenterView::autoScreenPresIntervalTimer() { automaticScreenPresTime.restart(); automaticScreenPresTimer.changeInterval( currentTimer - automaticScreenPresWaitTime ); } void KPresenterView::autoScreenPresStopTimer() { automaticScreenPresTimer.stop(); automaticScreenPresWaitTime += automaticScreenPresTime.elapsed(); } void KPresenterView::setCurrentTimer( int _currentTimer ) { currentTimer = _currentTimer * 1000; autoScreenPresReStartTimer(); } void KPresenterView::insertSpecialChar() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( !edit ) return; QString f = edit->textFontFamily(); QChar c=' '; if (m_specialCharDlg==0) { m_specialCharDlg = new KoCharSelectDia( this, "insert special char", f, c, false ); connect( m_specialCharDlg, SIGNAL(insertChar(QChar,const QString &)), this, SLOT(slotSpecialChar(QChar,const QString &))); connect( m_specialCharDlg, SIGNAL( finished() ), this, SLOT( slotSpecialCharDlgClosed() ) ); } m_specialCharDlg->show(); } void KPresenterView::slotSpecialCharDlgClosed() { if ( m_specialCharDlg) { disconnect( m_specialCharDlg, SIGNAL(insertChar(QChar,const QString &)), this, SLOT(slotSpecialChar(QChar,const QString &))); disconnect( m_specialCharDlg, SIGNAL( finished() ), this, SLOT( slotSpecialCharDlgClosed() ) ); m_specialCharDlg->deleteLater(); m_specialCharDlg = 0L; } } void KPresenterView::slotSpecialChar(QChar c, const QString &_font) { KPTextView *edit=m_canvas->currentTextObjectView(); if ( !edit ) return; edit->insertSpecialChar(c, _font); } void KPresenterView::insertLink() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( !edit ) return; QString link; QString ref; if(KoInsertLinkDia::createLinkDia(link, ref, QStringList(), false)) { if(!link.isEmpty() && !ref.isEmpty()) edit->insertLink(link, ref); } } void KPresenterView::changeLink() { KPTextView * edit = m_canvas->currentTextObjectView(); if ( edit ) { KoLinkVariable * var=edit->linkVariable(); if(var) { QString oldhref= var->url(); QString oldLinkName=var->value(); QString link=oldLinkName; QString ref=oldhref; if(KoInsertLinkDia::createLinkDia(link, ref, QStringList(), false)) { if(!link.isEmpty() && !ref.isEmpty()) { if( ref != oldhref || link!=oldLinkName) { KPrChangeLinkVariable*cmd=new KPrChangeLinkVariable( i18n("Change Link"), m_pKPresenterDoc, oldhref, ref, oldLinkName,link, var); cmd->execute(); m_pKPresenterDoc->addCommand(cmd); } } } } } } void KPresenterView::showFormat( const KoTextFormat ¤tFormat ) { actionTextFontFamily->setFont( currentFormat.font().family() ); actionTextFontSize->setFontSize( currentFormat.pointSize() ); actionTextBold->setChecked( currentFormat.font().bold()); actionTextItalic->setChecked( currentFormat.font().italic() ); actionTextUnderline->setChecked( currentFormat.underline()); actionFormatStrikeOut->setChecked( currentFormat.strikeOut()); QColor col=currentFormat.textBackgroundColor(); actionBrushColor->setEnabled(true); actionBrushColor->setCurrentColor( col.isValid() ? col : QApplication::palette().color( QPalette::Active, QColorGroup::Base )); //actionBrushColor->setText(i18n("Text Background Color...")); actionTextColor->setCurrentColor( currentFormat.color() ); switch(currentFormat.vAlign()) { case KoTextFormat::AlignSuperScript: { actionFormatSub->setChecked( false ); actionFormatSuper->setChecked( true ); break; } case KoTextFormat::AlignSubScript: { actionFormatSub->setChecked( true ); actionFormatSuper->setChecked( false ); break; } case KoTextFormat::AlignNormal: default: { actionFormatSub->setChecked( false ); actionFormatSuper->setChecked( false ); break; } } } void KPresenterView::slotSoftHyphen() { KPTextView *edit = m_canvas->currentTextObjectView(); if ( edit ) edit->insertSoftHyphen(); } void KPresenterView::slotNonbreakingSpace() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit ) edit->insertNonbreakingSpace(); } void KPresenterView::slotLineBreak() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit ) edit->insertLineBreak(); } void KPresenterView::extraAutoFormat() { m_pKPresenterDoc->getAutoFormat()->readConfig(); KoAutoFormatDia dia( this, 0, m_pKPresenterDoc->getAutoFormat() ); dia.exec(); m_pKPresenterDoc->startBackgroundSpellCheck(); // will do so if enabled } void KPresenterView::extraSpelling() { if (m_spell.kospell) return; // Already in progress m_spell.macroCmdSpellCheck=0L; m_spell.replaceAll.clear(); m_spell.bSpellSelection = false; m_spell.selectionStartPos=0; m_pKPresenterDoc->setReadWrite(false); // prevent editing text m_initSwitchPage=m_pKPresenterDoc->pageList().findRef(m_canvas->activePage()); m_switchPage = m_initSwitchPage; KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit && edit->kpTextObject()->textDocument()->hasSelection(KoTextDocument::Standard)) { m_spell.spellCurrTextObjNum = -1; m_spell.textObject.clear(); m_spell.textObject.append(edit->kpTextObject()); m_spell.bSpellSelection = true; m_spell.selectionStartPos = 0; KoTextCursor start = edit->textDocument()->selectionStartCursor( KoTextDocument::Standard ); m_spell.selectionStartPos =start.index(); for ( int i = 0 ; i < start.parag()->paragId(); i++) m_spell.selectionStartPos += start.parag()->document()->paragAt( i )->string()->length(); kdDebug()<<" m_spell.selectionStartPos after :"< lstObj; stickyPage()->getAllObjectSelectedList(lstObj, true); QPtrListIterator it( lstObj ); for ( ; it.current() ; ++it ) { if(it.current()->getType()==OT_TEXT) { KPTextObject* tmp = dynamic_cast(it.current() ); if ( tmp && !tmp->isProtectContent()) m_spell.textObject.append(tmp); } } } startKSpell(); } void KPresenterView::spellAddTextObject() { m_spell.spellCurrTextObjNum = -1; m_spell.textObject.clear(); QPtrList lstObj; m_canvas->activePage()->getAllObjectSelectedList(lstObj, true); QPtrListIterator it( lstObj ); for ( ; it.current() ; ++it ) { if(it.current()->getType()==OT_TEXT) { KPTextObject* tmp = dynamic_cast(it.current() ); if ( tmp && !tmp->isProtectContent()) m_spell.textObject.append(tmp); } } } void KPresenterView::spellCheckerReplaceAll( const QString &orig, const QString & replacement) { m_spell.replaceAll.append( orig); m_spell.replaceAll.append( replacement); } void KPresenterView::startKSpell() { // m_spellCurrFrameSetNum is supposed to be set by the caller of this method if(m_pKPresenterDoc->getKOSpellConfig()) { m_pKPresenterDoc->getKOSpellConfig()->setIgnoreList(m_pKPresenterDoc->spellListIgnoreAll()); m_pKPresenterDoc->getKOSpellConfig()->setReplaceAllList(m_spell.replaceAll); } m_spell.kospell =KOSpell::createKoSpell( this, i18n( "Spell Checking" ), this,SLOT( spellCheckerReady() ) ,m_pKPresenterDoc->getKOSpellConfig(), true,true /*FIXME !!!!!!!!!*/ ); //new KSpell( this, i18n( "Spell Checking" ), // this, SLOT( spellCheckerReady() ), m_pKPresenterDoc->getKSpellConfig() ); QObject::connect( m_spell.kospell, SIGNAL( death() ), this, SLOT( spellCheckerFinished() ) ); QObject::connect( m_spell.kospell, SIGNAL( misspelling( const QString &, const QStringList &, unsigned int) ), this, SLOT( spellCheckerMisspelling( const QString &, const QStringList &, unsigned int) ) ); QObject::connect( m_spell.kospell, SIGNAL( corrected( const QString &, const QString &, unsigned int) ), this, SLOT( spellCheckerCorrected( const QString &, const QString &, unsigned int ) ) ); QObject::connect( m_spell.kospell, SIGNAL( done( const QString & ) ), this, SLOT( spellCheckerDone( const QString & ) ) ); QObject::connect( m_spell.kospell, SIGNAL( ignoreall (const QString & ) ), this, SLOT( spellCheckerIgnoreAll( const QString & ) ) ); QObject::connect( m_spell.kospell, SIGNAL( replaceall( const QString &, const QString & )), this, SLOT( spellCheckerReplaceAll( const QString &, const QString & ))); QObject::connect( m_spell.kospell, SIGNAL( spellCheckerReady()), this, SLOT( spellCheckerReady())); } void KPresenterView::spellCheckerIgnoreAll( const QString & word) { m_pKPresenterDoc->addIgnoreWordAll( word ); } void KPresenterView::spellCheckerReady() { for ( unsigned int i = m_spell.spellCurrTextObjNum + 1; i < m_spell.textObject.count(); i++ ) { KPTextObject *textobj = m_spell.textObject.at( i ); m_spell.spellCurrTextObjNum = i; // store as number, not as pointer, to implement "go to next frameset" when done //kdDebug(33001) << "KPresenterView::spellCheckerReady spell-checking frameset " << spellCurrTextObjNum << endl; QString text = textobj->textDocument()->plainText(); if ( m_spell.bSpellSelection) text = textobj->textDocument()->selectedText(KoTextDocument::Standard); bool textIsEmpty=true; // Determine if text has any non-space character, otherwise there's nothing to spellcheck for ( uint i = 0 ; i < text.length() ; ++ i ) if ( !text[i].isSpace() ) { textIsEmpty = false; break; } if(textIsEmpty) continue; text += '\n'; // end of last paragraph text += '\n'; // empty line required by kspell m_spell.kospell->check( text); textobj->textObject()->setNeedSpellCheck(true); return; } //kdDebug(33001) << "KPresenterView::spellCheckerReady done" << endl; if(!switchInOtherPage(i18n( "Do you want to spellcheck new slide?"))) { // Done m_pKPresenterDoc->setReadWrite(true); delete m_spell.kospell; m_spell.kospell=0; #if 0 m_spell.kspell->cleanUp(); delete m_spell.kspell; m_spell.kspell = 0; #endif clearSpellChecker(); } else { spellAddTextObject(); spellCheckerReady(); } } void KPresenterView::clearSpellChecker() { m_initSwitchPage = -1; m_switchPage = -1; m_spell.textObject.clear(); if(m_spell.macroCmdSpellCheck) m_pKPresenterDoc->addCommand(m_spell.macroCmdSpellCheck); m_spell.macroCmdSpellCheck=0L; m_spell.bSpellSelection= false; m_spell.selectionStartPos = 0; } void KPresenterView::spellCheckerMisspelling( const QString &old, const QStringList &, unsigned int pos ) { //kdDebug(33001) << "KPresenterView::spellCheckerMisspelling old=" << old << " pos=" << pos << endl; KPTextObject * textobj = m_spell.textObject.at( m_spell.spellCurrTextObjNum ) ; Q_ASSERT( textobj ); if ( !textobj ) return; KoTextParag * p = textobj->textDocument()->firstParag(); pos += m_spell.selectionStartPos; while ( p && (int)pos >= p->length() ) { pos -= p->length(); p = p->next(); } Q_ASSERT( p ); if ( !p ) return; //kdDebug(33001) << "KPresenterView::spellCheckerMisspelling p=" << p->paragId() << " pos=" << pos << " length=" << old.length() << endl; textobj->highlightPortion( p, pos, old.length(), m_canvas, true /*repaint*/ ); } void KPresenterView::spellCheckerCorrected( const QString &old, const QString &corr, unsigned int pos ) { //kdDebug(33001) << "KWView::spellCheckerCorrected old=" << old << " corr=" << corr << " pos=" << pos << endl; KPTextObject * textobj = m_spell.textObject.at( m_spell.spellCurrTextObjNum ) ; Q_ASSERT( textobj ); if ( !textobj ) return; pos += m_spell.selectionStartPos; KoTextParag * p = textobj->textDocument()->firstParag(); while ( p && (int)pos >= p->length() ) { pos -= p->length(); p = p->next(); } Q_ASSERT( p ); if ( !p ) return; textobj->highlightPortion( p, pos, old.length(), m_canvas, true /*repaint*/ ); KoTextCursor cursor( textobj->textDocument() ); cursor.setParag( p ); cursor.setIndex( pos ); if(!m_spell.macroCmdSpellCheck) m_spell.macroCmdSpellCheck=new KMacroCommand(i18n("Correct Misspelled Word")); m_spell.macroCmdSpellCheck->addCommand(textobj->textObject()->replaceSelectionCommand( &cursor, corr, KoTextObject::HighlightSelection, QString::null )); } void KPresenterView::spellCheckerDone( const QString & ) { KPTextObject * textobj = 0L; if(m_spell.spellCurrTextObjNum!=-1 ) { textobj = m_spell.textObject.at( m_spell.spellCurrTextObjNum ) ; Q_ASSERT( textobj ); if ( textobj ) textobj->removeHighlight(); } int result; #if 0 //FIXME !!!!!!!!!!! result= m_spell.kospell->dlgResult(); //delete m_spell.kospell; //m_spell.kospell = 0; result= m_spell.kospell->dlgResult(); m_spell.kspell->cleanUp(); delete m_spell.kspell; m_spell.kspell = 0; #endif if ( result != KS_CANCEL && result != KS_STOP ) { if ( m_spell.bSpellSelection ) { KMessageBox::information(this, i18n("Spellcheck selection finished."), i18n("Spell Checking")); m_pKPresenterDoc->setReadWrite(true); #if 0 delete m_spell.kospell; m_spell.kospell = 0; #endif clearSpellChecker(); } else { #if 0 //def HAVE_LIBASPELL //FIXME !!!!!!! spellCheckerReady(); #else // Try to check another frameset startKSpell(); #endif } } else { m_pKPresenterDoc->setReadWrite(true); m_spell.textObject.clear(); m_spell.replaceAll.clear(); if(m_spell.macroCmdSpellCheck) m_pKPresenterDoc->addCommand(m_spell.macroCmdSpellCheck); m_spell.macroCmdSpellCheck=0L; } } void KPresenterView::spellCheckerFinished() { KOSpell::spellStatus status = m_spell.kospell->status(); bool kspellNoConfigured=false; #if 0 #ifdef HAVE_LIBASPELL delete m_spell.kospell; m_spell.kospell = 0; //FIXME #else delete m_spell.kspell; m_spell.kspell = 0; if (status == KSpell::Error) kspellNoConfigured=true; else if (status == KSpell::Crashed) KMessageBox::sorry(this, i18n("ISpell seems to have crashed.")); #endif #endif KPTextObject * textobj = 0L; if( m_spell.spellCurrTextObjNum!=-1 ) { textobj = m_spell.textObject.at( m_spell.spellCurrTextObjNum ) ; Q_ASSERT( textobj ); if ( textobj ) textobj->removeHighlight(); } m_spell.textObject.clear(); if(m_spell.macroCmdSpellCheck) m_pKPresenterDoc->addCommand(m_spell.macroCmdSpellCheck); m_spell.macroCmdSpellCheck=0L; m_pKPresenterDoc->setReadWrite(true); m_spell.replaceAll.clear(); KPTextView *edit=m_canvas->currentTextObjectView(); if (edit) edit->drawCursor( TRUE ); if(kspellNoConfigured) configureSpellChecker(); } void KPresenterView::configureSpellChecker() { KMessageBox::sorry(this, i18n("ISpell could not be started.\n" "Please make sure you have ISpell properly configured and in your PATH.")); KPConfig configDia( this ); configDia.openPage( KPConfig::KP_KSPELL); configDia.exec(); } void KPresenterView::showCounter( KoParagCounter &c ) { QString styleStr("counterstyle_"); styleStr += QString::number( c.style() ); //kdDebug(33001) << "KWView::showCounter styleStr=" << styleStr << endl; KToggleAction* act = static_cast( actionCollection()->action( styleStr.latin1() ) ); Q_ASSERT( act ); if ( act ) act->setChecked( true ); } void KPresenterView::formatParagraph() { showParagraphDialog(); } void KPresenterView::showParagraphDialog(int initialPage, double initialTabPos) { KPTextView *edit=m_canvas->currentTextObjectView(); if (edit) { delete m_paragDlg; m_paragDlg=0L; m_paragDlg = new KoParagDia( this, "", KoParagDia::PD_SPACING | KoParagDia::PD_ALIGN | KoParagDia::PD_BORDERS | KoParagDia::PD_NUMBERING | KoParagDia::PD_TABS, m_pKPresenterDoc->getUnit(), edit->kpTextObject()->getSize().width(),false ); m_paragDlg->setCaption( i18n( "Paragraph Settings" ) ); // Initialize the dialog from the current paragraph's settings m_paragDlg->setParagLayout( edit->cursor()->parag()->paragLayout() ); // Set initial page and initial tabpos if necessary if ( initialPage != -1 ) { m_paragDlg->setCurrentPage( initialPage ); if ( initialPage == KoParagDia::PD_TABS ) m_paragDlg->tabulatorsWidget()->setCurrentTab( initialTabPos ); } connect( m_paragDlg, SIGNAL( applyParagStyle() ), this, SLOT( slotApplyParag())); m_paragDlg->exec(); delete m_paragDlg; m_paragDlg=0L; } } void KPresenterView::slotApplyParag() { KPTextView *edit=m_canvas->currentTextObjectView(); if( !edit ) return; KMacroCommand * macroCommand = new KMacroCommand( i18n( "Paragraph Settings" ) ); KCommand *cmd=0L; bool changed=false; if(m_paragDlg->isLeftMarginChanged()) { cmd=edit->setMarginCommand( QStyleSheetItem::MarginLeft, m_paragDlg->leftIndent() ); if(cmd) { macroCommand->addCommand(cmd); changed=true; } h_ruler->setLeftIndent( KoUnit::ptToUnit( m_paragDlg->leftIndent(), m_pKPresenterDoc->getUnit() ) ); } if(m_paragDlg->isRightMarginChanged()) { cmd=edit->setMarginCommand( QStyleSheetItem::MarginRight, m_paragDlg->rightIndent() ); if(cmd) { macroCommand->addCommand(cmd); changed=true; } h_ruler->setRightIndent( KoUnit::ptToUnit( m_paragDlg->rightIndent(), m_pKPresenterDoc->getUnit() ) ); } if(m_paragDlg->isSpaceBeforeChanged()) { cmd=edit->setMarginCommand( QStyleSheetItem::MarginTop, m_paragDlg->spaceBeforeParag() ); if(cmd) { macroCommand->addCommand(cmd); changed=true; } } if(m_paragDlg->isSpaceAfterChanged()) { cmd=edit->setMarginCommand( QStyleSheetItem::MarginBottom, m_paragDlg->spaceAfterParag() ); if(cmd) { macroCommand->addCommand(cmd); changed=true; } } if(m_paragDlg->isFirstLineChanged()) { cmd=edit->setMarginCommand( QStyleSheetItem::MarginFirstLine, m_paragDlg->firstLineIndent()); if(cmd) { macroCommand->addCommand(cmd); changed=true; } h_ruler->setFirstIndent(KoUnit::ptToUnit( m_paragDlg->firstLineIndent(), m_pKPresenterDoc->getUnit() ) ); } if(m_paragDlg->isAlignChanged()) { cmd=edit->setAlignCommand( m_paragDlg->align() ); if(cmd) { macroCommand->addCommand(cmd); changed=true; } } if(m_paragDlg->isCounterChanged()) { cmd=edit->setCounterCommand( m_paragDlg->counter() ); if(cmd) { macroCommand->addCommand(cmd); changed=true; } } if(m_paragDlg->listTabulatorChanged()) { cmd=edit->setTabListCommand( m_paragDlg->tabListTabulator() ); if(cmd) { macroCommand->addCommand(cmd); changed=true; } } if(m_paragDlg->isLineSpacingChanged()) { cmd=edit->setLineSpacingCommand( m_paragDlg->lineSpacing(),m_paragDlg->lineSpacingType() ); if(cmd) { macroCommand->addCommand(cmd); changed=true; } } if(m_paragDlg->isBorderChanged()) { cmd=edit->setBordersCommand( m_paragDlg->leftBorder(), m_paragDlg->rightBorder(), m_paragDlg->topBorder(), m_paragDlg->bottomBorder() ); if(cmd) { macroCommand->addCommand(cmd); changed=true; } } if(changed) m_pKPresenterDoc->addCommand(macroCommand); else delete macroCommand; // Set "oldLayout" in KoParagDia from the current paragraph's settings // Otherwise "isBlahChanged" will return wrong things when doing A -> B -> A m_paragDlg->setParagLayout( edit->cursor()->parag()->paragLayout() ); } void KPresenterView::textDefaultFormat() { m_canvas->setTextDefaultFormat( ); } void KPresenterView::changeNbOfRecentFiles(int _nb) { if ( shell() ) // 0 when embedded into konq ! shell()->setMaxRecentItems( _nb ); } QPopupMenu * KPresenterView::popupMenu( const QString& name ) { Q_ASSERT(factory()); if ( factory() ) return ((QPopupMenu*)factory()->container( name, this )); return 0L; } void KPresenterView::addVariableActions( int type, const QStringList & texts, KActionMenu * parentMenu, const QString & menuText ) { // Single items go directly into parentMenu. // For multiple items we create a submenu. if ( texts.count() > 1 && !menuText.isEmpty() ) { KActionMenu * subMenu = new KActionMenu( menuText, actionCollection() ); parentMenu->insert( subMenu ); parentMenu = subMenu; } QStringList::ConstIterator it = texts.begin(); for ( int i = 0; it != texts.end() ; ++it, ++i ) { if ( !(*it).isEmpty() ) // in case of removed subtypes or placeholders { VariableDef v; v.type = type; v.subtype = i; KAction * act = new KAction( (*it), 0, this, SLOT( insertVariable() ), actionCollection(), "var-action" ); m_variableDefMap.insert( act, v ); parentMenu->insert( act ); } } } void KPresenterView::refreshCustomMenu() { KActionPtrList lst2 = actionCollection()->actions("custom-variable-action"); QValueList actions = lst2; QValueList::ConstIterator it2 = lst2.begin(); QValueList::ConstIterator end = lst2.end(); QMap shortCut; for (; it2 != end; ++it2 ) { if ( !(*it2)->shortcut().toString().isEmpty()) shortCut.insert((*it2)->text(), KShortcut( (*it2)->shortcut())); delete *it2; } delete actionInsertCustom; actionInsertCustom = new KActionMenu( i18n( "&Custom" ), actionCollection(), "insert_custom" ); actionInsertVariable->insert(actionInsertCustom, 0); actionInsertCustom->popupMenu()->clear(); QPtrListIterator it( m_pKPresenterDoc->getVariableCollection()->getVariables() ); KAction * act=0; QStringList lst; QString varName; int i = 0; for ( ; it.current() ; ++it ) { KoVariable *var = it.current(); if ( var->type() == VT_CUSTOM ) { varName=( (KoCustomVariable*) var )->name(); if ( !lst.contains( varName) ) { lst.append( varName ); QCString name = QString("custom-action_%1").arg(i).latin1(); if ( shortCut.contains( varName )) act = new KAction( varName, (shortCut)[varName], this, SLOT( insertCustomVariable() ), actionCollection(), name ); else act = new KAction( varName, 0, this, SLOT( insertCustomVariable() ), actionCollection(), name ); act->setGroup( "custom-variable-action" ); actionInsertCustom->insert( act ); i++; } } } bool state=!lst.isEmpty(); if(state) actionInsertCustom->popupMenu()->insertSeparator(); act = new KAction( i18n("New..."), 0, this, SLOT( insertNewCustomVariable() ), actionCollection(), QString("custom-action_%1").arg(i).latin1() ); act->setGroup( "custom-variable-action" ); actionInsertCustom->insert( act ); actionInsertCustom->popupMenu()->insertSeparator(); actionEditCustomVars->setEnabled(state); actionEditCustomVarsEdit->setEnabled( state ); actionInsertCustom->insert( actionEditCustomVarsEdit ); } void KPresenterView::insertCustomVariable() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit ) { KAction * act = (KAction *)(sender()); edit->insertCustomVariable(act->text()); } } void KPresenterView::insertNewCustomVariable() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit ) edit->insertVariable( VT_CUSTOM, 0 ); } void KPresenterView::editCustomVariable() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit ) { KoCustomVariable *var = static_cast(edit->variable()); if (var) { QString oldvalue = var->value(); KoCustomVarDialog dia( this, var ); if ( dia.exec() ) { if( var->value() != oldvalue ) { KPrChangeCustomVariableValue *cmd=new KPrChangeCustomVariableValue(i18n( "Change Custom Variable" ), m_pKPresenterDoc, oldvalue, var->value(), var ); m_pKPresenterDoc->addCommand(cmd); } m_pKPresenterDoc->recalcVariables( VT_CUSTOM ); } } } } void KPresenterView::editCustomVars() { KoCustomVariablesDia dia( this, m_pKPresenterDoc->getVariableCollection()->getVariables() ); QStringList listOldCustomValue; QPtrListIterator oldIt( m_pKPresenterDoc->getVariableCollection()->getVariables() ); for ( ; oldIt.current() ; ++oldIt ) { if(oldIt.current()->type()==VT_CUSTOM) listOldCustomValue.append(((KoCustomVariable*)oldIt.current())->value()); } if(dia.exec()) { m_pKPresenterDoc->recalcVariables( VT_CUSTOM ); QPtrListIterator it( m_pKPresenterDoc->getVariableCollection()->getVariables() ); KMacroCommand * macroCommand = 0L; int i=0; for ( ; it.current() ; ++it ) { if(it.current()->type() == VT_CUSTOM ) { if(((KoCustomVariable*)it.current())->value()!=*(listOldCustomValue.at(i))) { if(!macroCommand) macroCommand = new KMacroCommand( i18n( "Change Custom Variable" ) ); KPrChangeCustomVariableValue *cmd= new KPrChangeCustomVariableValue(i18n( "Change Custom Variable" ), m_pKPresenterDoc, *(listOldCustomValue.at(i)), ((KoCustomVariable*)it.current())->value(), ((KoCustomVariable*)it.current())); macroCommand->addCommand(cmd); } i++; } } if(macroCommand) m_pKPresenterDoc->addCommand(macroCommand); } } void KPresenterView::insertVariable() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit ) { KAction * act = (KAction *)(sender()); VariableDefMap::ConstIterator it = m_variableDefMap.find( act ); if ( it == m_variableDefMap.end() ) kdWarning(33001) << "Action not found in m_variableDefMap." << endl; else { if ( (*it).type == VT_FIELD ) edit->insertVariable( (*it).type, KoFieldVariable::fieldSubType( (*it).subtype ) ); else edit->insertVariable( (*it).type, (*it).subtype ); } } } void KPresenterView::openLink() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit ) edit->openLink(); } void KPresenterView::showRulerIndent( double _leftMargin, double _firstLine, double _rightMargin, bool rtl ) { KoRuler * hRuler = getHRuler(); if ( hRuler ) { hRuler->setFirstIndent( KoUnit::ptToUnit( _firstLine, m_pKPresenterDoc->getUnit() ) ); hRuler->setLeftIndent( KoUnit::ptToUnit( _leftMargin, m_pKPresenterDoc->getUnit() ) ); hRuler->setRightIndent( KoUnit::ptToUnit( _rightMargin, m_pKPresenterDoc->getUnit() ) ); hRuler->setDirection( rtl ); actionTextDepthMinus->setEnabled( _leftMargin>0); } } void KPresenterView::tabListChanged( const KoTabulatorList & tabList ) { if(!m_pKPresenterDoc->isReadWrite()) return; m_canvas->setTabList( tabList ); } void KPresenterView::newFirstIndent( double _firstIndent ) { m_canvas->setNewFirstIndent(_firstIndent); } void KPresenterView::newLeftIndent( double _leftIndent) { m_canvas->setNewLeftIndent(_leftIndent); } void KPresenterView::newRightIndent( double _rightIndent) { m_canvas->setNewRightIndent(_rightIndent); } void KPresenterView::slotUpdateRuler() { // Set the "frame start" in the ruler (tabs are relative to that position) bool isText=!m_canvas->applicableTextObjects().isEmpty(); if ( isText ) { KPTextObject *txtobj= m_canvas->applicableTextObjects().first(); if ( txtobj ) { QRect r= zoomHandler()->zoomRect(txtobj->getBoundingRect()); getHRuler()->setFrameStartEnd( r.left() /*+ m_canvas->diffx()*//*- pc.x()*/, r.right()/*+m_canvas->diffx()*/ /*- pc.x()*/ ); getVRuler()->setFrameStartEnd( r.top()/*+ m_canvas->diffy()*//*- pc.y()*/, r.bottom()/*+m_canvas->diffy()*//*- pc.y()*/ ); if( getHRuler()) { int flags = txtobj->isProtectContent() ? 0 : (KoRuler::F_INDENTS | KoRuler::F_TABS); if( getHRuler()->flags()!= flags ) { getHRuler()->changeFlags(flags); getHRuler()->repaint(); } } if( getVRuler()) { if( getVRuler()->flags() != 0 ) { getVRuler()->changeFlags(0); getVRuler()->repaint(); } } } } else { refreshRuler( kPresenterDoc()->showHelplines() ); updateRuler(); } } // This handles Tabulators _only_ void KPresenterView::slotHRulerDoubleClicked( double ptpos ) { showParagraphDialog( KoParagDia::PD_TABS, ptpos ); } // This handles either: // - Indents // - Page Layout // // This does _not_ handle Tabulators! void KPresenterView::slotHRulerDoubleClicked() { KoRuler *ruler = getHRuler(); if ( m_canvas && m_canvas->currentTextObjectView() && (ruler->flags() & KoRuler::F_INDENTS) && ruler->doubleClickedIndent() ) formatParagraph(); else openPageLayoutDia(); } void KPresenterView::changeCaseOfText() { QPtrList lst = m_canvas->applicableTextInterfaces(); if ( lst.isEmpty() ) return; QPtrListIterator it( lst ); KoChangeCaseDia *caseDia=new KoChangeCaseDia( this,"change case" ); if(caseDia->exec()) { KMacroCommand* macroCmd = 0L; for ( ; it.current() ; ++it ) { KCommand *cmd = it.current()->setChangeCaseOfTextCommand(caseDia->getTypeOfCase()); if (cmd) { if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Change Case of Text") ); macroCmd->addCommand(cmd); } } if( macroCmd ) m_pKPresenterDoc->addCommand(macroCmd); } delete caseDia; } void KPresenterView::editFind() { if (!m_searchEntry) m_searchEntry = new KoSearchContext(); KPTextView * edit = m_canvas->currentTextObjectView(); bool hasSelection = edit && (edit->kpTextObject())->textObject()->hasSelection(); bool hasCursor = edit != 0; KoSearchDia dialog( m_canvas, "find", m_searchEntry, hasSelection, hasCursor ); /// KoFindReplace needs a QValueList... QValueList list; QPtrList list2 = m_pKPresenterDoc->allTextObjects(); QPtrListIterator it( list2 ); for ( ; it.current() ; ++it ) list.append(it.current()); if( list.isEmpty() ) return; if ( dialog.exec() == QDialog::Accepted ) { delete m_findReplace; m_findReplace = new KPrFindReplace( this, m_canvas, &dialog, list, edit ); editFindNext(); } } void KPresenterView::editReplace() { if (!m_searchEntry) m_searchEntry = new KoSearchContext(); if (!m_replaceEntry) m_replaceEntry = new KoSearchContext(); KPTextView * edit = m_canvas->currentTextObjectView(); bool hasSelection = edit && (edit->kpTextObject())->textObject()->hasSelection(); bool hasCursor = edit != 0; KoReplaceDia dialog( m_canvas, "replace", m_searchEntry, m_replaceEntry, hasSelection, hasCursor ); /// KoFindReplace needs a QValueList... QValueList list; QPtrList list2 = m_pKPresenterDoc->allTextObjects(); QPtrListIterator it( list2 ); for ( ; it.current() ; ++it ) list.append(it.current()); if( list.isEmpty() ) return; if ( dialog.exec() == QDialog::Accepted ) { delete m_findReplace; m_findReplace = new KPrFindReplace( this, m_canvas, &dialog, list, edit ); editFindNext(); } } void KPresenterView::editFindPrevious() { if ( !m_findReplace ) // shouldn't be called before find or replace is activated { editFind(); return; } (void) m_findReplace->findPrevious(); } void KPresenterView::editFindNext() { if ( !m_findReplace ) // shouldn't be called before find or replace is activated { editFind(); return; } (void) m_findReplace->findNext(); } void KPresenterView::refreshAllVariable() { m_pKPresenterDoc->recalcVariables( VT_ALL ); } void KPresenterView::changeZoomMenu( int zoom ) { QStringList lst; lst << i18n( "Width" ); lst << i18n( "Whole Slide" ); if(zoom>0) { QValueList list; bool ok; const QStringList itemsList ( actionViewZoom->items() ); QRegExp regexp("(\\d+)"); // "Captured" non-empty sequence of digits for (QStringList::ConstIterator it = itemsList.begin() ; it != itemsList.end() ; ++it) { regexp.search(*it); const int val=regexp.cap(1).toInt(&ok); //zoom : limit inferior=10 if(ok && val>9 && list.contains(val)==0) list.append( val ); } //necessary at the beginning when we read config //this value is not in combo list if(list.contains(zoom)==0) list.append( zoom ); qHeapSort( list ); for (QValueList::Iterator it = list.begin() ; it != list.end() ; ++it) lst.append( i18n("%1%").arg(*it) ); } else { lst << i18n("%1%").arg("33"); lst << i18n("%1%").arg("50"); lst << i18n("%1%").arg("75"); lst << i18n("%1%").arg("100"); lst << i18n("%1%").arg("125"); lst << i18n("%1%").arg("150"); lst << i18n("%1%").arg("200"); lst << i18n("%1%").arg("250"); lst << i18n("%1%").arg("350"); lst << i18n("%1%").arg("400"); lst << i18n("%1%").arg("450"); lst << i18n("%1%").arg("500"); } actionViewZoom->setItems( lst ); } void KPresenterView::showZoom( int zoom ) { QStringList list = actionViewZoom->items(); QString zoomStr( i18n("%1%").arg( zoom ) ); int pos = list.findIndex(zoomStr); if( pos == -1) { changeZoomMenu( zoom ); list = actionViewZoom->items(); } actionViewZoom->setCurrentItem( list.findIndex(zoomStr) ); } void KPresenterView::viewZoom( const QString &s ) { bool ok=false; int zoom = 0; if ( s == i18n("Width") ) { zoom = qRound( static_cast(m_canvas->visibleRect().width() * 100 ) / (zoomHandler()->resolutionX() * m_pKPresenterDoc->pageLayout().ptWidth ) ); ok = true; } else if ( s == i18n("Whole Slide") ) { zoom = getZoomEntirePage(); ok = true; } else { QRegExp regexp("(\\d+)"); // "Captured" non-empty sequence of digits regexp.search(s); zoom=regexp.cap(1).toInt(&ok); } if( !ok || zoom<10 ) //zoom should be valid and >10 zoom = zoomHandler()->zoom(); zoom = QMIN( zoom, 4000); //refresh menu changeZoomMenu( zoom ); //refresh menu item showZoom(zoom); //apply zoom if zoom!=m_doc->zoom() if( zoom != zoomHandler()->zoom() ) { setZoom( zoom, true ); KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit ) edit->ensureCursorVisible(); } m_canvas->setFocus(); m_canvas->repaint(); } void KPresenterView::setZoomRect( const QRect & rect, bool drawRubber ) { int zoom = 100; if( drawRubber ) { double height = zoomHandler()->resolutionY() * zoomHandler()->unzoomItY( rect.height() ); double width = zoomHandler()->resolutionX() * zoomHandler()->unzoomItY( rect.width() ); zoom = QMIN( qRound( static_cast(m_canvas->visibleRect().height() * 100 ) / height ), qRound( static_cast(m_canvas->visibleRect().width() * 100 ) / width ) ); //zoom before scroll canvas. KoPoint save( zoomHandler()->unzoomPoint(rect.topLeft()) ); viewZoom( QString::number(zoom ) ); m_canvas->scrollTopLeftPoint( zoomHandler()->zoomPoint( save ) ); } else { //just click => increase zoom from 25% zoom = zoomHandler()->zoom() + (int)(zoomHandler()->zoom()*0.25); viewZoom( QString::number(zoom ) ); } } void KPresenterView::setZoom( int zoom, bool updateViews ) { zoomHandler()->setZoomAndResolution( zoom, QPaintDevice::x11AppDpiX(), QPaintDevice::x11AppDpiY()); m_pKPresenterDoc->newZoomAndResolution(updateViews,false); m_pKPresenterDoc->updateZoomRuler(); // Also set the zoom in KoView (for embedded views) //kdDebug(33001) << "KWView::showZoom setting koview zoom to " << m_doc->zoomedResolutionY() << endl; KoView::setZoom( zoomHandler()->zoomedResolutionY() /* KoView only supports one zoom */ ); setRanges(); } void KPresenterView::slotUpdateScrollBarRanges() { setRanges(); } KoZoomHandler *KPresenterView::zoomHandler() const { return m_pKPresenterDoc->zoomHandler(); } void KPresenterView::slotViewFormattingChars() { m_pKPresenterDoc->setViewFormattingChars(actionViewFormattingChars->isChecked()); m_pKPresenterDoc->layout(); // Due to the different formatting when this option is activated m_pKPresenterDoc->repaint(false); } int KPresenterView::getPresentationDuration() const { return m_presentationDuration.elapsed(); } void KPresenterView::setPresentationDuration( int _pgNum ) { if ( kPresenterDoc()->presentationDuration() ) { // kdDebug(33001) << "KPresenterView::setPresentationDuration( " << _pgNum << " )" << endl; *m_presentationDurationList.at( _pgNum ) += getPresentationDuration(); restartPresentationDuration(); } } void KPresenterView::restartPresentationDuration() { m_presentationDuration.restart(); } void KPresenterView::openThePresentationDurationDialog() { int totalTime = 0; QStringList presentationDurationStringList; for ( QValueList::Iterator it = m_presentationDurationList.begin(); it != m_presentationDurationList.end(); ++it ) { int _time = *it; QString presentationDurationString = presentationDurationDataFormatChange( _time ); presentationDurationStringList.append( presentationDurationString ); totalTime += _time; } QString presentationTotalDurationString = presentationDurationDataFormatChange( totalTime ); delete presDurationDia; presDurationDia = 0; presDurationDia = new KPPresDurationDia( this, "presDurationDia", kPresenterDoc(), presentationDurationStringList, presentationTotalDurationString ); presDurationDia->setCaption( i18n( "Presentation Duration" ) ); QObject::connect( presDurationDia, SIGNAL( presDurationDiaClosed() ), this, SLOT( pddClosed() ) ); presDurationDia->exec(); delete presDurationDia; presDurationDia = 0; } void KPresenterView::pddClosed() { presDurationDia = 0; } // change from milliseconds to hh:mm:ss QString KPresenterView::presentationDurationDataFormatChange( int _time ) { QTime time( 0, 0, 0 ); return KGlobal::locale()->formatTime( time.addMSecs( _time ), true ); } KPrPage * KPresenterView::stickyPage() const { return m_pKPresenterDoc->stickyPage(); } void KPresenterView::viewFooter() { bool state=actionViewFooter->isChecked(); m_pKPresenterDoc->setFooter( state ); KPrHideShowHeaderFooter * cmd =new KPrHideShowHeaderFooter( state ? i18n("Show Header") : i18n("Hide Header"), m_pKPresenterDoc, state, m_pKPresenterDoc->footer()); m_pKPresenterDoc->addCommand(cmd); int pos=m_pKPresenterDoc->pageList().findRef(m_pKPresenterDoc->stickyPage()); m_pKPresenterDoc->updateSideBarItem(pos, true/*sticky page*/ ); } void KPresenterView::viewHeader() { bool state=actionViewHeader->isChecked(); m_pKPresenterDoc->setHeader( state); KPrHideShowHeaderFooter * cmd =new KPrHideShowHeaderFooter( state ? i18n("Show Footer") : i18n("Hide Footer"), m_pKPresenterDoc, state, m_pKPresenterDoc->header()); m_pKPresenterDoc->addCommand(cmd); int pos=m_pKPresenterDoc->pageList().findRef(m_pKPresenterDoc->stickyPage()); m_pKPresenterDoc->updateSideBarItem(pos, true/*sticky page*/ ); } void KPresenterView::showStyle( const QString & styleName ) { QPtrListIterator styleIt( m_pKPresenterDoc->styleCollection()->styleList() ); for ( int pos = 0 ; styleIt.current(); ++styleIt, ++pos ) { if ( styleIt.current()->name() == styleName ) { actionFormatStyle->setCurrentItem( pos ); return; } } } void KPresenterView::updateStyleList() { QString currentStyle = actionFormatStyle->currentText(); // Generate list of styles QStringList lst; QPtrListIterator styleIt( m_pKPresenterDoc->styleCollection()->styleList() ); int pos = -1; for ( int i = 0; styleIt.current(); ++styleIt, ++i ) { QString name = styleIt.current()->translatedName(); lst << name; if ( pos == -1 && name == currentStyle ) pos = i; } // Fill the combo - using a KSelectAction actionFormatStyle->setItems( lst ); if ( pos > -1 ) actionFormatStyle->setCurrentItem( pos ); // Fill the menu - using a KActionMenu, so that it's possible to bind keys // to individual actions QStringList lstWithAccels; // Generate unique accelerators for the menu items KAccelGen::generate( lst, lstWithAccels ); QMap shortCut; KActionPtrList lst2 = actionCollection()->actions("styleList"); QValueList actions = lst2; QValueList::ConstIterator it = lst2.begin(); QValueList::ConstIterator end = lst2.end(); for (; it != end; ++it ) { if ( !(*it)->shortcut().toString().isEmpty()) { KoStyle* tmp = m_pKPresenterDoc->styleCollection()->findStyleShortCut( (*it)->name() ); if ( tmp ) shortCut.insert( tmp->shortCutName(), KShortcut( (*it)->shortcut())); } actionFormatStyleMenu->remove( *it ); delete *it; } uint i = 0; for ( QStringList::Iterator it = lstWithAccels.begin(); it != lstWithAccels.end(); ++it, ++i ) { KToggleAction* act = 0L; KoStyle *tmp = m_pKPresenterDoc->styleCollection()->findStyle( lst[ i]); if ( tmp ) { QCString name = tmp->shortCutName().latin1(); if ( shortCut.contains(name)) { act = new KToggleAction( (*it), (shortCut)[name], this, SLOT( slotStyleSelected() ), actionCollection(), name ); } else act = new KToggleAction( (*it), 0, this, SLOT( slotStyleSelected() ), actionCollection(),name ); act->setGroup( "styleList" ); act->setExclusiveGroup( "styleListAction" ); actionFormatStyleMenu->insert( act ); } } bool isText=!m_canvas->applicableTextInterfaces().isEmpty(); actionFormatStyleMenu->setEnabled( isText ); actionFormatStyle->setEnabled(isText); } void KPresenterView::extraStylist() { KPTextView *edit=m_canvas->currentTextObjectView(); QString activeStyleName = QString::null; if ( edit ) { edit->hideCursor(); if (edit->cursor() && edit->cursor()->parag() && edit->cursor()->parag()->style()) activeStyleName = edit->cursor()->parag()->style()->translatedName(); } KPrStyleManager * styleManager = new KPrStyleManager( this, m_pKPresenterDoc->getUnit(), m_pKPresenterDoc, m_pKPresenterDoc->styleCollection()->styleList(), activeStyleName); styleManager->exec(); delete styleManager; if ( edit ) edit->showCursor(); } // Called when selecting a style in the Format / Style menu void KPresenterView::slotStyleSelected() { QString actionName = QString::fromLatin1(sender()->name()); if ( actionName.startsWith( "shortcut_style_" ) )//see lib/kotext/kostyle.cc { kdDebug(33001) << "KPresenterView::slotStyleSelected " << actionName << endl; textStyleSelected( m_pKPresenterDoc->styleCollection()->findStyleShortCut( actionName) ); } } void KPresenterView::textStyleSelected( int index ) { textStyleSelected( m_pKPresenterDoc->styleCollection()->styleAt( index ) ); } void KPresenterView::textStyleSelected( KoStyle *_sty ) { if ( !_sty ) return; KPTextView *edit=m_canvas->currentTextObjectView(); if(edit) { edit->applyStyle( _sty ); m_canvas->setFocus(); } else { QPtrList selectedFrames = m_canvas->selectedTextObjs(); if (selectedFrames.count() <= 0) return; // nope, no frames are selected. // yes, indeed frames are selected. QPtrListIterator it( selectedFrames ); KMacroCommand *globalCmd = 0L; for ( ; it.current() ; ++it ) { KoTextObject *textObject = it.current()->textObject(); textObject->textDocument()->selectAll( KoTextDocument::Temp ); KCommand *cmd = textObject->applyStyleCommand( 0L, _sty, KoTextDocument::Temp, KoParagLayout::All, KoTextFormat::Format, true, true ); textObject->textDocument()->removeSelection( KoTextDocument::Temp ); if (cmd) { if ( !globalCmd) globalCmd = new KMacroCommand( selectedFrames.count() == 1 ? i18n("Apply Style to Frame") : i18n("Apply Style to Frames")); globalCmd->addCommand( cmd ); } } if ( globalCmd ) m_pKPresenterDoc->addCommand( globalCmd ); } } void KPresenterView::slotAllowAutoFormat() { bool state = actionAllowAutoFormat->isChecked(); m_pKPresenterDoc->setAllowAutoFormat( state ); } void KPresenterView::slotCompletion() { KPTextView *edit=m_canvas->currentTextObjectView(); if(edit) edit->completion(); } void KPresenterView::insertComment() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( !edit ) return; QString authorName; KoDocumentInfo * info = m_pKPresenterDoc->documentInfo(); KoDocumentInfoAuthor * authorPage = static_cast(info->page( "author" )); if ( !authorPage ) kdWarning() << "Author information not found in documentInfo !" << endl; else authorName = authorPage->fullName(); KoCommentDia *commentDia = new KoCommentDia( this, QString::null,authorName ); if( commentDia->exec() ) edit->insertComment(commentDia->commentText()); delete commentDia; } void KPresenterView::editComment() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit ) { KoVariable * tmpVar=edit->variable(); KoNoteVariable * var = dynamic_cast(tmpVar); if(var) { QString authorName; KoDocumentInfo * info = m_pKPresenterDoc->documentInfo(); KoDocumentInfoAuthor * authorPage = static_cast(info->page( "author" )); if ( !authorPage ) kdWarning() << "Author information not found in documentInfo !" << endl; else authorName = authorPage->fullName(); KoCommentDia *commentDia = new KoCommentDia( this, var->note(), authorName); if( commentDia->exec() ) var->setNote( commentDia->commentText()); delete commentDia; } } } void KPresenterView::viewHelpLines() { bool state=actionViewShowHelpLine->isChecked(); m_pKPresenterDoc->setShowHelplines( state ); m_pKPresenterDoc->updateHelpLineButton(); deSelectAllObjects(); refreshRuler( state ); m_pKPresenterDoc->repaint(false); } void KPresenterView::viewGrid() { m_pKPresenterDoc->setShowGrid( actionViewShowGrid->isChecked() ); m_pKPresenterDoc->setModified( true ); m_pKPresenterDoc->updateGridButton(); m_pKPresenterDoc->repaint(false); } void KPresenterView::viewGridToFront() { m_pKPresenterDoc->setGridToFront( actionViewGridToFront->isChecked() ); m_pKPresenterDoc->setModified( true ); m_pKPresenterDoc->updateGridButton(); m_pKPresenterDoc->repaint(false); } void KPresenterView::viewHelpLineToFront() { m_pKPresenterDoc->setHelpLineToFront( actionViewHelpLineToFront->isChecked() ); m_pKPresenterDoc->setModified( true ); m_pKPresenterDoc->updateHelpLineButton(); m_pKPresenterDoc->repaint(false); } void KPresenterView::drawTmpHelpLine( const QPoint & pos, bool _horizontal) { QPoint newPos( pos.x() -16 , pos.y()-16); m_canvas->tmpDrawMoveHelpLine( newPos, _horizontal ); } void KPresenterView::addHelpline(const QPoint & pos, bool _horizontal) { if ( _horizontal && (pos.y()+m_canvas->diffy()-16) > 0 ) m_pKPresenterDoc->addHorizHelpline( zoomHandler()->unzoomItY(pos.y()+m_canvas->diffy()-16)); else if ( !_horizontal && (pos.x()+m_canvas->diffx()-16) > 0 ) m_pKPresenterDoc->addVertHelpline( zoomHandler()->unzoomItX(pos.x()+m_canvas->diffx()-16)); m_canvas->setTmpHelpLinePosX( -1.0 ); m_canvas->setTmpHelpLinePosY( -1.0 ); m_pKPresenterDoc->repaint(false); } void KPresenterView::updateHelpLineButton() { bool state = m_pKPresenterDoc->showHelplines(); actionViewShowHelpLine->setChecked( state ); actionViewHelpLineToFront->setChecked( m_pKPresenterDoc->helpLineToFront() ); refreshRuler( state ); } void KPresenterView::updateGridButton() { actionViewShowGrid->setChecked( m_pKPresenterDoc->showGrid() ); actionViewGridToFront->setChecked ( m_pKPresenterDoc->gridToFront() ); actionViewSnapToGrid->setChecked ( m_pKPresenterDoc->snapToGrid() ); } void KPresenterView::refreshRuler( bool state ) { if( getHRuler() ) { if ( !m_pKPresenterDoc->isReadWrite()) { getHRuler()->changeFlags(KoRuler::F_NORESIZE); getHRuler()->repaint(); } else { if( state ) { if( getHRuler()->flags() != KoRuler::F_HELPLINES ) { getHRuler()->changeFlags(KoRuler::F_HELPLINES); getHRuler()->repaint(); } } else { if( getHRuler()->flags() != 0 ) { getHRuler()->changeFlags( 0 ); getHRuler()->repaint(); } } } } if( getVRuler()) { if ( !m_pKPresenterDoc->isReadWrite()) { getVRuler()->changeFlags(KoRuler::F_NORESIZE); getVRuler()->repaint(); } else { if( state ) { if( getVRuler()->flags() != KoRuler::F_HELPLINES ) { getVRuler()->changeFlags(KoRuler::F_HELPLINES); getVRuler()->repaint(); } } else { if( getVRuler()->flags()!= 0) { getVRuler()->changeFlags(0); getVRuler()->repaint(); } } } } } void KPresenterView::removeHelpLine() { m_canvas->removeHelpLine(); } void KPresenterView::changeHelpLinePosition() { double pos = 0.0; double limitTop = 0.0; double limitBottom = 0.0; KoRect r=m_canvas->activePage()->getPageRect(); if ( m_canvas->tmpHorizHelpLine() != -1) { pos = m_pKPresenterDoc->horizHelplines()[m_canvas->tmpHorizHelpLine()]; limitTop = r.top(); limitBottom = r.bottom(); } else if ( m_canvas->tmpVertHelpLine() != -1) { pos = m_pKPresenterDoc->vertHelplines()[m_canvas->tmpVertHelpLine()]; limitTop = r.left(); limitBottom = r.right(); } KPrMoveHelpLineDia *dlg= new KPrMoveHelpLineDia(this, pos, limitTop , limitBottom, m_pKPresenterDoc); if ( dlg->exec()) { if ( dlg->removeLine()) m_canvas->removeHelpLine(); else m_canvas->changeHelpLinePosition( dlg->newPosition() ); } delete dlg; } void KPresenterView::openPopupMenuHelpLine( const QPoint & _point ) { if(!koDocument()->isReadWrite() || !factory() || !m_pKPresenterDoc->showHelplines()) return; static_cast(factory()->container("helpline_popup",this))->popup(_point); } void KPresenterView::addHelpLine() { KoRect r=m_canvas->activePage()->getPageRect(); KPrInsertHelpLineDia *dlg= new KPrInsertHelpLineDia(this, r, m_pKPresenterDoc); if ( dlg->exec()) { double pos = dlg->newPosition(); if ( dlg->addHorizontalHelpLine() ) m_pKPresenterDoc->addHorizHelpline( pos ); else m_pKPresenterDoc->addVertHelpline( pos ); } delete dlg; m_pKPresenterDoc->setModified( true ); m_pKPresenterDoc->repaint( false ); } void KPresenterView::removeComment() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit ) edit->removeComment(); } void KPresenterView::configureCompletion() { m_pKPresenterDoc->getAutoFormat()->readConfig(); KoCompletionDia dia( this, 0, m_pKPresenterDoc->getAutoFormat() ); dia.exec(); } void KPresenterView::removeHelpPoint() { m_canvas->removeHelpPoint(); } void KPresenterView::changeHelpPointPosition() { KoRect r=m_canvas->activePage()->getPageRect(); KoPoint pos = m_pKPresenterDoc->helpPoints()[m_canvas->tmpHelpPoint()]; KPrInsertHelpPointDia *dlg= new KPrInsertHelpPointDia(this, r, m_pKPresenterDoc, pos.x(),pos.y() ); if ( dlg->exec()) { if( dlg->removePoint() ) m_canvas->removeHelpPoint(); else m_canvas->changeHelpPointPosition( dlg->newPosition() ); } delete dlg; } void KPresenterView::openPopupMenuHelpPoint( const QPoint & _point ) { if(!koDocument()->isReadWrite() || !factory()|| !m_pKPresenterDoc->showHelplines()) return; static_cast(factory()->container("helppoint_popup",this))->popup(_point); } void KPresenterView::addHelpPoint() { KoRect r=m_canvas->activePage()->getPageRect(); KPrInsertHelpPointDia *dlg= new KPrInsertHelpPointDia(this, r, m_pKPresenterDoc); if ( dlg->exec()) { KoPoint pos = dlg->newPosition(); m_pKPresenterDoc->addHelpPoint( pos ); } delete dlg; m_pKPresenterDoc->setModified( true ); m_pKPresenterDoc->repaint( false ); } void KPresenterView::openPopupMenuZoom( const QPoint & _point ) { if(!koDocument()->isReadWrite() || !factory()) return; actionZoomSelectedObject->setEnabled( m_canvas->isOneObjectSelected()); int nbObj=(m_pKPresenterDoc->stickyPage()->objectList().count()-2)+m_canvas->activePage()->objectList().count(); actionZoomAllObject->setEnabled( nbObj > 0); static_cast(factory()->container("zoom_popup",this))->popup(_point); } void KPresenterView::zoomMinus() { //unzoom from 25% int zoom = zoomHandler()->zoom() - (int)(zoomHandler()->zoom()*0.25); viewZoom( QString::number(zoom ) ); m_canvas->setToolEditMode( TEM_MOUSE ); } void KPresenterView::zoomPageWidth() { int zoom = qRound( static_cast(m_canvas->visibleRect().width() * 100 ) / (zoomHandler()->resolutionX() * m_pKPresenterDoc->pageLayout().ptWidth ) ); viewZoom( QString::number(zoom ) ); m_canvas->setToolEditMode( TEM_MOUSE ); } void KPresenterView::zoomEntirePage() { viewZoom( QString::number(getZoomEntirePage() ) ); m_canvas->setToolEditMode( TEM_MOUSE ); } void KPresenterView::zoomPlus() { setZoomRect( QRect(0,0,0,0),false); m_canvas->setToolEditMode( TEM_MOUSE ); } int KPresenterView::getZoomEntirePage() const { double height = zoomHandler()->resolutionY() * m_pKPresenterDoc->pageLayout().ptHeight; double width = zoomHandler()->resolutionX() * m_pKPresenterDoc->pageLayout().ptWidth; int zoom = QMIN( qRound( static_cast(m_canvas->visibleRect().height() * 100 ) / height ), qRound( static_cast(m_canvas->visibleRect().width() * 100 ) / width ) ); return zoom; } void KPresenterView::zoomSelectedObject() { if( m_canvas->isOneObjectSelected()) { KoRect rect=m_canvas->objectSelectedBoundingRect(); double height = zoomHandler()->resolutionY() * rect.height(); double width = zoomHandler()->resolutionX() * rect.width(); int zoom = QMIN( qRound( static_cast(m_canvas->visibleRect().height() * 100 ) / height ), qRound( static_cast(m_canvas->visibleRect().width() * 100 ) / width ) ); viewZoom( QString::number(zoom ) ); m_canvas->setToolEditMode( TEM_MOUSE ); m_canvas->scrollTopLeftPoint( zoomHandler()->zoomPoint( rect.topLeft()) ); } } void KPresenterView::zoomPageHeight() { int zoom = qRound( static_cast(m_canvas->visibleRect().height() * 100 ) / (zoomHandler()->resolutionX() * m_pKPresenterDoc->pageLayout().ptHeight ) ); viewZoom( QString::number(zoom ) ); m_canvas->setToolEditMode( TEM_MOUSE ); } void KPresenterView::zoomAllObject() { KoRect rect=m_canvas->zoomAllObject(); double height = zoomHandler()->resolutionY() * rect.height(); double width = zoomHandler()->resolutionX() * rect.width(); int zoom = QMIN( qRound( static_cast(m_canvas->visibleRect().height() * 100 ) / height ), qRound( static_cast(m_canvas->visibleRect().width() * 100 ) / width ) ); viewZoom( QString::number(zoom ) ); m_canvas->setToolEditMode( TEM_MOUSE ); m_canvas->scrollTopLeftPoint( zoomHandler()->zoomPoint( rect.topLeft()) ); } void KPresenterView::flipHorizontal() { m_canvas->flipObject( true ); } void KPresenterView::flipVertical() { m_canvas->flipObject( false ); } void KPresenterView::slotObjectEditChanged() { bool state=m_canvas->isOneObjectSelected(); bool rw = koDocument()->isReadWrite(); bool isText=!m_canvas->applicableTextInterfaces().isEmpty(); actionTextFont->setEnabled(isText); actionTextFontSize->setEnabled(isText); actionTextFontFamily->setEnabled(isText); actionTextColor->setEnabled(isText); actionTextAlignLeft->setEnabled(isText); actionTextAlignCenter->setEnabled(isText); actionTextAlignRight->setEnabled(isText); actionTextAlignBlock->setEnabled(isText); actionFormatBullet->setEnabled(rw && isText ); actionFormatNumber->setEnabled(rw && isText ); actionTextDepthPlus->setEnabled(isText); actionFormatDefault->setEnabled(isText); actionTextDepthMinus->setEnabled(isText); actionTextExtentCont2Height->setEnabled(isText); actionTextExtendObj2Cont->setEnabled(isText); actionTextBold->setEnabled(isText); actionTextItalic->setEnabled(isText); actionTextUnderline->setEnabled(isText); actionFormatStrikeOut->setEnabled(isText); actionFormatSuper->setEnabled(isText); actionFormatSub->setEnabled(isText); actionIncreaseFontSize->setEnabled(isText); actionDecreaseFontSize->setEnabled(isText); if ( isText ) { KoTextFormat format =*(m_canvas->applicableTextInterfaces().first()->currentFormat()); showFormat( format ); const KoParagLayout * paragLayout=m_canvas->applicableTextInterfaces().first()->currentParagLayoutFormat(); KoParagCounter counter; if(paragLayout->counter) counter = *(paragLayout->counter); int align = paragLayout->alignment; if ( align == Qt::AlignAuto ) align = Qt::AlignLeft; // ## seems hard to detect RTL here alignChanged( align ); } KPTextView *edit=m_canvas->currentTextObjectView(); bool val=(edit!=0) && isText && !edit->kpTextObject()->isProtectContent(); actionInsertSpecialChar->setEnabled(val); actionInsertComment->setEnabled( val ); actionInsertLink->setEnabled(val); actionFormatParag->setEnabled(val); actionInsertVariable->setEnabled(val); actionTextInsertPageNum->setEnabled(val); if ( edit ) actionBrushColor->setEnabled(val); bool hasSelection = false ; if(edit) { double leftMargin =edit->currentParagLayout().margins[QStyleSheetItem::MarginLeft]; actionTextDepthMinus->setEnabled(val && leftMargin>0); hasSelection = edit->textObject()->hasSelection(); actionEditCut->setEnabled(hasSelection); } actionCreateStyleFromSelection->setEnabled(edit!=0); actionChangeCase->setEnabled( (val && rw && hasSelection ) || (rw && !edit && isText) ); if(!edit) { actionEditCopy->setEnabled(state); bool headerfooterselected = false; if(m_canvas->numberOfObjectSelected()==1) { KPObject *obj=m_canvas->getSelectedObj(); //disable this action when we select a header/footer if(obj==m_pKPresenterDoc->header() || obj==m_pKPresenterDoc->footer()) headerfooterselected=true; else headerfooterselected=false; } actionEditCut->setEnabled(state&&!headerfooterselected); } actionFormatStyleMenu->setEnabled( isText ); actionFormatStyle->setEnabled(isText); state=m_canvas->oneObjectTextExist(); actionEditFind->setEnabled(state); actionEditFindNext->setEnabled( state ); actionEditFindPrevious->setEnabled( state ); actionEditReplace->setEnabled(state); slotUpdateRuler(); } void KPresenterView::duplicateObj() { if (m_canvas->currentTextObjectView() && !m_canvas->isOneObjectSelected() ) return; KPrDuplicatObjDia *dlg= new KPrDuplicatObjDia(this, m_pKPresenterDoc); if ( dlg->exec() ) { int nbCopy= dlg->nbCopy(); double angle = dlg->angle(); double increaseX = dlg->increaseX(); double increaseY = dlg->increaseY(); double moveX = dlg->moveX(); double moveY = dlg->moveY(); m_canvas->copyObjs(); m_canvas->setToolEditMode( TEM_MOUSE ); deSelectAllObjects(); QMimeSource *data = QApplication::clipboard()->data(); QCString clip_str = KoStoreDrag::mimeType("application/x-kpresenter"); if ( data->provides( clip_str ) ) { m_canvas->activePage()->pasteObjs( data->encodedData(clip_str), nbCopy, angle, increaseX,increaseY, moveX, moveY ); m_canvas->setMouseSelectedObject(true); emit objectSelectedChanged(); } } delete dlg; } void KPresenterView::extraArrangePopup() { m_canvas->setToolEditMode( TEM_MOUSE ); QPoint pnt( QCursor::pos() ); m_arrangeObjectsPopup->popup( pnt ); } void KPresenterView::extraSendBackward() { m_canvas->setToolEditMode( TEM_MOUSE ); m_canvas->activePage()->lowerObjs( false ); } void KPresenterView::extraBringForward() { m_canvas->setToolEditMode( TEM_MOUSE ); m_canvas->activePage()->raiseObjs( false ); } void KPresenterView::applyAutoFormat() { m_pKPresenterDoc->getAutoFormat()->readConfig(); KMacroCommand *macro = 0L; m_switchPage=m_pKPresenterDoc->pageList().findRef(m_canvas->activePage()); m_initSwitchPage=m_switchPage; QPtrList list=m_canvas->activePage()->allTextObjects(); QPtrList list2=stickyPage()->allTextObjects(); QPtrListIterator it( list2 ); for ( ; it.current() ; ++it ) list.append(it.current()); KCommand * cmd2 = applyAutoFormatToCurrentPage( list ); if ( cmd2 ) { if ( !macro ) macro = new KMacroCommand( i18n("Apply Autoformat")); macro->addCommand( cmd2 ); } while(switchInOtherPage(i18n( "Do you want to apply autoformat in new slide?")) ) { KCommand * cmd = applyAutoFormatToCurrentPage(m_canvas->activePage()->allTextObjects()); if ( cmd ) { if ( !macro ) macro = new KMacroCommand( i18n("Apply Autoformat")); macro->addCommand( cmd ); } } if ( macro ) m_pKPresenterDoc->addCommand(macro); m_switchPage=-1; m_initSwitchPage=-1; } bool KPresenterView::switchInOtherPage( const QString & text ) { //there is not other page if(m_pKPresenterDoc->pageList().count()==1) return false; m_switchPage++; if( m_switchPage>=(int)m_pKPresenterDoc->pageList().count()) m_switchPage=0; if( m_switchPage==m_initSwitchPage) return false; if ( KMessageBox::questionYesNo( this, text) != KMessageBox::Yes ) return false; skipToPage(m_switchPage); return true; } KCommand * KPresenterView::applyAutoFormatToCurrentPage( const QPtrList & lst) { KMacroCommand *macro = 0L; QPtrList list(lst); QPtrListIterator fit(list); for ( ; fit.current() ; ++fit ) { KCommand *cmd = m_pKPresenterDoc->getAutoFormat()->applyAutoFormat( fit.current() ); if ( cmd ) { if ( !macro ) macro = new KMacroCommand( i18n("Apply Autoformat")); macro->addCommand( cmd ); } } return macro; } void KPresenterView::createStyleFromSelection() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit ) { QStringList list; QPtrListIterator styleIt( m_pKPresenterDoc->styleCollection()->styleList() ); for ( ; styleIt.current(); ++styleIt ) list.append( styleIt.current()->name() ); KoCreateStyleDia *dia = new KoCreateStyleDia( QStringList(), this, 0 ); if ( dia->exec() ) { QString name = dia->nameOfNewStyle(); if ( list.contains( name ) ) // update existing style { // TODO confirmation message box KoStyle* style = m_pKPresenterDoc->styleCollection()->findStyle( name ); Q_ASSERT( style ); if ( style ) edit->updateStyleFromSelection( style ); } else // create new style { KoStyle *style = edit->createStyleFromSelection( name ); m_pKPresenterDoc->styleCollection()->addStyleTemplate( style ); m_pKPresenterDoc->updateAllStyleLists(); } showStyle( name ); } delete dia; } } void KPresenterView::closeObject() { m_canvas->closeObject(true); } void KPresenterView::viewSnapToGrid() { m_pKPresenterDoc->setSnapToGrid( actionViewSnapToGrid->isChecked() ); m_pKPresenterDoc->setModified( true ); m_pKPresenterDoc->updateGridButton(); } void KPresenterView::alignVerticalTop() { if ( actionAlignVerticalTop->isChecked() ) m_canvas->alignVertical(KP_TOP ); else actionAlignVerticalTop->setChecked(true); } void KPresenterView::alignVerticalBottom() { if ( actionAlignVerticalBottom->isChecked() ) m_canvas->alignVertical(KP_BOTTOM ); else actionAlignVerticalBottom->setChecked(true); } void KPresenterView::alignVerticalCenter() { if ( actionAlignVerticalCenter->isChecked() ) m_canvas->alignVertical(KP_CENTER ); else actionAlignVerticalCenter->setChecked(true); } void KPresenterView::changeVerticalAlignmentStatus(VerticalAlignmentType _type ) { switch( _type ) { case KP_CENTER: actionAlignVerticalCenter->setChecked( true ); break; case KP_TOP: actionAlignVerticalTop->setChecked( true ); break; case KP_BOTTOM: actionAlignVerticalBottom->setChecked( true ); break; } } void KPresenterView::autoSpellCheck() { m_pKPresenterDoc->changeBgSpellCheckingState( actionAllowBgSpellCheck->isChecked() ); } void KPresenterView::insertFile( ) { KFileDialog fd( QString::null, QString::null, 0, 0, TRUE ); fd.setMimeFilter( "application/x-kpresenter" ); fd.setCaption(i18n("Insert File")); KURL url; if ( fd.exec() == QDialog::Accepted ) { url = fd.selectedURL(); if( url.isEmpty() ) { KMessageBox::sorry( this, i18n("File name is empty."), i18n("Insert File")); return; } insertFile(url.path()); } } void KPresenterView::insertFile(const QString &path) { m_pKPresenterDoc->insertFile(path); } void KPresenterView::importStyle() { QStringList lst; QPtrListIterator styleIt( m_pKPresenterDoc->styleCollection()->styleList() ); for ( ; styleIt.current(); ++styleIt ) lst<translatedName(); KPrImportStyleDia dia( m_pKPresenterDoc, lst, this, 0L ); if ( dia.exec() ) { QPtrListlist(dia.listOfStyleImported()); QPtrListIterator style( list ); QMapfollowStyle; for ( ; style.current() ; ++style ) { followStyle.insert( style.current()->translatedName(), style.current()->followingStyle()->translatedName()); m_pKPresenterDoc->styleCollection()->addStyleTemplate(new KoStyle(*style.current())); } if ( style.count()>0) m_pKPresenterDoc->setModified( true ); m_pKPresenterDoc->updateAllStyleLists(); //update followingStyle. QMapIterator itFollow = followStyle.begin(); for ( ; itFollow != followStyle.end(); ++itFollow ) { KoStyle * style = m_pKPresenterDoc->styleCollection()->findStyle(itFollow.key()); QString newName =(followStyle)[ itFollow.key() ]; KoStyle * styleFollow = m_pKPresenterDoc->styleCollection()->findStyle(newName); if (styleFollow ) style->setFollowingStyle( styleFollow ); } } } void KPresenterView::backgroundPicture() { switch( m_canvas->activePage()->getBackType()) { case BT_COLOR: break; case BT_CLIPART: case BT_PICTURE: KoPicture picture=m_canvas->activePage()->background()->picture(); savePicture(picture.getKey().filename(), picture); break; } } void KPresenterView::testAndCloseAllTextObjectProtectedContent() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit && edit->kpTextObject()->isProtectContent()) { m_canvas->setToolEditMode( TEM_MOUSE ); deSelectAllObjects(); } } void KPresenterView::updateBgSpellCheckingState() { actionAllowBgSpellCheck->setChecked( m_pKPresenterDoc->backgroundSpellCheckEnabled() ); } void KPresenterView::updateRulerInProtectContentMode() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit && getHRuler()) { if ( !edit->kpTextObject()->isProtectContent() ) getHRuler()->changeFlags(KoRuler::F_INDENTS | KoRuler::F_TABS); else getHRuler()->changeFlags(0); getHRuler()->repaint(); } } void KPresenterView::slotChangeCutState(bool b) { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit && edit->kpTextObject()->isProtectContent()) actionEditCut->setEnabled( false ); else actionEditCut->setEnabled( b ); } void KPresenterView::updatePresentationButton(bool b) { actionScreenStart->setEnabled( b ); } void KPresenterView::refreshGroupButton() { bool state=m_canvas->isOneObjectSelected(); actionExtraGroup->setEnabled(state && m_canvas->numberOfObjectSelected()>1); actionExtraUnGroup->setEnabled(state && m_canvas->haveASelectedGroupObj()); } void KPresenterView::closeTextObject() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit) { m_canvas->setToolEditMode( TEM_MOUSE ); deSelectAllObjects(); } } void KPresenterView::deSelectAllObjects() { m_canvas->deSelectAllObj(); } void KPresenterView::copyLink() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit ) edit->copyLink(); } void KPresenterView::addToBookmark() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit ) { KoLinkVariable * var=edit->linkVariable(); if(var) edit->addBookmarks(var->url()); } } void KPresenterView::removeLink() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit ) edit->removeLink(); } void KPresenterView::insertDirectCursor() { insertDirectCursor( actionInsertDirectCursor->isChecked()); } void KPresenterView::insertDirectCursor(bool b) { m_pKPresenterDoc->setInsertDirectCursor(b); } void KPresenterView::updateDirectCursorButton() { actionInsertDirectCursor->setChecked(m_pKPresenterDoc->insertDirectCursor()); } void KPresenterView::copyTextOfComment() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit ) edit->copyTextOfComment(); } void KPresenterView::slotAddIgnoreAllWord() { KPTextView *edit=m_canvas->currentTextObjectView(); if ( edit ) m_pKPresenterDoc->addIgnoreWordAll( edit->underCursorWord() ); } void KPresenterView::addWordToDictionary() { KPTextView* edit = m_canvas->currentTextObjectView(); if ( edit && m_pKPresenterDoc->backgroundSpellCheckEnabled() ) { QString word = edit->wordUnderCursor( *edit->cursor() ); if ( !word.isEmpty() ) m_pKPresenterDoc->addWordToDictionary( word ); } } void KPresenterView::imageEffect() { if (m_canvas->numberOfObjectSelected() > 0) { imageEffectDia = new ImageEffectDia(this); KPPixmapObject *object=m_canvas->getSelectedImage(); imageEffectDia->setPixmap(object->getOriginalPixmap()); imageEffectDia->setEffect(object->getImageEffect(), object->getIEParam1(), object->getIEParam2(), object->getIEParam3()); m_canvas->setToolEditMode(TEM_MOUSE); if (imageEffectDia->exec()==QDialog::Accepted) { KMacroCommand *macro=0L; KCommand *cmd=m_canvas->activePage()->setImageEffect(imageEffectDia->getEffect(), imageEffectDia->getParam1(), imageEffectDia->getParam2(), imageEffectDia->getParam3()); if (cmd) { if (!macro) macro=new KMacroCommand(i18n("Change Image Effect")); macro->addCommand(cmd); } cmd=stickyPage()->setImageEffect(imageEffectDia->getEffect(), imageEffectDia->getParam1(), imageEffectDia->getParam2(), imageEffectDia->getParam3()); if (cmd) { if (!macro) macro=new KMacroCommand(i18n("Change Image Effect")); macro->addCommand(cmd); } if (macro) kPresenterDoc()->addCommand(macro); } delete imageEffectDia; imageEffectDia = 0L; } } void KPresenterView::spellAddAutoCorrect (const QString & originalword, const QString & newword) { m_pKPresenterDoc->getAutoFormat()->addAutoFormatEntry( originalword, newword ); } QPtrList KPresenterView::listOfResultOfCheckWord( const QString &word ) { //not perfect, improve API!!!! KOSpell *tmpSpell = KOSpell::createKoSpell( this, i18n( "Spell Checking" ), this, 0,m_pKPresenterDoc->getKOSpellConfig(), true,true /*FIXME !!!!!!!!!*/ ); QStringList lst = tmpSpell->resultCheckWord(word); delete tmpSpell; QPtrList listAction=QPtrList(); if ( !lst.contains( word )) { QStringList::ConstIterator it = lst.begin(); for ( int i = 0; it != lst.end() ; ++it, ++i ) { if ( !(*it).isEmpty() ) // in case of removed subtypes or placeholders { KAction * act = new KAction( (*it)); connect( act, SIGNAL(activated()), this, SLOT(slotCorrectWord()) ); listAction.append( act ); } } } return listAction; } void KPresenterView::slotCorrectWord() { KAction * act = (KAction *)(sender()); KPTextView* edit = m_canvas->currentTextObjectView(); if ( edit ) { edit->selectWordUnderCursor( *(edit->cursor()) ); m_pKPresenterDoc->addCommand(edit->textObject()->replaceSelectionCommand( edit->cursor(), act->text(), KoTextDocument::Standard, i18n("Replace Word") )); } } #include "kpresenter_view.moc"