Revision 442

View differences:

org.gvsig.scripting.app/trunk/org.gvsig.scripting.app/pom.xml
12 12
	
13 13
	<parent>
14 14
      <groupId>org.gvsig</groupId>
15
      <artifactId>org.gvsig.desktop.plugin</artifactId>
16
      <version>2.0.17-SNAPSHOT</version>
15
      <artifactId>org.gvsig.scripting</artifactId>
16
      <version>1.0.0-SNAPSHOT</version>
17 17
  	</parent>
18 18
	
19 19
	<scm>
......
22 22
        <url>https://devel.gvsig.org/redmine/projects/gvsig-scripting/repository/show/org.gvsig.scripting.app/trunk/org.gvsig.scripting.app</url>
23 23
    </scm>
24 24

  
25
	<developers>
26
		<developer>
27
			<id>jjdelcerro</id>
28
			<name>Joaqu?n Jos? del Cerro</name>
29
			<email>jjdelcerro@gvsig.org</email>
30
			<roles>
31
				<role>Architect</role>
32
				<role>Developer</role>
33
			</roles>
34
		</developer>
35
		<developer>
36
			<id>jbadia</id>
37
			<name>Jos? Bad?a</name>
38
			<email>badia_jos@gva.es</email>
39
			<roles>
40
				<role>Developer</role>
41
			</roles>
42
		</developer>
43
	</developers>
44 25

  
45 26
	<distributionManagement>
46 27
		<site>
......
48 29
			<url>dav:https://devel.gvsig.org/sites/org.gvsig.scripting.app/${project.version}</url>
49 30
		</site>
50 31
	</distributionManagement>
51
	<repositories>
52
		<repository>
53
			<id>gvsig-public-http-repository</id>
54
			<name>gvSIG maven public HTTP repository</name>
55
			<url>http://devel.gvsig.org/m2repo/j2se</url>
56
			<releases>
57
				<enabled>true</enabled>
58
				<updatePolicy>daily</updatePolicy>
59
				<checksumPolicy>warn</checksumPolicy>
60
			</releases>
61
			<snapshots>
62
				<enabled>true</enabled>
63
				<updatePolicy>daily</updatePolicy>
64
				<checksumPolicy>warn</checksumPolicy>
65
			</snapshots>
66
		</repository>
67
	</repositories>
68 32
	<build>
69 33
		<plugins>
70 34
            <plugin>
......
106 70
	</build>
107 71
	<dependencyManagement>
108 72
		<dependencies>
109
		
110
			<dependency>
111
				<groupId>org.gvsig</groupId>
112
				<artifactId>org.gvsig.scripting.lib.api</artifactId>
113
				<version>1.0.0-SNAPSHOT</version>
114
			</dependency>
115
			<dependency>
116
				<groupId>org.gvsig</groupId>
117
				<artifactId>org.gvsig.scripting.swing.api</artifactId>
118
				<version>1.0.0-SNAPSHOT</version>
119
			</dependency>
120
			<dependency>
121
				<groupId>org.gvsig</groupId>
122
				<artifactId>org.gvsig.scripting.lib.impl</artifactId>
123
				<version>1.0.0-SNAPSHOT</version>
124
			</dependency>
125
			<dependency>
126
				<groupId>org.gvsig</groupId>
127
				<artifactId>org.gvsig.scripting.swing.impl</artifactId>
128
				<version>1.0.0-SNAPSHOT</version>
129
			</dependency>
130
			
131
			<dependency>
132
				<groupId>org.gvsig</groupId>
133
				<artifactId>org.gvsig.scripting.main</artifactId>
134
				<version>1.0.0-SNAPSHOT</version>
135
			</dependency>
136
			
137
			<dependency>
138
				<groupId>org.gvsig</groupId>
139
				<artifactId>org.gvsig.scripting.thing</artifactId>
140
				<version>1.0.0-SNAPSHOT</version>
141
			</dependency>
142
			
143
			<dependency>
144
				<groupId>com.jeta</groupId>
145
				<artifactId>formsrt</artifactId>
146
				<version>2.1.0_M3</version>
147
			</dependency>
148
			<dependency>
149
				<groupId>com.fifesoft</groupId>
150
				<artifactId>rsyntaxtextarea</artifactId>
151
				<version>2.0.2</version>
152
			</dependency>			
153 73

  
154 74
		</dependencies>
155 75
	</dependencyManagement>
org.gvsig.scripting.app/trunk/org.gvsig.scripting.app/org.gvsig.scripting.app.extension/src/main/assembly/distribution.xml
1
<assembly>
2
	<id>distribution</id>
3
	<formats>
4
		<format>dir</format>
5
	</formats>
6
	<fileSets>
7
		<!-- Estructure for the extension -->
8
		<fileSet>
9
			<directory>src/main/resources-plugin</directory>
10
			<outputDirectory>${extension.install.dir.name}
11
			</outputDirectory>
12
		</fileSet>
13
	</fileSets>
14
	<files>
15
		<file>
16
			<source>package.info</source>
17
			<outputDirectory>${extension.install.dir.name}
18
			</outputDirectory>
19
		</file>
20
	</files>
21
	<dependencySets>
22
		<dependencySet>
23
			<outputDirectory>${extension.install.dir.name}/${library-dir}
24
			</outputDirectory>
25
			<includes>
26
				<include>org.gvsig:org.gvsig.scripting.app.extension</include>
27
                <include>com.fifesoft:rsyntaxtextarea</include>
28
                
29
				<!-- Only needed if we want to support Java 1.5
30
				<include>org.apache.bsf:bsf-api</include>
31
				-->
32
				
33
				<include>org.ini4j:ini4j</include>
34
				<include>org.codehaus.groovy:groovy-all</include>
35
				
36
				<!--
37
				JRuby doesn't work by default on gvSIG, maybe the problems are 
38
				related to the PluginClassLoader or to the way JRuby sets its
39
				internal classpath, so maybe setting the system property
40
				"org.jruby.embed.class.path" may solve the problem.
41
				See:
42
				http://kenai.com/projects/jruby/pages/RedBridge#Class_Path_%28Load_Path%29
43
				<include>org.jruby:jruby</include>
44
				-->
45
				
46
				<!-- Already included since Java 1.6
47
				<include>rhino:js</include>
48
				-->
49
				
50
				<include>com.jeta:formsrt</include>
51
				<include>commons-cli:commons-cli</include>
52
				<include>org.python:jython</include>
53
				<include>net.sourceforge.thinlet:thinlet</include>
54
				<include>org.gvsig:org.gvsig.scripting.thing</include>
55
				<include>org.gvsig:org.gvsig.scripting.lib.api</include>
56
				<include>org.gvsig:org.gvsig.scripting.swing.api</include>
57
				<include>org.gvsig:org.gvsig.scripting.lib.impl</include>
58
				<include>org.gvsig:org.gvsig.scripting.swing.impl</include>
59
				<include>org.gvsig:org.gvsig.scripting.main</include>
60
			</includes>
61
		</dependencySet>
62
	</dependencySets>
63
</assembly>
org.gvsig.scripting.app/trunk/org.gvsig.scripting.app/org.gvsig.scripting.app.extension/src/main/java/org/gvsig/scripting/app/extension/ScriptingExtension.java
24 24

  
25 25

  
26 26
import java.io.File;
27
import java.util.List;
27 28

  
28 29
import javax.swing.JOptionPane;
29 30

  
31
import org.gvsig.andami.IconThemeHelper;
30 32
import org.gvsig.andami.PluginsLocator;
31 33
import org.gvsig.andami.PluginsManager;
32 34
import org.gvsig.andami.plugins.Extension;
33 35
import org.gvsig.app.ApplicationLocator;
34 36
import org.gvsig.app.ApplicationManager;
35
import org.gvsig.installer.lib.spi.InstallerProviderLocator;
36 37
import org.gvsig.scripting.ScriptingBaseScript;
37 38
import org.gvsig.scripting.ScriptingLocator;
38 39
import org.gvsig.scripting.ScriptingManager;
39
import org.gvsig.scripting.app.extension.installer.ScriptingInstallerProviderFactory;
40 40
import org.gvsig.scripting.swing.api.JScriptingComposer;
41 41
import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
42 42
import org.gvsig.scripting.swing.api.ScriptingUIManager;
43 43
import org.gvsig.tools.dynobject.DynObject;
44
import org.gvsig.tools.service.spi.ProviderManager;
45 44
import org.gvsig.tools.swing.api.ToolsSwingLocator;
46 45
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
47 46
import org.gvsig.tools.swing.impl.windowmanager.DefaultWindowManager;
47
import org.slf4j.Logger;
48
import org.slf4j.LoggerFactory;
48 49

  
49 50
public class ScriptingExtension extends Extension {
50 51

  
51
//	private static Logger LOG = LoggerFactory.getLogger(ScriptingExtension.class);
52
	private static Logger logger = LoggerFactory.getLogger(ScriptingExtension.class);
52 53
	
53 54
	public void execute(String actionCommand) {
54 55
		this.execute(actionCommand,null);
......
58 59
	    ScriptingUIManager uimanager = ScriptingSwingLocator.getUIManager();
59 60
		WindowManager winmanager = ToolsSwingLocator.getWindowManager();
60 61
		
61
		if( "Launcher".equalsIgnoreCase(command) ) {
62
		if( "tools-scripting-launcher".equalsIgnoreCase(command) ) {
62 63
		    winmanager.showWindow(uimanager.createLauncher(), "Scripting Launcher", WindowManager.MODE.TOOL);
63 64
		    
64
		} else if( "Composer".equalsIgnoreCase(command) ) {
65
		} else if( "tools-scripting-composer".equalsIgnoreCase(command) ) {
65 66
			DynObject preferences = this.getPlugin().getPluginProperties();
66 67
			Boolean composerUseHisWindowManager = (Boolean) preferences.getDynValue("ComposerUseHisWindowManager");
67 68
			JScriptingComposer composer = uimanager.createComposer();
......
85 86
	}
86 87
	
87 88
	public void initialize() {
88
		// Do nothing
89

  
89
		IconThemeHelper.registerIcon("action", "tools-scripting-launcher", this);
90
		IconThemeHelper.registerIcon("action", "tools-scripting-composer", this);
91
		IconThemeHelper.registerIcon("action", "tools-scripting-console-jython", this);
90 92
	}
91 93
	
92 94
	public void postInitialize() {
......
97 99
	    File home = this.getPlugin().getPluginHomeFolder();
98 100
	    manager.setHomeFolder(home);
99 101
    	
100
	    File[] folders = pluginManager.getPluginsFolder().listFiles();
101
	    for (File folder : folders) {
102
		    File scriptsFolder = new File(folder,"scripting/scripts");
103
		    if( scriptsFolder.exists() ) {
104
		    	manager.registerSystemFolder(folder.getName(), scriptsFolder);
105
		    }
106
		    File libFolder = new File(folder,"scripting/lib");
107
		    if( libFolder.exists() ) {
108
		    	manager.addLibFolder(libFolder);
109
		    }
110
		}
102
	    List<File> pluginsFolders = pluginManager.getPluginsFolders();
103
	    for( File pluginsFolder : pluginsFolders ) {
104
		    File[] folders = pluginsFolder.listFiles();
105
		    for (File folder : folders) {
106
			    File scriptsFolder = new File(folder,"scripting/scripts");
107
			    if( scriptsFolder.exists() ) {
108
			    	manager.registerSystemFolder(folder.getName(), scriptsFolder);
109
			    }
110
			    File libFolder = new File(folder,"scripting/lib");
111
			    if( libFolder.exists() ) {
112
			    	manager.addLibFolder(libFolder);
113
			    }
114
			}
115
	    }
116
	    File autorun_file = null;
117
	    ScriptingBaseScript autorun = null;
118
	    for( File pluginsFolder : pluginsFolders ) {
119
		    File[] folders = pluginsFolder.listFiles();
120
		    for (File folder : folders) {
121
		    	autorun_file = new File(folder,"scripting/scripts/autorun.inf");
122
			    if( autorun_file.exists() ) {
123
			    	autorun = manager.getScript(autorun_file);
124
			    	try {
125
			    		autorun.run();
126
			    	} catch(Exception ex) {
127
			    		logger.warn("Can't execute autorun from '"+autorun_file.getAbsolutePath()+"'.",ex);
128
			    	}
129
			    }
130
			}
131
	    }
132
    	try {
133
    		autorun_file = new File( manager.getRootUserFolder(),"autorun.inf" );
134
    		if( autorun_file.exists() ) {
135
	    	    autorun = (ScriptingBaseScript) manager.getUserFolder().getUnit(new File("autorun.inf"));
136
	    	    if( autorun!=null) {
137
	    	    	autorun.run();
138
	    	    }
139
    		}
140
    	} catch(Exception ex) {
141
    		logger.warn("Can't execute autorun in home.",ex);
142
    	}
143

  
111 144
	    /*
112 145
	     * 
113 146
	    ProviderManager providerManager = InstallerProviderLocator.getProviderManager();
org.gvsig.scripting.app/trunk/org.gvsig.scripting.app/org.gvsig.scripting.app.extension/src/main/resources-plugin/scripting/lib/gvsig21/table.py
1

  
2

  
3
__docformat__ = "restructuredtext en"
4

  
5

  
6
from org.gvsig.app.project.documents.table import TableDocument as JTableDocument
7

  
8

  
9
class DataTable(object):
10
  """
11
  This is the base class to TableDocument_ and LayerVectorial_
12
  
13
  .. _TableDocument : FIXME_URL
14
  .. _LayerVectorial : FIXME_URL
15
  """
16

  
17
  def features(self, filter = None, sortby="", asc=True):
18
    """
19
    Return a set of features
20
    
21
    Opcionalmente puede especificarse una expresion de filtrado,
22
    los campos por los que se quiere que se ordene y si este
23
    orden es ascendente o descendente.
24
    
25
    :paramters:
26
      filter : string
27
        es una expresion que deben cumplir los registros de la tabla a devolver.
28
      sortby : string
29
        es una lista de nombres de campos de la tabla por los que queremos que 
30
        se ordene separados por comas. 
31
      asc : boolean
32
        True para ordenar de forma ascendente, que es el valor por defecto, 
33
        False para ordenar descendentemete.
34
    
35
    :return:
36
      the set of features.
37
    :returntype:
38
      FeatureSet_
39
    .. _FeatureSet : FIXME_URL
40
    """
41
    return self.getFeatureStore().features(filter, sortby, asc)
42

  
43
  def edit(self):
44
    """
45
    Set the data table in edition mode
46
    """
47
    self.getFeatureStore().edit() 
48
     
49
  def append(self, *valuesList, **values):
50
    """
51
    Creates a new feature.
52
    
53
    Creates a new feature from given values and insert it in the feature set.
54
    
55
    This method can receibe as parameters a list of pair name=value where name
56
    is the name of an attribute of the feature and value the value of this attribute.
57
    
58
    Alternativement can receibe a list of values that can be asigned to the attributes
59
    of the feature in sequential order.
60

  
61
    The changes are delayed until the method commit is invoked.
62
    If calling the method abort the changes arent discarded.    
63

  
64
    """
65
    self.getFeatureStore().append(*valuesList, **values)
66
    
67
  def updateSchema(self, schema):
68
    """
69
    Updates the schema of the DataTable.
70
    """
71
    self.getFeatureStore().updateSchema(schema)
72
    
73
  def update(self, feature):
74
    """
75
    Updates the feature in the DataTable.
76
    
77
    If the feature exists in the DataTable this is updated with the
78
    values of the feature pased as parameter.
79

  
80
    The feature changes are delayed until the method commit is invoked.
81
    If calling the method abort the changes arent discarded.
82
    
83
    :Parameters:
84
      feature : EditableFeature_
85
        the feature to be updated.
86
    """
87
    self.getFeatureStore().update(feature)
88
  
89
  def getSchema(self):
90
    """
91
    Returns schema of the DataTable.
92
    
93
    The schema of the DataTable constains information about the columns of 
94
    the DataTable, name, type, mandatory...
95
    """
96
    return self.getFeatureStore().getSchema()
97

  
98
  def commit(self):
99
    """
100
    Saves all changes pending in the DataTable.
101
    """
102
    self.getFeatureStore().commit()
103
  
104
  def abort(self):
105
    """
106
    Discard all pending changes in the DataTable.
107
    """
108
    self.getFeatureStore().abort()
109

  
110
  def getSelection(self):
111
    """
112
    Returns features selected set
113
    """
114
    return self.getFeatureStore().getFeatureSelection()
115
    
116
  def select(self, selection):
117
    """
118
    Inserts features in the features selection set
119
    """
120
    self.getSelection().select(selection)
121

  
122
  def deselect(self, selection):
123
    """
124
    Remove features in the features selection set
125
    """
126
    self.getSelection().deselect(selection)
127

  
128
  def isSelected(feature):
129
    """Returns True if given feature is selected"""
130
    self.getSelection().isSelect(feature)
131

  
132

  
133
class TableDocument(JTableDocument, DataTable):
134
  """
135
  Represents gvSIG view document 
136

  
137
  Extends the `java TableDocument`_
138
  
139
  .. _`java TableDocument` : FIXME_URL
140
  """
141
  
142
  def getFeatureStore(self):
143
    """
144
    Returns the FeatureStore_ associted to this TableDocument.
145
    
146
    :return:
147
      The FeatureStore_ associated to the TableDocument
148
    :returntype:
149
      FeatureStore_
150
    .. _FeatureStore : FIXME_URL
151
    """
152
    return self.getStore()
153

  
154

  
155
  def __call__(self):
156
    """
157
    Return the java object represented by this object.
158
    
159
    This method is for compatibility with scripting API of gvSIG 2.0
160
    
161
    :ReturnType:
162
      TableDocument
163
    :deprecated: 
164
      With gvSIG 2.1 the call this method isn't necesary
165
      
166
    """
167
    return self
168
    
169

  
170

  
171
#
172
# Inject new methods in the class JTableDocument
173
#
174
JTableDocument.getFeatureStore = TableDocument.getFeatureStore
175
JTableDocument.__call__ = TableDocument.__call__
176
JTableDocument.features = DataTable.features
177
JTableDocument.edit = DataTable.edit
178
JTableDocument.append = DataTable.append
179
JTableDocument.updateSchema = DataTable.updateSchema
180
JTableDocument.update = DataTable.update
181
JTableDocument.getSchema = DataTable.getSchema
182
JTableDocument.commit = DataTable.commit
183
JTableDocument.abort = DataTable.abort
184
JTableDocument.getSelection = DataTable.getSelection
185
JTableDocument.select = DataTable.select
186
JTableDocument.deselect = DataTable.deselect
187
JTableDocument.isSelected = DataTable.isSelected
188

  
189

  
org.gvsig.scripting.app/trunk/org.gvsig.scripting.app/org.gvsig.scripting.app.extension/src/main/resources-plugin/scripting/lib/gvsig21/view.py
1

  
2

  
3
__docformat__ = "restructuredtext en"
4

  
5

  
6
from org.gvsig.app.project.documents.view import DefaultViewDocument as JViewDocument
7

  
8
class ViewDocument(JViewDocument):
9
  """
10
  
11
  Represents gvSIG view document 
12
  
13
  Extends the java class DefaultViewDocument_
14
  
15
  .. _DefaultViewDocument : FIXME_URL
16
  """
17

  
18
  def getLayer(self, name=None):
19
    """
20
    Return a layer of the view document.
21
    
22
    If don't pecified a layer name, return the current layer of
23
    the view. If has more than one active layer return None.
24
    If spacified a layer name and exists a layer with this name,
25
    return this, otherwise return None.
26
     
27
    :parameters:
28
      name : string
29
        optional name of the layer to retrieve, if not pased return active layer.
30
    :returns:
31
      the layer or None
32
    :returntype:
33
      Layer_
34
    .. _layer : FIXME_URL
35
    """
36
    mapContext = self.getMapContext();
37
    if name == None:
38
      activeLayers = mapContext.getLayers().getActives()
39
      if len(activeLayers) != 1 :
40
        return None
41
      for layer in activeLayers:
42
        if not isinstance(layer, FLayers):
43
          return layer
44
      return None
45
    layers = self.getLayers()
46
    for i in xrange(layers.getLayersCount()):
47
      layer = layers.getLayer(i)
48
      if layer.name == name:
49
        return layer
50
    return None
51
  
52
  def getMap(self):
53
    """
54
    Return the map definition asociated to the view.
55
    
56
    This contains the layers, projection and definition
57
    of the area to view.
58
    
59
    :returns:
60
      the map definition
61
    :returntype:
62
      MapContext_
63
    
64
    .. _MapContext : FIXME_URL
65
    """
66
    return self.getMapContext();
67
 
68
  def addLayer(self, layer):
69
    """
70
    Add a new layer to the view.
71
    
72
    Don't return any thing.
73
    
74
    :parameters:
75
      layer : Layer_
76
        the layer to add to the view
77
        
78
    .. _Layer : FIXME_URL
79
    """
80
    self.getMapContext().getLayers().addLayer(layer)
81
  
82
  def getLayers(self):
83
    """
84
    Return a iterable set of \p Layers from the view.
85
    
86
    :returns:
87
      a Layers object
88
    :returntype:
89
      Layers_
90
    
91
    .. _Layers : FIXME_URL
92
    """
93
    mapContext = self.getMapContext()
94
    return mapContext.getLayers()
95

  
96
  def getGraphicsLayer(self):
97
    """
98
    Return the graphics layer of the view.
99
    
100
    :returns:
101
      a the graphics layer
102
    :returntype:
103
       DefaultGraphicLayer_
104
       
105
    .. _DefaultGraphicLayer : FIXME_URL
106
    """    
107
    return self.getMapContext().getGraphicsLayer()
108

  
109
  def getProjectionCode(self):
110
    """
111
    Returns Project projection code name of the view as a string. 
112
    
113
    :return:
114
      the projection code as a string.
115
    :returntype:
116
      String
117
    """  
118
    return self.getProjection().getFullCode()
119
    
120
  def isProjected(self):
121
    """
122
    Returns if the coordinate system of the view is projected.
123
    
124
    :return:
125
      true if the coordinate system of the view is projected, otherwise return false.
126
    :returntype:
127
      boolean
128
    """  
129
    self.getProjection().isProjected()
130

  
131
  def __call__(self):
132
    """
133
    Return the java object represented by this object.
134
    
135
    This method is for compatibility with scripting API of gvSIG 2.0
136
    
137
    :ReturnType:
138
      ViewDocument
139
    :deprecated: 
140
      With gvSIG 2.1 the call this method isn't necesary
141
      
142
    """
143
    return self
144
    
145

  
146
   
147
#
148
# Inject new methods in the class JViewDocument
149
#
150
JViewDocument.getLayer = ViewDocument.getLayer
151
JViewDocument.getMap = ViewDocument.getMap
152
JViewDocument.addLayer = ViewDocument.addLayer
153
JViewDocument.getGraphicsLayer = ViewDocument.getGraphicsLayer
154
JViewDocument.getProjectionCode = ViewDocument.getProjectionCode
155
JViewDocument.isProjected = ViewDocument.isProjected
156
JViewDocument.__call__ = ViewDocument.__call__
157

  
158

  
org.gvsig.scripting.app/trunk/org.gvsig.scripting.app/org.gvsig.scripting.app.extension/src/main/resources-plugin/scripting/lib/gvsig21/store.py
1

  
2
from org.gvsig.fmap.dal.feature.impl import DefaultFeatureStore
3

  
4
class FeatureStore(DefaultFeatureStore):
5
  """Represents gvsig store. It's used as Table/Layer objects store  
6
  (org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore)
7
  """
8
  def __init__(self,store):
9
    WrapperToJava.__init__(self, store)
10
    #self.data = None
11
    self.fset = None
12
  
13
  def features(self, expresion = None, sortBy="", asc=True):
14
    """Returns layer features set (FeatureSet class), with all layer features, 
15
    or selected featured if there are (could be empty feature set) or None if
16
    gets an Exception.
17
    :param expresion: filter to apply to the feature set to select
18
        determinates features that match with expression
19
    :type expresion: string
20
    :param sortBy: name of attribute to sort
21
    :type sortby: string
22
    :param: asc: order
23
    :type asc: boolean
24
    :return: FeatureSet
25
    """   
26
    if expresion == None and sortBy =="":
27
      self.fset = self.getFeatureSet()         
28
    else:
29
      try:
30
        application = ApplicationLocator.getManager()
31
        datamanager =  application.getDataManager()
32
        query = self.createFeatureQuery()
33
        if sortBy != "":
34
            order = FeatureQueryOrder()
35
            order.add(sortBy, asc)
36
            query.setOrder(order)
37
        if expresion != None:
38
            query.setFilter(datamanager.createExpresion(expresion))
39
        self.fset = self.getFeatureSet(query)
40
      except Exception, e:
41
        return None
42
    
43
    return FeatureSet(self.fset)    
44

  
45
  def edit(self):
46
    """Set store in edition mode"""     
47
    if not self.isEditing():
48
        self().edit() 
49
     
50
  def append(self, *valuesList, **values):
51
    """
52
    Creates a new feature from given values and insert it in the feature 
53
    set. If an error occurs raises RuntimeException.
54
    :param values: dictionary with name property value or list named params
55
    :type values: dict
56
    """
57
    try:
58
      if len(valuesList) ==1:
59
        values.update(valuesList[0])
60
      
61
      if not self.isEditing():
62
        self.edit() 
63
      f = self.createNewFeature()
64
      
65
      if f == None:
66
        raise RuntimeError("Failed to create a new Feature")
67
      for k,v in values.iteritems():
68
        f.set(k,v)
69
        self.insert(f)
70
    except Throwable, ex:
71
      raise RuntimeException("Can't append values %s to layer %s (%s)" % (
72
        repr(values), 
73
        self.getName(), 
74
        str(ex)
75
        )
76
      )
77

  
78
  def updateSchema(self, schema):
79
    """
80
    Updates store FeatureType. If an error occurs raises 
81
    RuntimeException.
82
    """
83
    try:
84
      self().update(schema._javaobj)
85
    except Throwable, ex:
86
      raise RuntimeException(repr(ex))
87
    
88
  def update(self, feature):
89
    """
90
    Updates exist feature in the layer featureSet
91
    :param editableFeature: editableFeature
92
    :type editableFeature: Java editableFeature
93
    """
94
    if not self.isEditing():
95
      self.edit() 
96
    
97
    if not isinstance(feature, EditableFeature):
98
      feature = feature._javaobj
99
    self.fset.update(feature)
100
  
101
  def getSchema(self):
102
    """Returns store data attributtes"""
103
    return Schema(self.getDefaultFeatureType())
104

  
105
  def commit(self):
106
    """
107
    Finish store edition saving changes. If an error occurs raises Throwable 
108
    Exception.
109
    """
110
    try:
111
      self.finishEditing()          
112
    except Throwable, ex:
113
      self.abort()
114
      raise Throwable("Can't finish layer edition, cancelling changes. %s" % repr(ex))
115
  
116
  def abort(self):
117
    """Finish store edition withoout saving changes and disposes itself"""
118
    self.cancelEditing() 
119
    self.dispose()
120

  
121
  def getSelection(self):
122
    """Returns store features selected set"""
123
    return FeatureSet(self().getSelection())
124

  
125

  
org.gvsig.scripting.app/trunk/org.gvsig.scripting.app/org.gvsig.scripting.app.extension/src/main/resources-plugin/scripting/lib/gvsig21/__init__.py
1

  
2

  
3
from project import Project, currentProject, currentDocument, currentView, currentTable
4
from table import TableDocument
5
from view import ViewDocument, currentLayer
6
from vectorial import Feature, Featureset, FeatureStore, LayerVectorial, Schema, Selection
7

  
8

  
org.gvsig.scripting.app/trunk/org.gvsig.scripting.app/org.gvsig.scripting.app.extension/src/main/resources-plugin/scripting/lib/gvsig21/layers.py
1

  
2

  
3
__docformat__ = "restructuredtext en"
4

  
5
from org.gvsig.fmap.mapcontext.layers import FLayers as JLayers
6

  
7
class Layers(JLayers):
8
  """
9
  Set of layers.
10
  
11
  Extends the `java FLayers`_.
12
  
13
  .. _`java FLayers` : FIXME_URL
14
  """
15

  
16
  def __len__(self):
17
    """
18
    Allow get the len of the set of layers in a python maner.
19
    
20
    :return:
21
      The len of the set of layers
22
    :returntype:
23
      int
24
    """
25
    return self.getLayersCount()
26

  
27
  def __getitem__(self, index):
28
    """
29
    Allow get items of the set of layers in a python maner.
30
    
31
    It return the layer of position *index* of the set of layers.
32

  
33
    :return:
34
      The layer requiered of the set.
35
    :returntype:
36
      Layer_
37
    .. _Layer : FIXME_URL
38
    """
39
    return self.getLayer(index)
40

  
41
  def __iter__(self):
42
    """
43
    Allow iterate over the set of layers in a python maner.
44
    
45
    Return an iterator over the set of layers.
46
    
47
    :return:
48
      The layers iterator
49
    :returntype:
50
      LayersIterator
51
    """
52
    return LayersIterator(self)
53
    
54

  
55
  def __call__(self):
56
    """
57
    Return the java object represented by this object.
58
    
59
    This method is for compatibility with scripting API of gvSIG 2.0
60
    
61
    :ReturnType:
62
      Layers
63
    :deprecated: 
64
      With gvSIG 2.1 the call this method isn't necesary
65
      
66
    """
67
    return self
68

  
69

  
70
class LayersIterator(object):
71
  """
72
  Iterator over a set of layers.
73
  
74
  This class can't be created, is used internaly by the class Layers
75
  when a iterator is required.
76
  """
77

  
78
  def __init__(self,layers):
79
    self.__layers = layers
80
    self.__index = -1
81

  
82
  def next(self):
83
    self.__index+=1
84
    if self.__index >= self.__layers.getLayersCount() :
85
      raise StopIteration()
86
    return self.__layers.getLayer(self.__index)
87

  
88
#
89
# Inject new methods in the class JLayers
90
#
91
JLayers.__call__ = Layers.__call__
92
JLayers.__len__ = Layers.__len__
93
JLayers.__getitem__ = Layers.__getitem__
94
JLayers.__iter__ = Layers.__iter__
95

  
org.gvsig.scripting.app/trunk/org.gvsig.scripting.app/org.gvsig.scripting.app.extension/src/main/resources-plugin/scripting/lib/gvsig21/vectorial/featurestore.py
1

  
2
from org.gvsig.fmap.dal.feature.impl import DefaultFeatureStore
3

  
4
class FeatureStore(DefaultFeatureStore):
5
  """Represents gvsig store. It's used as Table/Layer objects store  
6
  (org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore)
7
  """
8
  def __init__(self,store):
9
    WrapperToJava.__init__(self, store)
10
    #self.data = None
11
    self.fset = None
12
  
13
  def features(self, expresion = None, sortBy="", asc=True):
14
    """Returns layer features set (FeatureSet class), with all layer features, 
15
    or selected featured if there are (could be empty feature set) or None if
16
    gets an Exception.
17
    :param expresion: filter to apply to the feature set to select
18
        determinates features that match with expression
19
    :type expresion: string
20
    :param sortBy: name of attribute to sort
21
    :type sortby: string
22
    :param: asc: order
23
    :type asc: boolean
24
    :return: FeatureSet
25
    """   
26
    if expresion == None and sortBy =="":
27
      self.fset = self.getFeatureSet()         
28
    else:
29
      try:
30
        application = ApplicationLocator.getManager()
31
        datamanager =  application.getDataManager()
32
        query = self.createFeatureQuery()
33
        if sortBy != "":
34
            order = FeatureQueryOrder()
35
            order.add(sortBy, asc)
36
            query.setOrder(order)
37
        if expresion != None:
38
            query.setFilter(datamanager.createExpresion(expresion))
39
        self.fset = self.getFeatureSet(query)
40
      except Exception, e:
41
        return None
42
    
43
    return FeatureSet(self.fset)    
44

  
45
  def edit(self):
46
    """Set store in edition mode"""     
47
    if not self.isEditing():
48
        self().edit() 
49
     
50
  def append(self, *valuesList, **values):
51
    """
52
    Creates a new feature from given values and insert it in the feature 
53
    set. If an error occurs raises RuntimeException.
54
    :param values: dictionary with name property value or list named params
55
    :type values: dict
56
    """
57
    try:
58
      if len(valuesList) ==1:
59
        values.update(valuesList[0])
60
      
61
      if not self.isEditing():
62
        self.edit() 
63
      f = self.createNewFeature()
64
      
65
      if f == None:
66
        raise RuntimeError("Failed to create a new Feature")
67
      for k,v in values.iteritems():
68
        f.set(k,v)
69
        self.insert(f)
70
    except Throwable, ex:
71
      raise RuntimeException("Can't append values %s to layer %s (%s)" % (
72
        repr(values), 
73
        self.getName(), 
74
        str(ex)
75
        )
76
      )
77

  
78
  def updateSchema(self, schema):
79
    """
80
    Updates store FeatureType. If an error occurs raises 
81
    RuntimeException.
82
    """
83
    try:
84
      self().update(schema._javaobj)
85
    except Throwable, ex:
86
      raise RuntimeException(repr(ex))
87
    
88
  def update(self, feature):
89
    """
90
    Updates exist feature in the layer featureSet
91
    :param editableFeature: editableFeature
92
    :type editableFeature: Java editableFeature
93
    """
94
    if not self.isEditing():
95
      self.edit() 
96
    
97
    if not isinstance(feature, EditableFeature):
98
      feature = feature._javaobj
99
    self.fset.update(feature)
100
  
101
  def getSchema(self):
102
    """Returns store data attributtes"""
103
    return Schema(self.getDefaultFeatureType())
104

  
105
  def commit(self):
106
    """
107
    Finish store edition saving changes. If an error occurs raises Throwable 
108
    Exception.
109
    """
110
    try:
111
      self.finishEditing()          
112
    except Throwable, ex:
113
      self.abort()
114
      raise Throwable("Can't finish layer edition, cancelling changes. %s" % repr(ex))
115
  
116
  def abort(self):
117
    """Finish store edition withoout saving changes and disposes itself"""
118
    self.cancelEditing() 
119
    self.dispose()
120

  
121
  def getSelection(self):
122
    """Returns store features selected set"""
123
    return FeatureSet(self().getSelection())
124

  
125
        
126
class FeatureSet(WrapperToJava):
127
  """Represents gvSIG FeatureSet 
128
  (org.gvsig.fmap.dal.feature.impl.featureset.DefaultFeatureSet)
129
  """
130
  def __init__(self,featureSet):
131
    WrapperToJava.__init__(self,featureSet)
132
    
133
  def getCount(self):
134
    """Returns the number of elements in the featureSet"""
135
    return self.getSize()
136
  
137
  def update(self, feature):
138
    """
139
    Updates exist feature in the featureSet
140
    :param editableFeature: editableFeature
141
    :type editableFeature: Java editableFeature
142
    """
143
    if not isinstance(feature, EditableFeature) and \
144
            not isinstance(feature, DefaultEditableFeature):
145
      feature = feature._javaobj
146
    self().update(feature)
147
  
148
  def __iter__(self):
149
    return  Iterator(self.fastIterator())
150
    
151
class Selection(FeatureSet):
152
  """Manage selected features set from a store. Represents gvSIG 
153
  org.gvsig.fmap.dal.feature.impl.DefaultFeatureSelection.  
154
  """
155
  def __init__(self, featureSet):
156
    FeatureSet.__init__(self, featureSet)
157
      
158
  def select(self, selection):
159
    """Inserts features in the features selection set"""
160
    if isinstance(selection,Feature) or isinstance(selection, FeatureSet):
161
      self._javaobj.select(selection._javaobj)
162
    else:
163
      self._javaobj.select(selection)
164

  
165
  def deselect(self, selection):
166
    """Removes features in the features selection set"""
167
    if isinstance(selection,Feature) or isinstance(selection, FeatureSet):
168
      self._javaobj.deselect(selection._javaobj)
169
    else:
170
      self._javaobj.deselect(selection)
171

  
172
  def isSelected(feature):
173
    """Returns True if given feature is selected"""
174
    if isinstance(feature, Feature):
175
      self._javaobj.isSelect(feature._javaobj)
176
    else:
177
      self._javaobj.isSelect(feature)
178
      
179
  def getCount(self):
180
    """Returns the number of elements in the selection"""
181
    return self.getSelectedCount()
182
    
183
class Feature(WrapperToJava):
184
  """Represents feature data It's a wrapper from gvSIG 
185
  org.gvsig.fmap.dal.feature.impl.DefaultFeature class
186
  """
187
  def __init__(self,feature):
188
    WrapperToJava.__init__(self,feature)
189
    self.featureNoEditable = None
190

  
191
  def geometry(self):
192
    """Returns feature geometry"""
193
    return self.getDefaultGeometry()
194
   
195
  def getValues(self):
196
    """Returns dictionary with the pair name, value, feature attributes"""
197
    descriptor = self.getType()
198
    items = dict()
199
    for attr in descriptor.getAttributeDescriptors():
200
      name = attr.getName()
201
      value = self.get(attr.getName())
202
      items[name] = value
203
    return items 
204
  
205
  def edit(self):
206
    """Returns editable feature instance"""
207
    if not isinstance(self._javaobj, EditableFeature):
208
      self.featureNoEditable = self._javaobj
209
      self._javaobj = self._javaobj.getEditable()
210
  
211
  def __getitem__(self,key):
212
    return self.get(key)
213
  
214
  def __getattr__(self,name):
215
    #
216
    #FIX console error when try to introspect feature object
217
    if name in ('__methods__'):
218
        return dict()
219
    elif name in ('__members__'):
220
        return self.getValues().keys()
221
    elif name == '__dict__':
222
        return self.getValues()      
223
        
224
    try:
225
      v = getattr(self._javaobj, name, None)
226
      if v == None:
227
        v = self().get(name)        
228
      return v
229
    except Throwable, ex:
230
      raise RuntimeException("Can't access to attribute %s of feature (%s)" % (name, str(ex)))    
231

  
232
class Schema(WrapperToJava):
233
  """Stores data properties definition. Represents gvSIG FeatureType
234
  (org.gvsig.fmap.dal.feature.impl.DefaultFeatureType)
235
  """
236

  
237
  def __init__(self, featureType):
238
    WrapperToJava.__init__(self,featureType)
239
    self.featureTypeNoEditable = None
240
  
241
  def append(self, name, type, size=None, default=None, precision=4):
242
    """Adds new property to feature properties definition. If error occurs 
243
    raises RuntimeError.    
244
    :param name: Feature property name
245
    :type name: String
246
    :param type: Feature property type
247
    :type name: String
248
    :param size: Feature property size
249
    :type size: int
250
    :param default: Feature property default value
251
    :return: new atribute
252
    """
253
    if not isinstance(self._javaobj, EditableFeatureType):
254
        self.modify()
255
    
256
    if isinstance(type, str):
257
      try:
258
        application = ApplicationLocator.getManager()
259
        datamanager =  application.getDataManager()
260
        dataTypes = application.getDataTypesManager()
261
        type = dataTypes.getType(type) #dataType constant value from string
262
      except:
263
        raise RuntimeError(
264
            "Feature Property Data type (%s) is not valid.  name=%s, type=%s, size=%s, default=%s)" % (
265
                type, 
266
                name, 
267
                type, 
268
                size, 
269
                default
270
            )
271
        )
272
    if isinstance(type, int):
273
      try:
274
        type = dataTypes.get(type)
275
      except:
276
        raise RuntimeError(
277
            "Data type (%s) is not valid.  name=%s, type=%s, size=%s, default=%s)" % (
278
                type, 
279
                name, 
280
                type, 
281
                size, 
282
                default
283
            )
284
        )
285
      
286
    attribute = self.add(name, type.getType())
287
 
288
    if size != None: 
289
      attribute.setSize(size)
290
    
291
    if default != None:
292
      attribute.setDefaultValue(default)
293
      
294
    if precision != None and type.getType() in (DataTypes.DOUBLE, DataTypes.FLOAT):
295
      attribute.setPrecision(precision)
296
    
297
    if type.getType() == DataTypes.GEOMETRY and self.getDefaultGeometryAttributeName()==None:
298
      self.setDefaultGeometryAttributeName(name)
299
    
300
    return attribute
301

  
302
  def __getitem__(self, name):
303
    return self.getAttributeDescriptor(name)
304

  
305
  def get(self, name, default=None):
306
    """Returns a feature attribute descriptor that contains information about 
307
    one feature attribute, such as its name, data type or precision. 
308
    :param name: Attribute name
309
    :type name: string
310
    :param default: Value to return if no attribute name found. 
311
    :return: AttributeDescriptor
312
    """
313
    x = self.getAttributeDescriptor(name)
314
    if x == None:
315
      return default
316
    return x
317
  
318
  def getAttrNames(self):
319
    """Returns a list with attributes names"""
320
    if not self.getAttributeDescriptors():
321
      return None
322
        
323
    return [attr.getName() for attr in self.getAttributeDescriptors()]
324
    
325
    
326
  def getCopy(self):
327
    """Returns a itself clone"""
328
    return Schema(self().getCopy())
329
  
330
  def modify(self):
331
    """Sets edit mode"""
332
    if not isinstance(self._javaobj, EditableFeatureType):
333
      self.featureTypeNoEditable = self._javaobj
334
      self._javaobj = self._javaobj.getEditable()
335

  
org.gvsig.scripting.app/trunk/org.gvsig.scripting.app/org.gvsig.scripting.app.extension/src/main/resources-plugin/scripting/lib/gvsig21/vectorial/feature.py
1

  
2
from org.gvsig.fmap.dal.feature.impl import DefaultFeature as JFeature
3

  
4
class Feature(JFeature):
5
  """Represents feature data It's a wrapper from gvSIG 
6
  """
7
  def __init__(self,feature):
8
    WrapperToJava.__init__(self,feature)
9
    self.featureNoEditable = None
10

  
11
  def geometry(self):
12
    """Returns feature geometry"""
13
    return self.getDefaultGeometry()
14
   
15
  def getValues(self):
16
    """Returns dictionary with the pair name, value, feature attributes"""
17
    descriptor = self.getType()
18
    items = dict()
19
    for attr in descriptor.getAttributeDescriptors():
20
      name = attr.getName()
21
      value = self.get(attr.getName())
22
      items[name] = value
23
    return items 
24
  
25
  def edit(self):
26
    """Returns editable feature instance"""
27
    if not isinstance(self._javaobj, EditableFeature):
28
      self.featureNoEditable = self._javaobj
29
      self._javaobj = self._javaobj.getEditable()
30
  
31
  def __getitem__(self,key):
32
    return self.get(key)
33
  
34
  def __getattr__(self,name):
35
    #
36
    #FIX console error when try to introspect feature object
37
    if name in ('__methods__'):
38
        return dict()
39
    elif name in ('__members__'):
40
        return self.getValues().keys()
41
    elif name == '__dict__':
42
        return self.getValues()      
43
        
44
    try:
45
      v = getattr(self._javaobj, name, None)
46
      if v == None:
47
        v = self().get(name)        
48
      return v
49
    except Throwable, ex:
50
      raise RuntimeException("Can't access to attribute %s of feature (%s)" % (name, str(ex)))    
51

  
org.gvsig.scripting.app/trunk/org.gvsig.scripting.app/org.gvsig.scripting.app.extension/src/main/resources-plugin/scripting/lib/gvsig21/vectorial/schema.py
1

  
2
from org.gvsig.fmap.dal.feature.impl import DefaultFeatureType as JSchema
3

  
4
class Schema(JSchema):
5
  """
6
  Stores data properties definition. Represents gvSIG FeatureType
7
  """
8

  
9
  def append(self, name, type, size=None, default=None, precision=4):
10
    """Adds new property to feature properties definition. If error occurs 
11
    raises RuntimeError.    
12
    :param name: Feature property name
13
    :type name: String
14
    :param type: Feature property type
15
    :type name: String
16
    :param size: Feature property size
17
    :type size: int
18
    :param default: Feature property default value
19
    :return: new atribute
20
    """
21
    if not isinstance(self._javaobj, EditableFeatureType):
22
        self.modify()
23
    
24
    if isinstance(type, str):
25
      try:
26
        application = ApplicationLocator.getManager()
27
        datamanager =  application.getDataManager()
28
        dataTypes = application.getDataTypesManager()
29
        type = dataTypes.getType(type) #dataType constant value from string
30
      except:
31
        raise RuntimeError(
32
            "Feature Property Data type (%s) is not valid.  name=%s, type=%s, size=%s, default=%s)" % (
33
                type, 
34
                name, 
35
                type, 
36
                size, 
37
                default
38
            )
39
        )
40
    if isinstance(type, int):
41
      try:
42
        type = dataTypes.get(type)
43
      except:
44
        raise RuntimeError(
45
            "Data type (%s) is not valid.  name=%s, type=%s, size=%s, default=%s)" % (
46
                type, 
47
                name, 
48
                type, 
49
                size, 
50
                default
51
            )
52
        )
53
      
54
    attribute = self.add(name, type.getType())
55
 
56
    if size != None: 
57
      attribute.setSize(size)
58
    
59
    if default != None:
60
      attribute.setDefaultValue(default)
61
      
62
    if precision != None and type.getType() in (DataTypes.DOUBLE, DataTypes.FLOAT):
63
      attribute.setPrecision(precision)
64
    
65
    if type.getType() == DataTypes.GEOMETRY and self.getDefaultGeometryAttributeName()==None:
66
      self.setDefaultGeometryAttributeName(name)
67
    
68
    return attribute
69

  
70
  def __getitem__(self, name):
71
    return self.getAttributeDescriptor(name)
72

  
73
  def get(self, name, default=None):
74
    """Returns a feature attribute descriptor that contains information about 
75
    one feature attribute, such as its name, data type or precision. 
76
    :param name: Attribute name
77
    :type name: string
78
    :param default: Value to return if no attribute name found. 
79
    :return: AttributeDescriptor
80
    """
81
    x = self.getAttributeDescriptor(name)
82
    if x == None:
83
      return default
84
    return x
85
  
86
  def getAttrNames(self):
87
    """Returns a list with attributes names"""
88
    if not self.getAttributeDescriptors():
89
      return None
90
        
91
    return [attr.getName() for attr in self.getAttributeDescriptors()]
92
    
93
    
94
  def getCopy(self):
95
    """Returns a itself clone"""
96
    return Schema(self().getCopy())
97
  
98
  def modify(self):
99
    """Sets edit mode"""
100
    if not isinstance(self._javaobj, EditableFeatureType):
101
      self.featureTypeNoEditable = self._javaobj
102
      self._javaobj = self._javaobj.getEditable()
103

  
org.gvsig.scripting.app/trunk/org.gvsig.scripting.app/org.gvsig.scripting.app.extension/src/main/resources-plugin/scripting/lib/gvsig21/vectorial/layervectorial.py
1

  
2

  
3
from org.gvsig.fmap.mapcontext.layers.vectorial import FLyrVect as JLayerVectorial
4
from table import DataTable
5

  
6
class LayerVectorial(JLayerVectorial,DataTable):
7
  """
8
  This class represent a vectorial layer.
9
  
10
  Extends the `java FLyrVect`_ class.
11
  
12
  .. _`java FLyrVect` : FIXME_URL
13
  """
14

  
15
  def getProjectionCode(self):
16
    """
17
    Returns projection code name of the layer.
18
    
19
    :return:
20
      the projection code name of the layer.
21
    :returntype:
22
      String
23
    """
24
    return self.getProjection().getFullCode()
25

  
26
  def __call__(self):
27
    """
28
    Return the java object represented by this object.
29
    
30
    This method is for compatibility with scripting API of gvSIG 2.0
31
    
32
    :ReturnType:
33
      LayerVectorial
34
    :deprecated: 
35
      With gvSIG 2.1 the call this method isn't necesary
36
      
37
    """
38
    return self    
39

  
40

  
41
#
42
# Inject new methods in the class JLayerVectorial
43
#
44
JLayerVectorial.getProjectionCode = LayerVectorial.getProjectionCode
45
JLayerVectorial.__call__ = LayerVectorial.__call__
46
JLayerVectorial.features = DataTable.features
47
JLayerVectorial.edit = DataTable.edit
48
JLayerVectorial.append = DataTable.append
49
JLayerVectorial.updateSchema = DataTable.updateSchema
50
JLayerVectorial.update = DataTable.update
51
JLayerVectorial.getSchema = DataTable.getSchema
52
JLayerVectorial.commit = DataTable.commit
53
JLayerVectorial.abort = DataTable.abort
54
JLayerVectorial.getSelection = DataTable.getSelection
55
JLayerVectorial.select = DataTable.select
56
JLayerVectorial.deselect = DataTable.deselect
57
JLayerVectorial.isSelected = DataTable.isSelected
58

  
org.gvsig.scripting.app/trunk/org.gvsig.scripting.app/org.gvsig.scripting.app.extension/src/main/resources-plugin/scripting/lib/gvsig21/vectorial/selection.py
1

  
2
  
3
class Selection(FeatureSet):
4
  """Manage selected features set from a store. Represents gvSIG 
5
  org.gvsig.fmap.dal.feature.impl.DefaultFeatureSelection.  
6
  """
7
  def __init__(self, featureSet):
8
    FeatureSet.__init__(self, featureSet)
9
      
10
  def select(self, selection):
11
    """Inserts features in the features selection set"""
12
    if isinstance(selection,Feature) or isinstance(selection, FeatureSet):
13
      self._javaobj.select(selection._javaobj)
14
    else:
15
      self._javaobj.select(selection)
16

  
17
  def deselect(self, selection):
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff