Skip to content

Commit f1ca934

Browse files
author
mhugent
committed
Add a label id to distinguish different composer labels. Allow label string replacement in GetPrint request of qgis server and return more verbose error messages
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@15041 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent ee85b86 commit f1ca934

10 files changed

+88
-10
lines changed

python/core/qgscomposerlabel.sip

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,7 @@ class QgsComposerLabel: QgsComposerItem
4848
* @param node is Dom node corresponding to 'ComposerLabel' tag
4949
*/
5050
bool readXML( const QDomElement& itemElem, const QDomDocument& doc );
51+
52+
/**Get label identification number*/
53+
int id() const;
5154
};

src/core/composer/qgscomposerlabel.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ QgsComposerLabel::QgsComposerLabel( QgsComposition *composition ): QgsComposerIt
2525
{
2626
//default font size is 10 point
2727
mFont.setPointSizeF( 10 );
28+
29+
//get new id
30+
mId = maximumLabelId( composition ) + 1;
2831
}
2932

3033
QgsComposerLabel::~QgsComposerLabel()
@@ -127,6 +130,7 @@ bool QgsComposerLabel::writeXML( QDomElement& elem, QDomDocument & doc ) const
127130

128131
composerLabelElem.setAttribute( "halign", mHAlignment );
129132
composerLabelElem.setAttribute( "valign", mVAlignment );
133+
composerLabelElem.setAttribute( "id", mId );
130134

131135

132136
//font
@@ -168,6 +172,9 @@ bool QgsComposerLabel::readXML( const QDomElement& itemElem, const QDomDocument&
168172
//Vertical alignment
169173
mVAlignment = ( Qt::AlignmentFlag )( itemElem.attribute( "valign" ).toInt() );
170174

175+
//id
176+
mId = itemElem.attribute( "id", "0" ).toInt();
177+
171178
//font
172179
QDomNodeList labelFontList = itemElem.elementsByTagName( "LabelFont" );
173180
if ( labelFontList.size() > 0 )
@@ -201,3 +208,27 @@ bool QgsComposerLabel::readXML( const QDomElement& itemElem, const QDomDocument&
201208
emit itemChanged();
202209
return true;
203210
}
211+
212+
int QgsComposerLabel::maximumLabelId( const QgsComposition* c ) const
213+
{
214+
int id = -1;
215+
if ( !c )
216+
{
217+
return id;
218+
}
219+
220+
QList<QGraphicsItem *> itemList = c->items();
221+
QList<QGraphicsItem *>::const_iterator itemIt = itemList.constBegin();
222+
for ( ; itemIt != itemList.constEnd(); ++itemIt )
223+
{
224+
const QgsComposerLabel* label = dynamic_cast<const QgsComposerLabel *>( *itemIt );
225+
if ( label )
226+
{
227+
if ( label->id() > id )
228+
{
229+
id = label->id();
230+
}
231+
}
232+
}
233+
return id;
234+
}

src/core/composer/qgscomposerlabel.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ class CORE_EXPORT QgsComposerLabel: public QgsComposerItem
7272
*/
7373
bool readXML( const QDomElement& itemElem, const QDomDocument& doc );
7474

75+
/**Get label identification number*/
76+
int id() const { return mId; }
77+
7578
private:
7679
// Text
7780
QString mText;
@@ -91,8 +94,14 @@ class CORE_EXPORT QgsComposerLabel: public QgsComposerItem
9194
// Vertical Alignment
9295
Qt::AlignmentFlag mVAlignment;
9396

97+
// Label id (unique within the same composition)
98+
int mId;
99+
94100
/**Replaces replace '$CURRENT_DATE<(FORMAT)>' with the current date (e.g. $CURRENT_DATE(d 'June' yyyy)*/
95101
void replaceDateText( QString& text ) const;
102+
103+
/**Returns maximum id of all label items or -1 if no item is in the scene. Used to generate new ids in the constructor*/
104+
int maximumLabelId( const QgsComposition* c ) const;
96105
};
97106

98107
#endif

