Revision: 5294
          http://sourceforge.net/p/jump-pilot/code/5294
Author:   michaudm
Date:     2016-12-29 12:25:19 +0000 (Thu, 29 Dec 2016)
Log Message:
-----------
Implement FR 250 : update a layer from another using an attribute join

Modified Paths:
--------------
    core/trunk/scripts/default-plugins.xml
    core/trunk/src/language/jump.properties
    core/trunk/src/language/jump_cz.properties
    core/trunk/src/language/jump_de.properties
    core/trunk/src/language/jump_es.properties
    core/trunk/src/language/jump_fi.properties
    core/trunk/src/language/jump_fr.properties
    core/trunk/src/language/jump_hu.properties
    core/trunk/src/language/jump_it.properties
    core/trunk/src/language/jump_ja_JP.properties
    core/trunk/src/language/jump_ml.properties
    core/trunk/src/language/jump_pt.properties
    core/trunk/src/language/jump_pt_BR.properties
    core/trunk/src/language/jump_ta_IN.properties
    core/trunk/src/language/jump_te.properties
    core/trunk/src/language/jump_zh_CN.properties
    core/trunk/src/language/jump_zh_HK.properties

Added Paths:
-----------
    core/trunk/src/org/openjump/core/ui/plugin/tools/UpdateWithJoinPlugIn.java

Modified: core/trunk/scripts/default-plugins.xml
===================================================================
--- core/trunk/scripts/default-plugins.xml      2016-12-28 14:58:30 UTC (rev 
5293)
+++ core/trunk/scripts/default-plugins.xml      2016-12-29 12:25:19 UTC (rev 
5294)
@@ -824,12 +824,16 @@
                
org.openjump.core.ui.plugin.tools.JoinTableFromExistingLayerPlugIn
        </plug-in>
        <plug-in>
-               
org.openjump.core.ui.plugin.tools.BeanshellAttributeCalculatorPlugIn
+               org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn
        </plug-in>
        <plug-in>
                org.openjump.core.ui.plugin.tools.JoinTablePlugIn
        </plug-in>
+       <plug-in>
+               
org.openjump.core.ui.plugin.tools.BeanshellAttributeCalculatorPlugIn
+       </plug-in>
 
+
        <!--- ========= Generalization ==================== / -->
        <plug-in>
                org.openjump.core.ui.plugin.tools.SimplifyWithJTSAlgorithmPlugIn

Modified: core/trunk/src/language/jump.properties
===================================================================
--- core/trunk/src/language/jump.properties     2016-12-28 14:58:30 UTC (rev 
5293)
+++ core/trunk/src/language/jump.properties     2016-12-29 12:25:19 UTC (rev 
5294)
@@ -1556,6 +1556,23 @@
 
org.openjump.core.ui.plugin.tools.SplitPolygonPlugIn.Must-select-one-polygon-and-one-linestring
 = Must select one polygon and one linestring.
 
org.openjump.core.ui.plugin.tools.SplitPolygonPlugIn.Update-the-polygon-with-result
 = Update the polygon with result.
 
org.openjump.core.ui.plugin.tools.SplitPolygonPlugIn.Uses-the-selected-linestring-to-cut-the-selected-polygon-into-separate-sections
 = Uses the selected linestring to cut the selected polygon into separate 
sections.
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn = Update Layer with an 
Attribute Join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Attributes-mapping-is-not-defined
 = Attributes mapping is not defined
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Choose-layers = Choose 
layers
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Description = Update 
reference layer attribute values with join layer attribute values when 
reference feature ext id = join feature id.\n\
+  Join attributes can be mapped to reference attributes even if their names 
differ.\n\
+  Left join keep reference feature which do not verify the join condition 
while right join add features from join layer which do not verify the join 
condition.
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Do-not-join = Do not 
join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer = Join layer
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id = Join 
layer id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id-is-not-unique
 = Join layer id is not unique
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join = Left join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join-tooltip = 
Check left join to keep all reference features
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Map-attributes = Map 
attributes
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-ext-id 
= Reference layer external id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-to-update
 = Reference layer to update
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join = Right join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join-tooltip = 
Check right join to add un-joined features from join layer
 org.openjump.core.ui.plugin.tools.ZoomRealtimeTool.Zoom-Realtime = Zoom 
Realtime
 
org.openjump.core.ui.plugin.tools.generate.AbstractLinearReferencingPlugIn.add-end-point
 = Add end point
 
org.openjump.core.ui.plugin.tools.generate.AbstractLinearReferencingPlugIn.distance-unit
 = Distance Unit

Modified: core/trunk/src/language/jump_cz.properties
===================================================================
--- core/trunk/src/language/jump_cz.properties  2016-12-28 14:58:30 UTC (rev 
5293)
+++ core/trunk/src/language/jump_cz.properties  2016-12-29 12:25:19 UTC (rev 
5294)
@@ -2758,4 +2758,21 @@
 ui.GenericNames.show=#T:Show
 ui.GenericNames.user=#T:User
 ui.GenericNames.version=#T:Version
-ui.GenericNames.url=URL
\ No newline at end of file
+ui.GenericNames.url=URL
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn=#T:Update Layer with an 
Attribute Join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Attributes-mapping-is-not-defined=#T:Attributes
 mapping is not defined
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Choose-layers=#T:Choose 
layers
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Description=#T:Update 
reference layer attribute values with join layer attribute values when 
reference feature ext id = join feature id.\n\
+  Join attributes can be mapped to reference attributes even if their names 
differ.\n\
+  Left join keep reference feature which do not verify the join condition 
while right join add features from join layer which do not verify the join 
condition.
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Do-not-join=#T:Do not 
join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer=#T:Join layer
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id=#T:Join 
layer id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id-is-not-unique=#T:Join
 layer id is not unique
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join=#T:Left join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join-tooltip=#T:Check
 left join to keep all reference features
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Map-attributes=#T:Map 
attributes
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-ext-id=#T:Reference
 layer external id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-to-update=#T:Reference
 layer to update
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join=#T:Right join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join-tooltip=#T:Check
 right join to add un-joined features from join layer
\ No newline at end of file

Modified: core/trunk/src/language/jump_de.properties
===================================================================
--- core/trunk/src/language/jump_de.properties  2016-12-28 14:58:30 UTC (rev 
5293)
+++ core/trunk/src/language/jump_de.properties  2016-12-29 12:25:19 UTC (rev 
5294)
@@ -2754,4 +2754,21 @@
 ui.GenericNames.show=#T:Show
 ui.GenericNames.user=#T:User
 ui.GenericNames.version=#T:Version
-ui.GenericNames.url=URL
\ No newline at end of file
+ui.GenericNames.url=URL
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn=#T:Update Layer with an 
Attribute Join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Attributes-mapping-is-not-defined=#T:Attributes
 mapping is not defined
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Choose-layers=#T:Choose 
layers
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Description=#T:Update 
reference layer attribute values with join layer attribute values when 
reference feature ext id = join feature id.\n\
+  Join attributes can be mapped to reference attributes even if their names 
differ.\n\
+  Left join keep reference feature which do not verify the join condition 
while right join add features from join layer which do not verify the join 
condition.
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Do-not-join=#T:Do not 
join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer=#T:Join layer
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id=#T:Join 
layer id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id-is-not-unique=#T:Join
 layer id is not unique
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join=#T:Left join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join-tooltip=#T:Check
 left join to keep all reference features
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Map-attributes=#T:Map 
attributes
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-ext-id=#T:Reference
 layer external id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-to-update=#T:Reference
 layer to update
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join=#T:Right join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join-tooltip=#T:Check
 right join to add un-joined features from join layer
\ No newline at end of file

Modified: core/trunk/src/language/jump_es.properties
===================================================================
--- core/trunk/src/language/jump_es.properties  2016-12-28 14:58:30 UTC (rev 
5293)
+++ core/trunk/src/language/jump_es.properties  2016-12-29 12:25:19 UTC (rev 
5294)
@@ -2737,4 +2737,21 @@
 ui.GenericNames.show=#T:Show
 ui.GenericNames.user=#T:User
 ui.GenericNames.version=#T:Version
-ui.GenericNames.url=URL
\ No newline at end of file
+ui.GenericNames.url=URL
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn=#T:Update Layer with an 
Attribute Join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Attributes-mapping-is-not-defined=#T:Attributes
 mapping is not defined
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Choose-layers=#T:Choose 
layers
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Description=#T:Update 
reference layer attribute values with join layer attribute values when 
reference feature ext id = join feature id.\n\
+  Join attributes can be mapped to reference attributes even if their names 
differ.\n\
+  Left join keep reference feature which do not verify the join condition 
while right join add features from join layer which do not verify the join 
condition.
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Do-not-join=#T:Do not 
join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer=#T:Join layer
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id=#T:Join 
layer id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id-is-not-unique=#T:Join
 layer id is not unique
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join=#T:Left join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join-tooltip=#T:Check
 left join to keep all reference features
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Map-attributes=#T:Map 
attributes
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-ext-id=#T:Reference
 layer external id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-to-update=#T:Reference
 layer to update
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join=#T:Right join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join-tooltip=#T:Check
 right join to add un-joined features from join layer
\ No newline at end of file

Modified: core/trunk/src/language/jump_fi.properties
===================================================================
--- core/trunk/src/language/jump_fi.properties  2016-12-28 14:58:30 UTC (rev 
5293)
+++ core/trunk/src/language/jump_fi.properties  2016-12-29 12:25:19 UTC (rev 
5294)
@@ -2731,4 +2731,21 @@
 ui.GenericNames.show=#T:Show
 ui.GenericNames.user=#T:User
 ui.GenericNames.version=#T:Version
-ui.GenericNames.url=URL
\ No newline at end of file
+ui.GenericNames.url=URL
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn=#T:Update Layer with an 
Attribute Join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Attributes-mapping-is-not-defined=#T:Attributes
 mapping is not defined
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Choose-layers=#T:Choose 
layers
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Description=#T:Update 
reference layer attribute values with join layer attribute values when 
reference feature ext id = join feature id.\n\
+  Join attributes can be mapped to reference attributes even if their names 
differ.\n\
+  Left join keep reference feature which do not verify the join condition 
while right join add features from join layer which do not verify the join 
condition.
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Do-not-join=#T:Do not 
join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer=#T:Join layer
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id=#T:Join 
layer id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id-is-not-unique=#T:Join
 layer id is not unique
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join=#T:Left join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join-tooltip=#T:Check
 left join to keep all reference features
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Map-attributes=#T:Map 
attributes
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-ext-id=#T:Reference
 layer external id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-to-update=#T:Reference
 layer to update
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join=#T:Right join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join-tooltip=#T:Check
 right join to add un-joined features from join layer
\ No newline at end of file

Modified: core/trunk/src/language/jump_fr.properties
===================================================================
--- core/trunk/src/language/jump_fr.properties  2016-12-28 14:58:30 UTC (rev 
5293)
+++ core/trunk/src/language/jump_fr.properties  2016-12-29 12:25:19 UTC (rev 
5294)
@@ -2761,4 +2761,21 @@
 ui.GenericNames.show=Montrer
 ui.GenericNames.user=Utilisateur
 ui.GenericNames.version=Version
-ui.GenericNames.url=URL
\ No newline at end of file
+ui.GenericNames.url=URL
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn=Mise \xE0 jour par 
jointure d'attribut
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Attributes-mapping-is-not-defined=Les
 correspondances entre attributs n'ont pas \xE9t\xE9 d\xE9finies
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Choose-layers=Choisir 
les couches
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Description=Met \xE0 
jour les attributs de la couche de r\xE9f\xE9rence avec ceux de la couche 
jointe chaque fois que la condition de jointure est v\xE9rifi\xE9e.\n\
+  Les attributs peuvent \xEAtre mis en correspondance m\xEAme lorsque leurs 
noms diff\xE8rent.\n\
+  Une jointure gauche permet de conserver tous les objets de r\xE9f\xE9rence, 
tandis qu'une jointure droite permet d'ajouter les objets de la couche jointe 
m\xEAme s'ils ne v\xE9rifient pas la condition.
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Do-not-join=Ne pas 
joindre
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer=Couche \xE0 
joindre
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id=Identifiant
 de la couche jointe
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id-is-not-unique=L'identifiant
 n'est pas unique dans la couche jointe
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join=Jointure 
gauche
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join-tooltip=Une 
jointure gauche permet de conserver tous les objets de r\xE9f\xE9rence
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Map-attributes=Correspondance
 entre attributs
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-ext-id=Identifiant
 externe
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-to-update=Couche
 de r\xE9f\xE9rence \xE0 mettre \xE0 jour
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join=Jointure 
droite
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join-tooltip=La 
jointure droite ajoute au r\xE9sultat les objets non-joints de la couche jointes
\ No newline at end of file

Modified: core/trunk/src/language/jump_hu.properties
===================================================================
--- core/trunk/src/language/jump_hu.properties  2016-12-28 14:58:30 UTC (rev 
5293)
+++ core/trunk/src/language/jump_hu.properties  2016-12-29 12:25:19 UTC (rev 
5294)
@@ -175,7 +175,6 @@
 com.vividsolutions.jump.workbench.ui.style.BasicStylePanel.error-opening-file 
= Hiba a f\u00e1jl megnyit\u00e1sakor\: {0}
 com.vividsolutions.jump.workbench.ui.style.ChangeStylesPlugIn = St\u00edlusok 
megv\u00e1ltoztat\u00e1sa
 com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn = Affin 
transzform\u00e1ci\u00f3
-com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn=Transformaci\u00f3n
 af\u00edn (con vectores de deformaccion)
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message1=\#T\:Please
 load this image as Sextante Raster to perform a transformation
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message2=\#T\:Affine
 transformation not yet implemented for this type of layer
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message3=\#T\:Affine
 trasformation for raster currently works only on RGB image files
@@ -1052,8 +1051,6 @@
 org.openjump.core.ui.plugin.raster.DEMStatisticsPlugIn.name=\#T\:Compare Grid 
Raster layers
 org.openjump.core.ui.plugin.raster.DEMStatisticsPlugIn.report=\#T\:Calculating 
layers statistics
 org.openjump.core.ui.plugin.raster.nodata.menu=\#T\:Manage No Data values
-
-org.openjump.core.ui.plugin.raster.nodata.menu=\#T\:Manage No Data values
 org.openjump.core.ui.plugin.raster.nodata.Inverse=\#T\:Inverse operation
 org.openjump.core.ui.plugin.raster.nodata.from=\#T\:From:
 org.openjump.core.ui.plugin.raster.nodata.to=\#T\:To:
@@ -2563,7 +2560,6 @@
 
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL
 error: 
 
jump.workbench.ui.plugin.datastore.AddDatastoreLayerPanel.Invalid-layer-where-clause=#T:Invalid
 WHERE clause for layer: 
 jump.workbench.ui.plugin.datastore.AddDatastoreLayerPanel.SQL-error=#T:SQL 
error
-com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL
 error:
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose
 multi-geometries into simple geometries
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve
 geometry dimension
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate
 degenerated components to preserve geometry dimension
@@ -2754,4 +2750,21 @@
 ui.GenericNames.show=#T:Show
 ui.GenericNames.user=#T:User
 ui.GenericNames.version=#T:Version
-ui.GenericNames.url=URL
\ No newline at end of file
+ui.GenericNames.url=URL
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn=#T:Update Layer with an 
Attribute Join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Attributes-mapping-is-not-defined=#T:Attributes
 mapping is not defined
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Choose-layers=#T:Choose 
layers
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Description=#T:Update 
reference layer attribute values with join layer attribute values when 
reference feature ext id = join feature id.\n\
+  Join attributes can be mapped to reference attributes even if their names 
differ.\n\
+  Left join keep reference feature which do not verify the join condition 
while right join add features from join layer which do not verify the join 
condition.
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Do-not-join=#T:Do not 
join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer=#T:Join layer
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id=#T:Join 
layer id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id-is-not-unique=#T:Join
 layer id is not unique
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join=#T:Left join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join-tooltip=#T:Check
 left join to keep all reference features
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Map-attributes=#T:Map 
attributes
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-ext-id=#T:Reference
 layer external id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-to-update=#T:Reference
 layer to update
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join=#T:Right join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join-tooltip=#T:Check
 right join to add un-joined features from join layer
\ No newline at end of file

Modified: core/trunk/src/language/jump_it.properties
===================================================================
--- core/trunk/src/language/jump_it.properties  2016-12-28 14:58:30 UTC (rev 
5293)
+++ core/trunk/src/language/jump_it.properties  2016-12-29 12:25:19 UTC (rev 
5294)
@@ -2738,3 +2738,20 @@
 ui.GenericNames.user=Utente
 ui.GenericNames.version=Versione
 ui.GenericNames.url=URL
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn=#T:Update Layer with an 
Attribute Join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Attributes-mapping-is-not-defined=#T:Attributes
 mapping is not defined
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Choose-layers=#T:Choose 
layers
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Description=#T:Update 
reference layer attribute values with join layer attribute values when 
reference feature ext id = join feature id.\n\
+  Join attributes can be mapped to reference attributes even if their names 
differ.\n\
+  Left join keep reference feature which do not verify the join condition 
while right join add features from join layer which do not verify the join 
condition.
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Do-not-join=#T:Do not 
join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer=#T:Join layer
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id=#T:Join 
layer id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id-is-not-unique=#T:Join
 layer id is not unique
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join=#T:Left join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join-tooltip=#T:Check
 left join to keep all reference features
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Map-attributes=#T:Map 
attributes
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-ext-id=#T:Reference
 layer external id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-to-update=#T:Reference
 layer to update
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join=#T:Right join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join-tooltip=#T:Check
 right join to add un-joined features from join layer

Modified: core/trunk/src/language/jump_ja_JP.properties
===================================================================
--- core/trunk/src/language/jump_ja_JP.properties       2016-12-28 14:58:30 UTC 
(rev 5293)
+++ core/trunk/src/language/jump_ja_JP.properties       2016-12-29 12:25:19 UTC 
(rev 5294)
@@ -175,7 +175,6 @@
 com.vividsolutions.jump.workbench.ui.style.BasicStylePanel.error-opening-file 
= \u30d5\u30a1\u30a4\u30eb\u8aad\u8fbc\u307f\u6642\u306b\u30a8\u30e9\u30fc\: {0}
 com.vividsolutions.jump.workbench.ui.style.ChangeStylesPlugIn = 
\u30b9\u30bf\u30a4\u30eb\u306e\u5909\u66f4
 com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn = 
\u30a2\u30d5\u30a3\u30f3\u5909\u63db
-com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn=Transformaci\u00f3n
 af\u00edn (con vectores de deformaccion)
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message1=\#T\:Please
 load this image as Sextante Raster to perform a transformation
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message2=\#T\:Affine
 transformation not yet implemented for this type of layer
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message3=\#T\:Affine
 trasformation for raster currently works only on RGB image files
@@ -2507,8 +2506,6 @@
 
com.vividsolutions.jump.workbench.ui.network.ProxySettingsOptionsPanel.server-or-proxy-port-is-not-correct-check-provided-parameters=
 #T:The server or proxy port is not correct check, provided the parameters
 com.vividsolutions.jump.workbench.ui.network.ProxySettingsOptionsPanel.user= 
#T:User\:
 
com.vividsolutions.jump.workbench.ui.network.ProxySettingsOptionsPanel.test-url=
 #T: Test url\:
-com.vividsolutions.jump.workbench.plugin.At-least-n-layerables-must-exist=\#T\:At
 least {0} layerables must exist
-com.vividsolutions.jump.workbench.plugin.At-least-one-layerables-must-exist=\#T\:At
 least one layerable must exist
 ui.plugin.analysis.BufferPlugIn.update-source=\#T\:Update geometry in source 
layer
 ui.plugin.analysis.BufferPlugIn.update-source-help=\#T\:Update the source 
layer instead of copying geometries in a new layer
 ui.AttributeTablePanel.feature.view-edit=#T:View/Edit
@@ -2568,8 +2565,7 @@
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate
 degenerated components to preserve geometry dimension
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord-tooltip=\#T\:Remove
 duplicate coordinates
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.remove-duplicate-coord=\#T\:Remove
 duplicate coordinates
-com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL
 error: 
-jump.workbench.ui.plugin.datastore.AddDatastoreLayerPanel.Invalid-layer-where-clause=#T:Invalid
 WHERE clause for layer: 
+jump.workbench.ui.plugin.datastore.AddDatastoreLayerPanel.Invalid-layer-where-clause=#T:Invalid
 WHERE clause for layer:
 jump.workbench.ui.plugin.datastore.AddDatastoreLayerPanel.SQL-error=#T:SQL 
error
 
com.vividsolutions.jump.workbench.ui.plugin.datastore.ConnectionPanel.Dataset=\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8
 
com.vividsolutions.jump.workbench.ui.plugin.datastore.ConnectionPanel.Geometry=\u30b8\u30aa\u30e1\u30c8\u30ea
@@ -2756,4 +2752,21 @@
 ui.GenericNames.show=#T:Show
 ui.GenericNames.user=#T:User
 ui.GenericNames.version=#T:Version
-ui.GenericNames.url=URL
\ No newline at end of file
+ui.GenericNames.url=URL
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn=#T:Update Layer with an 
Attribute Join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Attributes-mapping-is-not-defined=#T:Attributes
 mapping is not defined
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Choose-layers=#T:Choose 
layers
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Description=#T:Update 
reference layer attribute values with join layer attribute values when 
reference feature ext id = join feature id.\n\
+  Join attributes can be mapped to reference attributes even if their names 
differ.\n\
+  Left join keep reference feature which do not verify the join condition 
while right join add features from join layer which do not verify the join 
condition.
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Do-not-join=#T:Do not 
join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer=#T:Join layer
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id=#T:Join 
layer id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id-is-not-unique=#T:Join
 layer id is not unique
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join=#T:Left join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join-tooltip=#T:Check
 left join to keep all reference features
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Map-attributes=#T:Map 
attributes
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-ext-id=#T:Reference
 layer external id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-to-update=#T:Reference
 layer to update
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join=#T:Right join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join-tooltip=#T:Check
 right join to add un-joined features from join layer
\ No newline at end of file

Modified: core/trunk/src/language/jump_ml.properties
===================================================================
--- core/trunk/src/language/jump_ml.properties  2016-12-28 14:58:30 UTC (rev 
5293)
+++ core/trunk/src/language/jump_ml.properties  2016-12-29 12:25:19 UTC (rev 
5294)
@@ -175,7 +175,6 @@
 com.vividsolutions.jump.workbench.ui.style.BasicStylePanel.error-opening-file 
= \u0d2b\u0d2f\u0d32\u0d4d\u200d 
\u0d24\u0d41\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d24\u0d3f\u0d32\u0d4d\u200d
   \u0d2a\u0d3f\u0d36\u0d15\u0d4d\: {0}
 com.vividsolutions.jump.workbench.ui.style.ChangeStylesPlugIn = 
\u0d36\u0d48\u0d32\u0d3f \u0d2e\u0d3e\u0d31\u0d4d\u0d31\u0d41\u0d15 
 com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn = Affine 
Transform
-com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn=Transformaci\u00f3n
 af\u00edn (con vectores de deformaccion)
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message1=\#T\:Please
 load this image as Sextante Raster to perform a transformation
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message2=\#T\:Affine
 transformation not yet implemented for this type of layer
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message3=\#T\:Affine
 trasformation for raster currently works only on RGB image files
