Quantum GIS API Documentation
1.8
|
00001 /*************************************************************************** 00002 qgscomposerlegenditem.cpp - description 00003 ------------------------- 00004 begin : May 2010 00005 copyright : (C) 2010 by Marco Hugentobler 00006 email : marco dot hugentobler at sourcepole dot ch 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 "qgscomposerlegenditem.h" 00019 #include "qgsmaplayerregistry.h" 00020 #include "qgsrasterlayer.h" 00021 #include "qgssymbol.h" 00022 #include "qgssymbolv2.h" 00023 #include "qgssymbollayerv2utils.h" 00024 #include "qgsvectorlayer.h" 00025 #include "qgsapplication.h" 00026 #include <QDomDocument> 00027 #include <QDomElement> 00028 00029 QgsComposerLegendItem::QgsComposerLegendItem(): QStandardItem() 00030 { 00031 } 00032 00033 QgsComposerLegendItem::QgsComposerLegendItem( const QString& text ): QStandardItem( text ) 00034 { 00035 } 00036 00037 QgsComposerLegendItem::QgsComposerLegendItem( const QIcon& icon, const QString& text ): QStandardItem( icon, text ) 00038 { 00039 } 00040 00041 QgsComposerLegendItem::~QgsComposerLegendItem() 00042 { 00043 } 00044 00045 void QgsComposerLegendItem::writeXMLChildren( QDomElement& elem, QDomDocument& doc ) const 00046 { 00047 int numRows = rowCount(); 00048 QgsComposerLegendItem* currentItem = 0; 00049 for ( int i = 0; i < numRows; ++i ) 00050 { 00051 currentItem = dynamic_cast<QgsComposerLegendItem*>( child( i, 0 ) ); 00052 if ( currentItem ) 00053 { 00054 currentItem->writeXML( elem, doc ); 00055 } 00056 } 00057 } 00058 00060 00061 QgsComposerSymbolItem::QgsComposerSymbolItem(): QgsComposerLegendItem(), mSymbol( 0 ) 00062 { 00063 } 00064 00065 QgsComposerSymbolItem::QgsComposerSymbolItem( const QString& text ): QgsComposerLegendItem( text ), mSymbol( 0 ) 00066 { 00067 } 00068 00069 QgsComposerSymbolItem::QgsComposerSymbolItem( const QIcon& icon, const QString& text ): QgsComposerLegendItem( icon, text ), mSymbol( 0 ) 00070 { 00071 } 00072 00073 QgsComposerSymbolItem::~QgsComposerSymbolItem() 00074 { 00075 delete mSymbol; 00076 } 00077 00078 void QgsComposerSymbolItem::setSymbol( QgsSymbol* s ) 00079 { 00080 delete mSymbol; 00081 mSymbol = s; 00082 } 00083 00084 QStandardItem* QgsComposerSymbolItem::clone() const 00085 { 00086 QgsComposerSymbolItem* cloneItem = new QgsComposerSymbolItem(); 00087 *cloneItem = *this; 00088 if ( mSymbol ) 00089 { 00090 cloneItem->setSymbol( new QgsSymbol( *mSymbol ) ); 00091 } 00092 return cloneItem; 00093 } 00094 00095 void QgsComposerSymbolItem::writeXML( QDomElement& elem, QDomDocument& doc ) const 00096 { 00097 QDomElement vectorClassElem = doc.createElement( "VectorClassificationItem" ); 00098 if ( mSymbol ) 00099 { 00100 mSymbol->writeXML( vectorClassElem, doc, 0 ); 00101 } 00102 vectorClassElem.setAttribute( "text", text() ); 00103 vectorClassElem.setAttribute( "layerId", mLayerID ); 00104 00105 elem.appendChild( vectorClassElem ); 00106 } 00107 00108 void QgsComposerSymbolItem::readXML( const QDomElement& itemElem, bool xServerAvailable ) 00109 { 00110 if ( itemElem.isNull() ) 00111 { 00112 return; 00113 } 00114 setText( itemElem.attribute( "text", "" ) ); 00115 setLayerID( itemElem.attribute( "layerId", "" ) ); 00116 00117 QgsVectorLayer* vLayer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( mLayerID ) ); 00118 if ( vLayer ) 00119 { 00120 QDomElement symbolElem = itemElem.firstChildElement( "symbol" ); 00121 if ( !symbolElem.isNull() ) 00122 { 00123 QgsSymbol* symbol = new QgsSymbol( vLayer->geometryType() ); 00124 symbol->readXML( symbolElem, vLayer ); 00125 setSymbol( symbol ); 00126 if ( !xServerAvailable ) //don't read icon without GUI 00127 { 00128 return; 00129 } 00130 00131 //add icon 00132 switch ( symbol->type() ) 00133 { 00134 case QGis::Point: 00135 setIcon( QIcon( QPixmap::fromImage( symbol->getPointSymbolAsImage() ) ) ); 00136 break; 00137 case QGis::Line: 00138 setIcon( QIcon( QPixmap::fromImage( symbol->getLineSymbolAsImage() ) ) ); 00139 break; 00140 case QGis::Polygon: 00141 setIcon( QIcon( QPixmap::fromImage( symbol->getPolygonSymbolAsImage() ) ) ); 00142 break; 00143 case QGis::NoGeometry: 00144 setIcon( QIcon( QgsApplication::activeThemePath() + "/mIconTableLayer.png" ) ); 00145 break; 00146 case QGis::UnknownGeometry: 00147 // should not occur 00148 break; 00149 } 00150 } 00151 } 00152 } 00153 00155 00156 #include "qgssymbolv2.h" 00157 00158 QgsComposerSymbolV2Item::QgsComposerSymbolV2Item(): QgsComposerLegendItem(), mSymbolV2( 0 ) 00159 { 00160 } 00161 00162 QgsComposerSymbolV2Item::QgsComposerSymbolV2Item( const QString& text ): QgsComposerLegendItem( text ), mSymbolV2( 0 ) 00163 { 00164 } 00165 00166 QgsComposerSymbolV2Item::QgsComposerSymbolV2Item( const QIcon& icon, const QString& text ): QgsComposerLegendItem( icon, text ), mSymbolV2( 0 ) 00167 { 00168 } 00169 00170 QgsComposerSymbolV2Item::~QgsComposerSymbolV2Item() 00171 { 00172 delete mSymbolV2; 00173 } 00174 00175 QStandardItem* QgsComposerSymbolV2Item::clone() const 00176 { 00177 QgsComposerSymbolV2Item* cloneItem = new QgsComposerSymbolV2Item(); 00178 *cloneItem = *this; 00179 if ( mSymbolV2 ) 00180 { 00181 cloneItem->setSymbolV2( mSymbolV2->clone() ); 00182 } 00183 return cloneItem; 00184 } 00185 00186 void QgsComposerSymbolV2Item::writeXML( QDomElement& elem, QDomDocument& doc ) const 00187 { 00188 QDomElement vectorClassElem = doc.createElement( "VectorClassificationItemNg" ); 00189 if ( mSymbolV2 ) 00190 { 00191 QgsSymbolV2Map saveSymbolMap; 00192 saveSymbolMap.insert( "classificationSymbol", mSymbolV2 ); 00193 QDomElement symbolsElem = QgsSymbolLayerV2Utils::saveSymbols( saveSymbolMap, "symbols", doc ); 00194 vectorClassElem.appendChild( symbolsElem ); 00195 } 00196 vectorClassElem.setAttribute( "text", text() ); 00197 elem.appendChild( vectorClassElem ); 00198 } 00199 00200 void QgsComposerSymbolV2Item::readXML( const QDomElement& itemElem, bool xServerAvailable ) 00201 { 00202 if ( itemElem.isNull() ) 00203 { 00204 return; 00205 } 00206 00207 setText( itemElem.attribute( "text", "" ) ); 00208 QDomElement symbolsElem = itemElem.firstChildElement( "symbols" ); 00209 if ( !symbolsElem.isNull() ) 00210 { 00211 QgsSymbolV2Map loadSymbolMap = QgsSymbolLayerV2Utils::loadSymbols( symbolsElem ); 00212 //we assume there is only one symbol in the map... 00213 QgsSymbolV2Map::iterator mapIt = loadSymbolMap.begin(); 00214 if ( mapIt != loadSymbolMap.end() ) 00215 { 00216 QgsSymbolV2* symbolNg = mapIt.value(); 00217 if ( symbolNg ) 00218 { 00219 setSymbolV2( symbolNg ); 00220 if ( xServerAvailable ) 00221 { 00222 setIcon( QgsSymbolLayerV2Utils::symbolPreviewIcon( symbolNg, QSize( 30, 30 ) ) ); 00223 } 00224 } 00225 } 00226 } 00227 } 00228 00229 void QgsComposerSymbolV2Item::setSymbolV2( QgsSymbolV2* s ) 00230 { 00231 delete mSymbolV2; 00232 mSymbolV2 = s; 00233 } 00234 00236 00237 QgsComposerRasterSymbolItem::QgsComposerRasterSymbolItem(): QgsComposerLegendItem() 00238 { 00239 } 00240 00241 QgsComposerRasterSymbolItem::QgsComposerRasterSymbolItem( const QString& text ): QgsComposerLegendItem( text ) 00242 { 00243 } 00244 00245 QgsComposerRasterSymbolItem::QgsComposerRasterSymbolItem( const QIcon& icon, const QString& text ): QgsComposerLegendItem( icon, text ) 00246 { 00247 } 00248 00249 QgsComposerRasterSymbolItem::~QgsComposerRasterSymbolItem() 00250 { 00251 } 00252 00253 QStandardItem* QgsComposerRasterSymbolItem::clone() const 00254 { 00255 QgsComposerRasterSymbolItem* cloneItem = new QgsComposerRasterSymbolItem(); 00256 *cloneItem = *this; 00257 cloneItem->setLayerID( mLayerID ); 00258 return cloneItem; 00259 } 00260 00261 void QgsComposerRasterSymbolItem::writeXML( QDomElement& elem, QDomDocument& doc ) const 00262 { 00263 QDomElement rasterClassElem = doc.createElement( "RasterClassificationItem" ); 00264 rasterClassElem.setAttribute( "layerId", mLayerID ); 00265 rasterClassElem.setAttribute( "text", text() ); 00266 rasterClassElem.setAttribute( "color", mColor.name() ); 00267 elem.appendChild( rasterClassElem ); 00268 } 00269 00270 void QgsComposerRasterSymbolItem::readXML( const QDomElement& itemElem, bool xServerAvailable ) 00271 { 00272 if ( itemElem.isNull() ) 00273 { 00274 return; 00275 } 00276 setText( itemElem.attribute( "text", "" ) ); 00277 setLayerID( itemElem.attribute( "layerId", "" ) ); 00278 setColor( QColor( itemElem.attribute( "color" ) ) ); 00279 00280 if ( xServerAvailable ) 00281 { 00282 QPixmap itemPixmap( 20, 20 ); 00283 itemPixmap.fill( mColor ); 00284 setIcon( QIcon( itemPixmap ) ); 00285 } 00286 } 00287 00289 00290 QgsComposerLayerItem::QgsComposerLayerItem(): QgsComposerLegendItem() 00291 { 00292 } 00293 00294 QgsComposerLayerItem::QgsComposerLayerItem( const QString& text ): QgsComposerLegendItem( text ) 00295 { 00296 } 00297 00298 QgsComposerLayerItem::~QgsComposerLayerItem() 00299 { 00300 } 00301 00302 QStandardItem* QgsComposerLayerItem::clone() const 00303 { 00304 QgsComposerLayerItem* cloneItem = new QgsComposerLayerItem(); 00305 *cloneItem = *this; 00306 cloneItem->setLayerID( mLayerID ); 00307 return cloneItem; 00308 } 00309 00310 void QgsComposerLayerItem::writeXML( QDomElement& elem, QDomDocument& doc ) const 00311 { 00312 QDomElement layerItemElem = doc.createElement( "LayerItem" ); 00313 layerItemElem.setAttribute( "layerId", mLayerID ); 00314 layerItemElem.setAttribute( "text", text() ); 00315 writeXMLChildren( layerItemElem, doc ); 00316 elem.appendChild( layerItemElem ); 00317 } 00318 00319 void QgsComposerLayerItem::readXML( const QDomElement& itemElem, bool xServerAvailable ) 00320 { 00321 if ( itemElem.isNull() ) 00322 { 00323 return; 00324 } 00325 setText( itemElem.attribute( "text", "" ) ); 00326 setLayerID( itemElem.attribute( "layerId", "" ) ); 00327 00328 //now call readXML for all the child items 00329 QDomNodeList childList = itemElem.childNodes(); 00330 QDomNode currentNode; 00331 QDomElement currentElem; 00332 QgsComposerLegendItem* currentChildItem = 0; 00333 00334 int nChildItems = childList.count(); 00335 for ( int i = 0; i < nChildItems; ++i ) 00336 { 00337 currentNode = childList.at( i ); 00338 if ( !currentNode.isElement() ) 00339 { 00340 continue; 00341 } 00342 00343 currentElem = currentNode.toElement(); 00344 QString elemTag = currentElem.tagName(); 00345 if ( elemTag == "VectorClassificationItem" ) 00346 { 00347 currentChildItem = new QgsComposerSymbolItem(); 00348 } 00349 else if ( elemTag == "VectorClassificationItemNg" ) 00350 { 00351 currentChildItem = new QgsComposerSymbolV2Item(); 00352 } 00353 else if ( elemTag == "RasterClassificationItem" ) 00354 { 00355 currentChildItem = new QgsComposerRasterSymbolItem(); 00356 } 00357 else 00358 { 00359 continue; //unsupported child type 00360 } 00361 currentChildItem->readXML( currentElem, xServerAvailable ); 00362 appendRow( currentChildItem ); 00363 } 00364 } 00365 00367 00368 QgsComposerGroupItem::QgsComposerGroupItem(): QgsComposerLegendItem() 00369 { 00370 } 00371 00372 QgsComposerGroupItem::QgsComposerGroupItem( const QString& text ): QgsComposerLegendItem( text ) 00373 { 00374 } 00375 00376 QgsComposerGroupItem::~QgsComposerGroupItem() 00377 { 00378 } 00379 00380 QStandardItem* QgsComposerGroupItem::clone() const 00381 { 00382 QgsComposerGroupItem* cloneItem = new QgsComposerGroupItem(); 00383 *cloneItem = *this; 00384 return cloneItem; 00385 } 00386 00387 void QgsComposerGroupItem::writeXML( QDomElement& elem, QDomDocument& doc ) const 00388 { 00389 QDomElement layerGroupElem = doc.createElement( "GroupItem" ); 00390 layerGroupElem.setAttribute( "text", text() ); 00391 writeXMLChildren( layerGroupElem, doc ); 00392 elem.appendChild( layerGroupElem ); 00393 } 00394 00395 void QgsComposerGroupItem::readXML( const QDomElement& itemElem, bool xServerAvailable ) 00396 { 00397 if ( itemElem.isNull() ) 00398 { 00399 return; 00400 } 00401 setText( itemElem.attribute( "text", "" ) ); 00402 00403 //now call readXML for all the child items 00404 QDomNodeList childList = itemElem.childNodes(); 00405 QDomNode currentNode; 00406 QDomElement currentElem; 00407 QgsComposerLegendItem* currentChildItem = 0; 00408 00409 int nChildItems = childList.count(); 00410 for ( int i = 0; i < nChildItems; ++i ) 00411 { 00412 currentNode = childList.at( i ); 00413 if ( !currentNode.isElement() ) 00414 { 00415 continue; 00416 } 00417 00418 currentElem = currentNode.toElement(); 00419 QString elemTag = currentElem.tagName(); 00420 00421 if ( elemTag == "GroupItem" ) 00422 { 00423 currentChildItem = new QgsComposerGroupItem(); 00424 } 00425 else if ( elemTag == "LayerItem" ) 00426 { 00427 currentChildItem = new QgsComposerLayerItem(); 00428 } 00429 else 00430 { 00431 continue; //unsupported child item type 00432 } 00433 currentChildItem->readXML( currentElem, xServerAvailable ); 00434 appendRow( currentChildItem ); 00435 } 00436 }