[QGIS Commit] r15041 - in trunk/qgis: python/core src/core/composer
src/mapserver
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Fri Jan 14 05:23:16 EST 2011
Author: mhugent
Date: 2011-01-14 02:23:15 -0800 (Fri, 14 Jan 2011)
New Revision: 15041
Modified:
trunk/qgis/python/core/qgscomposerlabel.sip
trunk/qgis/src/core/composer/qgscomposerlabel.cpp
trunk/qgis/src/core/composer/qgscomposerlabel.h
trunk/qgis/src/mapserver/qgsconfigparser.cpp
trunk/qgis/src/mapserver/qgsconfigparser.h
trunk/qgis/src/mapserver/qgsprojectparser.cpp
trunk/qgis/src/mapserver/qgsprojectparser.h
trunk/qgis/src/mapserver/qgssldparser.cpp
trunk/qgis/src/mapserver/qgssldparser.h
trunk/qgis/src/mapserver/qgswmsserver.cpp
Log:
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
Modified: trunk/qgis/python/core/qgscomposerlabel.sip
===================================================================
--- trunk/qgis/python/core/qgscomposerlabel.sip 2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/python/core/qgscomposerlabel.sip 2011-01-14 10:23:15 UTC (rev 15041)
@@ -48,4 +48,7 @@
* @param node is Dom node corresponding to 'ComposerLabel' tag
*/
bool readXML( const QDomElement& itemElem, const QDomDocument& doc );
+
+ /**Get label identification number*/
+ int id() const;
};
Modified: trunk/qgis/src/core/composer/qgscomposerlabel.cpp
===================================================================
--- trunk/qgis/src/core/composer/qgscomposerlabel.cpp 2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/src/core/composer/qgscomposerlabel.cpp 2011-01-14 10:23:15 UTC (rev 15041)
@@ -25,6 +25,9 @@
{
//default font size is 10 point
mFont.setPointSizeF( 10 );
+
+ //get new id
+ mId = maximumLabelId( composition ) + 1;
}
QgsComposerLabel::~QgsComposerLabel()
@@ -127,6 +130,7 @@
composerLabelElem.setAttribute( "halign", mHAlignment );
composerLabelElem.setAttribute( "valign", mVAlignment );
+ composerLabelElem.setAttribute( "id", mId );
//font
@@ -168,6 +172,9 @@
//Vertical alignment
mVAlignment = ( Qt::AlignmentFlag )( itemElem.attribute( "valign" ).toInt() );
+ //id
+ mId = itemElem.attribute( "id", "0" ).toInt();
+
//font
QDomNodeList labelFontList = itemElem.elementsByTagName( "LabelFont" );
if ( labelFontList.size() > 0 )
@@ -201,3 +208,27 @@
emit itemChanged();
return true;
}
+
+int QgsComposerLabel::maximumLabelId( const QgsComposition* c ) const
+{
+ int id = -1;
+ if ( !c )
+ {
+ return id;
+ }
+
+ QList<QGraphicsItem *> itemList = c->items();
+ QList<QGraphicsItem *>::const_iterator itemIt = itemList.constBegin();
+ for ( ; itemIt != itemList.constEnd(); ++itemIt )
+ {
+ const QgsComposerLabel* label = dynamic_cast<const QgsComposerLabel *>( *itemIt );
+ if ( label )
+ {
+ if ( label->id() > id )
+ {
+ id = label->id();
+ }
+ }
+ }
+ return id;
+}
Modified: trunk/qgis/src/core/composer/qgscomposerlabel.h
===================================================================
--- trunk/qgis/src/core/composer/qgscomposerlabel.h 2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/src/core/composer/qgscomposerlabel.h 2011-01-14 10:23:15 UTC (rev 15041)
@@ -72,6 +72,9 @@
*/
bool readXML( const QDomElement& itemElem, const QDomDocument& doc );
+ /**Get label identification number*/
+ int id() const { return mId; }
+
private:
// Text
QString mText;
@@ -91,8 +94,14 @@
// Vertical Alignment
Qt::AlignmentFlag mVAlignment;
+ // Label id (unique within the same composition)
+ int mId;
+
/**Replaces replace '$CURRENT_DATE<(FORMAT)>' with the current date (e.g. $CURRENT_DATE(d 'June' yyyy)*/
void replaceDateText( QString& text ) const;
+
+ /**Returns maximum id of all label items or -1 if no item is in the scene. Used to generate new ids in the constructor*/
+ int maximumLabelId( const QgsComposition* c ) const;
};
#endif
Modified: trunk/qgis/src/mapserver/qgsconfigparser.cpp
===================================================================
--- trunk/qgis/src/mapserver/qgsconfigparser.cpp 2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/src/mapserver/qgsconfigparser.cpp 2011-01-14 10:23:15 UTC (rev 15041)
@@ -17,6 +17,7 @@
#include "qgsconfigparser.h"
#include "qgsapplication.h"
+#include "qgscomposerlabel.h"
#include "qgscomposermap.h"
#include "qgscomposition.h"
#include "qgsrasterlayer.h"
@@ -375,7 +376,25 @@
}
}
- //replace composer label text
+ //replace label text
+ QList<QgsComposerLabel*>::const_iterator labelIt = composerLabels.constBegin();
+ QgsComposerLabel* currentLabel = 0;
+ for ( ; labelIt != composerLabels.constEnd(); ++labelIt )
+ {
+ currentLabel = *labelIt;
+ QMap< QString, QString >::const_iterator titleIt = parameterMap.find( "LABEL" + QString::number( currentLabel->id() ) );
+ if ( titleIt == parameterMap.constEnd() )
+ {
+ //remove label
+ c->removeItem( *labelIt );
+ delete( *labelIt );
+ continue;
+ }
+
+ currentLabel->setText( titleIt.value() );
+ currentLabel->adjustSizeToText();
+ }
+
return c;
}
Modified: trunk/qgis/src/mapserver/qgsconfigparser.h
===================================================================
--- trunk/qgis/src/mapserver/qgsconfigparser.h 2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/src/mapserver/qgsconfigparser.h 2011-01-14 10:23:15 UTC (rev 15041)
@@ -96,7 +96,7 @@
QgsComposition* createPrintComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, const QMap< QString, QString >& parameterMap ) const;
/**Creates a composition from the project file (probably delegated to the fallback parser)*/
- virtual QgsComposition* initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* > labelList ) const = 0;
+ virtual QgsComposition* initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList ) const = 0;
/**Adds print capabilities to xml document. ParentElem usually is the <Capabilities> element*/
virtual void printCapabilities( QDomElement& parentElement, QDomDocument& doc ) const = 0;
Modified: trunk/qgis/src/mapserver/qgsprojectparser.cpp
===================================================================
--- trunk/qgis/src/mapserver/qgsprojectparser.cpp 2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/src/mapserver/qgsprojectparser.cpp 2011-01-14 10:23:15 UTC (rev 15041)
@@ -19,6 +19,7 @@
#include "qgsepsgcache.h"
#include "qgsmslayercache.h"
#include "qgsmapserverlogger.h"
+#include "qgsmapserviceexception.h"
#include "qgsrasterlayer.h"
#include "qgsvectorlayer.h"
@@ -32,6 +33,7 @@
#include "qgscomposerscalebar.h"
#include "qgscomposershape.h"
+
QgsProjectParser::QgsProjectParser( QDomDocument* xmlDoc ): QgsConfigParser(), mXMLDoc( xmlDoc )
{
mOutputUnits = QgsMapRenderer::Millimeters;
@@ -824,13 +826,13 @@
return legendLayerFileList.at( 0 ).toElement().attribute( "layerid" );
}
-QgsComposition* QgsProjectParser::initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* > labelList ) const
+QgsComposition* QgsProjectParser::initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList ) const
{
//Create composition from xml
QDomElement composerElem = composerByName( composerTemplate );
if ( composerElem.isNull() )
{
- return 0;
+ throw QgsMapServiceException( "Error", "Composer template not found" );
}
QDomElement compositionElem = composerElem.firstChildElement( "Composition" );
@@ -957,6 +959,16 @@
composerTemplateElem.appendChild( composerMapElem );
}
+ //add available composer labels
+ QDomNodeList composerLabelList = currentComposerElem.elementsByTagName( "ComposerLabel" );
+ for ( int j = 0; j < composerLabelList.size(); ++j )
+ {
+ QDomElement clabel = composerLabelList.at( j ).toElement();
+ QDomElement composerLabelElem = doc.createElement( "ComposerLabel" );
+ composerLabelElem.setAttribute( "name", "label" + clabel.attribute( "id" ) );
+ composerTemplateElem.appendChild( composerLabelElem );
+ }
+
parentElement.appendChild( composerTemplateElem );
}
}
Modified: trunk/qgis/src/mapserver/qgsprojectparser.h
===================================================================
--- trunk/qgis/src/mapserver/qgsprojectparser.h 2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/src/mapserver/qgsprojectparser.h 2011-01-14 10:23:15 UTC (rev 15041)
@@ -88,7 +88,7 @@
const QDomDocument* xmlDoc() const { return mXMLDoc; }
/**Creates a composition from the project file (probably delegated to the fallback parser)*/
- QgsComposition* initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* > labelList ) const;
+ QgsComposition* initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList ) const;
/**Adds print capabilities to xml document. ParentElem usually is the <Capabilities> element*/
void printCapabilities( QDomElement& parentElement, QDomDocument& doc ) const;
Modified: trunk/qgis/src/mapserver/qgssldparser.cpp
===================================================================
--- trunk/qgis/src/mapserver/qgssldparser.cpp 2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/src/mapserver/qgssldparser.cpp 2011-01-14 10:23:15 UTC (rev 15041)
@@ -1539,7 +1539,7 @@
}
}
-QgsComposition* QgsSLDParser::initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* > labelList ) const
+QgsComposition* QgsSLDParser::initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList ) const
{
if ( mFallbackParser )
{
Modified: trunk/qgis/src/mapserver/qgssldparser.h
===================================================================
--- trunk/qgis/src/mapserver/qgssldparser.h 2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/src/mapserver/qgssldparser.h 2011-01-14 10:23:15 UTC (rev 15041)
@@ -69,7 +69,7 @@
virtual void setParameterMap( const std::map<QString, QString>& parameterMap ) { mParameterMap = parameterMap; }
/**Creates a composition from the project file (delegated to the fallback parser)*/
- QgsComposition* initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* > labelList ) const;
+ QgsComposition* initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList ) const;
/**Adds print capabilities to xml document. Delegated to fallback parser*/
void printCapabilities( QDomElement& parentElement, QDomDocument& doc ) const;
Modified: trunk/qgis/src/mapserver/qgswmsserver.cpp
===================================================================
--- trunk/qgis/src/mapserver/qgswmsserver.cpp 2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/src/mapserver/qgswmsserver.cpp 2011-01-14 10:23:15 UTC (rev 15041)
@@ -369,7 +369,7 @@
std::map<QString, QString>::const_iterator templateIt = mParameterMap.find( "TEMPLATE" );
if ( templateIt == mParameterMap.end() )
{
- return 0;
+ throw QgsMapServiceException( "ParameterMissing", "The TEMPLATE parameter is required for the GetPrint request" );
}
QgsComposition* c = mConfigParser->createPrintComposition( templateIt->second, mMapRenderer, QMap<QString, QString>( mParameterMap ) );
@@ -401,7 +401,7 @@
c->render( &p, targetArea, sourceArea );
p.end();
}
- else if ( formatString.compare( "png", Qt::CaseInsensitive ) == 0 )
+ else if ( formatString.compare( "png", Qt::CaseInsensitive ) == 0 || formatString.compare( "jpg", Qt::CaseInsensitive ) == 0 )
{
int width = ( int )( c->paperWidth() * c->printResolution() / 25.4 ); //width in pixel
int height = ( int )( c->paperHeight() * c->printResolution() / 25.4 ); //height in pixel
@@ -417,7 +417,7 @@
ba = new QByteArray();
QBuffer buffer( ba );
buffer.open( QIODevice::WriteOnly );
- image.save( &buffer, "png", -1 );
+ image.save( &buffer, formatString.toLocal8Bit().data(), -1 );
}
else if ( formatString.compare( "pdf", Qt::CaseInsensitive ) == 0 )
{
@@ -443,6 +443,10 @@
ba = new QByteArray();
*ba = tempFile.readAll();
}
+ else //unknown format
+ {
+ throw QgsMapServiceException( "InvalidFormat", "Output format '" + formatString + "' is not supported in the GetPrint request" );
+ }
delete c;
return ba;
More information about the QGIS-commit
mailing list