Revision 2681

View differences:

org.gvsig.vectorediting/tags/org.gvsig.vectorediting-1.0.156/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.156/org.gvsig.vectorediting.app/org.gvsig.vectorediting.app.mainplugin/buildNumber.properties
1
#Tue Jul 27 01:57:29 CEST 2021
2
buildNumber=165
org.gvsig.vectorediting/tags/org.gvsig.vectorediting-1.0.156/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.156/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.156/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.156/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.156/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
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
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.dynformfield.point;
25

  
26
import org.gvsig.fmap.geom.DataTypes;
27
import org.gvsig.tools.dynform.DynFormFieldDefinition;
28
import org.gvsig.tools.dynform.JDynFormField;
29
import org.gvsig.tools.dynform.spi.DynFormSPIManager;
30
import org.gvsig.tools.dynform.spi.dynformfield.AbstractJDynFormFieldFactory;
31

  
32
public class JDynFormFieldPointFactory extends AbstractJDynFormFieldFactory {
33

  
34
    public static final String NAME = "EditingPoint";
35
    
36
    public JDynFormFieldPointFactory() {
37
        super("POINT", DataTypes.GEOMETRY, "EditingPoint");
38
    }
39

  
40
    @Override
41
    public JDynFormField create(
42
            DynFormSPIManager serviceManager,
43
            DynFormSPIManager.ComponentsFactory componentsFactory,
44
            DynFormFieldDefinition fieldDefinition,
45
            Object value
46
    ) {
47
        return new JDynFormFieldPoint(serviceManager, componentsFactory, this, fieldDefinition, value);
48
    }
49
    
50
    @Override
51
    public int getPriority() {
52
        return 300;
53
    }
54
}
org.gvsig.vectorediting/tags/org.gvsig.vectorediting-1.0.156/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.156/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.util.ArrayList;
11
import java.util.HashMap;
12
import java.util.List;
13
import java.util.Map;
14
import java.util.Objects;
15
import javax.json.JsonObject;
16
import javax.swing.BoxLayout;
17
import javax.swing.ImageIcon;
18
import javax.swing.JButton;
19
import javax.swing.JLabel;
20
import javax.swing.JPanel;
21
import javax.swing.JTabbedPane;
22
import javax.swing.SwingConstants;
23
import org.gvsig.featureform.swing.JFeatureForm;
24
import org.gvsig.fmap.dal.DALLocator;
25
import org.gvsig.fmap.dal.DataTypes;
26
import org.gvsig.fmap.dal.exception.DataException;
27
import org.gvsig.fmap.dal.feature.EditableFeature;
28
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
29
import org.gvsig.fmap.dal.feature.FeatureStore;
30
import org.gvsig.fmap.dal.feature.FeatureType;
31
import org.gvsig.fmap.dal.feature.FeatureTypeDefinitionsManager;
32
import org.gvsig.fmap.dal.swing.DALSwingLocator;
33
import org.gvsig.fmap.dal.swing.DataSwingManager;
34
import org.gvsig.tools.ToolsLocator;
35
import org.gvsig.tools.dynform.DynFormDefinition;
36
import org.gvsig.tools.dynform.DynFormFieldDefinition;
37
import org.gvsig.tools.dynform.DynFormLocator;
38
import org.gvsig.tools.dynform.DynFormManager;
39
import org.gvsig.tools.dynform.JDynForm;
40
import org.gvsig.tools.dynform.JDynFormField;
41
import org.gvsig.tools.dynobject.DynClass;
42
import org.gvsig.tools.dynobject.DynField_v2;
43
import org.gvsig.tools.dynobject.DynObjectValueItem;
44
import org.gvsig.tools.dynobject.DynStruct_v2;
45
import org.gvsig.tools.dynobject.Tags;
46
import org.gvsig.tools.i18n.I18nManager;
47
import org.gvsig.tools.observer.Notification;
48
import org.gvsig.tools.observer.Observable;
49
import org.gvsig.tools.observer.Observer;
50
import org.gvsig.tools.swing.api.ToolsSwingLocator;
51
import org.gvsig.tools.swing.api.ToolsSwingUtils;
52
import org.gvsig.vectorediting.app.mainplugin.dynformfield.point.JDynFormFieldPointFactory;
53
import org.gvsig.vectorediting.lib.api.EditingService;
54
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
55
import org.gvsig.vectorediting.swing.api.EditingContext;
56
import org.slf4j.Logger;
57
import org.slf4j.LoggerFactory;
58

  
59
/**
60
 *
61
 * @author gvSIG Team
62
 */
63
@SuppressWarnings("UseSpecificCatch")
64
class EditingToolOptionsPanel extends JPanel {
65
    private static final Logger LOGGER = LoggerFactory.getLogger(EditingToolOptionsPanel.class);
66
    
67
    private final EditingContext editingContext;
68
    private EditingService service;
69
    private JDynForm form;
70
    private DynStruct_v2 definition;
71
    private final Observer contextObserver = (Observable observable, Object notification) -> {
72
        doContextChanged((Notification) notification);
73
    };
74
    private final Observer serviceObserver = (Observable observable, Object notification) -> {
75
        doServiceChanged((Notification) notification);
76
    };
77
    private JFeatureForm featureform;
78
    private JButton applyDefaultValuesButton;
79
    private ImageIcon confirmIcon;
80
    
81
    private static final Map<String, JsonObject> defaultValues = new HashMap<>();
82
    private JTabbedPane tab;
83
    private int currentTab;
84

  
85
    @SuppressWarnings(value = {"OverridableMethodCallInConstructor", "LeakingThisInConstructor"})
86
    public EditingToolOptionsPanel(EditingContext editingContext) {
87
        this.setLayout(new BorderLayout());
88
        this.editingContext = editingContext;
89
        this.editingContext.addObserver(this.contextObserver);
90
        this.set(editingContext.getActiveService());
91
        this.setPreferredSize(ToolsSwingUtils.ensureRowsCols(this, 10, 30));
92
        try {
93
            this.confirmIcon = ToolsSwingLocator.getIconThemeManager()
94
                    .getCurrent().get("vector-editing-tooloptions-confirm");
95
        } catch(Exception ex) {
96
            
97
        }
98
        this.currentTab = 0;
99
        LOGGER.info("Constructor currentTab = "+this.currentTab);
100
    }
101

  
102
    private void set(EditingService service) {
103
        if (this.service != null) {
104
            this.service.deleteObserver(this.serviceObserver);
105
        }
106
        I18nManager i18n = ToolsLocator.getI18nManager();
107
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
108
        if (service == null) {
109
            if(this.tab != null){
110
                this.currentTab = this.tab.getSelectedIndex();
111
                LOGGER.info("set with service==null currentTab = "+this.currentTab);
112
            }
113
            this.removeAll();
114
            this.tab = null;
115
            JLabel label = new JLabel(
116
                    "<html><center>" +
117
                    i18n.getTranslation("_Activate_an_editing_tool_to_see_your_options_here")+
118
                    "</center></html>"
119
            );
120
            label.setHorizontalAlignment(SwingConstants.CENTER);
121
            this.add(label, BorderLayout.CENTER);
122
        } else if( service != this.service ) {
123
            if(this.tab != null){
124
                this.currentTab = this.tab.getSelectedIndex();
125
                LOGGER.info("set with service==null currentTab = "+this.currentTab);
126
            }
127
            this.removeAll();
128
            this.tab = null;
129
            JPanel header = new JPanel();
130
            header.setLayout(new BoxLayout(header,BoxLayout.Y_AXIS));
131
            FeatureStore store = service.getStore();
132
            header.add(
133
                    new JLabel(
134
                            i18n.getTranslation("_Table")
135
                            + ": "
136
                            + (store == null ? "(unknown)" : store.getName())
137
                    )
138
            );
139
            header.add(
140
                    new JLabel(
141
                            i18n.getTranslation("_Tool")
142
                            + ": "
143
                            + i18n.getTranslation(service.getDescription())
144
                    )
145
            );
146
            this.add(header, BorderLayout.NORTH);
147

  
148
            this.tab = new JTabbedPane();
149
            tab.setTabPlacement(JTabbedPane.BOTTOM);
150
            tab.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
151
            
152
            this.add(tab, BorderLayout.CENTER);
153
            
154
            definition = this.getToolOptionsDefinition(service);
155
            if (definition != null) {
156
                DynFormManager dynFormManager = DynFormLocator.getDynFormManager();
157
                form = dynFormManager.createJDynForm(definition);
158

  
159
                JPanel optionsPanel = new JPanel();
160
                optionsPanel.setLayout(new BorderLayout());
161
                optionsPanel.add(form.asJComponent(), BorderLayout.CENTER);
162
                JButton cancelButton = new JButton(i18n.getTranslation("_Cancel"));
163
                cancelButton.addActionListener((e) -> {
164
                    editingContext.cancelActiveService();
165
                });
166
                JPanel cancelPanel = new JPanel();
167
                cancelPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
168
                cancelPanel.add(cancelButton);
169
                optionsPanel.add(cancelPanel, BorderLayout.PAGE_END);
170

  
171
                tab.add(i18n.getTranslation("_Options"), optionsPanel);
172
                this.currentTab = 0;
173

  
174
                this.form.addListener(new JDynForm.JDynFormListener() {
175
                    @Override
176
                    public void message(String message) {
177
                    }
178

  
179
                    @Override
180
                    public void fieldChanged(JDynFormField field) {
181
                        applyOptions();
182
                    }
183
                });
184
            }
185
            try {
186
                JsonObject xx = defaultValues.get(service.getStore().getFullName());
187
                EditableFeature f = service.getDefaultFeatureValues();
188
                if(xx != null){
189
                    f.copyFrom(xx);
190
                }
191
                DynFormDefinition formdef = this.createFormDefinition(service);
192
                this.featureform = dataSwingManager.createJFeatureForm(formdef);                
193
                this.featureform.getDynForm().setContext(dataSwingManager.createFeaturesFormContext(store));
194
                this.featureform.setFeature(f);
195
                JPanel valuesPanel = new JPanel();
196
                valuesPanel.setLayout(new BorderLayout());
197
                valuesPanel.add(featureform.asJComponent(), BorderLayout.CENTER);
198
                applyDefaultValuesButton = new JButton(i18n.getTranslation("_Apply"));
199
                applyDefaultValuesButton.addActionListener((e) -> { applyDefaultValues(); });
200
                JPanel applyPanel = new JPanel();
201
                applyPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
202
                applyPanel.add(applyDefaultValuesButton);
203
                valuesPanel.add(applyPanel, BorderLayout.PAGE_END);
204
                
205
                tab.add(i18n.getTranslation("_Default_values"), valuesPanel );
206
                this.currentTab = 1;
207
                
208
                featureform.getDynForm().addListener(new JDynForm.JDynFormListener() {
209
                    @Override
210
                    public void message(String message) {
211
                    }
212

  
213
                    @Override
214
                    public void fieldChanged(JDynFormField field) {
215
                        if(applyDefaultValuesButton != null){
216
                            applyDefaultValuesButton.setIcon(confirmIcon);
217
                        }
218
                    }
219
                });
220
                
221
            } catch (Exception ex) {
222
                LOGGER.debug("Can't create panel",ex);
223
            }
224
            ToolsSwingUtils.ensureRowsCols(this, 8, 43, 25, 60);
225
            LOGGER.info("set with service!=null currentTab = "+this.currentTab);
226
            tab.setSelectedIndex(this.currentTab);
227
            service.addObserver(this.serviceObserver);
228
        }
229
        this.service = service;
230
    }
231

  
232
    private DynFormDefinition createFormDefinition(EditingService service) throws DataException {
233
        FeatureTypeDefinitionsManager featureTypeDefinitionsManager = DALLocator.getFeatureTypeDefinitionsManager();
234
        
235
        FeatureStore store = service.getStore();
236
        FeatureType featureType = store.getDefaultFeatureType();
237
        DynClass dynClass = featureTypeDefinitionsManager.get(store,featureType);
238
        DynFormDefinition formdef = DynFormLocator.getDynFormManager().createDefinition(dynClass);
239
        for (FeatureAttributeDescriptor attr : featureType) {
240
            if( attr.isPrimaryKey() || attr.isReadOnly() ) {
241
                formdef.remove(attr.getName());
242
            }
243
        }
244
        for (DynFormFieldDefinition fielddef : formdef) {
245
            fielddef.setMandatory(false);
246
        }
247
        return formdef;
248
    }
249
    
250
    private DynStruct_v2 getToolOptionsDefinition(EditingService service) {
251
        if (service == null) {
252
            return null;
253
        }
254
        DynStruct_v2 def = (DynStruct_v2) ToolsLocator.getDynObjectManager().createDynClass(
255
                service.getName(), null
256
        );
257
        I18nManager i18n = ToolsLocator.getI18nManager();
258
        DynField_v2 field;
259
        Tags tags;
260
        for (ServiceParameterField param : this.getServiceParameters(service)) {
261
            switch(param.getType()) {
262
                case POSITION:
263
                    field = (DynField_v2) def.addDynField(param.getFieldName(), DataTypes.GEOMETRY);
264
                    field.setLabel(i18n.getTranslation(param.getName()));
265
                    field.setDescription(i18n.getTranslation(param.getDescription()));
266
                    field.setDefaultFieldValue(param.getDefaultValue());
267
                    tags = field.getTags();
268
                    tags.set("EditingContext", this.editingContext);
269
                    field.setSubtype(JDynFormFieldPointFactory.NAME);
270
                    field.setMandatory(false);
271
                    break;
272
                case LIST_POSITIONS:
273
                    field = (DynField_v2) def.addDynField(param.getFieldName(), DataTypes.GEOMETRY);
274
                    field.setLabel(i18n.getTranslation(param.getName()));
275
                    field.setDescription(i18n.getTranslation(param.getDescription()));
276
                    field.setDefaultFieldValue(param.getDefaultValue());
277
                    tags = field.getTags();
278
                    tags.set("EditingContext", this.editingContext);
279
                    field.setSubtype(JDynFormFieldPointFactory.NAME);
280
                    field.setMandatory(false);
281
                    break;
282
                case VALUE:
283
                    field = (DynField_v2) def.addDynFieldDouble(param.getFieldName());
284
                    if( param.isAditional() ) {
285
                        field.setLabel(i18n.getTranslation("_Value"));
286
                    } else {
287
                        field.setLabel(i18n.getTranslation(param.getName()));
288
                    }
289
                    field.setDescription(i18n.getTranslation(param.getDescription()));
290
                    field.setDefaultFieldValue(param.getDefaultValue());
291
                    field.setMandatory(false);
292
                    break;
293

  
294
                case DISTANCE:
295
                    field = (DynField_v2) def.addDynFieldDouble(param.getFieldName());
296
                    if( param.isAditional() ) {
297
                        field.setLabel(i18n.getTranslation("_Distance"));
298
                    } else {
299
                        field.setLabel(i18n.getTranslation(param.getName()));
300
                    }
301
                    field.setDescription(i18n.getTranslation(param.getDescription()));
302
                    field.setDefaultFieldValue(param.getDefaultValue());
303
                    field.setMandatory(false);
304
                    break;
305

  
306
                case OPTION:
307
                    field = (DynField_v2) def.addDynFieldString(param.getFieldName());
308
                    if( param.isAditional() ) {
309
                        field.setLabel(i18n.getTranslation("_Options"));
310
                    } else {
311
                        field.setLabel(i18n.getTranslation(param.getName()));
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff