Revision 2918

View differences:

org.gvsig.vectorediting/tags/org.gvsig.vectorediting-1.0.171/org.gvsig.vectorediting.app/pom.xml
1
<?xml version="1.0" encoding="ISO-8859-1"?>
2

  
3
<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">
4
	<modelVersion>4.0.0</modelVersion>
5
	<groupId>org.gvsig</groupId>
6
	<artifactId>org.gvsig.vectorediting.app</artifactId>
7
	<packaging>pom</packaging>
8
	<version>1.0.171</version>
9
	<name>${project.artifactId}</name>
10
	<description>This plugin add to gvSIG a tool to show Vectorediting messages</description>
11
	<parent>
12
		<groupId>org.gvsig</groupId>
13
		<artifactId>org.gvsig.vectorediting</artifactId>
14
		<version>1.0.171</version>
15
	</parent>
16
	<dependencyManagement>
17
		<dependencies>
18
		
19
		</dependencies>
20
	</dependencyManagement>
21

  
22
	<modules>
23
		<module>org.gvsig.vectorediting.app.mainplugin</module>
24
	</modules>
25

  
26
</project>
org.gvsig.vectorediting/tags/org.gvsig.vectorediting-1.0.171/org.gvsig.vectorediting.app/maven-howto.rst
1

  
2
==================================
3
Usefull maven "howtos" and FAQs
4
==================================
5

  
6
.. contents::
7

  
8
How to reduce the process of "install" to run as fast as possible.
9
-------------------------------------------------------------------
10

  
11
Can reduce install execution skiping test execution and compilation,
12
javadoc generation, test signature checking, license checking, and 
13
attach sources in jar.
14

  
15
  mvn  -Danimal.sniffer.skip=true -Dmaven.test.skip=true -Dsource.skip=true -DskipTests -Dmaven.javadoc.skip=true install
16

  
17
How to increment the build number of gvSIG plugins
18
----------------------------------------------------
19

  
20
To increase the build number of gvSIG plugins, yo can do:
21

  
22
  mvn -Dincrease-build-number process-sources
23
  
24
How to deploy a package of a gvSIG plugin
25
--------------------------------------------
26

  
27
Yo can deploy the package of a gvSIG plugin with:
28

  
29
  mvn -Ddeploy-package -Duser=USER -Dpassword=PASSWORD install
30

  
31
Notes:
32
- Require that the gvsig.package.info.poolURL property that this set to the correct value.
33
- The process uses WEBDAV to upload the packages, gvspkg and gvspki, and require 
34
  access to write in the location specified by gvsig.package.info.poolURL
35
- If "user" or "password" is not present, the process ask its each time it need.
36
- If folder specified in  gvsig.package.info.poolURL does not exist, the process try to create it.
37
- The process create a file "addon-request.txt" in the target with the information to 
38
  add to the ticket to request the update of the package in the main repository of
39
  packages of gvSIG.
40

  
41
How to skip attach sources in jar from command line
42
------------------------------------------------------
43

  
44
If in the project is enabled by default the generation of jar whith 
45
the sources of the project, you can disable this setting the property
46
"source.skip" to true in the command line::
47

  
48
    mvn -Dsource.skip=true  install
49

  
50
How to skip test compile from command line
51
--------------------------------------------
52

  
53
You can skip the compilation of test setting the propety "maven.test.skip" 
54
to true in the command line::
55

  
56
    mvn -Dmaven.test.skip=true  install
57

  
58

  
59
How to skip test execution from command line
60
----------------------------------------------
61

  
62
You can skip the tests execution setting the propety "skipTests" to true
63
in the command line::
64

  
65
    mvn -DskipTests install
66

  
67
How to skip javadoc generation from command line
68
--------------------------------------------------
69

  
70
You can skip the javadoc generation setting the property
71
"maven.javadoc.skip" to true in the command line::
72

  
73
    mvn -Dmaven.javadoc.skip=true  install
74

  
75
How to skip test signature cheks from command line
76
---------------------------------------------------
77

  
78
You can skip the signature check setting the property
79
"animal.sniffer.skip" to true in the command line::
80

  
81
    mvn -Danimal.sniffer.skip=true install
82

  
83
How to install a project without install submodules
84
----------------------------------------------------------
85

  
86
To install a project with submodules and only install the
87
parent project without submodules use the option "--non-recursive" ::
88

  
89
    mvn --non-recursive install
90

  
91
  
92
How to skip test compilation
93
--------------------------------
94

  
95
To configure a project to don't run the compilation
96
of test you can add to this pom the next configuration of
97
the plugin "maven-compiler-plugin"::
98

  
99
  <build>
100
    <plugins>
101
      ...
102
      <plugin>
103
        <!-- Skip compilation tests -->
104
        <groupId>org.apache.maven.plugins</groupId>
105
        <artifactId>maven-compiler-plugin</artifactId>
106
        <executions>
107
          <execution>
108
            <id>default-testCompile</id>
109
            <phase>process-test-sources</phase>
110
            <goals>
111
              <goal>testCompile</goal>
112
            </goals>
113
            <configuration>
114
              <skip>true</skip>
115
            </configuration>
116
          </execution>
117
        </executions>
118
      </plugin>
119
      ...
120
    </plugins>
121
  </build>
122

  
123
Skip test execution
124
----------------------
125

  
126
To configure a project to don't run the execution
127
of test you can add to this pom the next configuration of
128
the plugin "maven-surefire-plugin"::
129

  
130

  
131
  <build>
132
    <plugins>
133
      ...
134
      <plugin>
135
        <!-- Skip test execution -->
136
        <groupId>org.apache.maven.plugins</groupId>
137
        <artifactId>maven-surefire-plugin</artifactId>
138
        <configuration>
139
          <skipTests>true</skipTests>
140
        </configuration>
141
      </plugin>
142
      ...
143
    </plugins>
144
  </build>
145

  
146
Continue on test failure
147
-----------------------------
148

  
149
You can configure a project to continue on test execution 
150
failure. To do this add to the pom of the project the next 
151
configuration of plugin "maven-surefire-plugin" ::
152

  
153
  <build>
154
    <plugins>
155
      ...
156
      <plugin>
157
        <!-- Continue on test failure -->
158
        <groupId>org.apache.maven.plugins</groupId>
159
        <artifactId>maven-surefire-plugin</artifactId>
160
        <configuration>
161
          <testFailureIgnore>true</testFailureIgnore>
162
        </configuration>
163
      </plugin>
164
      ...
165
    </plugins>
166
  </build>
167

  
168

  
169
Set java compatibility
170
--------------------------
171

  
172
To set the compatibility with a java version  add to the 
173
pom of the project the next configuration of plugin 
174
"maven-compiler-plugin" ::
175

  
176
  <build>
177
    <plugins>
178
      ...
179
      <plugin>
180
          <!-- Set java compatibility -->
181
          <groupId>org.apache.maven.plugins</groupId>
182
          <artifactId>maven-compiler-plugin</artifactId>
183
          <configuration>
184
              <source>1.5</source>
185
              <target>1.5</target>
186
              <encoding>ISO-8859-1</encoding>
187
          </configuration>
188
      </plugin>
189
      ...
190
    </plugins>
191
  </build>
192

  
193
Packaging tests in jar
194
------------------------
195

  
196
Test classes do not packaging in jar by default.
197
To packing add to pom::
198

  
199
  <build>
200
    <plugins>
201
      ...
202
      <plugin>
203
        <!-- Packaging tests in jar -->
204
        <groupId>org.apache.maven.plugins</groupId>
205
        <artifactId>maven-jar-plugin</artifactId>
206
        <executions>
207
          <!-- Generates a jar file only with the test classes -->
208
          <execution>
209
            <goals>
210
              <goal>test-jar</goal>
211
            </goals>
212
            <configuration>
213
              <includes>
214
                <include>**/**</include>
215
              </includes>
216
            </configuration>
217
          </execution>
218
        </executions>
219
      </plugin> 
220
      ...
221
    </plugins>
222
  </build>
223

  
224
How to set a dependency with tests jar
225
-----------------------------------------
226

  
227
You can set a dependency with a test jar adding to
228
the declaration of the dependency the scope of
229
test and the type of "test-jar"::
230

  
231
  <dependency>
232
      <groupId>...</groupId>
233
      <artifactId>...</artifactId>
234
      <type>test-jar</type>
235
      <scope>test</scope>
236
  </dependency>
237

  
238
How use ant in maven
239
-------------------------
240

  
241
You can use ant embed in the pom of you project.
242
To do this use::
243

  
244
  <plugin>
245
    <artifactId>maven-antrun-plugin</artifactId>
246
    <version>1.7</version>
247
    <executions>
248
      <execution>
249
        <phase>generate-sources</phase>
250
        <configuration>
251
          <target>
252
            <echo>Hello world!</echo>
253
          </target>
254
        </configuration>
255
        <goals>
256
          <goal>run</goal>
257
        </goals>
258
      </execution>
259
    </executions>
260
  </plugin>
261

  
262
Fail when execute "mvn deploy" with "No connector available"
263
-------------------------------------------------------------
264

  
265
When execute a "mvn deploy" fail with the error::
266

  
267
  [INFO] ------------------------------------------------------------------------
268
  [ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy 
269
    (default-deploy) on project org.gvsig.desktop: Failed to deploy artifacts/metadata: 
270
    No connector available to access repository gvsig-repository (dav:https://devel.gvsig.org/m2repo/j2se) 
271
    of type default using the available factories WagonRepositoryConnectorFactory -> [Help 1]
272
  [ERROR] 
273
  
274
This happens to be configured the webdav wagon as an extension in the section "build"::
275

  
276
  ...
277
  <build>
278
    <extensions>
279
        <extension>
280
            <groupId>org.apache.maven.wagon</groupId>
281
            <artifactId>wagon-webdav-jackrabbit</artifactId>
282
            <version>1.0-beta-7</version>
283
        </extension>
284
    </extensions>
285
  ...
286

  
287
Fail when execute "mvn release: prepare" with "svn command failed... Could not authenticate"
288
------------------------------------------------------------------------------------------------
289

  
290
When running "mvn release: prepare" updates poms, compiles, and then
291
fails with the following error ::
292

  
293
  [INFO] ------------------------------------------------------------------------
294
  [ERROR] Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.1:prepare 
295
    (default-cli) on project org.gvsig.desktop: Unable to commit files
296
  [ERROR] Provider message:
297
  [ERROR] The svn command failed.
298
  [ERROR] Command output:
299
  [ERROR] svn: Commit failed (details follow):
300
  [ERROR] svn: MKACTIVITY of '/svn/gvsig-desktop/!svn/act/931a27bc-57e8-45d9-adcd-5a2cf54a7045': 
301
    authorization failed: Could not authenticate to server: rejected Basic challenge (https://devel.gvsig.org)
302
  [ERROR] -> [Help 1]
303
  [ERROR] 
304
  [ERROR]
305

  
306
Apparently maven in linux system use the svn of system and if you're not
307
authenticated when trying to access to the repository, svn fails.
308

  
309
This is solved by executing a commit from the command line on
310
some file of the project (only if you have not enabled the option 
311
"store-passwords = no" in $ HOME / .subversion / config). For example, you 
312
can add or remove at the end of "pom.xml" a blank line and then run 
313
from the command line ::
314

  
315
  svn ci -m "" pom.xml
316
  
317
Another option that works on Windows in declaring the user and password in the command:
318

  
319
mvn release:prepare -Dusername=[username] -Dpassword=[password]
320

  
321

  
org.gvsig.vectorediting/tags/org.gvsig.vectorediting-1.0.171/org.gvsig.vectorediting.app/org.gvsig.vectorediting.app.mainplugin/buildNumber.properties
1
#Fri Dec 10 02:48:30 CET 2021
2
buildNumber=180
org.gvsig.vectorediting/tags/org.gvsig.vectorediting-1.0.171/org.gvsig.vectorediting.app/org.gvsig.vectorediting.app.mainplugin/src/test/resources/README.txt
1
====
2

  
3
    gvSIG. Desktop Geographic Information System.
4

  
5
    Copyright (C) 2007-2013 gvSIG Association.
6

  
7
    This program is free software; you can redistribute it and/or
8
    modify it under the terms of the GNU General Public License
9
    as published by the Free Software Foundation; either version 3
10
    of the License, or (at your option) any later version.
11

  
12
    This program is distributed in the hope that it will be useful,
13
    but WITHOUT ANY WARRANTY; without even the implied warranty of
14
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
    GNU General Public License for more details.
16

  
17
    You should have received a copy of the GNU General Public License
18
    along with this program; if not, write to the Free Software
19
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20
    MA  02110-1301, USA.
21

  
22
    For any additional information, do not hesitate to contact us
23
    at info AT gvsig.com, or visit our website www.gvsig.com.
24

  
25
====
26

  
27
Put into this folder the resources needed by your test classes.
28

  
29
This folder is added to the Tests classpath, so you can load any resources 
30
through the ClassLoader.
31

  
32
By default, in this folder you can find an example of log4j configuration,
33
prepared to log messages through the console, so logging works when you
34
run your tests classes.
org.gvsig.vectorediting/tags/org.gvsig.vectorediting-1.0.171/org.gvsig.vectorediting.app/org.gvsig.vectorediting.app.mainplugin/src/test/resources/log4j.xml
1
<?xml version="1.0" encoding="ISO-8859-1" ?>
2
<!--
3

  
4
    gvSIG. Desktop Geographic Information System.
5

  
6
    Copyright (C) 2007-2012 gvSIG Association.
7

  
8
    This program is free software; you can redistribute it and/or
9
    modify it under the terms of the GNU General Public License
10
    as published by the Free Software Foundation; either version 2
11
    of the License, or (at your option) any later version.
12

  
13
    This program is distributed in the hope that it will be useful,
14
    but WITHOUT ANY WARRANTY; without even the implied warranty of
15
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
    GNU General Public License for more details.
17

  
18
    You should have received a copy of the GNU General Public License
19
    along with this program; if not, write to the Free Software
20
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
21
    MA  02110-1301, USA.
22

  
23
    For any additional information, do not hesitate to contact us
24
    at info AT gvsig.com, or visit our website www.gvsig.com.
25

  
26
-->
27
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
28

  
29
<!-- 
30
Log4J configuration file for unit tests execution.
31
 -->
32
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
33

  
34
	<!-- Appender configuration to show logging messages through the console -->
35
	<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
36
		<layout class="org.apache.log4j.PatternLayout">
37
			<param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p [%c{2}.%M()]\n  %m%n" />
38
		</layout>
39
	</appender>
40

  
41
	<!-- 
42
	Activate logging messages of DEBUG level of higher only for the
43
	org.gvsig.tools packages.
44
	You can put full classes names or packages instead, to configure
45
	logging for all the classes and subpackages of the package.
46
	-->
47
	<category name="org.gvsig.tools">
48
		<priority value="DEBUG" />
49
	</category>
50
	<category name="org.gvsig.vectorediting">
51
		<priority value="DEBUG" />
52
	</category>
53

  
54
	<!-- 
55
	By default, show only logging messages of INFO level or higher, 
56
	through the previously configured CONSOLE appender. 
57
	-->
58
	<root>
59
		<priority value="INFO" />
60
		<appender-ref ref="CONSOLE" />
61
	</root>
62
</log4j:configuration>
org.gvsig.vectorediting/tags/org.gvsig.vectorediting-1.0.171/org.gvsig.vectorediting.app/org.gvsig.vectorediting.app.mainplugin/src/main/resources/README.txt
1
====
2

  
3
    gvSIG. Desktop Geographic Information System.
4

  
5
    Copyright (C) 2007-2013 gvSIG Association.
6

  
7
    This program is free software; you can redistribute it and/or
8
    modify it under the terms of the GNU General Public License
9
    as published by the Free Software Foundation; either version 3
10
    of the License, or (at your option) any later version.
11

  
12
    This program is distributed in the hope that it will be useful,
13
    but WITHOUT ANY WARRANTY; without even the implied warranty of
14
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
    GNU General Public License for more details.
16

  
17
    You should have received a copy of the GNU General Public License
18
    along with this program; if not, write to the Free Software
19
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20
    MA  02110-1301, USA.
21

  
22
    For any additional information, do not hesitate to contact us
23
    at info AT gvsig.com, or visit our website www.gvsig.com.
24
====
25

  
26
Put into this folder the resources to be included in the plugin jar.
27

  
org.gvsig.vectorediting/tags/org.gvsig.vectorediting-1.0.171/org.gvsig.vectorediting.app/org.gvsig.vectorediting.app.mainplugin/src/main/assembly/gvsig-plugin-package.xml
1
<!-- gvSIG. Desktop Geographic Information System. Copyright (C) 2007-2013 gvSIG
2
  Association. This program is free software; you can redistribute it and/or modify
3
  it under the terms of the GNU General Public License as published by the Free Software
4
  Foundation; either version 3 of the License, or (at your option) any later version.
5
  This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
6
  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
7
  PURPOSE. See the GNU General Public License for more details. You should have received
8
  a copy of the GNU General Public License along with this program; if not, write to
9
  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
10
  USA. For any additional information, do not hesitate to contact us at info AT gvsig.com,
11
  or visit our website www.gvsig.com. -->
12
<assembly>
13
  <id>gvsig-plugin-package</id>
14
  <formats>
15
    <format>zip</format>
16
  </formats>
17
  <baseDirectory>${project.artifactId}</baseDirectory>
18
  <includeBaseDirectory>true</includeBaseDirectory>
19
  <files>
20
    <file>
21
      <source>target/${project.artifactId}-${project.version}.jar</source>
22
      <outputDirectory>lib</outputDirectory>
23
    </file>
24
    <file>
25
      <source>target/package.info</source>
26
    </file>
27
  </files>
28

  
29
  <fileSets>
30
    <fileSet>
31
      <directory>src/main/resources-plugin</directory>
32
      <outputDirectory>.</outputDirectory>
33
    </fileSet>
34
  </fileSets>
35

  
36

  
37
  <dependencySets>
38
    <dependencySet>
39
      <useProjectArtifact>false</useProjectArtifact>
40
      <useTransitiveDependencies>false</useTransitiveDependencies>
41
      <outputDirectory>lib</outputDirectory>
42
      <includes>
43
        <include>org.gvsig:org.gvsig.vectorediting.lib.api</include>
44
        <include>org.gvsig:org.gvsig.vectorediting.swing.api</include>
45
        <include>org.gvsig:org.gvsig.vectorediting.lib.impl</include>
46
        <include>org.gvsig:org.gvsig.vectorediting.swing.impl</include>
47
        <include>org.gvsig:org.gvsig.vectorediting.lib.spi</include>
48
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.point</include>
49
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.circlecr</include>
50
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.circle3p</include>
51
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.polyline</include>
52
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.internalpolygon</include>
53
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.line</include>
54
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.arc</include>
55
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.ellipse</include>
56
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.regularpolygon</include>
57
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.rectangle</include>
58
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.spline</include>
59
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.explode</include>
60
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.move</include>
61
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.rotate</include>
62
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.duplicate</include>
63
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.scale</include>
64
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.splitline</include>
65
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.simplify</include>
66
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.multipoint</include>
67
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.autopolygon</include>
68
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.join</include>
69
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.stretch</include>
70
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.extendline</include>
71
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.split</include>
72
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.smoothline</include>
73
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.trimline</include>
74
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.rectangularmatrix</include>
75
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.polarmatrix</include>
76
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.editvertex</include>
77
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.remove</include>
78
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.converttopolyline</include>
79
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.reversedirection</include>
80
        <include>org.gvsig:org.gvsig.vectorediting.lib.prov.align</include>
81
      </includes>
82
    </dependencySet>
83
  </dependencySets>
84

  
85
</assembly>
86

  
org.gvsig.vectorediting/tags/org.gvsig.vectorediting-1.0.171/org.gvsig.vectorediting.app/org.gvsig.vectorediting.app.mainplugin/src/main/java/org/gvsig/vectorediting/app/mainplugin/EditingExtension.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright ? 2007-2014 gvSIG Association
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.vectorediting.app.mainplugin;
25

  
26
import java.awt.Component;
27
import java.awt.event.ActionEvent;
28
import java.io.File;
29
import java.util.ArrayList;
30
import java.util.Collections;
31
import java.util.List;
32
import java.util.function.Predicate;
33
import javax.swing.AbstractAction;
34
import javax.swing.Action;
35
import javax.swing.JMenuItem;
36
import javax.swing.JOptionPane;
37
import javax.swing.JPopupMenu;
38
import org.apache.commons.collections4.CollectionUtils;
39
import org.apache.commons.io.FileUtils;
40
import org.codehaus.plexus.util.StringUtils;
41

  
42
import org.slf4j.Logger;
43
import org.slf4j.LoggerFactory;
44

  
45
import org.gvsig.andami.IconThemeHelper;
46
import org.gvsig.andami.PluginServices;
47
import org.gvsig.andami.PluginsLocator;
48
import org.gvsig.andami.actioninfo.ActionInfo;
49
import org.gvsig.andami.plugins.Extension;
50
import org.gvsig.andami.plugins.IExtension;
51
import org.gvsig.andami.plugins.status.IExtensionStatus;
52
import org.gvsig.andami.plugins.status.IUnsavedData;
53
import org.gvsig.andami.plugins.status.UnsavedData;
54
import org.gvsig.app.ApplicationLocator;
55
import org.gvsig.app.ApplicationManager;
56
import org.gvsig.app.project.Project;
57
import org.gvsig.app.project.documents.Document;
58
import org.gvsig.app.project.documents.view.ViewDocument;
59
import org.gvsig.app.project.documents.view.ViewManager;
60
import org.gvsig.app.project.documents.view.gui.DefaultViewPanel;
61
import org.gvsig.app.project.documents.view.gui.IView;
62
import org.gvsig.app.project.documents.view.toc.actions.EndEditingTocMenuEntry;
63
import org.gvsig.app.project.documents.view.toc.actions.StartEditingTocMenuEntry;
64
import org.gvsig.app.project.documents.view.toolListeners.StatusBarListener;
65
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
66
import org.gvsig.expressionevaluator.swing.JExpressionBuilder;
67
import org.gvsig.fmap.dal.exception.DataException;
68
import org.gvsig.fmap.dal.feature.FeatureStore;
69
import org.gvsig.fmap.mapcontext.MapContext;
70
import org.gvsig.fmap.mapcontext.MapContextLocator;
71
import org.gvsig.fmap.mapcontext.layers.FLayer;
72
import org.gvsig.fmap.mapcontext.layers.FLayers;
73
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
74
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
75
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbolException;
76
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbolManager;
77
import org.gvsig.fmap.mapcontrol.MapControl;
78
import org.gvsig.fmap.mapcontrol.MapControlCreationListener;
79
import org.gvsig.fmap.mapcontrol.MapControlLocator;
80
import org.gvsig.fmap.mapcontrol.MapControlManager;
81
import org.gvsig.fmap.mapcontrol.tools.Behavior.Behavior;
82
import org.gvsig.fmap.mapcontrol.tools.Behavior.MouseMovementBehavior;
83
import org.gvsig.tools.ToolsLocator;
84
import org.gvsig.tools.dynform.spi.DynFormSPILocator;
85
import org.gvsig.tools.dynform.spi.DynFormSPIManager;
86
import org.gvsig.tools.extensionpoint.ExtensionPoint;
87
import org.gvsig.tools.i18n.I18nManager;
88
import org.gvsig.tools.observer.Notification;
89
import org.gvsig.tools.observer.Observable;
90
import org.gvsig.tools.observer.Observer;
91
import org.gvsig.tools.swing.api.ToolsSwingLocator;
92
import org.gvsig.tools.swing.api.windowmanager.Dialog;
93
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
94
import org.gvsig.tools.swing.api.windowmanager.WindowManager.MODE;
95
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
96
import org.gvsig.utils.swing.threads.IMonitorableTask;
97
import org.gvsig.vectorediting.app.mainplugin.dynformfield.point.JDynFormFieldPointFactory;
98
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
99
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
100
import org.gvsig.vectorediting.swing.api.EditingContext;
101
import org.gvsig.vectorediting.swing.api.EditingSwingLocator;
102
import org.gvsig.vectorediting.swing.api.EditingSwingManager;
103
import org.gvsig.vectorediting.swing.api.console.EditingConsole;
104

  
105
@SuppressWarnings("UseSpecificCatch")
106
public class EditingExtension extends Extension implements Observer {
107

  
108
    private static final Logger LOGGER = LoggerFactory.getLogger(EditingExtension.class);
109

  
110
    @Override
111
    public void execute(String actionCommand) {
112
        IView view = getActiveView();
113
        EditingSwingManager swingManager = EditingSwingLocator.getSwingManager();
114

  
115
        if (view != null) {
116
            EditingContext editingContext = swingManager.getEditingContext(view.getMapControl());
117

  
118
            if ("start-editing".equals(actionCommand)) {
119
                doStartEditing(view, editingContext);
120

  
121
            } else if ("end-editing".equals(actionCommand)) {
122
                doEndEditing(view, editingContext);
123

  
124
            } else if ("vector-editing-tooloptions".equalsIgnoreCase(actionCommand)) {
125
                doToolOptions(editingContext);
126
            }
127
        }
128
    }
129

  
130
    private void doStartEditing(IView view, EditingContext editingContext) {
131
        ApplicationManager application = ApplicationLocator.getManager();
132
        MapControl mapControl = view.getMapControl();
133
        List<FLyrVect> reprojectedLayers = getActiveLayers(
134
                view,
135
                (FLyrVect layer) -> canBeEdited(layer)
136
                && !mapControl.getProjection().equals(layer.getProjection())
137
        );
138
        if (!reprojectedLayers.isEmpty()) {
139
            String msg = "_The_layer_is_reproyected_on_the_fly"
140
                    + "_Not_all_editing_tools_work_properly"
141
                    + "_When_you_finish_editing"
142
                    + "_will_only_export_the_changes_to_another_layer";
143
            application.messageDialog(msg, "_Warning", JOptionPane.WARNING_MESSAGE);
144
        } else {
145
            List<FLyrVect> nonWritableLayers = getActiveLayers(
146
                    view,
147
                    (FLyrVect layer) -> canBeEdited(layer) && !isWritable(layer)
148
            );
149
            if (!nonWritableLayers.isEmpty()) {
150
                String msg = "_The_layer_can_not_be_written"
151
                        + "_When_you_finish_editing"
152
                        + "_will_only_export_the_changes_to_another_layer";
153
                application.messageDialog(msg, "_Warning", JOptionPane.WARNING_MESSAGE);
154
            }
155
        }
156
        List<FLyrVect> activeLayers = getActiveLayers(
157
                view,
158
                (FLyrVect layer) -> canBeEdited(layer)
159
        );
160
        for (FLyrVect layer : activeLayers) {
161
            editingContext.beginEdition(layer);
162
            editingContext.addObserver(this);
163
        }
164
        
165
        EditingConsole console = editingContext.getConsolePanel();
166
        JPopupMenu popup = console.getComponentPopupMenu();
167
        boolean needadd = true;
168
        for (int i = 0; i < popup.getComponentCount(); i++) {
169
            Component comp = popup.getComponent(i);
170
            if( StringUtils.equals("ExpressionBuilder",comp.getName()) ) {
171
                needadd = false;
172
                break;
173
            }
174
        }
175
        if( needadd ) {
176
            JMenuItem entry = new JMenuItem(new ExpressionBuilderAction(editingContext, console));
177
            entry.setName("ExpressionBuilder");
178
            popup.add(entry);
179
        }
180
        ApplicationLocator.getManager().refreshMenusAndToolBars();
181
    }
182

  
183
    private void doEndEditing(IView view, EditingContext editingContext) {
184
        List<FLyrVect> activeLayers = getActiveLayers(
185
                view,
186
                (FLyrVect layer) -> layer.isEditing()
187
        );
188
//                for (FLyrVect layer : activeLayers) {
189
//                    editingContext.endEdition(layer);
190
//                }
191
        if (CollectionUtils.isEmpty(activeLayers)) {
192
            return;
193
        }
194
        if (activeLayers.size() == 1) {
195
            editingContext.endEdition(activeLayers.get(0));
196
            ApplicationLocator.getManager().refreshMenusAndToolBars();
197
        } else {
198
            showMultilaterFinishEditingPanel(view.getMapControl().getMapContext());
199
        }
200
    }
201

  
202
    private void doToolOptions(EditingContext editingContext) {
203
        I18nManager i18n = ToolsLocator.getI18nManager();
204
//        EditingSwingManager editingSwingManager = EditingSwingLocator.getSwingManager();
205
        if (editingContext == null) {
206
            return;
207
        }
208
        WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
209
        EditingToolOptionsPanel panel = new EditingToolOptionsPanel(editingContext);
210
        windowManager.showWindow(
211
                panel,
212
                i18n.getTranslation("_Vector_editing_tool_options"),
213
                WindowManager.MODE.TOOL
214
        );
215
    }
216

  
217
    @Override
218
    public void initialize() {
219
        registerIcons();
220

  
221
        // Disable default view panel console. Uses editing context console.
222
        DefaultViewPanel.setDisableConsole(true);
223

  
224
        // Adding TOC menu entry
225
        ExtensionPoint exPoint = ToolsLocator.getExtensionPointManager().add(
226
                "View_TocActions", "");
227
        exPoint.append(
228
                StartEditingTocMenuEntry.EXTENSION_POINT_NAME,
229
                "TOC popup menu to start vector layer's editing",
230
                new StartEditingTocMenuEntry());
231
        exPoint.append(
232
                EndEditingTocMenuEntry.EXTENSION_POINT_NAME,
233
                "TOC popup menu to end vector layer's editing",
234
                new EndEditingTocMenuEntry());
235
        EditingToolOptionsPanel.registerPersistence();
236
    }
237

  
238
    private void registerIcons() {
239
        IconThemeHelper.registerIcon("vectorediting", "vector-editing", this);
240
        IconThemeHelper.registerIcon("vectorediting", "vector-editing-tooloptions", this);
241
        IconThemeHelper.registerIcon("vectorediting", "vector-editing-tooloptions-confirm", this);
242
    }
243

  
244
    @Override
245
    @SuppressWarnings("Convert2Lambda")
246
    public void postInitialize() {
247
        super.postInitialize();
248
        registerSymbols();
249

  
250
        MapControlManager mapControlManager = MapControlLocator.getMapControlManager();
251
        mapControlManager.addMapControlCreationListener(new MapControlCreationListener() {
252
            @Override
253
            public MapControl mapControlCreated(MapControl mapControl) {
254
                EditingContext editingContext = EditingSwingLocator.getSwingManager().getEditingContext(mapControl);
255
                StatusBarListener sbl = new StatusBarListener(mapControl);
256
                editingContext.setDefaultBehaviors(new Behavior[]{new MouseMovementBehavior(sbl)});
257
                editingContext.addObserver(EditingExtension.this);
258
                ApplicationLocator.getManager().refreshMenusAndToolBars();
259
                return mapControl;
260
            }
261
        });
262

  
263
        DynFormSPIManager dynFormManager = DynFormSPILocator.getDynFormSPIManager();
264
        dynFormManager.registerDynFieldFactory(new JDynFormFieldPointFactory());
265

  
266
    }
267

  
268
    /**
269
     * Register all symbols in the plugin symbols folder in the providerManager.
270
     * The description of the symbols must be unique because the key used for
271
     * registration is the proper description of the symbol.
272
     *
273
     */
274
    private void registerSymbols() {
275

  
276
        EditingProviderManager providerManager = EditingProviderLocator.getProviderManager();
277

  
278
        SymbolManager symbolManager = MapContextLocator.getSymbolManager();
279
        File symbolsFolder = FileUtils.getFile(getPlugin().getPluginDirectory(), "symbols", "editing");
280
        ISymbol[] symbols = null;
281
        try {
282
            symbols = symbolManager.loadSymbols(symbolsFolder);
283
        } catch (SymbolException e) {
284
            LOGGER.warn("No symbols loaded from " + symbolsFolder.getAbsolutePath(), e);
285
        }
286

  
287
        if (symbols != null) {
288
            for (ISymbol symbol : symbols) {
289
                String description = symbol.getDescription();
290
                providerManager.registerSymbol(description, symbol);
291
            }
292
        }
293
    }
294

  
295
    @Override
296
    public boolean isEnabled() {
297
        return true;
298
    }
299

  
300
    @Override
301
    public boolean isVisible() {
302
        return true;
303
    }
304

  
305
    @Override
306
    public boolean isVisible(String action) {
307
        IView view = getActiveView();
308
        if (view == null) {
309
            return false;
310
        }
311
        if ("start-editing".equals(action)) {
312
            List<FLyrVect> activeLayers = getActiveLayers(view, (FLyrVect layer) -> !layer.isEditing());
313
            return !activeLayers.isEmpty();
314
        } else {
315
            List<FLyrVect> activeLayers = getActiveLayers(view, (FLyrVect layer) -> layer.isEditing());
316
            return !activeLayers.isEmpty();
317

  
318
        }
319
    }
320

  
321
    @Override
322
    @SuppressWarnings("ConvertToStringSwitch")
323
    public boolean isEnabled(String action) {
324
        IView view = getActiveView();
325
        if (view == null) {
326
            return false;
327
        }
328
        if ("start-editing".equals(action)) {
329
            List<FLyrVect> activeLayers = getActiveLayers(view, (FLyrVect layer) -> canBeEdited(layer));
330
            return !activeLayers.isEmpty();
331

  
332
        } else if ("end-editing".equals(action)) {
333
            List<FLyrVect> activeLayers = getActiveLayers(view, (FLyrVect layer) -> layer.isEditing());
334
            return !activeLayers.isEmpty();
335

  
336
        } else if ("vector-editing-tooloptions".equals(action)) {
337
            List<FLyrVect> activeLayers = getActiveLayers(view, (FLyrVect layer) -> layer.isEditing());
338
            return !activeLayers.isEmpty();
339

  
340
        }
341

  
342
        return false;
343

  
344
    }
345

  
346
    @Override
347
    public boolean canQueryByAction() {
348
        return true;
349
    }
350

  
351
    private IView getActiveView() {
352
        ApplicationManager application = ApplicationLocator.getManager();
353
        IView view = (IView) application.getActiveComponent(ViewDocument.class);
354
        return view;
355
    }
356

  
357
    private boolean isWritable(FLyrVect layer) {
358
        if (layer != null && layer.isAvailable()) {
359
            return layer.getFeatureStore().allowWrite();
360
        }
361
        return false;
362
    }
363

  
364
    private boolean canBeEdited(FLyrVect layer) {
365
        if (layer != null && layer.isAvailable()) {
366

  
367
            boolean isNotTransformed
368
                    = layer.getFeatureStore().getTransforms().isEmpty();
369

  
370
            return isNotTransformed && !layer.isEditing();
371
        }
372

  
373
        return false;
374
    }
375

  
376
//  private FLyrVect getActiveLayer(IView vista) {
377
//    if (vista != null) {
378
//      ViewDocument viewDocument = vista.getViewDocument();
379
//      FLayer[] actives
380
//              = viewDocument.getMapContext().getLayers().getActives();
381
//
382
//      if ((actives.length == 1) && (actives[0] instanceof FLyrVect)) {
383
//        return (FLyrVect) actives[0];
384
//      }
385
//    }
386
//    return null;
387
//  }
388
    private List<FLyrVect> getActiveLayers(IView view, Predicate<FLyrVect> valid) {
389
        if (view == null) {
390
            return Collections.EMPTY_LIST;
391
        }
392
        List<FLyrVect> layers = new ArrayList<>();
393
        ViewDocument viewDocument = view.getViewDocument();
394
        FLayer[] actives = viewDocument.getMapContext().getLayers().getActives();
395
        for (FLayer layer : actives) {
396
            if (layer instanceof FLyrVect && valid.test((FLyrVect) layer)) {
397
                layers.add((FLyrVect) layer);
398
            }
399
        }
400
        return layers;
401
    }
402

  
403
    @Override
404
    public void update(Observable observable, Object notification) {
405

  
406
        if (notification instanceof Notification) {
407
            ApplicationManager appManager = ApplicationLocator.getManager();
408
            Notification n = (Notification) notification;
409
            if (n.isOfType(EditingContext.CHANGE_SELECTED_TOOL_NOTIFICATION)) {
410
                String name = (String) n.getValue();
411
                if( name!=null ) {
412
                    LOGGER.trace("Changed selected tool to '{}'", name);
413
                    PluginServices.getMainFrame().setSelectedTool(name);
414
                    appManager.refreshMenusAndToolBars();
415
                }
416

  
417
            } else if (n.isOfType(EditingContext.EXPORT_LAYER_NOTIFICATION)) {
418
                exportLayer((FLyrVect) (n.getValue()));
419

  
420
            } else if (n.isOfType(EditingContext.REFRESH_TOOLS_NOTIFICATION)) {
421
                appManager.refreshMenusAndToolBars();
422
            }
423
        }
424
    }
425

  
426
    private void exportLayer(FLyrVect layer) {
427
        ApplicationManager appManager = ApplicationLocator.getManager();
428
        I18nManager i18nManager = ToolsLocator.getI18nManager();
429
        ActionInfo action = PluginsLocator.getActionInfoManager().getAction("layer-exportto");
430
        action.execute(new Object[]{layer, MODE.toInteger(MODE.DIALOG)});
431
        String msg = "_Do_you_want_to_finish_editing_If_not_exported_the_data_the_changes_will_be_lost";
432
        if (appManager.confirmDialog(
433
                i18nManager.getTranslation(msg),
434
                i18nManager.getTranslation("end_editing"),
435
                JOptionPane.YES_NO_OPTION,
436
                JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
437
            try {
438
                layer.getFeatureStore().cancelEditing();
439
            } catch (Exception e) {
440
                LOGGER.warn("Can't abort editing of layer '" + layer.getName() + "'.", e);
441
                msg = "_Cant_finish_editing_See_the_error_log_for_more_information";
442
                appManager.messageDialog(msg, "_Warning", JOptionPane.WARNING_MESSAGE);
443
            }
444
        }
445
    }
446

  
447
    private List<FLyrVect> getEditedLayers() {
448
        ApplicationManager application = ApplicationLocator.getManager();
449
        List<FLyrVect> editedLayers = new ArrayList<>();
450

  
451
        Project project = application.getCurrentProject();
452
        for (Document document : project.getDocuments(ViewManager.TYPENAME)) {
453
            ViewDocument view = (ViewDocument) document;
454
            MapContext mapContext = view.getMapContext();
455
            if (mapContext != null) {
456
                FLayers layers = mapContext.getLayers();
457
                for (int j = 0; j < layers.getLayersCount(); j++) {
458
                    FLayer lyr = layers.getLayer(j);
459
                    if (lyr instanceof FLyrVect) {
460
                        FLyrVect layerVect = (FLyrVect) lyr;
461
                        if (layerVect.isEditing()) {
462
                            editedLayers.add(layerVect);
463
                        }
464
                    }
465
                }
466
            }
467
        }
468
        return editedLayers;
469
    }
470

  
471
    private List<IUnsavedData> getUnsavedData(List<FLyrVect> editedLayers) {
472
        List<IUnsavedData> unsavedData = new ArrayList<>();
473
        for (FLyrVect editedLayer : editedLayers) {
474
            IUnsavedData unsavedDataLayer = new UnsavedLayer(this, editedLayer);
475
            unsavedData.add(unsavedDataLayer);
476
        }
477
        return unsavedData;
478

  
479
    }
480

  
481
    private static class UnsavedLayer extends UnsavedData {
482

  
483
        private final FLyrVect layer;
484

  
485
        public UnsavedLayer(IExtension extension, FLyrVect layer) {
486
            super(extension);
487
            this.layer = layer;
488
        }
489

  
490
        @Override
491
        public String getDescription() {
492
            return layer.getName();
493
        }
494

  
495
        @Override
496
        public String getResourceName() {
497
            return layer.getFeatureStore().getFullName();
498
        }
499

  
500
        @Override
501
        public boolean saveData() {
502
            FeatureStore featureStore = layer.getFeatureStore();
503
            if (featureStore.isEditing()) {
504
                try {
505
                    featureStore.finishEditing();
506
                    return true;
507
                } catch (DataException e) {
508
                    throw new RuntimeException(e);
509
                }
510
            }
511
            return true;
512
        }
513
    }
514

  
515
    @Override
516
    public IExtensionStatus getStatus() {
517
        List<FLyrVect> editedLayers = getEditedLayers();
518
        final List<IUnsavedData> unsavedData = getUnsavedData(editedLayers);
519

  
520
        return new IExtensionStatus() {
521

  
522
            @Override
523
            public boolean hasUnsavedData() {
524
                if (unsavedData == null) {
525
                    return false;
526
                }
527
                return !unsavedData.isEmpty();
528
            }
529

  
530
            @Override
531
            public boolean hasRunningProcesses() {
532
                return false;
533
            }
534

  
535
            @Override
536
            public IUnsavedData[] getUnsavedData() {
537
                if (unsavedData == null) {
538
                    return null;
539
                }
540
                return unsavedData.toArray(new IUnsavedData[0]);
541
            }
542

  
543
            @Override
544
            public IMonitorableTask[] getRunningProcesses() {
545
                return null;
546
            }
547
        };
548
    }
549

  
550
    private void showMultilaterFinishEditingPanel(MapContext mapContext) {
551
        I18nManager i18n = ToolsLocator.getI18nManager();
552
        WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
553
        MultilayerFinishEditingPanel finishEditingPanel = new MultilayerFinishEditingPanel(mapContext);
554
        Dialog dialog = windowManager.createDialog(
555
                finishEditingPanel.asJComponent(),
556
                i18n.getTranslation("end_editing"),
557
                i18n.getTranslation("_List_of_layers_to_finish_editing"),
558
                WindowManager_v2.BUTTONS_OK_CANCEL
559
        );
560
        finishEditingPanel.setDialog(dialog);
561
        dialog.addActionListener((ActionEvent e) -> {
562
            if (dialog.getAction() == WindowManager_v2.BUTTON_OK) {
563
                finishEditingPanel.apply();
564
            }
565
        });
566
        dialog.show(WindowManager.MODE.WINDOW);
567
    }
568

  
569
    private static class ExpressionBuilderAction extends AbstractAction {
570

  
571
        private final EditingConsole console;
572
        private final EditingContext editingContext;
573
        
574
        
575
        @SuppressWarnings("OverridableMethodCallInConstructor")
576
        public ExpressionBuilderAction(EditingContext editingContext, EditingConsole console) {
577
            this.editingContext = editingContext;
578
            this.console = console;
579
            I18nManager i18n = ToolsLocator.getI18nManager();
580
            this.putValue(
581
                    Action.ACTION_COMMAND_KEY, 
582
                    "CreateJExpressionBuilderAction"
583
            );
584
            this.putValue(
585
                    Action.NAME, 
586
                    i18n.getTranslation("_Show_expression_builder")
587
            );
588
            this.putValue(
589
                    Action.SMALL_ICON, 
590
                    ToolsSwingLocator.getIconThemeManager().getCurrent().get("picker-expression")
591
            );
592
        }
593
        
594
        @Override
595
        public void actionPerformed(ActionEvent e) {
596
            I18nManager i18n = ToolsLocator.getI18nManager();
597
            WindowManager_v2 winmgr = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
598
            final JExpressionBuilder panel = ExpressionEvaluatorSwingLocator.getManager().createJExpressionBuilder();
599
            panel.addSymbolTable(this.editingContext.getContextSymbolTable());
600
            panel.setPreviewSymbolTable(this.editingContext.getContextSymbolTable());
601
            final Dialog dialog = winmgr.createDialog(
602
                    panel.asJComponent(),
603
                    i18n.getTranslation("_Expression_builder"),
604
                    null, 
605
                    WindowManager_v2.BUTTONS_OK_CANCEL
606
            );
607
            dialog.addActionListener((ActionEvent e2) -> {
608
                if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
609
                    console.addResponseText(panel.getExpression().getPhrase());
610
                }
611
            });
612
            dialog.show(WindowManager.MODE.DIALOG);
613
        }
614
        
615
    }
616
    
617
}
org.gvsig.vectorediting/tags/org.gvsig.vectorediting-1.0.171/org.gvsig.vectorediting.app/org.gvsig.vectorediting.app.mainplugin/src/main/java/org/gvsig/vectorediting/app/mainplugin/dynformfield/point/JDynFormFieldPoint.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or modify it under
7
 * the terms of the GNU General Public License as published by the Free Software
8
 * Foundation; either version 3 of the License, or (at your option) any later
9
 * version.
10
 *
11
 * This program is distributed in the hope that it will be useful, but WITHOUT
12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14
 * details.
15
 *
16
 * You should have received a copy of the GNU General Public License along with
17
 * this program; if not, write to the Free Software Foundation, Inc., 51
18
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us at info AT
21
 * gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.vectorediting.app.mainplugin.dynformfield.point;
24

  
25
import java.awt.BorderLayout;
26
import java.awt.event.ActionEvent;
27
import java.awt.event.FocusEvent;
28
import java.awt.event.FocusListener;
29
import javax.swing.JButton;
30
import javax.swing.JPanel;
31
import javax.swing.event.DocumentEvent;
32
import javax.swing.event.DocumentListener;
33
import javax.swing.text.JTextComponent;
34
import org.apache.commons.lang3.StringUtils;
35
import org.gvsig.expressionevaluator.ExpressionUtils;
36
import org.gvsig.fmap.geom.primitive.Point;
37
import org.gvsig.tools.ToolsLocator;
38
import org.gvsig.tools.dynform.DynFormFieldDefinition;
39
import org.gvsig.tools.dynform.JDynFormField;
40
import org.gvsig.tools.dynform.spi.DynFormSPIManager;
41
import org.gvsig.tools.dynform.spi.dynformfield.JDynFormFieldFactory;
42
import org.gvsig.tools.dynform.spi.dynformfield.AbstractJDynFormField;
43
import org.gvsig.tools.dynobject.Tags;
44
import org.gvsig.tools.i18n.I18nManager;
45
import org.gvsig.tools.swing.api.ToolsSwingLocator;
46
import org.gvsig.tools.swing.api.windowmanager.Dialog;
47
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
48
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
49
import org.gvsig.vectorediting.swing.api.EditingContext;
50
import org.gvsig.vectorediting.swing.api.EditingSwingLocator;
51
import org.gvsig.vectorediting.swing.api.JPointPanel;
52

  
53
public class JDynFormFieldPoint extends AbstractJDynFormField implements JDynFormField, FocusListener {
54

  
55
    protected Point assignedValue = null;
56
    protected Point currentValue = null;
57
    protected JTextComponent jtext = null;
58
    protected JButton jbutton = null;
59
    protected boolean readonly = false;
60

  
61
    public JDynFormFieldPoint(
62
            DynFormSPIManager serviceManager,
63
            DynFormSPIManager.ComponentsFactory componentsFactory,
64
            JDynFormFieldFactory factory,
65
            DynFormFieldDefinition definition,
66
            Object value
67
    ) {
68
        super(serviceManager, componentsFactory, factory, definition, value);
69
        this.assignedValue = (Point) value;
70
    }
71

  
72
    @Override
73
    public void setReadOnly(boolean readonly) {
74
        super.setReadOnly(readonly);
75
        if (this.contents != null) {
76
            if (readonly) {
77
                this.jtext.setEditable(false);
78
                this.jbutton.setEnabled(false);
79
            } else {
80
                this.jtext.setEditable(true);
81
                this.jbutton.setEnabled(true);
82
            }
83
        }
84
    }
85

  
86
    @Override
87
    public Object getAssignedValue() {
88
        return this.assignedValue;
89
    }
90

  
91
    @Override
92
    public void initComponent() {
93
        this.contents = new JPanel();
94
        this.contents.setLayout(new BorderLayout());
95

  
96
        JTextComponent text = this.getComponentsFactory().getJTextField(this.getDefinition(), null);
97
        this.jtext = text;
98
        this.fixPreferredWidth(text);
99
        text.addFocusListener(this);
100
        //this.jtext.setEditable(false);    
101
        text.getDocument().addDocumentListener(new DocumentListener() {
102
            @Override
103
            public void insertUpdate(DocumentEvent e) {
104
                fireFieldChangedEvent();
105
            }
106

  
107
            @Override
108
            public void removeUpdate(DocumentEvent e) {
109
                fireFieldChangedEvent();
110
            }
111

  
112
            @Override
113
            public void changedUpdate(DocumentEvent e) {
114
                fireFieldChangedEvent();
115
            }
116
        });
117

  
118
        this.jbutton = this.getComponentsFactory().getJButton(this.getDefinition(), null);
119
        this.jbutton.setIcon(this.getIcon("insert-point"));
120
        if( StringUtils.equals("...", this.jbutton.getText()) ) {
121
            this.jbutton.setText("");        
122
        }
123
        this.jbutton.addActionListener((ActionEvent e) -> {
124
            onClickPointPanel();
125
        });
126

  
127
        this.contents.add(jtext, BorderLayout.CENTER);
128
        this.contents.add(jbutton, BorderLayout.LINE_END);
129
        this.contents.setVisible(true);
130

  
131
        if (this.readonly) {
132
            this.jtext.setEditable(false);
133
            this.jbutton.setEnabled(false);
134
        } else {
135
            this.jtext.setEditable(true);
136
            this.jbutton.setEnabled(true);
137
        }
138
        this.setValue(this.assignedValue);
139
    }
140

  
141
    public void onClickPointPanel() {
142
        fireFieldEnterEvent();
143
        Point previous = this.currentValue;
144

  
145
        this.problemIndicator().restore();
146
        Point x = showOpenPointDialog(this.getLabel(),this.currentValue);
147
        if (x == null) {
148
            return;
149
        }
150
        this.currentValue = x;
151
        this.jtext.setText(pointToText(x));
152
        this.fireFieldChangedEventIfChanged(previous);
153
    }
154

  
155
    private void fireFieldChangedEventIfChanged(Point previous) {
156
        if (previous == null) {
157
            if (this.currentValue == null) {
158
                return;
159
            }
160
            this.fireFieldChangedEvent();
161
            return;
162
        }
163
        if (this.currentValue == null) {
164
            this.fireFieldChangedEvent();
165
            return;
166
        }
167
        if (!previous.toString().equals(this.currentValue.toString())) {
168
            this.fireFieldChangedEvent();
169
        }
170
    }
171

  
172
    @Override
173
    public void setValue(Object value) {
174
        Point previous = this.currentValue;
175
        if (value == null) {
176
            this.jtext.setText("");
177
        } else {
178
            if (!(value instanceof Point)) {
179
                LOGGER.info("setValue invoked with non Point value (" + value.toString() + ").");
180
                return;
181
            }
182
            this.jtext.setText(pointToText((Point) value));
183
            this.fixPreferredWidth(this.jtext);
184
        }
185
        this.assignedValue = (Point) value;
186
        this.currentValue = this.assignedValue;
187
        this.fireFieldChangedEventIfChanged(previous);
188
    }
189

  
190
    @Override
191
    public Object getValue() {
192
        Point value;
193
        String s = this.jtext.getText();
194
        if (StringUtils.isBlank(s)){
195
            return null;
196
        }
197
        value = textToPoint(s);
198
        return value;
199
    }
200

  
201
    @Override
202
    public boolean hasValidValue() {
203
        return true;
204
    }
205

  
206

  
207
    @Override
208
    public void focusGained(FocusEvent arg0) {
209
        fireFieldEnterEvent();
210
        this.problemIndicator().restore();
211
    }
212

  
213
    @Override
214
    public void focusLost(FocusEvent arg0) {
215
        fireFieldExitEvent();
216
    }
217

  
218
    @Override
219
    public void clear() {
220
        Object value = this.getDefinition().getDefaultValue();
221
        if (value != null) {
222
            value = pointToText((Point) value);
223
        } else {
224
            value = "";
225
        }
226
        this.jtext.setText((String) value);
227
    }
228

  
229
    private String pointToText(Point p) {
230
        StringBuilder buffer = new StringBuilder();
231
        for (int i = 0; i < p.getDimension(); i++) {
232
            double n = p.getCoordinateAt(i);
233
            if( buffer.length()>0 ) {
234
                buffer.append(", ");
235
            }
236
            buffer.append(n);
237
        }
238
        return buffer.toString();
239
    }
240
    
241
    private Point textToPoint(String text) {
242
        try {
243
            return (Point) ExpressionUtils.evaluate("ST_MakePoint("+text+")");
244
        } catch(Exception ex) {
245
            return null;
246
        }
247
    }
248

  
249
    private Point showOpenPointDialog(String label, Point currentValue) {
250
        Tags tags = this.getDefinition().getTags();
251
        EditingContext editingContext = (EditingContext) tags.get("EditingContext");
252
        JPointPanel pointPanel = EditingSwingLocator.getSwingManager().createPointPanel(editingContext);
253
        pointPanel.setPoint(currentValue);
254
        I18nManager i18n = ToolsLocator.getI18nManager();
255
        WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
256
        Dialog dialog = windowManager.createDialog(
257
                pointPanel.asJComponent(),
258
                i18n.getTranslation("enter_point"),
259
                null,
260
                WindowManager_v2.BUTTONS_OK_CANCEL
261
        );
262
        dialog.show(WindowManager.MODE.DIALOG);
263
        if (dialog.getAction() != WindowManager_v2.BUTTON_OK) {
264
            return null;
265
        }
266
        return pointPanel.getPoint();
267
    }
268
}
org.gvsig.vectorediting/tags/org.gvsig.vectorediting-1.0.171/org.gvsig.vectorediting.app/org.gvsig.vectorediting.app.mainplugin/src/main/java/org/gvsig/vectorediting/app/mainplugin/dynformfield/point/JDynFormFieldPointFactory.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff