Index: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/pom.xml
===================================================================
--- org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/pom.xml	(revision 0)
+++ org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/pom.xml	(revision 4063)
@@ -0,0 +1,83 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.gvsig</groupId>
+    <artifactId>org.gvsig.desktop</artifactId>
+    <version>2.0.425</version>
+  </parent>
+  <artifactId>org.gvsig.vectorediting.offset</artifactId>
+  <version>1.0.196</version>
+  <packaging>pom</packaging>
+  <name>org.gvsig.vectorediting.offset</name>
+  <description>Project that provides the offset vector editing tool</description>
+
+	<repositories>
+		<repository>
+			<id>gvsig-public-http-repository</id>
+			<name>gvSIG maven public HTTP repository</name>
+			<url>http://devel.gvsig.org/m2repo/j2se</url>
+			<releases>
+				<enabled>true</enabled>
+				<updatePolicy>daily</updatePolicy>
+				<checksumPolicy>warn</checksumPolicy>
+			</releases>
+			<snapshots>
+				<enabled>true</enabled>
+				<updatePolicy>daily</updatePolicy>
+				<checksumPolicy>warn</checksumPolicy>
+			</snapshots>
+		</repository>
+	</repositories>
+
+	<url>dav:https://devel.gvsig.org/sites/${project.artifactId}/${project.version}</url>
+	<scm>
+		<connection>scm:svn:https://devel.gvsig.org/svn/gvsig-vectorediting/org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196</connection>
+		<developerConnection>scm:svn:https://devel.gvsig.org/svn/gvsig-vectorediting/org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196</developerConnection>
+		<url>https://devel.gvsig.org/redmine/projects/gvsig-vector-editing/repository/show/org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196</url>
+	</scm>
+
+	<distributionManagement>
+		<site>
+			<id>gvsig-repository</id>
+			<url>dav:https://devel.gvsig.org/download/projects/gvsig-vectorediting/pool/${project.artifactId}/${project.version}</url>
+		</site>
+	</distributionManagement>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-release-plugin</artifactId>
+				<configuration>
+					<tagBase>https://devel.gvsig.org/svn/gvsig-vectorediting/${project.artifactId}/tags</tagBase>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>org.gvsig</groupId>
+				<artifactId> org.gvsig.vectorediting </artifactId>
+				<version>${org.gvsig.vectorediting.version}</version>
+				<scope>import</scope>
+				<type>pom</type>
+			</dependency>
+			<dependency>
+				<groupId>org.gvsig</groupId>
+				<artifactId>org.gvsig.vectorediting.offset.lib.prov.offset</artifactId>
+				<version>1.0.196</version>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+
+  <modules>
+    <module>org.gvsig.vectorediting.offset.lib</module>
+    <module>org.gvsig.vectorediting.offset.app</module>
+  </modules>
+
+  <properties>
+     <org.gvsig.vectorediting.version>1.0.243</org.gvsig.vectorediting.version>
+  </properties>
+</project>
Index: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/pom.xml
===================================================================
--- org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/pom.xml	(revision 0)
+++ org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/pom.xml	(revision 4063)
@@ -0,0 +1,14 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.gvsig</groupId>
+    <artifactId>org.gvsig.vectorediting.offset</artifactId>
+    <version>1.0.196</version>
+  </parent>
+  <artifactId>org.gvsig.vectorediting.offset.app</artifactId>
+  <packaging>pom</packaging>
+  <name>org.gvsig.vectorediting.offset.app</name>
+  <modules>
+    <module>org.gvsig.vectorediting.offset.app.mainplugin</module>
+  </modules>
+</project>
Index: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/buildNumber.properties
===================================================================
--- org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/buildNumber.properties	(revision 0)
+++ org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/buildNumber.properties	(revision 4063)
@@ -0,0 +1,2 @@
+#Sun Jul 09 18:51:53 CEST 2023
+buildNumber=204
Index: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/src/main/resources-plugin/config.xml
===================================================================
--- org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/src/main/resources-plugin/config.xml	(revision 0)
+++ org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/src/main/resources-plugin/config.xml	(revision 4063)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- gvSIG. Desktop Geographic Information System. Copyright (C) 2007-2013
+	gvSIG Association. This program is free software; you can redistribute it
+	and/or modify it under the terms of the GNU General Public License as published
+	by the Free Software Foundation; either version 3 of the License, or (at
+	your option) any later version. This program is distributed in the hope that
+	it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+	of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+	Public License for more details. You should have received a copy of the GNU
+	General Public License along with this program; if not, write to the Free
+	Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+	USA. For any additional information, do not hesitate to contact us at info
+	AT gvsig.com, or visit our website www.gvsig.com. -->
+<plugin-config>
+	<depends plugin-name="org.gvsig.vectorediting.app.mainplugin" />
+	<resourceBundle name="text" />
+	<libraries library-dir="lib" />
+	<extensions>
+		<extension class-name="org.gvsig.vectorediting.app.mainplugin.ServiceExtension"
+			description="" active="true" priority="1">
+
+			<action name="modify-offset" label="modify_offset"
+                tooltip="modify_offset" position="601004400" action-command="modify-offset"
+                icon="modify-offset" accelerator="" />
+
+			<menu text="Layer/Modify/modify_offset" name="modify-offset" />
+
+			<tool-bar name="vector_editing" position="4000">
+				<selectable-tool name="modify-offset" />
+			</tool-bar>
+
+		</extension>
+	</extensions>
+</plugin-config>
\ No newline at end of file
Index: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/src/main/resources-plugin/i18n/text.properties
===================================================================
--- org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/src/main/resources-plugin/i18n/text.properties	(revision 0)
+++ org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/src/main/resources-plugin/i18n/text.properties	(revision 4063)
@@ -0,0 +1,25 @@
+modify_offset = Geometr\u00eda paralela
+selection=Selecci\u00f3n
+first_point_of_symmetry_axis=Primer punto del eje de simetr\u00eda
+second_point_of_symmetry_axis=Segundo punto del eje de simetr\u00eda
+delete_original_geometries_question=\u00bfDesea borrar las geometr\u00edas originales?
+short_yes=S
+short_no=N
+delete_original_geometries = Eliminar geometr\u00edas originales
+keep_original_geometries = Mantener geometr\u00edas originales
+offset_distance=Distancia
+_left=Izquierdo
+_right=Derecho
+_short_left=I
+_short_right=D
+_side=Lado
+side=Lado
+_round=Redondeado
+_mitre=Inglete
+_bevel=Bisel
+_short_round=R
+_short_mitre=I
+_short_bevel=B
+_join_style=Estilo de uni\u00f3n
+joinStyle=Estilo de uni\u00f3n
+equidistant_offsets=Paralelas equidistantes
\ No newline at end of file
Index: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/src/main/resources-plugin/i18n/text_en.properties
===================================================================
--- org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/src/main/resources-plugin/i18n/text_en.properties	(revision 0)
+++ org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/src/main/resources-plugin/i18n/text_en.properties	(revision 4063)
@@ -0,0 +1,25 @@
+modify_offset = Parallel geometry
+selection = Selection
+first_point_of_symmetry_axis=First point of the symmetry axis
+second_point_of_symmetry_axis=Second point of the symmetry axis
+delete_original_geometries_question=Delete original geometries?
+short_yes=Y
+short_no=N
+delete_original_geometries = Delete original geometries
+keep_original_geometries = Keep original geometries
+offset_distance= Distance
+_Left=Left
+_right=Right
+_short_left=L
+_short_right=R
+_side=Side
+side=Side
+_round=Round
+_mitre=Mitre
+_bevel=Bevel
+_short_round=R
+_short_mitre=M
+_short_bevel=B
+_join_style=Join style
+joinStyle=Join style
+equidistant_offsets=Equidistantes offsets
\ No newline at end of file
Index: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/src/main/resources/README.txt
===================================================================
--- org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/src/main/resources/README.txt	(revision 0)
+++ org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/src/main/resources/README.txt	(revision 4063)
@@ -0,0 +1,27 @@
+====
+
+    gvSIG. Desktop Geographic Information System.
+
+    Copyright (C) 2007-2013 gvSIG Association.
+
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License
+    as published by the Free Software Foundation; either version 3
+    of the License, or (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+    MA  02110-1301, USA.
+
+    For any additional information, do not hesitate to contact us
+    at info AT gvsig.com, or visit our website www.gvsig.com.
+====
+
+Put into this folder the resources to be included in the plugin jar.
+
Index: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/src/main/assembly/gvsig-plugin-package.xml
===================================================================
--- org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/src/main/assembly/gvsig-plugin-package.xml	(revision 0)
+++ org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/src/main/assembly/gvsig-plugin-package.xml	(revision 4063)
@@ -0,0 +1,63 @@
+<!--
+
+    gvSIG. Desktop Geographic Information System.
+
+    Copyright (C) 2007-2013 gvSIG Association.
+
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License
+    as published by the Free Software Foundation; either version 3
+    of the License, or (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+    MA  02110-1301, USA.
+
+    For any additional information, do not hesitate to contact us
+    at info AT gvsig.com, or visit our website www.gvsig.com.
+
+-->
+<assembly>
+  <id>gvsig-plugin-package</id>
+  <formats>
+    <format>zip</format>
+  </formats>
+  <baseDirectory>${project.artifactId}</baseDirectory>
+  <includeBaseDirectory>true</includeBaseDirectory>
+  <files>
+    <file>
+      <source>target/${project.artifactId}-${project.version}.jar</source>
+      <outputDirectory>lib</outputDirectory>
+    </file>
+    <file>
+      <source>target/package.info</source>
+    </file>
+  </files>
+
+  <fileSets>
+    <fileSet>
+      <directory>src/main/resources-plugin</directory>
+      <outputDirectory>.</outputDirectory>
+    </fileSet>
+  </fileSets>
+
+
+  <dependencySets>
+    <dependencySet>
+      <useProjectArtifact>false</useProjectArtifact>
+      <useTransitiveDependencies>false</useTransitiveDependencies>
+      <outputDirectory>lib</outputDirectory>
+      <includes>
+		<include>org.gvsig:org.gvsig.vectorediting.offset.lib.prov.offset</include>
+      </includes>
+    </dependencySet>
+  </dependencySets>
+
+</assembly>
+
Index: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/pom.xml
===================================================================
--- org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/pom.xml	(revision 0)
+++ org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin/pom.xml	(revision 4063)
@@ -0,0 +1,46 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.gvsig</groupId>
+    <artifactId>org.gvsig.vectorediting.offset.app</artifactId>
+    <version>1.0.196</version>
+  </parent>
+  <artifactId>org.gvsig.vectorediting.offset.app.mainplugin</artifactId>
+  <name>org.gvsig.vectorediting.offset.app.mainplugin</name>
+
+    <properties>
+        <!-- Package info property values -->
+        <gvsig.package.info.state>testing</gvsig.package.info.state>
+        <gvsig.package.info.dependencies>required: org.gvsig.app.mainplugin -ge 2.1.0-A, required: org.gvsig.vectorediting.app.mainplugin -ge 1.0.0, conflict: org.gvsig.editing.app.mainplugin -ge 1</gvsig.package.info.dependencies>
+        <gvsig.package.info.official>true</gvsig.package.info.official>
+        <gvsig.package.info.name>Tools: Vector editing offset provider</gvsig.package.info.name>
+        <gvsig.package.info.description>Symmetry provider: provides offset geometries.</gvsig.package.info.description>
+        <gvsig.package.info.categories>Vector</gvsig.package.info.categories>
+        <gvsig.package.info.javaVM>j1_6</gvsig.package.info.javaVM>
+        <gvsig.package.info.poolURL>https://devel.gvsig.org/download/projects/gvsig-vectorediting/pool</gvsig.package.info.poolURL>
+    </properties>
+
+    <dependencies>
+      <dependency>
+        <groupId>org.gvsig</groupId>
+        <artifactId>org.gvsig.vectorediting.app.mainplugin</artifactId>
+        <scope>compile</scope>
+      </dependency>
+      <dependency>
+        <groupId>org.gvsig</groupId>
+        <artifactId>org.gvsig.vectorediting.lib.api</artifactId>
+      </dependency>
+      <dependency>
+        <groupId>org.gvsig</groupId>
+        <artifactId>org.gvsig.vectorediting.lib.impl</artifactId>
+      </dependency>
+      <dependency>
+        <groupId>org.gvsig</groupId>
+        <artifactId>org.gvsig.vectorediting.lib.spi</artifactId>
+      </dependency>
+    <dependency>
+      <groupId>org.gvsig</groupId>
+      <artifactId>org.gvsig.vectorediting.offset.lib.prov.offset</artifactId>
+    </dependency>
+    </dependencies>
+</project>

Property changes on: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.app/org.gvsig.vectorediting.offset.app.mainplugin
___________________________________________________________________
Added: svn:ignore
   + target


Index: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/pom.xml
===================================================================
--- org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/pom.xml	(revision 0)
+++ org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/pom.xml	(revision 4063)
@@ -0,0 +1,16 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.gvsig</groupId>
+    <artifactId>org.gvsig.vectorediting.offset.lib</artifactId>
+    <version>1.0.196</version>
+  </parent>
+  <artifactId>org.gvsig.vectorediting.offset.lib.prov</artifactId>
+  <packaging>pom</packaging>
+  <name>org.gvsig.vectorediting.offset.lib.prov</name>
+   <modules>
+    <module>
+      org.gvsig.vectorediting.offset.lib.prov.offset
+    </module>
+  </modules>
+</project>
Index: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/src/main/resources/META-INF/services/org.gvsig.tools.library.Library
===================================================================
--- org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/src/main/resources/META-INF/services/org.gvsig.tools.library.Library	(revision 0)
+++ org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/src/main/resources/META-INF/services/org.gvsig.tools.library.Library	(revision 4063)
@@ -0,0 +1 @@
+org.gvsig.vectorediting.offset.lib.prov.offset.OffsetEditingLibrary
\ No newline at end of file
Index: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/src/main/resources/images/vectorediting-tools/modify-offset.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/src/main/resources/images/vectorediting-tools/modify-offset.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/src/main/java/org/gvsig/vectorediting/offset/lib/prov/offset/OffsetEditingProviderFactory.java
===================================================================
--- org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/src/main/java/org/gvsig/vectorediting/offset/lib/prov/offset/OffsetEditingProviderFactory.java	(revision 0)
+++ org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/src/main/java/org/gvsig/vectorediting/offset/lib/prov/offset/OffsetEditingProviderFactory.java	(revision 4063)
@@ -0,0 +1,64 @@
+/**
+ * gvSIG. Desktop Geographic Information System.
+ *
+ * Copyright © 2007-2014 gvSIG Association
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ *
+ * For any additional information, do not hesitate to contact us
+ * at info AT gvsig.com, or visit our website www.gvsig.com.
+ */
+
+package org.gvsig.vectorediting.offset.lib.prov.offset;
+
+import org.gvsig.fmap.geom.Geometry;
+import org.gvsig.tools.dynobject.DynObject;
+import org.gvsig.tools.service.spi.Provider;
+import org.gvsig.tools.service.spi.ProviderServices;
+import org.gvsig.vectorediting.lib.api.EditingServiceInfo;
+import org.gvsig.vectorediting.lib.spi.AbstractEditingProviderFactory;
+import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceinfo;
+
+public class OffsetEditingProviderFactory extends AbstractEditingProviderFactory {
+
+    public static final String PROVIDER_NAME = "modify-offset";
+
+    private final static String PROVIDER_DESCRIPTION =
+        "Creates offset geometries from selection";
+
+    public OffsetEditingProviderFactory() {
+        super(PROVIDER_NAME, PROVIDER_DESCRIPTION);
+    }
+
+    @Override
+    public EditingServiceInfo getServiceInfo() {
+        EditingServiceInfo serviceInfo =
+            new DefaultEditingServiceinfo(PROVIDER_NAME, "", false, null,
+                new int[] { //Geometry.TYPES.POINT, Geometry.TYPES.MULTIPOINT,
+                Geometry.TYPES.SURFACE, Geometry.TYPES.MULTISURFACE,
+                Geometry.TYPES.LINE, Geometry.TYPES.MULTILINE,
+                Geometry.TYPES.POLYGON, Geometry.TYPES.MULTIPOLYGON,
+                Geometry.TYPES.CURVE, Geometry.TYPES.MULTICURVE });
+
+        return serviceInfo;
+    }
+
+    @Override
+    protected Provider doCreate(DynObject parameters, ProviderServices services) {
+        return new OffsetEditingProvider(services, parameters);
+    }
+
+}
Index: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/src/main/java/org/gvsig/vectorediting/offset/lib/prov/offset/OffsetEditingLibrary.java
===================================================================
--- org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/src/main/java/org/gvsig/vectorediting/offset/lib/prov/offset/OffsetEditingLibrary.java	(revision 0)
+++ org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/src/main/java/org/gvsig/vectorediting/offset/lib/prov/offset/OffsetEditingLibrary.java	(revision 4063)
@@ -0,0 +1,71 @@
+/**
+ * gvSIG. Desktop Geographic Information System.
+ *
+ * Copyright © 2007-2014 gvSIG Association
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ *
+ * For any additional information, do not hesitate to contact us
+ * at info AT gvsig.com, or visit our website www.gvsig.com.
+ */
+
+package org.gvsig.vectorediting.offset.lib.prov.offset;
+
+import org.gvsig.tools.ToolsLocator;
+import org.gvsig.tools.i18n.I18nManager;
+import org.gvsig.tools.library.AbstractLibrary;
+import org.gvsig.tools.library.LibraryException;
+import org.gvsig.vectorediting.lib.api.EditingLibrary;
+import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
+import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
+
+/**
+ * Library for default implementation initialization and configuration.
+ *
+ * @author gvSIG team
+ * @version $Id$
+ */
+public class OffsetEditingLibrary extends AbstractLibrary {
+
+    @Override
+    public void doRegistration() {
+        registerAsServiceOf(EditingLibrary.class);
+    }
+
+    @Override
+    protected void doInitialize() throws LibraryException {
+    }
+
+    @Override
+    protected void doPostInitialize() throws LibraryException {
+        EditingProviderManager manager =
+            EditingProviderLocator.getProviderManager();
+
+        manager.addProviderFactory(new OffsetEditingProviderFactory());
+
+        manager.registerIcon("vectorediting-tools", "modify-offset", this
+            .getClass().getClassLoader(), this.getClass().getName());
+
+        registerTranslations();
+    }
+
+    private void registerTranslations() {
+        I18nManager manager = ToolsLocator.getI18nManager();
+        manager.addResourceFamily("i18n.text",
+            this.getClass().getClassLoader(), "offset-editing");
+    }
+
+}
Index: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/src/main/java/org/gvsig/vectorediting/offset/lib/prov/offset/OffsetEditingProvider.java
===================================================================
--- org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/src/main/java/org/gvsig/vectorediting/offset/lib/prov/offset/OffsetEditingProvider.java	(revision 0)
+++ org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/src/main/java/org/gvsig/vectorediting/offset/lib/prov/offset/OffsetEditingProvider.java	(revision 4063)
@@ -0,0 +1,909 @@
+/**
+ * gvSIG. Desktop Geographic Information System.
+ *
+ * Copyright © 2007-2014 gvSIG Association
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ *
+ * For any additional information, do not hesitate to contact us
+ * at info AT gvsig.com, or visit our website www.gvsig.com.
+ */
+package org.gvsig.vectorediting.offset.lib.prov.offset;
+
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.gvsig.fmap.dal.exception.DataException;
+import org.gvsig.fmap.dal.feature.EditableFeature;
+import org.gvsig.fmap.dal.feature.Feature;
+import org.gvsig.fmap.dal.feature.FeatureSelection;
+import org.gvsig.fmap.dal.feature.FeatureStore;
+import org.gvsig.fmap.geom.Geometry;
+import static org.gvsig.fmap.geom.Geometry.JOIN_STYLE_ROUND;
+import org.gvsig.fmap.geom.GeometryException;
+import org.gvsig.fmap.geom.GeometryLocator;
+import org.gvsig.fmap.geom.GeometryManager;
+import org.gvsig.fmap.geom.GeometryUtils;
+import org.gvsig.fmap.geom.aggregate.Aggregate;
+import org.gvsig.fmap.geom.aggregate.MultiCurve;
+import org.gvsig.fmap.geom.aggregate.MultiPoint;
+import org.gvsig.fmap.geom.aggregate.MultiSurface;
+import org.gvsig.fmap.geom.operation.GeometryOperationException;
+import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
+import org.gvsig.fmap.geom.primitive.Arc;
+import org.gvsig.fmap.geom.primitive.Circle;
+import org.gvsig.fmap.geom.primitive.Circumference;
+import org.gvsig.fmap.geom.primitive.Curve;
+import org.gvsig.fmap.geom.primitive.Ellipse;
+import org.gvsig.fmap.geom.primitive.FilledSpline;
+import org.gvsig.fmap.geom.primitive.Line;
+import org.gvsig.fmap.geom.primitive.PeriEllipse;
+import org.gvsig.fmap.geom.primitive.Point;
+import org.gvsig.fmap.geom.primitive.Polygon;
+import org.gvsig.fmap.geom.primitive.Primitive;
+import org.gvsig.fmap.geom.primitive.Spline;
+import org.gvsig.fmap.geom.primitive.Surface;
+import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
+import org.gvsig.symbology.SymbologyLocator;
+import org.gvsig.symbology.SymbologyManager;
+import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.text.ISimpleTextSymbol;
+import org.gvsig.tools.ToolsLocator;
+import org.gvsig.tools.dataTypes.DataTypes;
+import org.gvsig.tools.dispose.DisposableIterator;
+import org.gvsig.tools.dispose.DisposeUtils;
+import org.gvsig.tools.dynobject.DynObject;
+import org.gvsig.tools.i18n.I18nManager;
+import org.gvsig.tools.service.spi.ProviderServices;
+import org.gvsig.vectorediting.lib.api.DrawingStatus;
+import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
+import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
+import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
+import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
+import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
+import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
+import org.gvsig.vectorediting.lib.api.exceptions.StopServiceException;
+import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
+import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
+import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
+import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameterOptions;
+import org.gvsig.vectorediting.lib.spi.EditingProvider;
+import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
+import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
+import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
+import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
+
+public class OffsetEditingProvider extends AbstractEditingProvider implements
+        EditingProvider {
+
+    private static final Double PRECISION = 1.0e-5;
+
+    private static final String SIDE = "_side";
+
+    private static final String LEFT = "_left";
+
+    private static final String RIGHT = "_right";
+
+    private static final String SHORT_LEFT = "_short_left";
+
+    private static final String SHORT_RIGHT = "_short_right";
+
+    private static final String JOIN_STYLE = "_join_style";
+
+    private static final String ROUND = "_round";
+
+    private static final String MITRE = "_mitre";
+    
+    private static final String BEVEL = "_bevel";
+
+    private static final String SHORT_ROUND = "_short_round";
+
+    private static final String SHORT_MITRE = "_short_mitre";
+    
+    private static final String SHORT_BEVEL = "_short_bevel";
+
+    private final EditingServiceParameter selectionParameter;
+
+    private final EditingServiceParameter offsetParameter;
+
+    private final EditingServiceParameter sideParameter;
+
+    private final DefaultEditingServiceParameter joinStyleParameter;
+    
+    private final EditingServiceParameter equidistantOffsets;
+    
+    private final EditingServiceParameter deleteOriginalGeometriesParameter;
+
+//    private boolean deleteOriginalGeometries = false;
+
+    private Map<EditingServiceParameter, Object> values;
+
+//    private final Map<String, String> options;
+
+    private final FeatureStore featureStore;
+    
+    private List<Feature> selectedFeatures;
+    
+    
+    public OffsetEditingProvider(ProviderServices providerServices, DynObject parameters) {
+        super(providerServices);
+        this.featureStore = (FeatureStore) parameters.getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
+        I18nManager i18nManager = ToolsLocator.getI18nManager();
+
+        EditingProviderServices editingProviderServices
+                = (EditingProviderServices) getProviderServices();
+        
+        this.selectionParameter
+                = new DefaultEditingServiceParameter("selection",
+                        i18nManager.getTranslation("selection"), TYPE.SELECTION);
+
+        this.offsetParameter
+                = new DefaultEditingServiceParameter("offset_distance",
+                        i18nManager.getTranslation("offset_distance"),
+                        TYPE.POSITION, TYPE.VALUE, TYPE.DISTANCE);
+
+        Map<String, String> sideOptions = new HashMap<>();
+        sideOptions.put(i18nManager.getTranslation(SHORT_LEFT), i18nManager.getTranslation(LEFT));
+        sideOptions.put(i18nManager.getTranslation(SHORT_RIGHT), i18nManager.getTranslation(RIGHT));
+        
+        String sideConsoleMsg
+        = ((EditingProviderServices)providerServices).makeConsoleMessage(
+                i18nManager.getTranslation(SIDE), sideOptions);
+
+
+        this.sideParameter
+                = new DefaultEditingServiceParameter("side",
+                        sideConsoleMsg,
+                        sideOptions,
+                        TYPE.OPTION, TYPE.POSITION).setDataType(DataTypes.STRING);
+
+        DefaultEditingServiceParameterOptions joinStyleOptions = new DefaultEditingServiceParameterOptions()
+                .add(i18nManager.getTranslation(ROUND), ROUND, i18nManager.getTranslation(SHORT_ROUND))
+                .add(i18nManager.getTranslation(MITRE), MITRE, i18nManager.getTranslation(SHORT_MITRE))
+                .add(i18nManager.getTranslation(BEVEL), BEVEL, i18nManager.getTranslation(SHORT_BEVEL));
+
+
+        String joinStyleConsoleMsg = ((EditingProviderServices)providerServices).makeConsoleMessage(
+                i18nManager.getTranslation(JOIN_STYLE), joinStyleOptions);
+
+        this.joinStyleParameter
+                = new DefaultEditingServiceParameter(
+                        "joinStyle",
+                        joinStyleConsoleMsg,
+                        joinStyleOptions,
+                        i18nManager.getTranslation(SHORT_ROUND),
+                        true, 
+                        TYPE.OPTION); //.setDataType(DataTypes.STRING);
+        this.joinStyleParameter.setDefaultValue(ROUND);
+
+
+        this.equidistantOffsets = new DefaultEditingServiceParameter("equidistant_offsets", "equidistant_offsets", true, TYPE.VALUE);
+        this.equidistantOffsets.setDefaultValue(1);
+        
+        DefaultEditingServiceParameterOptions deleteOriginalGeometriesOptions2 = new DefaultEditingServiceParameterOptions()
+                .add("delete_original_geometries", true, i18nManager.getTranslation("_yes"))
+                .add("keep_original_geometries", false, i18nManager.getTranslation("_no"));
+
+        String consoleMsg
+                = editingProviderServices.makeConsoleMessage(
+                        "delete_original_geometries_question", deleteOriginalGeometriesOptions2);
+
+        this.deleteOriginalGeometriesParameter
+                = new DefaultEditingServiceParameter(
+                        i18nManager.getTranslation("delete_original_geometries"),
+                        consoleMsg,
+                        deleteOriginalGeometriesOptions2,
+                        false,
+                        TYPE.OPTION).setDataType(DataTypes.BOOLEAN);
+
+    }
+
+    @Override
+    public EditingServiceParameter next() {
+
+        if (values.get(selectionParameter) == null) {
+            return selectionParameter;
+        }
+        if (values.get(offsetParameter) == null) {
+            return offsetParameter;
+        }
+        if (values.get(sideParameter) == null) {
+            Object offsetValue = values.get(offsetParameter);
+            if (!(offsetValue instanceof Point)) {
+                Double distance = (Double) offsetValue;
+                if (distance >= 0) {
+                    return sideParameter;
+                }
+            }
+        }
+
+        if (values.get(deleteOriginalGeometriesParameter) == null) {
+            return this.deleteOriginalGeometriesParameter;
+        }
+
+        return null;
+    }
+
+    @Override
+    public DrawingStatus getDrawingStatus(Point mousePosition) throws DrawServiceException {
+        DefaultDrawingStatus drawingStatus = new DefaultDrawingStatus();
+        EditingProviderManager editingProviderManager
+                = EditingProviderLocator.getProviderManager();
+        EditingProviderServices editingProviderServices =
+            (EditingProviderServices) getProviderServices();
+        int subtype;
+        try {
+            subtype = editingProviderServices.getSubType(featureStore);
+        } catch (DataException e2) {
+            throw new DrawServiceException(e2);
+        }
+        ISymbol auxiliaryLineSymbolEditing = editingProviderManager.getSymbol("auxiliary-line-symbol-editing");
+        ISymbol auxiliaryPointSymbolEditing = editingProviderManager.getSymbol("auxiliary-point-symbol-editing");
+        ISymbol auxiliaryLineSymbolEditingDirection = editingProviderManager.getSymbol("auxiliary-line-symbol-editing-direction");
+        ISymbol lineSymbolEditing = editingProviderManager.getSymbol("line-symbol-editing");
+        ISymbol polygonSymbolEditing = editingProviderManager.getSymbol("polygon-symbol-editing");
+
+        if (values != null) {
+            Number equidistantOffsetsNumberValue = ((Number) values.get(this.equidistantOffsets));
+            int equidistantOffsetsValue = equidistantOffsetsNumberValue != null ? equidistantOffsetsNumberValue.intValue() : ((Number) this.equidistantOffsets.getDefaultValue()).intValue();
+
+//            FeatureSelection selected
+//                    = (FeatureSelection) values.get(selectionParameter);
+            try {
+                if ( CollectionUtils.isNotEmpty(selectedFeatures)) {
+
+                    Point point; // = null;
+                    double distance = 0.0;
+                    double side = 1.0;
+                    Object offsetValue = values.get(offsetParameter);
+
+                    if (offsetValue != null) {
+                        if (offsetValue instanceof Point) {
+                            distance = Math.abs(getMinDistance(selectedFeatures, (Point) offsetValue));
+                        } else {
+                            distance = (Double) offsetValue;
+                        }
+
+                        Object sideValue = values.get(sideParameter);
+                        if (sideValue == null) {
+                            point = mousePosition;
+                            side = Math.signum(getMinDistance(selectedFeatures, point));
+                        } else {
+                            Double signum = getSideSignum((String) sideValue);
+                            if (signum != null) {
+                                side = signum;
+                            }
+                        }
+                    } else {
+                        point = mousePosition;
+                        Geometry closestGeometry = getClosestGeometry(selectedFeatures, point);
+                        Point closestPoint = getClosestPoint(closestGeometry, point);
+                        distance = getMinDistance(selectedFeatures, point); //closestPoint.distance(point); //getMinDistance(selected, point);
+                        ISymbol symbol = lineSymbolEditing;
+                        Line auxLine = GeometryUtils.createLine(closestPoint, point, subtype);
+                        drawingStatus.addStatus(
+                                auxLine,
+                                auxiliaryLineSymbolEditing,
+                                ""
+                        );
+
+                        Point pointText = GeometryUtils.createPoint(
+                                0.5 * (closestPoint.getX() + point.getX()),
+                                0.5 * (closestPoint.getY() + point.getY())
+                        );
+
+                        ISimpleTextSymbol textSymbol = getTextSymbol();
+                        drawingStatus.addStatus(
+                                pointText,
+                                textSymbol,
+                                new DecimalFormat("#.0#").format(distance)
+                        );
+
+                    }
+
+                    int joinStyleValue = coerceJoinStyle(values.get(joinStyleParameter));
+//
+//                    DisposableIterator it;
+//                    it = selected.fastIterator();
+//
+//                    while (it.hasNext()) {
+                    for (Feature feat : selectedFeatures) {
+
+                        ISymbol previewSymbol = this.getPreviewSymbol(feat);
+
+                        for (int c = 1; c <= equidistantOffsetsValue; c++) {
+
+                            Geometry transformedGeometry = feat.getDefaultGeometry().offset(joinStyleValue, c * distance * side);
+
+                            ISymbol symbol = null;
+                            if (transformedGeometry instanceof Curve || transformedGeometry instanceof MultiCurve) {
+                                symbol = lineSymbolEditing;
+                                drawingStatus.addStatus(feat.getDefaultGeometry(), auxiliaryLineSymbolEditingDirection, "Direction");
+                            } else if (transformedGeometry instanceof Surface || transformedGeometry instanceof MultiSurface) {
+                                symbol = polygonSymbolEditing;
+                            } else if (transformedGeometry instanceof Point || transformedGeometry instanceof MultiPoint) {
+                                symbol = auxiliaryPointSymbolEditing;
+                            }
+                            if (transformedGeometry instanceof Aggregate) {
+                                int primitivesNumber = ((Aggregate) transformedGeometry).getPrimitivesNumber();
+                                for (int i = 0; i < primitivesNumber; i++) {
+                                    final Primitive primitive = ((Aggregate) transformedGeometry).getPrimitiveAt(i);
+                                    drawingStatus.addStatus(primitive, symbol, "");
+                                    drawingStatus.addStatus(primitive, previewSymbol, "");
+                                }
+                            } else {
+                                drawingStatus.addStatus(transformedGeometry, symbol, "");
+                                drawingStatus.addStatus(transformedGeometry, previewSymbol, "");
+                            }
+                        }
+                    }
+//                    DisposeUtils.disposeQuietly(it);
+                }
+            } catch (Exception e) {
+                throw new DrawServiceException(e);
+            }
+        }
+        return drawingStatus;
+    }
+
+    /**
+     * @param selected
+     * @param point
+     * @return
+     * @throws DataException
+     * @throws GeometryOperationException
+     * @throws GeometryOperationNotSupportedException
+     * @throws GeometryException
+     */
+    private double getMinDistance(List<Feature> selected, Point point) throws DataException, GeometryOperationNotSupportedException, GeometryOperationException, GeometryException {
+//        Geometry closestGeometry = getClosestGeometry(selected, point);
+//        if(closestGeometry != null){
+//            return closestGeometry.distance(point);
+//        }
+//        //No debería pasar por aquí
+        double minorDistance = Double.POSITIVE_INFINITY;
+//        DisposableIterator it;
+//        it = selected.fastIterator();
+//        while (it.hasNext()) {
+            
+        for (Feature feature : selected) {
+            Geometry geometry = feature.getDefaultGeometry();
+            double distance = getDistance(geometry, point);
+            if (distance < minorDistance) {
+                minorDistance = distance;
+            }
+        }
+//        it.dispose();
+        return minorDistance;
+
+    }
+    
+    private Geometry getClosestGeometry(List<Feature> selected, Point point) throws DataException, GeometryOperationNotSupportedException, GeometryOperationException, GeometryException {
+        double minorDistance = Double.POSITIVE_INFINITY;
+//        DisposableIterator it;
+//        it = selected.fastIterator();
+        Geometry closestGeometry = null;
+//        while (it.hasNext()) {
+        for (Feature feature : selected) {
+//            Feature feat = (Feature) it.next();
+            Geometry geometry = feature.getDefaultGeometry();
+            double distance = getDistance(geometry, point);
+            if (distance < minorDistance) {
+                closestGeometry = geometry;
+                minorDistance = distance;
+            }
+        }
+//        it.dispose();
+        return closestGeometry;
+
+    }
+
+    /**
+     * @param geometry
+     * @param point
+     * @return
+     * @throws GeometryOperationException
+     * @throws GeometryOperationNotSupportedException
+     * @throws GeometryException
+     */
+    private double getDistance(Geometry geometry, Point point) throws GeometryOperationNotSupportedException, GeometryOperationException, GeometryException {
+//        Point closest = getClosestPoint(geometry, point);
+//        if(closest != null) {
+//            return closest.distance(point);
+//        }
+        //No debería pasar por aquí
+        GeometryManager geomManager = GeometryLocator.getGeometryManager();
+        if (geometry instanceof Arc) {
+            Arc arc = (Arc) geometry;
+            Point center = arc.getCenterPoint();
+            double radius = center.distance(arc.getInitPoint());
+            double distance = center.distance(point) - radius;
+            return distance;
+        }
+
+        if (geometry instanceof Circle) {
+            Circle circle = (Circle) geometry;
+            return circle.getCenter().distance(point) - circle.getRadious();
+        }
+        if (geometry instanceof Circumference) {
+            Circumference circumference = (Circumference) geometry;
+            return circumference.getCenter().distance(point) - circumference.getRadious();
+        }
+        if (geometry instanceof PeriEllipse) {
+            double minDistance = Double.POSITIVE_INFINITY;
+            PeriEllipse ellipse = (PeriEllipse) geometry;
+            Geometry[] closestPoints = point.closestPoints(ellipse);
+            if (closestPoints != null) {
+                for (Geometry closestPoint : closestPoints) {
+                    if (!point.equals(closestPoint)) {
+                        double distance = closestPoint.distance(point);
+                        if (distance < minDistance) {
+                            minDistance = distance;
+                        }
+                    }
+                }
+            }
+            Ellipse auxEllipse = (Ellipse) geomManager.create(Geometry.TYPES.ELLIPSE, geometry.getGeometryType().getSubType());
+            auxEllipse.setPoints(ellipse.getAxis1Start(), ellipse.getAxis1End(), ellipse.getAxis2Dist());
+            if (auxEllipse.contains(point)) {
+                return -minDistance;
+            }
+            return minDistance;
+        }
+        if (geometry instanceof Ellipse) {
+            Ellipse ellipse = (Ellipse) geometry;
+            PeriEllipse auxPeriEllipse = (PeriEllipse) geomManager.create(Geometry.TYPES.PERIELLIPSE, geometry.getGeometryType().getSubType());
+            auxPeriEllipse.setPoints(ellipse.getAxis1Start(), ellipse.getAxis1End(), ellipse.getAxis2Dist());
+            double distance = getDistance(auxPeriEllipse, point);
+
+            return distance;
+        }
+
+        if (geometry instanceof Spline || geometry instanceof FilledSpline) {
+            return getDistance(geometry.toLines().getPrimitiveAt(0), point);
+        }
+
+        if (geometry instanceof Line) {
+            Line line = (Line) geometry;
+            double minDistance = Double.POSITIVE_INFINITY;
+            Geometry[] closestPoints = point.closestPoints(line);
+            Point closestPoint = null;
+            if (closestPoints != null) {
+                for (Geometry closestPoint1 : closestPoints) {
+                    Point p = (Point) closestPoint1;
+                    if (!point.equals(p)) {
+                        double distance = p.distance(point);
+                        if (distance < minDistance) {
+                            minDistance = distance;
+                            closestPoint = p;
+                        }
+                    }
+                }
+            }
+            if (closestPoint != null) {
+                for (int i = 0; i < line.getNumVertices() - 1; i++) {
+                    Line segment = (Line) geomManager.create(Geometry.TYPES.LINE, geometry.getGeometryType().getSubType());
+                    segment.addVertex(line.getVertex(i));
+                    segment.addVertex(line.getVertex(i + 1));
+                    if (segment.isWithinDistance(closestPoint, PRECISION)) {
+                        if (line.getVertex(0).equals(line.getVertex(line.getNumVertices() - 1))) { //isClosed
+                            if (line.toPolygons().contains(point)) {
+                                return -minDistance;
+                            }
+                            return minDistance;
+                        } else {
+                            return getDirectedDistance(closestPoint, point, segment);
+                        }
+                    }
+                }
+            }
+        }
+
+        if (geometry instanceof Polygon) {
+            Polygon polygon = (Polygon) geometry;
+            if (!polygon.contains(point)) {
+                double minDistance = Double.POSITIVE_INFINITY;
+                Geometry[] closestPoints = point.closestPoints(polygon);
+                Point closestPoint = null;
+                if (closestPoints != null) {
+                    for (Geometry closestPoint1 : closestPoints) {
+                        Point p = (Point) closestPoint1;
+                        if (!point.equals(p)) {
+                            double distance = p.distance(point);
+                            if (distance < minDistance) {
+                                minDistance = distance;
+                                closestPoint = p;
+                            }
+                        }
+                    }
+                }
+                if (closestPoint != null) {
+                    return closestPoint.distance(point);
+                }
+            } else {
+                Line auxLine = (Line) polygon.toLines().getPrimitiveAt(0);
+                if (auxLine != null) {
+                    return getDistance(auxLine, point);
+                }
+            }
+        }
+
+        if (geometry instanceof Aggregate) {
+            double minDistance = Double.POSITIVE_INFINITY;
+            Aggregate aggregate2 = (Aggregate) geometry;
+            for (int i = 0; i < aggregate2.getPrimitivesNumber(); i++) {
+                double distance = getDistance(aggregate2.getPrimitiveAt(i), point);
+                if (distance < minDistance) {
+                    minDistance = distance;
+                }
+            }
+            return minDistance;
+        }
+        return 0.0;
+    }
+
+    
+    private Point getClosestPoint(Geometry geometry, Point point) throws GeometryOperationNotSupportedException, GeometryOperationException, GeometryException {
+        GeometryManager geomManager = GeometryLocator.getGeometryManager();
+        if (geometry instanceof Line) {
+            Line line = (Line) geometry;
+            return (Point)line.closestPoints(point)[0];
+        } else {
+            return (Point)geometry.toLines().getPrimitiveAt(0).closestPoints(point)[0];
+        }
+//        if (geometry instanceof Arc) {
+//            return (Point)geometry.toLines().getPrimitiveAt(0).closestPoints(point)[0];
+//        }
+//
+//        if (geometry instanceof Circle) {
+//            return (Point)geometry.toLines().getPrimitiveAt(0).closestPoints(point)[0];
+//        }
+//        if (geometry instanceof Circumference) {
+//            return (Point)geometry.toLines().getPrimitiveAt(0).closestPoints(point)[0];
+//        }
+//        if (geometry instanceof PeriEllipse) {
+//            return (Point)geometry.toLines().getPrimitiveAt(0).closestPoints(point)[0];
+//        }
+//        if (geometry instanceof Ellipse) {
+//            return (Point)geometry.toLines().getPrimitiveAt(0).closestPoints(point)[0];
+//        }
+//
+//        if (geometry instanceof Spline || geometry instanceof FilledSpline) {
+//            return (Point)geometry.toLines().getPrimitiveAt(0).closestPoints(point)[0];
+//        }
+//
+//
+//        if (geometry instanceof Polygon) {
+//            return (Point)geometry.toLines().getPrimitiveAt(0).closestPoints(point)[0];
+//        }
+//
+//        if (geometry instanceof Aggregate) {
+//            return (Point)geometry.toLines().getPrimitiveAt(0).closestPoints(point)[0];
+//        }
+//        return null;
+    }
+
+//    
+    @Override
+    public void stop() {
+        values.clear();
+        this.selectedFeatures = Collections.EMPTY_LIST;
+}
+
+    @Override
+    public void restart() throws StartServiceException, InvalidEntryException, StopServiceException {
+//        values.put(selectionParameter, null);
+        values.put(offsetParameter, null);
+        values.put(sideParameter, null);
+        values.put(deleteOriginalGeometriesParameter, null);
+    }
+
+    
+    private void validateAndInsertValue(EditingServiceParameter param,
+            Object value) throws InvalidEntryException {
+        I18nManager i18nManager = ToolsLocator.getI18nManager();
+
+        try {
+            if (param == selectionParameter) {
+                if (value instanceof FeatureSelection) {
+                    FeatureSelection featureSelection = (FeatureSelection) value;
+                    if (featureSelection.getSelectedCount() > 0) {
+                        values.put(param, value);
+                        this.selectedFeatures = this.getSelectedFeaturesCopy(featureSelection);
+                    }
+                }
+            } else if (param == joinStyleParameter) {
+                if (value instanceof String) {
+                    values.put(param, fixJoinStyle(value));
+                }
+            } else if (param == offsetParameter) {
+                if (value instanceof Point) {
+                    Double distance = getMinDistance(this.selectedFeatures, (Point) value);
+                    if (distance == 0.0) {
+                        throw new IllegalArgumentException("distance can't be 0");
+                    }
+                    values.put(param, Math.abs(distance));
+                    values.put(sideParameter, coerceSide(distance));
+                    return;
+                }
+                if (value instanceof Double) {
+                    Double distance = (Double) value;
+                    if (distance > 0) {
+                        values.put(param, value);
+                    } else if (distance == 0.0) {
+                        throw new IllegalArgumentException("distance can't be 0");
+                    } else {
+                        values.put(param, Math.abs(distance));
+                        values.put(sideParameter, coerceSide(distance));
+                    }
+                }
+            } else if (param == sideParameter) {
+                if (value instanceof Point) {
+                    values.put(param, coerceSide(getMinDistance(this.selectedFeatures, (Point) value)));
+                    return;
+                }
+                if (value instanceof String) {
+                    values.put(param, coerceSide(value));
+                }
+            } else if (param == equidistantOffsets) {
+                if (value instanceof Number) {
+                    int intValue = ((Number) value).intValue();
+                    if(intValue >= 1) {
+                        values.put(param, ((Number) value).intValue());
+                    }
+                }
+            } else if (param == deleteOriginalGeometriesParameter) {
+                values.put(param, param.getOptions2().getValue(value, param.getDefaultValue()));
+            }
+        } catch (Exception e) {
+            throw new InvalidEntryException(e);
+        }
+
+    }
+
+    private String coerceSide(Object value) throws InvalidEntryException {
+
+        if (value instanceof Double) {
+            return (Double) value >= 0 ? LEFT : RIGHT;
+        }
+        if (value instanceof String) {
+            Double signum = getSideSignum((String) value);
+            if (signum != null) {
+                return signum >= 0 ? LEFT : RIGHT;
+            }
+        }
+        throw new InvalidEntryException(null);
+    }
+
+    private String fixJoinStyle(Object value) throws InvalidEntryException {
+
+        if (value instanceof String) {
+            I18nManager i18nManager = ToolsLocator.getI18nManager();
+            String joinStyleTrim = ((String)value).trim();
+            if (StringUtils.equalsIgnoreCase(joinStyleTrim, ROUND)
+                    || StringUtils.startsWithIgnoreCase(i18nManager.getTranslation(ROUND), joinStyleTrim)) {
+                return ROUND;
+            } else if (StringUtils.equalsIgnoreCase(joinStyleTrim, BEVEL)
+                    || StringUtils.startsWithIgnoreCase(i18nManager.getTranslation(BEVEL), joinStyleTrim)) {
+                return BEVEL;
+            } else if (StringUtils.equalsIgnoreCase(joinStyleTrim, MITRE)
+                    || StringUtils.startsWithIgnoreCase(i18nManager.getTranslation(MITRE), joinStyleTrim)) {
+                return MITRE;
+            }
+        }
+        throw new InvalidEntryException(null);
+    }
+
+    private Double getSideSignum(String side) {
+        I18nManager i18nManager = ToolsLocator.getI18nManager();
+        String sideTrim = side.trim();
+        if (StringUtils.equalsIgnoreCase(sideTrim, LEFT)
+                || StringUtils.startsWithIgnoreCase(i18nManager.getTranslation(LEFT), sideTrim)) {
+            return 1.0;
+        } else if (StringUtils.equalsIgnoreCase(sideTrim, RIGHT)
+                || StringUtils.startsWithIgnoreCase(i18nManager.getTranslation(RIGHT), sideTrim)) {
+            return -1.0;
+        }
+        return null;
+    }
+
+    @Override
+    public List<EditingServiceParameter> getParameters() {
+        List<EditingServiceParameter> list
+                = new ArrayList<>();
+        list.add(selectionParameter);
+        list.add(joinStyleParameter);
+        list.add(offsetParameter);
+        list.add(sideParameter);
+        list.add(equidistantOffsets);
+        list.add(deleteOriginalGeometriesParameter);
+        return list;
+    }
+
+    @Override
+    public void setValue(EditingServiceParameter parameter, Object value) throws InvalidEntryException {
+        validateAndInsertValue(parameter, value);
+    }
+
+    @Override
+    public void setValue(Object value) throws InvalidEntryException {
+        EditingServiceParameter param = next();
+        validateAndInsertValue(param, value);
+    }
+
+    @Override
+    public void finishAndStore() throws FinishServiceException {
+
+//        FeatureSelection selected
+//                = (FeatureSelection) values.get(selectionParameter);
+        try {
+            if (CollectionUtils.isNotEmpty(selectedFeatures)) {
+                double side = 1.0;
+                Object sideValue = values.get(sideParameter);
+                if (sideValue != null) {
+                    if (sideValue instanceof String) {
+                        Double signum = getSideSignum((String) sideValue);
+                        side = signum != null ? signum : null;
+                    }
+                }
+                double distance = ((Double) values.get(offsetParameter)) * side;
+                
+//                DisposableIterator it;
+//                it = selected.fastIterator();
+                int joinStyleValue = coerceJoinStyle(values.get(joinStyleParameter));
+                Number equidistantOffsetsNumberValue = ((Number) values.get(this.equidistantOffsets));
+                int equidistantOffsetsValue = equidistantOffsetsNumberValue != null ? equidistantOffsetsNumberValue.intValue() : ((Number)this.equidistantOffsets.getDefaultValue()).intValue();
+                for (Feature feature : selectedFeatures) {
+                    
+//                }
+//                while (it.hasNext()) {
+//                    Feature feature = (Feature) it.next();
+                    for (int c = 1; c <= equidistantOffsetsValue; c++) {
+
+                        Geometry geom;
+                        try {
+                            geom = feature.getDefaultGeometry().offset(joinStyleValue, c * distance);
+                        } catch (GeometryOperationNotSupportedException | GeometryOperationException e) {
+                            throw new FinishServiceException(e);
+                        }
+
+                        if ((boolean) values.get(deleteOriginalGeometriesParameter) && c == 1) {
+                            // Se sustituye la geometría original por la primera calculada
+                            EditableFeature editableFeature
+                                    = feature.getEditable();
+                            editableFeature.setDefaultGeometry(geom);
+                            ((EditingProviderServices) getProviderServices())
+                                    .updateFeatureInFeatureStore(editableFeature,
+                                            featureStore);
+                        } else {
+                            // Se crea una feature nueva copiando los valores de
+                            // la feature original excepto aquellos que sean PK
+                            EditingProviderServices editingProviderServices
+                                    = (EditingProviderServices) getProviderServices();
+                            EditableFeature editableFeature
+                                    = editingProviderServices
+                                            .getFeatureCopyWithoutUniqueIndex(featureStore,
+                                                    feature);
+                            editableFeature.setDefaultGeometry(geom);
+                            editingProviderServices
+                                    .insertFeatureIntoFeatureStore(editableFeature,
+                                            featureStore);
+                        }
+                    }
+
+                }
+//                it.dispose();
+//                featureStore.getFeatureSelection().deselectAll();
+            }
+        } catch (DataException e) {
+            throw new FinishServiceException(e);
+        }
+    }
+
+    private Double getDirectedDistance(Point pointInLine, Point distancePoint, Line line)
+            throws GeometryOperationNotSupportedException, GeometryOperationException {
+        Double distance = distancePoint.distance(pointInLine);
+        EditingProviderServices editingProviderServices
+                = (EditingProviderServices) getProviderServices();
+        Double angle = editingProviderServices.getAngle(pointInLine, distancePoint);
+        double angleLine = editingProviderServices.getAngle(line.getVertex(0), line.getVertex(1));
+
+        Double angleDifference = angle - angleLine;
+        if (angleDifference < 0) {
+            angleDifference += 2 * Math.PI;
+        }
+        if (angleDifference > Math.PI) {
+            distance = -distance;
+        }
+        return distance;
+    }
+
+    @Override
+    public Geometry finish() throws FinishServiceException {
+        return null;
+    }
+
+    @Override
+    public void start() throws StartServiceException {
+        this.values = new HashMap<>();
+        this.selectedFeatures = Collections.EMPTY_LIST;
+        FeatureSelection selected = null;
+        if (featureStore != null) {
+            try {
+                selected
+                        = (FeatureSelection) featureStore.getFeatureSelection()
+                                .clone();
+            } catch (DataException e) {
+                throw new StartServiceException(e);
+            } catch (CloneNotSupportedException e) {
+                // Do nothing
+            }
+            if ((selected != null) && (selected.getSelectedCount() > 0)) {
+                values.put(selectionParameter, selected);
+                this.selectedFeatures = this.getSelectedFeaturesCopy(selected);
+            }
+        }
+    }
+    
+    @Override
+    public String getName() {
+        return OffsetEditingProviderFactory.PROVIDER_NAME;
+    }
+
+    private int coerceJoinStyle(Object joinStyle) {
+        if(joinStyle instanceof String) {
+            switch ((String)joinStyle) {
+                default:
+                case ROUND:
+                    return JOIN_STYLE_ROUND;
+                case MITRE:
+                    return Geometry.JOIN_STYLE_MITRE;
+                case BEVEL:
+                    return Geometry.JOIN_STYLE_BEVEL;
+            }
+        }
+        return JOIN_STYLE_ROUND;
+    }
+
+    @Override
+    public boolean isEnabled(EditingServiceParameter parameter) {
+        if (parameter == joinStyleParameter) {
+            return true;
+        }
+        if (parameter == equidistantOffsets) {
+            return true;
+        }
+        return true;
+    }
+    
+    private ISimpleTextSymbol getTextSymbol(){
+        SymbologyManager symbologyManager = SymbologyLocator.getSymbologyManager();
+        ISimpleTextSymbol textSymbol = symbologyManager.createSimpleTextSymbol();
+        textSymbol.setFontSize(10);
+        return textSymbol;
+    }
+    
+    @Override
+    public Object getValue(EditingServiceParameter parameter) {
+        return values!=null?values.get(parameter):null;
+    }
+
+    
+}
Index: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/pom.xml
===================================================================
--- org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/pom.xml	(revision 0)
+++ org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset/pom.xml	(revision 4063)
@@ -0,0 +1,29 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.gvsig</groupId>
+    <artifactId>org.gvsig.vectorediting.offset.lib.prov</artifactId>
+    <version>1.0.196</version>
+  </parent>
+  <artifactId>org.gvsig.vectorediting.offset.lib.prov.offset</artifactId>
+  <name>org.gvsig.vectorediting.offset.lib.prov.offset</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.gvsig</groupId>
+      <artifactId>org.gvsig.vectorediting.lib.api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.gvsig</groupId>
+      <artifactId>org.gvsig.vectorediting.lib.impl</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.gvsig</groupId>
+      <artifactId>org.gvsig.vectorediting.lib.spi</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.gvsig</groupId>
+      <artifactId>org.gvsig.symbology.lib.api</artifactId>
+    </dependency>
+  </dependencies>
+</project>

Property changes on: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/org.gvsig.vectorediting.offset.lib.prov/org.gvsig.vectorediting.offset.lib.prov.offset
___________________________________________________________________
Added: svn:ignore
   + target


Index: org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/pom.xml
===================================================================
--- org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/pom.xml	(revision 0)
+++ org.gvsig.vectorediting.offset/tags/org.gvsig.vectorediting.offset-1.0.196/org.gvsig.vectorediting.offset.lib/pom.xml	(revision 4063)
@@ -0,0 +1,14 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.gvsig</groupId>
+    <artifactId>org.gvsig.vectorediting.offset</artifactId>
+    <version>1.0.196</version>
+  </parent>
+  <artifactId>org.gvsig.vectorediting.offset.lib</artifactId>
+  <packaging>pom</packaging>
+  <name>org.gvsig.vectorediting.offset.lib</name>
+    <modules>
+    <module>org.gvsig.vectorediting.offset.lib.prov</module>
+  </modules>
+</project>
