Skip to content

Commit 6d9cec5

Browse files
committedJun 12, 2013
[Feature][QGIS-Server] Specifying url for QgsComposerHtml in GetPRint Request
The idea is to add the capability to specify an URL to a QgsComposerHtml element in the GetPrint request. This will give the ability to get PDF with content base on a web service.
1 parent 85e1ab9 commit 6d9cec5

File tree

6 files changed

+88
-19
lines changed

6 files changed

+88
-19
lines changed
 

‎src/mapserver/qgsconfigparser.cpp

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
#include "qgsapplication.h"
2121
#include "qgscomposerlabel.h"
2222
#include "qgscomposermap.h"
23+
#include "qgscomposerhtml.h"
24+
#include "qgscomposerframe.h"
2325
#include "qgscomposition.h"
2426
#include "qgsrasterlayer.h"
2527
#include "qgsvectorlayer.h"
@@ -407,8 +409,9 @@ QgsComposition* QgsConfigParser::createPrintComposition( const QString& composer
407409
{
408410
QList<QgsComposerMap*> composerMaps;
409411
QList<QgsComposerLabel*> composerLabels;
412+
QList<const QgsComposerHtml*> composerHtmls;
410413

411-
QgsComposition* c = initComposition( composerTemplate, mapRenderer, composerMaps, composerLabels );
414+
QgsComposition* c = initComposition( composerTemplate, mapRenderer, composerMaps, composerLabels, composerHtmls );
412415
if ( !c )
413416
{
414417
return 0;
@@ -545,13 +548,35 @@ QgsComposition* QgsConfigParser::createPrintComposition( const QString& composer
545548
}
546549

547550
currentLabel->setText( title );
548-
/* the method adjustSizeToText has some rendering issue
549-
* for HTML or Simple String
550-
if ( !currentLabel->htmlState() )
551+
}
552+
553+
//replace html url
554+
foreach (const QgsComposerHtml *currentHtml, composerHtmls )
555+
{
556+
QgsComposerHtml * html = const_cast<QgsComposerHtml *>(currentHtml);
557+
QgsComposerFrame *htmlFrame = html->frame( 0 );
558+
QString htmlId = htmlFrame->id();
559+
QString url = parameterMap.value( htmlId.toUpper() );
560+
561+
if ( url.isEmpty() )
551562
{
552-
currentLabel->adjustSizeToText();
563+
//remove exported Htmls referenced in the request
564+
//but with empty string
565+
if ( parameterMap.contains( htmlId.toUpper() ) )
566+
{
567+
c->removeMultiFrame( html );
568+
delete currentHtml;
569+
}
570+
else
571+
{
572+
html->update();
573+
}
574+
continue;
553575
}
554-
*/
576+
577+
QUrl newUrl( url );
578+
html->setUrl( newUrl );
579+
html->update();
555580
}
556581

557582
return c;

‎src/mapserver/qgsconfigparser.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
class QgsComposition;
3030
class QgsComposerLabel;
3131
class QgsComposerMap;
32+
class QgsComposerFrame;
33+
class QgsComposerMultiFrame;
34+
class QgsComposerHtml;
3235
class QDomElement;
3336

3437
/**Interface class for configuration parsing, e.g. SLD configuration or QGIS project file*/
@@ -117,7 +120,7 @@ class QgsConfigParser
117120
QgsComposition* createPrintComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, const QMap< QString, QString >& parameterMap ) const;
118121

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

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

‎src/mapserver/qgsprojectparser.cpp

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "qgscomposerlabel.h"
3333
#include "qgscomposerlegend.h"
3434
#include "qgscomposermap.h"
35+
#include "qgscomposerhtml.h"
3536
#include "qgscomposerpicture.h"
3637
#include "qgscomposerscalebar.h"
3738
#include "qgscomposershape.h"
@@ -2187,7 +2188,7 @@ QString QgsProjectParser::layerIdFromLegendLayer( const QDomElement& legendLayer
21872188
return legendLayerFileList.at( 0 ).toElement().attribute( "layerid" );
21882189
}
21892190

2190-
QgsComposition* QgsProjectParser::initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList ) const
2191+
QgsComposition* QgsProjectParser::initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList, QList<const QgsComposerHtml *>& htmlList ) const
21912192
{
21922193
//Create composition from xml
21932194
QDomElement composerElem = composerByName( composerTemplate );
@@ -2210,15 +2211,40 @@ QgsComposition* QgsProjectParser::initComposition( const QString& composerTempla
22102211
}
22112212

22122213
composition->addItemsFromXML( compositionElem, *mXMLDoc );
2213-
composition->composerItems( mapList );
2214-
composition->composerItems( labelList );
22152214

2216-
QList< QgsComposerPicture* > pictureList;
2217-
composition->composerItems( pictureList );
2218-
QList< QgsComposerPicture* >::iterator picIt = pictureList.begin();
2219-
for ( ; picIt != pictureList.end(); ++picIt )
2215+
labelList.clear();
2216+
mapList.clear();
2217+
htmlList.clear();
2218+
2219+
QList<QgsComposerItem* > itemList;
2220+
composition->composerItems( itemList );
2221+
QList<QgsComposerItem *>::iterator itemIt = itemList.begin();
2222+
for ( ; itemIt != itemList.end(); ++itemIt )
22202223
{
2221-
( *picIt )->setPictureFile( convertToAbsolutePath(( *picIt )->pictureFile() ) );
2224+
QgsComposerLabel* label = dynamic_cast< QgsComposerLabel *>( *itemIt );
2225+
if ( label )
2226+
{
2227+
labelList.push_back( label );
2228+
continue;
2229+
}
2230+
QgsComposerMap* map = dynamic_cast< QgsComposerMap *>( *itemIt );
2231+
if ( map )
2232+
{
2233+
mapList.push_back( map );
2234+
continue;
2235+
}
2236+
QgsComposerPicture* pic = dynamic_cast< QgsComposerPicture *>( *itemIt );
2237+
if ( pic )
2238+
{
2239+
pic->setPictureFile( convertToAbsolutePath(( pic )->pictureFile() ) );
2240+
continue;
2241+
}
2242+
const QgsComposerHtml* html = composition->getComposerHtmlByItem( *itemIt );
2243+
if ( html )
2244+
{
2245+
htmlList.push_back( html );
2246+
continue;
2247+
}
22222248
}
22232249

22242250
return composition;
@@ -2294,6 +2320,21 @@ void QgsProjectParser::printCapabilities( QDomElement& parentElement, QDomDocume
22942320
composerTemplateElem.appendChild( composerLabelElem );
22952321
}
22962322

2323+
//add available composer HTML
2324+
QDomNodeList composerHtmlList = currentComposerElem.elementsByTagName( "ComposerHtml" );
2325+
for ( int j = 0; j < composerHtmlList.size(); ++j )
2326+
{
2327+
QDomElement citem = composerHtmlList.at( j ).firstChildElement( "ComposerFrame" ).firstChildElement( "ComposerItem" );
2328+
QString id = citem.attribute( "id" );
2329+
if ( id.isEmpty() ) //only export labels with ids for text replacement
2330+
{
2331+
continue;
2332+
}
2333+
QDomElement composerHtmlElem = doc.createElement( "ComposerHtml" );
2334+
composerHtmlElem.setAttribute( "name", id );
2335+
composerTemplateElem.appendChild( composerHtmlElem );
2336+
}
2337+
22972338
composerTemplatesElem.appendChild( composerTemplateElem );
22982339
}
22992340
parentElement.appendChild( composerTemplatesElem );

‎src/mapserver/qgsprojectparser.h

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

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

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

‎src/mapserver/qgssldparser.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1544,11 +1544,11 @@ void QgsSLDParser::setCrsForLayer( const QDomElement& layerElem, QgsMapLayer* ml
15441544
}
15451545
}
15461546

1547-
QgsComposition* QgsSLDParser::initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList ) const
1547+
QgsComposition* QgsSLDParser::initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList, QList<const QgsComposerHtml *>& htmlList ) const
15481548
{
15491549
if ( mFallbackParser )
15501550
{
1551-
return mFallbackParser->initComposition( composerTemplate, mapRenderer, mapList, labelList );
1551+
return mFallbackParser->initComposition( composerTemplate, mapRenderer, mapList, labelList, htmlList );
15521552
}
15531553
return 0;
15541554
}

‎src/mapserver/qgssldparser.h

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

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

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

0 commit comments

Comments
 (0)
Please sign in to comment.