src/mapserver/qgsconfigparser.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include "qgsconfigparser.h"
1919
#include "qgsapplication.h"
20+
#include "qgscomposerlabel.h"
2021
#include "qgscomposermap.h"
2122
#include "qgscomposition.h"
2223
#include "qgsrasterlayer.h"
@@ -375,7 +376,25 @@ QgsComposition* QgsConfigParser::createPrintComposition( const QString& composer
375376
}
376377
}
377378

378-
//replace composer label text
379+
//replace label text
380+
QList<QgsComposerLabel*>::const_iterator labelIt = composerLabels.constBegin();
381+
QgsComposerLabel* currentLabel = 0;
382+
383+
for ( ; labelIt != composerLabels.constEnd(); ++labelIt )
384+
{
385+
currentLabel = *labelIt;
386+
QMap< QString, QString >::const_iterator titleIt = parameterMap.find( "LABEL" + QString::number( currentLabel->id() ) );
387+
if ( titleIt == parameterMap.constEnd() )
388+
{
389+
//remove label
390+
c->removeItem( *labelIt );
391+
delete( *labelIt );
392+
continue;
393+
}
394+
395+
currentLabel->setText( titleIt.value() );
396+
currentLabel->adjustSizeToText();
397+
}
379398

380399
return c;
381400
}

src/mapserver/qgsconfigparser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ class QgsConfigParser
9696
QgsComposition* createPrintComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, const QMap< QString, QString >& parameterMap ) const;
9797

9898
/**Creates a composition from the project file (probably delegated to the fallback parser)*/
99-
virtual QgsComposition* initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* > labelList ) const = 0;
99+
virtual QgsComposition* initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList ) const = 0;
100100

101101
/**Adds print capabilities to xml document. ParentElem usually is the <Capabilities> element*/
102102
virtual void printCapabilities( QDomElement& parentElement, QDomDocument& doc ) const = 0;

src/mapserver/qgsprojectparser.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "qgsepsgcache.h"
2020
#include "qgsmslayercache.h"
2121
#include "qgsmapserverlogger.h"
22+
#include "qgsmapserviceexception.h"
2223
#include "qgsrasterlayer.h"
2324
#include "qgsvectorlayer.h"
2425

@@ -32,6 +33,7 @@
3233
#include "qgscomposerscalebar.h"
3334
#include "qgscomposershape.h"
3435

36+
3537
QgsProjectParser::QgsProjectParser( QDomDocument* xmlDoc ): QgsConfigParser(), mXMLDoc( xmlDoc )
3638
{
3739
mOutputUnits = QgsMapRenderer::Millimeters;
@@ -824,13 +826,13 @@ QString QgsProjectParser::layerIdFromLegendLayer( const QDomElement& legendLayer
824826
return legendLayerFileList.at( 0 ).toElement().attribute( "layerid" );
825827
}
826828

827-
QgsComposition* QgsProjectParser::initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* > labelList ) const
829+
QgsComposition* QgsProjectParser::initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList ) const
828830
{
829831
//Create composition from xml
830832
QDomElement composerElem = composerByName( composerTemplate );
831833
if ( composerElem.isNull() )
832834
{
833-
return 0;
835+
throw QgsMapServiceException( "Error", "Composer template not found" );
834836
}
835837

836838
QDomElement compositionElem = composerElem.firstChildElement( "Composition" );
@@ -957,6 +959,16 @@ void QgsProjectParser::printCapabilities( QDomElement& parentElement, QDomDocume
957959
composerTemplateElem.appendChild( composerMapElem );
958960
}
959961

962+
//add available composer labels
963+
QDomNodeList composerLabelList = currentComposerElem.elementsByTagName( "ComposerLabel" );
964+
for ( int j = 0; j < composerLabelList.size(); ++j )
965+
{
966+
QDomElement clabel = composerLabelList.at( j ).toElement();
967+
QDomElement composerLabelElem = doc.createElement( "ComposerLabel" );
968+
composerLabelElem.setAttribute( "name", "label" + clabel.attribute( "id" ) );
969+
composerTemplateElem.appendChild( composerLabelElem );
970+
}
971+
960972
parentElement.appendChild( composerTemplateElem );
961973
}
962974
}

src/mapserver/qgsprojectparser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class QgsProjectParser: public QgsConfigParser
8888
const QDomDocument* xmlDoc() const { return mXMLDoc; }
8989

9090
/**Creates a composition from the project file (probably delegated to the fallback parser)*/
91-
QgsComposition* initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* > labelList ) const;
91+
QgsComposition* initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList ) const;
9292

9393
/**Adds print capabilities to xml document. ParentElem usually is the <Capabilities> element*/
9494
void printCapabilities( QDomElement& parentElement, QDomDocument& doc ) const;

src/mapserver/qgssldparser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1539,7 +1539,7 @@ void QgsSLDParser::setCrsForLayer( const QDomElement& layerElem, QgsMapLayer* ml
15391539
}
15401540
}
15411541

1542-
QgsComposition* QgsSLDParser::initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* > labelList ) const
1542+
QgsComposition* QgsSLDParser::initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList ) const
15431543
{
15441544
if ( mFallbackParser )
15451545
{

src/mapserver/qgssldparser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class QgsSLDParser: public QgsConfigParser
6969
virtual void setParameterMap( const std::map<QString, QString>& parameterMap ) { mParameterMap = parameterMap; }
7070

7171
/**Creates a composition from the project file (delegated to the fallback parser)*/
72-
QgsComposition* initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* > labelList ) const;
72+
QgsComposition* initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList ) const;
7373

7474
/**Adds print capabilities to xml document. Delegated to fallback parser*/
7575
void printCapabilities( QDomElement& parentElement, QDomDocument& doc ) const;

src/mapserver/qgswmsserver.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ QByteArray* QgsWMSServer::getPrint( QString& formatString )
369369
std::map<QString, QString>::const_iterator templateIt = mParameterMap.find( "TEMPLATE" );
370370
if ( templateIt == mParameterMap.end() )
371371
{
372-
return 0;
372+
throw QgsMapServiceException( "ParameterMissing", "The TEMPLATE parameter is required for the GetPrint request" );
373373
}
374374

375375
QgsComposition* c = mConfigParser->createPrintComposition( templateIt->second, mMapRenderer, QMap<QString, QString>( mParameterMap ) );
@@ -401,7 +401,7 @@ QByteArray* QgsWMSServer::getPrint( QString& formatString )
401401
c->render( &p, targetArea, sourceArea );
402402
p.end();
403403
}
404-
else if ( formatString.compare( "png", Qt::CaseInsensitive ) == 0 )
404+
else if ( formatString.compare( "png", Qt::CaseInsensitive ) == 0 || formatString.compare( "jpg", Qt::CaseInsensitive ) == 0 )
405405
{
406406
int width = ( int )( c->paperWidth() * c->printResolution() / 25.4 ); //width in pixel
407407
int height = ( int )( c->paperHeight() * c->printResolution() / 25.4 ); //height in pixel
@@ -417,7 +417,7 @@ QByteArray* QgsWMSServer::getPrint( QString& formatString )
417417
ba = new QByteArray();
418418
QBuffer buffer( ba );
419419
buffer.open( QIODevice::WriteOnly );
420-
image.save( &buffer, "png", -1 );
420+
image.save( &buffer, formatString.toLocal8Bit().data(), -1 );
421421
}
422422
else if ( formatString.compare( "pdf", Qt::CaseInsensitive ) == 0 )
423423
{
@@ -443,6 +443,10 @@ QByteArray* QgsWMSServer::getPrint( QString& formatString )
443443
ba = new QByteArray();
444444
*ba = tempFile.readAll();
445445
}
446+
else //unknown format
447+
{
448+
throw QgsMapServiceException( "InvalidFormat", "Output format '" + formatString + "' is not supported in the GetPrint request" );
449+
}
446450

447451
delete c;
448452
return ba;

0 commit comments

Comments
 (0)