00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef QGSCOMPOSERMAP_H
00018 #define QGSCOMPOSERMAP_H
00019
00020
00021 #include "qgscomposeritem.h"
00022 #include "qgsrectangle.h"
00023 #include <QGraphicsRectItem>
00024
00025 class QgsComposition;
00026 class QgsMapRenderer;
00027 class QgsMapToPixel;
00028 class QDomNode;
00029 class QDomDocument;
00030 class QGraphicsView;
00031 class QPainter;
00032
00037
00038 class CORE_EXPORT QgsComposerMap : public QgsComposerItem
00039 {
00040 Q_OBJECT
00041
00042 public:
00044 QgsComposerMap( QgsComposition *composition, int x, int y, int width, int height );
00046 QgsComposerMap( QgsComposition *composition );
00047 ~QgsComposerMap();
00048
00050 enum PreviewMode
00051 {
00052 Cache = 0,
00053 Render,
00054 Rectangle
00055 };
00056
00057 enum GridStyle
00058 {
00059 Solid = 0,
00060 Cross
00061 };
00062
00063 enum GridAnnotationPosition
00064 {
00065 InsideMapFrame = 0,
00066 OutsideMapFrame
00067 };
00068
00069 enum GridAnnotationDirection
00070 {
00071 Horizontal = 0,
00072 Vertical,
00073 HorizontalAndVertical,
00074 BoundaryDirection
00075 };
00076
00078 void draw( QPainter *painter, const QgsRectangle& extent, const QSize& size, int dpi );
00079
00085 void draw( QPainter *painter, const QgsRectangle& extent, const QSizeF& size, double dpi );
00086
00088 void paint( QPainter* painter, const QStyleOptionGraphicsItem* itemStyle, QWidget* pWidget );
00089
00091 void cache( void );
00092
00094 int id() const {return mId;}
00095
00097 bool isDrawing() const {return mDrawing;}
00098
00100 void resize( double dx, double dy );
00101
00105 void moveContent( double dx, double dy );
00106
00111 void zoomContent( int delta, double x, double y );
00112
00114 void setSceneRect( const QRectF& rectangle );
00115
00117 double scale( void ) const;
00118
00120 void setNewScale( double scaleDenominator );
00121
00123 void setNewExtent( const QgsRectangle& extent );
00124
00125 PreviewMode previewMode() {return mPreviewMode;}
00126 void setPreviewMode( PreviewMode m ) {mPreviewMode = m;}
00127
00130 bool keepLayerSet() const {return mKeepLayerSet;}
00133 void setKeepLayerSet( bool enabled ) {mKeepLayerSet = enabled;}
00134
00137 QStringList layerSet() const {return mLayerSet;}
00140 void setLayerSet( const QStringList& layerSet ) {mLayerSet = layerSet;}
00142 void storeCurrentLayerSet();
00143
00144
00145 void setCacheUpdated( bool u = false );
00146
00147 QgsRectangle extent() const {return mExtent;}
00148
00149 const QgsMapRenderer* mapRenderer() const {return mMapRenderer;}
00150
00152 void setOffset( double xOffset, double yOffset );
00153
00155 bool containsWMSLayer() const;
00156
00161 bool writeXML( QDomElement& elem, QDomDocument & doc ) const;
00162
00167 bool readXML( const QDomElement& itemElem, const QDomDocument& doc );
00168
00171 void setGridEnabled( bool enabled ) {mGridEnabled = enabled;}
00172 bool gridEnabled() const { return mGridEnabled; }
00173
00176 void setGridStyle( GridStyle style ) {mGridStyle = style;}
00177 GridStyle gridStyle() const { return mGridStyle; }
00178
00181 void setGridIntervalX( double interval ) { mGridIntervalX = interval;}
00182 double gridIntervalX() const { return mGridIntervalX; }
00183
00186 void setGridIntervalY( double interval ) { mGridIntervalY = interval;}
00187 double gridIntervalY() const { return mGridIntervalY; }
00188
00191 void setGridOffsetX( double offset ) { mGridOffsetX = offset; }
00192 double gridOffsetX() const { return mGridOffsetX; }
00193
00196 void setGridOffsetY( double offset ) { mGridOffsetY = offset; }
00197 double gridOffsetY() const { return mGridOffsetY; }
00198
00201 void setGridPen( const QPen& p ) { mGridPen = p; }
00202 QPen gridPen() const { return mGridPen; }
00205 void setGridPenWidth( double w );
00208 void setGridPenColor( const QColor& c );
00209
00212 void setGridAnnotationFont( const QFont& f ) { mGridAnnotationFont = f; }
00213 QFont gridAnnotationFont() const { return mGridAnnotationFont; }
00214
00217 void setGridAnnotationPrecision( int p ) {mGridAnnotationPrecision = p;}
00218 int gridAnnotationPrecision() const {return mGridAnnotationPrecision;}
00219
00222 void setShowGridAnnotation( bool show ) {mShowGridAnnotation = show;}
00223 bool showGridAnnotation() const {return mShowGridAnnotation;}
00224
00227 void setGridAnnotationPosition( GridAnnotationPosition p ) {mGridAnnotationPosition = p;}
00228 GridAnnotationPosition gridAnnotationPosition() const {return mGridAnnotationPosition;}
00229
00232 void setAnnotationFrameDistance( double d ) {mAnnotationFrameDistance = d;}
00233 double annotationFrameDistance() const {return mAnnotationFrameDistance;}
00234
00237 void setGridAnnotationDirection( GridAnnotationDirection d ) {mGridAnnotationDirection = d;}
00238 GridAnnotationDirection gridAnnotationDirection() const {return mGridAnnotationDirection;}
00239
00242 QRectF boundingRect() const;
00245 void updateBoundingRect();
00246
00249 void setCrossLength( double l ) {mCrossLength = l;}
00250 double crossLength() {return mCrossLength;}
00251
00252 void setMapRotation( double r );
00253
00255 void setMapCanvas( QGraphicsView* canvas ) { mMapCanvas = canvas; }
00256
00257 public slots:
00258
00260 void updateCachedImage( );
00262 void renderModeUpdateCachedImage();
00263
00264 signals:
00266 void extentChanged();
00267
00268 private:
00269
00271 enum Border
00272 {
00273 Left,
00274 Right,
00275 Bottom,
00276 Top
00277 };
00278
00279
00280
00281 QgsMapRenderer *mMapRenderer;
00282
00284 int mId;
00285
00286
00287
00288
00289 QgsRectangle mExtent;
00290
00291
00292 QImage mCacheImage;
00293
00294
00295 bool mCacheUpdated;
00296
00298 PreviewMode mPreviewMode;
00299
00301 int mNumCachedLayers;
00302
00304 bool mDrawing;
00305
00307 double mXOffset;
00309 double mYOffset;
00310
00312 bool mKeepLayerSet;
00313
00315 QStringList mLayerSet;
00316
00318 void connectUpdateSlot();
00319
00321 void syncLayerSet();
00322
00324 bool mGridEnabled;
00326 GridStyle mGridStyle;
00328 double mGridIntervalX;
00330 double mGridIntervalY;
00332 double mGridOffsetX;
00334 double mGridOffsetY;
00336 QPen mGridPen;
00338 QFont mGridAnnotationFont;
00340 int mGridAnnotationPrecision;
00342 bool mShowGridAnnotation;
00344 GridAnnotationPosition mGridAnnotationPosition;
00346 double mAnnotationFrameDistance;
00348 GridAnnotationDirection mGridAnnotationDirection;
00350 QRectF mCurrentRectangle;
00352 double mCrossLength;
00353 QGraphicsView* mMapCanvas;
00354
00356 void drawGrid( QPainter* p );
00361 void drawCoordinateAnnotations( QPainter* p, const QList< QPair< double, QLineF > >& hLines, const QList< QPair< double, QLineF > >& vLines );
00362 void drawCoordinateAnnotation( QPainter* p, const QPointF& pos, QString annotationString );
00368 void drawAnnotation( QPainter* p, const QPointF& pos, int rotation, const QString& annotationText );
00371 int xGridLines( QList< QPair< double, QLineF > >& lines ) const;
00374 int yGridLines( QList< QPair< double, QLineF > >& lines ) const;
00376 QgsRectangle transformedExtent() const;
00378 QPolygonF transformedMapPolygon() const;
00379 double maxExtension() const;
00383 void mapPolygon( QPolygonF& poly ) const;
00385 void requestedExtent( QgsRectangle& extent ) const;
00387 double mapUnitsToMM() const;
00391 void transformShift( double& xShift, double& yShift ) const;
00393 QPointF mapToItemCoords( const QPointF& mapCoords ) const;
00395 Border borderForLineCoord( const QPointF& p ) const;
00396
00397 void drawCanvasItems( QPainter* painter, const QStyleOptionGraphicsItem* itemStyle );
00398 void drawCanvasItem( QGraphicsItem* item, QPainter* painter, const QStyleOptionGraphicsItem* itemStyle );
00399 QPointF composerMapPosForItem( const QGraphicsItem* item ) const;
00400 };
00401
00402 #endif