Revision 2885

View differences:

org.gvsig.vectorediting/tags/org.gvsig.vectorediting-1.0.169/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.169</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.169</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.169/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.169/org.gvsig.vectorediting.app/org.gvsig.vectorediting.app.mainplugin/buildNumber.properties
1
#Tue Nov 16 20:44:23 CET 2021
2
buildNumber=178
org.gvsig.vectorediting/tags/org.gvsig.vectorediting-1.0.169/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.169/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.169/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.169/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.169/org.gvsig.vectorediting.app/org.gvsig.vectorediting.app.mainplugin/src/main/java/org/gvsig/vectorediting/app/mainplugin/MultilayerFinishEditingPanel.java
1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6
package org.gvsig.vectorediting.app.mainplugin;
7

  
8
import java.awt.Dimension;
9
import java.awt.GridBagConstraints;
10
import java.awt.GridBagLayout;
11
import java.awt.Insets;
12
import java.awt.event.ActionEvent;
13
import java.awt.event.ActionListener;
14
import java.awt.event.ItemEvent;
15
import java.awt.event.ItemListener;
16
import java.util.ArrayList;
17
import java.util.Iterator;
18
import java.util.List;
19
import javax.swing.DefaultComboBoxModel;
20
import javax.swing.JButton;
21
import javax.swing.JComponent;
22
import javax.swing.JLabel;
23
import javax.swing.JPanel;
24
import javax.swing.JScrollPane;
25
import org.gvsig.andami.PluginServices;
26
import org.gvsig.export.ExportLocator;
27
import org.gvsig.export.ExportManager;
28
import org.gvsig.export.ExportProcess;
29
import org.gvsig.export.swing.ExportSwingLocator;
30
import org.gvsig.export.swing.ExportSwingManager;
31
import org.gvsig.export.swing.JExportProcessPanel;
32
import org.gvsig.fmap.dal.exception.DataException;
33
import org.gvsig.fmap.mapcontext.MapContext;
34
import org.gvsig.fmap.mapcontext.layers.FLayer;
35
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
36
import org.gvsig.tools.ToolsLocator;
37
import org.gvsig.tools.i18n.I18nManager;
38
import org.gvsig.tools.swing.api.Component;
39
import org.gvsig.tools.swing.api.DropDown;
40
import org.gvsig.tools.swing.api.ToolsSwingLocator;
41
import org.gvsig.tools.swing.api.ToolsSwingManager;
42
import org.gvsig.tools.swing.api.windowmanager.Dialog;
43
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
44
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
45
import org.gvsig.tools.util.LabeledValue;
46
import org.gvsig.tools.util.LabeledValueImpl;
47
import org.gvsig.vectorediting.app.mainplugin.EditingExtension;
48
import org.slf4j.Logger;
49
import org.slf4j.LoggerFactory;
50

  
51
/**
52
 *
53
 * @author jovivas
54
 */
55
public class MultilayerFinishEditingPanel extends JPanel implements Component {
56
    
57
    private static final int OPTION_SAVE = 0;
58
    private static final int OPTION_DISMISS = 1;
59
    private static final int OPTION_CONTINUE = 2;
60
    private static final int OPTION_EXPORT = 3;
61
    
62
    private static final Logger LOGGER = LoggerFactory.getLogger(EditingExtension.class);
63
    private Dialog dialog;
64
    
65
    private static class Row {
66

  
67
        private final FLyrVect layer;
68
        private final DropDown dropDownOptions;
69
        private final JButton jButtonExport;
70
        private final LabeledValue[] options;
71

  
72
        I18nManager i18n = ToolsLocator.getI18nManager();
73
        private final JLabel dropDownComponent;
74
        private final MultilayerFinishEditingPanel panel;
75
//        private final JComboBox comboBoxComponent;
76

  
77
        public Row(MultilayerFinishEditingPanel panel, FLyrVect layer) {
78
            this.layer = layer;
79
            this.panel = panel;
80

  
81
            options = new LabeledValue[]{
82
                new LabeledValueImpl(i18n.getTranslation("_save"),OPTION_SAVE),
83
                new LabeledValueImpl(i18n.getTranslation("_dismiss"), OPTION_DISMISS),
84
                new LabeledValueImpl(i18n.getTranslation("_continue"), OPTION_CONTINUE),
85
                new LabeledValueImpl(i18n.getTranslation("_export"), OPTION_EXPORT)};
86

  
87
            DefaultComboBoxModel modelJComboBoxOptions = new DefaultComboBoxModel();
88
            for (LabeledValue option : options) {
89
                modelJComboBoxOptions.addElement(option);
90
            }
91
            
92
            ToolsSwingManager toolSwingmanager = ToolsSwingLocator.getToolsSwingManager();
93
            this.dropDownComponent = new JLabel();
94
//            this.comboBoxComponent = new JComboBox();
95
            this.dropDownOptions = toolSwingmanager.createDropDown(dropDownComponent);
96
            this.dropDownOptions.setModel(modelJComboBoxOptions);
97
//            this.comboBoxComponent.setModel(modelJComboBoxOptions);
98
            if (this.layer.getFeatureStore().allowWrite()) {
99
                this.dropDownOptions.setSelectedIndex(OPTION_SAVE); 
100
            } else {
101
                this.dropDownOptions.setSelectedIndex(OPTION_EXPORT);                
102
            }
103
//            if (this.layer.getFeatureStore().allowWrite()) {
104
//                this.comboBoxComponent.setSelectedIndex(OPTION_SAVE); 
105
//            } else {
106
//                this.comboBoxComponent.setSelectedIndex(OPTION_EXPORT);                
107
//            }
108
            this.dropDownOptions.setVisibleDropdownArrow(true);
109

  
110
            this.jButtonExport = new JButton(i18n.getTranslation("_export"));
111
            
112
            this.jButtonExport.addActionListener(new ActionListener() {
113
                @Override
114
                public void actionPerformed(ActionEvent e) {
115
                    WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
116
                    ExportManager exportManager = ExportLocator.getManager();
117
                    ExportSwingManager exportSwingManager = ExportSwingLocator.getSwingManager();
118
                    ExportProcess process = exportManager.createProcess(layer.getFeatureStore());
119
                    JExportProcessPanel panel = exportSwingManager.createJExportProcessPanel(process);
120
                    windowManager.showWindow(panel.asJComponent(), "_export", WindowManager.MODE.WINDOW);
121
                    
122
                    MultilayerFinishEditingPanel.Row.this.dropDownOptions.setSelectedIndex(OPTION_DISMISS);
123
                    MultilayerFinishEditingPanel.Row.this.panel.updateEnableOkButton();
124
                }
125
            });
126
            
127
            this.dropDownOptions.addItemListener(  new ItemListener () {
128
                @Override
129
                public void itemStateChanged(ItemEvent e) {
130
                    panel.updateEnableOkButton();
131
                    
132
                }
133
            });
134
            
135
//            this.comboBoxComponent.addActionListener(new ActionListener() {
136
//                @Override
137
//                public void actionPerformed(ActionEvent e) {
138
//                    panel.updateEnableOkButton();
139
//                }
140
//            });  
141
        }
142

  
143
        public FLyrVect getLayer() {
144
            return this.layer;
145
        }
146

  
147
        public JLabel getJLabel() {
148
            String layerName = this.layer.getName();
149
            JLabel layerNameJLabel = new JLabel(layerName);
150
            return layerNameJLabel;
151
        }
152

  
153
        public JComponent getJDropDown() {
154
            return this.dropDownOptions.asJComponent();
155
        }
156

  
157
        public JButton getJButton() {
158
            return this.jButtonExport;
159
        }
160

  
161
        public int getJComboBoxOption() {
162
            LabeledValue<Integer> optionSelected = (LabeledValue) this.dropDownOptions.getSelectedItem();
163
            return optionSelected.getValue();
164
        }
165
    }
166
    
167
    private final List<Row> rows;
168
    private final MapContext mapContext;
169

  
170
    public MultilayerFinishEditingPanel(MapContext mapContext) {
171
        this.rows = new ArrayList<>();
172
        this.mapContext = mapContext;
173
        this.initComponents();
174
    }
175

  
176
    private Row getRow(int rowIndex) {
177
        Row row = this.rows.get(rowIndex);
178
        return row;
179
    }
180

  
181
    public void addLayer(FLayer layer) {
182
        if (layer instanceof FLyrVect) {
183
            FLyrVect layerVect = (FLyrVect) layer;
184
            this.rows.add(new Row(this, layerVect));
185
        }
186
    }
187

  
188
    public void build() {
189
        this.removeAll();
190
        this.setLayout(new GridBagLayout());
191
        int rownum = 0;
192
        for (Row row : rows) {
193
            addComponent(rownum, 0, row.getJLabel());
194
            addComponent(rownum, 1, row.getJDropDown());
195
            addComponent(rownum, 2, row.getJButton());
196
            rownum++;
197
        }        
198
        GridBagConstraints c = new GridBagConstraints();
199
        c.fill = GridBagConstraints.BOTH;
200
        c.weighty = 0.9;
201
        c.weightx = 0.9;
202
        c.gridx = 1;
203
        c.gridy = rownum;
204
        this.add(new JLabel(""), c);
205
    }
206

  
207
    private void addComponent(int gridY, int gridX, JComponent component) {
208
        GridBagConstraints c = new GridBagConstraints();
209
        c.insets = new Insets(5, 5, 5, 5);
210
        c.fill = GridBagConstraints.HORIZONTAL;
211
        c.ipadx = 2;
212
        c.ipady = 2;
213
        c.gridx = gridX;
214
        c.gridy = gridY;
215
        this.add(component, c);
216
    }
217

  
218
    private void initComponents() {
219
        Iterator<FLayer> layers = mapContext.deepiterator();
220
        while (layers.hasNext()) {
221
            FLayer layer = layers.next();
222
            if (layer.isEditing()) {
223
                this.addLayer(layer);
224
            }
225
        }
226
        this.build();
227
    }
228

  
229
    private boolean checkExportLayers() {
230
        boolean exportLayer = false;
231
        for (int i = 0; i < this.rows.size(); i++) {
232
            Row row = this.getRow(i);
233
            if (row.getJComboBoxOption() == OPTION_EXPORT) {
234
                exportLayer = true;  
235
            }
236
        }
237
        return exportLayer;   
238
    }
239
    
240
    private void updateEnableOkButton(){
241
        if (this.dialog == null){
242
            return;
243
        }
244
        if (checkExportLayers()){
245
            dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK, false);
246
        }else {
247
            dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK, true);
248
        }
249
    }
250
    
251
    public void setDialog (Dialog dialog ){
252
        this.dialog=dialog;
253
        updateEnableOkButton();
254
    }
255
    
256
//    private boolean checkDismissLayers() {
257
//        boolean dismissLayer = false;
258
////        List dismissLayers = new ArrayList();
259
//        for (int i = 0; i < this.rows.size(); i++) {
260
//            Row row = this.getRow(i);
261
//            if (row.getJComboBoxOption() == OPTION_DISMISS) {
262
//                dismissLayer = true;
263
////                dismissLayers.add(row.getLayer().getName());  
264
//            }
265
//        }
266
////        if (dismissLayer) {
267
////            I18nManager i18n = ToolsLocator.getI18nManager();
268
////            StringBuilder message = new StringBuilder();
269
////            message.append(i18n.getTranslation("_The_following_layers_dismiss_the_changes"));
270
////            for (int i = 0; i < dismissLayers.size(); i++) {
271
////                message.append(dismissLayers.get(i));
272
////                message.append('\n');
273
////            }
274
////            String title = i18n.getTranslation("_Dismiss_information");
275
////            ToolsSwingLocator.getThreadSafeDialogsManager().messageDialog(message.toString(),
276
////                    title,
277
////                    JOptionPane.OK_CANCEL_OPTION);   
278
////        }        
279
//        return dismissLayer;
280
//    }
281
    
282
    public void apply() {
283
        for (int i = 0; i < this.rows.size(); i++) {
284
            Row row = this.getRow(i);
285
            if (row.getJComboBoxOption() == OPTION_SAVE) {
286
                try {
287
                    row.getLayer().getFeatureStore().finishEditing();
288
                } catch (DataException ex) {
289
                LOGGER.error(PluginServices.getText(this, "Finish editing process has problems, save option"), ex);
290
                }
291
            } else if (row.getJComboBoxOption() == OPTION_DISMISS) {
292
                try {
293
                    row.getLayer().getFeatureStore().cancelEditing();
294
                } catch (DataException ex) {
295
                LOGGER.error(PluginServices.getText(this, "Finish editing process has problems, dismiss option"), ex);
296
                }
297
            }
298
        }
299
    }
300
    
301
    @Override
302
    public JComponent asJComponent() {
303
        ToolsSwingManager toolSwingmanager = ToolsSwingLocator.getToolsSwingManager();
304
        
305
        this.build();
306
        this.setPreferredSize(new Dimension(400, 200));
307
       
308
        JScrollPane scrollPanel = new JScrollPane();
309
        scrollPanel.setPreferredSize(new Dimension(420, 220));
310
        scrollPanel.setViewportView(this);
311
        
312
        toolSwingmanager.removeBorder(this);
313
        scrollPanel.setBorder(null);
314
        return scrollPanel;
315
    }
316
}
org.gvsig.vectorediting/tags/org.gvsig.vectorediting-1.0.169/org.gvsig.vectorediting.app/org.gvsig.vectorediting.app.mainplugin/src/main/java/org/gvsig/vectorediting/app/mainplugin/EditingToolOptionsPanel.java
1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6
package org.gvsig.vectorediting.app.mainplugin;
7

  
8
import java.awt.BorderLayout;
9
import java.awt.FlowLayout;
10
import java.awt.event.ActionEvent;
11
import java.awt.event.ActionListener;
12
import java.util.ArrayList;
13
import java.util.HashMap;
14
import java.util.List;
15
import java.util.Map;
16
import java.util.Objects;
17
import javax.json.JsonObject;
18
import javax.json.JsonValue;
19
import javax.swing.BoxLayout;
20
import javax.swing.ImageIcon;
21
import javax.swing.JButton;
22
import javax.swing.JLabel;
23
import javax.swing.JPanel;
24
import javax.swing.JTabbedPane;
25
import javax.swing.SwingConstants;
26
import org.apache.commons.lang.StringUtils;
27
import org.gvsig.featureform.swing.JFeatureForm;
28
import org.gvsig.fmap.dal.DALLocator;
29
import org.gvsig.fmap.dal.DataTypes;
30
import org.gvsig.fmap.dal.exception.DataException;
31
import org.gvsig.fmap.dal.feature.EditableFeature;
32
import org.gvsig.fmap.dal.feature.Feature;
33
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
34
import org.gvsig.fmap.dal.feature.FeatureQuery;
35
import org.gvsig.fmap.dal.feature.FeatureStore;
36
import org.gvsig.fmap.dal.feature.FeatureType;
37
import org.gvsig.fmap.dal.feature.FeatureTypeDefinitionsManager;
38
import org.gvsig.fmap.dal.swing.DALSwingLocator;
39
import org.gvsig.fmap.dal.swing.DataSwingManager;
40
import org.gvsig.fmap.dal.swing.impl.searchpanel.DefaultSearchParameters;
41
import org.gvsig.json.Json;
42
import org.gvsig.tools.ToolsLocator;
43
import org.gvsig.tools.bookmarksandhistory.Bookmarks;
44
import org.gvsig.tools.bookmarksandhistory.BookmarksAndHistoryManager;
45
import org.gvsig.tools.dynform.DynFormDefinition;
46
import org.gvsig.tools.dynform.DynFormFieldDefinition;
47
import org.gvsig.tools.dynform.DynFormLocator;
48
import org.gvsig.tools.dynform.DynFormManager;
49
import org.gvsig.tools.dynform.JDynForm;
50
import org.gvsig.tools.dynform.JDynFormField;
51
import org.gvsig.tools.dynobject.DynClass;
52
import org.gvsig.tools.dynobject.DynField_v2;
53
import org.gvsig.tools.dynobject.DynObjectValueItem;
54
import org.gvsig.tools.dynobject.DynStruct;
55
import org.gvsig.tools.dynobject.DynStruct_v2;
56
import org.gvsig.tools.dynobject.Tags;
57
import org.gvsig.tools.i18n.I18nManager;
58
import org.gvsig.tools.observer.Notification;
59
import org.gvsig.tools.observer.Observable;
60
import org.gvsig.tools.observer.Observer;
61
import org.gvsig.tools.persistence.PersistenceManager;
62
import org.gvsig.tools.persistence.Persistent;
63
import org.gvsig.tools.persistence.PersistentState;
64
import org.gvsig.tools.persistence.exception.PersistenceException;
65
import org.gvsig.tools.swing.api.ToolsSwingLocator;
66
import org.gvsig.tools.swing.api.ToolsSwingUtils;
67
import org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue;
68
import static org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue.ID_GETVALUE;
69
import static org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue.ID_SETVALUE;
70
import org.gvsig.tools.swing.api.bookmarkshistory.BookmarksController;
71
import org.gvsig.vectorediting.app.mainplugin.dynformfield.point.JDynFormFieldPointFactory;
72
import org.gvsig.vectorediting.lib.api.EditingService;
73
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
74
import org.gvsig.vectorediting.lib.api.EditingServiceParameterOptions;
75
import org.gvsig.vectorediting.lib.api.EditingServiceParameterOptions.ParameterOption;
76
import org.gvsig.vectorediting.swing.api.EditingContext;
77
import org.slf4j.Logger;
78
import org.slf4j.LoggerFactory;
79

  
80
/**
81
 *
82
 * @author gvSIG Team
83
 */
84
@SuppressWarnings("UseSpecificCatch")
85
class EditingToolOptionsPanel extends JPanel {
86
    private static final Logger LOGGER = LoggerFactory.getLogger(EditingToolOptionsPanel.class);
87

  
88
    private static final String BOOKMARKSANDHISTORY_NAME = "EditingToolOptionsPanel";
89
    
90
    private final EditingContext editingContext;
91
    private EditingService service;
92
    private JDynForm form;
93
    private DynStruct_v2 definition;
94
    private final Observer contextObserver = (Observable observable, Object notification) -> {
95
        doContextChanged((Notification) notification);
96
    };
97
    private final Observer serviceObserver = (Observable observable, Object notification) -> {
98
        doServiceChanged((Notification) notification);
99
    };
100
    private JFeatureForm featureform;
101
    private JButton applyDefaultValuesButton;
102
    private ImageIcon confirmIcon;
103
    
104
    private static final Map<String, JsonObject> defaultValues = new HashMap<>();
105
    private JTabbedPane tab;
106
    private int currentTab;
107
    private JButton acceptOptionsButton;
108

  
109
    @SuppressWarnings(value = {"OverridableMethodCallInConstructor", "LeakingThisInConstructor"})
110
    public EditingToolOptionsPanel(EditingContext editingContext) {
111
        this.setLayout(new BorderLayout());
112
        this.editingContext = editingContext;
113
        this.editingContext.addObserver(this.contextObserver);
114
        EditingService activeService = editingContext.getActiveService();
115
        this.set(activeService);
116
        this.put(activeService);
117
        this.setPreferredSize(ToolsSwingUtils.ensureRowsCols(this, 10, 30));
118
        try {
119
            this.confirmIcon = ToolsSwingLocator.getIconThemeManager()
120
                    .getCurrent().get("vector-editing-tooloptions-confirm");
121
        } catch(Exception ex) {
122
            
123
        }
124
        this.currentTab = 0;
125
    }
126

  
127
    private Bookmarks getBookmarks(FeatureStore store) {
128
        boolean useBookmarksByTable = false; // TODO: poner esto en preferencias de edicion.
129
        BookmarksAndHistoryManager manager = ToolsLocator.getBookmarksAndHistoryManager();
130
        
131
        if( useBookmarksByTable ) {
132
            return manager.getBookmarksGroup(BOOKMARKSANDHISTORY_NAME+"_"+store.getName());        
133
        } else {
134
            return manager.getBookmarksGroup(BOOKMARKSANDHISTORY_NAME);        
135
        }
136
        
137
    }
138
    
139
    private void set(EditingService service) {
140
        if(this.service == service && service != null) {
141
            return;
142
        }
143

  
144
        if (this.service != null) {
145
            this.service.deleteObserver(this.serviceObserver);
146
        }
147
        I18nManager i18n = ToolsLocator.getI18nManager();
148
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
149
        if (service == null) {
150
            if(this.tab != null){
151
                this.currentTab = this.tab.getSelectedIndex();
152
            }
153
            this.removeAll();
154
            this.tab = null;
155
            JLabel label = new JLabel(
156
                    "<html><center>" +
157
                    i18n.getTranslation("_Activate_an_editing_tool_to_see_your_options_here")+
158
                    "</center></html>"
159
            );
160
            label.setHorizontalAlignment(SwingConstants.CENTER);
161
            this.add(label, BorderLayout.CENTER);
162
        } else if( service != this.service ) {
163
            if(this.tab != null){
164
                this.currentTab = this.tab.getSelectedIndex();
165
            }
166
            this.removeAll();
167
            this.tab = null;
168
            JPanel header = new JPanel();
169
            header.setLayout(new BoxLayout(header,BoxLayout.Y_AXIS));
170
            FeatureStore store = service.getStore();
171
            header.add(
172
                    new JLabel(
173
                            i18n.getTranslation("_Table")
174
                            + ": "
175
                            + (store == null ? "(unknown)" : store.getName())
176
                    )
177
            );
178
            header.add(
179
                    new JLabel(
180
                            i18n.getTranslation("_Tool")
181
                            + ": "
182
                            + i18n.getTranslation(service.getDescription())
183
                    )
184
            );
185
            this.add(header, BorderLayout.NORTH);
186

  
187
            this.tab = new JTabbedPane();
188
            tab.setTabPlacement(JTabbedPane.BOTTOM);
189
            tab.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
190
            
191
            this.add(tab, BorderLayout.CENTER);
192
            
193
            definition = this.getToolOptionsDefinition(service);
194
            if (definition != null) {
195
                DynFormManager dynFormManager = DynFormLocator.getDynFormManager();
196
                form = dynFormManager.createJDynForm(definition);
197

  
198
                JPanel optionsPanel = new JPanel();
199
                optionsPanel.setLayout(new BorderLayout());
200
                optionsPanel.add(form.asJComponent(), BorderLayout.CENTER);
201
                JButton cancelButton = new JButton(i18n.getTranslation("_Cancel"));
202
                cancelButton.addActionListener((e) -> {
203
                    editingContext.cancelActiveService();
204
                });
205
                this.acceptOptionsButton = new JButton(i18n.getTranslation("_Accept"));
206
                this.acceptOptionsButton.addActionListener((e) -> {
207
                    applyOptions();
208
                });
209
                JPanel buttonsPanel = new JPanel();
210
                buttonsPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 2, 0 ));
211
                buttonsPanel.add(this.acceptOptionsButton);
212
                buttonsPanel.add(cancelButton);
213
                optionsPanel.add(buttonsPanel, BorderLayout.PAGE_END);
214

  
215
                tab.add(i18n.getTranslation("_Options"), optionsPanel);
216
                this.currentTab = 0;
217

  
218
                this.form.addListener(new JDynForm.JDynFormListener() {
219
                    @Override
220
                    public void message(String message) {
221
                    }
222

  
223
                    @Override
224
                    public void fieldChanged(JDynFormField field) {
225
                        if (acceptOptionsButton != null) {
226
                            acceptOptionsButton.setIcon(confirmIcon);
227
                        }
228
                    }
229
                });
230
            }
231
            try {
232
                JsonObject xx = defaultValues.get(store.getFullName());
233
                EditableFeature f = service.getDefaultFeatureValues();
234
                if(xx != null){
235
                    f.copyFrom(xx);
236
                }
237
                DynFormDefinition formdef = this.createFormDefinition(service);
238
                this.featureform = dataSwingManager.createJFeatureForm(formdef);                
239
                this.featureform.getDynForm().setContext(dataSwingManager.createFeaturesFormContext(store));
240
                this.featureform.setFeature(f);
241
                JPanel valuesPanel = new JPanel();
242
                valuesPanel.setLayout(new BorderLayout());
243
                valuesPanel.add(featureform.asJComponent(), BorderLayout.CENTER);
244
                applyDefaultValuesButton = new JButton(i18n.getTranslation("_Apply"));
245
                applyDefaultValuesButton.addActionListener((e) -> { applyDefaultValues(); });
246
                JButton resetDefaultValuesButton = new JButton(i18n.getTranslation("_Reset"));
247
                resetDefaultValuesButton.addActionListener((e) -> {
248
                    resetDefaultValues();
249
                });
250
                
251
                Bookmarks bookmarks = this.getBookmarks(store);
252
                JButton bookmarksButton = new JButton("...");
253
                BookmarksController bookmarksController = ToolsSwingLocator.getToolsSwingManager().createBookmarksController(
254
                        bookmarks,
255
                        bookmarksButton
256
                );
257
                bookmarksController.addActionListener(new ActionListener() {
258
                    @Override
259
                    public void actionPerformed(ActionEvent e) {
260
                        EditableFeature feature;
261
                        ActionEventWithCurrentValue<EditingToolOptionsDefaultValueBookmark> b = (ActionEventWithCurrentValue<EditingToolOptionsDefaultValueBookmark>) e;
262
                        switch (b.getID()) {
263
                            case ID_GETVALUE:
264
                                EditingToolOptionsDefaultValueBookmark bookmark = new EditingToolOptionsDefaultValueBookmark();
265
                                bookmark.setDefaultValues(service.getDefaultFeatureValues());
266
                                b.setCurrentValue(bookmark);
267
                                break;
268
                            case ID_SETVALUE:
269
                                if (b.getCurrentValue() == null) {
270
                                    return;
271
                                }
272
                                JsonObject bookmarkFeature = b.getCurrentValue().getDefaultValues();
273
                                feature = service.getDefaultFeatureValues();
274
                                feature.copyFrom(bookmarkFeature);
275
                                featureform.setFeature(feature);
276
                                break;
277
                        }
278
                    }
279
                });
280

  
281
                JPanel applyPanel = new JPanel();
282
                applyPanel.setLayout(new FlowLayout(FlowLayout.RIGHT,4,0));
283
                applyPanel.add(applyDefaultValuesButton);
284
                applyPanel.add(resetDefaultValuesButton);
285
                applyPanel.add(bookmarksButton);
286
                valuesPanel.add(applyPanel, BorderLayout.PAGE_END);
287
                
288
                tab.add(i18n.getTranslation("_Default_values"), valuesPanel );
289
                this.currentTab = 1;
290
                
291
                featureform.getDynForm().addListener(new JDynForm.JDynFormListener() {
292
                    @Override
293
                    public void message(String message) {
294
                    }
295

  
296
                    @Override
297
                    public void fieldChanged(JDynFormField field) {
298
                        if(applyDefaultValuesButton != null){
299
                            applyDefaultValuesButton.setIcon(confirmIcon);
300
                        }
301
                    }
302
                });
303
                
304
            } catch (Exception ex) {
305
                LOGGER.debug("Can't create panel",ex);
306
            }
307
            ToolsSwingUtils.ensureRowsCols(this, 8, 43, 25, 60);
308
            tab.setSelectedIndex(this.currentTab);
309
            service.addObserver(this.serviceObserver);
310
        }
311
        this.service = service;
312
    }
313

  
314
    private DynFormDefinition createFormDefinition(EditingService service) throws DataException {
315
        FeatureTypeDefinitionsManager featureTypeDefinitionsManager = DALLocator.getFeatureTypeDefinitionsManager();
316
        
317
        FeatureStore store = service.getStore();
318
        FeatureType featureType = store.getDefaultFeatureType();
319
        DynClass dynClass = featureTypeDefinitionsManager.get(store,featureType);
320
        DynFormDefinition formdef = DynFormLocator.getDynFormManager().createDefinition(dynClass);
321
        for (FeatureAttributeDescriptor attr : featureType) {
322
            if( attr.isPrimaryKey() || attr.isReadOnly() ) {
323
                formdef.remove(attr.getName());
324
            }
325
        }
326
        for (DynFormFieldDefinition fielddef : formdef) {
327
            fielddef.setMandatory(false);
328
        }
329
        return formdef;
330
    }
331
    
332
    private DynStruct_v2 getToolOptionsDefinition(EditingService service) {
333
        if (service == null) {
334
            return null;
335
        }
336
        DynStruct_v2 def = (DynStruct_v2) ToolsLocator.getDynObjectManager().createDynClass(
337
                service.getName(), null
338
        );
339
        I18nManager i18n = ToolsLocator.getI18nManager();
340
        DynField_v2 field;
341
        Tags tags;
342
        List<ServiceParameterField> params = this.getServiceParameters(service);
343
        for (ServiceParameterField param : params) {
344
            switch(param.getType()) {
345
                case POSITION:
346
                    field = (DynField_v2) def.addDynField(param.getFieldName(), DataTypes.GEOMETRY);
347
                    field.setLabel(i18n.getTranslation(param.getName()));
348
                    field.setDescription(i18n.getTranslation(param.getDescription()));
349
                    field.setDefaultFieldValue(param.getDefaultValue());
350
                    tags = field.getTags();
351
                    tags.set("EditingContext", this.editingContext);
352
                    tags.set("ParamType", param.getType());
353
                    field.setSubtype(JDynFormFieldPointFactory.NAME);
354
                    field.setMandatory(false);
355
                    break;
356
                case LIST_POSITIONS:
357
                    field = (DynField_v2) def.addDynField(param.getFieldName(), DataTypes.GEOMETRY);
358
                    field.setLabel(i18n.getTranslation(param.getName()));
359
                    field.setDescription(i18n.getTranslation(param.getDescription()));
360
                    field.setDefaultFieldValue(param.getDefaultValue());
361
                    tags = field.getTags();
362
                    tags.set("EditingContext", this.editingContext);
363
                    tags.set("ParamType", param.getType());
364
                    field.setSubtype(JDynFormFieldPointFactory.NAME);
365
                    field.setMandatory(false);
366
                    break;
367
                case VALUE:
368
                    field = (DynField_v2) def.addDynFieldDouble(param.getFieldName());
369
//                    field = (DynField_v2) def.addDynField(param.getFieldName(), param.getDataType());
370
                    if( param.isAditional() ) {
371
                        field.setLabel(i18n.getTranslation("_Value"));
372
                    } else {
373
                        field.setLabel(i18n.getTranslation(param.getName()));
374
                    }
375
                    tags = field.getTags();
376
                    tags.set("ParamType", param.getType());
377
                    field.setDescription(i18n.getTranslation(param.getDescription()));
378
                    field.setDefaultFieldValue(param.getDefaultValue());
379
                    field.setMandatory(false);
380
                    break;
381

  
382
                case DISTANCE:
383
                    field = (DynField_v2) def.addDynFieldDouble(param.getFieldName());
384
//                    field = (DynField_v2) def.addDynField(param.getFieldName(), param.getDataType());
385
                    if( param.isAditional() ) {
386
                        field.setLabel(i18n.getTranslation("_Distance"));
387
                    } else {
388
                        field.setLabel(i18n.getTranslation(param.getName()));
389
                    }
390
                    tags = field.getTags();
391
                    tags.set("ParamType", param.getType());
392
                    field.setDescription(i18n.getTranslation(param.getDescription()));
393
                    field.setDefaultFieldValue(param.getDefaultValue());
394
                    field.setMandatory(false);
395
                    break;
396

  
397
                case OPTION:
398
                    field = (DynField_v2) def.addDynField(param.getFieldName(), param.getDataType());
399
                    if( param.isAditional() ) {
400
                        field.setLabel(i18n.getTranslation("_Options"));
401
                    } else {
402
                        field.setLabel(i18n.getTranslation(param.getName()));
403
                    }
404
                    field.setDescription(i18n.getTranslation(param.getDescription()));
405
                    List<DynObjectValueItem> availableValues = new ArrayList<>();
406
                    availableValues.add(new DynObjectValueItem(null, " "));
407
                    if(param.getOptions() == null){
408
                        for (ParameterOption option : param.getOptions2()) {
409
                            Object value = option.getValue();
410
                            String label = i18n.getTranslation(option.getLabel());
411
                            availableValues.add(new DynObjectValueItem(value, label));
412
                        }
413
                    } else {
414
                        for (Map.Entry<String, String> option : param.getOptions().entrySet()) {
415
                            String value = option.getKey();
416
                            String label = i18n.getTranslation(option.getValue());
417
                            availableValues.add(new DynObjectValueItem(value, label));
418
                        }
419
                    }
420
                    tags = field.getTags();
421
                    tags.set("ParamType", param.getType());
422
                    field.setAvailableValues(availableValues);
423
                    field.setDefaultFieldValue(param.getDefaultValue());
424
                    field.setMandatory(false);
425
                    break;
426
                case GEOMETRY:
427
                case SELECTION:
428
                case CLIPBOARD:
429
                    break;
430
            }
431
        }
432
        return def;
433
    }
434

  
435
    private void clear() {
436
        this.form.clear();
437
    }
438

  
439
    private void put(EditingService service) {
440
        if(this.service != service || service == null) {
441
            return;
442
        }
443

  
444
        List<ServiceParameterField> params = this.getServiceParameters(service); 
445
        for (ServiceParameterField param : params) {
446
            if(param.getIgnoreCurrentValue()){
447
                this.form.setValue(
448
                        param.getFieldName(), 
449
                        null
450
                );
451
                
452
            } else {
453
                this.form.setValue(
454
                        param.getFieldName(), 
455
                        service.getValue(param.getParameters(),param.getType())
456
                );
457
            }
458
        }
459
    }
460

  
461
    private boolean ignore_events = false;
462
    private void doServiceChanged(Notification notification) {
463
        if( ignore_events ) {
464
            return;
465
        }
466
        try {
467
            ignore_events = true;
468
            switch (notification.getType()) {
469
                case EditingService.PARAMETER_CHANGED2_NOTIFICATION:
470
                case EditingService.PARAMETER_CHANGED1_NOTIFICATION:
471
                    this.put(this.editingContext.getActiveService());
472
                    break;
473
                case EditingService.ACTIVATE_NOTIFICATION:
474
                    this.set(this.editingContext.getActiveService());
475
                    this.put(this.editingContext.getActiveService());
476
                    break;
477
                case EditingService.START_NOTIFICATION:
478
    //                this.clear();
479
                    break;
480
            }
481
        } finally {
482
            ignore_events = false;
483
        }
484
    }
485

  
486
    private void doContextChanged(Notification notification) {
487
        if (ignore_events) {
488
            return;
489
        }
490
        try {
491
            ignore_events = true;
492
            switch (notification.getType()) {
493
                case EditingContext.CHANGE_SELECTED_TOOL_NOTIFICATION:
494
                    EditingService activeService = this.editingContext.getActiveService();
495
                    this.set(activeService);
496
                    if (activeService != null) {
497
                        this.put(activeService);
498
                    }
499
                    break;
500

  
501
            }
502
        } finally {
503
            ignore_events = false;
504
        }
505
    }
506

  
507
    public void applyDefaultValues() {
508
        I18nManager i18n = ToolsLocator.getI18nManager();
509
        EditableFeature feature = this.service.getDefaultFeatureValues();
510
        this.featureform.fetch(feature);
511
        applyDefaultValuesButton.setIcon(null);
512
        defaultValues.put(this.service.getStore().getFullName(), feature.toJson());
513
    }
514
    
515
    public void resetDefaultValues() {
516
        try {
517
            FeatureStore store = this.service.getStore();
518
            EditableFeature resetValues = store.createNewFeature();
519
            EditableFeature feature = this.service.getDefaultFeatureValues();
520
            feature.copyFrom(resetValues);
521
            
522
            this.featureform.setFeature(feature);
523
            applyDefaultValuesButton.setIcon(null);
524
            defaultValues.put(this.service.getStore().getFullName(), feature.toJson());
525
        } catch (Exception ex) {
526
            LOGGER.warn("Can't reset default values",ex);
527
        }
528
    }
529
    
530
    public void applyOptions() {
531
        boolean ignore_events_save = this.ignore_events;
532
        try {
533
            this.ignore_events = true;
534
            List<ServiceParameterField> params = this.getServiceParameters(service);
535
            for (ServiceParameterField param : params) {
536
                Object value = this.form.getValue(param.getFieldName());
537
                try {
538
                    editingContext.setValue(param.getParameters(), value);
539
                } catch (Throwable th) {
540
                    LOGGER.debug("Can't set service parameter '" + param.getName() + "' to '" + Objects.toString(value) + "'.", th);
541
                }
542
            }
543
            try {
544
                editingContext.nextParameter();
545
            } catch (Exception ex) {
546
                LOGGER.debug("Can't apply service parameters.", ex);
547
            }
548
            this.acceptOptionsButton.setIcon(null);
549
        } finally {
550
            this.ignore_events = ignore_events_save;
551
        }
552
        this.put(service);
553
    }
554
    
555
    private static class ServiceParameterField {
556
        private final EditingServiceParameter param;
557
        private final EditingServiceParameter.TYPE type;
558
        private final String fieldName;
559
        private final boolean aditional;
560
        private boolean ignoreCurrentValue;
561
        
562
        public ServiceParameterField(
563
            EditingServiceParameter param,
564
            EditingServiceParameter.TYPE type,
565
            String fieldName,
566
            boolean aditional
567
            ) {
568
            this.aditional = aditional;
569
            this.fieldName = fieldName;
570
            this.param = param;
571
            this.type = type;
572
            this.ignoreCurrentValue = false;
573
        }
574

  
575
        private EditingServiceParameter.TYPE getType() {
576
            return this.type;
577
        }
578

  
579
        private String getName() {
580
            return this.param.getName();
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff