diff --git a/kpresenter/kprcanvas.cc b/kpresenter/kprcanvas.cc index 823d2c8d20..f0fd3d1347 100644 --- a/kpresenter/kprcanvas.cc +++ b/kpresenter/kprcanvas.cc @@ -1,6622 +1,6627 @@ /* This file is part of the KDE project Copyright (C) 1998, 1999 Reginald Stadlbauer Copyright (C) 2002-2004 Thorsten Zachmann 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 "koPointArray.h" #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 "kprcommand.h" #include "kppolylineobject.h" #include "kpclosedlineobject.h" #include "kprpage.h" #include "kprvariable.h" #include "kpgroupobject.h" #include "kpresenter_doc.h" #include "kprcanvas.h" #include "kprcanvas.moc" #include "effecthandler.h" #include "pageeffects.h" #include #define MASTERPAGE 0 KPrCanvas::KPrCanvas( QWidget *parent, const char *name, KPresenterView *_view ) : QWidget( parent, name, WStaticContents|WResizeNoErase|WRepaintNoErase ), buffer( size() ) { m_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; m_resizeObject = 0L; editNum = 0L; m_rotateObject = 0L; setBackgroundMode( Qt::NoBackground ); m_view = _view; setupMenus(); setMouseTracking( true ); show(); editMode = true; m_step.m_pageNumber = 0; m_step.m_step = 0; m_step.m_subStep = 0; goingBack = false; m_drawMode = false; fillBlack = true; drawRubber = false; m_zoomRubberDraw = false; toolEditMode = TEM_MOUSE; setAcceptDrops( true ); m_ratio = 0.0; m_keepRatio = false; mouseSelectedObject = false; selectedObjectPosition = -1; m_setPageTimer = true; m_drawLineInDrawMode = false; soundPlayer = 0; m_drawPolyline = false; m_drawCubicBezierCurve = false; m_drawLineWithCubicBezierCurve = true; m_oldCubicBezierPointArray.putPoints( 0, 4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ); m_effectHandler = 0; m_pageEffect = 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 delete m_currentTextObjectView; m_currentTextObjectView = 0; if ( editNum ) editNum = 0; exitEditMode(); delete m_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() ) { //kdDebug(33001) << "KPrCanvas::paintEvent" << endl; 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 ); KPresenterDoc *doc =m_view->kPresenterDoc(); KPrPage * page = editMode ? m_activePage : doc->pageList().at( m_step.m_pageNumber ); drawBackground( &bufPainter, crect, page, editMode ); if ( editMode ) { SelectionMode selectionMode; if ( toolEditMode == TEM_MOUSE || toolEditMode == TEM_ZOOM ) selectionMode = SM_MOVERESIZE; else if ( toolEditMode == TEM_ROTATE ) selectionMode = SM_ROTATE; else selectionMode = SM_NONE; if ( doc->showGrid() && !doc->gridToFront()) drawGrid( &bufPainter, crect); if ( doc->showHelplines() && !doc->helpLineToFront() && editMode) { drawHelplines( &bufPainter, crect); drawHelpPoints( &bufPainter, crect); } drawEditPage( &bufPainter, crect, page, selectionMode ); if ( doc->showGrid() && doc->gridToFront()) drawGrid( &bufPainter, crect); if ( doc->showHelplines() && doc->helpLineToFront()) { drawHelplines( &bufPainter, crect); drawHelpPoints( &bufPainter, crect); } } else { // Center the slide in the screen, if it's smaller... #if 0 // this works but isn't enough - e.g. object effects need the same offsets // so we should store them, but they don't work like diffx/diffy... // (e.g. the painter mustn't be translated when painting the background) QRect desk = KGlobalSettings::desktopGeometry(this); QRect pgRect = m_view->kPresenterDoc()->pageList().at(0)->getZoomPageRect(); int offx = 0, offy = 0; if ( desk.width() > pgRect.width() ) offx = ( desk.width() - pgRect.width() ) / 2; if ( desk.height() > pgRect.height() ) offy = ( desk.height() - pgRect.height() ) / 2; bufPainter.translate( offx, offy ); #endif PresStep step( m_step.m_pageNumber, m_step.m_step, m_step.m_subStep, m_effectTimer.isActive(), !goingBack ); drawPresPage( &bufPainter, crect, step ); if ( m_drawMode && m_drawModeLines.count() ) { bufPainter.save(); bufPainter.setPen( m_view->kPresenterDoc()->presPen() ); for ( unsigned int i = 0; i < m_drawModeLines.count(); ++i ) { bufPainter.drawPolyline( m_drawModeLines[i] ); } bufPainter.restore(); } } 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, KPrPage * page, bool edit ) const { if ( edit ) { QRect pageRect = page->getZoomPageRect(); if ( rect.intersects( pageRect ) ) page->background()->drawBackground( painter, m_view->zoomHandler(), rect, true ); // Include the border pageRect.rLeft() -= 1; pageRect.rTop() -= 1; pageRect.rRight() += 1; pageRect.rBottom() += 1; QRegion grayRegion( rect ); 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 { // Old code, left a black area if zoomX != zoomY //page->background()->draw( painter, m_view->zoomHandler(), rect, false ); QRect desk = KGlobalSettings::desktopGeometry(getView()); QRect crect = desk.intersect( rect ); if ( crect.isEmpty() ) return; page->background()->drawBackground( painter, desk.size(), crect, 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(); } void KPrCanvas::drawObjects( QPainter *painter, const QPtrList &objects, SelectionMode selectionMode, bool contour, KPTextView * textView, int pageNum ) const { QPtrListIterator it( objects ); for ( ; it.current(); ++it ) { SelectionMode selMode = selectionMode; if ( selectionMode != SM_NONE && it.current()->isSelected() && ( m_view->kPresenterDoc()->isHeaderFooter(it.current()) || it.current()->isProtect() ) ) selMode = SM_PROTECT; it.current()->draw( painter, m_view->zoomHandler(), pageNum, selMode, (it.current()->isSelected()) && contour ); it.current()->setSubPresStep( 0 ); it.current()->doSpecificEffects( false ); } if ( textView ) { textView->kpTextObject()->paintEdited( painter, m_view->zoomHandler(), false /*onlyChanged. Pass as param ?*/, textView->cursor(), true /* idem */ ); } } void KPrCanvas::drawObjectsPres( QPainter *painter, const QPtrList &_objects, PresStep step ) const { QPtrList objects; QPtrListIterator it( _objects ); for ( ; it.current(); ++it ) { if ( objectIsAHeaderFooterHidden(it.current()) ) continue; if ( it.current()->getAppearStep() <= step.m_step && ( ! it.current()->getDisappear() || it.current()->getDisappear() && it.current()->getDisappearStep() > step.m_step ) ) { if ( step.m_animate && it.current()->getAppearStep() == step.m_step && it.current()->getEffect() != EF_NONE ) continue; if ( step.m_animateSub && it.current()->getAppearStep() == step.m_step ) { it.current()->setSubPresStep( step.m_subStep ); it.current()->doSpecificEffects( true, false ); } objects.append( it.current() ); } } drawObjects( painter, objects, SM_NONE, false, NULL, step.m_pageNumber ); } void KPrCanvas::drawObjectsEdit( QPainter *painter, const KoRect &rect, const QPtrList &_objects, SelectionMode selectionMode, int pageNum ) const { QPtrList objects; KPTextView * textView = NULL; QPtrListIterator it( _objects ); for ( ; it.current(); ++it ) { if ( objectIsAHeaderFooterHidden(it.current()) ) continue; if ( rect.intersects( it.current()->getBoundingRect() ) ) { if ( m_currentTextObjectView && m_currentTextObjectView->kpTextObject() == it.current() ) { textView = m_currentTextObjectView; } objects.append( it.current() ); } } drawObjects( painter, objects, selectionMode, drawContour, textView, pageNum ); } void KPrCanvas::drawEditPage( QPainter *painter, const QRect &_rect, KPrPage *page, SelectionMode selectionMode ) const { KoRect rect = m_view->zoomHandler()->unzoomRect(_rect); int pageNum = m_view->kPresenterDoc()->pageList().findRef( page ); //objects in current page drawObjectsEdit( painter, rect, page->objectList(), selectionMode, pageNum ); //draw sticky object #if MASTERPAGE if ( page->masterPage() ) drawObjectsEdit( painter, rect, page->masterPage()->objectList(), selectionMode, pageNum ); #else drawObjectsEdit( painter, rect, page->masterPage()->objectList(), selectionMode, pageNum ); #endif } void KPrCanvas::drawPresPage( QPainter *painter, const QRect &_rect, PresStep step ) const { KoRect rect = m_view->zoomHandler()->unzoomRect(_rect); KPrPage * page = m_view->kPresenterDoc()->pageList().at(step.m_pageNumber); //objects in current page drawObjectsPres( painter, page->objectList(), step ); //draw master page object drawObjectsPres( painter, page->masterPage()->objectList(), step ); } 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 = m_activePage->getZoomPageRect(); int zoomedX, zoomedY; double offsetX = doc->getGridX(); double offsetY = doc->getGridY(); for ( double i = offsetX; ( zoomedX = m_view->zoomHandler()->zoomItX( i )+pageRect.left() ) < pageRect.right(); i += offsetX ) for ( double j = offsetY; ( zoomedY = m_view->zoomHandler()->zoomItY( j )+pageRect.top() ) < pageRect.bottom(); 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 = m_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, int pageNum ) const { QPtrListIterator it( obj ); for ( ; it.current(); ++it ) { if ( objectIsAHeaderFooterHidden( it.current() ) ) continue; it.current()->draw( painter, m_view->zoomHandler(), pageNum, 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 ); return m_view->zoomHandler()->zoomRect( oldKoBoundingRect ); } 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; } } KPObject *kpobject = 0; m_savedMousePos = contentsPoint; QPoint rasterPoint=applyGrid( e->pos(), true ); 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: { firstX = contentsPoint.x(); firstY = contentsPoint.y(); KPObject *kpobject = getObjectAt( docPoint, true ); if ( kpobject ) { // use ctrl + Button to select / deselect object if ( e->state() & ControlButton && kpobject->isSelected() ) deSelectObj( kpobject ); else if ( e->state() & ControlButton ) { selectObj( kpobject ); raiseObject( kpobject ); moveStartPosMouse = objectSelectedBoundingRect().topLeft(); } else { if ( modType != MT_MOVE || !kpobject->isSelected() ) deSelectAllObj(); selectObj( kpobject ); raiseObject( kpobject ); moveStartPosMouse = objectSelectedBoundingRect().topLeft(); } // start resizing if ( modType != MT_MOVE && modType != MT_NONE ) { deSelectAllObj(); selectObj( kpobject ); raiseObject( kpobject ); m_resizeObject = kpobject; m_keepRatio = false; if ( e->state() & ControlButton ) m_keepRatio = true; m_keepRatio = m_keepRatio || m_resizeObject->isKeepRatio(); m_ratio = static_cast( kpobject->getSize().width() ) / static_cast( kpobject->getSize().height() ); m_rectBeforeResize = kpobject->getRect(); } } else { deSelectAllObj(); 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: { firstX = contentsPoint.x(); firstY = contentsPoint.y(); KPObject *kpobject = getObjectAt( docPoint ); // clear old selections even if shift or control are pressed // we don't support rotating multiple objects yet deSelectAllObj(); if ( kpobject ) { m_rotateObject = kpobject; m_angleBeforeRotate = kpobject->getAngle(); selectObj( kpobject ); raiseObject( kpobject ); // set center of selected object bounding rect calcBoundingRect(); m_rotateCenter = m_boundingRect.center(); } } 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 ( 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 { if ( e->button() == LeftButton ) { if ( m_drawMode ) { setCursor( KPresenterUtils::penCursor() ); m_drawLineInDrawMode = true; m_drawModeLineIndex = 0; m_drawModeLines.append( QPointArray() ); m_drawModeLines[m_drawModeLines.count() - 1].putPoints( m_drawModeLineIndex++, 1, e->x(), e->y() ); } else m_view->screenNext(); } else if ( e->button() == MidButton ) m_view->screenPrev(); else if ( e->button() == RightButton ) { if ( !m_drawMode && !spManualSwitch() ) { finishObjectEffects(); finishPageEffect(); m_view->stopAutoPresTimer(); } setCursor( arrowCursor ); QPoint pnt = QCursor::pos(); int ret = m_presMenu->exec( pnt ); // we have to continue the timer if the menu was canceled and we draw mode is not active if ( ret == -1 && !m_presMenu->isItemChecked( PM_DM ) && !spManualSwitch() ) m_view->continueAutoPresTimer(); } } #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 } void KPrCanvas::calcBoundingRect() { m_boundingRect = KoRect(); m_boundingRect=m_activePage->getBoundingRect(m_boundingRect); #if ! MASTERPAGE m_boundingRect = m_activePage->masterPage()->getBoundingRect( m_boundingRect ); #endif m_origBRect = m_boundingRect; } KoRect KPrCanvas::objectSelectedBoundingRect() const { KoRect objBoundingRect=KoRect(); objBoundingRect = m_activePage->getBoundingRect( objBoundingRect); #if ! MASTERPAGE objBoundingRect = m_activePage->masterPage()->getBoundingRect( objBoundingRect ); #endif return objBoundingRect; } KoRect KPrCanvas::getAlignBoundingRect() const { KoRect boundingRect; #if MASTERPAGE { QPtrListIterator it( m_activePage->objectList() ); #else for ( int i = 0; i < 2; ++i ) { QPtrListIterator it( i == 0 ? m_activePage->objectList() : m_activePage->masterPage()->objectList() ); #endif 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 ) return; if ( m_drawMode ) { m_drawLineInDrawMode = false; m_drawModeLines[m_drawModeLines.count() - 1].putPoints( m_drawModeLineIndex++, 1, contentsPoint.x(), contentsPoint.y() ); 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 ); 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(); switch ( toolEditMode ) { case TEM_MOUSE: { drawContour = FALSE; switch ( modType ) { case MT_NONE: { if ( drawRubber ) { // used for selecting multiple object in with the mouse 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()); KoRect selectedRect = m_view->zoomHandler()->unzoomRect( rubber ); #if MASTERPAGE QPtrListIterator it( getObjectList() ); for ( ; it.current() ; ++it ) { if ( it.current()->intersects( selectedRect ) ) { if( objectIsAHeaderFooterHidden(it.current())) continue; it.current()->setSelected( true ); } } #else QPtrListIterator it( getObjectList() ); for ( ; it.current() ; ++it ) { if ( it.current()->intersects( selectedRect ) ) it.current()->setSelected( true ); } it = m_activePage->masterPage()->objectList(); for ( ; it.current() ; ++it ) { if ( it.current()->intersects( selectedRect ) ) { if( objectIsAHeaderFooterHidden(it.current())) continue; it.current()->setSelected( true ); } } #endif m_view->penColorChanged( m_activePage->getPen( QPen( Qt::black, 1, Qt::SolidLine ) ) ); m_view->brushColorChanged( m_activePage->getBrush( QBrush( Qt::white, Qt::SolidPattern ) ) ); mouseSelectedObject = true; _repaint( false ); emit objectSelectedChanged(); } 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); } #if ! MASTERPAGE cmd = m_activePage->masterPage()->moveObject( m_view, move.x(), move.y() ); if(cmd) { if ( !macro ) macro=new KMacroCommand(i18n("Move Objects")); macro->addCommand(cmd); } #endif if(macro) m_view->kPresenterDoc()->addCommand(macro ); } else { #if ! MASTERPAGE m_activePage->masterPage()->repaintObj(); #endif m_activePage->repaintObj(); } } break; case MT_RESIZE_UP: finishResizeObject( i18n( "Resize Object Up" ), mx, my ); break; case MT_RESIZE_DN: finishResizeObject( i18n( "Resize Object Down" ), mx, my, false ); break; case MT_RESIZE_LF: finishResizeObject( i18n( "Resize Object Left" ), mx, my ); break; case MT_RESIZE_RT: finishResizeObject( i18n( "Resize Object Right" ), mx, my ); break; case MT_RESIZE_LU: finishResizeObject( i18n( "Resize Object Left && Up" ), mx, my ); break; case MT_RESIZE_LD: finishResizeObject( i18n( "Resize Object Left && Down" ), mx, my ); break; case MT_RESIZE_RU: finishResizeObject( i18n( "Resize Object Right && Up" ), mx, my ); break; case MT_RESIZE_RD: finishResizeObject( i18n( "Resize Object Right && Down" ), mx, my ); break; } } break; case INS_TEXT: { if ( !insRect.isNull() ) { rectSymetricalObjet(); KPTextObject* kptextobject = insertTextObject( insRect ); setToolEditMode( TEM_MOUSE ); // User-friendlyness: automatically start editing this textobject 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 ( !m_rotateObject ) break; if ( m_angleBeforeRotate != m_rotateObject->getAngle() ) { QPtrList objects; objects.append( m_rotateObject ); /* As the object is allready rotated set the angle to * the m_angleBeforeRotate for the creation of the command, and * back afterwards. No need for executing the command */ float newAngle = m_rotateObject->getAngle(); m_rotateObject->rotate( m_angleBeforeRotate ); RotateCmd *rotateCmd = new RotateCmd( i18n( "Change Rotation" ), newAngle, objects, m_view->kPresenterDoc() ); m_view->kPresenterDoc()->addCommand( rotateCmd ); m_rotateObject->rotate( newAngle ); m_rotateObject = NULL; } }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 ); 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; mouseMoveEvent( e ); calcBoundingRect(); } void KPrCanvas::mouseMoveEvent( QMouseEvent *e ) { QPoint contentsPoint( e->pos().x()+diffx(), e->pos().y()+diffy() ); int oldMx = m_savedMousePos.x(); int oldMy = m_savedMousePos.y(); m_savedMousePos = contentsPoint; 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 MASTERPAGE if ( (int)objectList().count() > 0 ) { kpobject = m_activePage->getCursor( docPoint ); if( kpobject) { setCursor( kpobject->getCursor( docPoint, modType, m_view->kPresenterDoc() ) ); cursorAlreadySet = true; } } #else if ( (int)objectList().count() - 1 >= 0 || (int)m_activePage->masterPage()->objectList().count() -1>=0 ) { kpobject=m_activePage->getCursor(docPoint); if( kpobject) { setCursor( kpobject->getCursor( docPoint, modType,m_view->kPresenterDoc()) ); cursorAlreadySet = true; } else { kpobject = m_activePage->masterPage()->getCursor( docPoint ); if( kpobject) { setCursor( kpobject->getCursor( docPoint, modType,m_view->kPresenterDoc() ) ); cursorAlreadySet = true; } } } #endif 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 && m_resizeObject ) { 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 ); } } 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: { if ( m_rotateObject ) { drawContour = TRUE; // angle to mouse pos double angle = KoPoint::getAngle( m_rotateCenter, docPoint ); // angle to start of mouse pos double angle1 = KoPoint::getAngle( m_rotateCenter, m_view->zoomHandler()->unzoomPoint( QPoint( firstX, firstY ) ) ); angle -= angle1; angle += m_angleBeforeRotate; if ( angle < 0 ) angle += 360; else if ( angle > 360 ) angle -= 360; m_rotateObject->rotate( angle ); _repaint( m_rotateObject ); } }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 && m_drawMode && m_drawLineInDrawMode ) { QPainter p; p.begin( this ); p.setPen( m_view->kPresenterDoc()->presPen() ); p.drawLine( oldMx, oldMy, e->x(), e->y() ); p.end(); m_drawModeLines[m_drawModeLines.count() - 1].putPoints( m_drawModeLineIndex++, 1, e->x(), e->y() ); } if ( !editMode && !m_drawMode && !m_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 = getObjectAt( docPoint ); 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.right()-1); else if( insRect.right()pageRect.bottom()-1) insRect.setBottom(pageRect.bottom()-1); else if( insRect.bottom()getZoomPageRect(); QPoint point(_point); if(point.x()>pageRect.right()-1) point.setX(pageRect.right()-1); else if( point.x()pageRect.bottom()-1) point.setY(pageRect.bottom()-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: setSwitchingMode( false ); m_view->screenNext(); break; case Key_Next: setSwitchingMode( false ); m_view->screenNext( true ); break; case Key_Backspace: case Key_Left: case Key_Up: setSwitchingMode( false ); finishObjectEffects(); finishPageEffect( true ); m_view->screenPrev(); break; case Key_Prior: setSwitchingMode( false ); finishObjectEffects(); finishPageEffect( true ); m_view->screenPrev( true ); break; case Key_Escape: case Key_Q: case Key_X: setSwitchingMode( false ); finishObjectEffects(); finishPageEffect( true ); m_view->screenStop(); break; case Key_G: // setSwitchingMode( false ) not needed as it is allready done in slotGotoPage; if ( !spManualSwitch() ) m_view->stopAutoPresTimer(); slotGotoPage(); break; case Key_Home: // go to first page setSwitchingMode( false ); presGotoFirstPage(); if ( !spManualSwitch() ) { m_view->setAutoPresTimer( 1 ); m_setPageTimer = true; } break; case Key_End: // go to last page setSwitchingMode( false ); if ( m_presentationSlidesIterator != m_presentationSlides.end() ) { gotoPage( *(--m_presentationSlides.end()) ); if ( !spManualSwitch() ) { m_view->setAutoPresTimer( 1 ); m_setPageTimer = 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); } #if ! MASTERPAGE cmd = m_activePage->masterPage()->moveObject( m_view, move.x(), move.y() ); if(cmd) { if ( ! macro ) macro=new KMacroCommand(i18n("Move Objects")); macro->addCommand(cmd); } #endif 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, bool withoutProtected ) { KPObject *object = m_activePage->getObjectAt( pos, withoutProtected ); #if MASTERPAGE if ( objectIsAHeaderFooterHidden( object ) ) object = 0; #else if ( !object ) { object = m_activePage->masterPage()->getObjectAt( pos, withoutProtected ); if ( objectIsAHeaderFooterHidden( object ) ) object = 0; } #endif return object; } 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() { #if MASTERPAGE QPtrListIterator it( m_activePage->objectList() ); for ( ; it.current() ; ++it ) { if ( !objectIsAHeaderFooterHidden(it.current()) ) it.current()->setSelected( true ); } #else QPtrListIterator it( m_activePage->masterPage()->objectList() ); for ( ; it.current() ; ++it ) { if ( !objectIsAHeaderFooterHidden(it.current()) ) it.current()->setSelected( true ); } it= m_activePage->objectList(); for ( ; it.current() ; ++it ) { it.current()->setSelected( true ); } #endif m_view->penColorChanged( m_activePage->getPen( QPen( Qt::black, 1, Qt::SolidLine ) ) ); m_view->brushColorChanged( m_activePage->getBrush( QBrush( Qt::white, Qt::SolidPattern ) ) ); mouseSelectedObject = true; _repaint( false ); emit objectSelectedChanged(); } void KPrCanvas::deSelectAllObj() { #if MASTERPAGE if( m_activePage->numSelected() == 0 ) return; #else if( m_activePage->numSelected()==0 && m_activePage->masterPage()->numSelected() == 0 ) return; #endif if ( !m_view->kPresenterDoc()->raiseAndLowerObject && selectedObjectPosition != -1 ) { lowerObject(); selectedObjectPosition = -1; } else m_view->kPresenterDoc()->raiseAndLowerObject = false; m_activePage->deSelectAllObj(); #if ! MASTERPAGE m_activePage->masterPage()->deSelectAllObj(); #endif // set current default pen color and brush color in tool bar m_view->penColorChanged( m_view->getPen() ); m_view->brushColorChanged( m_view->getBrush() ); //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 m_presMenu = new KPopupMenu(); Q_CHECK_PTR( m_presMenu ); m_presMenu->setCheckable( true ); m_presMenu->insertTitle( i18n( "Slide Show" ) ); m_presMenu->insertItem( i18n( "&Continue" ), this, SLOT( setSwitchingMode() ) ); PM_DM = m_presMenu->insertItem( i18n( "&Drawing Mode" ), this, SLOT( setDrawingMode() ) ); m_presMenu->insertSeparator(); m_presMenu->insertItem( SmallIcon("goto"), i18n( "&Goto Slide..." ), this, SLOT( slotGotoPage() ) ); m_presMenu->insertSeparator(); m_presMenu->insertItem( i18n( "&End" ), this, SLOT( slotExitPres() ) ); m_presMenu->setItemChecked( PM_DM, false ); m_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 ! MASTERPAGE if( state) return; m_activePage->masterPage()->chPic(m_view); #endif } bool KPrCanvas::exportPage( int nPage, int nWidth, int nHeight, const KURL& _fileURL, const char* format, int quality ) { bool res = false; const QCursor oldCursor( cursor() ); setCursor( waitCursor ); QPixmap pix( nWidth, nHeight ); drawPageInPix( pix, nPage, 0, true, nWidth, nHeight ); if( !pix.isNull() ){ // Depending on the desired target size due to rounding // errors during zoom the resulting pixmap *might* be // 1 pixel or 2 pixels wider/higher than desired: we just // remove the additional columns/rows. This can be done // since KPresenter is leaving a minimal border below/at // the right of the image anyway. const QSize desiredSize(nWidth, nHeight); if( desiredSize != pix.size() ) pix.resize( desiredSize ); // save the pixmap to the desired file KURL fileURL(_fileURL); if( fileURL.protocol().isEmpty() ) fileURL.setProtocol( "file" ); const bool bLocalFile = fileURL.isLocalFile(); KTempFile* tmpFile = bLocalFile ? NULL : new KTempFile(); if( !bLocalFile ) tmpFile->setAutoDelete( true ); if( bLocalFile || 0 == tmpFile->status() ){ QFile file( bLocalFile ? fileURL.path(0) : tmpFile->name() ); if ( file.open( IO_ReadWrite ) ) { res = pix.save( &file, format, quality ); file.close(); } if( !bLocalFile ){ if( res ){ #if KDE_IS_VERSION(3,1,90) res = KIO::NetAccess::upload( tmpFile->name(), fileURL, this ); #else res = KIO::NetAccess::upload( tmpFile->name(), fileURL ); #endif } } } if( !bLocalFile ){ delete tmpFile; } } setCursor( oldCursor ); return res; } void KPrCanvas::savePicture() { bool state=m_activePage->savePicture( m_view); #if ! MASTERPAGE if( state) return; m_activePage->masterPage()->savePicture(m_view); #endif } 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 { #if MASTERPAGE return m_activePage->haveASelectedPartObj(); #else return m_activePage->haveASelectedPartObj() || m_activePage->masterPage()->haveASelectedPartObj(); #endif } bool KPrCanvas::haveASelectedGroupObj() const { #if MASTERPAGE return m_activePage->haveASelectedGroupObj(); #else return m_activePage->haveASelectedGroupObj() || m_activePage->masterPage()->haveASelectedGroupObj(); #endif } bool KPrCanvas::haveASelectedPixmapObj() const { #if MASTERPAGE return m_activePage->haveASelectedPixmapObj(); #else return m_activePage->haveASelectedPixmapObj() || m_activePage->masterPage()->haveASelectedPixmapObj(); #endif } 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() ); } } #if ! MASTERPAGE //get sticky obj lstObj.clear(); m_activePage->masterPage()->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() ); } } #endif } 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() ) ); } #if ! MASTERPAGE //get sticky obj it = m_activePage->masterPage()->objectList(); for ( ; it.current(); ++it ) { if ( it.current()->isSelected() && it.current()->getType() == OT_TEXT ) lst.append( static_cast( it.current() )); } #endif return lst; } void KPrCanvas::startScreenPresentation( double zoomX, double zoomY, int curPgNum /* 1-based */) { //kdDebug(33001) << "KPrCanvas::startScreenPresentation curPgNum=" << curPgNum << endl; //setup presentation menu m_presMenu->setItemChecked( PM_DM, false ); setCursor( waitCursor ); exitEditMode(); KPresenterDoc * doc = m_view->kPresenterDoc(); // Text can't zoom with a different x and y factor, yet. // So we have to choose the smallest zoom (but still paint background everywhere) double zoom = kMin( zoomX, zoomY ); kdDebug() << "zoomX=" << zoomX << " zoomY=" << zoomY << " zoom=" << zoom << endl; m_zoomBeforePresentation = doc->zoomHandler()->zoom(); kdDebug() << "old zoomed resolutions =" << doc->zoomHandler()->zoomedResolutionX() << "," << doc->zoomHandler()->zoomedResolutionY() << endl; // Seems to fail (Qt uses the wrong font sizes...) //doc->zoomHandler()->setZoomedResolution( zoomX * doc->zoomHandler()->zoomedResolutionX(), // zoomY * doc->zoomHandler()->zoomedResolutionY() ); // Apply the new zooming to the existing one doc->zoomHandler()->setZoomAndResolution( qRound( zoom * m_zoomBeforePresentation ), KoGlobal::dpiX(), KoGlobal::dpiY() ); doc->newZoomAndResolution( false, false ); // add all selected slides m_presentationSlides.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; m_presentationSlides.append( slideno ); } // no slide selected ? end the slide show immediately... if( !m_presentationSlides.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 = m_presentationSlides[i]; break; } setCursor( blankCursor ); m_step.m_pageNumber = (unsigned int) -1; // force gotoPage to do something // No need to paint yet, we'll get an update soon (probably due to reparent+showFullScreen) setUpdatesEnabled( false ); gotoPage( slide ); setUpdatesEnabled( true ); //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->zoomHandler()->setZoomAndResolution( m_zoomBeforePresentation, KoGlobal::dpiX(), KoGlobal::dpiY() ); doc->newZoomAndResolution(false,false); goingBack = false; m_step.m_pageNumber = 0; editMode = true; m_drawMode = false; repaint( false ); setToolEditMode( toolEditMode ); setWFlags( WResizeNoErase ); } bool KPrCanvas::pNext( bool gotoNextPage ) { goingBack = false; bool objectEffectFinished = finishObjectEffects(); KPresenterDoc * doc = m_view->kPresenterDoc(); if ( !gotoNextPage ) { if ( finishPageEffect() ) return false; // clear drawed lines m_drawModeLines.clear(); //kdDebug(33001) << "\n-------\nKPrCanvas::pNext m_step =" << m_step.m_step << " m_subStep =" << m_step.m_subStep << endl; // First try to go one sub-step further, if any object requires it // ### should we also objects on the sticky page be checked for sub steps? QPtrListIterator oit( doc->pageList().at( m_step.m_pageNumber )->objectList() ); for ( int i = 0 ; oit.current(); ++oit, ++i ) { KPObject *kpobject = oit.current(); if ( kpobject->getAppearStep() == static_cast( m_step.m_step ) && kpobject->getType() == OT_TEXT && kpobject->getEffect2() != EF2_NONE ) { if ( static_cast( m_step.m_subStep + 1 ) < kpobject->getSubPresSteps() ) { m_step.m_subStep++; //kdDebug(33001) << "Page::pNext addSubPres m_subStep is now " << m_subStep << endl; doObjEffects(); return false; } } } // Then try to see if there is still one step to do in the current page if ( m_step.m_step < *( --m_pageEffectSteps.end() ) ) { QValueList::ConstIterator it = m_pageEffectSteps.find( m_step.m_step ); m_step.m_step = *( ++it ); m_step.m_subStep = 0; //kdDebug(33001) << "Page::pNext setting currentEffectStep to " << m_step.m_step << endl; // if first step on page, draw background if ( m_step.m_step == 0 ) { QPainter p; p.begin( this ); drawBackground( &p, QRect( 0, 0, kapp->desktop()->width(), kapp->desktop()->height() ), doc->pageList().at( m_step.m_pageNumber ) ); p.end(); } doObjEffects(); return false; } /* * don't go to next slide if we have finished an object effect * so that we can see the hole slide before going to the next */ if ( objectEffectFinished ) return false; } // No more steps in this page, try to go to the next page QValueList::ConstIterator test( m_presentationSlidesIterator ); if ( ++test != m_presentationSlides.end() ) { if ( !spManualSwitch() && m_setPageTimer ) { //TODO add global presentation speed m_view->setAutoPresTimer( doc->pageList().at( (*m_presentationSlidesIterator) - 1 )->getPageTimer() / 1 ); m_setPageTimer = false; return false; } m_setPageTimer = true; #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->setPageDuration( m_step.m_pageNumber ); m_step.m_pageNumber = *( ++m_presentationSlidesIterator ) - 1; m_step.m_subStep = 0; m_pageEffectSteps = doc->getPageEffectSteps( m_step.m_pageNumber ); m_step.m_step = *m_pageEffectSteps.begin(); #if KDE_IS_VERSION(3,1,90) QPixmap _pix2( desk.width(), desk.height() ); #else QPixmap _pix2( QApplication::desktop()->width(), QApplication::desktop()->height() ); #endif drawCurrentPageInPix( _pix2 ); QValueList::ConstIterator it( m_presentationSlidesIterator ); --it; KPBackGround * backtmp=doc->pageList().at( ( *it ) - 1 )->background(); PageEffect _pageEffect = backtmp->getPageEffect(); bool _soundEffect = backtmp->getPageSoundEffect(); QString _soundFileName = backtmp->getPageSoundFileName(); if ( _soundEffect && !_soundFileName.isEmpty() ) { stopSound(); playSound( _soundFileName ); } m_pageEffect = new KPPageEffects( this, _pix2, _pageEffect, backtmp->getPageEffectSpeed() ); if ( m_pageEffect->doEffect() ) { delete m_pageEffect; m_pageEffect = 0; doObjEffects( true ); } else { connect( &m_pageEffectTimer, SIGNAL( timeout() ), SLOT( slotDoPageEffect() ) ); m_pageEffectTimer.start( 50, true ); } 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->setPageDuration( m_step.m_pageNumber ); #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 stopAutomaticPresentation(); // no automatic mode for last slide } else if ( showingLastSlide ) // after last slide stop presentation { showingLastSlide = false; m_view->screenStop(); } else { m_view->setPageDuration( m_step.m_pageNumber ); emit restartPresentation(); // tells automatic mode to restart m_view->setAutoPresTimer( 1 ); } return false; } bool KPrCanvas::pPrev( bool gotoPreviousPage ) { goingBack = true; m_step.m_subStep = 0; // clear drawed lines m_drawModeLines.clear(); if ( !gotoPreviousPage && m_step.m_step > *m_pageEffectSteps.begin() ) { QValueList::ConstIterator it = m_pageEffectSteps.find( m_step.m_step ); m_step.m_step = *( --it ); //hopefully there are never more than 1000 sub steps :-) m_step.m_subStep = 1000; repaint( false ); return false; } else { // when we go back on the first slide, thats like starting the presentation again if ( m_presentationSlidesIterator == m_presentationSlides.begin() ) { m_pageEffectSteps = m_view->kPresenterDoc()->getPageEffectSteps( m_step.m_pageNumber ); m_step.m_step = *m_pageEffectSteps.begin(); goingBack = false; doObjEffects(); return false; } m_view->setPageDuration( m_step.m_pageNumber ); m_step.m_pageNumber = *( --m_presentationSlidesIterator ) - 1; KPresenterDoc * doc = m_view->kPresenterDoc(); m_pageEffectSteps = doc->getPageEffectSteps( m_step.m_pageNumber ); if ( gotoPreviousPage ) { m_step.m_step = *( m_pageEffectSteps.begin() ); goingBack = false; doObjEffects(); } else { m_step.m_step = *( --m_pageEffectSteps.end() ); repaint( false ); } return true; } return false; } bool KPrCanvas::canAssignEffect( QPtrList &objs ) const { QPtrListIterator oIt( m_activePage->objectList() ); #if ! MASTERPAGE for (; oIt.current(); ++oIt ) if ( oIt.current()->isSelected() ) objs.append( oIt.current() ); oIt = m_activePage->masterPage()->objectList(); #endif 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 { #if MASTERPAGE return m_activePage->isOneObjectSelected(); #else bool state=m_activePage->isOneObjectSelected(); if( state) return true; return m_activePage->masterPage()->isOneObjectSelected(); #endif } // This one is used to generate the pixmaps for the HTML presentation, // for the pres-structure-dialog, for the sidebar previews, for template icons. // Set forceWidth and/or forceHeight to override the zoom factor // and obtain a pixmap of the specified width and/or height. // By omitting one of them you make sure that the aspect ratio // of your page is used for the resulting image. void KPrCanvas::drawPageInPix( QPixmap &_pix, int pgnum, int zoom, bool forceRealVariableValue, int forceWidth, int forceHeight ) { //kdDebug(33001) << "Page::drawPageInPix" << endl; KPresenterDoc *doc = m_view->kPresenterDoc(); int oldZoom = doc->zoomHandler()->zoom(); bool oldDisplayFieldValue = false; if( 0 < forceWidth || 0 < forceHeight ) { const QRect rect( doc->getPageRect( true ) ); const double dRectHeight = static_cast(rect.height()); const double dRectWidth = static_cast(rect.width()); double dForceHeight = static_cast(forceHeight); double dForceWidth = static_cast(forceWidth); // adjust width or height, in case one of them is missing if( 0 >= forceWidth ) dForceWidth = dForceHeight * dRectWidth / dRectHeight; else if( 0 >= forceHeight ) dForceHeight = dForceWidth * dRectHeight / dRectWidth; // set the stretching values // ### TODO: this should probably be setZoomedResolution, please test doc->zoomHandler()->setResolution( dForceWidth / dRectWidth, dForceHeight / dRectHeight ); // As of yet (Feb. 2004) the following call results // in a NOP but be prepared for the future... doc->newZoomAndResolution( false, false ); }else{ 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 ); } } KPrPage * page = m_view->kPresenterDoc()->pageList().at(pgnum); QRect rect = page->getZoomPageRect( ); _pix.resize( rect.size() ); _pix.fill( Qt::white ); QPainter p; p.begin( &_pix ); bool _editMode = editMode; editMode = false; drawBackground( &p, _pix.rect(), page ); //objects in current page QPtrList _list = page->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, pgnum ); //draw sticky object drawAllObjectsInPage( &p, page->masterPage()->objectList(), pgnum ); 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; // avoid garbage on "weird" DPIs _pix.fill(Qt::black); QPainter p; p.begin( &_pix ); drawBackground( &p, _pix.rect(), m_view->kPresenterDoc()->pageList().at( m_step.m_pageNumber ) ); PresStep step( m_step.m_pageNumber, m_step.m_step, m_step.m_subStep, true, true ); drawPresPage( &p, _pix.rect(), step ); p.end(); } void KPrCanvas::printPage( QPainter* painter, PresStep step ) { //kdDebug(33001) << "KPrCanvas::printPage" << endl; KPresenterDoc *doc = m_view->kPresenterDoc(); KPrPage* page = doc->pageList().at( step.m_pageNumber ); QRect rect = page->getZoomPageRect(); drawBackground( painter, rect, page ); drawPresPage( painter, rect, step ); } void KPrCanvas::doObjEffects( bool isAllreadyPainted ) { if ( m_effectHandler ) { m_effectTimer.stop(); QObject::disconnect( &m_effectTimer, SIGNAL( timeout() ), this, SLOT( slotDoEffect() ) ); m_effectHandler->finish(); delete m_effectHandler; m_effectHandler = 0; } QPixmap screen_orig( kapp->desktop()->width(), kapp->desktop()->height() ); KPrPage *page = m_view->kPresenterDoc()->pageList().at( m_step.m_pageNumber ); // YABADABADOOOOOOO.... That's a hack :-) if ( m_step.m_subStep == 0 && !isAllreadyPainted && isUpdatesEnabled() ) { //kdDebug(33001) << "Page::doObjEffects - in the strange hack" << endl; QPainter p; p.begin( &screen_orig ); QRect desktopRect = QRect( 0, 0, kapp->desktop()->width(), kapp->desktop()->height() ); drawBackground( &p, desktopRect, page ); PresStep step( m_step.m_pageNumber, m_step.m_step, m_step.m_subStep, true, true ); drawPresPage( &p, desktopRect ,step ); p.end(); bitBlt( this, 0, 0, &screen_orig ); } else { bitBlt( &screen_orig, 0, 0, this ); } QPtrList allObjects( page->objectList() ); QPtrListIterator it( page->masterPage()->objectList() ); for ( ; it.current(); ++it ) { if ( objectIsAHeaderFooterHidden( it.current() ) ) continue; else allObjects.append( it.current() ); } //TODO add global presentation speed m_effectHandler = new EffectHandler( m_step, goingBack, this, &screen_orig, allObjects, m_view, 1 ); if ( m_effectHandler->doEffect() ) { delete m_effectHandler; m_effectHandler = 0; } else { connect( &m_effectTimer, SIGNAL( timeout() ), SLOT( slotDoEffect() ) ); m_effectTimer.start( 50, true ); } } void KPrCanvas::slotDoEffect() { if ( m_effectHandler->doEffect() ) { m_effectTimer.stop(); QObject::disconnect( &m_effectTimer, SIGNAL( timeout() ), this, SLOT( slotDoEffect() ) ); delete m_effectHandler; m_effectHandler = 0; } else { m_effectTimer.start( 50, true ); } } void KPrCanvas::slotDoPageEffect() { if ( m_pageEffect->doEffect() ) { m_pageEffectTimer.stop(); QObject::disconnect( &m_pageEffectTimer, SIGNAL( timeout() ), this, SLOT( slotDoPageEffect() ) ); delete m_pageEffect; m_pageEffect = 0; doObjEffects( true ); } else { m_pageEffectTimer.start( 50, true ); } } bool KPrCanvas::finishObjectEffects() { bool finished = false; if ( m_effectHandler ) { m_effectTimer.stop(); QObject::disconnect( &m_effectTimer, SIGNAL( timeout() ), this, SLOT( slotDoEffect() ) ); m_effectHandler->finish(); delete m_effectHandler; m_effectHandler = 0; finished = true; } return finished; } bool KPrCanvas::finishPageEffect( bool cancel ) { bool finished = false; if ( m_pageEffect ) { m_pageEffectTimer.stop(); QObject::disconnect( &m_pageEffectTimer, SIGNAL( timeout() ), this, SLOT( slotDoPageEffect() ) ); if ( !cancel ) m_pageEffect->finish(); delete m_pageEffect; m_pageEffect = 0; if ( !cancel ) { doObjEffects( true ); } else if ( !spManualSwitch() ) { m_view->setAutoPresTimer( 1 ); m_setPageTimer = true; } finished = true; } return finished; } void KPrCanvas::print( QPainter *painter, KPrinter *printer, float /*left_margin*/, float /*top_margin*/ ) { PresStep step( 0, 1000, 1000 ); //deSelectAllObj(); // already done in KPresenterView::setupPrinter printer->setFullPage( true ); int i = 0; repaint( false ); kapp->processEvents(); editMode = false; fillBlack = false; //int _xOffset = diffx(); //int _yOffset = diffy(); //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->pageList().count() + 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; step.m_pageNumber = i - 1; if ( !list.isEmpty() && i > list.first() ) printer->newPage(); painter->resetXForm(); painter->fillRect( m_view->kPresenterDoc()->pageList().at( m_step.m_pageNumber )->getZoomPageRect(), white ); printPage( painter, step ); 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->pageList().count() + 2 ); 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() ) ); #if ! MASTERPAGE else { obj = m_activePage->masterPage()->getCursor( pos ); if(obj) setCursor( obj->getCursor( pos, modType,m_view->kPresenterDoc() ) ); } #endif } 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; } 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; } 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, this ) ) 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; kdDebug()<<" filename :"<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 ); //kdDebug()<<" QTextDrag::decode( e, text ); :"<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() { setSwitchingMode( false ); //setCursor( blankCursor ); int pg = m_step.m_pageNumber + 1; m_view->setPageDuration( m_step.m_pageNumber ); pg = KPGotoPage::gotoPage( m_view->kPresenterDoc(), m_presentationSlides, pg, this ); gotoPage( pg ); if ( !spManualSwitch() ) { m_view->setAutoPresTimer( 1 ); m_setPageTimer = true; } } void KPrCanvas::gotoPage( int pg ) { int page = pg - 1; if ( page != m_step.m_pageNumber || m_step.m_step != *m_pageEffectSteps.begin() || m_step.m_subStep != 0 ) { // clear drawed lines m_drawModeLines.clear(); goingBack = false; m_step.m_pageNumber = page; kdDebug(33001) << "Page::gotoPage m_step.m_pageNumber =" << m_step.m_pageNumber << endl; m_presentationSlidesIterator = m_presentationSlides.find( m_step.m_pageNumber + 1 ); editMode = false; m_drawMode = false; m_pageEffectSteps = m_view->kPresenterDoc()->getPageEffectSteps( m_step.m_pageNumber ); m_step.m_step = *m_pageEffectSteps.begin(); m_step.m_subStep = 0; #if 0 #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 #endif doObjEffects(); setFocus(); m_view->refreshPageButton(); } } void KPrCanvas::presGotoFirstPage() { gotoPage( *m_presentationSlides.begin() ); } KPTextObject* KPrCanvas::kpTxtObj() const { return ( ( editNum && editNum->getType() == OT_TEXT ) ? dynamic_cast( editNum ) : 0 ); // ### return m_currentTextObjectView->kpTextObject() } +void KPrCanvas::copyOasisObjs() +{ + //todo +} + 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; #if ! MASTERPAGE QPtrList embeddedObjectsStickyPage; #endif 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 ); #if ! MASTERPAGE m_activePage->masterPage()->getAllEmbeddedObjectSelected( embeddedObjectsStickyPage ); #endif // 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++ ) ); } #if ! MASTERPAGE QPtrListIterator chl2( embeddedObjectsStickyPage ); for( ; chl2.current(); ++chl2 ) { KoDocument* childDoc = chl2.current()->document(); if ( childDoc && !childDoc->isStoredExtern() ) (void) childDoc->saveToStore( store, QString::number( i++ ) ); } #endif m_activePage->copyObjs(doc, presenter, savePictures); #if ! MASTERPAGE m_activePage->masterPage()->copyObjs( doc, presenter, savePictures ); #endif KPresenterDoc* kprdoc = m_view->kPresenterDoc(); #if ! MASTERPAGE if ( !embeddedObjectsStickyPage.isEmpty() ) { kprdoc->saveEmbeddedObject( m_activePage->masterPage(), embeddedObjectsStickyPage, doc, presenter ); } #endif 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->deleteSelectedObjects(); if( cmd) { if ( !macro ) macro=new KMacroCommand(i18n( "Delete Objects" )); macro->addCommand(cmd); } #if ! MASTERPAGE cmd = m_activePage->masterPage()->deleteSelectedObjects(); if( cmd) { if ( !macro ) macro=new KMacroCommand(i18n( "Delete Objects" )); macro->addCommand(cmd); } #endif 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(); } 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::setDrawingMode() { m_presMenu->setItemChecked( PM_DM, true ); m_drawMode = true; setCursor( KPresenterUtils::penCursor() ); } void KPrCanvas::setSwitchingMode( bool continueTimer ) { m_presMenu->setItemChecked( PM_DM, false ); // the following have to be done even when nothing changed // we don't want to see the cursor nor the automatic pesentation stopped m_drawMode = false; m_drawLineInDrawMode = false; setCursor( blankCursor ); if ( continueTimer && !spManualSwitch() ) m_view->continueAutoPresTimer(); } 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 m_view->kPresenterDoc()->updateSideBarItem( m_activePage ); 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 ! MASTERPAGE if (!obj) obj = m_activePage->masterPage()->picViewOrigHelper(); #endif 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()->drawBackground( &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 } 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.right() ) || ( m_boundingRect.right() > pageRect.right() ) ) { point.setX( pageRect.right()-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.bottom() ) || ( m_boundingRect.bottom() > pageRect.bottom() ) ) { point.setY( pageRect.bottom() - 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); } #if ! MASTERPAGE cmd = m_activePage->masterPage()->moveObject( m_view, _move, key ); if( cmd && key) { if ( !macro) macro=new KMacroCommand(i18n( "Move Objects" )); macro->addCommand(cmd); } #endif 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 = m_resizeObject; QRect oldBoundingRect( getOldBoundingRect(kpobject) ); KoSize objSize = kpobject->getSize(); KoRect objRect=kpobject->getBoundingRect(); KoRect pageRect=m_activePage->getPageRect(); int pageNum = m_view->kPresenterDoc()->pageList().findRef( m_activePage ); QPainter p; p.begin( this ); kpobject->moveBy(m_view->zoomHandler()->unzoomItX(-diffx()),m_view->zoomHandler()->unzoomItY(-diffy())); kpobject->draw( &p, m_view->zoomHandler(), pageNum, 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 ( m_keepRatio && m_ratio != 0.0 ) calcRatio( dx, dy, _modType, m_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 ( m_keepRatio && m_ratio != 0.0 ) calcRatio( dx, dy, _modType, m_ratio ); kpobject->resizeBy( -dx, -dy ); if ( objSize != kpobject->getSize() ) kpobject->moveBy( KoPoint( dx, 0 ) ); } break; case MT_RESIZE_LD: { if( (objRect.bottom() + dy) > pageRect.bottom()) 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 ( m_keepRatio && m_ratio != 0.0 ) calcRatio( dx, dy, _modType, m_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.right() ) 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 ( m_keepRatio && m_ratio != 0.0 ) calcRatio( dx, dy, _modType, m_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.right() ) dx = pageRect.right() - objRect.right(); dx = applyGridX( objRect.right() + dx ) - objRect.right(); if ( m_keepRatio && m_ratio != 0.0 ) calcRatio( dx, dy, _modType, m_ratio ); kpobject->resizeBy( dx, dy ); } break; case MT_RESIZE_RD: { if( (objRect.bottom() + dy) > pageRect.bottom() ) dy = pageRect.bottom() - objRect.bottom(); if( (objRect.right() + dx) > pageRect.right() ) dx = pageRect.right() - objRect.right(); dx = applyGridX( objRect.right() + dx ) - objRect.right(); dy = applyGridY( objRect.bottom() + dy ) - objRect.bottom(); if ( m_keepRatio && m_ratio != 0.0 ) calcRatio( dx, dy, _modType, m_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 ( m_keepRatio && m_ratio != 0.0 ) calcRatio( dx, dy, _modType, m_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.bottom() ) dy = pageRect.bottom() - objRect.bottom(); dy = applyGridY( objRect.bottom() + dy ) - objRect.bottom(); if ( m_keepRatio && m_ratio != 0.0 ) calcRatio( dx, dy, _modType, m_ratio ); kpobject->resizeBy( dx, dy ); } break; default: break; } kpobject->draw( &p, m_view->zoomHandler(), pageNum, 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(); } void KPrCanvas::finishResizeObject( const QString &name, int mx, int my, bool layout ) { if ( m_resizeObject ) { KoPoint move = KoPoint( m_resizeObject->getOrig().x() - m_rectBeforeResize.x(), m_resizeObject->getOrig().y() - m_rectBeforeResize.y() ); KoSize size = KoSize( m_resizeObject->getSize().width() - m_rectBeforeResize.width(), m_resizeObject->getSize().height() - m_rectBeforeResize.height() ); if ( firstX != mx || firstY != my ) { ResizeCmd *resizeCmd = new ResizeCmd( name, move, size, m_resizeObject, m_view->kPresenterDoc() ); // the command is not executed as the object is allready resized. m_view->kPresenterDoc()->addCommand( resizeCmd ); } if ( layout ) m_view->kPresenterDoc()->layout( m_resizeObject ); _repaint( m_resizeObject ); m_resizeObject = NULL; m_ratio = 0.0; m_keepRatio = false; } } 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 { #if MASTERPAGE return m_activePage->oneObjectTextSelected(); #else return m_activePage->oneObjectTextSelected() || m_activePage->masterPage()->oneObjectTextSelected(); #endif } bool KPrCanvas::oneObjectTextExist() const { #if MASTERPAGE return m_activePage->oneObjectTextExist(); #else return m_activePage->oneObjectTextExist() || m_activePage->masterPage()->oneObjectTextExist(); #endif } KPrPage* KPrCanvas::activePage() const { return m_activePage; } void KPrCanvas::setActivePage( KPrPage* active ) { Q_ASSERT(active); //kdDebug(33001)<<"KPrCanvas::setActivePage( KPrPage* active) :"<kPresenterDoc()->isHeader(obj) && !m_view->kPresenterDoc()->hasHeader() ) || ( m_view->kPresenterDoc()->isFooter(obj) && !m_view->kPresenterDoc()->hasFooter() ) ) return true; return false; } int KPrCanvas::numberOfObjectSelected() const { int nb = m_activePage->numSelected(); #if ! MASTERPAGE nb += m_activePage->masterPage()->numSelected(); #endif return nb; } KPObject *KPrCanvas::getSelectedObj() const { KPObject *obj = m_activePage->getSelectedObj(); #if ! MASTERPAGE if(obj) return obj; obj = m_activePage->masterPage()->getSelectedObj(); #endif return obj; } int KPrCanvas::getPenBrushFlags() const { int flags=0; flags = m_activePage->getPenBrushFlags( m_activePage->objectList() ); #if ! MASTERPAGE flags |= m_activePage->masterPage()->getPenBrushFlags( m_activePage->masterPage()->objectList() ); #endif if(flags==0) flags = StyleDia::SdAll; return flags; } void KPrCanvas::ungroupObjects() { KMacroCommand *macro = 0; m_activePage->ungroupObjects( ¯o ); #if ! MASTERPAGE m_activePage->masterPage()->ungroupObjects( ¯o ); #endif if ( macro ) m_view->kPresenterDoc()->addCommand( macro ); } void KPrCanvas::groupObjects() { m_activePage->groupObjects(); #if ! MASTERPAGE m_activePage->masterPage()->groupObjects(); #endif } 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, QWidget *window ) { m_activePage->changePicture( url, window ); #if ! MASTERPAGE m_activePage->masterPage()->changePicture( url, window ); #endif } unsigned int KPrCanvas::objNums() const { #if MASTERPAGE return m_activePage->objNums(); #else return ( m_activePage->objNums() + m_activePage->masterPage()->objNums() ); #endif } 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() ); } } #if ! MASTERPAGE //get sticky obj it = m_activePage->masterPage()->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() ); } } #endif 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()); } } #if ! MASTERPAGE //get sticky obj it = m_activePage->masterPage()->objectList(); for ( ; it.current(); ++it ) { if ( it.current()->isSelected() ) { lst.append( it.current() ); listKeepRatio.append( it.current()->isKeepRatio()); } } #endif 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()); } } #if ! MASTERPAGE //get sticky obj it = m_activePage->masterPage()->objectList(); for ( ; it.current(); ++it ) { if ( it.current()->isSelected() ) { lst.append( it.current() ); listProt.append( it.current()->isProtect()); } } #endif 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); #if ! MASTERPAGE objBoundingRect = m_activePage->masterPage()->getBoundingAllObjectRect( objBoundingRect); #endif return objBoundingRect; } QPtrList KPrCanvas::listOfTextObjs() const { QPtrList lst; QPtrListIterator it(getObjectList()); #if ! MASTERPAGE for ( ; it.current(); ++it ) { if ( it.current()->getType() == OT_TEXT ) lst.append( static_cast( it.current() ) ); } //get sticky obj it = m_activePage->masterPage()->objectList(); #endif 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::alignObjects( AlignType at ) { KPresenterDoc * doc = m_view->kPresenterDoc(); QString name; switch ( at ) { case AT_LEFT: name = i18n( "Align Objects Left" ); break; case AT_TOP: name = i18n( "Align Objects Top" ); break; case AT_RIGHT: name = i18n( "Align Objects Right" ); break; case AT_BOTTOM: name = i18n( "Align Objects Bottom" ); break; case AT_HCENTER: name = i18n( "Align Objects Centered (horizontal)" ); break; case AT_VCENTER: name = i18n( "Align Objects Center/Vertical" ); break; } QPtrList objects; #if MASTERPAGE { QPtrListIterator it( m_activePage->objectList() ); #else for ( int i = 0; i < 2; ++i ) { QPtrListIterator it( i == 0 ? m_activePage->objectList() : m_activePage->masterPage()->objectList() ); #endif 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() ) { objects.append( it.current() ); } } } if ( objects.count() ) { KCommand * cmd = new AlignCmd( name, objects, at, doc ); cmd->execute(); doc->addCommand( cmd ); } } bool KPrCanvas::canMoveOneObject() const { #if MASTERPAGE return m_activePage->canMoveOneObject(); #else return ( m_activePage->canMoveOneObject() || m_activePage->masterPage()->canMoveOneObject() ); #endif } 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 { #if MASTERPAGE return m_activePage->getSticky( sticky ); #else bool result =m_activePage->getSticky( sticky ); if ( result != sticky) return result; return m_activePage->masterPage()->getSticky( sticky ); #endif } bool KPrCanvas::getProtect( bool prot ) const { #if MASTERPAGE return m_activePage->getProtect( prot ); #else bool result =m_activePage->getProtect( prot ); if ( result != prot) return result; return m_activePage->masterPage()->getProtect( prot ); #endif } bool KPrCanvas::differentProtect( bool p )const { #if MASTERPAGE return m_activePage->differentProtect( p ); #else bool result = m_activePage->differentProtect( p ); if ( result ) return true; return m_activePage->masterPage()->differentProtect( p ); #endif } bool KPrCanvas::getKeepRatio( bool _ratio ) const { #if MASTERPAGE return m_activePage->getKeepRatio( _ratio ); #else bool result =m_activePage->getKeepRatio( _ratio ); if ( result != _ratio) return result; return m_activePage->masterPage()->getKeepRatio( _ratio ); #endif } bool KPrCanvas::differentKeepRatio( bool p )const { #if MASTERPAGE return m_activePage->differentKeepRatio( p ); #else bool result = m_activePage->differentKeepRatio( p ); if ( result ) return true; return m_activePage->masterPage()->differentKeepRatio( p ); #endif } QPen KPrCanvas::getPen( const QPen & _pen )const { #if MASTERPAGE return m_activePage->getPen( _pen ); #else QPen pen = m_activePage->getPen( _pen ); if ( pen != _pen ) return pen; return m_activePage->masterPage()->getPen( _pen ); #endif } QBrush KPrCanvas::getBrush( const QBrush & _brush )const { #if MASTERPAGE return m_activePage->getBrush( _brush ); #else QBrush brush = m_activePage->getBrush( _brush ); if ( brush != _brush ) return brush; return m_activePage->masterPage()->getBrush( _brush ); #endif } LineEnd KPrCanvas::getLineBegin( LineEnd _end )const { #if MASTERPAGE return m_activePage->getLineBegin( _end ); #else LineEnd end = m_activePage->getLineBegin( _end ); if ( end != _end ) return end; return m_activePage->masterPage()->getLineBegin( _end ); #endif } LineEnd KPrCanvas::getLineEnd( LineEnd _end )const { #if MASTERPAGE return m_activePage->getLineEnd( _end ); #else LineEnd end = m_activePage->getLineEnd( _end ); if ( end != _end ) return end; return m_activePage->masterPage()->getLineEnd( _end ); #endif } FillType KPrCanvas::getFillType( FillType _fillType ) const { #if MASTERPAGE return m_activePage->getFillType( _fillType ); #else FillType fill = m_activePage->getFillType( _fillType ); if ( fill != _fillType ) return fill; return m_activePage->masterPage()->getFillType( _fillType ); #endif } QColor KPrCanvas::getGColor1( const QColor & _col )const { #if MASTERPAGE return m_activePage->getGColor1( _col ); #else QColor col = m_activePage->getGColor1( _col ); if ( col != _col ) return col; return m_activePage->masterPage()->getGColor1( _col ); #endif } QColor KPrCanvas::getGColor2( const QColor & _col )const { #if MASTERPAGE return m_activePage->getGColor2( _col ); #else QColor col = m_activePage->getGColor2( _col ); if ( col != _col ) return col; return m_activePage->masterPage()->getGColor2( _col ); #endif } BCType KPrCanvas::getGType( BCType _gt )const { #if MASTERPAGE return m_activePage->getGType( _gt ); #else BCType type = m_activePage->getGType( _gt ); if ( type != _gt ) return type; return m_activePage->masterPage()->getGType( _gt ); #endif } bool KPrCanvas::getGUnbalanced( bool _g )const { #if MASTERPAGE return m_activePage->getGUnbalanced( _g ); #else bool type= m_activePage->getGUnbalanced( _g ); if ( type != _g ) return type; return m_activePage->masterPage()->getGUnbalanced( _g ); #endif } int KPrCanvas::getGXFactor( int _g )const { #if MASTERPAGE return m_activePage->getGXFactor( _g ); #else int type= m_activePage->getGXFactor( _g ); if ( type != _g ) return type; return m_activePage->masterPage()->getGXFactor( _g ); #endif } int KPrCanvas::getGYFactor( int _g )const { #if MASTERPAGE return m_activePage->getGYFactor( _g ); #else int type= m_activePage->getGYFactor( _g ); if ( type != _g ) return type; return m_activePage->masterPage()->getGYFactor( _g ); #endif } int KPrCanvas::getRndY( int _ry )const { #if MASTERPAGE return m_activePage->getRndY(_ry); #else int value = m_activePage->getRndY(_ry); if (value != _ry) return value; return m_activePage->masterPage()->getRndY( _ry ); #endif } int KPrCanvas::getRndX( int _rx )const { #if MASTERPAGE return m_activePage->getRndX(_rx); #else int value = m_activePage->getRndX(_rx); if (value != _rx) return value; return m_activePage->masterPage()->getRndX( _rx ); #endif } int KPrCanvas::getPieAngle( int pieAngle )const { #if MASTERPAGE return m_activePage->getPieAngle(pieAngle); #else int value = m_activePage->getPieAngle(pieAngle); if (value != pieAngle) return value; return m_activePage->masterPage()->getPieAngle( pieAngle ); #endif } int KPrCanvas::getPieLength( int pieLength )const { #if MASTERPAGE return m_activePage->getPieLength(pieLength); #else int value = m_activePage->getPieLength(pieLength); if (value != pieLength) return value; return m_activePage->masterPage()->getPieLength( pieLength ); #endif } PieType KPrCanvas::getPieType( PieType pieType )const { #if MASTERPAGE return m_activePage->getPieType(pieType); #else PieType type = m_activePage->getPieType(pieType); if (type != pieType) return type; return m_activePage->masterPage()->getPieType( pieType ); #endif } bool KPrCanvas::getCheckConcavePolygon( bool check ) const { #if MASTERPAGE return m_activePage->getCheckConcavePolygon(check); #else bool value = m_activePage->getCheckConcavePolygon(check); if (value != check) return value; return m_activePage->masterPage()->getCheckConcavePolygon( check ); #endif } int KPrCanvas::getCornersValue( int corners ) const { #if MASTERPAGE return m_activePage->getCornersValue(corners); #else int value = m_activePage->getCornersValue(corners); if (value != corners) return value; return m_activePage->masterPage()->getCornersValue( corners ); #endif } int KPrCanvas::getSharpnessValue( int sharpness ) const { #if MASTERPAGE return m_activePage->getSharpnessValue(sharpness); #else int value = m_activePage->getSharpnessValue(sharpness); if (value != sharpness) return value; return m_activePage->masterPage()->getSharpnessValue( sharpness ); #endif } PictureMirrorType KPrCanvas::getPictureMirrorType( PictureMirrorType type ) const { #if MASTERPAGE return m_activePage->getPictureMirrorType(type); #else PictureMirrorType value = m_activePage->getPictureMirrorType(type); if (value != type) return value; return m_activePage->masterPage()->getPictureMirrorType( type ); #endif } int KPrCanvas::getPictureDepth( int depth ) const { #if MASTERPAGE return m_activePage->getPictureDepth(depth); #else int value = m_activePage->getPictureDepth(depth); if (value != depth) return value; return m_activePage->masterPage()->getPictureDepth( depth ); #endif } bool KPrCanvas::getPictureSwapRGB( bool swapRGB ) const { #if MASTERPAGE return m_activePage->getPictureSwapRGB(swapRGB); #else bool value = m_activePage->getPictureSwapRGB(swapRGB); if (value != swapRGB) return value; return m_activePage->masterPage()->getPictureSwapRGB( swapRGB ); #endif } bool KPrCanvas::getPictureGrayscal( bool grayscal ) const { #if MASTERPAGE return m_activePage->getPictureGrayscal(grayscal); #else bool value = m_activePage->getPictureGrayscal(grayscal); if (value != grayscal) return value; return m_activePage->masterPage()->getPictureGrayscal( grayscal ); #endif } int KPrCanvas::getPictureBright( int bright ) const { #if MASTERPAGE return m_activePage->getPictureBright(bright); #else int value = m_activePage->getPictureBright(bright); if (value != bright) return value; return m_activePage->masterPage()->getPictureBright( bright ); #endif } QPixmap KPrCanvas::getPicturePixmap() const { #if MASTERPAGE return m_activePage->getPicturePixmap(); #else QPixmap pixmap = m_activePage->getPicturePixmap(); if (!pixmap.isNull()) return pixmap; return m_activePage->masterPage()->getPicturePixmap(); #endif } 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 ); } } #if ! MASTERPAGE //get sticky obj it = m_activePage->masterPage()->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 ); } } #endif return macro; } bool KPrCanvas::getProtectContent(bool prot) const { #if MASTERPAGE return m_activePage->getProtectContent(prot); #else bool result =m_activePage->getProtectContent(prot); if ( result != prot) return result; return m_activePage->masterPage()->getProtectContent( prot ); #endif } 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() ); } #if ! MASTERPAGE //get sticky obj it = m_activePage->masterPage()->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() ); } #endif 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(); } #if ! MASTERPAGE it = m_activePage->masterPage()->objectList(); for ( ; it.current(); ++it ) { if ( it.current()->getType() == OT_TEXT ) static_cast( it.current() )->layout(); } #endif } 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 ); } #if ! MASTERPAGE cmd = m_activePage->masterPage()->alignVertical( _type ); if ( cmd ) { if ( !macro ) macro = new KMacroCommand( i18n("Change Vertical Alignment")); macro->addCommand(cmd ); } #endif if ( macro ) m_view->kPresenterDoc()->addCommand( macro ); } ImageEffect KPrCanvas::getImageEffect(ImageEffect eff) const { #if MASTERPAGE return m_activePage->getImageEffect(eff); #else ImageEffect value = m_activePage->getImageEffect(eff); if (value != eff) return value; return m_activePage->masterPage()->getImageEffect(eff); #endif } KPPixmapObject * KPrCanvas::getSelectedImage() const { #if MASTERPAGE return m_activePage->getSelectedImage(); #else KPPixmapObject *obj = m_activePage->getSelectedImage(); if(obj) return obj; obj = m_activePage->masterPage()->getSelectedImage(); return obj; #endif } 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 e162d2b80c..7420855387 100644 --- a/kpresenter/kprcanvas.h +++ b/kpresenter/kprcanvas.h @@ -1,817 +1,818 @@ // -*- 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 Copyright (C) 2002-2004 Thorsten Zachmann 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 #include #include #include "koPointArray.h" #include "global.h" #include #include #include "presstep.h" class KURL; class KoTextFormatInterface; class KPresenterView; class KPresenterDoc; class QPainter; class KTextEdit; class KPTextObject; class KPObject; class KPopupMenu; 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 EffectHandler; class KPPageEffects; /** * 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 KPrCanvas( QWidget *parent=0,const char *name=0,KPresenterView *_view=0 ); /// destructor ~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 @p curPgNum is -1, otherwise just @p curPgNum (1-based) */ void startScreenPresentation( double zoomX, double zoomY, int curPgNum = -1); void stopScreenPresentation(); /** * Go to the next step in the presentation. * gotoNextPage: if is set to true go to beginning of the * next page. */ bool pNext( bool gotoNextPage = false ); /** * Go to previous step of the presentation. * gotoPreviousPage: if is set to true go to beginning of the * previous page. */ bool pPrev( bool gotoPreviousPage = false ); /// returns the current page of the presentation 1 based unsigned int presPage() const { return m_step.m_pageNumber + 1; } /// returns the current step of the presentation int presStep() const { return m_step.m_step; } int numPresSteps() const { return m_pageEffectSteps.count(); } int numPresPages() const { return m_presentationSlides.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; } /** \brief Draw page into QPixmap. Draws page pgnum of the currently open presentation into a QPixmap using the specified zoom factor (or fixed width/height dimensions, resp.) Set forceWidth and/or forceHeight to override the zoom factor and obtain a pixmap of the specified width and/or height. By omitting one of them you make sure that the aspect ratio of your page is used for the resulting image. \sa exportPage */ void drawPageInPix( QPixmap&, int pgnum, int zoom, bool forceRealVariableValue = false, int forceWidth = 0, int forceHeight = 0 ); /** \brief Save page to bitmap file. Export a page of the currently open presentation to disk using a bitmap format like e.g. PNG. This method uses a QPixmap::save() call. \param nPage the internally used 0-based page number \param nWidth the desired image width in px \param nHeight the desired image height in px \param fileURL the URL of the image file to be created: if this does not point to a local file a KTempFile is created by QPixmap::save() which is then copied over to the desired location. \param format the format of the image file (see QPixmap::save()) \param quality the quality of the image (see QPixmap::save()) example: \verbatim exportPage( 0, s, 800, 600, "/home/khz/page0.png", "PNG", 100 ); \endverbatim \returns True if the file was written successfully. \sa drawPageInPix, KPresenterViewIface::exportPage */ bool exportPage( int nPage, int nWidth, int nHeight, const KURL& fileURL, const char* format, int quality = -1 ); 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 playSound( const QString &soundFileName ); 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, QWidget *window ); 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; /** * Align all selected and not protected objects on the * active and on the sticky page according to the AlignType */ void alignObjects( AlignType at ); 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 copyOasisObjs(); 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 ); /** * Emmitted when presentation should be restarted * This is used in automatic screen and infinite loop mode. */ void stopAutomaticPresentation(); /** * Emmitted when presentation should be restarted * This is used in automatic screen and infinite loop mode. */ void restartPresentation(); 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 /** * This method is used for repainting the canvas. */ virtual void paintEvent( QPaintEvent* ); /** * Draws the background of page to painter. * Set edit to true if in edit mode, false in presentation mode. */ void drawBackground( QPainter* painter, const QRect& rect, KPrPage * page, bool edit = false ) const; /** * Draw obj to painter. */ void drawAllObjectsInPage( QPainter *painter, const QPtrList & obj, int pageNum ) const; /** * Draw _objects shown at step to painter. * This method is used for presentation mode, printing. */ void drawObjectsPres( QPainter *painter, const QPtrList &_objects, PresStep step ) const; /** * Draw _objects to painter. * Only rect is painted. * This method is used for edit mode. */ - void drawObjectsEdit( QPainter *painter, const KoRect &rect, const QPtrList &_objects, + void drawObjectsEdit( QPainter *painter, const KoRect &rect, const QPtrList &_objects, SelectionMode selectionMode, int page ) const; /** * Draw _objects to painter. * contour if true only countor of selected objects is drawn * selectionMode selected objects use this selection mode * textView if set print editable textobject (used by drawObjectsEdit) * This method is used by drawObjectsPres and drawObjectsEdit. */ void drawObjects( QPainter *painter, const QPtrList &objects, SelectionMode selectionMode, bool contour, KPTextView * textView, int pageNum ) const; /** * Draw _objects of page to painter. * This method is used for edit mode. */ void drawEditPage( QPainter *painter, const QRect &_rect, KPrPage *page, SelectionMode selectionMode ) const; /** * Draw _objects of page shown at step to painter. * This method is used for presentation mode, printing. */ void drawPresPage( QPainter *painter, const QRect &_rect, PresStep step ) 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; /** * Finish the object effects. * This shown the last step of the effect. It stops the effect timer and * disconnect it and the effect handler deleted. */ bool finishObjectEffects(); bool finishPageEffect( bool cancel = false ); 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 ); /** - * Returns the object at position pos + * Returns the object at position pos * @param pos the position in the document on which to look * @param withoutProtected if set to true only unprotecred objects are returned * @return the object at position pos */ KPObject *getObjectAt( const KoPoint &pos, bool withoutProtected = false ); 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; 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 ); /** * Draw page defined in step to painter. * This method is used for printing a presentation. */ void printPage( QPainter*, PresStep step ); /** * This method animates the objects in the presentation. */ void doObjEffects( bool isAllreadyPainted = false ); 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 void moveHelpLine(const QPoint & pos); void tmpMoveHelpLine( const QPoint & newPos); void moveHelpPoint( const QPoint & newPos ); void scrollCanvas(const KoRect& oldPos); KoRect getAlignBoundingRect() const; private: void picViewOrigHelper(int x, int y); void moveObject( int x, int y, bool key ); //---- stuff needed for resizing ---- /// resize the m_resizeObject void resizeObject( ModifyType _modType, int _dx, int _dy ); /// create ResizeCmd void finishResizeObject( const QString &name, int mx, int my, bool layout = true ); void raiseObject( KPObject *_kpobject ); void lowerObject(); int selectedObjectPosition; /** * This is used in automatic presentation mode. * If it is set to true and we are in automatic presentation * mode the timer of the page will be activated after the last * effect has been shown. */ bool m_setPageTimer; void drawPolygon( const KoPoint &startPoint, const KoPoint &endPoint ); void drawPieObject(QPainter *p, const QRect & ); void limitSizeOfObject(); QPoint limitOfPoint(const QPoint& _point) const; void calcBoundingRect(); /** * Return true if object is a header/footer which is hidden. */ 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 ); } /** * Switch to drawing mode. In drawing mode it is possible to draw on the * current slide. * Only to be used in presentation mode. */ void setDrawingMode(); /** * Set switching mode. This ends drawing mode and goes back to * stepping between the pages. * If continueTimer is true the autoPres timer is continued * Only to be used in presentation mode. */ void setSwitchingMode( bool continueTimer = true ); void slotGotoPage(); void slotExitPres(); void terminateEditing( KPTextObject * ); /** * Do the next step of the object effect. * This restarts the effect tmer. If the effects are * completed the timer is disconnected and the effect handler * deleted. */ void slotDoEffect(); void slotDoPageEffect(); private: // variables /// Popup menu used in presentation mode. KPopupMenu *m_presMenu; bool showingLastSlide; bool mousePressed; bool drawContour; ModifyType modType; /** * Saves the last mouse position during mouse move events. */ QPoint m_savedMousePos; KPObject *editNum; bool fillBlack; KPresenterView *m_view; bool editMode, goingBack; /** * True when we are in drawing mode. * False when we are in switching mode. */ bool m_drawMode; /** * True if the a line should be drawn. * Used in drawing mode. */ bool m_drawLineInDrawMode; /** * Save the lines drawed in drawMode. * This is used for paint events. * Used in drawing mode. */ QValueVector m_drawModeLines; /** * Index into the QPointArray for the next point of the line in draw mode. * Used in drawing mode. */ int m_drawModeLineIndex; bool mouseSelectedObject; /// information about current step of the presentation PresStep m_step; float _presFakt; int m_showOnlyPage; // 1-based (-1 = all) /// list of all effect steps occuring on the active page QValueList m_pageEffectSteps; /// List of the slides used in the presentation QValueList m_presentationSlides; /// Iterator over the slides of a presentation QValueList::Iterator m_presentationSlidesIterator; /// EffectHandler for object effects EffectHandler *m_effectHandler; KPPageEffects *m_pageEffect; /// EffectTimer QTimer m_effectTimer; QTimer m_pageEffectTimer; /// menu identifier for draw mode int PM_DM; int firstX, firstY; int delPageId; bool drawRubber; QRect rubber; //---- stuff needed for resizing ---- /// object which gets resized KPObject *m_resizeObject; /// size of the object at when resizing is started KoRect m_rectBeforeResize; /// should the ratio of the object kept during resize bool m_keepRatio; /// ratio of the object ( width / height ) double m_ratio; //---- stuff needed for rotating ---- /// object which gets rotated KPObject *m_rotateObject; /// center of the rotated object KoPoint m_rotateCenter; /// angle of the object at start of rotate double m_angleBeforeRotate; ToolEditMode toolEditMode; QRect insRect; KoDocumentEntry partEntry; QString autoform; 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_doc.cc b/kpresenter/kpresenter_doc.cc index db808cf76d..221ab419e0 100644 --- a/kpresenter/kpresenter_doc.cc +++ b/kpresenter/kpresenter_doc.cc @@ -1,4327 +1,4337 @@ /* 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 "kpresenter_doc.h" #include "kpresenter_view.h" #include "kprcanvas.h" #include "kprpage.h" #include "kpobject.h" #include "kplineobject.h" #include "kprectobject.h" #include "kpellipseobject.h" #include "kpautoformobject.h" #include "kptextobject.h" #include "kprtextdocument.h" #include "kppixmapobject.h" #include "kppieobject.h" #include "kppartobject.h" #include "kpgroupobject.h" #include "kprcommand.h" #include "styledia.h" #include "insertpagedia.h" #include "kpfreehandobject.h" #include "kppolylineobject.h" #include "kpquadricbeziercurveobject.h" #include "kpcubicbeziercurveobject.h" #include "kppolygonobject.h" #include "kpclosedlineobject.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 #include #include #include #include #include #include #include #include #include #include #include "KPresenterDocIface.h" #include #include #include #include #include "kprvariable.h" #include "kpbackground.h" #include "notebar.h" #include "kprbgspellcheck.h" #include #include #include "koApplication.h" #include #include #include "kprloadinginfo.h" using namespace std; static const int CURRENT_SYNTAX_VERSION = 2; // Make sure an appropriate DTD is available in www/koffice/DTD if changing this value static const char * CURRENT_DTD_VERSION = "1.2"; KPresenterChild::KPresenterChild( KPresenterDoc *_kpr, KoDocument* _doc, const QRect& _rect ) : KoDocumentChild( _kpr, _doc, _rect ) { m_parent = _kpr; } KPresenterChild::KPresenterChild( KPresenterDoc *_kpr ) : KoDocumentChild( _kpr ) { m_parent = _kpr; } KPresenterChild::~KPresenterChild() { } KoDocument *KPresenterChild::hitTest( const QPoint &, const QWMatrix & ) { return 0L; } KPresenterDoc::KPresenterDoc( QWidget *parentWidget, const char *widgetName, QObject* parent, const char* name, bool singleViewMode ) : KoDocument( parentWidget,widgetName, parent, name, singleViewMode ), _gradientCollection(), m_bHasHeader( false ), m_bHasFooter( false ) { setInstance( KPresenterFactory::global() ); //Necessary to define page where we load object otherwise copy-duplicate page doesn't work. if (KGlobal::locale()->measureSystem() == KLocale::Imperial) { m_unit = KoUnit::U_INCH; } else { m_unit = KoUnit::U_CM; } m_pageWhereLoadObject=0L; m_loadingInfo=0L; m_tabStop = MM_TO_POINT( 15.0 ); m_styleColl=new KoStyleCollection(); m_insertFilePage = 0; m_picturePath= KGlobalSettings::documentPath(); m_globalLanguage = KGlobal::locale()->language(); m_bGlobalHyphenation = false; _duplicatePage=false; KoParagStyle* m_standardStyle = new KoParagStyle( "Standard" ); m_styleColl->addStyleTemplate( m_standardStyle ); KConfig *config = KPresenterFactory::global()->config(); config->setGroup("Document defaults" ); QString defaultFontname=config->readEntry("DefaultFont"); if ( !defaultFontname.isEmpty() ) m_defaultFont.fromString( defaultFontname ); // If not found, we automatically fallback to the application font (the one from KControl's font module) // Try to force a scalable font. m_defaultFont.setStyleStrategy( QFont::ForceOutline ); //kdDebug(33001) << "Default font: requested family: " << m_defaultFont.family() << endl; //kdDebug(33001) << "Default font: real family: " << QFontInfo(m_defaultFont).family() << endl; int ptSize = m_defaultFont.pointSize(); if ( ptSize == -1 ) // specified with a pixel size ? ptSize = QFontInfo(m_defaultFont).pointSize(); //kdDebug(33001) << "KPresenterDoc::KPresenterDoc[2] ptSize=" << ptSize << endl; // Ok, this is KPresenter. A default font of 10 makes no sense. Let's go for 20. ptSize = QMAX( 20, ptSize ); m_standardStyle->format().setFont( m_defaultFont ); /// KPresenter isn't color-scheme aware, it defaults to black on white. m_standardStyle->format().setColor( Qt::black ); if( config->hasGroup("Interface") ) { config->setGroup( "Interface" ); m_globalLanguage=config->readEntry("language", KGlobal::locale()->language()); m_bGlobalHyphenation=config->readBoolEntry("hyphenation", false); } m_standardStyle->format().setLanguage( m_globalLanguage); m_zoomHandler = new KoZoomHandler; m_varFormatCollection = new KoVariableFormatCollection; m_varColl = new KPrVariableCollection( new KoVariableSettings(), m_varFormatCollection ); #ifdef HAVE_LIBKSPELL2 m_bgSpellCheck = new KPrBgSpellCheck(this); #endif dcop = 0; m_initialActivePage=0; m_bShowStatusBar = true; m_autoFormat = new KoAutoFormat(this,m_varColl,m_varFormatCollection); _clean = true; _spInfiniteLoop = false; _spManualSwitch = true; _showPresentationDuration = false; tmpSoundFileList = QPtrList(); _xRnd = 20; _yRnd = 20; _txtBackCol = lightGray; _otxtBackCol = lightGray; m_bShowRuler=true; m_bAllowAutoFormat = true; m_bViewFormattingChars = false; m_bShowHelplines = false; m_bHelplinesToFront = false; m_bShowGrid = true; m_bGridToFont = false; m_bSnapToGrid = true; m_cursorInProtectectedArea=true; usedSoundFile = QStringList(); haveNotOwnDiskSoundFile = QStringList(); m_zoomHandler->setZoomAndResolution( 100, KoGlobal::dpiX(), KoGlobal::dpiY() ); newZoomAndResolution(false,false); // _pageLayout.format = PG_SCREEN; // _pageLayout.orientation = PG_PORTRAIT; // _pageLayout.width = PG_SCREEN_WIDTH; // _pageLayout.height = PG_SCREEN_HEIGHT; // _pageLayout.left = 0; // _pageLayout.right = 0; // _pageLayout.top = 0; // _pageLayout.bottom = 0; // _pageLayout.ptWidth = cMM_TO_POINT( PG_SCREEN_WIDTH ); // _pageLayout.ptHeight = cMM_TO_POINT( PG_SCREEN_HEIGHT ); // _pageLayout.ptLeft = 0; // _pageLayout.ptRight = 0; // _pageLayout.ptTop = 0; // _pageLayout.ptBottom = 0; //_pageLayout.unit = KoUnit::U_MM; m_indent = MM_TO_POINT( 10.0 ); m_gridX = MM_TO_POINT( 5.0 ); m_gridY = MM_TO_POINT( 5.0 ); oldGridX = m_gridX; oldGridY = m_gridY; m_masterPage=new KPrPage(this); KPrPage *newpage = new KPrPage( this, m_masterPage ); m_pageList.insert( 0,newpage); m_bInsertDirectCursor = false; objStartY = 0; setPageLayout( m_pageLayout ); _presPen = QPen( red, 3, SolidLine ); ignoreSticky = TRUE; raiseAndLowerObject = false; m_gridColor=Qt::black; _header = new KPTextObject( this ); _header->setDrawEditRect( false ); _header->setDrawEmpty( false ); _footer = new KPTextObject( this ); _footer->setDrawEditRect( false ); _footer->setDrawEmpty( false ); saveOnlyPage = -1; m_maxRecentFiles = 10; connect( QApplication::clipboard(), SIGNAL( dataChanged() ), this, SLOT( clipboardDataChanged() ) ); m_commandHistory = new KoCommandHistory( actionCollection(), true ) ; initConfig(); connect( m_commandHistory, SIGNAL( documentRestored() ), this, SLOT( slotDocumentRestored() ) ); connect( m_commandHistory, SIGNAL( commandExecuted() ), this, SLOT( slotCommandExecuted() ) ); connect(m_varColl,SIGNAL(repaintVariable()),this,SLOT(slotRepaintVariable())); if ( name ) dcopObject(); } void KPresenterDoc::refreshMenuCustomVariable() { emit sig_refreshMenuCustomVariable(); } void KPresenterDoc::slotDocumentRestored() { setModified( false ); } void KPresenterDoc::slotCommandExecuted() { setModified( true ); } void KPresenterDoc::setUnit( KoUnit::Unit _unit ) { m_unit = _unit; QPtrListIterator it( views() ); for( ; it.current(); ++it ) { ((KPresenterView*)it.current())->getHRuler()->setUnit( m_unit ); ((KPresenterView*)it.current())->getVRuler()->setUnit( m_unit ); } } void KPresenterDoc::saveConfig() { if ( isEmbedded() || !isReadWrite()) return; KConfig *config = KPresenterFactory::global()->config(); config->setGroup( "Interface" ); config->writeEntry( "Zoom", m_zoomHandler->zoom() ); config->writeEntry( "AllowAutoFormat" , m_bAllowAutoFormat ); config->writeEntry( "ViewFormattingChars", m_bViewFormattingChars ); config->writeEntry( "ShowGrid" , m_bShowGrid ); config->writeEntry( "GridToFront" , m_bGridToFont ); config->writeEntry( "SnapToGrid" , m_bSnapToGrid ); config->writeEntry( "ResolutionX", m_gridX ); config->writeEntry( "ResolutionY", m_gridY ); config->writeEntry( "HelpLineToFront" , m_bHelplinesToFront ); } void KPresenterDoc::initConfig() { int zoom; KConfig* config = KPresenterFactory::global()->config(); if( config->hasGroup("Interface") ) { config->setGroup( "Interface" ); setAutoSave( config->readNumEntry( "AutoSave", defaultAutoSave()/60 ) * 60 ); setBackupFile( config->readBoolEntry("BackupFile", true)); setCursorInProtectedArea( config->readBoolEntry( "cursorInProtectArea", true )); // Config-file value in mm, default 10 pt double indent = config->readDoubleNumEntry("Indent", MM_TO_POINT(10.0) ) ; setIndentValue(indent); m_maxRecentFiles = config->readNumEntry( "NbRecentFile", 10 ); setShowRuler(config->readBoolEntry("Rulers",true)); zoom = config->readNumEntry( "Zoom", 100 ); setShowStatusBar( config->readBoolEntry( "ShowStatusBar" , true )); setAllowAutoFormat( config->readBoolEntry( "AllowAutoFormat" , true )); setViewFormattingChars( config->readBoolEntry( "ViewFormattingChars", false ) ); setShowGrid( config->readBoolEntry( "ShowGrid" , true )); setGridToFront( config->readBoolEntry( "GridToFront" , false )); setSnapToGrid( config->readBoolEntry( "SnapToGrid", true )); setGridX( config->readDoubleNumEntry( "ResolutionX", MM_TO_POINT( 5.0 ) )); setGridY( config->readDoubleNumEntry( "ResolutionY", MM_TO_POINT( 5.0 ) )); setHelpLineToFront( config->readBoolEntry( "HelpLineToFront" , false )); m_bInsertDirectCursor= config->readBoolEntry( "InsertDirectCursor", false ); m_globalLanguage=config->readEntry("language", KGlobal::locale()->language()); } else zoom=100; QColor oldBgColor = Qt::white; QColor oldGridColor = Qt::black; if ( config->hasGroup( "KPresenter Color" ) ) { config->setGroup( "KPresenter Color" ); setTxtBackCol(config->readColorEntry( "BackgroundColor", &oldBgColor )); setGridColor(config->readColorEntry( "GridColor", &oldGridColor )); } if( config->hasGroup("KSpell kpresenter" ) ) { config->setGroup( "KSpell kpresenter" ); // Default is false for spellcheck, but the spell-check config dialog // should write out "true" when the user configures spell checking. #ifdef HAVE_LIBKSPELL2 if ( isReadWrite() ) m_bgSpellCheck->setEnabled(config->readBoolEntry( "SpellCheck", false )); else m_bgSpellCheck->setEnabled( false ); #endif } int undo=30; if(config->hasGroup("Misc" ) ) { config->setGroup( "Misc" ); undo=config->readNumEntry("UndoRedo",-1); } if(undo!=-1) setUndoRedoLimit(undo); if(config->hasGroup("Kpresenter Path" ) ) { config->setGroup( "Kpresenter Path" ); m_picturePath=config->readPathEntry( "picture path",KGlobalSettings::documentPath()); setBackupPath(config->readPathEntry( "backup path" )); } // Apply configuration, without creating an undo/redo command replaceObjs( false ); zoomHandler()->setZoom( zoom ); newZoomAndResolution(false,false); } DCOPObject* KPresenterDoc::dcopObject() { if ( !dcop ) dcop = new KPresenterDocIface( this ); return dcop; } KPresenterDoc::~KPresenterDoc() { if(isReadWrite()) saveConfig(); //Be carefull !!!!!! don't delete this pointer delete in stickypage #if 0 delete _header; delete _footer; #endif delete m_commandHistory; delete m_zoomHandler; delete m_autoFormat; delete m_varColl; delete m_varFormatCollection; delete dcop; delete m_masterPage; #ifdef HAVE_LIBKSPELL2 delete m_bgSpellCheck; #endif delete m_styleColl; m_pageList.setAutoDelete( true ); m_pageList.clear(); m_deletedPageList.setAutoDelete( true ); m_deletedPageList.clear(); tmpSoundFileList.setAutoDelete( true ); tmpSoundFileList.clear(); } void KPresenterDoc::addCommand( KCommand * cmd ) { kdDebug(33001) << "KPresenterDoc::addCommand " << cmd->name() << endl; m_commandHistory->addCommand( cmd, false ); setModified( true ); } bool KPresenterDoc::saveChildren( KoStore* _store ) { int i = 0; if ( saveOnlyPage == -1 ) // Don't save all children into template for one page // ###### TODO: save objects that are on that page { QPtrListIterator it( children() ); for( ; it.current(); ++it ) { // Don't save children that are only in the undo/redo history // but not anymore in the presentation QPtrListIterator pageIt( m_pageList ); for ( ; pageIt.current(); ++pageIt ) { QPtrListIterator oIt(pageIt.current()->objectList()); for (; oIt.current(); ++oIt ) { if ( oIt.current()->getType() == OT_PART && dynamic_cast( oIt.current() )->getChild() == it.current() ) { if (((KoDocumentChild*)(it.current()))->document()!=0) if ( !((KoDocumentChild*)(it.current()))->document()->saveToStore( _store, QString::number( i++ ) ) ) return false; } } } QPtrListIterator oIt(m_masterPage->objectList()); for (; oIt.current(); ++oIt ) { if ( oIt.current()->getType() == OT_PART && dynamic_cast( oIt.current() )->getChild() == it.current() ) { if (((KoDocumentChild*)(it.current()))->document()!=0) if ( !((KoDocumentChild*)(it.current()))->document()->saveToStore( _store, QString::number( i++ ) ) ) return false; } } } } return true; } QDomDocument KPresenterDoc::saveXML() { if ( saveOnlyPage == -1 ) { emit sigProgress( 0 ); } m_varColl->variableSetting()->setModificationDate(QDateTime::currentDateTime()); recalcVariables( VT_DATE ); recalcVariables( VT_TIME ); QDomDocument doc = createDomDocument( "DOC", CURRENT_DTD_VERSION ); QDomElement presenter=doc.documentElement(); presenter.setAttribute("editor", "KPresenter"); presenter.setAttribute("mime", "application/x-kpresenter"); presenter.setAttribute("syntaxVersion", CURRENT_SYNTAX_VERSION); QDomElement paper=doc.createElement("PAPER"); paper.setAttribute("format", static_cast( m_pageLayout.format )); paper.setAttribute("ptWidth", m_pageLayout.ptWidth); paper.setAttribute("ptHeight", m_pageLayout.ptHeight); paper.setAttribute("orientation", static_cast( m_pageLayout.orientation )); paper.setAttribute("unit", m_unit ); paper.setAttribute("tabStopValue", m_tabStop ); QDomElement paperBorders=doc.createElement("PAPERBORDERS"); paperBorders.setAttribute("ptLeft", m_pageLayout.ptLeft); paperBorders.setAttribute("ptTop", m_pageLayout.ptTop); paperBorders.setAttribute("ptRight", m_pageLayout.ptRight); paperBorders.setAttribute("ptBottom", m_pageLayout.ptBottom); paper.appendChild(paperBorders); presenter.appendChild(paper); m_varColl->variableSetting()->save(presenter ); presenter.appendChild(saveAttribute( doc )); if ( saveOnlyPage == -1 ) emit sigProgress( 5 ); QDomElement element=doc.createElement("BACKGROUND"); element.appendChild(saveBackground( doc )); presenter.appendChild(element); if ( saveOnlyPage == -1 ) emit sigProgress( 10 ); element=doc.createElement("HEADER"); element.setAttribute("show", static_cast( hasHeader() )); element.appendChild(_header->save( doc,0 )); presenter.appendChild(element); element=doc.createElement("FOOTER"); element.setAttribute("show", static_cast( hasFooter() )); element.appendChild(_footer->save( doc,0 )); presenter.appendChild(element); element=doc.createElement("HELPLINES"); element.setAttribute("show", static_cast( showHelplines() )); saveHelpLines( doc, element ); presenter.appendChild(element); if ( saveOnlyPage == -1 ) { if( !m_spellListIgnoreAll.isEmpty() ) { QDomElement spellCheckIgnore = doc.createElement( "SPELLCHECKIGNORELIST" ); presenter.appendChild( spellCheckIgnore ); for ( QStringList::Iterator it = m_spellListIgnoreAll.begin(); it != m_spellListIgnoreAll.end(); ++it ) { QDomElement spellElem = doc.createElement( "SPELLCHECKIGNOREWORD" ); spellCheckIgnore.appendChild( spellElem ); spellElem.setAttribute( "word", *it ); } } } if ( saveOnlyPage == -1 ) emit sigProgress( 20 ); presenter.appendChild(saveTitle( doc )); presenter.appendChild(saveNote( doc )); if ( saveOnlyPage == -1 ) emit sigProgress( 30 ); presenter.appendChild(saveObjects(doc)); // ### If we will create a new version of the file format, fix that spelling error element=doc.createElement("INFINITLOOP"); element.setAttribute("value", _spInfiniteLoop); presenter.appendChild(element); element=doc.createElement("MANUALSWITCH"); element.setAttribute("value", _spManualSwitch); presenter.appendChild(element); element=doc.createElement("PRESSPEED"); //TODO FIXME !!!!!!!!!! //element.setAttribute("value", static_cast( presSpeed )); presenter.appendChild(element); element=doc.createElement("SHOWPRESENTATIONDURATION"); element.setAttribute("value", _showPresentationDuration); presenter.appendChild(element); if ( saveOnlyPage == -1 ) emit sigProgress( 40 ); if ( saveOnlyPage == -1 ) { element=doc.createElement("SELSLIDES"); for ( uint i = 0; i < m_pageList.count(); i++ ) { QDomElement slide=doc.createElement("SLIDE"); slide.setAttribute("nr", i); slide.setAttribute("show", m_pageList.at(i)->isSlideSelected()); element.appendChild(slide); } presenter.appendChild(element); emit sigProgress( 50 ); } if ( saveOnlyPage == -1 ) { QDomElement styles = doc.createElement( "STYLES" ); presenter.appendChild( styles ); QPtrList styleList(m_styleColl->styleList()); for ( KoParagStyle * p = styleList.first(); p != 0L; p = styleList.next() ) saveStyle( p, styles ); emit sigProgress( 60 ); } // Write "OBJECT" tag for every child QPtrListIterator chl( children() ); for( ; chl.current(); ++chl ) { // Don't save children that are only in the undo/redo history // but not anymore in the presentation for ( int i = 0; i < static_cast( m_pageList.count() ); i++ ) { if ( saveOnlyPage != -1 && i != saveOnlyPage ) continue; double offset=i*m_pageList.at(i)->getPageRect().height(); saveEmbeddedObject(m_pageList.at(i), chl.current(),doc,presenter,offset ); } saveEmbeddedObject(m_masterPage, chl.current(),doc,presenter,0.0 ); } if ( saveOnlyPage == -1 ) emit sigProgress( 70 ); makeUsedPixmapList(); if (specialOutputFlag()==SaveAsKOffice1dot1) m_pictureCollection.saveXMLAsKOffice1Dot1( doc, presenter, usedPictures ); else { QDomElement pictures = m_pictureCollection.saveXML( KoPictureCollection::CollectionPicture, doc, usedPictures ); presenter.appendChild( pictures ); } if ( saveOnlyPage == -1 ) emit sigProgress( 90 ); // Save sound file list. makeUsedSoundFileList(); QDomElement soundFiles = saveUsedSoundFileToXML( doc, usedSoundFile ); presenter.appendChild( soundFiles ); setModified( false ); return doc; } void KPresenterDoc::saveEmbeddedObject(KPrPage *page, const QPtrList& childList, QDomDocument &doc,QDomElement &presenter ) { QPtrListIterator chl( childList ); double offset=m_pageList.findRef(page)*page->getPageRect().height(); for( ; chl.current(); ++chl ) saveEmbeddedObject(page, chl.current(),doc,presenter, offset ); } void KPresenterDoc::saveEmbeddedObject(KPrPage *page, KoDocumentChild *chl, QDomDocument &doc, QDomElement &presenter, double offset ) { QPtrListIterator oIt(page->objectList()); for (; oIt.current(); ++oIt ) { if ( oIt.current()->getType() == OT_PART && static_cast( oIt.current() )->getChild() == chl ) { QDomElement embedded=doc.createElement("EMBEDDED"); KPresenterChild* curr = (KPresenterChild*)chl; // geometry is no zoom value ! QRect _rect = curr->geometry(); int tmpX = (int)zoomHandler()->unzoomItX( _rect.x() ); int tmpY = (int)zoomHandler()->unzoomItY( _rect.y() ); int tmpWidth = (int)zoomHandler()->unzoomItX( _rect.width() ); int tmpHeight = (int)zoomHandler()->unzoomItY( _rect.height() ); curr->setGeometry( QRect( tmpX, tmpY, tmpWidth, tmpHeight ) ); embedded.appendChild(curr->save(doc, true)); curr->setGeometry( _rect ); // replace zoom value QDomElement settings=doc.createElement("SETTINGS"); if ( oIt.current()->isSticky() ) settings.setAttribute("sticky", 1 ); QPtrListIterator setOIt(page->objectList()); for (; setOIt.current(); ++setOIt ) { if ( setOIt.current()->getType() == OT_PART && dynamic_cast( setOIt.current() )->getChild() == curr ) settings.appendChild(setOIt.current()->save( doc,offset )); } embedded.appendChild(settings); presenter.appendChild(embedded); } } } void KPresenterDoc::compatibilityPresSpeed() { if ( m_loadingInfo && m_loadingInfo->presSpeed != - 1 ) { if ( m_loadingInfo->presSpeed != -1 ) { EffectSpeed newValue = ES_MEDIUM; if ( m_loadingInfo->presSpeed < 3 ) newValue = ES_SLOW; else if ( m_loadingInfo->presSpeed > 7 ) newValue = ES_FAST; //todo when we save with old format create compatibility for ( int i = 0; i < static_cast( m_pageList.count() ); i++ ) { m_pageList.at(i)->background()->setPageEffectSpeed( newValue ); } } delete m_loadingInfo; m_loadingInfo = 0L; } } void KPresenterDoc::enableEmbeddedParts( bool f ) { QPtrListIterator it( m_pageList ); for ( ; it.current(); ++it ) it.current()->enableEmbeddedParts(f); } QDomDocumentFragment KPresenterDoc::saveBackground( QDomDocument &doc ) { KPBackGround *kpbackground = 0; QDomDocumentFragment fragment=doc.createDocumentFragment(); for ( int i = 0; i < static_cast( m_pageList.count() ); i++ ) { if ( saveOnlyPage != -1 && i != saveOnlyPage ) continue; kpbackground = m_pageList.at(i)->background(); fragment.appendChild(kpbackground->save( doc, (specialOutputFlag()==SaveAsKOffice1dot1) )); } return fragment; } QDomElement KPresenterDoc::saveObjects( QDomDocument &doc ) { QDomElement objects=doc.createElement("OBJECTS"); double yoffset=0.0; for ( int i = 0; i < static_cast( m_pageList.count() ); i++ ) { if ( saveOnlyPage != -1 && saveOnlyPage!=i) continue; yoffset=i*m_pageList.at(i)->getPageRect().height(); // yoffset is not zoom value !! objects=m_pageList.at(i)->saveObjects( doc, objects, yoffset, m_zoomHandler, saveOnlyPage ); } if ( !_duplicatePage ) //don't copy sticky objects when we duplicate page { //offset = 0.0 when it's a sticky page. objects=m_masterPage->saveObjects( doc, objects, /*yoffset*/0.0, m_zoomHandler, saveOnlyPage ); } return objects; } QDomElement KPresenterDoc::saveTitle( QDomDocument &doc ) { QDomElement titles=doc.createElement("PAGETITLES"); if ( saveOnlyPage == -1 ) { // All page titles. for ( int i = 0; i < static_cast( m_pageList.count() ); i++ ) { QDomElement title=doc.createElement("Title"); title.setAttribute("title", m_pageList.at(i)->manualTitle()); titles.appendChild(title); } } else { // Only current page title. QDomElement title=doc.createElement("Title"); title.setAttribute("title", m_pageList.at(saveOnlyPage)->manualTitle()); titles.appendChild(title); } return titles; } QDomElement KPresenterDoc::saveNote( QDomDocument &doc ) { QDomElement notes=doc.createElement("PAGENOTES"); if ( saveOnlyPage == -1 ) { // All page notes. for ( int i = 0; i < static_cast( m_pageList.count() ); i++ ) { QDomElement note=doc.createElement("Note"); note.setAttribute("note", m_pageList.at(i)->noteText( )); notes.appendChild(note); } } else { // Only current page note. QDomElement note=doc.createElement("Note"); note.setAttribute("note", m_pageList.at(saveOnlyPage)->noteText( )); notes.appendChild(note); } return notes; } QDomElement KPresenterDoc::saveAttribute( QDomDocument &doc ) { QDomElement attributes=doc.createElement("ATTRIBUTES"); //store first view parameter. int activePage=0; if ( m_initialActivePage ) activePage=m_pageList.findRef(m_initialActivePage); activePage = QMAX( activePage, 0); attributes.setAttribute("activePage",activePage ); attributes.setAttribute("gridx", m_gridX ); attributes.setAttribute("gridy", m_gridY ); attributes.setAttribute("snaptogrid", (int)m_bSnapToGrid ); return attributes; } QDomElement KPresenterDoc::saveUsedSoundFileToXML( QDomDocument &_doc, QStringList _list ) { QDomElement soundFiles = _doc.createElement( "SOUNDS" ); unsigned int i = 0; QStringList::Iterator it = _list.begin(); for ( ; it != _list.end(); ++it ) { QString soundFileName = *it; int position = soundFileName.findRev( '.' ); QString format = soundFileName.right( soundFileName.length() - position - 1 ); QString _name = QString( "sounds/sound%1.%2" ).arg( ++i ).arg( format.lower() ); QDomElement fileElem = _doc.createElement( "FILE" ); soundFiles.appendChild( fileElem ); fileElem.setAttribute( "filename", soundFileName ); fileElem.setAttribute( "name", _name ); } return soundFiles; } bool KPresenterDoc::completeSaving( KoStore* _store ) { if ( !_store ) { if ( saveOnlyPage == -1 ) { emit sigProgress( 100 ); emit sigProgress( -1 ); } return true; } if (specialOutputFlag()==SaveAsKOffice1dot1) m_pictureCollection.saveToStoreAsKOffice1Dot1( KoPictureCollection::CollectionImage, _store, usedPictures ); else m_pictureCollection.saveToStore( KoPictureCollection::CollectionPicture, _store, usedPictures ); saveUsedSoundFileToStore( _store, usedSoundFile ); if ( saveOnlyPage == -1 ) { emit sigProgress( 100 ); emit sigProgress( -1 ); } return true; } void KPresenterDoc::saveUsedSoundFileToStore( KoStore *_store, QStringList _list ) { unsigned int i = 0; QStringList::Iterator it = _list.begin(); for ( ; it != _list.end(); ++it ) { QString soundFileName = *it; int position = soundFileName.findRev( '.' ); QString format = soundFileName.right( soundFileName.length() - position - 1 ); QString _storeURL = QString( "sounds/sound%1.%2" ).arg( ++i ).arg( format.lower() ); if ( _store->open( _storeURL ) ) { KoStoreDevice dev( _store ); QFile _file( soundFileName ); if ( _file.open( IO_ReadOnly ) ) { dev.writeBlock( ( _file.readAll() ).data(), _file.size() ); _file.close(); } _store->close(); } } } bool KPresenterDoc::loadChildren( KoStore* _store ) { if ( objStartY == 0 && _clean) // Don't do this when inserting a template or a page... { QPtrListIterator it( children() ); for( ; it.current(); ++it ) { if ( !((KoDocumentChild*)it.current())->loadDocument( _store ) ) return false; } } return true; } bool KPresenterDoc::saveOasis( KoStore* store, KoXmlWriter* manifestWriter ) { //todo necessary for new format ? if ( saveOnlyPage == -1 ) { emit sigProgress( 0 ); } if ( !store->open( "content.xml" ) ) return false; m_pictureCollection.assignUniqueIds(); KoStoreDevice contentDev( store ); KoXmlWriter contentWriter( &contentDev, "office:document-content" ); m_varColl->variableSetting()->setModificationDate(QDateTime::currentDateTime()); recalcVariables( VT_DATE ); recalcVariables( VT_TIME ); KoGenStyles mainStyles; KoSavingContext savingContext( mainStyles, KoSavingContext::Store ); // Save user styles as KoGenStyle objects KoSavingContext::StyleNameMap map = m_styleColl->saveOasis( mainStyles, KoGenStyle::STYLE_USER ); savingContext.setStyleNameMap( map ); KTempFile contentTmpFile; contentTmpFile.setAutoDelete( true ); QFile* tmpFile = contentTmpFile.file(); KoXmlWriter contentTmpWriter( tmpFile, 1 ); //For sticky objects KTempFile stickyTmpFile; stickyTmpFile.setAutoDelete( true ); QFile* tmpStickyFile = stickyTmpFile.file(); KoXmlWriter stickyTmpWriter( tmpStickyFile, 1 ); contentTmpWriter.startElement( "office:body" ); contentTmpWriter.startElement( "office:presentation" ); int indexObj = 1; int partIndexObj = 0; //save page for ( int i = 0; i < static_cast( m_pageList.count() ); i++ ) { m_pageList.at( i )->saveOasisPage( store, contentTmpWriter, ( i+1 ), savingContext, indexObj, partIndexObj , manifestWriter); } m_masterPage->saveOasisStickyPage( store, stickyTmpWriter , savingContext, indexObj,partIndexObj, manifestWriter ); saveOasisHeaderFooter( stickyTmpWriter , savingContext ); saveOasisPresentationSettings( contentTmpWriter ); contentTmpWriter.endElement(); //office:presentation contentTmpWriter.endElement(); //office:body writeAutomaticStyles( contentWriter, mainStyles ); // And now we can copy over the contents from the tempfile to the real one tmpFile->close(); contentWriter.addCompleteElement( tmpFile ); contentTmpFile.close(); contentWriter.endElement(); // root element contentWriter.endDocument(); if ( !store->close() ) // done with content.xml return false; KoGenStyle pageLayout = m_pageLayout.saveOasis(); mainStyles.lookup( pageLayout, "pm" ); //add manifest line for content.xml manifestWriter->addManifestEntry( "content.xml", "text/xml" ); if ( !store->open( "styles.xml" ) ) return false; manifestWriter->addManifestEntry( "styles.xml", "text/xml" ); //todo fixme???? tmpStickyFile->close(); saveOasisDocumentStyles( store, mainStyles, tmpStickyFile ); stickyTmpFile.close(); if ( !store->close() ) // done with styles.xml return false; if ( saveOnlyPage == -1 ) emit sigProgress( 90 ); // Save sound file list. //todo ???? makeUsedPixmapList(); m_pictureCollection.saveOasisToStore( store, usedPictures, manifestWriter); if(!store->open("settings.xml")) return false; KoXmlWriter settingsWriter(&contentDev, "office:document-settings"); settingsWriter.startElement("office:settings"); settingsWriter.startElement("config:config-item-set"); settingsWriter.addAttribute("config:name", "view-settings"); settingsWriter.startElement( "config:config-item-map-indexed" ); settingsWriter.addAttribute( "config:name", "Views" ); settingsWriter.startElement("config:config-item-map-entry" ); KoUnit::saveOasis(&settingsWriter, m_unit); saveOasisSettings( settingsWriter ); settingsWriter.endElement(); //config:config-item-map-entry settingsWriter.endElement(); //config:config-item-map-indexed settingsWriter.endElement(); // config:config-item-set settingsWriter.startElement("config:config-item-set"); settingsWriter.addAttribute("config:name", "configuration-settings"); saveOasisIgnoreList( settingsWriter ); settingsWriter.endElement(); // config:config-item-set settingsWriter.endElement(); // office:settings settingsWriter.endElement(); // Root element settingsWriter.endDocument(); if(!store->close()) return false; manifestWriter->addManifestEntry("settings.xml", "text/xml"); //reset progressbar emit sigProgress( 100 ); emit sigProgress( -1 ); setModified( false ); return true; } void KPresenterDoc::saveOasisIgnoreList( KoXmlWriter &settingsWriter ) { settingsWriter.startElement("config:config-item-map-entry" ); settingsWriter.addConfigItem("SpellCheckerIgnoreList", m_spellListIgnoreAll.join( "," ) ); settingsWriter.endElement(); } void KPresenterDoc::loadOasisIgnoreList( const QDomDocument&settingsDoc ) { KoOasisSettings settings( settingsDoc ); bool tmp = settings.selectItemSet( "configuration-settings" ); kdDebug()<<" settings : configuration-settings :"< styles = mainStyles.styles( KoGenStyle::STYLE_AUTO ); QValueList::const_iterator it = styles.begin(); for ( ; it != styles.end() ; ++it ) { (*it).style->writeStyle( &contentWriter, mainStyles, "style:style", (*it).name, "style:paragraph-properties" ); } styles = mainStyles.styles( KoGenStyle::STYLE_LIST ); it = styles.begin(); for ( ; it != styles.end() ; ++it ) { ( *it ).style->writeStyle( &contentWriter, mainStyles, "text:list-style", (*it).name, 0 ); } styles = mainStyles.styles( STYLE_BACKGROUNDPAGEAUTO ); it = styles.begin(); for ( ; it != styles.end() ; ++it ) { (*it).style->writeStyle( &contentWriter, mainStyles, "style:style", (*it).name, "style:drawing-page-properties" ); } styles = mainStyles.styles( STYLE_GRAPHICAUTO ); it = styles.begin(); for ( ; it != styles.end() ; ++it ) { (*it).style->writeStyle( &contentWriter, mainStyles, "style:style", (*it).name , "style:graphic-properties" ); } contentWriter.endElement(); // office:automatic-styles } void KPresenterDoc::saveOasisHeaderFooter( KoXmlWriter & stickyTmpWriter , KoSavingContext& context ) { stickyTmpWriter.startElement( "style:header" ); header()->textObject()->saveOasisContent( stickyTmpWriter, context ); stickyTmpWriter.endElement(); stickyTmpWriter.startElement( "style:footer" ); footer()->textObject()->saveOasisContent( stickyTmpWriter, context ); stickyTmpWriter.endElement(); } void KPresenterDoc::loadOasisHeaderFooter(QDomNode & drawPage, KoOasisContext & context) { QDomNode tmp = drawPage.namedItem( "style:header" ); if ( !tmp.isNull() ) { //kdDebug()<<" there is a header \n"; _header->textObject()->loadOasisContent( tmp.toElement(), context, styleCollection() ); } tmp = drawPage.namedItem( "style:footer" ); if ( !tmp.isNull() ) { //kdDebug()<<" there is a footer \n"; _footer->textObject()->loadOasisContent( tmp.toElement(), context, styleCollection() ); } } void KPresenterDoc::saveOasisSettings( KoXmlWriter &settingsWriter ) { //ooimpress save it as this line. //H2260V14397H7693H12415H15345H1424 QString helpLineOasis; //save in mm as in oo for(QValueList::Iterator it = m_vertHelplines.begin(); it != m_vertHelplines.end(); ++it) { int tmpX = ( int ) ( KoUnit::toMM( *it )*100 ); helpLineOasis+="V"+QString::number( tmpX ); } for(QValueList::Iterator it = m_horizHelplines.begin(); it != m_horizHelplines.end(); ++it) { int tmpY = ( int ) ( KoUnit::toMM( *it )*100 ); helpLineOasis+="H"+QString::number( tmpY ); } for(QValueList::Iterator it = m_helpPoints.begin(); it != m_helpPoints.end(); ++it) { QString str( "P%1,%2" ); int tmpX = ( int ) ( KoUnit::toMM( ( *it ).x() )*100 ); int tmpY = ( int ) ( KoUnit::toMM( ( *it ).y() )*100 ); helpLineOasis+=str.arg( QString::number( tmpX ) ).arg( QString::number( tmpY ) ); } if ( !helpLineOasis.isEmpty() ) { settingsWriter.addConfigItem("SnapLinesDrawing", helpLineOasis ); } //false settingsWriter.addConfigItem( "IsSnapToGrid", m_bSnapToGrid ); //500 settingsWriter.addConfigItem( "GridFineWidth", ( ( int ) ( KoUnit::toMM( ( m_gridX ) )*100 ) ) ); //500 settingsWriter.addConfigItem( "GridFineHeight", ( ( int ) ( KoUnit::toMM( ( m_gridY ) )*100 ) ) ); //3 //store first view parameter. int activePage=0; if ( m_initialActivePage ) activePage=m_pageList.findRef(m_initialActivePage); activePage = QMAX( activePage, 0); settingsWriter.addConfigItem( "SelectedPage", activePage ); //not define into oo spec settingsWriter.addConfigItem( "SnapLineIsVisible", showHelplines() ); } void KPresenterDoc::loadOasisSettings(const QDomDocument&settingsDoc) { KoOasisSettings settings( settingsDoc ); bool tmp = settings.selectItemSet( "view-settings" ); //kdDebug()<<" settings : view-settings :"<=0;--pos ) { if ( text[pos]=='P' ) { //point str = text.mid( pos+1, ( newPos-pos ) ); //kdDebug()<<" point element :"<< str < } void KPresenterDoc::saveOasisDocumentStyles( KoStore* store, KoGenStyles& mainStyles, QFile* tmpStyckyFile ) const { QString pageLayoutName; KoStoreDevice stylesDev( store ); KoXmlWriter stylesWriter( &stylesDev, "office:document-styles" ); stylesWriter.startElement( "office:styles" ); QValueList styles = mainStyles.styles( KoGenStyle::STYLE_USER ); QValueList::const_iterator it = styles.begin(); for ( ; it != styles.end() ; ++it ) { (*it).style->writeStyle( &stylesWriter, mainStyles, "style:style", (*it).name, "style:paragraph-properties" ); } styles = mainStyles.styles( STYLE_HATCH ); it = styles.begin(); for ( ; it != styles.end() ; ++it ) { (*it).style->writeStyle( &stylesWriter, mainStyles, "draw:hatch", (*it).name, "style:graphic-properties" , true, true /*add draw:name*/); } styles = mainStyles.styles( STYLE_GRADIENT ); it = styles.begin(); for ( ; it != styles.end() ; ++it ) { (*it).style->writeStyle( &stylesWriter, mainStyles, "draw:gradient", (*it).name, "style:graphic-properties" , true, true /*add draw:name*/); } styles = mainStyles.styles( STYLE_STROKE ); it = styles.begin(); for ( ; it != styles.end() ; ++it ) { (*it).style->writeStyle( &stylesWriter, mainStyles, "draw:stroke-dash", (*it).name, "style:graphic-properties" , true, true /*add draw:name*/); } styles = mainStyles.styles( STYLE_MARKER ); it = styles.begin(); for ( ; it != styles.end() ; ++it ) { (*it).style->writeStyle( &stylesWriter, mainStyles, "draw:marker", (*it).name, "style:graphic-properties" , true, true /*add draw:name*/); } styles = mainStyles.styles( STYLE_PICTURE ); it = styles.begin(); for ( ; it != styles.end() ; ++it ) { (*it).style->writeStyle( &stylesWriter, mainStyles, "draw:fill-image", (*it).name, "style:image-properties" , true, true /*add draw:name*/); } stylesWriter.endElement(); // office:styles stylesWriter.startElement( "office:automatic-styles" ); styles = mainStyles.styles( STYLE_BACKGROUNDPAGE ); it = styles.begin(); for ( ; it != styles.end() ; ++it ) { (*it).style->writeStyle( &stylesWriter, mainStyles, "style:style", (*it).name , "style:drawing-page-properties" ); } styles = mainStyles.styles( KoGenStyle::STYLE_PAGELAYOUT ); Q_ASSERT( styles.count() == 1 ); it = styles.begin(); for ( ; it != styles.end() ; ++it ) { (*it).style->writeStyle( &stylesWriter, mainStyles, "style:page-layout", (*it).name, "style:page-layout-properties", false /*don't close*/ ); //if ( m_pageLayout.columns > 1 ) TODO add columns element. This is a bit of a hack, // which only works as long as we have only one page master stylesWriter.endElement(); Q_ASSERT( pageLayoutName.isEmpty() ); // if there's more than one pagemaster we need to rethink all this pageLayoutName = (*it).name; } styles = mainStyles.styles( STYLE_PRESENTATIONSTICKYOBJECT ); it = styles.begin(); for ( ; it != styles.end() ; ++it ) { //TODO fix me graphic-properties ??? (*it).style->writeStyle( &stylesWriter, mainStyles, "style:style", (*it).name , "style:graphic-properties" ); } stylesWriter.endElement(); // office:automatic-styles //code from kword stylesWriter.startElement( "office:master-styles" ); stylesWriter.startElement( "style:master-page" ); stylesWriter.addAttribute( "style:name", "Standard" ); stylesWriter.addAttribute( "style:page-layout-name", pageLayoutName ); //save sticky object stylesWriter.addCompleteElement( tmpStyckyFile ); stylesWriter.endElement(); stylesWriter.endElement(); // office:master-style stylesWriter.endElement(); // root element (office:document-styles) stylesWriter.endDocument(); } bool KPresenterDoc::loadOasis( const QDomDocument& doc, KoOasisStyles&oasisStyles, const QDomDocument&settingsDoc, KoStore*store ) { QTime dt; dt.start(); m_loadingInfo = new KPRLoadingInfo; ignoreSticky = FALSE; emit sigProgress( 0 ); int activePage=0; lastObj = -1; bool allSlides = false; // clean if ( _clean ) { __pgLayout = KoPageLayoutDia::standardLayout(); _spInfiniteLoop = false; _spManualSwitch = true; _showPresentationDuration = false; _xRnd = 20; _yRnd = 20; urlIntern = url().path(); } else m_spellListIgnoreAll.clear(); emit sigProgress( 5 ); QDomElement content = doc.documentElement(); QDomElement body ( content.namedItem( "office:body" ).toElement() ); if ( body.isNull() ) { kdError(33001) << "No office:body found!" << endl; setErrorMessage( i18n( "Invalid document. No mimetype specified." ) ); return false; } body = body.namedItem( "office:presentation" ).toElement(); if ( body.isNull() ) { kdError(33001) << "No office:presentation found!" << endl; setErrorMessage( i18n( "Invalid document. No mimetype specified." ) ); return false; } //load settings QDomElement settings = body.namedItem("presentation:settings").toElement(); if (!settings.isNull() && !_clean /*don't load settings when we copy/paste a page*/) { //kdDebug()<<"presentation:settings ********************************************* \n"; if (settings.attribute("presentation:endless")=="true") _spInfiniteLoop = true; if (settings.attribute("presentation:force-manual")=="true") _spManualSwitch = true; } // it seems that ooimpress has different paper-settings for every slide. // we take the settings of the first slide for the whole document. QDomNode drawPage = body.namedItem( "draw:page" ); if ( drawPage.isNull() ) // no slides? give up. return false; QDomElement dp = drawPage.toElement(); m_loadingInfo = new KPRLoadingInfo; //code from kword // TODO variable settings // By default display real variable value if ( !isReadWrite()) getVariableCollection()->variableSetting()->setDisplayFieldCode(false); KoOasisContext context( this, *m_varColl, oasisStyles, store ); Q_ASSERT( !oasisStyles.officeStyle().isNull() ); // Load all styles before the corresponding paragraphs try to use them! m_styleColl->loadOasisStyleTemplates( context ); QString masterPageName = "Standard"; // use default layout as fallback QDomElement *master = oasisStyles.masterPages()[ masterPageName]; kdDebug()<<" load sticky oasis object \n"; kdDebug()<<" master.isNull() :"<isNull()<attribute( "style:page-layout-name" )] : 0; QDomElement *backgroundStyle = oasisStyles.styles()[ "Standard-background"]; kdDebug()<<"Standard background "<" as page { context.styleStack().clear(); // remove all styles fillStyleStack( dp, context ); context.styleStack().save(); kdDebug ()<<"insert new page "<insertManualTitle(dp.attribute( "draw:name" )); //necessary to create a unique name for page QString str = dp.attribute( "draw:name" ); QString idPage = dp.attribute( "draw:id" ); if ( str != QString( "page%1" ).arg( idPage ) ) newpage->insertManualTitle(str); context.styleStack().setTypeProperties( "drawing-page" ); if ( context.styleStack().hasAttribute( "draw:fill" ) || context.styleStack().hasAttribute( "presentation:transition-style" ) ) { kdDebug()<<" fill or presentation-style found \n"; //m_pageList.at(pos)->background()->loadOasis( context ); newpage->background()->loadOasis( context ); } else if ( !context.styleStack().hasAttribute( "draw:fill" ) && backgroundStyle) { context.styleStack().save(); context.addStyles( backgroundStyle ); //m_pageList.at( pos )->background()->loadOasis(context); newpage->background()->loadOasis(context); context.styleStack().restore(); kdDebug()<<" load standard background \n"; } //All animation object for current page is store into this element createPresentationAnimation(drawPage.namedItem("presentation:animations").toElement()); // parse all objects loadOasisObject(pos, newpage, drawPage, context); context.styleStack().restore(); m_loadingInfo->clearAnimationShowDict(); // clear all show animations style m_loadingInfo->clearAnimationHideDict(); // clear all hide animations style } } setModified(false); ignoreSticky = TRUE; kdDebug()<<" _clean :"<<_clean<loadOasis(o, context, m_loadingInfo); if ( groupObject ) groupObject->addObjects( kptextobject ); else newpage->appendObject(kptextobject); } else if ( name == "draw:rect" ) // rectangle { fillStyleStack( o, context ); KPRectObject *kprectobject = new KPRectObject(); kprectobject->loadOasis(o, context , m_loadingInfo); if ( groupObject ) groupObject->addObjects( kprectobject ); else newpage->appendObject(kprectobject); } else if ( name == "draw:circle" || name == "draw:ellipse" ) { fillStyleStack( o, context ); if ( o.hasAttribute( "draw:kind" ) ) // pie, chord or arc { KPPieObject *kppieobject = new KPPieObject(); kppieobject->loadOasis(o, context, m_loadingInfo); if ( groupObject ) groupObject->addObjects( kppieobject ); else newpage->appendObject(kppieobject); } else // circle or ellipse { KPEllipseObject *kpellipseobject = new KPEllipseObject(); kpellipseobject->loadOasis(o,context, m_loadingInfo); if ( groupObject ) groupObject->addObjects( kpellipseobject ); else newpage->appendObject(kpellipseobject); } } else if ( name == "draw:line" ) // line { fillStyleStack( o, context ); KPLineObject *kplineobject = new KPLineObject(); kplineobject->loadOasis(o, context, m_loadingInfo); newpage->appendObject(kplineobject); } else if (name=="draw:polyline") { // polyline fillStyleStack( o, context ); KPPolylineObject *kppolylineobject = new KPPolylineObject(); kppolylineobject->loadOasis(o, context, m_loadingInfo); if ( groupObject ) groupObject->addObjects( kppolylineobject ); else newpage->appendObject(kppolylineobject); } else if (name=="draw:polygon") { // plcloseobject fillStyleStack( o, context ); KPClosedLineObject *kpClosedObject = new KPClosedLineObject(); kpClosedObject->loadOasis( o, context, m_loadingInfo); if ( groupObject ) groupObject->addObjects( kpClosedObject ); else newpage->appendObject(kpClosedObject); } //FIXME wait that it will ok'ed by oo spec else if (name=="draw:regular-polygon") { // kppolygone object fillStyleStack( o, context ); KPPolygonObject *kpPolygoneObject = new KPPolygonObject(); kpPolygoneObject->loadOasis( o, context, m_loadingInfo); if ( groupObject ) groupObject->addObjects( kpPolygoneObject ); else newpage->appendObject(kpPolygoneObject); } else if ( name == "draw:image" ) // image { fillStyleStack( o, context ); KPPixmapObject *kppixmapobject = new KPPixmapObject( pictureCollection() ); kppixmapobject->loadOasis( o, context, m_loadingInfo); if ( groupObject ) groupObject->addObjects( kppixmapobject ); else newpage->appendObject(kppixmapobject); } else if ( name == "draw:path" ) { //we have 4 elements to use here. //Cubicbeziercurve/Quadricbeziercurve/closeline/KPFreehandObject //we must parse svd:d argument // "z" close element // "c" cubic element // "q" quadic element // parse line we use relative position // see http://www.w3.org/TR/SVG/paths.html#PathData // see svgpathparser.cc (ksvg) QString pathDefinition = o.attribute("svg:d"); kdDebug()<<"pathDefinition :"<loadOasis( o, context, m_loadingInfo); if ( groupObject ) groupObject->addObjects( kpCurveObject ); else newpage->appendObject( kpCurveObject ); } else if ( pathDefinition.contains( "q" ) ) { kdDebug()<<"Quadricbeziercurve \n"; KPQuadricBezierCurveObject *kpQuadricObject = new KPQuadricBezierCurveObject(); kpQuadricObject->loadOasis( o, context, m_loadingInfo); if ( groupObject ) groupObject->addObjects( kpQuadricObject ); else newpage->appendObject( kpQuadricObject ); } else { kdDebug()<<"KPFreehandObject \n"; KPFreehandObject *kpFreeHandObject = new KPFreehandObject(); kpFreeHandObject->loadOasis( o, context, m_loadingInfo); if ( groupObject ) groupObject->addObjects( kpFreeHandObject ); else newpage->appendObject( kpFreeHandObject ); } } else if ( name == "draw:g" ) { fillStyleStack( o, context ); KPGroupObject *kpgroupobject = new KPGroupObject(); QDomNode nodegroup = object.firstChild(); kpgroupobject->loadOasisGroupObject( this, pos, newpage, object, context, m_loadingInfo); if ( groupObject ) groupObject->addObjects( kpgroupobject ); else newpage->appendObject(kpgroupobject); } else if ( name == "draw:object" ) { fillStyleStack( o, context ); KPresenterChild *ch = new KPresenterChild( this ); QRect r; KPPartObject *kppartobject = new KPPartObject( ch ); kppartobject->loadOasis( o, context, m_loadingInfo ); r = ch->geometry(); if ( groupObject ) groupObject->addObjects( kppartobject ); else newpage->appendObject(kppartobject); insertChild( ch ); kppartobject->setOrig( r.x(), r.y() ); kppartobject->setSize( r.width(), r.height() ); } else if ( name == "presentation:notes" ) // notes { //we must extend note attribute //kdDebug()<<"presentation:notes----------------------------------\n"; QDomNode textBox = o.namedItem( "draw:text-box" ); if ( !textBox.isNull() ) { QString note; for ( QDomNode text = textBox.firstChild(); !text.isNull(); text = text.nextSibling() ) { // We don't care about styles as they are not supported in kpresenter. // Only add a linebreak for every child. QDomElement t = text.toElement(); note += t.text() + "\n"; } m_pageList.at(pos)->setNoteText(note ); } } else if ( name == "style:header" || name == "style:footer" ) { //nothing } else { kdDebug() << "Unsupported object '" << name << "'" << endl; context.styleStack().restore(); continue; } context.styleStack().restore(); } } int KPresenterDoc::createPresentationAnimation(const QDomElement& element, int order, bool increaseOrder) { kdDebug()<<"void KPresenterDoc::createPresentationAnimation(const QDomElement& element)\n"; int orderAnimation = increaseOrder ? 0 : order; for ( QDomNode n = element.firstChild(); !n.isNull(); n = n.nextSibling() ) { QDomElement e = n.toElement(); QCString tagName = e.tagName().latin1(); kdDebug()<<"(createPresentationAnimation) tagName found :"<element = ep; tmp->order = orderAnimation; m_loadingInfo->storePresentationShowAnimation( tmp, name ); if ( increaseOrder ) ++orderAnimation; } else if ( tagName == "presentation:hide-shape") { Q_ASSERT( e.hasAttribute( "draw:shape-id" ) ); QString name = e.attribute( "draw:shape-id" ); kdDebug()<<" insert animation hide style : name :"<element = ep; tmp->order = orderAnimation; m_loadingInfo->storePresentationHideAnimation( tmp, name ); if ( increaseOrder ) ++orderAnimation; } else if ( tagName == "presentation:animation-group" ) { kdDebug()<<" presentation:animation-group exist \n"; orderAnimation = createPresentationAnimation( e, orderAnimation, false ); kdDebug()<<" end presentation:animation-group exist\n"; } } //increase when we finish it necessary for group object ++orderAnimation; return orderAnimation; } void KPresenterDoc::fillStyleStack( const QDomElement& object, KoOasisContext & context ) { // find all styles associated with an object and push them on the stack if ( object.hasAttribute( "presentation:style-name" )) { //kdDebug()<<"Add 'presentation:style-name' \n"; addStyles( context.oasisStyles().styles()[object.attribute( "presentation:style-name" )], context ); } if ( object.hasAttribute( "draw:style-name" ) ) { //kdDebug()<<"draw:style-name :"<hasAttribute( "style:parent-style-name" ) ) addStyles( context.oasisStyles().styles()[style->attribute( "style:parent-style-name" )], context ); context.addStyles( style ); } bool KPresenterDoc::loadXML( QIODevice * dev, const QDomDocument& doc ) { QTime dt; dt.start(); m_loadingInfo = new KPRLoadingInfo; ignoreSticky = FALSE; bool b=false; QDomElement docelem = doc.documentElement(); const int syntaxVersion = docelem.attribute( "syntaxVersion" ).toInt(); if ( syntaxVersion < 2 ) { // This is an old style document, before the current TextObject // We have kprconverter.pl for it kdWarning(33001) << "KPresenter document version 1. Launching perl script to convert it." << endl; // Read the full XML and write it to a temp file KTempFile tmpFileIn; tmpFileIn.setAutoDelete( true ); dev->reset(); tmpFileIn.file()->writeBlock( dev->readAll() ); // copy stresm to temp file tmpFileIn.close(); // Launch the perl script on it KTempFile tmpFileOut; tmpFileOut.setAutoDelete( true ); QString cmd = KGlobal::dirs()->findExe("perl"); if (cmd.isEmpty()) { setErrorMessage( i18n("You don't appear to have PERL installed.\nIt is needed to convert this document.\nPlease install PERL and try again.")); return false; } cmd += " "; cmd += locate( "exe", "kprconverter.pl" ); cmd += " "; cmd += KProcess::quote( tmpFileIn.name() ); cmd += " "; cmd += KProcess::quote( tmpFileOut.name() ); system( QFile::encodeName(cmd) ); // Build a new QDomDocument from the result QString errorMsg; int errorLine; int errorColumn; QDomDocument newdoc; if ( ! newdoc.setContent( tmpFileOut.file(), &errorMsg, &errorLine, &errorColumn ) ) { kdError (33001) << "Parsing Error! Aborting! (in KPresenterDoc::loadXML)" << endl << " Line: " << errorLine << " Column: " << errorColumn << endl << " Message: " << errorMsg << endl; setErrorMessage( i18n( "parsing error in the main document (converted from an old KPresenter format) at line %1, column %2\nError message: %3" ) .arg( errorLine ).arg( errorColumn ).arg( i18n ( errorMsg.utf8() ) ) ); return false; } b = loadXML( newdoc ); } else b = loadXML( doc ); ignoreSticky = TRUE; if(_clean) { setModified(false); startBackgroundSpellCheck(); } kdDebug(33001) << "Loading took " << (float)(dt.elapsed()) / 1000.0 << " seconds" << endl; return b; } void KPresenterDoc::createHeaderFooter() { //add header/footer to sticky page KoRect pageRect=m_masterPage->getPageRect(); _header->setOrig(pageRect.topLeft()); _header->setSize(pageRect.width(),20); _footer->setOrig(pageRect.left(),pageRect.bottom()-20); _footer->setSize(pageRect.width(),20); m_masterPage->appendObject(_header); m_masterPage->appendObject(_footer); } void KPresenterDoc::insertEmbedded( KoStore *store, QDomElement topElem, KMacroCommand * macroCmd, KPrPage *page ) { QDomElement elem = topElem.firstChild().toElement(); for ( ; !elem.isNull() ; elem = elem.nextSibling().toElement() ) { kdDebug(33001) << "Element name: " << elem.tagName() << endl; if(elem.tagName()=="EMBEDDED") { KPresenterChild *ch = new KPresenterChild( this ); KPPartObject *kppartobject = 0L; QRect r; QDomElement object=elem.namedItem("OBJECT").toElement(); if(!object.isNull()) { ch->load(object, true); // true == uppercase r = ch->geometry(); ch->loadDocument( store ); insertChild( ch ); kppartobject = new KPPartObject( ch ); } QDomElement settings=elem.namedItem("SETTINGS").toElement(); double offset = 0.0; if(!settings.isNull() && kppartobject!=0) offset=kppartobject->load(settings); else if ( settings.isNull() ) // all embedded obj must have SETTING tags { delete kppartobject; kppartobject = 0L; return; } int index = m_pageList.findRef(page); int pageIndex = (int)(offset/__pgLayout.ptHeight)+index; int newPos=(int)((offset+index*__pgLayout.ptHeight)-pageIndex*__pgLayout.ptHeight); kppartobject->setOrig(kppartobject->getOrig().x(),newPos); InsertCmd *insertCmd = new InsertCmd( i18n( "Insert Part Object" ), kppartobject, this,page ); insertCmd->execute(); if ( !macroCmd ) macroCmd = new KMacroCommand( i18n("Insert Part Object")); macroCmd->addCommand( insertCmd ); } } } bool KPresenterDoc::loadXML( const QDomDocument &doc ) { emit sigProgress( 0 ); int activePage=0; lastObj = -1; bool allSlides = false; // clean if ( _clean ) { //KoPageLayout __pgLayout; __pgLayout = KoPageLayoutDia::standardLayout(); //__pgLayout.unit = KoUnit::U_MM; _spInfiniteLoop = false; _spManualSwitch = true; _showPresentationDuration = false; _xRnd = 20; _yRnd = 20; //_txtBackCol = white; urlIntern = url().path(); } else m_spellListIgnoreAll.clear(); emit sigProgress( 5 ); QDomElement document=doc.documentElement(); // DOC if(document.tagName()!="DOC") { kdWarning(33001) << "Missing DOC" << endl; setErrorMessage( i18n("Invalid document, DOC tag missing.") ); return false; } if(!document.hasAttribute("mime") || ( document.attribute("mime")!="application/x-kpresenter" && document.attribute("mime")!="application/vnd.kde.kpresenter" ) ) { kdError(33001) << "Unknown mime type " << document.attribute("mime") << endl; setErrorMessage( i18n("Invalid document, expected mimetype application/x-kpresenter or application/vnd.kde.kpresenter, got %1").arg(document.attribute("mime")) ); return false; } if(document.hasAttribute("url")) urlIntern=KURL(document.attribute("url")).path(); emit sigProgress( 10 ); QDomElement elem=document.firstChild().toElement(); uint childTotalCount=document.childNodes().count(); uint childCount = 0; loadTextStyle( document ); while(!elem.isNull()) { kdDebug(33001) << "Element name: " << elem.tagName() << endl; if(elem.tagName()=="EMBEDDED") { KPresenterChild *ch = new KPresenterChild( this ); KPPartObject *kppartobject = 0L; QRect r; QDomElement object=elem.namedItem("OBJECT").toElement(); if(!object.isNull()) { ch->load(object, true); // true == uppercase r = ch->geometry(); insertChild( ch ); kppartobject = new KPPartObject( ch ); //emit sig_insertObject( ch, kppartobject ); } QDomElement settings=elem.namedItem("SETTINGS").toElement(); int tmp=0; if(settings.hasAttribute("sticky")) tmp=settings.attribute("sticky").toInt(); bool sticky=static_cast(tmp); double offset = 0.0; if(!settings.isNull() && kppartobject!=0) offset=kppartobject->load(settings); else if ( settings.isNull() ) // all embedded obj must have SETTING tags { delete kppartobject; kppartobject = 0L; } //hack for some old file, they don't have ORIG tag ! if ( offset == -1.0 ) offset = r.y(); if ( sticky && !ignoreSticky && kppartobject ) { m_masterPage->appendObject(kppartobject ); kppartobject->setOrig(r.x(), offset); kppartobject->setSize( r.width(), r.height() ); kppartobject->setSticky(sticky); } else if ( kppartobject ) { kppartobject->setOrig( r.x(), 0 ); kppartobject->setSize( r.width(), r.height() ); insertObjectInPage(offset, kppartobject); } } else if(elem.tagName()=="PAPER" && _clean) { if(elem.hasAttribute("format")) __pgLayout.format=static_cast(elem.attribute("format").toInt()); if(elem.hasAttribute("orientation")) __pgLayout.orientation=static_cast(elem.attribute("orientation").toInt()); if(elem.hasAttribute("ptWidth")) __pgLayout.ptWidth = elem.attribute("ptWidth").toDouble(); else if(elem.hasAttribute("inchWidth")) //compatibility __pgLayout.ptWidth = INCH_TO_POINT( elem.attribute("inchWidth").toDouble() ); else if(elem.hasAttribute("mmWidth")) //compatibility __pgLayout.ptWidth = MM_TO_POINT( elem.attribute("mmWidth").toDouble() ); if(elem.hasAttribute("ptHeight")) __pgLayout.ptHeight = elem.attribute("ptHeight").toDouble(); else if(elem.hasAttribute("inchHeight")) //compatibility __pgLayout.ptHeight = INCH_TO_POINT( elem.attribute("inchHeight").toDouble() ); else if(elem.hasAttribute("mmHeight")) //compatibility __pgLayout.ptHeight = MM_TO_POINT( elem.attribute("mmHeight").toDouble() ); if(elem.hasAttribute("unit")) m_unit = static_cast(elem.attribute("unit").toInt()); if ( elem.hasAttribute("tabStopValue")) m_tabStop = elem.attribute("tabStopValue").toDouble(); if(elem.hasAttribute("width")) __pgLayout.ptWidth = MM_TO_POINT( elem.attribute("width").toDouble() ); if(elem.hasAttribute("height")) __pgLayout.ptHeight = MM_TO_POINT( elem.attribute("height").toDouble() ); QDomElement borders=elem.namedItem("PAPERBORDERS").toElement(); if(!borders.isNull()) { if(borders.hasAttribute("left")) __pgLayout.ptLeft = MM_TO_POINT( borders.attribute("left").toDouble() ); if(borders.hasAttribute("top")) __pgLayout.ptTop = MM_TO_POINT( borders.attribute("top").toDouble() ); if(borders.hasAttribute("right")) __pgLayout.ptRight = MM_TO_POINT( borders.attribute("right").toDouble() ); if(borders.hasAttribute("bottom")) __pgLayout.ptBottom = MM_TO_POINT( borders.attribute("bottom").toDouble() ); if(borders.hasAttribute("ptLeft")) __pgLayout.ptLeft = borders.attribute("ptLeft").toDouble(); else if(borders.hasAttribute("inchLeft")) //compatibility __pgLayout.ptLeft = INCH_TO_POINT( borders.attribute("inchLeft").toDouble() ); else if(borders.hasAttribute("mmLeft")) //compatibility __pgLayout.ptLeft = MM_TO_POINT( borders.attribute("mmLeft").toDouble() ); if(borders.hasAttribute("ptRight")) __pgLayout.ptRight = borders.attribute("ptRight").toDouble(); else if(borders.hasAttribute("inchRight")) //compatibility __pgLayout.ptRight = INCH_TO_POINT( borders.attribute("inchRight").toDouble() ); else if(borders.hasAttribute("mmRight")) //compatibility __pgLayout.ptRight = MM_TO_POINT( borders.attribute("mmRight").toDouble() ); if(borders.hasAttribute("ptTop")) __pgLayout.ptTop = borders.attribute("ptTop").toDouble(); else if(borders.hasAttribute("inchTop")) //compatibility __pgLayout.ptTop = INCH_TO_POINT( borders.attribute("inchTop").toDouble() ); else if(borders.hasAttribute("mmTop")) //compatibility __pgLayout.ptTop = MM_TO_POINT( borders.attribute("mmTop").toDouble() ); if(borders.hasAttribute("ptBottom")) __pgLayout.ptBottom = borders.attribute("ptBottom").toDouble(); else if(borders.hasAttribute("inchBottom")) //compatibility __pgLayout.ptBottom = INCH_TO_POINT( borders.attribute("inchBottom").toDouble() ); else if(borders.hasAttribute("mmBottom")) //compatibility __pgLayout.ptBottom = MM_TO_POINT( borders.attribute("inchBottom").toDouble() ); } // PAPER found and parsed -> apply page layout // e.g. the text objects need it if ( _clean ) setPageLayout( __pgLayout ); } else if(elem.tagName()=="VARIABLESETTINGS" && _clean){ getVariableCollection()->variableSetting()->load(document); //by default display real variable value if ( !isReadWrite()) getVariableCollection()->variableSetting()->setDisplayFieldCode(false); } else if(elem.tagName()=="BACKGROUND") { int red=0, green=0, blue=0; if(elem.hasAttribute("xRnd")) _xRnd = elem.attribute("xRnd").toInt(); if(elem.hasAttribute("yRnd")) _yRnd = elem.attribute("yRnd").toInt(); if(elem.hasAttribute("bred")) red = elem.attribute("bred").toInt(); if(elem.hasAttribute("bgreen")) green = elem.attribute("bgreen").toInt(); if(elem.hasAttribute("bblue")) blue = elem.attribute("bblue").toInt(); loadBackground(elem); } else if(elem.tagName()=="HEADER") { if ( _clean /*don't reload header footer, header/footer was created at the beginning || !hasHeader()*/ ) { if(elem.hasAttribute("show")) { setHeader(static_cast(elem.attribute("show").toInt())); } _header->load(elem); } } else if(elem.tagName()=="FOOTER") { if ( _clean /*|| !hasFooter()*/ ) { if(elem.hasAttribute("show")) { setFooter( static_cast(elem.attribute("show").toInt() ) ); } _footer->load(elem); } }else if( elem.tagName()=="HELPLINES"){ if ( _clean ) { if(elem.hasAttribute("show")) { setShowHelplines( static_cast(elem.attribute("show").toInt() ) ); } loadHelpLines( elem ); } }else if( elem.tagName()=="SPELLCHECKIGNORELIST"){ QDomElement spellWord=elem.toElement(); spellWord=spellWord.firstChild().toElement(); while ( !spellWord.isNull() ) { if ( spellWord.tagName()=="SPELLCHECKIGNOREWORD" ) { m_spellListIgnoreAll.append(spellWord.attribute("word")); } spellWord=spellWord.nextSibling().toElement(); } }else if(elem.tagName()=="ATTRIBUTES" && _clean) { if(elem.hasAttribute("activePage")) activePage=elem.attribute("activePage").toInt(); if(elem.hasAttribute("gridx")) m_gridX = elem.attribute("gridx").toDouble(); if(elem.hasAttribute("gridy")) m_gridY = elem.attribute("gridy").toDouble(); if(elem.hasAttribute("snaptogrid")) m_bSnapToGrid = (bool)elem.attribute("snaptogrid").toInt(); } else if(elem.tagName()=="PAGETITLES") { loadTitle(elem); } else if(elem.tagName()=="PAGENOTES") { loadNote(elem); } else if(elem.tagName()=="OBJECTS") { //FIXME********************** #if 0 lastObj = _objectList->count() - 1; #endif //don't add command we don't paste object KCommand * cmd =loadObjects(elem); if ( cmd ) delete cmd; } else if(elem.tagName()=="INFINITLOOP") { if(_clean) { if(elem.hasAttribute("value")) _spInfiniteLoop = static_cast(elem.attribute("value").toInt()); } } else if(elem.tagName()=="PRESSPEED") { if(_clean) { if(elem.hasAttribute("value")) m_loadingInfo->presSpeed = elem.attribute("value").toInt(); } } else if(elem.tagName()=="MANUALSWITCH") { if(_clean) { if(elem.hasAttribute("value")) _spManualSwitch = static_cast(elem.attribute("value").toInt()); } } else if(elem.tagName()=="SHOWPRESENTATIONDURATION") { if(_clean) { if(elem.hasAttribute("value")) _showPresentationDuration = static_cast(elem.attribute("value").toInt()); } } else if(elem.tagName()=="PRESSLIDES") { if(elem.hasAttribute("value") && elem.attribute("value").toInt()==0) allSlides = TRUE; } else if(elem.tagName()=="SELSLIDES") { if( _clean ) { // Skip this when loading a single page QDomElement slide=elem.firstChild().toElement(); while(!slide.isNull()) { if(slide.tagName()=="SLIDE") { int nr = -1; bool show = false; if(slide.hasAttribute("nr")) nr=slide.attribute("nr").toInt(); if(slide.hasAttribute("show")) show=static_cast(slide.attribute("show").toInt()); if ( nr >= 0 ) { //kdDebug(33001) << "KPresenterDoc::loadXML m_selectedSlides nr=" << nr << " show=" << show << endl; if ( nr > ( (int)m_pageList.count() - 1 ) ) { for (int i=(m_pageList.count()-1); islideSelected(show); } else kdWarning(33001) << "Parse error. No nr in !" << endl; } slide=slide.nextSibling().toElement(); } } } else if ( elem.tagName() == "SOUNDS" ) { loadUsedSoundFileFromXML( elem ); } elem=elem.nextSibling().toElement(); emit sigProgress( childCount * ( 70/childTotalCount ) + 15 ); childCount += 1; } loadPictureMap( document ); if(activePage!=-1) m_initialActivePage=m_pageList.at(activePage); setModified(false); return true; } void KPresenterDoc::loadTextStyle( const QDomElement& domElement ) { QDomElement style = domElement.namedItem( "STYLES" ).toElement(); if ( _clean && ! style.isNull() ) loadStyleTemplates( style ); } void KPresenterDoc::loadPictureMap ( const QDomElement& domElement ) { m_pictureMap.clear(); // QDomElement picturesElem = domElement.namedItem( "PICTURES" ).toElement(); if ( !picturesElem.isNull() ) m_pictureCollection.readXML( picturesElem, m_pictureMap ); // QDomElement pixmapsElem = domElement.namedItem( "PIXMAPS" ).toElement(); if ( !pixmapsElem.isNull() ) m_pictureCollection.readXML( pixmapsElem, m_pictureMap ); // QDomElement clipartsElem = domElement.namedItem( "CLIPARTS" ).toElement(); if ( !clipartsElem.isNull() ) m_pictureCollection.readXML( pixmapsElem, m_pictureMap ); } void KPresenterDoc::loadBackground( const QDomElement &element ) { kdDebug(33001) << "KPresenterDoc::loadBackground" << endl; QDomElement page=element.firstChild().toElement(); int i=m_insertFilePage; while(!page.isNull()) { if(m_pageWhereLoadObject) m_pageWhereLoadObject->background()->load(page); else { //test if there is a page at this index //=> don't add new page if there is again a page if ( i > ( (int)m_pageList.count() - 1 ) ) m_pageList.append( new KPrPage( this, m_masterPage ) ); m_pageList.at(i)->background()->load(page); i++; } page=page.nextSibling().toElement(); } } KCommand *KPresenterDoc::loadObjects( const QDomElement &element, bool paste ) { ObjType t = OT_LINE; QDomElement obj=element.firstChild().toElement(); bool createMacro = false; KMacroCommand *macro = new KMacroCommand( i18n("Paste Objects")); while(!obj.isNull()) { if(obj.tagName()=="OBJECT" ) { bool sticky=false; int tmp=0; if(obj.hasAttribute("type")) tmp=obj.attribute("type").toInt(); t=static_cast(tmp); tmp=0; if(obj.hasAttribute("sticky")) tmp=obj.attribute("sticky").toInt(); sticky=static_cast(tmp); double offset=0; switch ( t ) { case OT_LINE: { KPLineObject *kplineobject = new KPLineObject(); offset=kplineobject->load(obj); if ( sticky && !ignoreSticky) { m_masterPage->appendObject(kplineobject); kplineobject->setOrig(kplineobject->getOrig().x(),offset); kplineobject->setSticky(sticky); } else if (m_pageWhereLoadObject && paste) { kplineobject->setOrig(kplineobject->getOrig().x(),offset); InsertCmd *insertCmd = new InsertCmd( i18n( "Insert Line" ), kplineobject, this, m_pageWhereLoadObject ); macro->addCommand( insertCmd ); createMacro=true; //insertCmd->execute(); } else if( m_pageWhereLoadObject &&!paste) { m_pageWhereLoadObject->appendObject(kplineobject); kplineobject->setOrig(kplineobject->getOrig().x(),offset); } else insertObjectInPage(offset, kplineobject); } break; case OT_RECT: { KPRectObject *kprectobject = new KPRectObject(); offset=kprectobject->load(obj); if ( sticky && !ignoreSticky) { m_masterPage->appendObject(kprectobject); kprectobject->setOrig(kprectobject->getOrig().x(),offset); kprectobject->setSticky(sticky); } else if (m_pageWhereLoadObject && paste) { kprectobject->setOrig(kprectobject->getOrig().x(),offset); InsertCmd *insertCmd = new InsertCmd( i18n( "Insert Rectangle" ), kprectobject, this, m_pageWhereLoadObject ); macro->addCommand( insertCmd ); createMacro=true; } else if( m_pageWhereLoadObject &&!paste) { m_pageWhereLoadObject->appendObject(kprectobject); kprectobject->setOrig(kprectobject->getOrig().x(),offset); } else insertObjectInPage(offset, kprectobject); } break; case OT_ELLIPSE: { KPEllipseObject *kpellipseobject = new KPEllipseObject(); offset=kpellipseobject->load(obj); if ( sticky && !ignoreSticky) { m_masterPage->appendObject(kpellipseobject); kpellipseobject->setOrig(kpellipseobject->getOrig().x(),offset); kpellipseobject->setSticky(sticky); } else if ( m_pageWhereLoadObject && paste) { kpellipseobject->setOrig(kpellipseobject->getOrig().x(),offset); InsertCmd *insertCmd = new InsertCmd( i18n( "Insert Ellipse" ), kpellipseobject, this, m_pageWhereLoadObject ); macro->addCommand( insertCmd ); createMacro=true; } else if( m_pageWhereLoadObject &&!paste) { m_pageWhereLoadObject->appendObject(kpellipseobject); kpellipseobject->setOrig(kpellipseobject->getOrig().x(),offset); } else insertObjectInPage(offset, kpellipseobject); } break; case OT_PIE: { KPPieObject *kppieobject = new KPPieObject(); offset=kppieobject->load(obj); if ( sticky && !ignoreSticky) { m_masterPage->appendObject(kppieobject); kppieobject->setOrig(kppieobject->getOrig().x(),offset); kppieobject->setSticky(sticky); } else if ( m_pageWhereLoadObject && paste) { kppieobject->setOrig(kppieobject->getOrig().x(),offset); InsertCmd *insertCmd = new InsertCmd( i18n( "Insert Pie/Arc/Chord" ), kppieobject, this, m_pageWhereLoadObject ); macro->addCommand( insertCmd ); createMacro=true; } else if( m_pageWhereLoadObject &&!paste) { m_pageWhereLoadObject->appendObject(kppieobject); kppieobject->setOrig(kppieobject->getOrig().x(),offset); } else insertObjectInPage(offset, kppieobject); } break; case OT_AUTOFORM: { KPAutoformObject *kpautoformobject = new KPAutoformObject(); offset=kpautoformobject->load(obj); if ( sticky && !ignoreSticky) { m_masterPage->appendObject(kpautoformobject); kpautoformobject->setOrig(kpautoformobject->getOrig().x(),offset); kpautoformobject->setSticky(sticky); } else if ( m_pageWhereLoadObject&& paste) { kpautoformobject->setOrig(kpautoformobject->getOrig().x(),offset); InsertCmd *insertCmd = new InsertCmd( i18n( "Insert Autoform" ), kpautoformobject, this, m_pageWhereLoadObject ); macro->addCommand( insertCmd ); createMacro=true; } else if( m_pageWhereLoadObject &&!paste) { m_pageWhereLoadObject->appendObject(kpautoformobject); kpautoformobject->setOrig(kpautoformobject->getOrig().x(),offset); } else insertObjectInPage(offset, kpautoformobject); } break; case OT_TEXT: { KPTextObject *kptextobject = new KPTextObject( this ); offset=kptextobject->load(obj); if ( sticky && !ignoreSticky) { m_masterPage->appendObject(kptextobject); kptextobject->setOrig(kptextobject->getOrig().x(),offset); kptextobject->setSticky(sticky); } else if ( m_pageWhereLoadObject && paste) { kptextobject->setOrig(kptextobject->getOrig().x(),offset); InsertCmd *insertCmd = new InsertCmd( i18n( "Insert Textbox" ), kptextobject, this, m_pageWhereLoadObject ); macro->addCommand( insertCmd ); createMacro=true; } else if( m_pageWhereLoadObject &&!paste) { m_pageWhereLoadObject->appendObject(kptextobject); kptextobject->setOrig(kptextobject->getOrig().x(),offset); } else insertObjectInPage(offset, kptextobject); } break; case OT_CLIPART: case OT_PICTURE: { KPPixmapObject *kppixmapobject = new KPPixmapObject( pictureCollection() ); offset=kppixmapobject->load(obj); if ( sticky && !ignoreSticky) { m_masterPage->appendObject(kppixmapobject); kppixmapobject->setOrig(kppixmapobject->getOrig().x(),offset); kppixmapobject->setSticky(sticky); } else if ( m_pageWhereLoadObject && paste) { kppixmapobject->setOrig(kppixmapobject->getOrig().x(),offset); InsertCmd *insertCmd = new InsertCmd( i18n( "Insert Picture" ), kppixmapobject, this, m_pageWhereLoadObject ); macro->addCommand( insertCmd ); kppixmapobject->reload(); createMacro=true; } else if( m_pageWhereLoadObject &&!paste) { m_pageWhereLoadObject->appendObject(kppixmapobject); kppixmapobject->setOrig(kppixmapobject->getOrig().x(),offset); } else insertObjectInPage(offset, kppixmapobject); } break; case OT_FREEHAND: { KPFreehandObject *kpfreehandobject = new KPFreehandObject(); offset=kpfreehandobject->load(obj); if ( sticky && !ignoreSticky) { m_masterPage->appendObject(kpfreehandobject); kpfreehandobject->setOrig(kpfreehandobject->getOrig().x(),offset); kpfreehandobject->setSticky(sticky); } else if ( m_pageWhereLoadObject && paste) { kpfreehandobject->setOrig(kpfreehandobject->getOrig().x(),offset); InsertCmd *insertCmd = new InsertCmd( i18n( "Insert Freehand" ), kpfreehandobject, this, m_pageWhereLoadObject ); macro->addCommand( insertCmd ); createMacro=true; } else if( m_pageWhereLoadObject &&!paste) { m_pageWhereLoadObject->appendObject(kpfreehandobject); kpfreehandobject->setOrig(kpfreehandobject->getOrig().x(),offset); } else insertObjectInPage(offset,kpfreehandobject); } break; case OT_POLYLINE: { KPPolylineObject *kppolylineobject = new KPPolylineObject(); offset=kppolylineobject->load(obj); if ( sticky && !ignoreSticky) { m_masterPage->appendObject(kppolylineobject); kppolylineobject->setOrig(kppolylineobject->getOrig().x(),offset); kppolylineobject->setSticky(sticky); } else if (m_pageWhereLoadObject && paste) { kppolylineobject->setOrig(kppolylineobject->getOrig().x(),offset); InsertCmd *insertCmd = new InsertCmd( i18n( "Insert Polyline" ), kppolylineobject, this, m_pageWhereLoadObject ); macro->addCommand( insertCmd ); createMacro=true; } else if( m_pageWhereLoadObject &&!paste) { m_pageWhereLoadObject->appendObject(kppolylineobject); kppolylineobject->setOrig(kppolylineobject->getOrig().x(),offset); } else insertObjectInPage(offset, kppolylineobject); } break; case OT_QUADRICBEZIERCURVE: { KPQuadricBezierCurveObject *kpQuadricBezierCurveObject = new KPQuadricBezierCurveObject(); offset=kpQuadricBezierCurveObject->load(obj); if ( sticky && !ignoreSticky) { m_masterPage->appendObject(kpQuadricBezierCurveObject); kpQuadricBezierCurveObject->setOrig(kpQuadricBezierCurveObject->getOrig().x(),offset); kpQuadricBezierCurveObject->setSticky(sticky); } else if ( m_pageWhereLoadObject && paste) { kpQuadricBezierCurveObject->setOrig(kpQuadricBezierCurveObject->getOrig().x(),offset); InsertCmd *insertCmd = new InsertCmd( i18n( "Insert Quadric Bezier Curve" ), kpQuadricBezierCurveObject, this, m_pageWhereLoadObject ); macro->addCommand( insertCmd ); createMacro=true; } else if( m_pageWhereLoadObject &&!paste) { m_pageWhereLoadObject->appendObject(kpQuadricBezierCurveObject); kpQuadricBezierCurveObject->setOrig(kpQuadricBezierCurveObject->getOrig().x(),offset); } else insertObjectInPage(offset, kpQuadricBezierCurveObject); } break; case OT_CUBICBEZIERCURVE: { KPCubicBezierCurveObject *kpCubicBezierCurveObject = new KPCubicBezierCurveObject(); offset=kpCubicBezierCurveObject->load(obj); if ( sticky && !ignoreSticky) { m_masterPage->appendObject(kpCubicBezierCurveObject); kpCubicBezierCurveObject->setOrig(kpCubicBezierCurveObject->getOrig().x(),offset); kpCubicBezierCurveObject->setSticky(sticky); } else if ( m_pageWhereLoadObject && paste) { kpCubicBezierCurveObject->setOrig(kpCubicBezierCurveObject->getOrig().x(),offset); InsertCmd *insertCmd = new InsertCmd( i18n( "Insert Cubic Bezier Curve" ), kpCubicBezierCurveObject, this, m_pageWhereLoadObject ); macro->addCommand( insertCmd ); createMacro=true; } else if( m_pageWhereLoadObject &&!paste) { m_pageWhereLoadObject->appendObject(kpCubicBezierCurveObject); kpCubicBezierCurveObject->setOrig(kpCubicBezierCurveObject->getOrig().x(),offset); } else insertObjectInPage(offset, kpCubicBezierCurveObject); } break; case OT_POLYGON: { KPPolygonObject *kpPolygonObject = new KPPolygonObject(); offset=kpPolygonObject->load( obj ); if ( sticky && !ignoreSticky) { m_masterPage->appendObject(kpPolygonObject); kpPolygonObject->setOrig(kpPolygonObject->getOrig().x(),offset); kpPolygonObject->setSticky(sticky); } else if ( m_pageWhereLoadObject && paste) { kpPolygonObject->setOrig(kpPolygonObject->getOrig().x(),offset); InsertCmd *insertCmd = new InsertCmd( i18n( "Insert Polygon" ), kpPolygonObject, this, m_pageWhereLoadObject); macro->addCommand( insertCmd ); createMacro=true; } else if( m_pageWhereLoadObject &&!paste) { m_pageWhereLoadObject->appendObject(kpPolygonObject); kpPolygonObject->setOrig(kpPolygonObject->getOrig().x(),offset); } else insertObjectInPage(offset, kpPolygonObject); } break; case OT_CLOSED_LINE: { KPClosedLineObject *kpClosedLinneObject = new KPClosedLineObject(); offset = kpClosedLinneObject->load( obj ); if ( sticky && !ignoreSticky) { m_masterPage->appendObject( kpClosedLinneObject ); kpClosedLinneObject->setOrig( kpClosedLinneObject->getOrig().x(), offset ); kpClosedLinneObject->setSticky( sticky ); } else if ( m_pageWhereLoadObject && paste ) { kpClosedLinneObject->setOrig( kpClosedLinneObject->getOrig().x(), offset ); InsertCmd *insertCmd = new InsertCmd( i18n( "Insert %1" ).arg(kpClosedLinneObject->getTypeString()), kpClosedLinneObject, this , m_pageWhereLoadObject ); macro->addCommand( insertCmd ); createMacro = true; } else if( m_pageWhereLoadObject &&!paste) { m_pageWhereLoadObject->appendObject( kpClosedLinneObject ); kpClosedLinneObject->setOrig( kpClosedLinneObject->getOrig().x(), offset ); } else insertObjectInPage( offset, kpClosedLinneObject ); } break; case OT_GROUP: { KPGroupObject *kpgroupobject = new KPGroupObject(); offset=kpgroupobject->load(obj, this); if ( sticky && !ignoreSticky) { m_masterPage->appendObject(kpgroupobject); kpgroupobject->setOrig(kpgroupobject->getOrig().x(),offset); kpgroupobject->setSticky(sticky); } else if ( m_pageWhereLoadObject && paste) { kpgroupobject->setOrig(kpgroupobject->getOrig().x(),offset); InsertCmd *insertCmd = new InsertCmd( i18n( "Insert Group Object" ), kpgroupobject, this, m_pageWhereLoadObject ); macro->addCommand( insertCmd ); createMacro=true; } else if( m_pageWhereLoadObject &&!paste) { m_pageWhereLoadObject->appendObject(kpgroupobject); kpgroupobject->setOrig(kpgroupobject->getOrig().x(),offset); } else insertObjectInPage(offset, kpgroupobject); } break; default: break; } } obj=obj.nextSibling().toElement(); } if ( createMacro ) { macro->execute(); return macro; } else { delete macro; return 0L; } } void KPresenterDoc::loadTitle( const QDomElement &element ) { QDomElement title=element.firstChild().toElement(); int i=m_insertFilePage; while ( !title.isNull() ) { if ( title.tagName()=="Title" ) { //test if there is a page at this index //=> don't add new page if there is again a page if(!m_pageWhereLoadObject) { if ( i > ( (int)m_pageList.count() - 1 ) ) m_pageList.append( new KPrPage( this, m_masterPage ) ); m_pageList.at(i)->insertManualTitle(title.attribute("title")); i++; } else m_pageWhereLoadObject->insertManualTitle(title.attribute("title")); } title=title.nextSibling().toElement(); } } void KPresenterDoc::loadNote( const QDomElement &element ) { QDomElement note=element.firstChild().toElement(); int i=m_insertFilePage; while ( !note.isNull() ) { if ( note.tagName()=="Note" ) { //test if there is a page at this index //=> don't add new page if there is again a page if(!m_pageWhereLoadObject) { if ( i > ( (int)m_pageList.count() - 1 ) ) m_pageList.append( new KPrPage( this, m_masterPage ) ); m_pageList.at(i)->setNoteText(note.attribute("note")); i++; } else m_pageWhereLoadObject->setNoteText(note.attribute("note")); } note=note.nextSibling().toElement(); } } void KPresenterDoc::loadUsedSoundFileFromXML( const QDomElement &element ) { usedSoundFile = QStringList(); haveNotOwnDiskSoundFile = QStringList(); QDomElement fileElement = element.firstChild().toElement(); while ( !fileElement.isNull() ) { if ( fileElement.tagName() == "FILE" ) { QString fileName; if ( fileElement.hasAttribute( "name" ) ) fileName = fileElement.attribute( "name" ); if ( fileElement.hasAttribute( "filename" ) ) { QString name = fileElement.attribute( "filename" ); QFile _file( name ); if ( _file.open( IO_ReadOnly ) ) { fileName = name; _file.close(); } else haveNotOwnDiskSoundFile.append( name ); } usedSoundFile.append( fileName ); fileElement = fileElement.nextSibling().toElement(); } } } void KPresenterDoc::loadImagesFromStore( KoStore *_store ) { if ( _store ) { m_pictureCollection.readFromStore( _store, m_pictureMap ); m_pictureMap.clear(); // Release memory } } bool KPresenterDoc::completeLoading( KoStore* _store ) { emit sigProgress( 80 ); if ( _store ) { loadImagesFromStore( _store ); emit sigProgress( 90 ); if ( !usedSoundFile.isEmpty() ) loadUsedSoundFileFromStore( _store, usedSoundFile ); if ( _clean ) createHeaderFooter(); //else { //m_pageList.last()->updateBackgroundSize(); //} if ( saveOnlyPage == -1 ) { // ### following call independant of saveOnlyPage's value? m_masterPage->completeLoading( _clean, lastObj ); QPtrListIterator it( m_pageList ); for ( ; it.current(); ++it ) it.current()->completeLoading( _clean, lastObj ); } } else { if ( _clean ) { /// ### this has already been done, no? setPageLayout( __pgLayout ); } else setPageLayout( m_pageLayout ); } compatibilityPresSpeed(); emit sigProgress( 100 ); recalcVariables( VT_FIELD ); emit sigProgress( -1 ); connect( documentInfo(), SIGNAL( sigDocumentInfoModifed()),this,SLOT(slotDocumentInfoModifed() ) ); //desactivate bgspellchecking //attributes isReadWrite is not placed at the beginning ! if ( !isReadWrite()) enableBackgroundSpellCheck( false ); return true; } void KPresenterDoc::loadUsedSoundFileFromStore( KoStore *_store, QStringList _list ) { int i = m_insertFilePage; QStringList::Iterator it = _list.begin(); for ( ; it != _list.end(); ++it ) { QString soundFile = *it; if ( _store->open( soundFile ) ) { kdDebug( 33001 ) << "Not found file on disk. Use this( " << soundFile << " ) file." << endl; KoStoreDevice dev( _store ); int size = _store->size(); char *data = new char[size]; dev.readBlock( data, size ); int position = soundFile.findRev( '.' ); QString format = soundFile.right( soundFile.length() - position ); KTempFile *tmpFile = new KTempFile( QString::null, format ); tmpFile->setAutoDelete( true ); tmpFile->file()->writeBlock( data, size ); tmpFile->close(); QString tmpFileName = tmpFile->name(); tmpSoundFileList.append( tmpFile ); QString _fileName = *haveNotOwnDiskSoundFile.at( i ); ++i; QPtrListIterator it( m_pageList ); for ( ; it.current(); ++it ) { QString _file = it.current()->getPageSoundFileName(); if ( !_file.isEmpty() && _file == _fileName ) it.current()->setPageSoundFileName( tmpFileName ); QPtrListIterator oIt( it.current()->objectList() ); for ( ; oIt.current(); ++oIt ) { _file = oIt.current()->getAppearSoundEffectFileName(); if ( !_file.isEmpty() && _file == _fileName ) oIt.current()->setAppearSoundEffectFileName( tmpFileName ); _file = oIt.current()->getDisappearSoundEffectFileName(); if ( !_file.isEmpty() && _file == _fileName ) oIt.current()->setDisappearSoundEffectFileName( tmpFileName ); } } _store->close(); delete data; } else { kdDebug( 33001 ) << "Found this( " << soundFile << " ) file on disk" << endl; } } } void KPresenterDoc::setPageLayout( const KoPageLayout &pgLayout ) { // if ( _pageLayout == pgLayout ) // return; m_pageLayout = pgLayout; //for ( int i = 0; i < static_cast( m_pageList.count() ); i++ ) // m_pageList.at( i )->updateBackgroundSize(); repaint( false ); layout(); // don't setModified(true) here, since this is called on startup } //when we change pagelayout we must re-position header/footer void KPresenterDoc::updateHeaderFooterPosition( ) { KoRect pageRect=m_masterPage->getPageRect(); QRect oldBoundingRect=zoomHandler()->zoomRect(_header->getBoundingRect()); _header->setOrig(pageRect.topLeft ()); _header->setSize(pageRect.width(),_header->getSize().height()); repaint( oldBoundingRect ); repaint(_header); oldBoundingRect=zoomHandler()->zoomRect(_footer->getBoundingRect()); _footer->setOrig(pageRect.left(),pageRect.bottom()-_footer->getSize().height()); _footer->setSize(pageRect.width(),_footer->getSize().height()); repaint(oldBoundingRect); repaint(_footer); } bool KPresenterDoc::initDoc(InitDocFlags flags, QWidget* parentWidget) { if (flags==KoDocument::InitDocEmpty) { QString fileName( locate("kpresenter_template", "Screenpresentations/.source/Plain.kpt", KPresenterFactory::global() ) ); objStartY = 0; _clean = true; bool ok = loadNativeFormat( fileName ); resetURL(); setEmpty(); return ok; } QString _template; KoTemplateChooseDia::ReturnType ret; KoTemplateChooseDia::DialogType dlgtype; if (flags != InitDocFileNew) dlgtype = KoTemplateChooseDia::Everything; else dlgtype = KoTemplateChooseDia::OnlyTemplates; ret = KoTemplateChooseDia::choose( KPresenterFactory::global(), _template, dlgtype, "kpresenter_template", parentWidget ); if ( ret == KoTemplateChooseDia::Template ) { QFileInfo fileInfo( _template ); QString fileName( fileInfo.dirPath( true ) + "/" + fileInfo.baseName() + ".kpt" ); _clean = true; //was a parameter called "clean", but unused bool ok = loadNativeFormat( fileName ); objStartY = 0; _clean = true; resetURL(); setEmpty(); return ok; } else if ( ret == KoTemplateChooseDia::File ) { objStartY = 0; _clean = true; KURL url( _template ); bool ok = openURL( url ); return ok; } else if ( ret == KoTemplateChooseDia::Empty ) { QString fileName( locate("kpresenter_template", "Screenpresentations/.source/Plain.kpt", KPresenterFactory::global() ) ); objStartY = 0; _clean = true; bool ok = loadNativeFormat( fileName ); resetURL(); setEmpty(); return ok; } else return false; } void KPresenterDoc::initEmpty() { QString fileName( locate("kpresenter_template", "Screenpresentations/.source/Plain.kpt", KPresenterFactory::global() ) ); objStartY = 0; _clean = true; setModified(true); loadNativeFormat( fileName ); resetURL(); } void KPresenterDoc::setEmpty() { KoDocument::setEmpty(); // Whether loaded from template or from empty doc: this is a new one -> set creation date m_varColl->variableSetting()->setCreationDate(QDateTime::currentDateTime()); } void KPresenterDoc::setGridValue( double _x, double _y, bool _replace ) { oldGridX = m_gridX; oldGridY = m_gridY; m_gridX=_x; m_gridY=_y; if ( _replace ) replaceObjs(); } void KPresenterDoc::repaint( bool erase ) { QPtrListIterator it( views() ); for( ; it.current(); ++it ) { KPrCanvas* canvas = ((KPresenterView*)it.current())->getCanvas(); canvas->repaint( erase ); } } void KPresenterDoc::repaint( const QRect& rect ) { QRect r; QPtrListIterator it( views() ); for( ; it.current(); ++it ) { r = rect; KPrCanvas* canvas = ((KPresenterView*)it.current())->getCanvas(); r.moveTopLeft( QPoint( r.x() - canvas->diffx(), r.y() - canvas->diffy() ) ); canvas->update( r ); } } void KPresenterDoc::layout(KPObject *kpobject) { KPTextObject * obj = dynamic_cast( kpobject ); if (obj) obj->layout(); } void KPresenterDoc::layout() { QPtrListIterator it( views() ); for( ; it.current(); ++it ) { KPrCanvas* canvas = ((KPresenterView*)it.current())->getCanvas(); canvas->layout(); } } void KPresenterDoc::repaint( KPObject *kpobject ) { repaint( m_zoomHandler->zoomRect(kpobject->getBoundingRect()) ); } QValueList KPresenterDoc::getPageEffectSteps( unsigned int num ) { return m_pageList.at(num)->getEffectSteps(); } QRect KPresenterDoc::getPageRect( bool decBorders ) const { int pw, ph, bl = static_cast(m_pageLayout.ptLeft); int br = static_cast(m_pageLayout.ptRight); int bt = static_cast(m_pageLayout.ptTop); int bb = static_cast(m_pageLayout.ptBottom); int wid = static_cast(m_pageLayout.ptWidth); int hei = static_cast(m_pageLayout.ptHeight); if ( !decBorders ) { br = 0; bt = 0; bl = 0; bb = 0; } pw = wid - ( bl + br ); ph = hei - ( bt + bb ); return QRect( bl, bt, pw, ph ); } int KPresenterDoc::getLeftBorder() const { return static_cast(m_pageLayout.ptLeft); } int KPresenterDoc::getTopBorder() const { return static_cast(m_pageLayout.ptTop); } int KPresenterDoc::getBottomBorder() const { return static_cast(m_pageLayout.ptBottom); } int KPresenterDoc::getRightBorder() const { return static_cast(m_pageLayout.ptRight); } void KPresenterDoc::deletePage( int _page ) { kdDebug(33001) << "KPresenterDoc::deletePage " << _page << endl; //m_pageList.at(_page)->deletePage(); if ( m_pageList.count()==1 ) return; KPrDeletePageCmd *cmd = new KPrDeletePageCmd( i18n("Delete Slide"), _page, this ); cmd->execute(); addCommand(cmd); } void KPresenterDoc::insertPage( KPrPage *page, int currentPageNum, int insertPageNum ) { // check if page was allready deleted int pos = m_deletedPageList.findRef( page ); if ( pos != -1 ) m_deletedPageList.take( pos ); m_pageList.insert( insertPageNum, page ); pageOrderChanged(); //activate this page in all views which on slide currentPageNum QPtrListIterator it( views() ); for (; it.current(); ++it ) { KPresenterView *view = static_cast( it.current() ); view->addSideBarItem( insertPageNum ); // change to the new page if the view was on the current page. if ( view->getCurrPgNum() - 1 == currentPageNum ) { view->skipToPage( insertPageNum ); } else // recalc the page number as it might have been changed { view->recalcCurrentPageNum(); } } } void KPresenterDoc::takePage( KPrPage *page, int pageNum ) { int pos = m_pageList.findRef( page ); m_pageList.take( pos ); m_deletedPageList.append( page ); pageOrderChanged(); QPtrListIterator it( views() ); for (; it.current(); ++it ) { KPresenterView *view = static_cast( it.current() ); view->removeSideBarItem( pos ); // change to the new page if the view was on the current page. if ( view->getCurrPgNum() - 1 == pos ) { view->skipToPage( pageNum ); } else // recalc the page number as it might have been changed { view->recalcCurrentPageNum(); } } repaint( false ); } void KPresenterDoc::pageOrderChanged() { recalcVariables( VT_PGNUM ); //update statusbar emit pageNumChanged(); emit sig_updateMenuBar(); } void KPresenterDoc::movePageTo( int oldPos, int newPos ) { kdDebug(33001) << "movePage oldPos = " << oldPos << ", neuPos = " << newPos << endl; KPrPage * page = m_pageList.take( oldPos ); m_pageList.insert( newPos, page ); pageOrderChanged(); // Update the sidebars QPtrListIterator it( views() ); for (; it.current(); ++it ) { KPresenterView *view = static_cast( it.current() ); view->moveSideBarItem( oldPos, newPos ); // change to the new page if the view was on the old pos. if ( view->getCurrPgNum() - 1 == oldPos ) { view->skipToPage( newPos ); } else // recalc the page number as it might have been changed { view->recalcCurrentPageNum(); } } } QString KPresenterDoc::templateFileName( bool chooseTemplate, const QString &theFile ) { QString fileName; if ( !chooseTemplate ) { if ( theFile.isEmpty() ) fileName = locateLocal( "appdata", "default.kpr" ); else fileName = theFile; } else { // TODO: pass parentWidget as parameter to this method QWidget* parentWidget = 0; QString _template; if ( KoTemplateChooseDia::choose( KPresenterFactory::global(), _template, KoTemplateChooseDia::OnlyTemplates, "kpresenter_template", parentWidget ) == KoTemplateChooseDia::Cancel ) return QString::null; QFileInfo fileInfo( _template ); fileName = fileInfo.dirPath( true ) + "/" + fileInfo.baseName() + ".kpt"; KURL src, dest; src.setPath( fileName ); dest.setPath( locateLocal( "appdata", "default.kpr" ) ); kdDebug(33001) << "Copying template (in KPresenterDoc::templateFileName)" << endl << " from: " << src.prettyURL() << endl << " to: " << dest.prettyURL() << endl; KIO::NetAccess::file_copy( src, dest, -1, /* default permissions */ true /* overwrite */ ); } return fileName; } int KPresenterDoc::insertNewPage( const QString &cmdName, int _page, InsertPos _insPos, bool chooseTemplate, const QString &theFile ) { kdDebug(33001) << "KPresenterDoc::insertNewPage " << _page << endl; QString fileName=templateFileName(chooseTemplate, theFile); if(fileName.isEmpty()) return -1; _clean = false; objStartY=-1; //insert page. KPrPage *newpage = new KPrPage( this, m_masterPage ); m_pageWhereLoadObject=newpage; loadNativeFormat( fileName ); objStartY = 0; KPrInsertPageCmd *cmd = new KPrInsertPageCmd( cmdName, _page, _insPos, newpage, this ); cmd->execute(); addCommand(cmd); _clean = true; m_pageWhereLoadObject=0L; return _page; } void KPresenterDoc::savePage( const QString &file, int pgnum, bool ignore ) { saveOnlyPage = pgnum; _duplicatePage=ignore; saveNativeFormat( file ); _duplicatePage=false; saveOnlyPage = -1; } void KPresenterDoc::replaceObjs( bool createUndoRedo ) { KMacroCommand * macroCmd = 0L; QPtrListIterator oIt(m_pageList); for (; oIt.current(); ++oIt ) { KCommand *cmd=oIt.current()->replaceObjs( createUndoRedo, oldGridX,oldGridY,_txtBackCol, _otxtBackCol); if(cmd && createUndoRedo) { if ( !macroCmd) macroCmd = new KMacroCommand( i18n("Set New Options") ); macroCmd->addCommand(cmd); } else delete cmd; } if(macroCmd) { macroCmd->execute(); addCommand(macroCmd); } } void KPresenterDoc::restoreBackground( KPrPage *page ) { page->background()->reload(); } KCommand * KPresenterDoc::loadPastedObjs( const QString &in, KPrPage* _page ) { QDomDocument doc; doc.setContent( in ); QDomElement document=doc.documentElement(); // DOC if (document.tagName()!="DOC") { kdError(33001) << "Missing DOC" << endl; return 0L; } bool ok = false; if(document.hasAttribute("mime") && document.attribute("mime")=="application/x-kpresenter") ok=true; if ( !ok ) return 0L; m_pageWhereLoadObject=_page; KCommand *cmd = loadObjects(document,true); m_pageWhereLoadObject=0L; repaint( false ); setModified( true ); return cmd; } void KPresenterDoc::deSelectAllObj() { QPtrListIterator it( views() ); for (; it.current(); ++it ) ((KPresenterView*)it.current())->getCanvas()->deSelectAllObj(); } void KPresenterDoc::deSelectObj(KPObject *obj) { QPtrListIterator it( views() ); for (; it.current(); ++it ) ((KPresenterView*)it.current())->getCanvas()->deSelectObj( obj ); } void KPresenterDoc::setHeader( bool b ) { m_bHasHeader = b; _header->setDrawEditRect( b ); _header->setDrawEmpty( b ); if(!b) { terminateEditing(_header); deSelectObj(_header); } updateHeaderFooterButton(); repaint(m_bHasHeader); } void KPresenterDoc::setFooter( bool b ) { m_bHasFooter = b; _footer->setDrawEditRect( b ); _footer->setDrawEmpty( b ); if(!b) { terminateEditing(_footer); deSelectObj(_footer); } updateHeaderFooterButton(); repaint(m_bHasFooter); } void KPresenterDoc::updateHeaderFooterButton() { QPtrListIterator it( views() ); for (; it.current(); ++it ) ((KPresenterView*)it.current())->updateHeaderFooterButton(); } void KPresenterDoc::makeUsedPixmapList() { usedPictures.clear(); for ( uint i = 0; i < m_pageList.count(); i++ ) { if ( saveOnlyPage != -1 && static_cast(i) != saveOnlyPage ) continue; m_pageList.at(i)->makeUsedPixmapList(); } // ### following call independant of saveOnlyPage's value? if ( saveOnlyPage == -1 ) m_masterPage->makeUsedPixmapList(); } void KPresenterDoc::makeUsedSoundFileList() { if ( saveOnlyPage != -1 ) return; usedSoundFile.clear(); QPtrListIterator it( m_pageList ); for ( ; it.current(); ++it ) { QString _file = it.current()->getPageSoundFileName(); if ( !_file.isEmpty() && usedSoundFile.findIndex( _file ) == -1 ) usedSoundFile.append( _file ); QPtrListIterator oIt( it.current()->objectList() ); for ( ; oIt.current(); ++oIt ) { _file = oIt.current()->getAppearSoundEffectFileName(); if ( !_file.isEmpty() && usedSoundFile.findIndex( _file ) == -1 ) usedSoundFile.append( _file ); _file = oIt.current()->getDisappearSoundEffectFileName(); if ( !_file.isEmpty() && usedSoundFile.findIndex( _file ) == -1 ) usedSoundFile.append( _file ); } } } KoView* KPresenterDoc::createViewInstance( QWidget* parent, const char* name ) { //the page numbers have to be recalced for the sticky objects //as it could not be done during the constructor of KPresenterView recalcPageNum(); return new KPresenterView( this, parent, name ); } void KPresenterDoc::paintContent( QPainter& painter, const QRect& rect, bool /*transparent*/, double zoomX, double zoomY ) { m_zoomHandler->setZoom( 100 ); if ( zoomHandler()->zoomedResolutionX() != zoomX || zoomHandler()->zoomedResolutionY() != zoomY ) { zoomHandler()->setResolution( zoomX, zoomY ); bool forPrint = painter.device() && painter.device()->devType() == QInternal::Printer; newZoomAndResolution( false, forPrint ); } KPrPage *page=m_pageList.first(); if( m_initialActivePage ) page=m_initialActivePage; int pageNum = m_pageList.findRef( page ); page->background()->drawBackground( &painter, zoomHandler(), rect, false ); //for the moment draw first page. QPtrListIterator it( page->objectList() ); for ( ; it.current() ; ++it ) it.current()->draw( &painter, zoomHandler(), pageNum, SM_NONE ); it= m_masterPage->objectList(); //draw sticky obj for ( ; it.current() ; ++it ) { if( (it.current()==_header && !hasHeader())||(it.current()==_footer && !hasFooter())) continue; it.current()->draw( &painter, zoomHandler(), pageNum, SM_NONE ); } } QPixmap KPresenterDoc::generatePreview( const QSize& size ) { int oldZoom = zoomHandler()->zoom(); double oldResolutionX = zoomHandler()->resolutionX(); double oldResolutionY = zoomHandler()->resolutionY(); QPixmap pix = KoDocument::generatePreview(size); zoomHandler()->setResolution( oldResolutionX, oldResolutionY ); zoomHandler()->setZoom(oldZoom); newZoomAndResolution( false, false ); return pix; } void KPresenterDoc::movePage( int from, int to ) { kdDebug(33001) << "KPresenterDoc::movePage from=" << from << " to=" << to << endl; KPrMovePageCmd *cmd = new KPrMovePageCmd( i18n("Move Slide"), from, to, this ); cmd->execute(); addCommand(cmd); } +void KPresenterDoc::copyOasisPage( int from ) +{ + //todo +} + void KPresenterDoc::copyPage( int from ) { _clean = false; _duplicatePage=true; kdDebug(33001) << "KPresenterDoc::copyPage from=" << from << " to=" << from + 1 << endl; bool wasSelected = isSlideSelected( from ); KTempFile tempFile( QString::null, ".kpr" ); tempFile.setAutoDelete( true ); savePage( tempFile.name(), from ); //insert page. KPrPage *newpage = new KPrPage( this, m_masterPage ); m_pageWhereLoadObject = newpage; loadNativeFormat( tempFile.name() ); KPrInsertPageCmd *cmd = new KPrInsertPageCmd( i18n("Duplicate Slide"), from, IP_AFTER, newpage, this ); cmd->execute(); addCommand(cmd); _duplicatePage=false; _clean = true; m_pageWhereLoadObject=0L; selectPage( from + 1, wasSelected ); } +void KPresenterDoc::copyOasisPageToClipboard( int pgnum ) +{ + //todo +} + void KPresenterDoc::copyPageToClipboard( int pgnum ) { // We save the page to a temp file and set the URL of the file in the clipboard // Yes it's a hack but at least we don't hit the clipboard size limit :) // (and we don't have to implement copy-tar-structure-to-clipboard) // In fact it even allows copying a [1-page] kpr in konq and pasting it in kpresenter :)) kdDebug(33001) << "KPresenterDoc::copyPageToClipboard pgnum=" << pgnum << endl; KTempFile tempFile( QString::null, ".kpr" ); savePage( tempFile.name(), pgnum ); KURL url; url.setPath( tempFile.name() ); KURL::List lst; lst.append( url ); QApplication::clipboard()->setData( new KURLDrag( lst ) ); m_tempFileInClipboard = tempFile.name(); // do this last, the above calls clipboardDataChanged } void KPresenterDoc::pastePage( const QMimeSource * data, int pgnum ) { KURL::List lst; if ( KURLDrag::decode( data, lst ) && !lst.isEmpty() ) { insertNewPage(i18n("Paste Slide"), pgnum, IP_BEFORE, FALSE, lst.first().path() ); //selectPage( pgnum, true /* should be part of the file ? */ ); } } void KPresenterDoc::clipboardDataChanged() { if ( !m_tempFileInClipboard.isEmpty() ) { kdDebug(33001) << "KPresenterDoc::clipboardDataChanged, deleting temp file " << m_tempFileInClipboard << endl; unlink( QFile::encodeName( m_tempFileInClipboard ) ); m_tempFileInClipboard = QString::null; } // TODO enable paste as well, when a txtobject is activated // and there is plain text in the clipboard. Then enable this code. //QMimeSource *data = QApplication::clipboard()->data(); //bool canPaste = data->provides( "text/uri-list" ) || data->provides( "application/x-kpresenter-selection" ); // emit enablePaste( canPaste ); } void KPresenterDoc::selectPage( int pgNum /* 0-based */, bool select ) { Q_ASSERT( pgNum >= 0 ); KPrPage *page = m_pageList.at( pgNum ); page->slideSelected(select); kdDebug(33001) << "KPresenterDoc::selectPage pgNum=" << pgNum << " select=" << select << endl; setModified(true); updateSideBarItem( page ); updatePresentationButton(); //update statusbar emit pageNumChanged(); } // TODO remove SideBar from the name, it's a general helper (object->page) KPrPage * KPresenterDoc::findSideBarPage(KPObject *object) { if ( object->isSticky() ) { //kdDebug(33001) << "Object is on sticky page" << endl; return m_masterPage; } QPtrListIterator it( m_pageList ); for ( ; it.current(); ++it ) { QPtrList list( it.current()->objectList() ); if ( list.findRef( object ) != -1 ) { //kdDebug(33001) << "Object is on page " << m_pageList.findRef(it.current()) + 1 << endl; return it.current(); } } kdDebug(33001) << "Object not found on a page" << endl; return 0L; } // TODO remove SideBar from the name, it's a general helper (object->page) KPrPage * KPresenterDoc::findSideBarPage(QPtrList &objects) { KPObject *object; for ( object = objects.first(); object; object=objects.next() ) { if ( object->isSticky() ) { //kdDebug(33001) << "A Object is on the sticky page" << endl; return m_masterPage; } } object = objects.first(); for ( KPrPage *page=m_pageList.first(); page; page=m_pageList.next() ) { QPtrList list( page->objectList() ); if ( list.findRef( object ) != -1 ) { //kdDebug(33001) << "The Objects are on page " << m_pageList.findRef(page) + 1 << endl; return page; } } kdDebug(33001) << "Objects not found on a page" << endl; return 0L; } void KPresenterDoc::updateSideBarItem( KPrPage * page ) { // Update the views QPtrListIterator it( views() ); for (; it.current(); ++it ) static_cast( it.current() )->updateSideBarItem( page ); } bool KPresenterDoc::isSlideSelected( int pgNum /* 0-based */ ) { Q_ASSERT( pgNum >= 0 ); return m_pageList.at(pgNum)->isSlideSelected(); } QValueList KPresenterDoc::selectedSlides() /* returned list is 0-based */ { QValueList result; for ( int i = 0; i < static_cast( m_pageList.count() ); i++ ) { if(m_pageList.at(i)->isSlideSelected()) result <( m_pageList.count() ); i++ ) { if(m_pageList.at(i)->isSlideSelected()) { if(continuous) ++end; else { start=i; end=i; continuous=true; } } else { if(continuous) { if(start==end) ret+=QString::number(start+1)+","; else ret+=QString::number(start+1)+"-"+QString::number(end+1)+","; continuous=false; } } } if(continuous) { if(start==end) ret+=QString::number(start+1); else ret+=QString::number(start+1)+"-"+QString::number(end+1); } if(','==ret[ret.length()-1]) ret.truncate(ret.length()-1); return ret; } void KPresenterDoc::slotRepaintChanged( KPTextObject *kptextobj ) { //todo //use this function for the moment repaint( kptextobj ); } void KPresenterDoc::recalcVariables( int type ) { recalcPageNum(); m_varColl->recalcVariables(type); slotRepaintVariable(); } void KPresenterDoc::slotRepaintVariable() { QPtrListIterator it( m_pageList ); for ( ; it.current(); ++it ) it.current()->slotRepaintVariable(); m_masterPage->slotRepaintVariable(); } void KPresenterDoc::slotDocumentInfoModifed() { if (!getVariableCollection()->variableSetting()->displayFieldCode()) recalcVariables( VT_FIELD ); } void KPresenterDoc::reorganizeGUI() { QPtrListIterator it( views() ); for (; it.current(); ++it ) ((KPresenterView*)it.current())->reorganize(); } int KPresenterDoc::undoRedoLimit() const { return m_commandHistory->undoLimit(); } void KPresenterDoc::setUndoRedoLimit(int val) { m_commandHistory->setUndoLimit(val); m_commandHistory->setRedoLimit(val); } void KPresenterDoc::updateRuler() { emit sig_updateRuler(); } void KPresenterDoc::recalcPageNum() { QPtrListIterator it( m_pageList ); for ( ; it.current(); ++it ) it.current()->recalcPageNum(); m_masterPage->recalcPageNum(); } KPrPage * KPresenterDoc::activePage()const { return m_initialActivePage; } void KPresenterDoc::insertObjectInPage(double offset, KPObject *_obj) { /// Why does this use __pgLayout instead of m_pageLayout ? int page = (int)(offset/__pgLayout.ptHeight)+m_insertFilePage; double newPos = offset - ( page - m_insertFilePage ) * __pgLayout.ptHeight; if ( page > ( (int)m_pageList.count()-1 ) ) { for (int i=(m_pageList.count()-1); isetOrig(_obj->getOrig().x(),newPos); m_pageList.at(page)->appendObject(_obj); } void KPresenterDoc::insertPixmapKey( KoPictureKey key ) { if ( !usedPictures.contains( key ) ) usedPictures.append( key ); } KPrPage * KPresenterDoc::initialActivePage() const { return m_initialActivePage; } void KPresenterDoc::displayActivePage(KPrPage * _page) { m_initialActivePage = _page; } void KPresenterDoc::updateZoomRuler() { QPtrListIterator it( views() ); for (; it.current(); ++it ) { ((KPresenterView*)it.current())->getHRuler()->setZoom( m_zoomHandler->zoomedResolutionX() ); ((KPresenterView*)it.current())->getVRuler()->setZoom( m_zoomHandler->zoomedResolutionY() ); ((KPresenterView*)it.current())->slotUpdateRuler(); } } void KPresenterDoc::newZoomAndResolution( bool updateViews, bool /*forPrint*/ ) { QPtrListIterator it( m_pageList ); for ( ; it.current(); ++it ) { QPtrListIterator oit(it.current()->objectList()); for ( ; oit.current(); ++oit ) { if ( oit.current()->getType() == OT_TEXT ) static_cast( oit.current() )->textDocument()->formatCollection()->zoomChanged(); } } if ( updateViews ) { QPtrListIterator it( views() ); for (; it.current(); ++it ) { static_cast( it.current() )->getCanvas()->update(); static_cast( it.current() )->getCanvas()->layout(); } } } bool KPresenterDoc::isHeader(const KPObject *obj) const { return (obj==_header); } bool KPresenterDoc::isFooter(const KPObject *obj) const { return (obj==_footer); } bool KPresenterDoc::isHeaderFooter(const KPObject *obj) const { return (obj==_header)||(obj==_footer); } void KPresenterDoc::updateRulerPageLayout() { QPtrListIterator it( views() ); for (; it.current(); ++it ) { ((KPresenterView*)it.current())->getHRuler()->setPageLayout(m_pageLayout ); ((KPresenterView*)it.current())->getVRuler()->setPageLayout(m_pageLayout ); } } void KPresenterDoc::refreshAllNoteBar(int page, const QString &text, KPresenterView *exceptView) { m_pageList.at(page)->setNoteText(text ); QPtrListIterator it( views() ); for (; it.current(); ++it ) { KPresenterView* view=(KPresenterView*)it.current(); if ( view->getNoteBar() && view != exceptView && ((int)(view->getCurrPgNum())-1 == page)) view->getNoteBar()->setCurrentNoteText(text ); } } void KPresenterDoc::loadStyleTemplates( const QDomElement &stylesElem ) { QValueList followingStyles; QDomNodeList listStyles = stylesElem.elementsByTagName( "STYLE" ); if( listStyles.count() > 0) { // we are going to import at least one style. KoParagStyle *s = m_styleColl->findStyle("Standard"); kdDebug(32001) << "KPresenterDoc::loadStyleTemplates looking for Standard, to delete it. Found " << s << endl; if(s) // delete the standard style. m_styleColl->removeStyleTemplate(s); } for (unsigned int item = 0; item < listStyles.count(); item++) { QDomElement styleElem = listStyles.item( item ).toElement(); KoParagStyle *sty = new KoParagStyle( QString::null ); // Load the style from the