2121#include < limits>
2222
2323#include " qgisapp.h"
24+ #include " qgsaddjoindialog.h"
2425#include " qgsapplication.h"
2526#include " qgsattributeactiondialog.h"
2627#include " qgsapplydialog.h"
3334#include " qgslabel.h"
3435#include " qgsgenericprojectionselector.h"
3536#include " qgslogger.h"
37+ #include " qgsmaplayerregistry.h"
3638#include " qgspluginmetadata.h"
3739#include " qgspluginregistry.h"
3840#include " qgsproject.h"
@@ -133,6 +135,13 @@ QgsVectorLayerProperties::QgsVectorLayerProperties(
133135
134136 connect ( sliderTransparency, SIGNAL ( valueChanged ( int ) ), this , SLOT ( sliderTransparency_valueChanged ( int ) ) );
135137
138+ // insert existing join info
139+ const QList< QgsVectorJoinInfo >& joins = layer->vectorJoins ();
140+ for ( int i = 0 ; i < joins.size (); ++i )
141+ {
142+ addJoinToTreeWidget ( joins[i] );
143+ }
144+
136145 // for each overlay plugin create a new tab
137146 int position;
138147 QList<QgsVectorOverlayPlugin*> overlayPluginList = overlayPlugins ();
@@ -813,7 +822,6 @@ QString QgsVectorLayerProperties::metadata()
813822 {
814823 xMin = QString ( " %1" ).arg ( myExtent.xMinimum () );
815824 }
816-
817825 if ( qAbs ( myExtent.yMinimum () ) > changeoverValue )
818826 {
819827 yMin = QString ( " %1" ).arg ( myExtent.yMinimum (), 0 , ' f' , 2 );
@@ -822,7 +830,6 @@ QString QgsVectorLayerProperties::metadata()
822830 {
823831 yMin = QString ( " %1" ).arg ( myExtent.yMinimum () );
824832 }
825-
826833 if ( qAbs ( myExtent.xMaximum () ) > changeoverValue )
827834 {
828835 xMax = QString ( " %1" ).arg ( myExtent.xMaximum (), 0 , ' f' , 2 );
@@ -831,7 +838,6 @@ QString QgsVectorLayerProperties::metadata()
831838 {
832839 xMax = QString ( " %1" ).arg ( myExtent.xMaximum () );
833840 }
834-
835841 if ( qAbs ( myExtent.yMaximum () ) > changeoverValue )
836842 {
837843 yMax = QString ( " %1" ).arg ( myExtent.yMaximum (), 0 , ' f' , 2 );
@@ -1171,6 +1177,70 @@ void QgsVectorLayerProperties::setUsingNewSymbology( bool useNewSymbology )
11711177 updateSymbologyPage ();
11721178}
11731179
1180+ void QgsVectorLayerProperties::on_mButtonAddJoin_clicked ()
1181+ {
1182+ QgsAddJoinDialog d ( layer );
1183+ if ( d.exec () == QDialog::Accepted )
1184+ {
1185+ QgsVectorJoinInfo info;
1186+ info.targetField = d.targetField ();
1187+ info.joinLayerId = d.joinedLayerId ();
1188+ info.joinField = d.joinField ();
1189+ info.memoryCache = d.cacheInMemory ();
1190+ if ( layer )
1191+ {
1192+ // create attribute index if possible. Todo: ask user if this should be done (e.g. in QgsAddJoinDialog)
1193+ if ( d.createAttributeIndex () )
1194+ {
1195+ QgsVectorLayer* joinLayer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance ()->mapLayer ( info.joinLayerId ) );
1196+ if ( joinLayer )
1197+ {
1198+ joinLayer->dataProvider ()->createAttributeIndex ( info.joinField );
1199+ }
1200+ }
1201+
1202+ layer->addJoin ( info );
1203+ loadRows (); // update attribute tab
1204+ addJoinToTreeWidget ( info );
1205+ }
1206+ }
1207+ }
1208+
1209+ void QgsVectorLayerProperties::addJoinToTreeWidget ( const QgsVectorJoinInfo& join )
1210+ {
1211+ QTreeWidgetItem* joinItem = new QTreeWidgetItem ();
1212+
1213+ QgsVectorLayer* joinLayer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance ()->mapLayer ( join.joinLayerId ) );
1214+ if ( !joinLayer )
1215+ {
1216+ return ;
1217+ }
1218+
1219+ joinItem->setText ( 0 , joinLayer->name () );
1220+ joinItem->setData ( 0 , Qt::UserRole, join.joinLayerId );
1221+ QString joinFieldName = joinLayer->pendingFields ().value ( join.joinField ).name ();
1222+ QString targetFieldName = layer->pendingFields ().value ( join.targetField ).name ();
1223+ joinItem->setText ( 1 , joinFieldName );
1224+ joinItem->setData ( 1 , Qt::UserRole, join.joinField );
1225+ joinItem->setText ( 2 , targetFieldName );
1226+ joinItem->setData ( 2 , Qt::UserRole, join.targetField );
1227+
1228+ mJoinTreeWidget ->addTopLevelItem ( joinItem );
1229+ }
1230+
1231+ void QgsVectorLayerProperties::on_mButtonRemoveJoin_clicked ()
1232+ {
1233+ QTreeWidgetItem* currentJoinItem = mJoinTreeWidget ->currentItem ();
1234+ if ( !layer || !currentJoinItem )
1235+ {
1236+ return ;
1237+ }
1238+
1239+ layer->removeJoin ( currentJoinItem->data ( 0 , Qt::UserRole ).toString () );
1240+ loadRows ();
1241+ mJoinTreeWidget ->takeTopLevelItem ( mJoinTreeWidget ->indexOfTopLevelItem ( currentJoinItem ) );
1242+ }
1243+
11741244void QgsVectorLayerProperties::useNewSymbology ()
11751245{
11761246 int res = QMessageBox::question ( this , tr ( " Symbology" ),
0 commit comments