Index: src/app/legend/qgslegend.cpp =================================================================== --- src/app/legend/qgslegend.cpp (revision 11034) +++ src/app/legend/qgslegend.cpp (working copy) @@ -714,14 +714,16 @@ { QgsRasterLayerProperties *rlp = NULL; // See note above about reusing this if ( rlp ) - { + { rlp->sync(); } else { rlp = new QgsRasterLayerProperties( ml ); - connect( rlp, SIGNAL( refreshLegend( QString, bool ) ), this, SLOT( refreshLayerSymbology( QString, bool ) ) ); + connect( rlp, SIGNAL( refreshLegend( QString, bool ) ), this, SLOT( refreshLayerSymbology( QString, bool ) ) ); + } + rlp->exec(); delete rlp; // delete since dialog cannot be reused without updating code } @@ -738,6 +740,8 @@ { vlp = new QgsVectorLayerProperties( vlayer ); connect( vlp, SIGNAL( refreshLegend( QString, bool ) ), this, SLOT( refreshLayerSymbology( QString, bool ) ) ); + //the following line is neccesary to avoid qgis hanging in windows + QString fix="quick fix"; } vlp->exec(); delete vlp; // delete since dialog cannot be reused without updating code @@ -1476,7 +1480,7 @@ void QgsLegend::refreshLayerSymbology( QString key, bool expandItem ) -{ +{ QgsLegendLayer* theLegendLayer = findLegendLayer( key ); if ( !theLegendLayer ) { Index: src/app/qgisapp.cpp =================================================================== --- src/app/qgisapp.cpp (revision 11034) +++ src/app/qgisapp.cpp (working copy) @@ -2719,14 +2719,34 @@ if ( wmss->exec() ) { + QMap parameters; + parameters.clear(); + parameters.insert("connection",wmss->connectionInfo()); + parameters.insert("basename",(wmss->selectedLayers().join( "/" ))); + parameters.insert("provider","wms"); + parameters.insert("layers",wmss->selectedLayers().join("/")); + parameters.insert("styles",wmss->selectedStylesForSelectedLayers().join("/")); + parameters.insert("format",wmss->selectedImageEncoding()); + parameters.insert("crs",wmss->selectedCrs()); + parameters.insert("sld",wmss->sldURL()); + parameters.insert("sld_body",wmss->sldBody()); + addRasterLayer(parameters); + + /*QgsRasterLayer* QgisApp::addRasterLayer( QString const & rasterLayerPath, + QString const & baseName, + QString const & providerKey, + QStringList const & layers, + QStringList const & styles, + QString const & format, + QString const & crs ) addRasterLayer( wmss->connectionInfo(), - /*wmss->connName()*/wmss->selectedLayers().join( "/" ), + wmss->selectedLayers().join( "/" ), "wms", wmss->selectedLayers(), wmss->selectedStylesForSelectedLayers(), wmss->selectedImageEncoding(), - wmss->selectedCrs() ); + wmss->selectedCrs() );*/ } } @@ -5864,8 +5884,53 @@ } // QgisApp::addRasterLayer +/*fred*/ +QgsRasterLayer* QgisApp::addRasterLayer( QMap theWmsLayerProperties) +{ + if ( mMapCanvas && mMapCanvas->isDrawing() ) + { + return 0; + } + mMapCanvas->freeze(); + + // create the layer + QgsRasterLayer *layer; + + /*QgsDebugMsg( "Creating new raster layer using " + rasterLayerPath + + " with baseName of " + baseName + + " and layer list of " + layers.join( ", " ) + + " and style list of " + styles.join( ", " ) + + " and format of " + format + + " and providerKey of " + providerKey + + " and CRS of " + crs );*/ + QString rasterLayerPath=theWmsLayerProperties.value("connection"); + QString baseName=theWmsLayerProperties.value("basename"); + layer = new QgsRasterLayer(rasterLayerPath,baseName,theWmsLayerProperties); + //layer = new QgsRasterLayer( 0, rasterLayerPath, baseName, providerKey, layers, styles, format, crs ); + QgsDebugMsg( "Constructed new layer." ); + if ( layer && layer->isValid() ) + { + addRasterLayer( layer ); + + statusBar()->showMessage( mMapCanvas->extent().toString( 2 ) ); + + } + else + { + QMessageBox::critical( this, tr( "Layer is not valid" ), + tr( "The layer is not a valid layer and can not be added to the map" ) ); + } + + // update UI + qApp->processEvents(); + // draw the map + mMapCanvas->freeze( false ); + mMapCanvas->refresh(); + return layer; +} +/*fred*/ /** Add a raster layer directly without prompting user for location The caller must provide information compatible with the provider plugin using the rasterLayerPath and baseName. The provider can use these Index: src/app/qgisapp.h =================================================================== --- src/app/qgisapp.h (revision 11034) +++ src/app/qgisapp.h (working copy) @@ -99,6 +99,11 @@ */ bool addRasterLayers( QStringList const & theLayerQStringList, bool guiWarning = true ); + /** Open a raster layer using the Raster Data Provider. + * This method use a map to pass all the neccesary wms properties + */ + QgsRasterLayer* addRasterLayer( QMap theWmsLayerProperties); + /** Open a raster layer using the Raster Data Provider. * Note this is included to support WMS layers only at this stage, * GDAL layer support via a Provider is not yet implemented. Index: src/app/qgsrasterlayerproperties.cpp =================================================================== --- src/app/qgsrasterlayerproperties.cpp (revision 11034) +++ src/app/qgsrasterlayerproperties.cpp (working copy) @@ -57,6 +57,8 @@ mRasterLayer( dynamic_cast( lyr ) ) { + + ignoreSpinBoxEvent = false; //Short circuit signal loop between min max field and stdDev spin box mGrayMinimumMaximumEstimated = true; mRGBMinimumMaximumEstimated = true; @@ -75,6 +77,9 @@ } setupUi( this ); + // disable SLD tab + tabBar->setTabEnabled( tabBar->indexOf( tabSLD ), FALSE ); + connect( buttonBox, SIGNAL( accepted() ), this, SLOT( accept() ) ); connect( this, SIGNAL( accepted() ), this, SLOT( apply() ) ); connect( buttonBox->button( QDialogButtonBox::Apply ), SIGNAL( clicked() ), this, SLOT( apply() ) ); @@ -269,6 +274,7 @@ // Only do pyramids if dealing directly with GDAL. if ( mRasterLayerIsGdal ) { + QgsRasterLayer::RasterPyramidList myPyramidList = mRasterLayer->buildPyramidList(); QgsRasterLayer::RasterPyramidList::iterator myRasterPyramidIterator; @@ -297,6 +303,8 @@ // disable Histogram tab completely tabBar->setTabEnabled( tabBar->indexOf( tabPageHistogram ), FALSE ); + // enable SLD tab + tabBar->setTabEnabled( tabBar->indexOf( tabSLD ), TRUE ); } leSpatialRefSys->setText( mRasterLayer->srs().toProj4() ); @@ -837,6 +845,17 @@ txtbMetadata->document()->setDefaultStyleSheet( myStyle ); txtbMetadata->setHtml( mRasterLayer->metadata() ); + + QgsDebugMsg( "populate sld tab" ); + /* + * SLD Tab + */ + if ( mRasterLayerIsWms ){ + sldURLEdit->setText(mRasterLayer->dataProvider()->sldURL()); + sldBodyText->clear(); + sldBodyText->appendPlainText(mRasterLayer->dataProvider()->sldBody()); + } + } // QgsRasterLayerProperties::sync() void QgsRasterLayerProperties::syncColormapTab() @@ -1413,6 +1432,13 @@ QgsDebugMsg( "color ramp was NOT set because RasterShaderFunction was NULL" ); } } +/*fred*/ + QgsDebugMsg( "processing sld tab" ); + if ( mRasterLayerIsWms ){ + mRasterLayer->dataProvider()->setSLDURL(sldURLEdit->text()); + mRasterLayer->dataProvider()->setSLDBody(sldBodyText->toPlainText()); + } + /*fred*/ QgsDebugMsg( "processing general tab" ); /* Index: src/app/qgsserversourceselect.cpp =================================================================== --- src/app/qgsserversourceselect.cpp (revision 11034) +++ src/app/qgsserversourceselect.cpp (working copy) @@ -656,6 +656,16 @@ } } +QString QgsServerSourceSelect::sldURL() +{ + return sldUrlText->text(); +} + +QString QgsServerSourceSelect::sldBody() +{ + return sldBodyEdit->toPlainText(); +} + void QgsServerSourceSelect::serverChanged() { // Remember which server was selected. Index: src/app/qgsserversourceselect.h =================================================================== --- src/app/qgsserversourceselect.h (revision 11034) +++ src/app/qgsserversourceselect.h (working copy) @@ -81,7 +81,12 @@ //! String containing the selected WMS-format CRS QString selectedCrs(); + + //! String containing a url pointing to external sld document + QString sldURL(); + //! String containing an SLD document + QString sldBody(); //! Stores which server is now selected. void serverChanged(); Index: src/core/qgsrasterdataprovider.h =================================================================== --- src/core/qgsrasterdataprovider.h (revision 11034) +++ src/core/qgsrasterdataprovider.h (working copy) @@ -82,7 +82,27 @@ */ virtual void setImageCrs( QString const & crs ) = 0; + /** + * Set the url of sld document + * Added in qgis version 1.2 + */ + virtual void setSLDURL( QString const & sldURL ) = 0; + /** + * Retrieves the url of sld document + * Added in qgis version 1.2 + */ + virtual QString sldURL()=0; + /** + * Set the sld document body + * Added in qgis version 1.2 + */ + virtual void setSLDBody( QString const & sldBody ) = 0; + /** + * Retrieves the sld document body + * Added in qgis version 1.2 + */ + virtual QString sldBody() = 0; // TODO: Document this better. /** \brief Renders the layer as an image */ Index: src/core/raster/qgsrasterlayer.cpp =================================================================== --- src/core/raster/qgsrasterlayer.cpp (revision 11034) +++ src/core/raster/qgsrasterlayer.cpp (working copy) @@ -61,6 +61,7 @@ #include #include #include +#include #include "qgslogger.h" // workaround for MSVC compiler which already has defined macro max // that interferes with calling std::numeric_limits::max @@ -186,7 +187,7 @@ // if we're given a provider type, try to create and bind one to this layer if ( ! providerKey.isEmpty() ) { - setDataProvider( providerKey, layers, styles, format, crs ); + setDataProvider( providerKey, layers, styles, format, crs,"","" ); } // Default for the popup menu @@ -213,6 +214,58 @@ emit statusChanged( tr( "QgsRasterLayer created" ) ); } // QgsRasterLayer ctor +//fred +QgsRasterLayer::QgsRasterLayer( QString const & rasterLayerPath, + QString const & baseName, + QMap theWmsProperties) + : QgsMapLayer( RasterLayer, baseName, rasterLayerPath ), + mStandardDeviations( 0 ), + mDataProvider( 0 ), + mEditable( false ), + mWidth( std::numeric_limits::max() ), + mHeight( std::numeric_limits::max() ), + mInvertColor( false ), + mModified( false ), + mProviderKey( "wms" ) +{ + /*QgsDebugMsg( "(8 arguments) starting. with layer list of " + + layers.join( ", " ) + " and style list of " + styles.join( ", " ) + " and format of " + + format + " and CRS of " + crs );*/ + + mRasterShader = new QgsRasterShader(); + + // Initialise the affine transform matrix + mGeoTransform[0] = 0; + mGeoTransform[1] = 1; + mGeoTransform[2] = 0; + mGeoTransform[3] = 0; + mGeoTransform[4] = 0; + mGeoTransform[5] = -1; + + QStringList layers=theWmsProperties.value("layers").split("/"); + QStringList styles=theWmsProperties.value("styles").split("/"); + QString format=theWmsProperties.value("format"); + QString crs=theWmsProperties.value("crs"); + QString sld=theWmsProperties.value("sld"); + QString sldbody=theWmsProperties.value("sld_body"); + setDataProvider( "wms", + layers, + styles, + format, + crs, + sld, + sldbody); + + connect( + mDataProvider, SIGNAL( statusChanged( QString ) ), + this, SLOT( showStatusMessage( QString ) ) + ); + + + emit statusChanged( tr( "QgsRasterLayer created" ) ); +} // QgsRasterLayer ctor +//fred + QgsRasterLayer::~QgsRasterLayer() { @@ -3094,7 +3147,9 @@ QStringList const & layers, QStringList const & styles, QString const & format, - QString const & crs ) + QString const & crs, + QString const &sldurl, + QString const &sldbody) { // XXX should I check for and possibly delete any pre-existing providers? // XXX How often will that scenario occur? @@ -3161,6 +3216,10 @@ mDataProvider->addLayers( layers, styles ); mDataProvider->setImageEncoding( format ); mDataProvider->setImageCrs( crs ); + + //fred + mDataProvider->setSLDURL(sldurl); + mDataProvider->setSLDBody(sldbody); // get the extent QgsRectangle mbr = mDataProvider->extent(); @@ -3818,8 +3877,19 @@ // Collect CRS QString crs = QString( "EPSG:%1" ).arg( srs().epsg() ); + //fix here to save and load slds in project + + // Collect SLDURL + QString mySLDUrl = rpNode.namedItem( "wmsSLDURL" ).toElement().text(); - setDataProvider( mProviderKey, layers, styles, format, crs ); + + // Collect + QString mySLDBody = rpNode.namedItem( "wmsSLDBody" ).toElement().text(); + QUrl myUrl; + myUrl.addEncodedQueryItem("sld_body",mySLDBody.toLocal8Bit()); + QString sldBody(myUrl.queryItemValue("sld_body")); + + setDataProvider( mProviderKey, layers, styles, format, crs, mySLDUrl, sldBody ); } else { @@ -3898,6 +3968,24 @@ formatElement.appendChild( formatText ); rasterPropertiesElement.appendChild( formatElement ); + //sld-url + QDomElement sldURLElement = document.createElement( "wmsSLDURL" ); + QDomText sldURLText = + document.createTextNode( mDataProvider->sldURL() ); + sldURLElement.appendChild( sldURLText ); + rasterPropertiesElement.appendChild( sldURLElement ); + + //sld-body + QString mySLDBody=mDataProvider->sldBody().trimmed(); + QUrl myUrl; + myUrl.addQueryItem("sld_body",mySLDBody); + QString mySLD_Body(myUrl.encodedQueryItemValue("sld_body")); + QDomElement sldBodyElement = document.createElement( "wmsSLDBody" ); + QDomText sldBodyText = + document.createTextNode( mySLD_Body ); + sldBodyElement.appendChild( sldBodyText ); + rasterPropertiesElement.appendChild( sldBodyElement ); + } // Index: src/core/raster/qgsrasterlayer.h =================================================================== --- src/core/raster/qgsrasterlayer.h (revision 11034) +++ src/core/raster/qgsrasterlayer.h (working copy) @@ -208,9 +208,13 @@ const QStringList & layers = QStringList(), const QStringList & styles = QStringList(), const QString & format = QString(), - const QString & crs = QString() ); + const QString & crs = QString()); + QgsRasterLayer( QString const & rasterLayerPath, + QString const & baseName, + QMap theWmsProperties); + /** \brief The destructor */ ~QgsRasterLayer(); @@ -365,7 +369,9 @@ const QStringList & layers, const QStringList & styles, const QString & format, - const QString & crs ); + const QString & crs, + const QString & sldurl, + const QString & sldbody); /** \brief Mutator for drawing style */ void setDrawingStyle( const DrawingStyle & theDrawingStyle ) { mDrawingStyle = theDrawingStyle; } Index: src/providers/wms/qgswmsprovider.cpp =================================================================== --- src/providers/wms/qgswmsprovider.cpp (revision 11034) +++ src/providers/wms/qgswmsprovider.cpp (working copy) @@ -70,7 +70,8 @@ mUserName = ""; mPassword = ""; setAuthentication( httpuri ); - + mSLDURL=""; + mSLDBody=""; QgsDebugMsg( "QgsWmsProvider: constructing with uri '" + httpuri + "'." ); // assume this is a valid layer until we determine otherwise @@ -288,7 +289,35 @@ return imageMimeType; } +void QgsWmsProvider::setSLDURL( QString const & sldURL ) +{ + mSLDURL=sldURL; +} +QString QgsWmsProvider::sldURL() +{ + return mSLDURL; +} + +void QgsWmsProvider::setSLDBody( QString const & sldBody ) +{ + mSLDBody=sldBody.trimmed(); + //encode the url + QUrl myUrl; + myUrl.addQueryItem("sld_body",mSLDBody); + QString mySLD_Body(myUrl.encodedQueryItemValue("sld_body")); + mSLDBody=mySLD_Body; +} + +QString QgsWmsProvider::sldBody() +{ + QUrl myUrl; + myUrl.addEncodedQueryItem("sld_body",mSLDBody.toLocal8Bit()); + QString mySLD_Body(myUrl.queryItemValue("sld_body")); + return mySLD_Body; +} + + void QgsWmsProvider::setImageEncoding( QString const & mimeType ) { QgsDebugMsg( "Setting image encoding to " + mimeType + "." ); @@ -454,6 +483,19 @@ url += "&"; url += "FORMAT=" + imageMimeType; + //set SLD parameter + if((!mSLDURL.isEmpty())&&(!mSLDURL.isNull())) + { + url += "&"; + url += "SLD=" + mSLDURL; + } + + //set SLD Body + if((!mSLDBody.isEmpty())&&(!mSLDBody.isNull())) + { + url += "&"; + url += "SLD_BODY=" + mSLDBody; + } //DPI parameter is accepted by QGIS mapserver (and ignored by the other WMS servers) if(mDpi != -1) { @@ -505,6 +547,10 @@ } QByteArray imagesource; + //QUrl myUrl(url); + //QString encodedUrl(myUrl.toEncoded()); + + QgsDebugMsg( "Retrieving image with url : "+url); imagesource = retrieveUrl( url ); if ( imagesource.isEmpty() ) Index: src/providers/wms/qgswmsprovider.h =================================================================== --- src/providers/wms/qgswmsprovider.h (revision 11034) +++ src/providers/wms/qgswmsprovider.h (working copy) @@ -416,6 +416,31 @@ void setImageEncoding( QString const & mimeType ); /** + * Set the url for sld document + * added in qgis 1.2 + */ + void setSLDURL( QString const & sldURL ); + + /** + * Retrieves the sld url + * added in qgis 1.2 + */ + QString sldURL(); + + /** + * Set the sld body + * added in qgis 1.2 + */ + + void setSLDBody( QString const & sldBody ); + + /** + * Retrieves the sld body + * added in qgis 1.2 + */ + QString sldBody(); + + /** * Set the image projection (in WMS CRS format) used in the transfer from the WMS server * * \note an empty crs value will result in the previous CRS being retained. @@ -849,6 +874,12 @@ //! Password for basic http authentication QString mPassword; + //! Url pointing to remote sld document + QString mSLDURL; + + //! Inline SLD + QString mSLDBody; + }; #endif Index: src/ui/qgsrasterlayerpropertiesbase.ui =================================================================== --- src/ui/qgsrasterlayerpropertiesbase.ui (revision 11034) +++ src/ui/qgsrasterlayerpropertiesbase.ui (working copy) @@ -27,7 +27,7 @@ - 0 + 7 @@ -1472,10 +1472,10 @@ - + Specify the coordinate reference system of the layer's geometry. - + Specify the coordinate reference system of the layer's geometry. @@ -1676,8 +1676,8 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif';"></p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p></body></html> @@ -1903,6 +1903,37 @@ + + + SLD + + + + + + + + Style Layer Descriptor URL : + + + + + + + + + + Style Layer Descriptor Body : + + + + + + + + + + Index: src/ui/qgsserversourceselectbase.ui =================================================================== --- src/ui/qgsserversourceselectbase.ui (revision 11034) +++ src/ui/qgsserversourceselectbase.ui (working copy) @@ -6,7 +6,7 @@ 0 0 600 - 481 + 630 @@ -23,7 +23,7 @@ true - + @@ -254,6 +254,65 @@ + + + + 581 + 141 + + + + Style Layer Descriptor + + + + + 60 + 20 + 511 + 20 + + + + + + + 60 + 50 + 511 + 81 + + + + + + + 10 + 20 + 46 + 14 + + + + URL : + + + + + + 10 + 50 + 46 + 14 + + + + Body : + + + + + @@ -272,7 +331,7 @@ - + Coordinate Reference System @@ -314,7 +373,7 @@ - + true @@ -330,7 +389,7 @@ - + Qt::Horizontal @@ -346,7 +405,7 @@ - + false @@ -365,7 +424,7 @@ - + C&lose @@ -378,7 +437,7 @@ - +