Quantum GIS API Documentation  1.8
src/core/composer/qgscomposerlegenditem.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines