00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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 )
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
00127
00128 switch ( symbol->type() )
00129 {
00130 case QGis::Point:
00131 setIcon( QIcon( QPixmap::fromImage( symbol->getPointSymbolAsImage() ) ) );
00132 break;
00133 case QGis::Line:
00134 setIcon( QIcon( QPixmap::fromImage( symbol->getLineSymbolAsImage() ) ) );
00135 break;
00136 case QGis::Polygon:
00137 setIcon( QIcon( QPixmap::fromImage( symbol->getPolygonSymbolAsImage() ) ) );
00138 break;
00139 case QGis::NoGeometry:
00140 setIcon( QIcon( QgsApplication::activeThemePath() + "/mIconTableLayer.png" ) );
00141 break;
00142 case QGis::UnknownGeometry:
00143
00144 break;
00145 }
00146 }
00147 }
00148 }
00149
00151
00152 #include "qgssymbolv2.h"
00153
00154 QgsComposerSymbolV2Item::QgsComposerSymbolV2Item(): QgsComposerLegendItem(), mSymbolV2( 0 )
00155 {
00156 }
00157
00158 QgsComposerSymbolV2Item::QgsComposerSymbolV2Item( const QString& text ): QgsComposerLegendItem( text ), mSymbolV2( 0 )
00159 {
00160 }
00161
00162 QgsComposerSymbolV2Item::QgsComposerSymbolV2Item( const QIcon& icon, const QString& text ): QgsComposerLegendItem( icon, text ), mSymbolV2( 0 )
00163 {
00164 }
00165
00166 QgsComposerSymbolV2Item::~QgsComposerSymbolV2Item()
00167 {
00168 delete mSymbolV2;
00169 }
00170
00171 QStandardItem* QgsComposerSymbolV2Item::clone() const
00172 {
00173 QgsComposerSymbolV2Item* cloneItem = new QgsComposerSymbolV2Item();
00174 *cloneItem = *this;
00175 if ( mSymbolV2 )
00176 {
00177 cloneItem->setSymbolV2( mSymbolV2->clone() );
00178 }
00179 return cloneItem;
00180 }
00181
00182 void QgsComposerSymbolV2Item::writeXML( QDomElement& elem, QDomDocument& doc ) const
00183 {
00184 QDomElement vectorClassElem = doc.createElement( "VectorClassificationItemNg" );
00185 if ( mSymbolV2 )
00186 {
00187 QgsSymbolV2Map saveSymbolMap;
00188 saveSymbolMap.insert( "classificationSymbol", mSymbolV2 );
00189 QDomElement symbolsElem = QgsSymbolLayerV2Utils::saveSymbols( saveSymbolMap, "symbols", doc );
00190 vectorClassElem.appendChild( symbolsElem );
00191 }
00192 vectorClassElem.setAttribute( "text", text() );
00193 elem.appendChild( vectorClassElem );
00194 }
00195
00196 void QgsComposerSymbolV2Item::readXML( const QDomElement& itemElem )
00197 {
00198 if ( itemElem.isNull() )
00199 {
00200 return;
00201 }
00202
00203 setText( itemElem.attribute( "text", "" ) );
00204 QDomElement symbolsElem = itemElem.firstChildElement( "symbols" );
00205 if ( !symbolsElem.isNull() )
00206 {
00207 QgsSymbolV2Map loadSymbolMap = QgsSymbolLayerV2Utils::loadSymbols( symbolsElem );
00208
00209 QgsSymbolV2Map::iterator mapIt = loadSymbolMap.begin();
00210 if ( mapIt != loadSymbolMap.end() )
00211 {
00212 QgsSymbolV2* symbolNg = mapIt.value();
00213 if ( symbolNg )
00214 {
00215 setSymbolV2( symbolNg );
00216 setIcon( QgsSymbolLayerV2Utils::symbolPreviewIcon( symbolNg, QSize( 30, 30 ) ) );
00217 }
00218 }
00219 }
00220 }
00221
00222 void QgsComposerSymbolV2Item::setSymbolV2( QgsSymbolV2* s )
00223 {
00224 delete mSymbolV2;
00225 mSymbolV2 = s;
00226 }
00227
00229
00230 QgsComposerRasterSymbolItem::QgsComposerRasterSymbolItem(): QgsComposerLegendItem()
00231 {
00232 }
00233
00234 QgsComposerRasterSymbolItem::QgsComposerRasterSymbolItem( const QString& text ): QgsComposerLegendItem( text )
00235 {
00236 }
00237
00238 QgsComposerRasterSymbolItem::QgsComposerRasterSymbolItem( const QIcon& icon, const QString& text ): QgsComposerLegendItem( icon, text )
00239 {
00240 }
00241
00242 QgsComposerRasterSymbolItem::~QgsComposerRasterSymbolItem()
00243 {
00244 }
00245
00246 QStandardItem* QgsComposerRasterSymbolItem::clone() const
00247 {
00248 QgsComposerRasterSymbolItem* cloneItem = new QgsComposerRasterSymbolItem();
00249 *cloneItem = *this;
00250 cloneItem->setLayerID( mLayerID );
00251 return cloneItem;
00252 }
00253
00254 void QgsComposerRasterSymbolItem::writeXML( QDomElement& elem, QDomDocument& doc ) const
00255 {
00256 QDomElement rasterClassElem = doc.createElement( "RasterClassificationItem" );
00257 rasterClassElem.setAttribute( "layerId", mLayerID );
00258 rasterClassElem.setAttribute( "text", text() );
00259 elem.appendChild( rasterClassElem );
00260 }
00261
00262 void QgsComposerRasterSymbolItem::readXML( const QDomElement& itemElem )
00263 {
00264 if ( itemElem.isNull() )
00265 {
00266 return;
00267 }
00268 setText( itemElem.attribute( "text", "" ) );
00269 setLayerID( itemElem.attribute( "layerId", "" ) );
00270
00271 QgsRasterLayer* rLayer = qobject_cast<QgsRasterLayer*>( QgsMapLayerRegistry::instance()->mapLayer( mLayerID ) );
00272 if ( rLayer )
00273 {
00274 setIcon( QIcon( rLayer->legendAsPixmap( true ) ) );
00275 }
00276 }
00277
00279
00280 QgsComposerLayerItem::QgsComposerLayerItem(): QgsComposerLegendItem()
00281 {
00282 }
00283
00284 QgsComposerLayerItem::QgsComposerLayerItem( const QString& text ): QgsComposerLegendItem( text )
00285 {
00286 }
00287
00288 QgsComposerLayerItem::~QgsComposerLayerItem()
00289 {
00290 }
00291
00292 QStandardItem* QgsComposerLayerItem::clone() const
00293 {
00294 QgsComposerLayerItem* cloneItem = new QgsComposerLayerItem();
00295 *cloneItem = *this;
00296 cloneItem->setLayerID( mLayerID );
00297 return cloneItem;
00298 }
00299
00300 void QgsComposerLayerItem::writeXML( QDomElement& elem, QDomDocument& doc ) const
00301 {
00302 QDomElement layerItemElem = doc.createElement( "LayerItem" );
00303 layerItemElem.setAttribute( "layerId", mLayerID );
00304 layerItemElem.setAttribute( "text", text() );
00305 writeXMLChildren( layerItemElem, doc );
00306 elem.appendChild( layerItemElem );
00307 }
00308
00309 void QgsComposerLayerItem::readXML( const QDomElement& itemElem )
00310 {
00311 if ( itemElem.isNull() )
00312 {
00313 return;
00314 }
00315 setText( itemElem.attribute( "text", "" ) );
00316 setLayerID( itemElem.attribute( "layerId", "" ) );
00317
00318
00319 QDomNodeList childList = itemElem.childNodes();
00320 QDomNode currentNode;
00321 QDomElement currentElem;
00322 QgsComposerLegendItem* currentChildItem = 0;
00323
00324 int nChildItems = childList.count();
00325 for ( int i = 0; i < nChildItems; ++i )
00326 {
00327 currentNode = childList.at( i );
00328 if ( !currentNode.isElement() )
00329 {
00330 continue;
00331 }
00332
00333 currentElem = currentNode.toElement();
00334 QString elemTag = currentElem.tagName();
00335 if ( elemTag == "VectorClassificationItem" )
00336 {
00337 currentChildItem = new QgsComposerSymbolItem();
00338 }
00339 else if ( elemTag == "VectorClassificationItemNg" )
00340 {
00341 currentChildItem = new QgsComposerSymbolV2Item();
00342 }
00343 else if ( elemTag == "RasterClassificationItem" )
00344 {
00345 currentChildItem = new QgsComposerRasterSymbolItem();
00346 }
00347 else
00348 {
00349 continue;
00350 }
00351 currentChildItem->readXML( currentElem );
00352 appendRow( currentChildItem );
00353 }
00354 }
00355
00357
00358 QgsComposerGroupItem::QgsComposerGroupItem(): QgsComposerLegendItem()
00359 {
00360 }
00361
00362 QgsComposerGroupItem::QgsComposerGroupItem( const QString& text ): QgsComposerLegendItem( text )
00363 {
00364 }
00365
00366 QgsComposerGroupItem::~QgsComposerGroupItem()
00367 {
00368 }
00369
00370 QStandardItem* QgsComposerGroupItem::clone() const
00371 {
00372 QgsComposerGroupItem* cloneItem = new QgsComposerGroupItem();
00373 *cloneItem = *this;
00374 return cloneItem;
00375 }
00376
00377 void QgsComposerGroupItem::writeXML( QDomElement& elem, QDomDocument& doc ) const
00378 {
00379 QDomElement layerGroupElem = doc.createElement( "GroupItem" );
00380 layerGroupElem.setAttribute( "text", text() );
00381 writeXMLChildren( layerGroupElem, doc );
00382 elem.appendChild( layerGroupElem );
00383 }
00384
00385 void QgsComposerGroupItem::readXML( const QDomElement& itemElem )
00386 {
00387 if ( itemElem.isNull() )
00388 {
00389 return;
00390 }
00391 setText( itemElem.attribute( "text", "" ) );
00392
00393
00394 QDomNodeList childList = itemElem.childNodes();
00395 QDomNode currentNode;
00396 QDomElement currentElem;
00397 QgsComposerLegendItem* currentChildItem = 0;
00398
00399 int nChildItems = childList.count();
00400 for ( int i = 0; i < nChildItems; ++i )
00401 {
00402 currentNode = childList.at( i );
00403 if ( !currentNode.isElement() )
00404 {
00405 continue;
00406 }
00407
00408 currentElem = currentNode.toElement();
00409 QString elemTag = currentElem.tagName();
00410
00411 if ( elemTag == "GroupItem" )
00412 {
00413 currentChildItem = new QgsComposerGroupItem();
00414 }
00415 else if ( elemTag == "LayerItem" )
00416 {
00417 currentChildItem = new QgsComposerLayerItem();
00418 }
00419 else
00420 {
00421 continue;
00422 }
00423 currentChildItem->readXML( currentElem );
00424 appendRow( currentChildItem );
00425 }
00426 }