@@ -3836,7 +3835,6 @@
 
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL
 error: 
 
jump.workbench.ui.plugin.datastore.AddDatastoreLayerPanel.Invalid-layer-where-clause=#T:Invalid
 WHERE clause for layer: 
 jump.workbench.ui.plugin.datastore.AddDatastoreLayerPanel.SQL-error=#T:SQL 
error
-com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL
 error:
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose
 multi-geometries into simple geometries
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve
 geometry dimension
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate
 degenerated components to preserve geometry dimension
@@ -4027,4 +4025,21 @@
 ui.GenericNames.show=#T:Show
 ui.GenericNames.user=#T:User
 ui.GenericNames.version=#T:Version
-ui.GenericNames.url=URL
\ No newline at end of file
+ui.GenericNames.url=URL
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn=#T:Update Layer with an 
Attribute Join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Attributes-mapping-is-not-defined=#T:Attributes
 mapping is not defined
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Choose-layers=#T:Choose 
layers
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Description=#T:Update 
reference layer attribute values with join layer attribute values when 
reference feature ext id = join feature id.\n\
+  Join attributes can be mapped to reference attributes even if their names 
differ.\n\
+  Left join keep reference feature which do not verify the join condition 
while right join add features from join layer which do not verify the join 
condition.
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Do-not-join=#T:Do not 
join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer=#T:Join layer
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id=#T:Join 
layer id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id-is-not-unique=#T:Join
 layer id is not unique
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join=#T:Left join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join-tooltip=#T:Check
 left join to keep all reference features
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Map-attributes=#T:Map 
attributes
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-ext-id=#T:Reference
 layer external id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-to-update=#T:Reference
 layer to update
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join=#T:Right join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join-tooltip=#T:Check
 right join to add un-joined features from join layer
\ No newline at end of file

Modified: core/trunk/src/language/jump_pt.properties
===================================================================
--- core/trunk/src/language/jump_pt.properties  2016-12-28 14:58:30 UTC (rev 
5293)
+++ core/trunk/src/language/jump_pt.properties  2016-12-29 12:25:19 UTC (rev 
5294)
@@ -112,7 +112,7 @@
 com.vividsolutions.jump.workbench.ui.plugin.AddNewCategoryPlugIn = Adicionar 
nova categoria
 com.vividsolutions.jump.workbench.ui.plugin.AddNewCategoryPlugIn.name = 
T\:Category
 com.vividsolutions.jump.workbench.ui.plugin.AddNewFeaturesPlugIn = Adicionar 
nova fei\u00e7\u00e3o
-com.vividsolutions.jump.workbench.ui.plugin.AddNewLayerPlugIn = Adicionar um 
novo layer 
+com.vividsolutions.jump.workbench.ui.plugin.AddNewLayerPlugIn = Adicionar um 
novo layer
 com.vividsolutions.jump.workbench.ui.plugin.AddNewLayerPlugIn.name = T\:Layer
 com.vividsolutions.jump.workbench.ui.plugin.BeanShellPlugIn.BeanShell-Console 
= BeanShell Console
 com.vividsolutions.jump.workbench.ui.plugin.ClearSelectionPlugIn = Limpar 
sele\u00e7\u00e3o
@@ -126,7 +126,7 @@
 com.vividsolutions.jump.workbench.ui.plugin.ExplodeSelectedFeaturesPlugIn = 
Explodir fei\u00e7\u00f5es selecionadas
 com.vividsolutions.jump.workbench.ui.plugin.FeatureInfoPlugIn = 
Informa\u00e7\u00f5es da Fei\u00e7\u00e3o
 com.vividsolutions.jump.workbench.ui.plugin.FeatureStatisticsPlugIn = 
Estat\u00edsticas da fei\u00e7\u00e3o
-com.vividsolutions.jump.workbench.ui.plugin.LayerStatisticsPlugIn = 
Estat\u00edsticas do layer 
+com.vividsolutions.jump.workbench.ui.plugin.LayerStatisticsPlugIn = 
Estat\u00edsticas do layer
 com.vividsolutions.jump.workbench.ui.plugin.NewTaskPlugIn = Nova tarefa
 com.vividsolutions.jump.workbench.ui.plugin.OptionsPlugIn = op\u00e7\u00f5es
 com.vividsolutions.jump.workbench.ui.plugin.OutputWindowPlugIn = Janela de 
sa\u00edda
@@ -135,7 +135,7 @@
 com.vividsolutions.jump.workbench.ui.plugin.RedoPlugIn.nothing-to-redo = \#T\: 
Nothing to redo
 com.vividsolutions.jump.workbench.ui.plugin.RemoveSelectedCategoriesPlugIn = 
Remover categorias selecionadas
 com.vividsolutions.jump.workbench.ui.plugin.RemoveSelectedLayersPlugIn = 
Remover layers selecionados
-com.vividsolutions.jump.workbench.ui.plugin.SaveImageAsPlugIn = Salvarcomo  
imagem 
+com.vividsolutions.jump.workbench.ui.plugin.SaveImageAsPlugIn = Salvarcomo  
imagem
 com.vividsolutions.jump.workbench.ui.plugin.SelectFeaturesInFencePlugIn = 
Selecionar fei\u00e7\u00f5es no quadro
 com.vividsolutions.jump.workbench.ui.plugin.SelectablePlugIn = Selectable
 com.vividsolutions.jump.workbench.ui.plugin.ShortcutKeysPlugIn = Teclas de 
atalho
@@ -174,7 +174,6 @@
 com.vividsolutions.jump.workbench.ui.style.BasicStylePanel.error = Erro
 com.vividsolutions.jump.workbench.ui.style.BasicStylePanel.error-opening-file 
= Erro ao abrir o arquivo\: {0}
 com.vividsolutions.jump.workbench.ui.style.ChangeStylesPlugIn = Mudar estilos
-com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn = Afinar
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn=Transformaci\u00f3n
 af\u00edn (con vectores de deformaccion)
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message1=\#T\:Please
 load this image as Sextante Raster to perform a transformation
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message2=\#T\:Affine
 transformation not yet implemented for this type of layer
@@ -182,7 +181,7 @@
 com.vividsolutions.jump.workbench.ui.warp.DeleteIncrementalWarpingVectorTool = 
Ferramenta de Dele\u00e7\u00e3o de Deforma\u00e7\u00e3o Incremental
 com.vividsolutions.jump.workbench.ui.warp.DeleteWarpingVectorTool = Ferramenta 
de Desenhar Deforma\u00e7\u00e3o
 com.vividsolutions.jump.workbench.ui.warp.DrawIncrementalWarpingVectorTool = 
Ferramenta de Desenho de Deforma\u00e7\u00e3o Incremental
-com.vividsolutions.jump.workbench.ui.warp.DrawWarpingVectorTool = Ferramenta 
de Draw Deforma\u00e7\u00e3o 
+com.vividsolutions.jump.workbench.ui.warp.DrawWarpingVectorTool = Ferramenta 
de Draw Deforma\u00e7\u00e3o
 com.vividsolutions.jump.workbench.ui.warp.WarpingPlugIn = Deformar
 com.vividsolutions.jump.workbench.ui.zoom.PanTool = Ferramenta Pan
 com.vividsolutions.jump.workbench.ui.zoom.ZoomBarPlugIn = Barra de zoom
@@ -208,7 +207,7 @@
 com.vividsolutions.wms.ui.WMSViewer.get-image = Pegar imagem
 com.vividsolutions.wms.ui.WMSViewer.server-string = Cadeia de caracteres do 
servidor
 com.vividsolutions.wms.ui.WMSViewer.wms-url = 
http\://slkapps2.env.gov.bc.ca/servlet/com.esri.wms.Esrimap?
-com.vividsolutions.wms.ui.WMSViewer.wms-viewer = Visualizar WMS 
+com.vividsolutions.wms.ui.WMSViewer.wms-viewer = Visualizar WMS
 com.vividsolutions.wms.ui.WMSViewer.zoom-in = Ampliar
 com.vividsolutions.wms.ui.WMSViewer.zoom-out = Reduzir
 coordsys.ChangeCoordinateSystemPlugIn.coordinate-system-for-task = Sistema de 
coordenadas para tarefa\:
@@ -360,7 +359,7 @@
 jump.plugin.edit.NoderPlugIn.split = \#T\:Split
 jump.plugin.edit.NoderPlugIn.advanced-options = \#T\:Advanced Options
 jump.plugin.edit.NoderPlugIn.snap-rounding = \#T\:Snap-Rounding
-jump.plugin.edit.NoderPlugIn.snap-rounding-makes-noding-algorithm-fully-robust 
= \#T\:Snap-rounding makes noding algorithm fully robust 
+jump.plugin.edit.NoderPlugIn.snap-rounding-makes-noding-algorithm-fully-robust 
= \#T\:Snap-rounding makes noding algorithm fully robust
 jump.plugin.edit.NoderPlugIn.snap-rounding-decimal-places = \#T\:Snap-Rounding 
Decimal Places
 jump.plugin.edit.NoderPlugIn.number-of-decimal-digits = \#T\:Number of decimal 
digits
 jump.plugin.edit.NoderPlugIn.interpolate-z = \#T\:Interpolate Z value
@@ -388,7 +387,7 @@
 jump.plugin.edit.PolygonizerPlugIn.Number-of-invalid-rings-found = N\u00famero 
de envolt\u00f3rias inv\u00e1lidas encontradas\:
 jump.plugin.edit.PolygonizerPlugIn.Number-of-polygons-created = N\u00famero de 
pol\u00edgonos criados\:
 jump.plugin.edit.PolygonizerPlugIn.Polygonization = Poligoniza\u00e7\u00e3o
-jump.plugin.edit.PolygonizerPlugIn.Polygonization-requires-correctly-noded-data
 = A poligoniza\u00e7\u00e3o requer dados dos n\u00f3s corretos 
+jump.plugin.edit.PolygonizerPlugIn.Polygonization-requires-correctly-noded-data
 = A poligoniza\u00e7\u00e3o requer dados dos n\u00f3s corretos
 jump.plugin.edit.PolygonizerPlugIn.Polygonize = Poligonizar
 jump.plugin.edit.PolygonizerPlugIn.Polygonizes-the-line-segments-in-a-layer = 
Poligoniza os segmentos de linhas numa layer.
 jump.plugin.edit.PolygonizerPlugIn.Polygonizing = Poligonizando...
@@ -581,7 +580,7 @@
 org.openjump.core.ui.plugin.edit.SelectAllLayerItemsPlugIn.selected-items = 
Selecione itens
 
org.openjump.core.ui.plugin.edit.SelectAllModifiedFeaturesPlugIn.select-all-modified-features
 = T\:Select all modified features
 org.openjump.core.ui.plugin.edit.SelectByTypePlugIn.Empty-Geometries = 
Geometrias Vazias
-org.openjump.core.ui.plugin.edit.SelectByTypePlugIn.On-selected-layers-only = 
Apenas nos layers selecionados 
+org.openjump.core.ui.plugin.edit.SelectByTypePlugIn.On-selected-layers-only = 
Apenas nos layers selecionados
 org.openjump.core.ui.plugin.edit.SelectByTypePlugIn.Select-by-Geometry-Type = 
Selecione por Tipo de Geometria
 org.openjump.core.ui.plugin.edit.SelectByTypePlugIn.Select-only-these-types = 
Selecione apenas estes tipos\:
 
org.openjump.core.ui.plugin.edit.SelectItemsByCirlceFromSelectedLayersPlugIn.cirlce-diameter
 = di\u00e2metro do c\u00edrculo
@@ -672,7 +671,7 @@
 
org.openjump.core.ui.plugin.file.SaveLayersWithoutDataSourcePlugIn.directory-chooser
 = T\:Save newly created layers in the following directory
 org.openjump.core.ui.plugin.file.SaveLayersWithoutDataSourcePlugIn.do-not-save 
= T\:Do not save those layers on the Hard Drive
 
org.openjump.core.ui.plugin.file.SaveLayersWithoutDataSourcePlugIn.every-layer-has-a-datasource
 = T\:Every layer already has a datasource
-org.openjump.core.ui.plugin.file.SaveLayersWithoutDataSourcePlugIn.hover-the-label-to-see-the-list
 = T\:(hover the label to see the list) 
+org.openjump.core.ui.plugin.file.SaveLayersWithoutDataSourcePlugIn.hover-the-label-to-see-the-list
 = T\:(hover the label to see the list)
 
org.openjump.core.ui.plugin.file.SaveLayersWithoutDataSourcePlugIn.layers-without-datasource
 = T\:There are {0} newly created layers without datasource
 
org.openjump.core.ui.plugin.file.SaveLayersWithoutDataSourcePlugIn.layers-without-datasource-management
 = T\:Layers without datasource management
 org.openjump.core.ui.plugin.file.SaveLayersWithoutDataSourcePlugIn.save-as-jml 
= T\:Save them as JML files
@@ -870,7 +869,7 @@
 
org.openjump.core.ui.plugin.mousemenu.SaveDatasetsPlugIn.Warning-See-Output-Window
 = Nota\: veja janela de sa\u00edda
 org.openjump.core.ui.plugin.mousemenu.SaveDatasetsPlugIn.layer = layer\:
 org.openjump.core.ui.plugin.mousemenu.SaveDatasetsPlugIn.read-only-layer = 
layer somente para leitura
-org.openjump.core.ui.plugin.mousemenu.SaveDatasetsPlugIn.read-only-source-will-replace-an-existing-file
 = substituir\u00e1 o arquivo existente pela fonte do somente leitura 
+org.openjump.core.ui.plugin.mousemenu.SaveDatasetsPlugIn.read-only-source-will-replace-an-existing-file
 = substituir\u00e1 o arquivo existente pela fonte do somente leitura
 org.openjump.core.ui.plugin.mousemenu.SaveDatasetsPlugIn.replaces-file = 
recolocar arquivos
 org.openjump.core.ui.plugin.mousemenu.SaveDatasetsPlugIn.with-empty-geometry = 
com geometria vazia
 
org.openjump.core.ui.plugin.mousemenu.SaveDatasetsPlugIn.with-mixed-geometry-types
 = com tipos de geometrias misturadas
@@ -921,7 +920,7 @@
 org.openjump.core.ui.plugin.queries.Operator.ne = \#
 org.openjump.core.ui.plugin.queries.Operator.overl = sobrep\u00f5e-se
 org.openjump.core.ui.plugin.queries.Operator.relat = \#T\:relate
-org.openjump.core.ui.plugin.queries.Operator.star = come\u00e7a com 
+org.openjump.core.ui.plugin.queries.Operator.star = come\u00e7a com
 org.openjump.core.ui.plugin.queries.Operator.touch = toca
 org.openjump.core.ui.plugin.queries.Operator.wdist = est\u00e1 dentro
 org.openjump.core.ui.plugin.queries.Operator.withi = est\u00e1 incluso em
@@ -1136,7 +1135,7 @@
 org.openjump.core.ui.plugin.tools.Add3DGeometryAttributesPlugIn.nb-nan-z = 
\#T\:\#NaN_Z
 org.openjump.core.ui.plugin.tools.Add3DGeometryAttributesPlugIn.add-nb-nan-z = 
\#T\:Number of coordinates without Z (NaN)
 org.openjump.core.ui.plugin.tools.Add3DGeometryAttributesPlugIn.nb-0-z = 
\#T\:\#Null_Z
-org.openjump.core.ui.plugin.tools.Add3DGeometryAttributesPlugIn.add-nb-0-z = 
\#T\:Number of Null (0) Z 
+org.openjump.core.ui.plugin.tools.Add3DGeometryAttributesPlugIn.add-nb-0-z = 
\#T\:Number of Null (0) Z
 org.openjump.core.ui.plugin.tools.Add3DGeometryAttributesPlugIn.nb-negative-z 
= \#T\:\#Negative_Z
 
org.openjump.core.ui.plugin.tools.Add3DGeometryAttributesPlugIn.add-nb-negative-z
 = \#T\:Number of Negative Z
 org.openjump.core.ui.plugin.tools.Add3DGeometryAttributesPlugIn.nb-positive-z 
= \#T\:\#Positive_Z
@@ -1236,7 +1235,7 @@
 
org.openjump.core.ui.plugin.tools.CreateThiessenPolygonsPlugIn.Creates-a-Delaunay-triangulation-and-returns-the-Voronoi-regions
 = Executa a triangula\u00e7\u00e3o do tipo Delaunay e retorna as regi\u00f5es.
 
org.openjump.core.ui.plugin.tools.CreateThiessenPolygonsPlugIn.Error-found-multiple-points-in-polygon
 = Erro\: found multiple points in polygon
 
org.openjump.core.ui.plugin.tools.CreateThiessenPolygonsPlugIn.add-attributes-from-points
 = Adicionar atributos dos pontos
-org.openjump.core.ui.plugin.tools.CreateThiessenPolygonsPlugIn.background-layer-to-estimate-the-thiessen-polygon-size
 = background layer to estimate the border thiessen polygon size 
+org.openjump.core.ui.plugin.tools.CreateThiessenPolygonsPlugIn.background-layer-to-estimate-the-thiessen-polygon-size
 = background layer to estimate the border thiessen polygon size
 
org.openjump.core.ui.plugin.tools.CreateThiessenPolygonsPlugIn.create-polygons-from-voronoi-edges
 = Cria pol\u00edgonos das bordas Voronoi
 
org.openjump.core.ui.plugin.tools.CreateThiessenPolygonsPlugIn.create-triangulation
 = triangular
 
org.openjump.core.ui.plugin.tools.CreateThiessenPolygonsPlugIn.no-point-geometry
 = geometria n\u00e3o \u00e9 do tipo ponto
@@ -1326,7 +1325,7 @@
 org.openjump.core.ui.plugin.tools.PlumePlugIn = Plume
 org.openjump.core.ui.plugin.tools.ReducePointsISAPlugIn.Points-reduced-from = 
Pontos reduzidos de
 
org.openjump.core.ui.plugin.tools.ReducePointsISAPlugIn.Reduce-points-in-selected-features
 = Reduz pontos nas fei\u00e7\u00f5es selecionadas.
-org.openjump.core.ui.plugin.tools.ReducePointsISAPlugIn.Simplify-ISA-algorithm 
= Simplificar (algor\u00edtimo ISA) 
+org.openjump.core.ui.plugin.tools.ReducePointsISAPlugIn.Simplify-ISA-algorithm 
= Simplificar (algor\u00edtimo ISA)
 
org.openjump.core.ui.plugin.tools.ReducePointsISAPlugIn.The-reduce-points-tolerance
 = A toler\u00e2ncia da redu\u00e7\u00e3o.
 org.openjump.core.ui.plugin.tools.ReducePointsISAPlugIn.Tolerance = 
Toler\u00e2ncia
 org.openjump.core.ui.plugin.tools.ReducePointsISAPlugIn.to = para
@@ -1449,7 +1448,7 @@
 org.openjump.core.ui.plugin.tools.VoronoiDiagramPlugIn.transfer-attributes = 
\#T\:Transfer attributes
 org.openjump.core.ui.plugin.tools.VoronoiDiagramPlugIn.tolerance = 
\#T\:Tolerance
 org.openjump.core.ui.plugin.tools.VoronoiDiagramPlugIn.description = 
\#T\:Create the Voronoi Diagram (AKA Thiessen polygons) of a set of punctual 
sites.\n\
-       Use a non null tolerance to make the calculation more robust. 
+       Use a non null tolerance to make the calculation more robust.
 org.openjump.core.ui.plugin.tools.CalculateDistancesPlugIn.Calculate-Distances 
= \#T\:Calculate Distances
 
org.openjump.core.ui.plugin.tools.CalculateDistancesPlugIn.Calculates-distances-description
 = \#T\:Calculates distance between the geometries in 2 different datasets. It 
can calculate\: (i) the shortest distance (sd), (ii) the shortest distance 
between centroids (sdc), and (iii) the Hausdorff distance (sdh, a maximum 
distance).
 org.openjump.core.ui.plugin.tools.CalculateDistancesPlugIn.layer-with-origins 
= \#T\:layer with origins
@@ -1504,7 +1503,7 @@
 org.openjump.core.ui.plugin.window.SyncronizationPlugIn.Synchronize-pan-only = 
Sicronizar apenas o pan
 org.openjump.core.ui.plugin.wms.AddWmsLayerWizard = WMS Layer
 org.openjump.core.ui.plugin.wms.AddWmsLayerWizard.Add-WMS-Layer = WMS Layer
-org.openjump.core.ui.plugin.wms.ZoomToWMSPlugIn.bounding-box-for = Caixa de 
Limite(s) para 
+org.openjump.core.ui.plugin.wms.ZoomToWMSPlugIn.bounding-box-for = Caixa de 
Limite(s) para
 org.openjump.core.ui.plugin.wms.ZoomToWMSPlugIn.no-bounding-box = Sem envelope 
(caixa de limites)\!
 org.openjump.core.ui.plugin.wms.ZoomToWMSPlugIn.no-bounding-boxes-available = 
Sem Caixa de Limite(s) dispon\u00edvel\!
 org.openjump.core.ui.plugin.wms.ZoomToWMSPlugIn.no-wms-layer-selected = Nenhum 
Layer(s) WMS selecionado\!
@@ -1597,13 +1596,13 @@
 pirol.ui.panels.default-value-for-new-attribute = valor padr\u00e3o para o 
novo atributo
 pirol.ui.panels.name-of-new-attribute = nome do novo campo
 pirol.ui.panels.type-of-new-attribute = tipo do novo campo
-plugin.AbstractPlugIn.done-current-committed-memory = Feito. Gravado na 
mem\u00f3ria corrente\: 
+plugin.AbstractPlugIn.done-current-committed-memory = Feito. Gravado na 
mem\u00f3ria corrente\:
 plugin.EnableCheckFactory.a-fence-must-be-drawn = Um quadro deve ser desenhado
 plugin.EnableCheckFactory.a-task-window-must-be-active = Uma Janela de Tarefa 
deve estar ativa
 plugin.EnableCheckFactory.a-window-with-a-layer-manager-must-be-active = Uma 
janela com um gerenciador de layer deve estar ativa
 plugin.EnableCheckFactory.a-window-with-a-layer-name-panel-must-be-active = 
Uma janela com um painel com o nome do layer deve estar ativa
 plugin.EnableCheckFactory.a-window-with-a-layer-view-panel-must-be-active = 
Uma janela com um painel de vis\u00e3o de layer deve estar ativa
-plugin.EnableCheckFactory.a-window-with-an-associated-task-frame-must-be-active
 = Uma janela com uma tarefa associada deve estar ativa 
+plugin.EnableCheckFactory.a-window-with-an-associated-task-frame-must-be-active
 = Uma janela com uma tarefa associada deve estar ativa
 plugin.EnableCheckFactory.a-window-with-selection-manager-must-be-active = Uma 
janela com um gerenciador de sele\u00e7\u00e3o deve estar ativa
 plugin.EnableCheckFactory.at-least-{0}-categories-must-be-selected = Ao menos 
{0} categorias devem estar selecionadas
 plugin.EnableCheckFactory.at-least-{0}-category-must-be-selected = Ao menos 
{0} categoria deve estar selecionada
@@ -2752,4 +2751,21 @@
 ui.GenericNames.show=#T:Show
 ui.GenericNames.user=#T:User
 ui.GenericNames.version=#T:Version
-ui.GenericNames.url=URL
\ No newline at end of file
+ui.GenericNames.url=URL
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn=#T:Update Layer with an 
Attribute Join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Attributes-mapping-is-not-defined=#T:Attributes
 mapping is not defined
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Choose-layers=#T:Choose 
layers
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Description=#T:Update 
reference layer attribute values with join layer attribute values when 
reference feature ext id = join feature id.\n\
+  Join attributes can be mapped to reference attributes even if their names 
differ.\n\
+  Left join keep reference feature which do not verify the join condition 
while right join add features from join layer which do not verify the join 
condition.
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Do-not-join=#T:Do not 
join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer=#T:Join layer
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id=#T:Join 
layer id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id-is-not-unique=#T:Join
 layer id is not unique
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join=#T:Left join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join-tooltip=#T:Check
 left join to keep all reference features
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Map-attributes=#T:Map 
attributes
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-ext-id=#T:Reference
 layer external id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-to-update=#T:Reference
 layer to update
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join=#T:Right join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join-tooltip=#T:Check
 right join to add un-joined features from join layer
\ No newline at end of file

Modified: core/trunk/src/language/jump_pt_BR.properties
===================================================================
--- core/trunk/src/language/jump_pt_BR.properties       2016-12-28 14:58:30 UTC 
(rev 5293)
+++ core/trunk/src/language/jump_pt_BR.properties       2016-12-29 12:25:19 UTC 
(rev 5294)
@@ -174,7 +174,6 @@
 com.vividsolutions.jump.workbench.ui.style.BasicStylePanel.error = Erro
 com.vividsolutions.jump.workbench.ui.style.BasicStylePanel.error-opening-file 
= Erro ao abrir o arquivo\: {0}
 com.vividsolutions.jump.workbench.ui.style.ChangeStylesPlugIn = Mudar estilos
-com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn = Afinar
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn=Transformaci\u00f3n
 af\u00edn (con vectores de deformaccion)
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message1=\#T\:Please
 load this image as Sextante Raster to perform a transformation
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message2=\#T\:Affine
 transformation not yet implemented for this type of layer
@@ -2562,7 +2561,6 @@
 
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL
 error: 
 
jump.workbench.ui.plugin.datastore.AddDatastoreLayerPanel.Invalid-layer-where-clause=#T:Invalid
 WHERE clause for layer: 
 jump.workbench.ui.plugin.datastore.AddDatastoreLayerPanel.SQL-error=#T:SQL 
error
-com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL
 error:
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose
 multi-geometries into simple geometries
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve
 geometry dimension
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate
 degenerated components to preserve geometry dimension
@@ -2753,4 +2751,21 @@
 ui.GenericNames.show=#T:Show
 ui.GenericNames.user=#T:User
 ui.GenericNames.version=#T:Version
-ui.GenericNames.url=URL
\ No newline at end of file
+ui.GenericNames.url=URL
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn=#T:Update Layer with an 
Attribute Join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Attributes-mapping-is-not-defined=#T:Attributes
 mapping is not defined
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Choose-layers=#T:Choose 
layers
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Description=#T:Update 
reference layer attribute values with join layer attribute values when 
reference feature ext id = join feature id.\n\
+  Join attributes can be mapped to reference attributes even if their names 
differ.\n\
+  Left join keep reference feature which do not verify the join condition 
while right join add features from join layer which do not verify the join 
condition.
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Do-not-join=#T:Do not 
join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer=#T:Join layer
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id=#T:Join 
layer id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id-is-not-unique=#T:Join
 layer id is not unique
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join=#T:Left join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join-tooltip=#T:Check
 left join to keep all reference features
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Map-attributes=#T:Map 
attributes
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-ext-id=#T:Reference
 layer external id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-to-update=#T:Reference
 layer to update
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join=#T:Right join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join-tooltip=#T:Check
 right join to add un-joined features from join layer
\ No newline at end of file

Modified: core/trunk/src/language/jump_ta_IN.properties
===================================================================
--- core/trunk/src/language/jump_ta_IN.properties       2016-12-28 14:58:30 UTC 
(rev 5293)
+++ core/trunk/src/language/jump_ta_IN.properties       2016-12-29 12:25:19 UTC 
(rev 5294)
@@ -175,7 +175,6 @@
 com.vividsolutions.jump.workbench.ui.style.BasicStylePanel.error-opening-file 
= \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1  
\u0baa\u0bbe\u0b99\u0bcd\u0b95\u0bc1\u0b95\u0bb3\u0bcd
 com.vividsolutions.jump.workbench.ui.style.ChangeStylesPlugIn = 
\u0b95\u0bc7\u0ba3\u0bcd\u0bae\u0bc8  
\u0b87\u0b9f\u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1\u0ba4\u0bb2\u0bcd
 com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn = 
\u0b87\u0ba9\u0bcd\u0b95\u0bcd\u0bb0\u0bbf\u0bae\u0bc6\u0ba3\u0bcd\u0b9f\u0bb2\u0bcd
  
\u0b95\u0bc1\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bc0\u0b9f\u0bcd\u0b9f\u0bbe\u0bb2\u0bcd
 \u0bb5\u0bc6\u0b95\u0bcd\u0b9f\u0bb0\u0bcd  \u0b95\u0bb0\u0bc1\u0bb5\u0bbf 
\u0b85\u0bb4\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd
-com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn=Transformaci\u00f3n
 af\u00edn (con vectores de deformaccion)
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message1=\#T\:Please
 load this image as Sextante Raster to perform a transformation
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message2=\#T\:Affine
 transformation not yet implemented for this type of layer
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message3=\#T\:Affine
 trasformation for raster currently works only on RGB image files
@@ -2561,7 +2560,6 @@
 
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL
 error: 
 
jump.workbench.ui.plugin.datastore.AddDatastoreLayerPanel.Invalid-layer-where-clause=#T:Invalid
 WHERE clause for layer: 
 jump.workbench.ui.plugin.datastore.AddDatastoreLayerPanel.SQL-error=#T:SQL 
error
-com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL
 error:
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose
 multi-geometries into simple geometries
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve
 geometry dimension
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate
 degenerated components to preserve geometry dimension
@@ -2580,9 +2578,6 @@
 ui.GenericNames.Temporal-layer = \#T\:Temporal layer
 ui.GenericNames.Temporal-layers = \#T\:Temporal layers
 ui.GenericNames.Temporal-layers-found = \#T\:Temporal layers found
-ui.GenericNames.Temporal-layer = \#T\:Temporal layer
-ui.GenericNames.Temporal-layers = \#T\:Temporal layers
-ui.GenericNames.Temporal-layers-found = \#T\:Temporal layers found
 org.openjump.core.ui.plugin.tools.aggregate.Aggregator.Count=\#T\:Count
 org.openjump.core.ui.plugin.tools.aggregate.Aggregator.Collect=\#T\:Collect
 org.openjump.core.ui.plugin.tools.aggregate.Aggregator.Union=\#T\:Union/Merge
@@ -2755,4 +2750,21 @@
 ui.GenericNames.show=#T:Show
 ui.GenericNames.user=#T:User
 ui.GenericNames.version=#T:Version
-ui.GenericNames.url=#T:URL
\ No newline at end of file
+ui.GenericNames.url=#T:URL
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn=#T:Update Layer with an 
Attribute Join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Attributes-mapping-is-not-defined=#T:Attributes
 mapping is not defined
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Choose-layers=#T:Choose 
layers
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Description=#T:Update 
reference layer attribute values with join layer attribute values when 
reference feature ext id = join feature id.\n\
+  Join attributes can be mapped to reference attributes even if their names 
differ.\n\
+  Left join keep reference feature which do not verify the join condition 
while right join add features from join layer which do not verify the join 
condition.
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Do-not-join=#T:Do not 
join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer=#T:Join layer
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id=#T:Join 
layer id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id-is-not-unique=#T:Join
 layer id is not unique
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join=#T:Left join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join-tooltip=#T:Check
 left join to keep all reference features
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Map-attributes=#T:Map 
attributes
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-ext-id=#T:Reference
 layer external id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-to-update=#T:Reference
 layer to update
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join=#T:Right join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join-tooltip=#T:Check
 right join to add un-joined features from join layer
\ No newline at end of file

Modified: core/trunk/src/language/jump_te.properties
===================================================================
--- core/trunk/src/language/jump_te.properties  2016-12-28 14:58:30 UTC (rev 
5293)
+++ core/trunk/src/language/jump_te.properties  2016-12-29 12:25:19 UTC (rev 
5294)
@@ -175,7 +175,6 @@
 com.vividsolutions.jump.workbench.ui.style.BasicStylePanel.error-opening-file 
= Error opening file\: {0}
 com.vividsolutions.jump.workbench.ui.style.ChangeStylesPlugIn = Change Styles
 com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn = Affine 
Transform
-com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn=Transformaci\u00f3n
 af\u00edn (con vectores de deformaccion)
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message1=\#T\:Please
 load this image as Sextante Raster to perform a transformation
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message2=\#T\:Affine
 transformation not yet implemented for this type of layer
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message3=\#T\:Affine
 trasformation for raster currently works only on RGB image files
@@ -1241,8 +1240,6 @@
 org.openjump.core.ui.plugin.raster.nodata.ChangeRangeValuesToNoDataPlugIn.name 
=\#T\:Change a range of cell values to nodata
 
org.openjump.core.ui.plugin.raster.nodata.ChangeRangeValuesToNoDataPlugIn.change=\#T\:Change
 this range of values
 
org.openjump.core.ui.plugin.raster.nodata.ChangeRangeValuesToNoDataPlugIn.tooltips=\#T\:Enable
 to extract only the input range of values
-
-org.openjump.core.ui.plugin.raster.nodata.ChangeValueToNoDataPlugIn.tonodata=\#T\:to
 nodata value:
 org.openjump.core.ui.plugin.raster.color.RasterColorEditorDialog.Black-White = 
Black-White
 
org.openjump.core.ui.plugin.raster.color.RasterColorEditorDialog.Blue-Green-Red 
= Blue-Green-Red
 org.openjump.core.ui.plugin.raster.color.RasterColorEditorDialog.Blue-Red = 
Blue-Red
@@ -3070,7 +3067,6 @@
 
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL
 error: 
 
jump.workbench.ui.plugin.datastore.AddDatastoreLayerPanel.Invalid-layer-where-clause=#T:Invalid
 WHERE clause for layer: 
 jump.workbench.ui.plugin.datastore.AddDatastoreLayerPanel.SQL-error=#T:SQL 
error
-com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL
 error:
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose
 multi-geometries into simple geometries
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve
 geometry dimension
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate
 degenerated components to preserve geometry dimension
@@ -3261,4 +3257,21 @@
 ui.GenericNames.show=#T:Show
 ui.GenericNames.user=#T:User
 ui.GenericNames.version=#T:Version
-ui.GenericNames.url=#T:URL
\ No newline at end of file
+ui.GenericNames.url=#T:URL
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn=#T:Update Layer with an 
Attribute Join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Attributes-mapping-is-not-defined=#T:Attributes
 mapping is not defined
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Choose-layers=#T:Choose 
layers
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Description=#T:Update 
reference layer attribute values with join layer attribute values when 
reference feature ext id = join feature id.\n\
+  Join attributes can be mapped to reference attributes even if their names 
differ.\n\
+  Left join keep reference feature which do not verify the join condition 
while right join add features from join layer which do not verify the join 
condition.
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Do-not-join=#T:Do not 
join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer=#T:Join layer
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id=#T:Join 
layer id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id-is-not-unique=#T:Join
 layer id is not unique
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join=#T:Left join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join-tooltip=#T:Check
 left join to keep all reference features
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Map-attributes=#T:Map 
attributes
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-ext-id=#T:Reference
 layer external id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-to-update=#T:Reference
 layer to update
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join=#T:Right join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join-tooltip=#T:Check
 right join to add un-joined features from join layer
\ No newline at end of file

Modified: core/trunk/src/language/jump_zh_CN.properties
===================================================================
--- core/trunk/src/language/jump_zh_CN.properties       2016-12-28 14:58:30 UTC 
(rev 5293)
+++ core/trunk/src/language/jump_zh_CN.properties       2016-12-29 12:25:19 UTC 
(rev 5294)
@@ -11,7 +11,7 @@
 JUMPWorkbench.status.load-extensions = \#T\:Preparing to load additional 
extensions
 JUMPWorkbench.status.restore-state = \#T\:Restoring state from previous run
 JUMPWorkbench.version = \u7248\u672c
-JUMPWorkbench.version-locale = \u7248\u672c\t
+JUMPWorkbench.version-locale = \u7248\u672c
 JUMPWorkbench.status.initialize-datasources = \#T\:
 JUMPWorkbench.status.show-workbench = \#T\:
 com.vividsolutions.jump.io.ShapefileReader.shp-gt-dbf = \#T\:Error reading 
shapefile ''{0}'' \:\n\
@@ -175,7 +175,6 @@
 com.vividsolutions.jump.workbench.ui.style.BasicStylePanel.error-opening-file 
= \u9519\u8bef\u6253\u5f00\u6587\u4ef6\: {0}
 com.vividsolutions.jump.workbench.ui.style.ChangeStylesPlugIn = 
\u66f4\u6539\u6837\u5f0f
 com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn = 
\u4eff\u5c04\u53d8\u6362
-com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn=Transformaci\u00f3n
 af\u00edn (con vectores de deformaccion)
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message1=\#T\:Please
 load this image as Sextante Raster to perform a transformation
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message2=\#T\:Affine
 transformation not yet implemented for this type of layer
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message3=\#T\:Affine
 trasformation for raster currently works only on RGB image files
@@ -358,7 +357,7 @@
 jump.plugin.edit.NoderPlugIn.split = \#T\:Split
 jump.plugin.edit.NoderPlugIn.advanced-options = \#T\:Advanced Options
 jump.plugin.edit.NoderPlugIn.snap-rounding = \#T\:Snap-Rounding
-jump.plugin.edit.NoderPlugIn.snap-rounding-makes-noding-algorithm-fully-robust 
= \#T\:Snap-rounding makes noding algorithm fully robust 
+jump.plugin.edit.NoderPlugIn.snap-rounding-makes-noding-algorithm-fully-robust 
= \#T\:Snap-rounding makes noding algorithm fully robust
 jump.plugin.edit.NoderPlugIn.snap-rounding-decimal-places = \#T\:Snap-Rounding 
Decimal Places
 jump.plugin.edit.NoderPlugIn.number-of-decimal-digits = \#T\:Number of decimal 
digits
 jump.plugin.edit.NoderPlugIn.interpolate-z = \#T\:Interpolate Z value
@@ -555,7 +554,7 @@
 
org.openjump.core.ui.plugin.datastore.transaction.TransactionManagerPanel.modifications
 = \#T\:{0} modification(s)
 
org.openjump.core.ui.plugin.datastore.transaction.TransactionManagerPanel.suppressions
 = \#T\:{0} suppression(s)
 org.openjump.core.ui.plugin.edit.ClipToFencePlugIn.Clip-Map-to-Fence = 
\u526a\u8f91\u5730\u56fe\u9500\u8d43
-org.openjump.core.ui.plugin.edit.ClipToFencePlugIn.Fence-layer-must-be-present 
= \u6805\u680f\u5c42\u5fc5\u987b\u5b58\u5728\t
+org.openjump.core.ui.plugin.edit.ClipToFencePlugIn.Fence-layer-must-be-present 
= \u6805\u680f\u5c42\u5fc5\u987b\u5b58\u5728
 
org.openjump.core.ui.plugin.edit.ClipToFencePlugIn.This-operation-is-not-undoable
 = \u6b64\u64cd\u4f5c\u662f\u65e0\u6cd5\u8fd8\u539f
 
org.openjump.core.ui.plugin.edit.ClipToFencePlugIn.Visible-Only-(-see-Warning-) 
= \u53ef\u89c1\uff0c\u53ea\u6709\uff08\u89c1\u8b66\u544a\uff09
 org.openjump.core.ui.plugin.edit.ClipToFencePlugIn.description = 
\u6240\u6709\u77e2\u91cf\u5c42\u5c06\u88ab\u5939\u5728\u6805\u680f\u3002\u8b66\u544a\uff1a
 
\u5982\u679c\u4f60\u7684\u4efb\u52a1\u88c5\u6709\u5c42\u4e0d\u53ef\u89c1\uff0c\u4ed6\u4eec\u5e76\u6ca1\u6709\u88ab\u52a0\u8f7d\uff0c\u56e0\u6b64\u4e0d\u4f1a\u88ab\u88c1\u526a\u3002
@@ -648,7 +647,7 @@
 
org.openjump.core.ui.plugin.edittoolbox.tab.ConstraintsOptionsPanel.is-too-small-must-be-3-or-greater
 = \u592a\u5c0f\u4e86\uff0c\u5e94\u4e3a3\u6216\u66f4\u5927\u3002
 
org.openjump.core.ui.plugin.edittoolbox.tab.ConstraintsOptionsPanel.model-units 
= \u793a\u8303\u5355\u4f4d
 
org.openjump.core.ui.plugin.edittoolbox.tab.ConstraintsOptionsPanel.negative-numbers-not-allowed-for-length
 = \u8d1f\u6570\u4e0d\u5141\u8bb8\u7684\u957f\u5ea6\u3002
-org.openjump.core.ui.plugin.edittoolbox.tab.ConstraintsOptionsPanel.parts = 
\u90e8\u5206\t
+org.openjump.core.ui.plugin.edittoolbox.tab.ConstraintsOptionsPanel.parts = 
\u90e8\u5206
 
org.openjump.core.ui.plugin.file.DataSourceQueryChooserOpenWizard.no-queries-found
 = \u53d1\u73b0\u6ca1\u6709\u95ee\u9898
 
org.openjump.core.ui.plugin.file.DataSourceQueryChooserOpenWizard.query-not-readable
 = Quey\u65e0\u6cd5\u8bfb\u53d6
 org.openjump.core.ui.plugin.file.FindFile.choose-current-location-of = \#T\:
@@ -1560,7 +1559,7 @@
 org.openjump.core.ui.plugin.tools.VoronoiDiagramPlugIn.transfer-attributes = 
\#T\:Transfer attributes
 org.openjump.core.ui.plugin.tools.VoronoiDiagramPlugIn.tolerance = 
\#T\:Tolerance
 org.openjump.core.ui.plugin.tools.VoronoiDiagramPlugIn.description = 
\#T\:Create the Voronoi Diagram (AKA Thiessen polygons) of a set of punctual 
sites.\n\
-       Use a non null tolerance to make the calculation more robust. 
+       Use a non null tolerance to make the calculation more robust.
 org.openjump.core.ui.plugin.tools.CalculateDistancesPlugIn.Calculate-Distances 
= \#T\:Calculate Distances
 
org.openjump.core.ui.plugin.tools.CalculateDistancesPlugIn.Calculates-distances-description
 = \#T\:Calculates distance between the geometries in 2 different datasets. It 
can calculate\: (i) the shortest distance (sd), (ii) the shortest distance 
between centroids (sdc), and (iii) the Hausdorff distance (sdh, a maximum 
distance).
 org.openjump.core.ui.plugin.tools.CalculateDistancesPlugIn.layer-with-origins 
= \#T\:layer with origins
@@ -2725,7 +2724,6 @@
 
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL
 error: 
 
jump.workbench.ui.plugin.datastore.AddDatastoreLayerPanel.Invalid-layer-where-clause=#T:Invalid
 WHERE clause for layer: 
 jump.workbench.ui.plugin.datastore.AddDatastoreLayerPanel.SQL-error=#T:SQL 
error
-com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL
 error:
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose
 multi-geometries into simple geometries
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve
 geometry dimension
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate
 degenerated components to preserve geometry dimension
@@ -2916,4 +2914,21 @@
 ui.GenericNames.show=#T:Show
 ui.GenericNames.user=#T:User
 ui.GenericNames.version=#T:Version
-ui.GenericNames.url=#T:URL
\ No newline at end of file
+ui.GenericNames.url=#T:URL
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn=#T:Update Layer with an 
Attribute Join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Attributes-mapping-is-not-defined=#T:Attributes
 mapping is not defined
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Choose-layers=#T:Choose 
layers
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Description=#T:Update 
reference layer attribute values with join layer attribute values when 
reference feature ext id = join feature id.\n\
+  Join attributes can be mapped to reference attributes even if their names 
differ.\n\
+  Left join keep reference feature which do not verify the join condition 
while right join add features from join layer which do not verify the join 
condition.
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Do-not-join=#T:Do not 
join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer=#T:Join layer
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id=#T:Join 
layer id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id-is-not-unique=#T:Join
 layer id is not unique
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join=#T:Left join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join-tooltip=#T:Check
 left join to keep all reference features
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Map-attributes=#T:Map 
attributes
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-ext-id=#T:Reference
 layer external id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-to-update=#T:Reference
 layer to update
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join=#T:Right join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join-tooltip=#T:Check
 right join to add un-joined features from join layer
\ No newline at end of file

Modified: core/trunk/src/language/jump_zh_HK.properties
===================================================================
--- core/trunk/src/language/jump_zh_HK.properties       2016-12-28 14:58:30 UTC 
(rev 5293)
+++ core/trunk/src/language/jump_zh_HK.properties       2016-12-29 12:25:19 UTC 
(rev 5294)
@@ -175,7 +175,6 @@
 com.vividsolutions.jump.workbench.ui.style.BasicStylePanel.error-opening-file 
= \u932f\u8aa4\u6253\u958b\u6587\u4ef6\: {0}
 com.vividsolutions.jump.workbench.ui.style.ChangeStylesPlugIn = 
\u66f4\u6539\u6a23\u5f0f
 com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn = 
\u4eff\u5c04\u8b8a\u63db
-com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn=Transformaci\u00f3n
 af\u00edn (con vectores de deformaccion)
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message1=\#T\:Please
 load this image as Sextante Raster to perform a transformation
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message2=\#T\:Affine
 transformation not yet implemented for this type of layer
 
com.vividsolutions.jump.workbench.ui.warp.AffineTransformPlugIn.message3=\#T\:Affine
 trasformation for raster currently works only on RGB image files
@@ -1023,7 +1022,6 @@
 org.openjump.core.ui.plugin.raster.RasterImageLayerPropertiesPlugIn.namefile= 
\#T\:File
 org.openjump.core.ui.plugin.raster.RasterImageLayerPropertiesPlugIn.raster= 
\#T\:Raster
 org.openjump.core.ui.plugin.raster.RasterImageLayerPropertiesPlugIn.extent= 
\#T\:Extent
-org.openjump.core.ui.plugin.raster.RasterImageLayerPropertiesPlugIn.raster-statistics=
 \#T\:Statistics
 org.openjump.core.ui.plugin.raster.RasterImageLayerPropertiesPlugIn.name= 
\#T\:name
 org.openjump.core.ui.plugin.raster.RasterImageLayerPropertiesPlugIn.type= 
\#T\:type
 org.openjump.core.ui.plugin.raster.RasterImageLayerPropertiesPlugIn.dimension= 
\#T\:dimension
@@ -2724,7 +2722,6 @@
 
com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL
 error: 
 
jump.workbench.ui.plugin.datastore.AddDatastoreLayerPanel.Invalid-layer-where-clause=\#T\:Invalid
 WHERE clause for layer\:
 jump.workbench.ui.plugin.datastore.AddDatastoreLayerPanel.SQL-error=#T:SQL 
error
-com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection.SQL-error=#T:SQL
 error:
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.decompose-multi-tooltip=\#T\:Decompose
 multi-geometries into simple geometries
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim=\#T\:Preserve
 geometry dimension
 
org.openjump.core.ui.plugin.tools.MakeValidPlugIn.preserve-geom-dim-tooltip=\#T\:Eliminate
 degenerated components to preserve geometry dimension
@@ -2917,4 +2914,21 @@
 ui.GenericNames.show=#T:Show
 ui.GenericNames.user=#T:User
 ui.GenericNames.version=#T:Version
-ui.GenericNames.url=#T:URL
\ No newline at end of file
+ui.GenericNames.url=#T:URL
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn=#T:Update Layer with an 
Attribute Join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Attributes-mapping-is-not-defined=#T:Attributes
 mapping is not defined
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Choose-layers=#T:Choose 
layers
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Description=#T:Update 
reference layer attribute values with join layer attribute values when 
reference feature ext id = join feature id.\n\
+  Join attributes can be mapped to reference attributes even if their names 
differ.\n\
+  Left join keep reference feature which do not verify the join condition 
while right join add features from join layer which do not verify the join 
condition.
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Do-not-join=#T:Do not 
join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer=#T:Join layer
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id=#T:Join 
layer id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id-is-not-unique=#T:Join
 layer id is not unique
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join=#T:Left join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join-tooltip=#T:Check
 left join to keep all reference features
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Map-attributes=#T:Map 
attributes
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-ext-id=#T:Reference
 layer external id
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-to-update=#T:Reference
 layer to update
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join=#T:Right join
+org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join-tooltip=#T:Check
 right join to add un-joined features from join layer
\ No newline at end of file

Added: 
core/trunk/src/org/openjump/core/ui/plugin/tools/UpdateWithJoinPlugIn.java
===================================================================
--- core/trunk/src/org/openjump/core/ui/plugin/tools/UpdateWithJoinPlugIn.java  
                        (rev 0)
+++ core/trunk/src/org/openjump/core/ui/plugin/tools/UpdateWithJoinPlugIn.java  
2016-12-29 12:25:19 UTC (rev 5294)
@@ -0,0 +1,400 @@
+package org.openjump.core.ui.plugin.tools;
+
+import com.vividsolutions.jump.I18N;
+import com.vividsolutions.jump.feature.*;
+import com.vividsolutions.jump.task.TaskMonitor;
+import com.vividsolutions.jump.workbench.Logger;
+import com.vividsolutions.jump.workbench.WorkbenchContext;
+import com.vividsolutions.jump.workbench.model.FeatureEventType;
+import com.vividsolutions.jump.workbench.model.Layer;
+import com.vividsolutions.jump.workbench.model.UndoableCommand;
+import com.vividsolutions.jump.workbench.plugin.EnableCheckFactory;
+import com.vividsolutions.jump.workbench.plugin.MultiEnableCheck;
+import com.vividsolutions.jump.workbench.plugin.PlugInContext;
+import com.vividsolutions.jump.workbench.ui.*;
+import org.openjump.core.ui.plugin.AbstractThreadedUiPlugIn;
+
+import javax.swing.*;
+import javax.swing.border.Border;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.*;
+import java.util.List;
+
+import static 
com.vividsolutions.jump.workbench.ui.AttributeTypeFilter.NUMSTRING_FILTER;
+
+/**
+ * Update a layer from another layer using a join
+ */
+public class UpdateWithJoinPlugIn extends AbstractThreadedUiPlugIn {
+
+    private final static String DESCRIPTION = 
I18N.get("org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Description");
+    //private final static String CHOOSE_LAYERS = 
I18N.get("org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Choose-layers");
+    private final static String REFERENCE_LAYER = 
I18N.get("org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-to-update");
+    private final static String JOIN_LAYER = 
I18N.get("org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer");
+    private final static String REFERENCE_LAYER_EXT_ID = 
I18N.get("org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Reference-layer-ext-id");
+    private final static String JOIN_LAYER_ID = 
I18N.get("org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id");
+    private final static String LEFT_JOIN = 
I18N.get("org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join");
+    private final static String LEFT_JOIN_TT = 
I18N.get("org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Left-join-tooltip");
+    private final static String RIGHT_JOIN = 
I18N.get("org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join");
+    private final static String RIGHT_JOIN_TT = 
I18N.get("org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Right-join-tooltip");
+    //private final static String ADD_ATTRIBUTES = 
I18N.get("org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Add-attributes-create-new-layer");
+    //private final static String ADD_ATTRIBUTES_TT = 
I18N.get("org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Add-attributes-tooltip");
+    private final static String MAP_ATTRIBUTES = 
I18N.get("org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Map-attributes");
+    private final static String DO_NOT_JOIN = 
I18N.get("org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Do-not-join");
+    private final static String UNDEFINED_MAPPING = 
I18N.get("org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Attributes-mapping-is-not-defined");
+    private final static String JOIN_NOT_UNIQUE = 
I18N.get("org.openjump.core.ui.plugin.tools.UpdateWithJoinPlugIn.Join-layer-id-is-not-unique");
+
+    private Layer referenceLayer = null;
+    private Layer joinLayer = null;
+    private String referenceLayerExtId = "";
+    private String joinLayerId = "";
+    private boolean left = true;
+    private boolean right = false;
+    private boolean add_attributes = false;
+    private boolean attributesChoosen;
+    private Map<String, String> attributesMapping = new HashMap<>();
+
+    public void initialize(PlugInContext context) throws Exception {
+        context.getFeatureInstaller().addMainMenuPlugin(
+                this,
+                new String[]{MenuNames.TOOLS, MenuNames.TOOLS_EDIT_ATTRIBUTES},
+                this.getName() + "...", false, null,
+                createEnableCheck(context.getWorkbenchContext()), -1);
+    }
+
+    public static MultiEnableCheck createEnableCheck(WorkbenchContext 
workbenchContext) {
+        EnableCheckFactory checkFactory = new 
EnableCheckFactory(workbenchContext);
+        return new MultiEnableCheck()
+                .add(checkFactory.createTaskWindowMustBeActiveCheck())
+                .add(checkFactory.createAtLeastNLayersMustExistCheck(2));
+    }
+
+    public boolean execute(PlugInContext context) throws Exception {
+        attributesChoosen = false;
+        MultiInputDialog dialog = initDialog(context);
+        GUIUtil.centreOnWindow(dialog);
+        dialog.setVisible(true);
+        if (!dialog.wasOKPressed()) {
+            return false;
+        } else {
+            if (!attributesChoosen) {
+                throw new Exception(UNDEFINED_MAPPING);
+            } else {
+                this.getDialogValues(dialog);
+            }
+        }
+        return true;
+    }
+
+    public void run(TaskMonitor monitor, PlugInContext context) throws 
Exception {
+
+        monitor.allowCancellationRequests();
+
+        reportNothingToUndoYet(context);
+
+        FeatureCollection joinFC = joinLayer.getFeatureCollectionWrapper();
+        int joinLayerAttributeIndex = 
joinFC.getFeatureSchema().getAttributeIndex(joinLayerId);
+        Map<String,Feature> joinMap = new HashMap<>();
+
+        for (Feature f : joinFC.getFeatures()) {
+            Object joinId = f.getAttribute(joinLayerAttributeIndex);
+            if (joinId == null) continue;
+            // If joinMap already contains this key, join is ambiguous, an 
exception is thrown
+            if (joinMap.get(joinId.toString()) != null) {
+                throw new Exception(JOIN_NOT_UNIQUE);
+            }
+            joinMap.put(joinId.toString(), f);
+        }
+
+        if (add_attributes) {
+            //createNewLayer(monitor, context, joinMap);
+        } else {
+            updateLayer(monitor, context, joinMap);
+        }
+
+    }
+
+    //private void createNewLayer(TaskMonitor monitor, PlugInContext context, 
Map<String,Feature> joinMap) {}
+
+    private void updateLayer(TaskMonitor monitor, PlugInContext context, 
Map<String,Feature> joinMap) {
+
+        final Map<Integer,Feature> oldFeatures = new HashMap<>(); // old 
versions of modified features
+        final Map<Integer,Feature> newFeatures = new HashMap<>(); // new 
version of modified features
+        final List<Feature> added = new ArrayList<>();            // features 
added to baseLayer
+        final List<Feature> removed = new ArrayList<>();          // features 
removed from baseLayer
+
+        for (Feature f : 
referenceLayer.getFeatureCollectionWrapper().getFeatures()) {
+
+            Object extKey = f.getAttribute(referenceLayerExtId);
+            if (extKey == null) {
+                if (!left) {
+                    removed.add(f);
+                }
+            } else {
+                Feature joinedFeature = joinMap.get(extKey.toString());
+                if (joinedFeature == null) { // no join
+                    if (!left) {
+                        removed.add(f);
+                    }
+                    continue;                             // f is kept (left 
join)
+                }
+                // extKey is not null and key exists in joinLayer
+                Feature newFeature = f.clone(true);
+                boolean modified = false;
+                for (int i = 0 ; i < f.getSchema().getAttributeCount() ; i++) {
+                    String name = f.getSchema().getAttributeName(i);
+                    if (name.equals(referenceLayerExtId)) {
+                        continue;   // do not update attribute used for the 
join
+                    }
+                    String joinName = attributesMapping.get(name);
+                    if (joinName.equals(DO_NOT_JOIN)) {
+                        continue;   // do not update if no join is defined
+                    }
+                    int joinIndex = 
joinedFeature.getSchema().getAttributeIndex(joinName);
+                    if (Objects.equals(f.getAttribute(name), 
joinedFeature.getAttribute(joinIndex))) {
+                        continue;   // do not update if
+                    }
+                    AttributeType type = f.getSchema().getAttributeType(i);
+                    if (type == AttributeType.STRING) 
newFeature.setAttribute(i, joinedFeature.getString(joinIndex));
+                    else if (type == AttributeType.DOUBLE) 
newFeature.setAttribute(i, joinedFeature.getDouble(joinIndex));
+                    else if (type == AttributeType.INTEGER) 
newFeature.setAttribute(i, joinedFeature.getInteger(joinIndex));
+                    else if (type == AttributeType.GEOMETRY) 
newFeature.setGeometry(joinedFeature.getGeometry());
+                    else newFeature.setAttribute(i, 
joinedFeature.getAttribute(joinIndex));
+                    modified = true;
+                }
+                if (modified) {
+                    oldFeatures.put(f.getID(), f.clone(true));
+                    newFeatures.put(f.getID(), newFeature);
+                }
+            }
+        }
+        if (right) {
+            for (Feature f : 
joinLayer.getFeatureCollectionWrapper().getFeatures()) {
+                Object key = f.getAttribute(referenceLayerExtId);
+                if (key != null && joinMap.containsKey(key.toString())) 
continue;
+                Feature bf = new 
BasicFeature(referenceLayer.getFeatureCollectionWrapper().getFeatureSchema());
+                bf.setGeometry(f.getGeometry());
+                for (int i = 0 ; i < bf.getSchema().getAttributeCount() ; i++) 
{
+                    String name = bf.getSchema().getAttributeName(i);
+                    String joinName = attributesMapping.get(name);
+                    if (name.equals(referenceLayerExtId)) joinName = 
joinLayerId;
+                    if (joinName.equals(DO_NOT_JOIN)) continue;
+                    int joinIndex = f.getSchema().getAttributeIndex(joinName);
+                    if (f.getAttribute(joinIndex) == null) continue;
+                    AttributeType type = bf.getSchema().getAttributeType(i);
+                    if (type == AttributeType.STRING) bf.setAttribute(i, 
f.getString(joinIndex));
+                    else if (type == AttributeType.DOUBLE) bf.setAttribute(i, 
f.getDouble(joinIndex));
+                    else if (type == AttributeType.INTEGER) bf.setAttribute(i, 
f.getInteger(joinIndex));
+                    else if (type == AttributeType.GEOMETRY) 
bf.setGeometry(f.getGeometry());
+                    else bf.setAttribute(i, f.getAttribute(joinIndex));
+                }
+                added.add(bf);
+            }
+        }
+
+        
referenceLayer.getLayerManager().getUndoableEditReceiver().startReceiving();
+        try {
+            UndoableCommand command =
+                    new 
UndoableCommand(I18N.get(AutoAssignAttributePlugIn.class.getName())) {
+                        public void execute() {
+                            for (Feature f : 
referenceLayer.getFeatureCollectionWrapper().getFeatures()) {
+                                Feature newFeature = 
newFeatures.get(f.getID());
+                                if (newFeature != null) {
+                                    
f.setAttributes(newFeature.getAttributes());
+                                }
+                            }
+                            for (Feature f : removed) {
+                                
referenceLayer.getFeatureCollectionWrapper().remove(f);
+                            }
+                            for (Feature f : added) {
+                                
referenceLayer.getFeatureCollectionWrapper().add(f);
+                            }
+                            
referenceLayer.getLayerManager().fireFeaturesAttChanged(newFeatures.values(),
+                                    FeatureEventType.ATTRIBUTES_MODIFIED, 
referenceLayer, oldFeatures.values());
+                            
referenceLayer.getLayerManager().fireGeometryModified(newFeatures.values(),
+                                    referenceLayer, oldFeatures.values());
+                            
referenceLayer.getLayerManager().fireFeaturesChanged(added,
+                                    FeatureEventType.ADDED, referenceLayer);
+                            
referenceLayer.getLayerManager().fireFeaturesChanged(removed,
+                                    FeatureEventType.DELETED, referenceLayer);
+                        }
+                        public void unexecute() {
+                            for (Feature f : 
referenceLayer.getFeatureCollectionWrapper().getFeatures()) {
+                                Feature oldFeature = 
oldFeatures.get(f.getID());
+                                if (oldFeature != null) {
+                                    
f.setAttributes(oldFeature.getAttributes());
+                                }
+                            }
+                            for (Feature f : removed) {
+                                
referenceLayer.getFeatureCollectionWrapper().add(f);
+                            }
+                            for (Feature f : added) {
+                                
referenceLayer.getFeatureCollectionWrapper().remove(f);
+                            }
+                            
referenceLayer.getLayerManager().fireFeaturesAttChanged(oldFeatures.values(),
+                                    FeatureEventType.ATTRIBUTES_MODIFIED, 
referenceLayer, newFeatures.values());
+                            
referenceLayer.getLayerManager().fireGeometryModified(oldFeatures.values(),
+                                    referenceLayer, newFeatures.values());
+                            
referenceLayer.getLayerManager().fireFeaturesChanged(removed,
+                                    FeatureEventType.ADDED, referenceLayer);
+                            
referenceLayer.getLayerManager().fireFeaturesChanged(added,
+                                    FeatureEventType.DELETED, referenceLayer);
+                        }
+                    };
+            command.execute();
+            
referenceLayer.getLayerManager().getUndoableEditReceiver().receive(command.toUndoableEdit());
+        } finally {
+            
referenceLayer.getLayerManager().getUndoableEditReceiver().stopReceiving();
+        }
+    }
+
+    private MultiInputDialog initDialog(final PlugInContext context) {
+
+        final MultiInputDialog dialog = new 
MultiInputDialog(context.getWorkbenchFrame(), this.getName(), true);
+        dialog.setSideBarDescription(DESCRIPTION);
+
+        if (referenceLayer == null || 
!context.getLayerManager().getLayers().contains(referenceLayer)) {
+            referenceLayer = context.getCandidateLayer(0);
+        }
+        final JComboBox<Layer> jcbBaseLayer = 
dialog.addLayerComboBox(REFERENCE_LAYER, referenceLayer, null, 
context.getLayerManager());
+
+        List<String> baseLayerAttributeList = 
NUMSTRING_FILTER.filter(referenceLayer);
+        String valBaseAttribute = baseLayerAttributeList.size() > 0 ? 
baseLayerAttributeList.get(0) : null;
+        final JComboBox<String> jcbBaseLayerId = 
dialog.addComboBox(REFERENCE_LAYER_EXT_ID, valBaseAttribute, 
baseLayerAttributeList, REFERENCE_LAYER_EXT_ID);
+        jcbBaseLayerId.setEnabled(baseLayerAttributeList.size() > 0);
+
+        dialog.addSeparator(); //----
+
+        if (joinLayer == null || 
!context.getLayerManager().getLayers().contains(joinLayer)) {
+            joinLayer = context.getCandidateLayer(1);
+        }
+        final JComboBox<Layer> jcbJoinLayer = 
dialog.addLayerComboBox(JOIN_LAYER, joinLayer, null, context.getLayerManager());
+
+        List<String> joinLayerAttributeList = 
NUMSTRING_FILTER.filter(joinLayer);
+        String valJoinAttribute = joinLayerAttributeList.size() > 0 ? 
joinLayerAttributeList.get(0) : null;
+        final JComboBox<String> jcbJoinLayerId = 
dialog.addComboBox(JOIN_LAYER_ID, valJoinAttribute, joinLayerAttributeList, 
JOIN_LAYER_ID);
+        jcbJoinLayerId.setEnabled(joinLayerAttributeList.size() > 0);
+
+        dialog.addSeparator(); //----
+
+        dialog.addCheckBox(LEFT_JOIN, left, LEFT_JOIN_TT);
+        dialog.addCheckBox(RIGHT_JOIN, right, RIGHT_JOIN_TT);
+        //dialog.addCheckBox(ADD_ATTRIBUTES, add_attributes, 
ADD_ATTRIBUTES_TT);
+
+        jcbBaseLayer.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                if (jcbBaseLayer.getSelectedItem() == referenceLayer) return;
+                attributesChoosen = false;
+                referenceLayer = (Layer)jcbBaseLayer.getSelectedItem();
+                List<String> baseLayerAttributeList = 
NUMSTRING_FILTER.filter(referenceLayer);
+                jcbBaseLayerId.setModel(new 
DefaultComboBoxModel<>(baseLayerAttributeList.toArray(new String[0])));
+                jcbBaseLayerId.setEnabled(baseLayerAttributeList.size() > 0);
+            }
+        });
+
+        jcbBaseLayerId.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                if 
(!jcbBaseLayerId.getSelectedItem().equals(referenceLayerExtId)) 
attributesChoosen = false;
+            }
+        });
+
+        jcbJoinLayer.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                if(jcbJoinLayer.getSelectedItem() == joinLayer) return;
+                attributesChoosen = false;
+                joinLayer = (Layer)jcbJoinLayer.getSelectedItem();
+                List<String> joinLayerAttributeList = 
NUMSTRING_FILTER.filter(joinLayer);
+                jcbJoinLayerId.setModel(new 
DefaultComboBoxModel<>(joinLayerAttributeList.toArray(new String[0])));
+                jcbJoinLayerId.setEnabled(joinLayerAttributeList.size() > 0);
+            }
+        });
+
+        jcbJoinLayerId.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                if (!jcbJoinLayerId.getSelectedItem().equals(joinLayerId)) 
attributesChoosen = false;
+            }
+        });
+
+        JButton mapAttributesButton = dialog.addButton(MAP_ATTRIBUTES);
+        mapAttributesButton.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                MultiInputDialog mid = 
initMappingDialog(context.getWorkbenchFrame(),
+                        dialog.getLayer(REFERENCE_LAYER),
+                        dialog.getLayer(JOIN_LAYER),
+                        dialog.getText(REFERENCE_LAYER_EXT_ID));
+                GUIUtil.centreOnWindow(mid);
+                mid.setVisible(true);
+                if (mid.wasOKPressed()) {
+                    getMapping(mid);
+                    attributesChoosen = true;
+                }
+            }
+        });
+
+        return dialog;
+    }
+
+
+    private void getDialogValues(MultiInputDialog dialog) {
+        this.referenceLayer = dialog.getLayer(REFERENCE_LAYER);
+        this.joinLayer = dialog.getLayer(JOIN_LAYER);
+        this.referenceLayerExtId = dialog.getText(REFERENCE_LAYER_EXT_ID);
+        this.joinLayerId = dialog.getText(JOIN_LAYER_ID);
+        this.left = dialog.getBoolean(LEFT_JOIN);
+        this.right = dialog.getBoolean(RIGHT_JOIN);
+    }
+
+    // MultiInputDialog to set the mapping between base attributes and join 
attributes
+    private MultiInputDialog initMappingDialog(JFrame parent, Layer baseLayer, 
Layer joinLayer, String baseId) {
+        // Creates a MultiInputDialog box with a JScrollPane to handle long 
list of attributes
+        MultiInputDialog dialog = new MultiInputDialog(parent, "", true) {
+            protected void setMainComponent() {
+                currentPanel = new JPanel(new GridBagLayout());
+                mainComponent = new JScrollPane(currentPanel);
+                Border mainComponentBorder = 
BorderFactory.createCompoundBorder(
+                        BorderFactory.createEtchedBorder(),
+                        BorderFactory.createEmptyBorder(5, 5, 5, 5)
+                );
+                currentPanel.setBorder(mainComponentBorder);
+            }
+        };
+        dialog.setPreferredSize(new Dimension(480,320));
+        // For each attribute of baseLayer, creates a list of joinLayer 
attributes candidates
+        for (String name : 
baseLayer.getFeatureCollectionWrapper().getFeatureSchema().getAttributeNames()) 
{
+            if (name.equals(baseId)) continue;
+            AttributeType type = 
baseLayer.getFeatureCollectionWrapper().getFeatureSchema().getAttributeType(name);
+            AttributeTypeFilter filter = AttributeTypeFilter.ALL_FILTER;
+            if (type != AttributeType.STRING) {
+                if (type == AttributeType.GEOMETRY) filter = 
AttributeTypeFilter.GEOMETRY_FILTER;
+                if (type == AttributeType.DOUBLE) filter = 
AttributeTypeFilter.DOUBLE_FILTER;
+                if (type == AttributeType.INTEGER) filter = 
AttributeTypeFilter.NUMERIC_FILTER;
+                if (type == AttributeType.LONG) filter = 
AttributeTypeFilter.NUMERIC_FILTER;
+                if (type == AttributeType.DOUBLE) filter = 
AttributeTypeFilter.NUMERIC_FILTER;
+                if (type == AttributeType.DATE) filter = 
AttributeTypeFilter.DATE_FILTER;
+                if (type == AttributeType.BOOLEAN) filter = 
AttributeTypeFilter.BOOLEAN_FILTER;
+            }
+            List<String> candidates = filter.filter(joinLayer);
+            candidates.add(0, DO_NOT_JOIN);
+            candidates.remove(joinLayerId);
+            dialog.addComboBox(name, candidates.contains(name) ? name : 
DO_NOT_JOIN, candidates, "");
+        }
+        return dialog;
+    }
+
+    // Get mapping between base attributes and join attributes
+    private void getMapping(MultiInputDialog dialog) {
+        FeatureSchema schema = 
referenceLayer.getFeatureCollectionWrapper().getFeatureSchema();
+        for (int i = 0 ; i < schema.getAttributeCount() ; i++) {
+            if (!dialog.getText(schema.getAttributeName(i)).equals("")) {
+                attributesMapping.put(schema.getAttributeName(i), 
dialog.getText(schema.getAttributeName(i)));
+            }
+        }
+    }
+}


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to