QGIS API Documentation  master-59fd5e0
src/gui/qgscomposerview.cpp
Go to the documentation of this file.
00001 /***************************************************************************
00002                          qgscomposerview.cpp
00003                          -------------------
00004     begin                : January 2005
00005     copyright            : (C) 2005 by Radim Blazek
00006     email                : blazek@itc.it
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
00015  *                                                                         *
00016  ***************************************************************************/
00017 
00018 #include <QApplication>
00019 #include <QMainWindow>
00020 #include <QMouseEvent>
00021 #include <QKeyEvent>
00022 #include <QClipboard>
00023 #include <QMimeData>
00024 #include <QGridLayout>
00025 
00026 #include "qgscomposerview.h"
00027 #include "qgscomposerarrow.h"
00028 #include "qgscomposerframe.h"
00029 #include "qgscomposerhtml.h"
00030 #include "qgscomposerlabel.h"
00031 #include "qgscomposerlegend.h"
00032 #include "qgscomposermap.h"
00033 #include "qgscomposeritemgroup.h"
00034 #include "qgscomposerpicture.h"
00035 #include "qgscomposerruler.h"
00036 #include "qgscomposerscalebar.h"
00037 #include "qgscomposershape.h"
00038 #include "qgscomposerattributetable.h"
00039 #include "qgslogger.h"
00040 #include "qgsaddremovemultiframecommand.h"
00041 
00042 QgsComposerView::QgsComposerView( QWidget* parent, const char* name, Qt::WFlags f )
00043     : QGraphicsView( parent )
00044     , mRubberBandItem( 0 )
00045     , mRubberBandLineItem( 0 )
00046     , mMoveContentItem( 0 )
00047     , mPaintingEnabled( true )
00048     , mHorizontalRuler( 0 )
00049     , mVerticalRuler( 0 )
00050 {
00051   Q_UNUSED( f );
00052   Q_UNUSED( name );
00053 
00054   setResizeAnchor( QGraphicsView::AnchorViewCenter );
00055   setMouseTracking( true );
00056   viewport()->setMouseTracking( true );
00057   setFrameShape( QFrame::NoFrame );
00058 }
00059 
00060 void QgsComposerView::mousePressEvent( QMouseEvent* e )
00061 {
00062   if ( !composition() )
00063   {
00064     return;
00065   }
00066 
00067   QPointF scenePoint = mapToScene( e->pos() );
00068   QPointF snappedScenePoint = composition()->snapPointToGrid( scenePoint );
00069 
00070   //lock/unlock position of item with right click
00071   if ( e->button() == Qt::RightButton )
00072   {
00073     QgsComposerItem* selectedItem = composition()->composerItemAt( scenePoint );
00074     if ( selectedItem )
00075     {
00076       bool lock = selectedItem->positionLock() ? false : true;
00077       selectedItem->setPositionLock( lock );
00078       selectedItem->update();
00079       //make sure the new cursor is correct
00080       QPointF itemPoint = selectedItem->mapFromScene( scenePoint );
00081       selectedItem->updateCursor( itemPoint );
00082     }
00083     return;
00084   }
00085 
00086   switch ( mCurrentTool )
00087   {
00088       //select/deselect items and pass mouse event further
00089     case Select:
00090     {
00091       if ( !( e->modifiers() & Qt::ShiftModifier ) ) //keep selection if shift key pressed
00092       {
00093         composition()->clearSelection();
00094       }
00095 
00096       //select topmost item at position of event
00097       QgsComposerItem* selectedItem = composition()->composerItemAt( scenePoint );
00098       if ( !selectedItem )
00099       {
00100         break;
00101       }
00102 
00103       selectedItem->setSelected( true );
00104       QGraphicsView::mousePressEvent( e );
00105       emit selectedItemChanged( selectedItem );
00106       break;
00107     }
00108 
00109     case MoveItemContent:
00110     {
00111       //store item as member if it is selected and cursor is over item
00112       QgsComposerItem* item = dynamic_cast<QgsComposerItem *>( itemAt( e->pos() ) );
00113       if ( item )
00114       {
00115         mMoveContentStartPos = scenePoint;
00116       }
00117       mMoveContentItem = item;
00118       break;
00119     }
00120 
00121     case AddArrow:
00122     {
00123       mRubberBandStartPos = QPointF( snappedScenePoint.x(), snappedScenePoint.y() );
00124       mRubberBandLineItem = new QGraphicsLineItem( snappedScenePoint.x(), snappedScenePoint.y(), snappedScenePoint.x(), snappedScenePoint.y() );
00125       mRubberBandLineItem->setZValue( 100 );
00126       scene()->addItem( mRubberBandLineItem );
00127       scene()->update();
00128       break;
00129     }
00130 
00131     //create rubber band for map and ellipse items
00132     case AddMap:
00133     case AddRectangle:
00134     case AddTriangle:
00135     case AddEllipse:
00136     case AddHtml:
00137     {
00138       QTransform t;
00139       mRubberBandItem = new QGraphicsRectItem( 0, 0, 0, 0 );
00140       mRubberBandStartPos = QPointF( snappedScenePoint.x(), snappedScenePoint.y() );
00141       t.translate( snappedScenePoint.x(), snappedScenePoint.y() );
00142       mRubberBandItem->setTransform( t );
00143       mRubberBandItem->setZValue( 100 );
00144       scene()->addItem( mRubberBandItem );
00145       scene()->update();
00146     }
00147     break;
00148 
00149     case AddLabel:
00150       if ( composition() )
00151       {
00152         QgsComposerLabel* newLabelItem = new QgsComposerLabel( composition() );
00153         newLabelItem->setText( tr( "QGIS" ) );
00154         newLabelItem->adjustSizeToText();
00155         newLabelItem->setSceneRect( QRectF( snappedScenePoint.x(), snappedScenePoint.y(), newLabelItem->rect().width(), newLabelItem->rect().height() ) );
00156         composition()->addComposerLabel( newLabelItem );
00157         emit actionFinished();
00158         composition()->pushAddRemoveCommand( newLabelItem, tr( "Label added" ) );
00159       }
00160       break;
00161 
00162     case AddScalebar:
00163       if ( composition() )
00164       {
00165         QgsComposerScaleBar* newScaleBar = new QgsComposerScaleBar( composition() );
00166         newScaleBar->setSceneRect( QRectF( snappedScenePoint.x(), snappedScenePoint.y(), 20, 20 ) );
00167         composition()->addComposerScaleBar( newScaleBar );
00168         QList<const QgsComposerMap*> mapItemList = composition()->composerMapItems();
00169         if ( mapItemList.size() > 0 )
00170         {
00171           newScaleBar->setComposerMap( mapItemList.at( 0 ) );
00172         }
00173         newScaleBar->applyDefaultSize(); //4 segments, 1/5 of composer map width
00174         emit actionFinished();
00175         composition()->pushAddRemoveCommand( newScaleBar, tr( "Scale bar added" ) );
00176       }
00177       break;
00178 
00179     case AddLegend:
00180     {
00181       if ( composition() )
00182       {
00183         QgsComposerLegend* newLegend = new QgsComposerLegend( composition() );
00184         newLegend->setSceneRect( QRectF( snappedScenePoint.x(), snappedScenePoint.y(), newLegend->rect().width(), newLegend->rect().height() ) );
00185         composition()->addComposerLegend( newLegend );
00186         newLegend->updateLegend();
00187         emit actionFinished();
00188         composition()->pushAddRemoveCommand( newLegend, tr( "Legend added" ) );
00189       }
00190       break;
00191     }
00192     case AddPicture:
00193       if ( composition() )
00194       {
00195         QgsComposerPicture* newPicture = new QgsComposerPicture( composition() );
00196         newPicture->setSceneRect( QRectF( snappedScenePoint.x(), snappedScenePoint.y(), 30, 30 ) );
00197         composition()->addComposerPicture( newPicture );
00198         emit actionFinished();
00199         composition()->pushAddRemoveCommand( newPicture, tr( "Picture added" ) );
00200       }
00201       break;
00202     case AddTable:
00203       if ( composition() )
00204       {
00205         QgsComposerAttributeTable* newTable = new QgsComposerAttributeTable( composition() );
00206         newTable->setSceneRect( QRectF( snappedScenePoint.x(), snappedScenePoint.y(), 50, 50 ) );
00207         composition()->addComposerTable( newTable );
00208         emit actionFinished();
00209         composition()->pushAddRemoveCommand( newTable, tr( "Table added" ) );
00210       }
00211       break;
00212     default:
00213       break;
00214   }
00215 }
00216 
00217 void QgsComposerView::addShape( Tool currentTool )
00218 {
00219   QgsComposerShape::Shape shape = QgsComposerShape::Ellipse;
00220 
00221   if ( currentTool == AddRectangle )
00222     shape = QgsComposerShape::Rectangle;
00223   else if ( currentTool == AddTriangle )
00224     shape = QgsComposerShape::Triangle;
00225 
00226   if ( !mRubberBandItem || mRubberBandItem->rect().width() < 0.1 || mRubberBandItem->rect().width() < 0.1 )
00227   {
00228     scene()->removeItem( mRubberBandItem );
00229     delete mRubberBandItem;
00230     mRubberBandItem = 0;
00231     return;
00232   }
00233   if ( composition() )
00234   {
00235     QgsComposerShape* composerShape = new QgsComposerShape( mRubberBandItem->transform().dx(), mRubberBandItem->transform().dy(), mRubberBandItem->rect().width(), mRubberBandItem->rect().height(), composition() );
00236     composerShape->setShapeType( shape );
00237     composition()->addComposerShape( composerShape );
00238     scene()->removeItem( mRubberBandItem );
00239     delete mRubberBandItem;
00240     mRubberBandItem = 0;
00241     emit actionFinished();
00242     composition()->pushAddRemoveCommand( composerShape, tr( "Shape added" ) );
00243   }
00244 }
00245 
00246 void QgsComposerView::updateRulers()
00247 {
00248   if ( mHorizontalRuler )
00249   {
00250     mHorizontalRuler->setSceneTransform( viewportTransform() );
00251   }
00252   if ( mVerticalRuler )
00253   {
00254     mVerticalRuler->setSceneTransform( viewportTransform() );
00255   }
00256 }
00257 
00258 void QgsComposerView::mouseReleaseEvent( QMouseEvent* e )
00259 {
00260   if ( !composition() )
00261   {
00262     return;
00263   }
00264 
00265   QPointF scenePoint = mapToScene( e->pos() );
00266 
00267   switch ( mCurrentTool )
00268   {
00269     case Select:
00270     {
00271       QGraphicsView::mouseReleaseEvent( e );
00272       break;
00273     }
00274 
00275     case MoveItemContent:
00276     {
00277       if ( mMoveContentItem )
00278       {
00279         //update map preview if composer map
00280         QgsComposerMap* composerMap = dynamic_cast<QgsComposerMap *>( mMoveContentItem );
00281         if ( composerMap )
00282         {
00283           composerMap->setOffset( 0, 0 );
00284         }
00285 
00286         double moveX = scenePoint.x() - mMoveContentStartPos.x();
00287         double moveY = scenePoint.y() - mMoveContentStartPos.y();
00288 
00289         composition()->beginCommand( mMoveContentItem, tr( "Move item content" ) );
00290         mMoveContentItem->moveContent( -moveX, -moveY );
00291         composition()->endCommand();
00292         mMoveContentItem = 0;
00293       }
00294       break;
00295     }
00296     case AddArrow:
00297       if ( composition() )
00298       {
00299         QPointF scenePoint = mapToScene( e->pos() );
00300         QPointF snappedScenePoint = composition()->snapPointToGrid( scenePoint );
00301         QgsComposerArrow* composerArrow = new QgsComposerArrow( mRubberBandStartPos, QPointF( snappedScenePoint.x(), snappedScenePoint.y() ), composition() );
00302         composition()->addComposerArrow( composerArrow );
00303         scene()->removeItem( mRubberBandLineItem );
00304         delete mRubberBandLineItem;
00305         mRubberBandLineItem = 0;
00306         emit actionFinished();
00307         composition()->pushAddRemoveCommand( composerArrow, tr( "Arrow added" ) );
00308       }
00309       break;
00310 
00311     case AddRectangle:
00312     case AddTriangle:
00313     case AddEllipse:
00314       addShape( mCurrentTool );
00315       break;
00316 
00317     case AddMap:
00318       if ( !mRubberBandItem || mRubberBandItem->rect().width() < 0.1 || mRubberBandItem->rect().width() < 0.1 )
00319       {
00320         if ( mRubberBandItem )
00321         {
00322           scene()->removeItem( mRubberBandItem );
00323           delete mRubberBandItem;
00324           mRubberBandItem = 0;
00325         }
00326         return;
00327       }
00328       if ( composition() )
00329       {
00330         QgsComposerMap* composerMap = new QgsComposerMap( composition(), mRubberBandItem->transform().dx(), mRubberBandItem->transform().dy(), mRubberBandItem->rect().width(), mRubberBandItem->rect().height() );
00331         composition()->addComposerMap( composerMap );
00332         scene()->removeItem( mRubberBandItem );
00333         delete mRubberBandItem;
00334         mRubberBandItem = 0;
00335         emit actionFinished();
00336         composition()->pushAddRemoveCommand( composerMap, tr( "Map added" ) );
00337       }
00338       break;
00339 
00340     case AddHtml:
00341       if ( composition() )
00342       {
00343         QgsComposerHtml* composerHtml = new QgsComposerHtml( composition(), true );
00344         QgsAddRemoveMultiFrameCommand* command = new QgsAddRemoveMultiFrameCommand( QgsAddRemoveMultiFrameCommand::Added,
00345             composerHtml, composition(), tr( "Html item added" ) );
00346         composition()->undoStack()->push( command );
00347         QgsComposerFrame* frame = new QgsComposerFrame( composition(), composerHtml, mRubberBandItem->transform().dx(),
00348             mRubberBandItem->transform().dy(), mRubberBandItem->rect().width(),
00349             mRubberBandItem->rect().height() );
00350         composition()->beginMultiFrameCommand( composerHtml, tr( "Html frame added" ) );
00351         composerHtml->addFrame( frame );
00352         composition()->endMultiFrameCommand();
00353         scene()->removeItem( mRubberBandItem );
00354         delete mRubberBandItem;
00355         mRubberBandItem = 0;
00356         emit actionFinished();
00357       }
00358     default:
00359       break;
00360   }
00361 }
00362 
00363 void QgsComposerView::mouseMoveEvent( QMouseEvent* e )
00364 {
00365   if ( !composition() )
00366   {
00367     return;
00368   }
00369 
00370   updateRulers();
00371   if ( mHorizontalRuler )
00372   {
00373     mHorizontalRuler->updateMarker( e->posF() );
00374   }
00375   if ( mVerticalRuler )
00376   {
00377     mVerticalRuler->updateMarker( e->posF() );
00378   }
00379 
00380   if ( e->buttons() == Qt::NoButton )
00381   {
00382     if ( mCurrentTool == Select )
00383     {
00384       QGraphicsView::mouseMoveEvent( e );
00385     }
00386   }
00387   else
00388   {
00389     QPointF scenePoint = mapToScene( e->pos() );
00390 
00391     switch ( mCurrentTool )
00392     {
00393       case Select:
00394         QGraphicsView::mouseMoveEvent( e );
00395         break;
00396 
00397       case AddArrow:
00398       {
00399         if ( mRubberBandLineItem )
00400         {
00401           mRubberBandLineItem->setLine( mRubberBandStartPos.x(), mRubberBandStartPos.y(),  scenePoint.x(),  scenePoint.y() );
00402         }
00403         break;
00404       }
00405 
00406       case AddMap:
00407       case AddRectangle:
00408       case AddTriangle:
00409       case AddEllipse:
00410       case AddHtml:
00411         //adjust rubber band item
00412       {
00413         double x = 0;
00414         double y = 0;
00415         double width = 0;
00416         double height = 0;
00417 
00418         double dx = scenePoint.x() - mRubberBandStartPos.x();
00419         double dy = scenePoint.y() - mRubberBandStartPos.y();
00420 
00421         if ( dx < 0 )
00422         {
00423           x = scenePoint.x();
00424           width = -dx;
00425         }
00426         else
00427         {
00428           x = mRubberBandStartPos.x();
00429           width = dx;
00430         }
00431 
00432         if ( dy < 0 )
00433         {
00434           y = scenePoint.y();
00435           height = -dy;
00436         }
00437         else
00438         {
00439           y = mRubberBandStartPos.y();
00440           height = dy;
00441         }
00442 
00443         if ( mRubberBandItem )
00444         {
00445           mRubberBandItem->setRect( 0, 0, width, height );
00446           QTransform t;
00447           t.translate( x, y );
00448           mRubberBandItem->setTransform( t );
00449         }
00450         break;
00451       }
00452 
00453       case MoveItemContent:
00454       {
00455         //update map preview if composer map
00456         QgsComposerMap* composerMap = dynamic_cast<QgsComposerMap *>( mMoveContentItem );
00457         if ( composerMap )
00458         {
00459           composerMap->setOffset( scenePoint.x() - mMoveContentStartPos.x(), scenePoint.y() - mMoveContentStartPos.y() );
00460           composerMap->update();
00461         }
00462         break;
00463       }
00464       default:
00465         break;
00466     }
00467   }
00468 }
00469 
00470 void QgsComposerView::mouseDoubleClickEvent( QMouseEvent* e )
00471 {
00472   e->ignore();
00473 }
00474 
00475 void QgsComposerView::keyPressEvent( QKeyEvent * e )
00476 {
00477   //TODO : those should be actions (so we could also display menu items and/or toolbar items)
00478 
00479   if ( !composition() )
00480   {
00481     return;
00482   }
00483 
00484   QList<QgsComposerItem*> composerItemList = composition()->selectedComposerItems();
00485   QList<QgsComposerItem*>::iterator itemIt = composerItemList.begin();
00486 
00487   if ( e->matches( QKeySequence::Copy ) || e->matches( QKeySequence::Cut ) )
00488   {
00489     QDomDocument doc;
00490     QDomElement documentElement = doc.createElement( "ComposerItemClipboard" );
00491     for ( ; itemIt != composerItemList.end(); ++itemIt )
00492     {
00493       // copy each item in a group
00494       QgsComposerItemGroup* itemGroup = dynamic_cast<QgsComposerItemGroup*>( *itemIt );
00495       if ( itemGroup && composition() )
00496       {
00497         QSet<QgsComposerItem*> groupedItems = itemGroup->items();
00498         QSet<QgsComposerItem*>::iterator it = groupedItems.begin();
00499         for ( ; it != groupedItems.end(); ++it )
00500         {
00501           ( *it )->writeXML( documentElement, doc );
00502         }
00503       }
00504       ( *itemIt )->writeXML( documentElement, doc );
00505       if ( e->matches( QKeySequence::Cut ) )
00506       {
00507         composition()->removeComposerItem( *itemIt );
00508       }
00509     }
00510     doc.appendChild( documentElement );
00511 
00512     //if it's a copy, we have to remove the UUIDs since we don't want any duplicate UUID
00513     if ( e->matches( QKeySequence::Copy ) )
00514     {
00515       // remove all uuid attributes
00516       QDomNodeList composerItemsNodes = doc.elementsByTagName( "ComposerItem" );
00517       for ( int i = 0; i < composerItemsNodes.count(); ++i )
00518       {
00519         QDomNode composerItemNode = composerItemsNodes.at( i );
00520         if ( composerItemNode.isElement() )
00521         {
00522           composerItemNode.toElement().removeAttribute( "uuid" );
00523         }
00524       }
00525     }
00526 
00527     QMimeData *mimeData = new QMimeData;
00528     mimeData->setData( "text/xml", doc.toByteArray() );
00529     QClipboard *clipboard = QApplication::clipboard();
00530     clipboard->setMimeData( mimeData );
00531   }
00532 
00533   //TODO : "Ctrl+Shift+V" is one way to paste, but on some platefoms you can use Shift+Ins and F18
00534   if ( e->matches( QKeySequence::Paste ) || ( e->key() == Qt::Key_V && e->modifiers() & Qt::ControlModifier && e->modifiers() & Qt::ShiftModifier ) )
00535   {
00536     QDomDocument doc;
00537     QClipboard *clipboard = QApplication::clipboard();
00538     if ( doc.setContent( clipboard->mimeData()->data( "text/xml" ) ) )
00539     {
00540       QDomElement docElem = doc.documentElement();
00541       if ( docElem.tagName() == "ComposerItemClipboard" )
00542       {
00543         if ( composition() )
00544         {
00545           QPointF pt = mapToScene( mapFromGlobal( QCursor::pos() ) );
00546           bool pasteInPlace = ( e->modifiers() & Qt::ShiftModifier );
00547           composition()->addItemsFromXML( docElem, doc, 0, true, &pt, pasteInPlace );
00548         }
00549       }
00550     }
00551   }
00552 
00553   //delete selected items
00554   if ( e->key() == Qt::Key_Delete || e->key() == Qt::Key_Backspace )
00555   {
00556     for ( ; itemIt != composerItemList.end(); ++itemIt )
00557     {
00558       if ( composition() )
00559       {
00560         composition()->removeComposerItem( *itemIt );
00561       }
00562     }
00563   }
00564 
00565   else if ( e->key() == Qt::Key_Left )
00566   {
00567     for ( ; itemIt != composerItemList.end(); ++itemIt )
00568     {
00569       ( *itemIt )->beginCommand( tr( "Item moved" ), QgsComposerMergeCommand::ItemMove );
00570       ( *itemIt )->move( -1.0, 0.0 );
00571       ( *itemIt )->endCommand();
00572     }
00573   }
00574   else if ( e->key() == Qt::Key_Right )
00575   {
00576     for ( ; itemIt != composerItemList.end(); ++itemIt )
00577     {
00578       ( *itemIt )->beginCommand( tr( "Item moved" ), QgsComposerMergeCommand::ItemMove );
00579       ( *itemIt )->move( 1.0, 0.0 );
00580       ( *itemIt )->endCommand();
00581     }
00582   }
00583   else if ( e->key() == Qt::Key_Down )
00584   {
00585     for ( ; itemIt != composerItemList.end(); ++itemIt )
00586     {
00587       ( *itemIt )->beginCommand( tr( "Item moved" ), QgsComposerMergeCommand::ItemMove );
00588       ( *itemIt )->move( 0.0, 1.0 );
00589       ( *itemIt )->endCommand();
00590     }
00591   }
00592   else if ( e->key() == Qt::Key_Up )
00593   {
00594     for ( ; itemIt != composerItemList.end(); ++itemIt )
00595     {
00596       ( *itemIt )->beginCommand( tr( "Item moved" ), QgsComposerMergeCommand::ItemMove );
00597       ( *itemIt )->move( 0.0, -1.0 );
00598       ( *itemIt )->endCommand();
00599     }
00600   }
00601 }
00602 
00603 void QgsComposerView::wheelEvent( QWheelEvent* event )
00604 {
00605   QPointF scenePoint = mapToScene( event->pos() );
00606 
00607   //select topmost item at position of event
00608   QgsComposerItem* theItem = composition()->composerItemAt( scenePoint );
00609   if ( theItem )
00610   {
00611     if ( theItem->isSelected() )
00612     {
00613       QPointF itemPoint = theItem->mapFromScene( scenePoint );
00614       theItem->beginCommand( tr( "Zoom item content" ) );
00615       theItem->zoomContent( event->delta(), itemPoint.x(), itemPoint.y() );
00616       theItem->endCommand();
00617     }
00618   }
00619 }
00620 
00621 void QgsComposerView::paintEvent( QPaintEvent* event )
00622 {
00623   if ( mPaintingEnabled )
00624   {
00625     QGraphicsView::paintEvent( event );
00626     event->accept();
00627   }
00628   else
00629   {
00630     event->ignore();
00631   }
00632 }
00633 
00634 void QgsComposerView::hideEvent( QHideEvent* e )
00635 {
00636   emit( composerViewHide( this ) );
00637   e->ignore();
00638 }
00639 
00640 void QgsComposerView::showEvent( QShowEvent* e )
00641 {
00642   emit( composerViewShow( this ) );
00643   e->ignore();
00644 }
00645 
00646 void QgsComposerView::resizeEvent( QResizeEvent* event )
00647 {
00648   QGraphicsView::resizeEvent( event );
00649   updateRulers();
00650 }
00651 
00652 void QgsComposerView::scrollContentsBy( int dx, int dy )
00653 {
00654   QGraphicsView::scrollContentsBy( dx, dy );
00655   updateRulers();
00656 }
00657 
00658 void QgsComposerView::setComposition( QgsComposition* c )
00659 {
00660   setScene( c );
00661   if ( mHorizontalRuler )
00662   {
00663     mHorizontalRuler->setComposition( c );
00664   }
00665   if ( mVerticalRuler )
00666   {
00667     mVerticalRuler->setComposition( c );
00668   }
00669 }
00670 
00671 QgsComposition* QgsComposerView::composition()
00672 {
00673   if ( scene() )
00674   {
00675     QgsComposition* c = dynamic_cast<QgsComposition *>( scene() );
00676     if ( c )
00677     {
00678       return c;
00679     }
00680   }
00681   return 0;
00682 }
00683 
00684 void QgsComposerView::groupItems()
00685 {
00686   if ( !composition() )
00687   {
00688     return;
00689   }
00690 
00691   QList<QgsComposerItem*> selectionList = composition()->selectedComposerItems();
00692   if ( selectionList.size() < 2 )
00693   {
00694     return; //not enough items for a group
00695   }
00696   QgsComposerItemGroup* itemGroup = new QgsComposerItemGroup( composition() );
00697 
00698   QList<QgsComposerItem*>::iterator itemIter = selectionList.begin();
00699   for ( ; itemIter != selectionList.end(); ++itemIter )
00700   {
00701     itemGroup->addItem( *itemIter );
00702   }
00703 
00704   composition()->addItem( itemGroup );
00705   itemGroup->setSelected( true );
00706   emit selectedItemChanged( itemGroup );
00707 }
00708 
00709 void QgsComposerView::ungroupItems()
00710 {
00711   if ( !composition() )
00712   {
00713     return;
00714   }
00715 
00716   QList<QgsComposerItem*> selectionList = composition()->selectedComposerItems();
00717   QList<QgsComposerItem*>::iterator itemIter = selectionList.begin();
00718   for ( ; itemIter != selectionList.end(); ++itemIter )
00719   {
00720     QgsComposerItemGroup* itemGroup = dynamic_cast<QgsComposerItemGroup *>( *itemIter );
00721     if ( itemGroup )
00722     {
00723       itemGroup->removeItems();
00724       composition()->removeItem( *itemIter );
00725       delete( *itemIter );
00726       emit itemRemoved( *itemIter );
00727     }
00728   }
00729 }
00730 
00731 QMainWindow* QgsComposerView::composerWindow()
00732 {
00733   QMainWindow* composerObject = 0;
00734   QObject* currentObject = parent();
00735   if ( !currentObject )
00736   {
00737     return qobject_cast<QMainWindow *>( currentObject );
00738   }
00739 
00740   while ( true )
00741   {
00742     composerObject = qobject_cast<QMainWindow*>( currentObject );
00743     if ( composerObject || currentObject->parent() == 0 )
00744     {
00745       return composerObject;
00746     }
00747     currentObject = currentObject->parent();
00748   }
00749 
00750   return 0;
00751 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines