/[thuban]/branches/WIP-pyshapelib-bramz/ChangeLog
ViewVC logotype

Contents of /branches/WIP-pyshapelib-bramz/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2239 - (show annotations)
Mon Jun 14 10:15:03 2004 UTC (20 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 376648 byte(s)
(__version__): Add missing
import of wxPython.wx itself (as opposed to the contents of
wxPython.wx).  For some reason wxPython.wx is available as
wxPython.wx.wx in at least some 2.4 releases.  Fixes RT#2482
wrt. wxPython 2.4.

1 2004-06-14 Bernhard Herzog <[email protected]>
2
3 * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
4 import of wxPython.wx itself (as opposed to the contents of
5 wxPython.wx). For some reason wxPython.wx is available as
6 wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
7 wrt. wxPython 2.4.
8
9 2004-06-10 Jan Schüngel <[email protected]>
10
11 Initial version of new extension "umn_mapserver". This extension aims
12 to manage configuration for the UMN MapServer application. This
13 inital version just imports the .map-files and displays all, Thuban is
14 capable of.
15
16 * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
17
18 * Extensions/umn_mapserver/test/README: New. Describes how to run the
19 tests.
20
21 * Extensions/umn_mapserver/test/test.map: New. This is a test
22 .map-file for automated tests of the umn_mapserver extension of
23 Thuban.
24
25 * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
26 UMN Mapserver classes.
27
28 * Extensions/umn_mapserver/__init__.py: New. Init to make this
29 directory a package.
30
31 * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
32 '.map'-file objects.
33
34 * Extensions/umn_mapserver/mf_import.py: New. This module extends
35 Thuban with the possibility to handle UMN MapServer mapfiles.
36
37 2004-06-03 Bernhard Herzog <[email protected]>
38
39 * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
40 to a tuple before using it as arguments to the % operator. This
41 fixes the formatting issue filed in RT#2239 on 2004-01-13 and
42 reported today on thuban-list by Jan Schüngel
43
44 * test/test_layer.py (TestLayerModification.setUp): Save the
45 filename as an instance variable so we can refer to it in tests
46 (TestLayerModification.test_tree_info): Uncomment this method
47 again and make it work. This tests for the formatting issue
48 filed in RT#2239 on 2004-01-13
49
50 2004-05-28 Bernhard Herzog <[email protected]>
51
52 * Thuban/UI/baserenderer.py: Fix some typos.
53
54 2004-05-18 Jan-Oliver Wagner <[email protected]>
55
56 * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
57 by increasing a field size.
58
59 2004-05-17 Bernhard Herzog <[email protected]>
60
61 Update to newest shapelib and get rid of Thuban specific
62 extensions, i.e. use the new DBFUpdateHeader instead of our
63 DBFCommit kludge
64
65 * libraries/shapelib/shpopen.c: Update to version from current
66 shapelib CVS.
67
68 * libraries/shapelib/shapefil.h: Update to version from current
69 shapelib CVS.
70
71 * libraries/shapelib/dbfopen.c: Update to version from current
72 shapelib CVS.
73 (DBFCommit): Effectively removed since shapelib itself has
74 DBFUpdateHeader now which is better for what DBFCommit wanted to
75 achieve.
76 We're now using an unmodified version of dbfopen.
77
78 * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
79 value '1' to the Lib.dbflibc extension. This simply reflects the
80 shapelib and pyshapelib updates
81
82 2004-05-16 Jan-Oliver Wagner <[email protected]>
83
84 Finished introduction of Menu.FindOrInsertMenu.
85
86 * Extensions/drawshape/drawshape.py: Add the command
87 to the experimental menu additionally to the toolbar.
88
89 * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
90 finding menu on its own.
91
92 * Doc/manual/thuban-manual.xml: updated sample file
93 to use FindOrInsertMenu().
94
95 * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
96 instead of finding menu on its own.
97
98 2004-05-11 Jan-Oliver Wagner <[email protected]>
99
100 * test/test_menu.py (MenuTest.test): Added testing
101 of method Menu.FindOrInsertMenu.
102
103 2004-05-10 Jan-Oliver Wagner <[email protected]>
104
105 Introduce and use Menu.FindOrInsertMenu.
106
107 * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
108 given menu or, if not found, insert it.
109
110 * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
111 /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
112 /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
113 menu on its own.
114
115 2004-05-06 Jan-Oliver Wagner <[email protected]>
116
117 Introduce a abstract ColorDialog class and remove
118 and outdated file.
119
120 * Thuban/UI/proj4dialog.py: Removed. It is has been
121 replaced by projdialog for quite a while and is not used
122 anymore.
123
124 * Thuban/UI/colordialog.py: New. Abstraction for color selection
125 dialog(s).
126
127 * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
128 Now calls the abstract ColorDialog instead of wxColourDialog.
129 This also removed the dependency to Color class conversion
130 from this function.
131
132 2004-05-04 Frank Koormann <[email protected]>
133
134 * Extensions/bboxdump/__init__.py: Fixed string left over from
135 copying.
136
137 * Extensions/bboxdump/bboxdump.py (bboxdump):
138 Use layer.ShapeStore().AllShapes() to loop over shapes instead of
139 xrange(layer.NumShapes()). Compile the bboxmessage from a list
140 of formatted outputs (string.join) instead of appending to the
141 message. Two progress bar dialogs to report progress on the sometimes
142 lenghty processing.
143
144 2004-04-22 Frank Koormann <[email protected]>
145
146 New Extension to dump bounding boxes of all shapes of the selected
147 layer. An optional column can be specified to group the objects,
148 in this case the bounding box is a union of the separate boxes.
149 Dump can be displayed in a ScrolledMessageDialog or written to file.
150 The Extension is simply a combination of available and well tested
151 Thuban functionality.
152
153 * Extensions/bboxdump/__init__.py: New: Init to make this
154 directory a package.
155
156 * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
157 all shapes of the selected layer.
158
159 2004-04-22 Jan-Oliver Wagner <[email protected]>
160
161 * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
162 strings to be i18n now.
163
164 2004-04-18 Jan-Oliver Wagner <[email protected]>
165
166 Changing popup menu of legend from direct building
167 to using the Menu construction as used for the mainwindow.
168
169 * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
170 layer_to_bottom, layer_visibility
171 (MainWindow.LayerToTop): New. Put current layer to the top.
172 (MainWindow.LayerToBottom): New. Put current layer to bottom.
173 (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
174 Replace 1,0 by True, False.
175 (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
176 current layer.
177 (MainWindow.LayerShowTable): Removed raising of dialog.
178 (_has_selected_layer_visible): New. Support function.
179
180 * Thuban/UI/legend.py: ID_POP_xxx: removed.
181 (LegendPanel.__init__): Removed EVT_MENU bindings.
182 (LegendTree._OnRightClick): Replace direct creation of
183 menu via wx Classes by applying the menu definition
184 as of Menu class of menu.py.
185
186 2004-04-16 Jan-Oliver Wagner <[email protected]>
187
188 * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
189 button string to stronger clearify that Thuban will be closed when hitting
190 the button.
191
192 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
193 Now for layers without a ShapeStore a corresponding message is given
194 to the user, that this layer has no table to show.
195
196 2004-04-15 Martin Schulze <[email protected]>
197
198 * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
199 recalculate the format for the internal render engine as well.
200
201 * Extensions/wms/properties.py (wmsProperties): First start for a
202 properties dialog. It's functional for a first selection of
203 layers, but still has some weired wxWidgets/GTK problems but
204 beautification can be done later.
205
206 * Extensions/wms/layer.py: Added more documentation
207 (WMSLayer.getFormats): New: Return list of supported image formats
208 by the WMS server
209 (WMSLayer.getLayers): New: Return the list of layer names
210 supported by the WMS server
211 (WMSLayer.getLayerTitle): New: Return the title of the named layer
212 (WMSLayer.getWMSFormat): New: Return the image format that is used
213 for WMS GetMap requests
214 (WMSLayer.setWMSFormat): New: Set the image format that is used
215 for WMS GetMap requests
216 (WMSLayer.__init__): Move away from using only one layer to using
217 a list of layers (unsorted at the moment, though).
218 (WMSLayer.getVisibleLayers): New: Return the list of names for all
219 visible layers
220 (WMSLayer.setVisibleLayers): New: Set the list of names for all
221 visible layers
222
223 * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
224 order to establish a clean structure.
225
226 * Extensions/wms/layer.py: Moved the WMS layer into a file on its
227 own in order to establish a clean structure.
228
229 2004-04-13 Martin Schulze <[email protected]>
230
231 * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
232 support for oldstyle (WMS 1.0 apparently) image format
233 specification.
234
235 * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
236 supported graphic formats back to JPEG and BMP, PNG and others are
237 too *cough* experimental... Sorry, I meant to filter this out
238 before I committed this part. This should make the WMS extension
239 run from CVS again.
240 (wms_dialog): Reset an empty URL to None so that the subsequent
241 program can depend on this, since the dialog will indeed return an
242 empty URL, causing another declaration of love by Python.
243
244 * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
245 Whenever a native BoundingBox request cannot be fulfilled, check
246 whether the requested SRS is EPSG:3426, in which case return the
247 LatLonBoundingBox values.
248
249 * Extensions/wms/test/test_parser.py
250 (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
251 ignoring AUTO:* SRS.
252 (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
253 Added another test method to test whether the LatLonBoundingBox
254 values will be returned if BoundingBox values are requested with
255 SRS set to EPSG:3426.
256
257 * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
258 Added rudimentary support for non-EPSG SRS, i.e. ignore them for
259 the moment by placing them into a variable which is currently
260 unused. Also test whether the EPSG SRS is numerical as it should
261 be and add an error message if it is not.
262
263 * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
264 appear in the real world as well. Since we cannot handle them yet
265 (OGCLib can't either), we will ignore them for the moment.
266
267 * Extensions/wms/parser.py: Use a variable for denoting the sample
268 filename
269 (WMSCapabilitiesParser.peekLayers): Added support for error
270 messages during grok(). They will be aggregated in an array and
271 may be displayed later. We may have to add a classification
272 "Warning" and "Error" to this. That requires more experience,
273 though, since not every error may be lethal.
274
275 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
276 ShowTable() dialog/frame when the user attempts to display it
277 while it has been opened before already and not closed again.
278
279 2004-04-11 Martin Schulze <[email protected]>
280
281 * Extensions/wms/infodialog.py: Adjusted the class documentation
282
283 * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
284 Switch to using Thuban{Begin,End}BusyCursor instead of the pure
285 wxWidgets variants.
286 (WMSLayer.__init__): The epsg_id variable is named top_srs now.
287
288 * Extensions/wms/infodialog.py: Added an information dialog that
289 will display various information about the WMS current resource,
290 so that additional information such as the title, the abstract,
291 fees and access constraints can be displayed for the user if they
292 are documented in the WMS XML.
293
294 2004-04-10 Martin Schulze <[email protected]>
295
296 * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
297 string handling. It's "foo".lower() and not lower(foo) without
298 lower imported from strings or something.
299
300 * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
301 from capabilities.py and parser.py. Implement priority list for
302 supported graphics formats, take care of wbmp != bmp. PNG, TIFF
303 and GIF are supported here, but not yet by main Thuban. Hence,
304 support for them may be removed later. Special contribution to
305 usability: get wxWidgets to change the cursor when we're waiting
306 for data from the network so the user won't start to worry. This
307 causes a redrawing error/warning, though.
308
309 * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
310 the DOM object.
311
312 2004-04-01 Martin Schulze <[email protected]>
313
314 * Extensions/wms/capabilities.py: Adjusted documentation
315 (WMSCapabilities.__init__): Improved documentation, fixed syntax
316 (WMSCapabilities.saveCapabilities): Only catch IOError when
317 handling files
318 (WMSCapabilities.loadCapabilities): Only catch IOError when
319 handling files
320 __main__: corrected variable naming
321 (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
322 class a specialisation of WMSCapabilitiesParser as well. Also
323 execute grok() after loading or fetching capabilities, if that
324 went well, so that subsequent calls can already access the data.
325 (WMSCapabilities.getVersion): Export the used version of the
326 GetCapabilities request, so we can use it for subsequent calls,
327 i.e. for GetMap requests.
328 (WMSCapabilities.fetchCapabilities): Added proper error handling
329 when the GetCapabilities request failed, so that the surrounding
330 program can act accordingly.
331
332 2004-03-30 Martin Schulze <[email protected]>
333
334 * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
335 Adjusted the getLayerSRS method to return the list of SRSes
336 extracted from <SRS> elements instead of <BoundingBox> elements.
337 Added a bit of documentation as well.
338 (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
339 since it was only implemented due to a misunderstanding.
340
341 * Extensions/wms/test/test_parser.py
342 (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
343 reflect the corrected interpretation of the standard: i.e. a layer
344 does not have to define a BoundingBox for all SRSes it supports.
345 Hence the <SRS></SRS> specification is authoritative, not the list
346 of BoundingBoxes.
347 (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
348 to ensure None is returned for a non-existing SRS.
349 (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
350 since it is not applicable anymore. Listing more SRSes in <SRS>
351 elements is valid according to the specs.
352
353 2004-03-26 Bernhard Reiter <[email protected]>
354
355 * README: Nicer formatting of text. Improved descriptions.
356 Reflected wxWidgets name change.
357
358 * Thuban/UI/about.py: Extended copyright to 2004 and added
359 information about the thuban-devel mailinglist.
360
361 2004-03-24 Martin Schulze <[email protected]>
362
363 * Extensions/wms/capabilities.py: Renamed the class to contain
364 'WMS', also added a linebreak where required
365
366 * Extensions/wms/parser.py: Finally added the XML parser for the
367 GetCapabilities response.
368
369 * Extensions/wms/test/sample.xml: Adjusted the sample file so that
370 <SRS> elements match the <BoundingBox> elements, except for the
371 layer 'beschriftung'.
372
373 * Extensions/wms/test/test_parser.py: Encode non-ascii strings
374 since Python uses unicode strings internally, otherwise
375 comparisons will fail. Removed tests for getLayerBBoxSRS() since
376 the SRS will be calculated anyway and this method is obsoleted by
377 getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
378 Move loading the sample file into the setUp method. Added a test
379 for finding the integrity problem in the sample response.
380 Improved formatting.
381
382 * Extensions/wms/domutils.py: Added convenience routines for
383 handling of Document Object Model (DOM) nodes.
384
385 * Extensions/wms/test/test_domutils.py: Added a test for the
386 domutils module
387
388 2004-03-19 Martin Schulze <[email protected]>
389
390 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
391 Moved path detection and adding into a module of its own,
392 adjustpath, which exports thubandir as main Thuban directory.
393
394 * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
395 detection and adding into a module of its own, adjustpath, which
396 exports thubandir as main Thuban directory. Reorganised the
397 module in order to support the SkipTest feature for Thuban test
398 cases.
399
400 * Extensions/wms/test/adjustpath.py: Moved path detection and
401 adding into a module of its own.
402
403 2004-03-18 Martin Schulze <[email protected]>
404
405 * Extensions/wms/test/test_parser.py: Added another test for
406 checking whether the WMS XML parser (to be implemented) returns
407 the information we expect. This requires a sample WMS WML file
408 (sample.xml) which has been extracted from the frida server and
409 "improved" manually.
410
411 * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
412 main Thuban directory to the path in order to be able to import
413 random modules. Adjusted the PyOGCLib detection to reuse the
414 information gathered. Also added a note about the PYTHONPATH
415 environment variable.
416
417 * Extensions/wms/test/test_ogclib.py: The format specification is
418 a mime-type, not a graphic format, hence image/jpeg wou ld be the
419 proper format and not JPEG. We'll also have to take care of the
420 encoding of / as %2F.
421
422 2004-03-16 Martin Schulze <[email protected]>
423
424 * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
425 comprehensive test for the getMapURL method, built compare URLs
426 according to the documentation in OGC 01-068r3
427
428 * Extensions/wms/capabilities.py (WMSCapabilities): Added the
429 class WMSCapabilities to manage capabilites, will incorporate
430 parsing the capabilities response and provide details for other
431 classes.
432
433 2004-03-12 Bernhard Herzog <[email protected]>
434
435 Support views in addition to normal tables in the postgis
436 shapestore
437
438 * Thuban/Model/postgisdb.py
439 (PostGISShapeStore._fetch_table_information): Add a fallback for
440 the case where the table name is not in the geometry_columns
441 table. This is usually the case for views. Also, set
442 self.shapestore here.
443 (PostGISShapeStore.ShapeType): No need to query the database all
444 the time. The shape type is now determined in
445 _fetch_table_information
446
447 * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
448 (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
449 New parameter to specify views.
450 (PostGISDatabase.has_data): Also compare the views. New views
451 parameter
452 (PostGISDatabase.initdb): Create the views.
453 (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
454 view
455
456 * test/test_postgis_db.py
457 (TestPostGISShapestorePointFromViews): New. Test a
458 PostGISShapeStore with a view
459 (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
460 the geometry_column explicitly to test whether that works
461
462 2004-03-12 Bernhard Herzog <[email protected]>
463
464 Final step for explicit id/geometry columns: Loading and saving
465
466 * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
467 with the following changes:
468 (dbshapesource): Two new attributes id_column and geometry_column
469
470 * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
471 (SessionSaver.write_session): Use the new namespace
472 (SessionSaver.write_data_containers): Write the new dbshapesource
473 parameters
474
475 * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
476 the new file format version
477 (SessionLoader.start_dbshapesource): Handle the new db parameters
478
479 * test/test_save.py: Update to the new dtd and namespace
480 (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
481 mock object to provide a working IDColumn method.
482
483 * test/test_load_1_0.py: New. Copy of the test_load.py before
484 today's changes but with the round-trip tests removed.
485
486 * test/test_load_0_9.py: Update doc-string.
487
488 * test/test_load.py: Update all .thuban files to the new dtd and
489 namespace.
490 (TestPostGISLayer.file_contents): Add the new dbshapesource
491 paramters
492
493 2004-03-11 Bernhard Herzog <[email protected]>
494
495 Next step for explicit id/geometry columns: User interaction
496
497 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
498 the dialog is constructed. Add combo boxes to select id and
499 geometry column. Rename some instance variables.
500 (ChooseDBTableDialog.GetTable): Return id and geometry column
501 names
502 (ChooseDBTableDialog.OnTableSelect): New. Event handler for
503 selections in the table list
504
505 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
506 and geometry_column
507
508 * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
509 parameters for id_column and geometry column of PostGISShapeStore
510 here as well.
511
512 * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
513 (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
514 (PostGISConnection.GeometryTables): Use a better query to
515 determine which relations in the database might be usable for
516 shapestores. Now supports views as well but is more PostgreSQL
517 specific
518 (PostGISConnection.table_columns): New. Somewhat experimental
519 method to let the db dialogs provide lists of columns to users so
520 that they can select id and geometry columns.
521 (PostGISTable.__init__): The default value of the id_column
522 parameter is now None it still means "gid" effectively, though.
523 (PostGISTable.IDColumn): New introspection method to return a
524 column object for the id column
525 (PostGISShapeStore.GeometryColumn): New introspection method to
526 return a column object for the geometry column
527
528 * test/test_postgis_db.py
529 (TestPostGISConnection.test_gis_tables_non_empty):
530 Removed. Subsumed by the new:
531 (TestPostGISConnection.test_gis_tables_with_views_and_tables):
532 New. Tes the GeometryTables and table_columns methods with actual
533 tables and views.
534 (PointTests.test_id_column, PointTests.test_geometry_column):
535 New. tests for the new methods.
536 (TestPostGISShapestorePoint.setUp)
537 (TestPostGISShapestorePointSRID.setUp)
538 (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
539 instance variables needed by the new tests
540
541 2004-03-11 Bernhard Herzog <[email protected]>
542
543 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
544 numbers given to ReadValue are ordinals.
545
546 2004-03-11 Bernhard Herzog <[email protected]>
547
548 Elimiate the requirement for PostGIS tables to have a column
549 called "gid".
550
551 * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
552 id_column to specify which column to use to identify rows. Also
553 new instance variables id_column and quoted_id_column
554 (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
555 (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
556 (PostGISTable.SimpleQuery): Use the id column name provided to the
557 constructor instead of "gid"
558 (PostGISShapeStore.__init__): New parameter id_column analogously
559 to PostGISTable.__init__. This parameter is simply passed through
560 to the base class constructor
561 (PostGISShapeStore._create_col_from_description): Fix typo in
562 doc-string
563 (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
564 (PostGISShapeStore.ShapesInRegion): Use the id column name
565 provided to the constructor instead of "gid"
566
567 * test/postgissupport.py
568 (PostgreSQLServer.get_default_static_data_db): New static table
569 landmarks_point_id with an id column != "gid. Update the comments
570 a bit.
571 (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
572 doc-
573 (upload_shapefile): New parameter gid_column to use a name other
574 than "gid" for the column to store the shape ids
575
576 * test/test_postgis_db.py (TableTests): New. Mixin-class
577 containing all tests previously in TestPostGISTable. The actual
578 tests are the same but the code is a bit more configurable to
579 allow for different id columns etc.
580 (TestPostGISTable): Derive from TableTests now for the actual
581 tests.
582 (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
583 except that it the landmarks_point_id table to test the id_column
584 parameter
585 (PointTests): Extend the doc-string
586 (TestPostGISShapestorePointExplicitGIDColumn)
587 (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
588 from PointTests to test the explicit id_column parameter. One
589 tests with the name of the column holding the shape ids, the other
590 uses PostgreSQL's OID column. For the latter a number of methods
591 have to be overwritten to make them independent of the actual id
592 values.
593
594 2004-03-08 Silke Reimer <[email protected]>
595
596 Update debian directory:
597
598 * debian/changelog: Added new version.
599 * deiban/rules: Updated management of patches (with cbds)
600 * debian/control: Added cbds to dependencies
601 * debian/patches/*: New. Adds better support for patches of thuban in
602 debian
603 * debian/menu: Syntax of menu changed slightly
604 * debian/setup.py.patch: removed because it has been moved to
605 debian/patechs/setup.py.patch
606
607
608 2004-02-26 Bernhard Herzog <[email protected]>
609
610 Create the Doc/technotes directory for text files with information
611 for developers
612
613 * Doc/technotes/README: New. README for the technotes
614
615 * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
616 Thuban
617
618 * Doc/technotes/release_process.txt: New. Used to be
619 HOWTO-Release. Now slightly adapted to technote formatting style.
620
621 * HOWTO-Release: Removed. It's contents are now in
622 Doc/technotes/release_process.txt
623
624 2004-02-25 Bernhard Herzog <[email protected]>
625
626 * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
627 version of wxWindows the module was compiled with so we can check
628 that against the wxPython version.
629
630 * Thuban/version.py (thuban_branch, thuban_release): New variables
631 controlling which and how Thuban versions are shown. See the
632 comments for details.
633 (verify_versions): Also check that the wx version that wxproj is
634 compiled against matches that of the wxPython we use at runtime
635
636 2004-02-20 Bernhard Herzog <[email protected]>
637
638 * Extensions/wms/wms.py (epsg_code_to_projection): Use
639 get_system_proj_file to read the epsg projections. The old way
640 depended on the current directory being the top Thuban directory.
641
642 2004-02-20 Bernhard Herzog <[email protected]>
643
644 * Extensions/svgexport/test/test_svgmapwriter.py
645 (TestVirtualDC.test_clippath): Remove a debug print
646
647 2004-02-20 Bernhard Herzog <[email protected]>
648
649 * Extensions/svgexport/__init__.py: New. Turn
650 Extensions/svgexport into a package.
651
652 * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
653 doc-string a bit. The doc-string must come first, otherwise it's
654 not a doc-string. The __future__ import must be the first thing
655 after the doc-string. Use only double quotes in doc-strings.
656 Single quotes trip up emacs syntax highlighting if the text
657 contains apostrophes.
658
659 2004-02-20 Bernhard Herzog <[email protected]>
660
661 * Extensions/svgexport/test/__init__.py,
662 Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
663 suite for svgexport
664
665 * test/runtests.py (find_test_modules): New. Function with the
666 module finding code from main.
667 (main): Use find_test_modules to figure out the default test
668 modules and take modules from Extensions.svgexport.test too.
669
670 2004-02-19 Bernhard Herzog <[email protected]>
671
672 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
673 the mainwindow has a reference to the map of the initial session.
674 This fixes a bug introduced with the fix for RT#2245
675
676 2004-02-19 Bernhard Herzog <[email protected]>
677
678 * Extensions/svgexport/svgsaver.py,
679 Extensions/svgexport/svgmapwriter.py,
680 Extensions/svgexport/maplegend.py: Added again. This time in the
681 correct place.
682
683 2004-02-17 Bernhard Herzog <[email protected]>
684
685 Fix for RT#2245
686
687 * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
688 instance variables before trying to create any windows. Creating
689 windows can start an event loop if e.g. message boxes are popped
690 up for some reason, and event handlers, especially EVT_UPDATE_UI
691 may want to access things from the application.
692 (ThubanApplication.maps_changed): The mainwindow may not have been
693 created yet, so check whether it has been created before calling
694 its methods
695
696 * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
697 have a map
698
699 2004-02-17 Bernhard Herzog <[email protected]>
700
701 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
702 Extensions/svgmapwriter.py, Extensions/maplegend.py,
703 extensions/svgexport/svgsaver.py,
704 extensions/svgexport/svgmapwriter.py,
705 extensions/svgexport/maplegend.py: Removed. These files were in
706 the wrong places or didn't work at all.
707
708 2004-02-16 Bernhard Herzog <[email protected]>
709
710 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
711 line
712
713 2004-02-16 Bernhard Herzog <[email protected]>
714
715 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
716
717 2004-02-15 Markus Rechtien <[email protected]>
718
719 * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
720 to write a session to a file in SVG format.
721 * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
722 to write a SVG map of a session.
723 * Extensions/svgexport/maplegend: New. Writes a basic maplegend
724 in SVG format for the current session.
725
726 2004-02-13 Bernhard Herzog <[email protected]>
727
728 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
729 can't be created, return immediately after displaying the error
730 message.
731
732 2004-02-11 Bernhard Herzog <[email protected]>
733
734 Handle postgis tables with more than one geometry column.
735
736 * Thuban/Model/postgisdb.py
737 (PostGISTable._fetch_table_information): Delegate the creation of
738 column objects to a different method so that we can extend that in
739 derived classes
740 (PostGISTable._create_col_from_description): New. Column object
741 creation part of _fetch_table_information
742 (PostGISShapeStore._create_col_from_description): New. Extend
743 inherited method to handle geometry columns
744 (PostGISShapeStore.__init__): New parameter geometry_column to
745 specify which geometry column to use. Optional but mandatory for
746 tables with more than one geometry column
747 (PostGISShapeStore._fetch_table_information): Also use the name of
748 the geometry column when looking for the srid
749 (PostGISShapeStore.ShapeType): Also use the name of the geometry
750 column when looking for the shape type
751
752 * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
753 NonConnectionStore to changes in the PostGISShapeStore
754
755 * test/test_postgis_db.py
756 (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
757 PostGISShapeStore with tables having two geometry columns.
758
759 2004-02-10 Bernhard Herzog <[email protected]>
760
761 Fix some postgis problems. What remains to be done is real
762 handling of SRIDs as they affect how reprojection is done
763
764 * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
765 doc-string
766 (PostGISShapeStore._fetch_table_information): New. Extend
767 inherited method to retrieve srid
768 (PostGISShapeStore.BoundingBox): Handle tables without data.
769 extent yields NULL for those
770 (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
771
772 * test/test_postgis_db.py
773 (TestPostGISSpecialCases.test_shapestore_empty_table): New test
774 for the special case of a table without any data
775 (TestPostGISShapestorePointSRID): New class with tests for a table
776 that uses srids
777 (PolygonTests): Fix a doc-string typo
778
779 * test/postgissupport.py (PostGISDatabase.__init__): New parameter
780 reference_systems with a specification of spacial reference
781 systems to create in the new db.
782 (PostgreSQLServer.new_postgis_db)
783 (PostgreSQLServer.get_static_data_db): New parameter
784 reference_systems to be passed through ultimately to
785 PostGISDatabase. In new_postgis_db also check whether an existing
786 db already has the right srids
787 (PostgreSQLServer.get_default_static_data_db): Add srids and a
788 table that uses srids
789 (PostGISDatabase.initdb): Create the entries for the reference
790 systems
791 (PostGISDatabase.has_data): Add reference_systems parameter to
792 check for those too
793 (upload_shapefile): New parameter srid to create tables with a
794 specific srid
795
796 2004-02-06 Frank Koormann <[email protected]>
797
798 * po/pt_BR.po: Fixed charset
799
800 2004-02-05 Frank Koormann <[email protected]>
801
802 * po/pt_BR.po: Fixed format string for error message, missing %s
803 added (Thuban/UI/application.py:273)
804
805 2004-02-03 Frank Koormann <[email protected]>
806
807 First version of Portuguese (Brazilian) translation
808
809 * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
810 Brazilian Portuguese by Eduardo Patto Kanegae.
811
812 * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
813 translators.
814
815
816 2004-01-22 Frank Koormann <[email protected]>
817
818 * Doc/manual/thuban-manual.xml: Added section on installation of
819 Thuban under Win32 systems. Fixed image path references in the postgis
820 section. Some minor source formattings.
821
822 2004-01-21 Frank Koormann <[email protected]>
823
824 Make Thuban remember path selections (at least for one application run).
825
826 * Thuban/UI/application.py (Application.OnInit): Initialize path as a
827 attribute of application object. Path is a dictionary of
828 strings, currently with the items "data" and "projection".
829 (Application.SetPath): New, stores path for the specified item.
830 (Application.Path): New, return path for the specified item.
831
832 * Thuban/UI/mainwindow.py
833 (MainWindow.OpenSession, MainWindow.SaveSessionAs,
834 MainWindow.AddLayer, MainWindow.AddRasterLayer,
835 MainWindow.TableOpen): Access "data" path information of the
836 application.
837
838 * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
839 Access "projection" path information of the application.
840
841 2004-01-05 Bernhard Herzog <[email protected]>
842
843 * po/ru.po: Updated translations from Alex Shevlakov
844
845 2004-01-05 Bernhard Herzog <[email protected]>
846
847 * po/Makefile, po/README: Move the description of how to generate
848 the translation statistics to the README.
849
850 2003-12-23 Bernhard Herzog <[email protected]>
851
852 * NEWS: Update for 1.0.0
853
854 * po/it.po: Another update from Maurizio Napolitano
855
856 2003-12-23 Bernhard Herzog <[email protected]>
857
858 * po/it.po: Updated translation from Maurizio Napolitano
859
860 2003-12-23 Bernhard Herzog <[email protected]>
861
862 * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
863 for translation
864
865 * Thuban/UI/mainwindow.py (MainWindow.TableRename)
866 (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
867 strings for translation
868
869 * po/de.po: Update with the newly marked strings.
870
871 2003-12-22 Bernhard Herzog <[email protected]>
872
873 * HOWTO-Release: Fix the places where version numbers have to be
874 updated
875
876 2003-12-22 Bernhard Herzog <[email protected]>
877
878 * setup.py (setup call): 1.0.0, yeah!
879
880 * Thuban/version.py (longversion): 1.0.0, yeah!
881
882 * Thuban/Model/load.py (SessionLoader.__init__): Accept the
883 1.0.0 namespace too
884
885 * Thuban/Model/save.py (SessionSaver.write_session): Save with
886 1.0.0 namespace
887
888 * test/test_load.py (LoadSessionTest.dtd)
889 (TestSingleLayer.file_contents)
890 (TestNonAsciiColumnName.file_contents)
891 (TestLayerVisibility.file_contents)
892 (TestClassification.file_contents, TestLabels.file_contents)
893 (TestLayerProjection.file_contents)
894 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
895 (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
896 (TestPostGISLayerPassword.file_contents)
897 (TestLoadError.file_contents, TestLoadError.test): Update for
898 1.0.0 namespace
899
900 * test/test_save.py (SaveSessionTest.dtd)
901 (SaveSessionTest.testEmptySession)
902 (SaveSessionTest.testSingleLayer)
903 (SaveSessionTest.testLayerProjection)
904 (SaveSessionTest.testRasterLayer)
905 (SaveSessionTest.testClassifiedLayer)
906 (SaveSessionTest.test_dbf_table)
907 (SaveSessionTest.test_joined_table)
908 (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
909
910 2003-12-22 Bernhard Herzog <[email protected]>
911
912 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
913 alignment flags are byte strings not unicode and that they have
914 valid values
915
916 * test/test_load.py (TestLabelLayer): New. Test loading (and
917 indirectly saving) of maps with labels.
918
919 2003-12-22 Bernhard Herzog <[email protected]>
920
921 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
922 (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
923 unsubscribe all subscribers.
924 (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
925 self.grid since it may already have been destroyed.
926 Fixes RT #2256
927
928 2003-12-19 Bernhard Herzog <[email protected]>
929
930 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
931
932 2003-12-16 Bernhard Herzog <[email protected]>
933
934 * debian/bitmappath.patch, debian/setup.py.patch:
935 added to ensure compliance with FHS for debian
936 * debian/rules, debian/changelog:
937 added patches in rules to ensure compliance with FHS for debian
938
939 2003-12-16 Bernhard Herzog <[email protected]>
940
941 * po/Makefile (mo): Make the output a bit nicer so that it prints
942 statistics about the translations. Add a comment how produce even
943 nicer statistics with sed.
944
945 2003-12-09 Frank Koormann <[email protected]>
946
947 * Resources/Projections/defaults.proj:
948 French projection sample with correct accents (UNICODE).
949
950 2003-12-05 Bernhard Herzog <[email protected]>
951
952 * MANIFEST.in: Add the devtools directory
953
954 * setup.py (setup call): Use license instead of licence. This
955 silences a deprecation warning on Python 2.3
956
957 2003-12-05 Frank Koormann <[email protected]>
958
959 Documentation synced with 1.0rc1
960
961 * Doc/manual/thuban-manual.xml:
962 Minor formatting changes and references to database layers .
963 Introduction.Internationalization: New section on i18n.
964 MapManagement.AddingandRemovingLayers: Added item on database layers.
965 MapManagement.TheLegend: Added section and screenshot on popup menu.
966 ProjectionManagement: Updated screenshot and sentence on EPSG.
967 Appendix.SupportedDataSources: Added PostGIS.
968 Appendix.WorkingwithPostGIS: New section.
969
970 * Doc/manual/images/6_projection.png: Updated screenshot including
971 EPSG checkboxes.
972
973 * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
974
975 * Doc/manual/images/app_postgis_add_layer.png,
976 Doc/manual/images/app_postgis_db_add.png,
977 Doc/manual/images/app_postgis_db_management.png:
978 New screenshots focussing on database layers
979
980 2003-12-05 Frank Koormann <[email protected]>
981
982 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
983 write warning to stderr instead of rising a warning dialog
984
985 2003-12-03 Bernhard Herzog <[email protected]>
986
987 Fix for RT #2243
988
989 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
990 New. Like has_selected_layer but for shape layers only
991 (_has_selected_shape_layer): New. Like _has_selected_layer but for
992 shape layers only
993 (layer_show_table command, layer_jointable command): Use these
994 commands should only be available for shape layers
995
996 2003-12-03 Bernhard Herzog <[email protected]>
997
998 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
999 publishers that are wx objects and may have been destroyed by wx
1000 already. Fixes RT #2242.
1001
1002 2003-12-03 Bernhard Herzog <[email protected]>
1003
1004 * po/ru.po: Updates from Alex Shevlakov
1005
1006 2003-12-03 Silke Reimer <silkeintevation.de>
1007
1008 * debian/control, debian/changelog: Added gdal-support to
1009 debian package, updated to new thuban version
1010
1011
1012 2003-12-03 Bernhard Herzog <[email protected]>
1013
1014 * Thuban/Lib/version.py: New. Module for version number
1015 manipulations. The version of make_tuple here also deals better
1016 with more unusual version number strings, such as e.g.
1017 "1.2+cvs20031111"
1018
1019 * Thuban/version.py (make_tuple): Removed. It's now in
1020 Thuban.Lib.version. Use that implementation instead.
1021
1022 * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
1023
1024 2003-12-02 Bernhard Herzog <[email protected]>
1025
1026 * MANIFEST.in: Add debian files
1027
1028 * setup.py (setup call): Add packages for the Extensions so that
1029 they're installed too
1030 (data_files): Add READMEs and sample data from some Extensions
1031
1032 * NEWS: Add note about the extensions in binary packages
1033
1034 2003-12-02 Bernhard Herzog <[email protected]>
1035
1036 * Thuban/Model/save.py (SessionSaver.write_session): Save files
1037 with the thuban-1.0rc1
1038
1039 * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
1040 thuban-1.0rc1 namespace too
1041
1042 * test/test_save.py (SaveSessionTest.dtd)
1043 (SaveSessionTest.testEmptySession)
1044 (SaveSessionTest.testSingleLayer)
1045 (SaveSessionTest.testLayerProjection)
1046 (SaveSessionTest.testRasterLayer)
1047 (SaveSessionTest.testClassifiedLayer)
1048 (SaveSessionTest.test_dbf_table)
1049 (SaveSessionTest.test_joined_table)
1050 (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
1051 namespace
1052
1053 * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
1054 namespace
1055 (TestSingleLayer.file_contents)
1056 (TestNonAsciiColumnName.file_contents)
1057 (TestLayerVisibility.file_contents)
1058 (TestClassification.file_contents, TestLabels.file_contents)
1059 (TestLayerProjection.file_contents)
1060 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
1061 (TestPostGISLayer.file_contents)
1062 (TestPostGISLayerPassword.file_contents)
1063 (TestLoadError.file_contents, TestLoadError.test): Update to
1064 thuban-1.0rc1 namespace
1065
1066 2003-12-01 Bernhard Herzog <[email protected]>
1067
1068 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
1069 nt to better match Intevation's current w32 setup
1070
1071 * HOWTO-Release: Add note about updating MANIFEST.in
1072
1073 * MANIFEST.in: Add the Extensions
1074
1075 * NEWS: Update for 1.0rc1
1076
1077 2003-12-01 Bernhard Herzog <[email protected]>
1078
1079 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
1080 cards for the dialog so that shapefiles ending in all uppercase
1081 SHP are listed too
1082
1083 2003-11-28 Bernhard Herzog <[email protected]>
1084
1085 * Thuban/version.py (longversion): Update to 1.0rc1
1086
1087 * setup.py (setup call): Update version to 1.0rc1. Use the
1088 [email protected] email address as author email instead of my
1089 personal one.
1090
1091 2003-11-28 Bernhard Herzog <[email protected]>
1092
1093 * po/de.po: Update german translation.
1094
1095 2003-11-28 Bernhard Herzog <[email protected]>
1096
1097 Unify the filenames stored in .thuban files so that the .thuban
1098 files are more platform independend
1099
1100 * Thuban/Model/save.py (unify_filename): New. Unify filenames so
1101 that they can be used on both windows and unix
1102 (SessionSaver.prepare_filename): New. Handle all filename
1103 transformations for filenames stored in the thuban file
1104 (SessionSaver.write_data_containers, SessionSaver.write_layer):
1105 Use prepare_filename
1106
1107 * test/test_save.py (SaveSessionTest.testSingleLayer)
1108 (SaveSessionTest.testLayerProjection)
1109 (SaveSessionTest.testRasterLayer)
1110 (SaveSessionTest.testClassifiedLayer)
1111 (SaveSessionTest.test_dbf_table)
1112 (SaveSessionTest.test_joined_table): Filenames are always stored
1113 with slashes on all currently supported platforms so adapt all
1114 tests to this
1115
1116 * test/test_load.py (LoadSessionTest.filenames): With the new
1117 filename scheme the filenames in the tests should be
1118 understandable on all currently supported platforms so we turn
1119 this into an empty list because we don't have to normalize them
1120 anymore
1121
1122 2003-11-28 Bernhard Herzog <[email protected]>
1123
1124 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
1125 Add the ellipsoid to the projection since some Proj versions
1126 complain if it's missing.
1127
1128 2003-11-27 Bernhard Herzog <[email protected]>
1129
1130 Corect some bounding box projection problems
1131
1132 * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
1133 version of ForwardBBox
1134 (Projection._transform_bbox): New. common implementation of
1135 ForwardBBox and InverseBBox
1136 (Projection.ForwardBBox): Use _transform_bbox.
1137
1138 * test/test_proj.py (TestProjection.test): Add test for
1139 InverseBBox
1140
1141 * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
1142 (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
1143 new InverseBBox method to determine the unprojected bounding box
1144 (Layer.ShapesInRegion): Use the ForwardBBox method to project the
1145 bbox.
1146
1147 * test/test_layer.py (TestLayer.test_point_layer_with_projection):
1148 Removed.
1149 (TestLayer.test_arc_layer_with_projection): New. This test is
1150 better able to test whether bounding boxes are projected correctly
1151 than test_point_layer_with_projection
1152
1153 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
1154 InverseBBox to unproject bboxes
1155
1156 2003-11-25 Bernhard Herzog <[email protected]>
1157
1158 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
1159 source code.
1160
1161 2003-11-25 Bernhard Herzog <[email protected]>
1162
1163 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
1164 there for backwards compatibility and all code relying on that
1165 should have been updated by now.
1166
1167 2003-11-25 Bernhard Herzog <[email protected]>
1168
1169 * test/test_load.py (TestClassification.test): Add the missing
1170 round trip test.
1171 (TestClassification.file_contents): Update to the newest file
1172 format
1173
1174 2003-11-25 Bernhard Herzog <[email protected]>
1175
1176 Add very experimental (and possibly dangerous) extension to draw
1177 polygons:
1178
1179 * Extensions/drawshape/README: New. Brief installation
1180 instructions
1181
1182 * Extensions/drawshape/drawshape.py: New. Implementation of the
1183 drawshape extensions
1184
1185 * Extensions/drawshape/patch.diff: Patch to apply before the
1186 extension can be used.
1187
1188 2003-11-24 Bernhard Herzog <[email protected]>
1189
1190 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
1191 (ShapefileStore.__init__): Factor opening the shapefile into a
1192 separate method (the new _open_shapefile). This makes the code a
1193 bit more readable but the real reason is that it makes some evil
1194 hacks easier. :-)
1195
1196 2003-11-24 Bernhard Herzog <[email protected]>
1197
1198 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
1199 converter is specified for an attribute assume it's a string
1200 containing only Latin1 characters. Update doc-string accordingly.
1201 This change should fix many places where unicode objects might
1202 accidentally enter Thuban.
1203
1204 * test/test_load.py (TestNonAsciiColumnName): New test to check
1205 what happens with column names in DBF files that contain non-ascii
1206 characters
1207
1208 2003-11-21 Bernhard Herzog <[email protected]>
1209
1210 Enable the experimental attribute editing again and introduce a
1211 command line switch to actually activate it
1212
1213 * Thuban/UI/main.py (options): New. Container for options set on
1214 the commmand line
1215 (main): Add the --enable-attribute-editing flag.
1216
1217 * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
1218 editing is enabled use the grid ctrl which allows editing of the
1219 values
1220
1221 * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
1222 New. Just delegate this to the underlying table.
1223
1224 2003-11-20 Bernhard Herzog <[email protected]>
1225
1226 * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
1227 Skip this test if run under non-posix systems since it only works
1228 there
1229
1230 2003-11-19 Bernhard Herzog <[email protected]>
1231
1232 * Thuban/Model/resource.py: Rework the way gdal support is
1233 determined so that we can give a reason in the about why gdal is
1234 not supported.
1235 (gdal_support_status): New. Variable holding a string with the
1236 reason for no gdal support
1237
1238 * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
1239 not supported to the message
1240
1241 2003-11-19 Bernhard Herzog <[email protected]>
1242
1243 Remove the old table interface and its test cases
1244
1245 * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
1246 (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
1247 anymore
1248
1249 * Thuban/Model/transientdb.py (TransientTableBase)
1250 (AutoTransientTable): Do not derive from OldTableInterfaceMixin
1251 anymore
1252
1253 * test/test_table.py: Removed since the old interface it tests is
1254 gone.
1255
1256 * test/runtests.py (main): The old table interface is gone and
1257 with it the deprecation warnings so remove the code that turns
1258 these warnings into errors
1259
1260 2003-11-19 Bernhard Herzog <[email protected]>
1261
1262 * test/test_table.py: Revert to revision 1.5 again. Changing the
1263 tests to use the new table interface is completely wrong since the
1264 whole purpose of the tests in this module is to test the old
1265 interface.
1266
1267 2003-11-18 Bernhard Herzog <[email protected]>
1268
1269 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
1270 New. Test whether the connection matches a set of connection
1271 parameters
1272
1273 * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
1274 (DBFrame.OnAdd): Use the new MatchesParameters method when looking
1275 for existing connections with the same parameters and break out of
1276 the loop correctly.
1277
1278 * test/test_postgis_db.py (TestBriefDescription)
1279 (TestPostGISSimple.test_brief_description): Rename
1280 TestBriefDescription to TestPostGISSimple and the test method to
1281 test_brief_description so that we can add more test methods.
1282 (TestPostGISSimple.test_matches_parameters): New. Test the new
1283 MatchesParameters method
1284
1285 2003-11-18 Bernhard Herzog <[email protected]>
1286
1287 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
1288 _was_destroyed, to indicate whether an publisher instance has
1289 already been destroyed.
1290 (Publisher.Unsubscribe): Only disconnect if the publisher has not
1291 been destroyed yet.
1292 (Publisher.Destroy): Set the _was_destroyed flag to true.
1293
1294 * test/test_connector.py
1295 (TestPublisher.test_unsubscribe_after_destroy): New. Test that
1296 calling Unsubscribe after Destroy doesn't raise an exception
1297
1298 2003-11-14 Bernhard Herzog <[email protected]>
1299
1300 * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
1301 typo in doc-string
1302
1303 2003-11-13 Bernhard Herzog <[email protected]>
1304
1305 Quote table and column names properly for postgis.
1306
1307 * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
1308 quote an identifier for use in an sql statement
1309 (PostGISColumn.__init__): Add the quoted_name attribute
1310 (PostGISTable.__init__): New instance variable quoted_tablename
1311 (PostGISTable._fetch_table_information): Use the quoted table
1312 name. New isntance variable quoted_geo_col with a quoted version
1313 of geometry_column
1314 (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
1315 (PostGISTable.RowOrdinalToId): Use the quoted table name
1316 (PostGISTable.ReadValue, PostGISTable.ValueRange)
1317 (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
1318 (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
1319 (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
1320 Use quoted table and column names
1321
1322 * test/test_postgis_db.py (TestPostGISSpecialCases)
1323 (TestPostGISIgnoredColumns): Rename the class to
1324 TestPostGISSpecialCases because that better describes the new
1325 cases
1326 (TestPostGISSpecialCases.test_unsupported_types)
1327 (TestPostGISSpecialCases.test): Rename the method to
1328 test_unsupported_types because we need a more descriptive name now
1329 that there are more methods
1330 (TestPostGISSpecialCases.test_table_name_quoting)
1331 (TestPostGISSpecialCases.test_column_name_quoting)
1332 (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
1333 cases to test quoting of table and column names in PostGISTable
1334 and PostGISShapeStore
1335
1336 * test/postgissupport.py
1337 (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
1338 AddGeometryColumn desn't support table or column names with sapces
1339 or double quotes
1340
1341 2003-11-12 Jan-Oliver Wagner <[email protected]>
1342
1343 * Extensions/wms/__init__.py: New: Init to make this
1344 directory a package.
1345
1346 * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
1347
1348 2003-11-11 Bernhard Herzog <[email protected]>
1349
1350 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
1351 Constant for the file woth deprecated epsg projections
1352 (get_system_proj_file): Update doc-string
1353
1354 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
1355 above the EPS widgets, introduce a check box for the deprecated
1356 eps projections and a label for the epsg widgets
1357 (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
1358 too
1359
1360 2003-11-11 Bernhard Herzog <[email protected]>
1361
1362 Avoid warnings when run under Python 2.3
1363
1364 * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
1365 (BaseRenderer.draw_label_layer): Coordinates must be ints.
1366
1367 * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
1368 real method so that we can convert to int.
1369 (MapRenderer.label_font): The font size mist be an int.
1370
1371 * Thuban/UI/common.py (Color2wxColour): The color values must be
1372 ints. Also, remove the unnecessary asserts.
1373
1374 * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
1375 (TestUnicodeStrings.test): Python source code should not contain
1376 non-ascii characters unless an encoding is specified in the file.
1377 Therefore use \x escapes in the string literals for non-ascii
1378 characters.
1379
1380 2003-11-11 Bernhard Herzog <[email protected]>
1381
1382 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
1383 parameter so that this function can be used for all proj files in
1384 Resource/Projections
1385 (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
1386 get_system_proj_file
1387
1388 * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
1389 ProjFile self.__sysProjFile use a dictionary of system ProjFile
1390 objects self._sys_proj_files
1391 (ProjFrame.build_dialog): Adapt to the new changes in the
1392 ProjectionList constructor. Add a check button to toggle whether
1393 EPSG projections are shown
1394 (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
1395 events.
1396 (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
1397 the busy cursor if the files have not yet been loaded by the
1398 dialog.
1399 (ProjFrame.load_system_proj): Add a parameter for the name of the
1400 proj file. Maintain the dictionary of system projections
1401 self._sys_proj_files
1402
1403 * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
1404 user_projs parameters into one parameter proj_files which is a
1405 list of proj files.
1406 (ProjectionList._subscribe_proj_files)
1407 (ProjectionList._unsubscribe_proj_files): New. Move
1408 subscription/unsubscription of projfile messages to separate
1409 methods
1410 (ProjectionList.Destroy): The unsubscribe is now done in
1411 _unsubscribe_proj_files
1412 (ProjectionList.update_projections): We now have a list of proj
1413 file objects
1414 (ProjectionList.SetProjFiles): New method to set a new list of
1415 proj file objects
1416
1417 * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
1418 Specify explicitly which system proj file to load.
1419
1420 2003-11-11 Bernhard Herzog <[email protected]>
1421
1422 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
1423 instance variables to cut cyclic references. The GC would have
1424 collected the loader eventually but it can happen that it doesn't
1425 run at all until thuban is closed (2.3 but not 2.2 tries a bit
1426 harder and forces a collection when the interpreter terminates)
1427 (load_session): Call the handler's Destroy method to make sure
1428 that it gets garbage collected early. Otherwise it will be
1429 collected very late if at all and it holds some references to e.g.
1430 shapestores and the session which can lead to leaks (of e.g. the
1431 temporary files)
1432
1433 * test/test_load.py (TestSingleLayer.test_leak): New. test for the
1434 resource leak in load_session
1435
1436 2003-11-10 Bernhard Herzog <[email protected]>
1437
1438 * Thuban/UI/baserenderer.py: Add a way to specify how layers in
1439 extensions are to be rendered.
1440 (_renderer_extensions): New. List with renderer for layers in
1441 extensions
1442 (add_renderer_extension): New. Add a renderer extension
1443 (init_renderer_extensions): New. Init the renderer extensions
1444 (BaseRenderer.render_map_incrementally): Search
1445 _renderer_extensions for how to draw unknown layer types
1446 (BaseRenderer.draw_raster_data): Add format parameter so that
1447 formats other than BMP can be drawn
1448 (BaseRenderer.draw_raster_layer): Pass an explicit format to
1449 draw_raster_data
1450
1451 * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
1452 strings of the format parameter of draw_raster_data method to wx
1453 constants
1454 (MapRenderer.draw_raster_data): Add the format parameter and use
1455 raster_format_map to map it to the right wxwindows constant for
1456 wxImageFromStream
1457
1458 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
1459 the format parameter and record it
1460 (TestBaseRenderer.test_raster_no_projection): check the format
1461 paramter of the draw_raster_data method
1462 (TestBaseRenderer.test_renderer_extension): New. Test the renderer
1463 extension facility
1464
1465 2003-11-07 Bernhard Herzog <[email protected]>
1466
1467 Tweak the usage of the sqlite database to make common use cases
1468 more responsive. In most cases copying the data to the sqlite
1469 database takes so long that using sqlite doesn't have enough
1470 advantages.
1471
1472 * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
1473 comments about performance and query the min and max in separate
1474 statements because only that way will indexes be used.
1475 (TransientTableBase.UniqueValues): Add some comments about
1476 performance.
1477 (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
1478 Do not copy the data to the transient DB but use the transient
1479 copy if it exists. See the new comments for the performance trade
1480 offs
1481
1482 * test/test_transientdb.py
1483 (TestTransientTable.test_auto_transient_table): Make sure that the
1484 data is copied to the transient database at some point.
1485
1486 2003-11-03 Bernhard Herzog <[email protected]>
1487
1488 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
1489 globals to locals so that it's a bit faster
1490
1491 2003-11-03 Bernhard Herzog <[email protected]>
1492
1493 * Thuban/UI/baserenderer.py
1494 (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
1495 method. ReadValue is faster than ReadRowAsDict since it only reads
1496 one cell especially now that the dbf file objects actually
1497 implement it.
1498
1499 * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
1500 read_attribute method of the dbf objects
1501
1502 2003-11-03 Bernhard Herzog <[email protected]>
1503
1504 * Extensions/profiling/profiling.py (popup_dialog_box): New config
1505 variable to indicate whether the result should be shown in a
1506 dialog box
1507 (profile_screen_renderer, time_screen_renderer): Only show a
1508 dialog box if popup_dialog_box is true.
1509 (profile_screen_renderer): Flush stdout after the printing the
1510 first part of the "profiling..." message
1511
1512 * Thuban/UI/baserenderer.py
1513 (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
1514 brushes for the groups so that they're not created over and over
1515 again
1516
1517 * Thuban/Model/classification.py (Classification.__getattr__)
1518 (Classification._compile_classification)
1519 (Classification._clear_compiled_classification): New. Methods to
1520 manage a 'compiled' representation of the classification groups
1521 which is created on demand
1522 (Classification.InsertGroup, Classification.RemoveGroup)
1523 (Classification.ReplaceGroup): reset the compiled representation
1524 (Classification.FindGroup): Use the compiled representation to
1525 find the matching group
1526 (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
1527
1528 2003-10-31 Bernhard Herzog <[email protected]>
1529
1530 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
1531 Send a CLASS_CHANGED message
1532 (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
1533 not return the removed group since it wasn't used.
1534
1535 * test/test_classification.py
1536 (TestClassification.test_set_default_group): New. Test the
1537 SetDefaultGroup method
1538 (TestClassification.test_insert_group): New. Test the InsertGroup
1539 method
1540 (TestClassification.test_remove_group): New. Test the RemoveGroup
1541 method
1542 (TestClassification.test_replace_group): New. Test the
1543 ReplaceGroup method
1544
1545 2003-10-31 Bernhard Herzog <[email protected]>
1546
1547 * test/test_classification.py (TestClassification.setUp):
1548 Subscribe to the CLASS_CHANGED messages
1549 (TestClassification.tearDown): New. Destroy the classification
1550 properly
1551 (TestClassification.test_defaults): Add tests for the default line
1552 width and whether no messages were sent yet
1553 (TestClassification.test_set_default_properties): Add tests for
1554 messages and setting the default line width
1555 (TestClassification.test_add_singleton)
1556 (TestClassification.test_add_range)
1557 (TestClassification.test_multiple_groups): Add tests for messages
1558
1559 2003-10-31 Bernhard Herzog <[email protected]>
1560
1561 Some more refactoring in preparation for new tests:
1562
1563 * test/test_classification.py (TestClassification.setUp): New.
1564 Instantiate the classification here. Update the test methods
1565 accordingly.
1566 (TestClassification.test_multiple_groups): Make sure that the two
1567 singletons matching 1 are considered different.
1568
1569 2003-10-31 Bernhard Herzog <[email protected]>
1570
1571 * test/test_classification.py (red, green, blue): New. These
1572 constants were used in several cases. Update the relevant methods.
1573 (TestClassification.test_defaults)
1574 (TestClassification.test_set_default_properties)
1575 (TestClassification.test_add_singleton)
1576 (TestClassification.test_add_range)
1577 (TestClassification.test_multiple_groups)
1578 (TestClassification.test_deepcopy): New. These were formerly all
1579 part of the single method test.
1580 (TestClassification.test_deepcopy): Removed.
1581 (TestClassIterator): Removed. The test case is now a method of
1582 TestClassification since it tests part of the public interface of
1583 Classification
1584 (TestClassification.test_iterator): New. Used to be
1585 TestClassIterator effectively
1586
1587 2003-10-31 Jan-Oliver Wagner <[email protected]>
1588
1589 GUIfied the functions of the profiling extension.
1590
1591 * /Extensions/profiling/__init__.py: New: Init to make this
1592 directory a package.
1593
1594 * Extensions/profiling/profiling.py: Moved menu entries to
1595 the Extensions menu. Applied _() for strings.
1596 (profile_screen_renderer): Catch the detailed printout and present
1597 it in a dialog.
1598 (time_screen_renderer): Raise a dialog to present the result instead
1599 of printing it to stdout.
1600
1601 2003-10-31 Bernhard Herzog <[email protected]>
1602
1603 * test/test_classification.py (TestClassGroupProperties)
1604 (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
1605 (TestClassGroupSingleton, TestClassIterator, TestClassification):
1606 Split TestClassification into several classes, one for each class
1607 being tested. TestClassification itself now only tests
1608 Classification. This split makes changes to the tests a bit easier
1609
1610 2003-10-31 Bernhard Herzog <[email protected]>
1611
1612 * Extensions/profiling/profiling.py: New. Extension to measure
1613 Thuban performance
1614
1615 2003-10-31 Frank Koormann <[email protected]>
1616
1617 Added two items to legend popup menu: Remove Layer and Show Layer Table
1618
1619 * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
1620 LegendPanel._OnShowTable): New event handlers, call the corresponding
1621 mainwindow methods.
1622 (LegendTree._OnRightClick): Added items to popup menu.
1623
1624 2003-10-30 Bernhard Herzog <[email protected]>
1625
1626 * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
1627 EVT_WINDOW_DESTROY
1628 (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
1629 nothing but is convenient for the derived classes.
1630
1631 * Thuban/UI/tableview.py
1632 (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
1633 Unsubscribe the messages here not in OnClose because that might
1634 get called multiple times. Fixes RT #2196
1635 (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
1636 anymore.
1637
1638 * README: Update the minimum requirement for wxPython. Since we
1639 now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
1640 the version in which that was introduced for all platforms
1641
1642 2003-10-30 Frank Koormann <[email protected]>
1643
1644 * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
1645 the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
1646 frame.
1647
1648 2003-10-30 Jan-Oliver Wagner <[email protected]>
1649
1650 Improved APR import extension, added further EPSG definitions
1651 and some cleanup regarding string class.
1652
1653 * test/test_proj.py (TestProjection.test_get_projection_units_geo):
1654 Added test for alias 'longlat'.
1655
1656 * Resources/Projections/epsg-deprecated.proj: New. Contains
1657 deprecated EPSG definitions.
1658
1659 * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
1660 the variable names for objects.
1661
1662 * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
1663 Copied from importAPR and provided with documentation.
1664
1665 * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
1666 Moved to apr.py.
1667 (APR_View): Added object ref 'ITheme'.
1668
1669 * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
1670 split function by corresponding use of the string class method.
1671
1672 * Thuban/Model/xmlwriter.py: Replaced string replace function by
1673 corresponding string method.
1674
1675 2003-10-29 Bernhard Herzog <[email protected]>
1676
1677 * Thuban/UI/baserenderer.py
1678 (BaseRenderer.draw_shape_layer_incrementally): Speed up the
1679 special case of a classification that only has the default group
1680
1681 2003-10-27 Bernhard Herzog <[email protected]>
1682
1683 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
1684
1685 * po/de.po: Update.
1686
1687 * Thuban/UI/application.py
1688 (ThubanApplication.ShowExceptionDialog): Handle translation of the
1689 dialog message properly
1690
1691 2003-10-27 Bernhard Herzog <[email protected]>
1692
1693 Rework how localization works so that we use wx's translation
1694 functions when running Thuban as a normal application but not when
1695 we don't need any UI, such as in the test suite. See the comment
1696 in Thuban/__init__.py for details
1697
1698 * Thuban/__init__.py (_): Add one level of indirection to make the
1699 translation handling more flexible and to make it possible to use
1700 either wx's translation services or not.
1701 (gettext_identity, translation_function_installed)
1702 (install_translation_function): New function to help with this
1703
1704 * Thuban/UI/__init__.py: Install the wx specific translation
1705 function if it's OK to do that
1706
1707 * test/support.py (initthuban): Install a dummy translation
1708 function so that importing Thuban.UI doesn't install a wx specific
1709 one for which would need to import wxPython
1710
1711 2003-10-27 Bernhard Herzog <[email protected]>
1712
1713 * HOWTO-Release: Source archives should be created first and the
1714 binary packages should be created from the source archives.
1715 There's an official debian package now so there's no need to test
1716 the rpm on debian anymore
1717
1718 2003-10-27 Bernhard Herzog <[email protected]>
1719
1720 Several rendering changes:
1721
1722 - Render the selection into a separate bitmap so that only that
1723 bitmap needs to be redrawn when the selection changes
1724
1725 - Render incrementally showing previews and allowing interaction
1726 before rendering is complete
1727
1728 - Update the renderer interface a bit. Most parameters of
1729 RenderMap are now parameters of the constructor
1730
1731 * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
1732 and the update region as parameters. Update the doc-string
1733 (BaseRenderer.render_map_incrementally): New. Generator function
1734 to renders the map incrementally
1735 (BaseRenderer.render_map): Remove the map argument (it's now in
1736 the constructor) and simply iterate over the
1737 render_map_incrementally generator to draw the map.
1738 (BaseRenderer.draw_shape_layer_incrementally)
1739 (BaseRenderer.draw_shape_layer): Renamed to
1740 draw_shape_layer_incrementally and changed into a generator that
1741 yields True every 500 shapes. Used by render_map_incrementally to
1742 render shape layers incrementally
1743
1744 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
1745 map and region parameters which are now in the constructor
1746 (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
1747 the inherited render_map_incrementally.
1748 (BaseRenderer.draw_shape_layer): Removed.
1749 (ScreenRenderer.draw_selection_incrementally): New. The selection
1750 drawing part of the removed draw_shape_layer as a generator
1751 (ScreenRenderer.layer_shapes): Update because of the region
1752 parameter change
1753 (ExportRenderer.__init__): New. Extend the inherited constructor
1754 with the destination region for the drawing
1755 (ExportRenderer.RenderMap): Removed the map and region parameters
1756 which are now in the constructor
1757
1758 * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
1759 bitmap suitable for a preview in a tool
1760 (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
1761 bitmap
1762 (MapPrintout.draw_on_dc): Adapt to new renderer interface
1763 (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
1764 exists
1765 (MapCanvas.OnIdle): Update the logic to deal with incremental
1766 rendering and the selection bitmap
1767 (MapCanvas._do_redraw): Handle the instantiation of the render
1768 iterator and the redraws during rendering
1769 (MapCanvas._render_iterator): New. Generator to incrementally
1770 redraw both bitmaps
1771 (MapCanvas.Export): Adapt to new renderer interface.
1772 (MapCanvas.full_redraw): Reset the selection bitmap and the
1773 renderer iterator too
1774 (MapCanvas.redraw_selection): New. Force a redraw of the selection
1775 bitmap
1776 (MapCanvas.shape_selected): Only redraw the selection bitmap
1777
1778 * test/test_baserenderer.py
1779 (TestBaseRenderer.test_polygon_no_projection)
1780 (TestBaseRenderer.test_raster_no_projection)
1781 (TestBaseRenderer.test_point_map_projection)
1782 (TestBaseRenderer.test_point_layer_and_map_projection)
1783 (TestBaseRenderer.test_point_layer_projection)
1784 (TestBaseRenderer.test_point_with_classification): Adapt to new
1785 renderer interface
1786
1787 2003-10-24 Bernhard Herzog <[email protected]>
1788
1789 * libraries/thuban/wxproj.cpp (draw_polygon_shape)
1790 (point_in_polygon_shape, shape_centroid): Raise an exception if
1791 the shape can't be read. Previously invalid shape ids would lead
1792 to a segfault.
1793
1794 * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
1795 New. test whether an exception is raised for invalid shape ids
1796
1797 2003-10-24 Jan-Oliver Wagner <[email protected]>
1798
1799 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
1800 as alias for 'latlong'.
1801
1802 * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
1803 as alias for 'latlong'.
1804
1805 2003-10-24 Jan-Oliver Wagner <[email protected]>
1806
1807 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
1808 the projection even for the UnknownPanel.
1809 (UnknownProjPanel.__init__): Define the text and create the textctrl
1810 widget.
1811 (UnknownProjPanel._DoLayout): Replaced static text widget by the
1812 textctrl created in __init__.
1813 (UnknownProjPanel.SetProjection): Set the text for the text ctrl
1814 including the parameters of the projection.
1815
1816 2003-10-24 Jan-Oliver Wagner <[email protected]>
1817
1818 * Resources/Projections/epsg.proj: New. This is a list of
1819 EPSG codes with parameters for proj. The list has been
1820 generated using devtools/create_epsg.py based on the
1821 file nad/epsg of the proj 4.4.7 package. Four projection
1822 definitions have been deleted as they are not accepted by proj:
1823 "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
1824 and "HD72 / EOV".
1825
1826 2003-10-22 Bernhard Herzog <[email protected]>
1827
1828 Some more tweaks to the projection dialog which should fix RT
1829 #1886.
1830
1831 * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
1832 the ProjFile's messages and call the base class methods correctly
1833 (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
1834 flag on the newly selected item too. Otherwise some other item is
1835 focused and the first time the focus is moved with the keyboard
1836 the selection moves in unexpected ways.
1837
1838 * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
1839 focus on the OK button, only on the projection list. That way the
1840 list really has the focus initially
1841 (ProjFrame.OnClose): Call the projection list's Destroy method to
1842 make it unsubscribe all messages
1843
1844 2003-10-21 Bernhard Herzog <[email protected]>
1845
1846 Rework the projection dialog to fix a few bugs, including RT 2166
1847 and most of 2168
1848
1849 * Thuban/UI/projlist.py: New. The class ProjectionList is a
1850 special wxListCtrl to show a list of projections in a more MVC
1851 fashion
1852
1853 * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
1854 throughout the class. The main change is to use the ProjectionList
1855 class instead of a normal wxListBox. Also, add an explicit
1856 "Unknown" projection to the projection choice control.
1857 (ProjPanel.__init__): Add an "unknown" ellipsoid
1858 (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
1859 instantiation of the panel's controls to make the tab-order more
1860 natural
1861
1862 2003-10-21 Bernhard Herzog <[email protected]>
1863
1864 * test/test_load.py (TestSingleLayer.file_contents)
1865 (TestSingleLayer.test): Add non-ascii characters to the titles of
1866 session, map and layer. This is effectively a port of the
1867 TestUnicodeStrings test in test_load_0_8.py which for some reason
1868 was only added there.
1869
1870 * test/test_load_0_9.py (TestSingleLayer.file_contents)
1871 (TestSingleLayer.test): Same as in test_load.py: add non-ascii
1872 characters to the titles of session, map and layer,.
1873
1874 2003-10-21 Bernhard Herzog <[email protected]>
1875
1876 Add EPSG projection handling to .thuban files
1877
1878 * test/test_save.py (SaveSessionTest.dtd)
1879 (SaveSessionTest.testEmptySession)
1880 (SaveSessionTest.testLayerProjection)
1881 (SaveSessionTest.testRasterLayer)
1882 (SaveSessionTest.testClassifiedLayer)
1883 (SaveSessionTest.test_dbf_table)
1884 (SaveSessionTest.test_joined_table)
1885 (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
1886 (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
1887 use a and epsg projection to test saving them
1888
1889 * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
1890 namespace
1891 (TestLayerVisibility.file_contents, TestLabels.file_contents)
1892 (TestLayerProjection.file_contents)
1893 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
1894 (TestPostGISLayer.file_contents)
1895 (TestPostGISLayerPassword.file_contents)
1896 (TestLoadError.file_contents, TestLoadError.test): Update to use
1897 1.0-dev namespace
1898 (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
1899 use 1.0-dev namespace and use an EPSG projection to test whether
1900 loading it works
1901
1902 * test/test_load_0_9.py: New. Effectively a copy of test_load.py
1903 as of Thuban 0.9. These are now tests to determine whether Thuban
1904 can still read files generated by Thuban 0.9
1905
1906 * Thuban/Model/save.py (SessionSaver.write)
1907 (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
1908 namespace
1909 (SessionSaver.write_projection): Write the projection's epsg
1910 attribute
1911
1912 * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
1913 thuban-1.0-dev.dtd namespace
1914 (SessionLoader.check_attrs): Allow a callable object as conversion
1915 too
1916 (SessionLoader.start_projection, SessionLoader.end_projection)
1917 (SessionLoader.start_parameter): Handle the epsg attribute and
1918 rename a few instance variables to lower case
1919
1920 * Resources/XML/thuban-1.0.dtd: New. Only difference to
1921 thuban-0.9.dtd is the epsg attribute for projections.
1922
1923 2003-10-21 Bernhard Herzog <[email protected]>
1924
1925 * test/runtests.py (main): Let the user specify which tests to run
1926 on the command line
1927
1928 * test/support.py (ThubanTestResult.getDescription): Override to
1929 give a better short description. The description can be used as a
1930 parameter to run_tests to run that particular test in isolation.
1931
1932 2003-10-21 Frank Koormann <[email protected]>
1933
1934 Popup menu for legend. Scheduled for the 1.2 release this was too
1935 simple to implement: The popup menu is bound to the legend tree, while
1936 the events are hanlded by its anchestor, the legend panel. This
1937 allows reuse of all the event handlers already implemented for the
1938 legend toolbar buttons.
1939
1940 * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
1941 to add handlers for the events issued by the popup menu.
1942 (LegendPanel._OnToggleVisibility): Handler for toggling layer
1943 visibility event
1944 (LegendPanel._OnProjection): Handler for layer projection event.
1945 (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
1946 (LegendTree._OnRightClick): Event handler for right click, select item
1947 and pop up menu.
1948 (LegendTree.ToggleVisibility): Toggle layer visibility
1949 (LegendTree.LayerProjection): Raise layer projection dialog for
1950 current layer.
1951
1952 2003-10-21 Bernhard Herzog <[email protected]>
1953
1954 * Resources/Projections/defaults.proj: Use correct DOCTYPE
1955 declaration. The top-level element is projectionlist not projfile
1956
1957 2003-10-20 Bernhard Herzog <[email protected]>
1958
1959 * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
1960 method to write a projfile and display a busy cursor and error
1961 dialogs.
1962 (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
1963 (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
1964 (ProjFrame.__FillAvailList): Translate "<None>" too and display a
1965 busy cursor while loading the user and system prj files.
1966
1967 2003-10-16 Bernhard Herzog <[email protected]>
1968
1969 * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
1970 ProjFile objects
1971 (clear_proj_file_cache): New function to clear the cache. Mainly
1972 useful for use by the test suite
1973 (read_proj_file): Use the cache.
1974
1975 * test/test_proj.py (TestProjFile): Clarify the doc-string
1976 (ProjFileReadTests): Update doc-string
1977 (ProjFileReadTests.test_get_system_proj_file): Check whether the
1978 system proj files is cached.
1979 (ProjFileLoadTestCase): New base class for the proj file tests
1980 derived from support.FileLoadTestCase to provide some common
1981 behavior.
1982 (TestLoadingProjFile)
1983 (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
1984 (TestProjFileWithInvalidParameters.file_contents): Derive from
1985 ProjFileLoadTestCase
1986 (TestLoadingProjFile.test_caching): New. Test whether the cache
1987 works
1988
1989 2003-10-16 Silke Reimer <[email protected]>
1990
1991 * debian/*: New directory with configuration files for building a thuban
1992 deb-package.
1993
1994 2003-10-14 Bernhard Herzog <[email protected]>
1995
1996 * test/test_proj.py: Execute support.run_tests when run as
1997 __main__ so that missing unsubscribes are detected
1998 (TestProjFile.tearDown): Destroy the proj_file properly
1999
2000 2003-10-14 Bernhard Herzog <[email protected]>
2001
2002 * Thuban/Model/messages.py (PROJECTION_ADDED)
2003 (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
2004 the ProjFile objects
2005
2006 * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
2007 easily send messages when the projections change
2008 (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
2009 when the change was successful
2010
2011 * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
2012 proj file messages
2013 (TestProjFile.test_add_remove)
2014 (TestProjFile.test_remove_non_existing)
2015 (TestProjFile.test_replace)
2016 (TestProjFile.test_replace_non_existing): Test whether the right
2017 messages are sent
2018
2019 2003-10-14 Bernhard Herzog <[email protected]>
2020
2021 * test/test_proj.py (TestProjFile.test): Refactor into several
2022 tests
2023 (TestProjFile.test_add_remove)
2024 (TestProjFile.test_remove_non_existing)
2025 (TestProjFile.test_replace)
2026 (TestProjFile.test_replace_non_existing): Some of the new
2027 individual test cases
2028 (TestProjFileSimple): New class for the rest of the test cases
2029 that came out of the refactoring
2030 (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
2031 derived classes don't have to
2032
2033 2003-10-13 Bernhard Herzog <[email protected]>
2034
2035 Add an optional EPSG code to the projection objects and extend the
2036 .proj file format accordingly.
2037
2038 * Resources/XML/projfile.dtd (element projection): Add epsg
2039 attribute
2040
2041 * Thuban/Model/proj.py (Projection.__init__): New parameter and
2042 instance variable epsg. Update doc-string
2043 (Projection.EPSGCode, Projection.Label): New methods to provide
2044 access to EPSG code and a label for use in dialogs
2045
2046 * Thuban/Model/resource.py (ProjFileReader.start_projection)
2047 (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
2048 Handle the epsg code attribute when reading or writing proj files
2049
2050 * Thuban/UI/projdialog.py (ProjFrame._OnSave)
2051 (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
2052 (ProjFrame.__FillAvailList): Use the projection's Label method to
2053 get the string for the list box
2054
2055 * test/test_proj.py (TestProjection.test_label)
2056 (TestProjection.test_label_epsg)
2057 (TestProjection.test_epsgcode_for_non_epsg_projection)
2058 (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
2059 for the label and EPSGCode methods
2060 (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
2061 (WriteProjFileTests.test_write_empty_file): Create the ProjFile
2062 objects in the test cases and put the expected contents into the
2063 test case methods too. Update doTestWrite accordingly
2064 (TestLoadingProjFile)
2065 (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
2066 read tests from TestProjFile.
2067 (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
2068 tests are now in the new classes.
2069 (sample_projfile, sample_projfile_data)
2070 (sample_projfile2, sample_projfile_data2): Removed. Not used
2071 anymore.
2072 (TestProjFile.test_read_unreadable_file): No need to reset the
2073 permissions at the end anymore since we use a unique filename
2074
2075 2003-10-13 Bernhard Herzog <[email protected]>
2076
2077 * test/test_proj.py: Some more refactoring of the test cases
2078 (ProjFileTest): New base class for the proj file tests.
2079 (TestProjFile): Derive from ProjFileTest
2080 (TestProjFile.test_read_unreadable_file)
2081 (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
2082 the new filename method to get a unique filename
2083 (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
2084 (WriteProjFileTests): New class for proj file write tests.
2085 Contains the write test that were in TestProjFile originally.
2086
2087 2003-10-13 Bernhard Herzog <[email protected]>
2088
2089 * test/test_proj.py (TestProjFile.testRead)
2090 (TestProjFile.test_read_non_existing_file)
2091 (TestProjFile.test_read_unreadable_file)
2092 (TestProjFile.test_read_empty_file): Split into several methods.
2093
2094 2003-10-10 Bernhard Herzog <[email protected]>
2095
2096 * Thuban/UI/sizers.py: New file with custom sizers.
2097
2098 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
2099 all projection type specific panels and put them into a
2100 NotebookLikeSizer. This way the dialog doesn't change its size
2101 when a different projection is selected
2102 (ProjFrame.__init__): Rename projection_panels
2103 projection_panel_defs and reuse projection_panels for a list of
2104 the instantiated panels.
2105 (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
2106 (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
2107 the panels
2108 (UnknownProjPanel._DoLayout): Place the newlines in the message
2109 differently to make the panel narrower.
2110 (TMPanel._DoLayout): Layout the parameters in one column.
2111
2112 2003-10-10 Bernhard Herzog <[email protected]>
2113
2114 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
2115 that contains all the setup for the dialog's widgets, layout and
2116 event handling.
2117 (__): Call build_dialog to build the dialog.
2118 (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
2119 Their functionality is now in build_dialog
2120 (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
2121 (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
2122 (ProjFrame.__DoOnProjChoice): Small updates due to slightly
2123 different widget names and hierarchy introduced with build_dialog.
2124
2125 2003-10-10 Bernhard Herzog <[email protected]>
2126
2127 * README: Fix typo.
2128
2129 2003-10-09 Bernhard Herzog <[email protected]>
2130
2131 * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
2132 projection is already in the list. This is *a lot* faster when
2133 loading files with hundreds of projections since it saves a linear
2134 search. OTOH this will allow adding the same projection to the
2135 user.proj file multiple times in the projection dialog but we'll
2136 deal with that later
2137
2138 2003-10-09 Jan-Oliver Wagner <[email protected]>
2139
2140 * devtools: New. Directory for developer tools that are not intended
2141 for the regular user.
2142
2143 * devtools/create_epsg.py: New. Convert the epsg file of proj into
2144 a python .proj file.
2145
2146 2003-10-09 Bernhard Herzog <[email protected]>
2147
2148 * test/test_proj.py
2149 (TestProjection.test_get_parameter_without_equals_sign): New. Test
2150 whether GetParameter handles parameters without "=" sign correctly
2151
2152 * Thuban/Model/proj.py (Projection.GetParameter): Handle
2153 parameters that do not contain a "=". Update the doc-string
2154
2155 2003-10-08 Bernhard Herzog <[email protected]>
2156
2157 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
2158 length limit on the projname text control
2159
2160 2003-10-08 Bernhard Herzog <[email protected]>
2161
2162 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
2163 (TestProjection.test_get_projection_units_normal): New. Tests for
2164 the Projection.GetProjectedUnits method
2165
2166 2003-10-08 Jan-Oliver Wagner <[email protected]>
2167
2168 * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
2169 Added missing 'val' parameter.
2170
2171 2003-10-08 Bernhard Herzog <[email protected]>
2172
2173 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
2174 projection type of the currently selected projection is not known,
2175 i.e. there's no panel for it, use the UnknownProjPanel
2176 (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
2177 the actual replacing of the proj panel into the new method
2178 _show_proj_panel.
2179 (UnknownProjPanel): Add doc-string.
2180 (UnknownProjPanel._DoLayout): Insert a newline into the text so
2181 that the panel is not so wide.
2182
2183 2003-10-08 Bernhard Herzog <[email protected]>
2184
2185 * Thuban/Model/resource.py (read_proj_file): Return the warnings
2186 too. Update the doc-string
2187 (get_proj_files): Removed. It wasn't used anywhere
2188 (get_system_proj_files, get_system_proj_file): Rename to
2189 get_system_proj_file and return the ProjFile object and not a list
2190 of ProjFile objects. Update the callers.
2191 (get_user_proj_files, get_user_proj_file): Rename to
2192 get_user_proj_file return the ProjFile object and not a list of
2193 ProjFile objects. Update the callers.
2194 (ProjFileReader.__init__): New instance variable for the warnings.
2195 Rename the __pf ivar to projfile. Update the methods referring to
2196 __pf
2197 (ProjFileReader.end_projection): Catch any errors raised when
2198 instantiating the projection and record that as an error. The
2199 projection will not be in the final ProjFile object.
2200 (ProjFileReader.GetWarnings): New method to return the warnings.
2201
2202 * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
2203 show the warnings from the projfile reader
2204 (ProjFrame._OnImport): Deal with any warnings returned by
2205 read_proj_file
2206 (ProjFrame.__FillAvailList): Deal with any warnings returned by
2207 get_system_proj_file or get_user_proj_file.
2208
2209 * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
2210 (TestProjFileWithInvalidParameters.file_contents): New test cases
2211 to test whether read_proj_file handles invalid projection
2212 parameters correctly
2213 (TestProjFile.test_get_system_proj_file): New. Simple test for
2214 resource.get_system_proj_file
2215
2216 2003-10-07 Bernhard Herzog <[email protected]>
2217
2218 * test/test_derivedshapestore.py
2219 (TestDerivedShapeStoreExceptions.tearDown): Clear the session
2220 properly so that the temporary directories get deleted correctly
2221
2222 2003-10-06 Bernhard Herzog <[email protected]>
2223
2224 Handle the title changes in a proper MVC way.
2225
2226 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
2227 canvas' TITLE_CHANGED messages
2228 (MainWindow.update_title): New. Update the main window's title
2229 (MainWindow.__SetTitle): Removed. Use update_title instead.
2230 (MainWindow.SetMap): Use update_title instead of __SetTitle
2231 (MainWindow.RenameMap): Do change the window title explicitly
2232 here. That's handled in a proper MVC way now.
2233 (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
2234 messages
2235
2236 * Thuban/Lib/connector.py (Conduit): New class to help classes
2237 that forward messages
2238
2239 * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
2240 (ViewPort): Derive from Conduit instead of Publisher
2241 (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
2242 when calling the inherited versions
2243 (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
2244 methods to subscribe and unsubscribe map messages
2245 (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
2246 handle the map subscriptions
2247 (ViewPort.Map, ViewPort.map_projection_changed)
2248 (ViewPort.layer_projection_changed): Add or update doc-strings
2249
2250 * test/test_connector.py (TestPublisher.test_issue_simple): Fix
2251 typo
2252 (MyConduit): Helper class for the Conduit test.
2253 (TestConduit): Test cases for Conduit
2254
2255 * test/test_connector.py: Use support.run_tests as main.
2256
2257 * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
2258 the TITLE_CHANGED messages
2259 (ViewPortTest.test_forwarding_title_changed): New test to check
2260 whether the viewport forwards the map's TITLE_CHANGED messages
2261 (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
2262 after the port's because the latter may require a still functional
2263 map.
2264
2265 2003-10-06 Bernhard Herzog <[email protected]>
2266
2267 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
2268 doc-string
2269
2270 2003-10-06 Bernhard Herzog <[email protected]>
2271
2272 * test/test_viewport.py (ViewPortTest.setUp)
2273 (SimpleViewPortTest.test_init_with_size): Move the test for the
2274 initial size as a constructor parameter from ViewPortTest.setUp
2275 method to a new separate test in SimpleViewPortTest.
2276
2277 2003-10-06 Bernhard Herzog <[email protected]>
2278
2279 * test/test_viewport.py (MockView): New class derived from
2280 ViewPort with a mock implementation of GetTextExtent to be used in
2281 the test cases
2282 (ViewPortTest.setUp): Use MockView instead of ViewPort
2283
2284 * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
2285 into what would be a "pure virtual function" in C++: always raise
2286 NotImplementedError. Mock implementations for test cases don't
2287 belong into the real code
2288
2289 2003-10-02 Bernhard Herzog <[email protected]>
2290
2291 * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
2292 close the dbf file we create so that it's contents have been
2293 written properly.
2294
2295 * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
2296 libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
2297 Update to shapelib 1.2.10
2298
2299 2003-10-01 Jan-Oliver Wagner <[email protected]>
2300
2301 * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
2302 it annoys lintian which warns about these files not being
2303 executable. The #! isn't necessary here since if you absolutely
2304 must execute them you can always say "python <filename>".
2305
2306 2003-09-26 Bernhard Herzog <[email protected]>
2307
2308 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
2309 only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
2310 is ported to a newer the import will fail, so it should be noticed
2311 immediately that this function is gone.
2312 Fixes RT#1919
2313
2314 2003-09-26 Bernhard Herzog <[email protected]>
2315
2316 Add a DTD for the projection files and make thuban write valid
2317 projection files
2318
2319 * Resources/XML/projfile.dtd: New. DTD for thuban's projection
2320 files
2321
2322 * Thuban/Model/resource.py (ProjFileSaver.write): Use
2323 'projectionlist' as the name in the document type declaration so
2324 that it matches the element type of the root element.
2325
2326 * test/test_proj.py (sample_projfile, sample_projfile2): Use
2327 'projectionlist' as the name in the document type declaration just
2328 as it is done now in the files thuban would write
2329 (sample_projfile, sample_projfile_data): Fix spelling of
2330 "Mercator"
2331 (TestProjFile.doTestWrite): Validate the written and the expected
2332 XML data
2333 (TestProjFile): Derive from ValidationTest so that we can run xml
2334 validation tests
2335
2336 2003-09-24 Bernhard Herzog <[email protected]>
2337
2338 * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
2339 modify the list returned by map.Layers() in place since it is the
2340 actual list of layers used by the map.
2341
2342 2003-09-23 Jan-Oliver Wagner <[email protected]>
2343
2344 * Doc/manual/thuban-manual.xml: Added subsection to chapter
2345 Extensions to describe the extensions coming with the Thuban
2346 standard package (gns2shp and importAPR).
2347
2348 2003-09-23 Bernhard Herzog <[email protected]>
2349
2350 * libraries/thuban/wxproj.cpp (project_point): if there's an
2351 inverse but no forward projection, convert to degrees after
2352 applying the inverse projection. Fixes RT#2096
2353
2354 * test/test_wxproj.py: New. Test cases for wxproj.so. One test
2355 implicitly tests for the fix to RT#2096
2356
2357 * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
2358 Check that the sequences have the same lengths
2359
2360 * Resources/Projections/defaults.proj (Geographic projection): Use
2361 a much more precise value for the to_meter attribute.
2362
2363 2003-09-22 Bernhard Herzog <[email protected]>
2364
2365 * test/support.py (initthuban): Make sure to unset the LANG env.
2366 var. so that tests that compare translated strings work. Solves RT
2367 #2094
2368
2369 2003-09-22 Jan-Oliver Wagner <[email protected]>
2370
2371 Small improvement of APR import.
2372
2373 * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
2374 Added tests for text-ranges.
2375
2376 * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
2377 returns a string object if the range is based on text.
2378
2379 * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
2380 range retrieval.
2381
2382 2003-09-22 Jan-Oliver Wagner <[email protected]>
2383
2384 Initial version of the importAPR extension which is in
2385 experimental state.
2386
2387 * /Extensions/importAPR/, /Extensions/importAPR/samples/,
2388 /Extensions/importAPR/test/: New directories.
2389
2390 * /Extensions/importAPR/samples/README: New: Howto load the samples.
2391
2392 * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
2393 file which refers to the Thuban Iceland demo data.
2394
2395 * /Extensions/importAPR/test/README: New: Howto execute the tests.
2396
2397 * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
2398
2399 * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
2400 as in '.apr'-files.
2401
2402 * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
2403 ODB Objects as in '.apr', '.avl' and other files.
2404
2405 * /Extensions/importAPR/__init__.py: New: Init to make this
2406 directory a package.
2407
2408 * /Extensions/importAPR/importAPR.py: New: Import a ArcView
2409 project file (.apr) and convert it to Thuban.
2410
2411 2003-09-22 Jan-Oliver Wagner <[email protected]>
2412
2413 * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
2414
2415 2003-09-19 Jan-Oliver Wagner <[email protected]>
2416
2417 * Doc/manual/thuban-manual.xml: Extended section 'Installation'
2418 with description on RPM installation and RPM binary package
2419 creation.
2420
2421 2003-09-18 Bernhard Herzog <[email protected]>
2422
2423 * setup.py (data_files): Only add the mo files if the Locales
2424 directory actually exists, so that setup.py works with a fresh CVS
2425 checkout
2426
2427 2003-09-12 Jan-Oliver Wagner <[email protected]>
2428
2429 * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
2430 in viewport, not anymore in view
2431
2432 2003-09-04 Jan-Oliver Wagner <[email protected]>
2433
2434 Introducing first Extension (gns2shp).
2435
2436 * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
2437
2438 * Extensions/__init__.py: New. init to make this dir a package.
2439
2440 * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
2441
2442 * Extensions/gns2shp/test/README: New. some info on this test directory.
2443
2444 * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
2445
2446 * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
2447 of Shapefile from GNS text file format
2448
2449 2003-09-03 Jan-Oliver Wagner <[email protected]>
2450
2451 Fix/workaround for bug #2019:
2452 https://intevation.de/rt/webrt?serial_num=2019
2453
2454 * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
2455 (IdentifyView.__init__): Added another button that allows to
2456 stop the identify mode.
2457 (IdentifyView.OnStop): New. Stops the identify mode.
2458
2459 2003-09-03 Jan-Oliver Wagner <[email protected]>
2460
2461 Introducing a new exception dialog that allows to exit the
2462 application immediately.
2463 This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
2464
2465 * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
2466
2467 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
2468 Made strings available to translations. Exchanged the simple
2469 ScrolledMessageDialog by the new ExceptionDialog.
2470
2471 2003-09-01 Bernhard Herzog <[email protected]>
2472
2473 * NEWS: New. Summary of changes and release notes.
2474
2475 * MANIFEST.in: Add NEWS
2476
2477 2003-09-01 Bernhard Herzog <[email protected]>
2478
2479 * MANIFEST.in: Correct the include statement for the mo-files and
2480 include the documentation too.
2481
2482 * setup.py (data_files): Add the .mo files
2483 (setup call): Up to version 0.9.0
2484
2485 2003-09-01 Bernhard Herzog <[email protected]>
2486
2487 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
2488 parameter list to just parent and session
2489 (ChooseDBTableDialog.__set_properties): Removed. Setting the
2490 selection of empty list boxes is not allowed (and produces C++
2491 assertion errors) and the rest of the setup is better done in
2492 __init__ anyway.
2493 (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
2494 (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
2495 builtins True/False for booleans to avoid warnings from wxPython
2496
2497 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
2498 ChooseDBTableDialog constructor parameters.
2499
2500 2003-09-01 Bernhard Herzog <[email protected]>
2501
2502 * Thuban/Model/postgisdb.py
2503 (PostGISTable): Extend doc-string
2504 (PostGISTable._fetch_table_information): Set the column index
2505 correctly, pretending ignored columns don't exist.
2506
2507 * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
2508 for postgis tables with data types not yet supported by thuban.
2509
2510 2003-08-29 Bernhard Herzog <[email protected]>
2511
2512 * HOWTO-Release: Tweak item about running the tests.
2513
2514 2003-08-29 Jan-Oliver Wagner <[email protected]>
2515
2516 * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
2517
2518 2003-08-29 Bernhard Herzog <[email protected]>
2519
2520 Add some missing parameters to projections. Proj complains about
2521 them on windows but for some reason not on Linux.
2522
2523 * test/test_save.py (SaveSessionTest.testLayerProjection): Add
2524 missing required projection parameters
2525
2526 * test/test_proj.py (TestProjFile.test): Add missing required
2527 projection parameters
2528
2529 * test/test_load_0_8.py (TestLayerProjection.file_contents)
2530 (TestLayerProjection.test): Add missing required projection
2531 parameters and tests for them
2532
2533 * test/test_load.py (TestLayerProjection.file_contents)
2534 (TestLayerProjection.test): Add missing required projection
2535 parameters and tests for them
2536
2537 * test/test_layer.py (TestLayer.test_base_layer): Add missing
2538 required projection parameters
2539
2540 2003-08-29 Bernhard Herzog <[email protected]>
2541
2542 * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
2543 access the pj_errno because directly accessing pj_errno doesn't
2544 work on windows if the proj library is in a DLL
2545
2546 * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
2547
2548 2003-08-28 Bernhard Herzog <[email protected]>
2549
2550 * test/test_proj.py: Import things from Thuban after calling
2551 initthuban
2552
2553 * test/test_load.py (LoadSessionTest.filenames): New class
2554 variable with the filename attributes to normalize
2555 (LoadSessionTest.check_format): Pass self.filenames to
2556 sax_eventlist to normalize the filename attributes
2557
2558 * test/xmlsupport.py: Add cvs keywords
2559 (SaxEventLister.__init__): New parameter filenames which indicates
2560 attributes that contain filenames
2561 (SaxEventLister.startElementNS): Normalize the filename attributes
2562 with os.path.normpath
2563 (sax_eventlist): New parameter filenames to pass through to
2564 SaxEventLister
2565
2566 * test/test_derivedshapestore.py: Make this file callable as a
2567 program to execute the tests
2568 (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
2569 the session to self.session so that it gets destroyed properly
2570
2571 * test/test_layer.py (TestLayer.tearDown): Call the session's
2572 Destroy method
2573
2574 * test/test_map.py (TestMapBase.tearDown): Destroy self.session
2575 too if it exists
2576 (TestMapAddLayer.test_add_layer): Bind the session to self.session
2577 so that it gets destroyed properly
2578
2579 * test/postgissupport.py (reason_for_not_running_tests): Add a
2580 test for the existence of popen2.Popen4.
2581
2582 * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
2583 reliable way to destroy the sessions created in the test cases
2584 (SaveSessionTest.test_dbf_table): Bind the session to self.session
2585 so that it gets destroyed properly
2586 (SaveSessionTest.testLayerProjection): Bind the session to
2587 self.session so that it gets destroyed properly
2588
2589 * test/test_session.py (UnreferencedTablesTests.tearDown): Make
2590 sure that the session is destroyed properly
2591
2592 * test/test_shapefilestore.py: Make this callable as a program to
2593 execute the tests
2594
2595 * test/test_scalebar.py: Remove unnecessary import of _ from
2596 Thuban
2597
2598 * test/support.py (print_garbage_information): Call initthuban
2599 here because it may be called indirectly from test cases that test
2600 test support modules which do not use anything from thuban itself
2601 (ThubanTestProgram.runTests): Remove unnecessary debug print
2602
2603 2003-08-28 Bernhard Herzog <[email protected]>
2604
2605 * Thuban/version.py (longversion): Update to 0.9
2606
2607 * Thuban/UI/mainwindow.py: Remove some unused imports
2608
2609 * README: Add section about required additional software. Add date
2610 and revision CVS keywords
2611
2612 * HOWTO-Release: Add item about the translations. Add date and
2613 revision CVs keywords and change formatting to match README a bit
2614 better
2615
2616 * po/de.po: Update for 0.9
2617
2618 * test/README: Tweak the wording a little because many tests are
2619 not really unittest.
2620
2621 2003-08-27 Bernhard Herzog <[email protected]>
2622
2623 As preparation for the 0.9 release, switch thuban files to a
2624 non-dev namespace
2625
2626 * Thuban/Model/save.py (SessionSaver.write_session): Write files
2627 with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
2628 namespace
2629
2630 * Thuban/Model/load.py (SessionLoader.__init__): Accept the
2631 http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
2632
2633 * test/test_save.py (SaveSessionTest.dtd)
2634 (SaveSessionTest.testEmptySession)
2635 (SaveSessionTest.testSingleLayer)
2636 (SaveSessionTest.testLayerProjection)
2637 (SaveSessionTest.testRasterLayer)
2638 (SaveSessionTest.testClassifiedLayer)
2639 (SaveSessionTest.test_dbf_table)
2640 (SaveSessionTest.test_joined_table)
2641 (SaveSessionTest.test_save_postgis): Update for new namespace
2642
2643 * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
2644 (TestLayerVisibility.file_contents, TestLabels.file_contents)
2645 (TestLayerProjection.file_contents)
2646 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2647 (TestPostGISLayer.file_contents)
2648 (TestPostGISLayerPassword.file_contents)
2649 (TestLoadError.file_contents, TestLoadError.test): Update for new
2650 namespace
2651
2652 2003-08-27 Bernhard Herzog <[email protected]>
2653
2654 Make the table interface distinguish between row ids (an integer
2655 that uniquely identifies a row) and row ordinals (a simple row
2656 count from 0 to NumRows() - 1)
2657
2658 * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
2659 (PostGISTable.RowOrdinalToId): New methods to conver between row
2660 ids and row ordinals
2661 (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
2662 parameter row_is_ordinal to indicate whether the row parameter is
2663 the row id or the ordinal
2664
2665 * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
2666 (TransientTableBase.RowOrdinalToId)
2667 (AutoTransientTable.RowIdToOrdinal)
2668 (AutoTransientTable.RowOrdinalToId): Same new methods as in
2669 PostGISTable.
2670 (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
2671 (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
2672 Same new parameter as in PostGISTable.
2673
2674 * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
2675 (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
2676 (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
2677 (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
2678 (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
2679 parameter as in PostGISTable.
2680
2681 * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
2682 (DataTable.RowOrdinalToId): New methods to convert between row ids
2683 and row ordinals.
2684 (TableGrid.SelectRowById): New method to select a row based on its
2685 ID as opposed to its ordinal
2686 (DataTable.GetValue, TableGrid.OnRangeSelect)
2687 (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
2688 (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
2689 (LayerTableFrame.__init__): Convert between row ids and row
2690 ordinals as appropriate
2691
2692 * test/postgissupport.py (PostGISDatabase.__init__): Add
2693 doc-string.
2694 (PostGISDatabase.initdb): The optional third item in a tuple in
2695 tables is now a (key, value) list with additional arguments to
2696 pass to upload_shapefile
2697 (upload_shapefile): New parameter gid_offset to allow gids that
2698 are not the same as the shapeids in the shapefile
2699 (PostgreSQLServer.get_default_static_data_db): Use the new
2700 gid_offset to make the gids in landmarks 1000 higher than the
2701 shapeids in the shapefile
2702
2703 * test/test_viewport.py
2704 (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
2705 new shapeids in the landmarks table
2706
2707 * test/test_transientdb.py
2708 (TestTransientTable.run_iceland_political_tests)
2709 (TestTransientTable.test_transient_joined_table): Add tests for
2710 the new table methods and new keywords arguments.
2711
2712 * test/test_postgis_db.py
2713 (TestPostGISTable.test_read_row_as_dict_row_count_mode)
2714 (TestPostGISTable.test_read_value_row_count_mode)
2715 (TestPostGISTable.test_row_id_to_ordinal)
2716 (TestPostGISTable.test_row_oridnal_to_id): New test for the new
2717 table methods and the new arguments
2718 (TestPostGISShapestorePoint.test_shapes_in_region)
2719 (TestPostGISShapestorePoint.test_shape_raw_data)
2720 (TestPostGISShapestorePoint.test_shape_points)
2721 (TestPostGISShapestorePoint.test_shape_shapeid)
2722 (TestPostGISShapestorePoint.test_all_shapes)
2723 (TestPostGISTable.test_simple_query)
2724 (TestPostGISTable.test_simple_query)
2725 (TestPostGISTable.test_simple_query)
2726 (TestPostGISTable.test_read_value)
2727 (TestPostGISTable.test_read_row_as_dict): Adapt to the new
2728 shapeids in the landmarks table
2729
2730 * test/test_memory_table.py
2731 (TestMemoryTable.test_read_row_as_dict_row_count_mode)
2732 (TestMemoryTable.test_read_value_row_count_mode)
2733 (TestMemoryTable.test_row_id_to_ordinal)
2734 (TestMemoryTable.test_row_oridnal_to_id): New test for the new
2735 table methods and the new arguments
2736
2737 * test/test_dbf_table.py
2738 (TestDBFTable.test_read_row_as_dict_row_count_mode)
2739 (TestDBFTable.test_read_value_row_count_mode)
2740 (TestDBFTable.test_row_id_to_ordinal)
2741 (TestDBFTable.test_row_oridnal_to_id): New test for the new table
2742 methods and the new arguments
2743
2744 2003-08-26 Bernhard Herzog <[email protected]>
2745
2746 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
2747 more postgis specific but much faster method to get the bounding
2748 box
2749
2750 2003-08-26 Bernhard Herzog <[email protected]>
2751
2752 * Thuban/Model/postgisdb.py (PostGISTable.Title)
2753 (PostGISShapeStore.AllShapes): Add these missing methods.
2754 (PostGISShapeStore.ShapesInRegion): No need to raise
2755 StopIteration. We can simply return
2756
2757 * test/test_postgis_db.py (TestPostGISTable.test_title)
2758 (TestPostGISShapestorePoint.test_all_shapes): New tests for the
2759 new methods
2760
2761 2003-08-25 Bernhard Herzog <[email protected]>
2762
2763 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
2764
2765 * test/test_postgis_db.py (PolygonTests): New class containing
2766 those tests from TestPostGISShapestorePolygon that can also be
2767 used to test MUTLIPOLYGON tables
2768 (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
2769 so derive from that
2770 (TestPostGISShapestoreMultiPolygon): New class with tests for
2771 MUTLIPOLYGON tables
2772
2773 * test/postgissupport.py (PostGISDatabase.initdb): Allow the
2774 tables argument to have tuples with three items to override the
2775 WKT type used.
2776 (PostgreSQLServer.get_default_static_data_db): Use the above to
2777 create a polygon table with MUTLIPOLYGONs
2778 (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
2779 (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
2780 coords_to*
2781 (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
2782 (wkt_converter): New. Map WKT types to converters
2783 (upload_shapefile): New parameter force_wkt_type to use a
2784 different WKT type than the default
2785
2786 2003-08-25 Bernhard Herzog <[email protected]>
2787
2788 * Thuban/UI/application.py
2789 (ThubanApplication.run_db_param_dialog): New. Suitable as a
2790 db_connection_callback. Main difference is that the dialog run
2791 from this method doesn't have a parent so it can be used even when
2792 there is no main window
2793 (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
2794 no db_connection_callback was given. This way the dialog pops up
2795 even when the .thuban file was given as a command line parameter.
2796
2797 2003-08-25 Bernhard Herzog <[email protected]>
2798
2799 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
2800 before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
2801 which leads to an effectively frozen X session because the user
2802 can only interact with the dialog but the mouse is still grabbed
2803 by the canvas.
2804 Also, call the tool's Hide method before MouseLeftUp because
2805 MouseLeftUp may change the tool's coordinates.
2806
2807 2003-08-25 Bernhard Herzog <[email protected]>
2808
2809 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
2810 LoadCancelled exceptions and handle them by returning immediately.
2811
2812 2003-08-25 Bernhard Herzog <[email protected]>
2813
2814 GUI part of loading sessions with postgis connections which may
2815 require user interaction to get passwords or updated parameters
2816
2817 * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
2818 bit nucer and be more generic.
2819 (DBFrame.OnAdd): Adapt to new DBDialog interface
2820
2821 * Thuban/UI/application.py (ThubanApplication.OpenSession): New
2822 optional parameter db_connection_callback which is passed to
2823 load_session.
2824
2825 * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
2826 Suitable as a db_connection_callback
2827 (MainWindow.OpenSession): Use self.run_db_param_dialog as the
2828 db_connection_callback of the application's OpenSession method
2829
2830
2831 2003-08-25 Bernhard Herzog <[email protected]>
2832
2833 Basic loading of sessions containing postgis connections:
2834
2835 * Thuban/Model/load.py (LoadError): Add doc-string
2836 (LoadCancelled): New exception class to indicate a cancelled load
2837 (SessionLoader.__init__): Add the db_connection_callback parameter
2838 which will be used by the loader to get updated parameters and a
2839 password for a database connection
2840 (SessionLoader.__init__): Add the new XML elements to the
2841 dispatchers dictionary
2842 (SessionLoader.check_attrs): Two new conversions, ascii to convert
2843 to a byte-string object and idref as a generic id reference
2844 (SessionLoader.start_dbconnection)
2845 (SessionLoader.start_dbshapesource): New. Handlers for the new XML
2846 elements
2847 (load_session): Add the db_connection_callback to pass through the
2848 SessionLoader
2849
2850 * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
2851 New classes to test loading of sessions with postgis database
2852 connections.
2853
2854 2003-08-25 Bernhard Herzog <[email protected]>
2855
2856 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
2857 replace it and the comment with __BuildDate__ by the Source: and
2858 Id: cvs keywords as used in the other files.
2859
2860 2003-08-25 Bernhard Herzog <[email protected]>
2861
2862 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
2863 LoadError when a required attribute is missing. The code used to
2864 be commented out for some reason, but probably should have been
2865 active.
2866
2867 * test/test_load.py (TestLoadError.test): Test the message in the
2868 LoadError too to make sure it really is about the missing
2869 attribute
2870
2871 2003-08-22 Bernhard Herzog <[email protected]>
2872
2873 * test/test_save.py (SaveSessionTest.test_dbf_table)
2874 (SaveSessionTest.test_joined_table): Add XML validation tests.
2875
2876 2003-08-22 Bernhard Herzog <[email protected]>
2877
2878 Implement saving a session with a postgis connection
2879
2880 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
2881 elements for database connections and shapestores using db
2882 connections
2883 (session): Add the dbconnections to the content model
2884
2885 * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
2886 Write the db connections
2887 (SessionSaver.write_session): Call write_db_connections to write
2888 the connection before the data sources
2889 (SessionSaver.write_data_containers): Handle postgis shapestores
2890
2891 * test/test_save.py (SaveSessionTest.thubanids)
2892 (SaveSessionTest.thubanidrefs): Update for new DTD
2893 (SaveSessionTest.test_save_postgis): New. Test saving a session
2894 with postgis connections
2895
2896 * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
2897 (PostGISTable.TableName): New accessor methods for the connection
2898 and table name
2899
2900 * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
2901 (TestPostGISTable.test_dbname): New methods to test the new
2902 PostGISConnection methods
2903
2904 2003-08-22 Bernhard Herzog <[email protected]>
2905
2906 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
2907 for exceptions occurring when establishing a Database connection
2908 (PostGISConnection.connect): Catch psycopg.OperationalError during
2909 connects and raise ConnectionError.
2910
2911 * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
2912 tests for database exceptions
2913
2914 2003-08-22 Bernhard Herzog <[email protected]>
2915
2916 Prepare the test suite for tests with required authentication
2917
2918 * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
2919 variables with two predefined users/passwords, one for the admin
2920 and one for a non-privileged user.
2921 (PostgreSQLServer.createdb): Pass the admin name to initdb and add
2922 the non-privileged user to the database and set the admin password
2923 (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
2924 Better error reporting
2925 (PostgreSQLServer.connection_params)
2926 (PostgreSQLServer.connection_string): New methods to return
2927 information about how to connect to the server
2928 (PostgreSQLServer.execute_sql): New. Convenience method to execute
2929 SQL statements
2930 (PostgreSQLServer.require_authentication): Toggle whether the
2931 server requires authentication
2932 (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
2933 Add or alter users
2934 (PostGISDatabase.initdb): Pass the admin name one the
2935 subprocesses' command lines. Grant select rights on
2936 geometry_columns to everybody.
2937 (upload_shapefile): Use the admin name and password when
2938 connecting. Grant select rights on the new table to everybody.
2939
2940 * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
2941 server's new methods to get the connection parameters.
2942
2943 * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
2944 (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
2945 server's new methods to get the connection parameters.
2946
2947 * test/test_postgis_db.py
2948 (TestPostGISConnection.test_gis_tables_empty)
2949 (TestPostGISConnection.test_gis_tables_non_empty)
2950 (PostGISStaticTests.setUp): Use the server's new methods to get
2951 the connection parameters.
2952
2953 2003-08-22 Bernhard Herzog <[email protected]>
2954
2955 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
2956
2957 * Thuban/version.py: Add psycopg version
2958
2959 * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
2960 version of the psycopg module
2961
2962 2003-08-22 Bernhard Herzog <[email protected]>
2963
2964 * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
2965 (DBFrame.OnEdit): Removed because it's not used and wouldn't work
2966 at the moment. The functionality should probably be implemented
2967 some time, though.
2968 (DBFrame.OnRemove): Display a message if the connection can't be
2969 removed because it's still in use.
2970
2971 2003-08-22 Jan-Oliver Wagner <[email protected]>
2972
2973 * Thuban/UI/about.py (About.__init__): split up the huge about
2974 text into elements/lists for easier translation. This fixes bug
2975 https://intevation.de/rt/webrt?serial_num=2058
2976 Also, made some forgotten string available for the i18n.
2977
2978 2003-08-21 Bernhard Herzog <[email protected]>
2979
2980 Make postgis support really optional including insensitive menu
2981 items.
2982
2983 * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
2984 whether the postgis is supported.
2985
2986 * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
2987 to make postgis support optional
2988
2989 * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
2990 version of Thuban.Model.postgisdb.has_postgis_support
2991 (database_management command): Make it only sensitive if postgis
2992 is supported.
2993
2994 2003-08-21 Jan-Oliver Wagner <[email protected]>
2995
2996 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
2997 (section Adding and Removing Layers): Added text and described
2998 multi-selection.
2999 (chapter Extensions): New.
3000
3001 2003-08-21 Jan-Oliver Wagner <[email protected]>
3002
3003 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
3004 settings to allow multiple files to load into the map.
3005 Also reduced selection to *.shp as a default.
3006
3007 2003-08-20 Bernhard Herzog <[email protected]>
3008
3009 Add dialogs and commands to open database connections and add
3010 database layers.
3011
3012 * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
3013 method to open the database connection management dialog
3014 (MainWindow.AddDBLayer): New method to add a layer from a database
3015 (_has_dbconnections): New helper function to use for sensitivity
3016 (database_management command, layer_add_db command): New commands
3017 that call the above new methods.
3018 (main_menu): Add the new commands to the menu.
3019
3020 * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
3021 (PostGISConnection.connect): Establish the actual connection in a
3022 separate method and call it in __init__. This makes it easier to
3023 override the behavior in test cases
3024 (PostGISConnection.BriefDescription): New method to return a brief
3025 description for use in dialogs.
3026
3027 * test/test_postgis_db.py (NonConnection): DB connection that
3028 doesn't actually connect
3029 (TestBriefDescription): New class with tests for the new
3030 BriefDescription method
3031
3032 2003-08-19 Jan-Oliver Wagner <[email protected]>
3033
3034 Moved anything from extensions to libraries.
3035
3036 * libraries: New.
3037
3038 * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
3039
3040 * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
3041 Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
3042 been moved here from thuban/extensions/pyprojection/
3043 See there in the Attic for the older history.
3044
3045 * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
3046 dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
3047 shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
3048 have been moved here from thuban/extensions/pyshapelib/
3049 See there in the Attic for the older history.
3050
3051 * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
3052 files have been moved here from thuban/extensions/shapelib/
3053 See there in the Attic for the older history.
3054
3055 * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
3056 gdalwarp.cpp, wxproj.cpp: These files have been moved here from
3057 thuban/extensions/thuban/
3058 See there in the Attic for the older history.
3059
3060 * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
3061
3062 * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
3063 gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
3064
3065 * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
3066 Moved to libraries/shapelib.
3067
3068 * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
3069 shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
3070 ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
3071 Moved to libraries/pyshapelib.
3072
3073 * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
3074 LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
3075 Moved to libraries/pyprojection.
3076
3077 * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
3078
3079 * extensions: Removed.
3080
3081 2003-08-19 Bernhard Herzog <[email protected]>
3082
3083 * test/test_viewport.py (ViewPortTest): We don't use the
3084 facilities of FileTestMixin so don't derive from it.
3085 (TestViewportWithPostGIS): New class with tests for using a
3086 viewport on a map with postgis layers.
3087
3088 2003-08-19 Bernhard Herzog <[email protected]>
3089
3090 Add the db connection management to the session.
3091
3092 * Thuban/Model/session.py (Session.__init__): New instance
3093 variable db_connections
3094 (Session.AddDBConnection, Session.DBConnections)
3095 (Session.HasDBConnections, Session.CanRemoveDBConnection)
3096 (Session.RemoveDBConnection): New methods to manage and query the
3097 db connections managed by the session
3098 (Session.OpenDBShapeStore): New method to open a shapestore from a
3099 db connection
3100
3101 * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
3102 messages for the db connection handling in the session
3103
3104 * test/test_postgis_session.py: New. test cases for the session's
3105 db connection handling with postgis connections
3106
3107 2003-08-19 Bernhard Herzog <[email protected]>
3108
3109 Add very basic postgis database support and the corresponding test
3110 cases. The test cases require a PostgreSQL + postgis installation
3111 but no existing database. The database will be created
3112 automatically by the test cases
3113
3114 * test/README: Add note about skipped tests and the requirements
3115 of the postgis tests.
3116
3117 * Thuban/Model/postgisdb.py: New. Basic postgis database support.
3118
3119 * test/test_postgis_db.py: New. Test cases for the postgis
3120 support.
3121
3122 * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
3123 format
3124
3125 * test/test_wellknowntext.py: New. Test cases for the
3126 wellknowntext parser
3127
3128 * test/postgissupport.py: New. Support module for tests involving
3129 a postgis database.
3130
3131 * test/support.py (execute_as_testsuite): Shut down the postmaster
3132 if it's still running after the tests
3133
3134 * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
3135 well known text format
3136
3137 2003-08-19 Jan-Oliver Wagner <[email protected]>
3138
3139 * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
3140 message dialog.
3141
3142 2003-08-18 Bernhard Herzog <[email protected]>
3143
3144 * test/support.py (ThubanTestResult.printErrors): Indent the
3145 reason for the skips in the output to make it a bit more readable.
3146 (execute_as_testsuite): New helper function to run a test suite
3147 and print some more information.
3148 (run_tests): Use execute_as_testsuite to run the tests
3149
3150 * test/runtests.py (main): Use execute_as_testsuite to run the
3151 tests
3152
3153 2003-08-18 Bernhard Herzog <[email protected]>
3154
3155 Fix some bugs in Thuban and the test suite that were uncovered by
3156 changes introduced in Python 2.3:
3157
3158 * Thuban/Model/table.py (DBFTable.__init__): Make sure the
3159 filename is an absolute name
3160
3161 * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
3162 filename is an absolute name
3163
3164 * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
3165 unique filename to save to and use the correct relative filename
3166 in the expected output.
3167 (SaveSessionTest.test_dbf_table): Use the correct relative
3168 filename in the expected output.
3169
3170 * test/test_layer.py (TestLayer.test_raster_layer): Update the
3171 test to check whether the filename is absolute.
3172
3173 2003-08-18 Jan-Oliver Wagner <[email protected]>
3174
3175 * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
3176
3177 2003-08-15 Bernhard Herzog <[email protected]>
3178
3179 Change the way shapes are returned by a shape store. The
3180 ShapesInRegion method returns an iterator over actual shape
3181 objects instead of a list of shape ids.
3182
3183 * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
3184 id.
3185 (ShapefileStore.ShapesInRegion): Return an iterator over the
3186 shapes which yields shape objects instead of returning a list of
3187 shape ids
3188 (ShapefileStore.AllShapes): New. Return an iterator over all
3189 shapes in the shape store
3190 (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
3191
3192 * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
3193 doc-string.
3194
3195 * Thuban/UI/baserenderer.py
3196 (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
3197 layer_shapes and make it return an iterator containg shapes
3198 instead of a list of ids.
3199 (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
3200 layer_shapes() change
3201
3202 * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
3203 (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
3204
3205 * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
3206 changes in the ShapesInRegion return value.
3207 (ViewPort._get_hit_tester): Remove commented out code
3208
3209 * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
3210 new return value.
3211 (SimpleShapeStore.AllShapes): New. Implement this method too.
3212
3213 * test/test_layer.py (TestLayer.test_arc_layer)
3214 (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
3215 (TestLayer.test_point_layer_with_projection)
3216 (TestLayer.test_derived_store): Adapt to changes in the
3217 ShapesInRegion return value.
3218
3219 * test/test_shapefilestore.py
3220 (TestShapefileStoreArc.test_shapes_in_region)
3221 (TestShapefileStorePolygon.test_shapes_in_region)
3222 (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
3223 in the ShapesInRegion return value.
3224 (TestShapefileStorePoint.test_all_shapes)
3225 (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
3226 methods
3227
3228 * test/test_derivedshapestore.py
3229 (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
3230 the ShapesInRegion return value.
3231 (TestDerivedShapeStore.test_all_shapes)
3232 (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
3233 methods
3234
3235 2003-08-15 Bernhard Herzog <[email protected]>
3236
3237 Make the renderers deal correctly with raw vs. python level
3238 representation of shape geometries
3239
3240 * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
3241 Return a flag useraw in addition to the callable and the parameter
3242 to indicate whether the callable can deal with the raw shape data
3243 or uses the higher level python lists of coordinates. The callable
3244 now should accept either the raw data or the return value of the
3245 shape's Points() method.
3246 (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
3247 change
3248 (BaseRenderer.projected_points): Instead of the shape id use the
3249 points list as parameter.
3250 (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
3251 (BaseRenderer.draw_point_shape): Adapt to projected_points()
3252 change and accept the points list as parameter instead of the
3253 shape id.
3254
3255 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
3256 the useraw flag as required by the BaseRenderer
3257 (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
3258 changes.
3259
3260 * test/test_baserenderer.py
3261 (TestBaseRenderer.test_point_with_classification): New test for
3262 rendering a map with classifications.
3263
3264 2003-08-15 Bernhard Herzog <[email protected]>
3265
3266 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
3267 (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
3268 (ViewPort._get_hit_tester, ViewPort.projected_points)
3269 (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
3270 (ViewPort._find_label_at): Split the find_shape_at method into
3271 several new methods and use the functions in the hit-test module.
3272
3273 * Thuban/UI/hittest.py: New module with Python-level hit-testing
3274 functions
3275
3276 * test/test_hittest.py: New. Test for the new hittest module
3277
3278 2003-08-15 Bernhard Herzog <[email protected]>
3279
3280 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
3281 projection to all corners of the bounding box to get a better
3282 approximation of the projected bounding box
3283
3284 * test/test_layer.py (TestLayer.test_point_layer_with_projection):
3285 New. Test coordinate handling of a layer with a projection.
3286 Catches the bug fixed in Layer.ShapesInRegion
3287
3288 2003-08-15 Bernhard Herzog <[email protected]>
3289
3290 Move some of the mock objects in test_baserenderer into their own
3291 module so they can easily be used from other tests
3292
3293 * test/mockgeo.py: New test helper module with some mock objects
3294 for geometry related things like shapes, shapestores and
3295 projections.
3296
3297 * test/test_mockgeo.py: New. Tests for the new helper module
3298
3299 * test/test_baserenderer.py: Some of the mock-objects are in
3300 mockgeo now.
3301
3302 2003-08-12 Jan-Oliver Wagner <[email protected]>
3303
3304 * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
3305
3306 2003-08-12 Bernhard Herzog <[email protected]>
3307
3308 * po/de.po: New. German translations by Bjoern Broscheit
3309
3310 2003-08-12 Bernhard Herzog <[email protected]>
3311
3312 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
3313 strings have to be one string literal.
3314
3315 2003-08-11 Bernhard Herzog <[email protected]>
3316
3317 * test/support.py (FloatComparisonMixin.assertPointListEquals):
3318 New. This method was used in various derived classes, but it's
3319 better to have it here.
3320
3321 * test/test_shapefilestore.py
3322 (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
3323 FloatComparisonMixin
3324
3325 * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
3326 It's now in FloatComparisonMixin
3327
3328 * test/test_derivedshapestore.py
3329 (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
3330 in FloatComparisonMixin
3331
3332 2003-08-11 Bernhard Herzog <[email protected]>
3333
3334 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
3335 error message
3336
3337 2003-08-08 Jan-Oliver Wagner <[email protected]>
3338
3339 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
3340 with version number.
3341 Changed title to reflect version number of Thuban.
3342
3343 2003-08-08 Jan-Oliver Wagner <[email protected]>
3344
3345 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
3346 the list corresponds to the "About" web page.
3347
3348 2003-08-08 Bernhard Herzog <[email protected]>
3349
3350 * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
3351 Make sure translated strings are recognized as one string literal.
3352
3353 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
3354 Make sure translated strings are recognized as one string literal.
3355
3356 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
3357 translated strings are recognized as one string literal.
3358
3359 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
3360 sure translated strings are recognized as one string literal.
3361
3362 2003-08-07 Bernhard Herzog <[email protected]>
3363
3364 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
3365 Simply delegates to the original shapestore.
3366
3367 * test/test_derivedshapestore.py
3368 (TestDerivedShapeStore.test_raw_format): New. Test case for
3369 DerivedShapeStore.RawShapeFormat
3370
3371 2003-08-07 Bernhard Herzog <[email protected]>
3372
3373 Add raw data interface to shape objects.
3374
3375 * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
3376 class to ShapefileShape which now holds shapefile specific
3377 information.
3378 (ShapefileShape.compute_bbox): Simplified to not cache any
3379 information. The way this method is used that shouldn't matter
3380 performance wise.
3381 (ShapefileShape.RawData): New. Return the shapeid which is the raw
3382 data format for shapes from shapefiles.
3383 (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
3384 in the shape objects returned by a shapestore. For a
3385 ShapefileStore this is always RAW_SHAPEFILE.
3386 (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
3387 method.
3388
3389 * test/test_shapefilestore.py
3390 (TestShapefileStore.test_raw_format): New test to test the raw
3391 format feature of shapes.
3392
3393 * Thuban/Model/layer.py: Remove the unused import of Shape from
3394 data. It was only there for interface compatibility but it's not
3395 used inside of Thuban and the generic Shape class has gone away.
3396
3397 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
3398 the raw data format and only use an optimized version of its a
3399 shapefile.
3400
3401 2003-08-07 Bernhard Herzog <[email protected]>
3402
3403 * test/test_baserenderer.py (SimpleShape): Shape class for the
3404 tests.
3405 (SimpleShapeStore.Shape): Use SimpleShape instead of
3406 Thuban.Model.data.Shape to make the tests independed of the coming
3407 changes.
3408
3409 2003-08-07 Bernhard Herzog <[email protected]>
3410
3411 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
3412 (ThubanTestProgram): New classes that extend the respective
3413 classes from unittest. These new version support skipping tests
3414 under certain expected conditions. In the Thuban test suite we
3415 uses this for tests that require the optional gdal support.
3416 (run_tests): Use ThubanTestProgram instead of the unittest.main()
3417
3418 * test/runtests.py (main): Use the new ThubanTestRunner instead of
3419 the normal one from unittest
3420
3421 * test/test_layer.py (TestLayer.test_raster_layer): If this test
3422 is not run because gdal support isn't available report this to the
3423 runner.
3424
3425 * test/test_baserenderer.py
3426 (TestBaseRenderer.test_raster_no_projection): Do not run this test
3427 if gdal support isn't available and report this to the runner.
3428
3429 2003-08-06 Bernhard Herzog <[email protected]>
3430
3431 Rearrange the renderers a bit, partly in preparation for changes
3432 required for the postgis merge, partly to make it more testable.
3433 Also make the representation of coordinates in Shapes more
3434 consistent.
3435
3436 * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
3437 this class is now in BaseRenderer. This class is now practically
3438 only a specialization of BaseRenderer for rendering to an actual
3439 wx DC.
3440 (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
3441 to get the shapetype specific rendering functions.
3442
3443 * Thuban/UI/baserenderer.py: New file with the basic rendering
3444 logic. The code in this file is completely independend of wx.
3445 (BaseRenderer): Class with the basic rendering logic
3446
3447 * test/test_baserenderer.py: New. Test cases for BaseRenderer
3448
3449 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
3450 error_on_redraw to guard agains endless loops and stack overflows
3451 when there's a bug in the rendering code that raises exceptions.
3452 (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
3453 rendering into a separate method _do_redraw so that error handling
3454 is a bit easier. When an exception occurs, set error_on_redraw to
3455 true. When it's true on entry to OnIdle do nothing and return
3456 immediately.
3457
3458 * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
3459 Shape object will always have the coordinates as a list of list of
3460 coordinate pairs (tuples).
3461 (Shape.compute_bbox): Adapt to new representation.
3462
3463 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
3464 (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
3465 Shape objects.
3466
3467 * test/test_shapefilestore.py
3468 (ShapefileStoreTests.assertFloatTuplesEqual)
3469 (ShapefileStoreTests.assertPointListEquals): Rename to
3470 assertPointListEquals and change purpose to checking equality of
3471 the lists returned by Shape.Points().
3472 (TestShapefileStoreArc.test_shape)
3473 (TestShapefileStorePolygon.test_shape)
3474 (TestShapefileStorePoint.test_shape): Use the new
3475 assertPointListEquals instead of assertFloatTuplesEqual
3476
3477 * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
3478 (TestLayer.assertPointListEquals): Rename to assertPointListEquals
3479 and change purpose to checking equality of the lists returned by
3480 Shape.Points().
3481 (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
3482 (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
3483 (TestLayer.test_derived_store): Use the new assertPointListEquals
3484 instead of assertFloatTuplesEqual
3485
3486 * test/test_derivedshapestore.py
3487 (TestDerivedShapeStore.assertFloatTuplesEqual)
3488 (TestDerivedShapeStore.assertPointListEquals): Rename to
3489 assertPointListEquals and change purpose to checking equality of
3490 the lists returned by Shape.Points().
3491 (TestDerivedShapeStore.test_shape): Use the new
3492 assertPointListEquals instead of assertFloatTuplesEqual
3493
3494 2003-08-06 Jan-Oliver Wagner <[email protected]>
3495
3496 * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
3497 a bounding box. A dialog is raised in case, no bounding box
3498 is found. This fixes bug #2043:
3499 https://intevation.de/rt/webrt?serial_num=2043
3500
3501 2003-08-05 Bernhard Herzog <[email protected]>
3502
3503 * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
3504 object look like a Color instantiation. Formerly it looked like a
3505 tuple.
3506
3507 * test/test_color.py (TestColor.test_repr)
3508 (TestColor.test_equality, TestColor.test_inequality): New. test
3509 some more apects of the Color class
3510 (TestTransparent.test_repr, TestTransparent.test_hex)
3511 (TestTransparent.test_equality): New. Test cases for the
3512 Transparent object.
3513
3514 2003-08-04 Jan-Oliver Wagner <[email protected]>
3515
3516 * Doc/manual/thuban-manual.xml: a number of small improvements.
3517 The resulting file is the version submitted for GREAT-ER II.
3518
3519 2003-08-01 Bernhard Herzog <[email protected]>
3520
3521 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
3522 Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
3523 Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
3524
3525 * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
3526 (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
3527 (ThubanEndBusyCursor): Add doc-strings
3528
3529 2003-08-01 Bernhard Herzog <[email protected]>
3530
3531 First step towards PostGIS integration. More abstraction by movin
3532 more code from the layer to the shapestore. More methods of the
3533 layer are now simply delegated to the equivalent method of the
3534 shapestore. The SHAPETYPE_* constants are now in data not in
3535 layer.
3536
3537 * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
3538 (SHAPETYPE_POINT, Shape): Move these constants and classes from
3539 layer.py to data.py
3540 (ShapefileStore.__init__): More Initialization for the new methods
3541 and functionality.
3542 (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
3543 (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
3544 (ShapefileStore.Shape): New methods that were formerly implemented
3545 in the layer.
3546 (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
3547 (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
3548 (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
3549 equivalents of the new shape methods. These versions are simply
3550 delegated to the original shapstore.
3551
3552 * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
3553 (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
3554 (Layer.SetShapeStore): Removed the initializatin of instance
3555 variables that were needed for the stuff that's now in
3556 ShapefileStore
3557 (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
3558 (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
3559 shapestore.
3560
3561 * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
3562 Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
3563 instead of layer.
3564
3565 * test/test_shapefilestore.py: New. Tests for ShapefileStore.
3566
3567 * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
3568
3569 * test/test_layer.py: Import the SHAPETYPE_* constants from data
3570 instead of layer.
3571 (TestLayer.test_derived_store): Remove the test for the exception
3572 when instantiating the DerivedShapeStore with an incompatible
3573 table which is now in test_derivedshapestore.py. Add some more
3574 tests of the layer methods to determine whether they work for a
3575 DerivedShapeStore as well.
3576
3577 2003-07-31 Jonathan Coles <[email protected]>
3578
3579 * Doc/manual/thuban-manual.xml: Fix the list of required packages
3580 by just listing the name and where they can be found.
3581
3582 2003-07-31 Frank Koormann <[email protected]>
3583
3584 * Doc/manual/thuban-manual.xml:
3585 Changed the screenshot elements to figure.
3586 Changed some variablelist elements to itemizedlist.
3587 Added section on GDAL formats.
3588
3589 2003-07-31 Jonathan Coles <[email protected]>
3590
3591 * Doc/manual/thuban-manual.xml: Added a few sentences about
3592 the Fix Border Color option when generating classes.
3593
3594 2003-07-30 Jonathan Coles <[email protected]>
3595
3596 * Thuban/Model/classgen.py: Add docstrings. Rename specific
3597 Ramp instances to use lower_case_style.
3598
3599 * Thuban/UI/classgen.py: Use renamed Ramp instances.
3600
3601 * Thuban/UI/classifier.py: Add docstrings.
3602
3603 * Thuban/UI/dock.py: Add docstrings.
3604
3605 * test/test_classgen.py: Use renamed Ramp instances.
3606
3607 2003-07-30 Bernhard Herzog <[email protected]>
3608
3609 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
3610 was never used in Thuban.
3611
3612 2003-07-30 Bernhard Herzog <[email protected]>
3613
3614 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
3615 method directly instead of going through the transient_table
3616 method. This faster because transient_table may force the copy of
3617 a DBF file into the transient database and setting a table's title
3618 doesnm't affect the title of the associated transient table, so
3619 this fixes RT #2042
3620
3621 * Thuban/UI/main.py (__version__): Don't import the already
3622 removed show_exception_dialog.
3623
3624 2003-07-29 Jonathan Coles <[email protected]>
3625
3626 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3627 Put back this method and remove the equivalent function since we
3628 are setting the exception hook from within this class (OnInit).
3629
3630 2003-07-29 Jonathan Coles <[email protected]>
3631
3632 * Doc/manual/images/5_2_custom_ramp.png,
3633 Doc/manual/images/5_2_quantiles.png,
3634 Doc/manual/images/5_2_uniform_dist.png,
3635 Doc/manual/images/5_2_unique_values.png,
3636 Doc/manual/images/8_int_error.png: New screen shots.
3637
3638 * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
3639 some points, and added more screen shots.
3640
3641 2003-07-29 Bernhard Herzog <[email protected]>
3642
3643 * Thuban/Model/data.py: Remove the now unused import of warnings
3644
3645 2003-07-29 Bernhard Herzog <[email protected]>
3646
3647 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
3648 deprecated since before the 0.8 release and isn't used in Thuban
3649 itself anymore.
3650
3651 * Thuban/Model/transientdb.py: Remove some unnecessary imports
3652
3653 2003-07-29 Jonathan Coles <[email protected]>
3654
3655 * Thuban/UI/application.py (ThubanApplication.OnInit): set the
3656 python exception hook here so that we are sure to catch any
3657 Thuban exception that happen during initialization.
3658
3659 * Thuban/UI/main.py (main): Don't set the exception hook here,
3660 it will get set in ThubanApplication.OnInit.
3661
3662 2003-07-29 Jonathan Coles <[email protected]>
3663
3664 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3665 Removed and called it show_exception_dialog() so that the exception
3666 handler can be set before the class is created.
3667
3668 * Thuban/UI/main.py (main): Install the exception handler before
3669 a ThubanApplication is created.
3670
3671 2003-07-29 Bernhard Herzog <[email protected]>
3672
3673 * po/it.po: New. Italian translation by Maurizio Napolitano
3674
3675 * po/ru.po: New. Russian translation by Alex Shevlakov
3676
3677 2003-07-29 Frank Koormann <[email protected]>
3678
3679 * Doc/manual/thuban-manual.xml: Extended section on supported
3680 projections.
3681
3682 2003-07-29 Frank Koormann <[email protected]>
3683
3684 * Doc/manual/thuban-manual.xml: gaspell-checked.
3685
3686 2003-07-29 Jonathan Coles <[email protected]>
3687
3688 * Doc/manual/images/3_5_legend.png: Added border to improve look
3689 on white background.
3690
3691 2003-07-29 Jonathan Coles <[email protected]>
3692
3693 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
3694 descriptions for the legend toolbar.
3695
3696 * Doc/manual/images/4_2_raster_layer_properties.png: Removed
3697 cursor from dialog box.
3698
3699 2003-07-28 Jonathan Coles <[email protected]>
3700
3701 * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
3702
3703 * Doc/manual/images/2_4_session_tree.png,
3704 Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
3705 Doc/manual/images/4_2_layer_properties.png,
3706 Doc/manual/images/4_2_raster_layer_properties.png,
3707 Doc/manual/images/5_3_genclass.png,
3708 Doc/manual/images/5_classification.png,
3709 Doc/manual/images/6_projection.png,
3710 Doc/manual/images/7_1_table_view.png,
3711 Doc/manual/images/7_2_5_join.png: New screenshots.
3712
3713 2003-07-24 Jonathan Coles <[email protected]>
3714
3715 * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
3716
3717 2003-07-24 Jonathan Coles <[email protected]>
3718
3719 * Doc/manual/thuban-manual.xml: Added EPS images and wrote
3720 chapter on Layer Management.
3721
3722 * Doc/manual/Makefile: New. Makefile to generate all formats for the
3723 manual and images.
3724
3725 2003-07-24 Bernhard Herzog <[email protected]>
3726
3727 * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
3728 it annoys lintian which warns about these files not being
3729 executable. The #! isn't necessary here since if you absolutely
3730 must execute them you can always say "python <filename>".
3731
3732 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
3733 superfluous code to set brush and pen for point shapes
3734
3735 * Thuban/UI/viewport.py: Remove commented out code that wouldn't
3736 belong in viewport anyway
3737
3738 2003-07-24 Frank Koormann <[email protected]>
3739
3740 * Doc/manual/thuban-manual.xml: Added section on table management.
3741
3742 2003-07-24 Bernhard Herzog <[email protected]>
3743
3744 * test/runtests.py (main): Recognize the long "verbose" option
3745 correctly.
3746
3747 2003-07-22 Jonathan Coles <[email protected]>
3748
3749 * Doc/manual/thuban-manual.xml: Continue to write first revision
3750 of the manual.
3751
3752 * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
3753 with Begin/EndDrawing() calls to ensure we aren't doing to
3754 many updates to the dc during rendering.
3755 (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
3756 a pen and brush argument so they need to be passed to the function.
3757
3758 * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
3759 Calculates the minimum and maximum scale values. Factored out
3760 of set_view_transform so that it could be used to zoom all the
3761 way into a single point.
3762 (ViewPort.set_view_transform): Call calc_min_max_scales().
3763 (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
3764 if only a single point is selected.
3765
3766 * Doc/manual/images/1_2_legend_close.png,
3767 Doc/manual/images/1_2_legend_dock.png,
3768 Doc/manual/images/1_2_mainwindow.png,
3769 Doc/manual/images/1_2_mainwindow.ps,
3770 Doc/manual/images/1_2_mainwindow.sk,
3771 Doc/manual/images/3_2_fullextent.png,
3772 Doc/manual/images/3_2_fulllayerextent.png,
3773 Doc/manual/images/3_2_fullshapeextent.png,
3774 Doc/manual/images/3_2_pan.png,
3775 Doc/manual/images/3_2_zoomin.png,
3776 Doc/manual/images/3_2_zoomout.png,
3777 Doc/manual/images/3_3_identify.png,
3778 Doc/manual/images/3_3_label.png,
3779 Doc/manual/images/3_5_invisible.png,
3780 Doc/manual/images/3_5_movedown.png,
3781 Doc/manual/images/3_5_moveup.png,
3782 Doc/manual/images/3_5_props.png,
3783 Doc/manual/images/3_5_tobottom.png,
3784 Doc/manual/images/3_5_totop.png,
3785 Doc/manual/images/3_5_visible.png: New. Images for the documentation.
3786
3787 2003-07-18 Bernhard Herzog <[email protected]>
3788
3789 * Thuban/UI/messages.py (MAP_REPLACED): New message.
3790
3791 * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
3792 after the new map has been assigned
3793
3794 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
3795 Delegate MAP_REPLACED to the canvas too
3796 (MainWindow.prepare_new_session): Removed. Thanks to the new
3797 MAP_REPLACED message it's no longer needed
3798 (MainWindow.OpenSession, MainWindow.NewSession):
3799 prepare_new_session has been removed.
3800
3801 * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
3802 MAP_REPLACED so that we can close the dialog if a new map is set.
3803 (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
3804 (Classifier.map_replaced): Handle MAP_REPLACED by closing the
3805 dialog
3806
3807 * test/test_viewport.py (SimpleViewPortTest)
3808 (SimpleViewPortTest.test_default_size): Add doc-strings
3809 (ViewPortTest.setUp): Bind map to self.map so we can use it in
3810 tests. Subscribe to MAP_REPLACED messages too.
3811 (ViewPortTest.tearDown): No need to explicitly unsubscribe
3812 (ViewPortTest.test_set_map): New test for the SetMap method.
3813
3814 2003-07-18 Bernhard Herzog <[email protected]>
3815
3816 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
3817 Move this test from ViewPortTest.setUp to this new separate test
3818 case. setUp is not the place for the actual tests.
3819 (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
3820 more of the test from setUp to the new test test_inital_settings.
3821 (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
3822 (ViewPortTest.test_proj_conv): Split test_proj_conv into
3823 test_win_to_proj and test_proj_to_win and make the tests easier to
3824 understand
3825 (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
3826 (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
3827 (ViewPortTest.test_unprojected_rect_around_point)
3828 (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
3829 Reformat to increase readability.
3830
3831 2003-07-18 Bernhard Herzog <[email protected]>
3832
3833 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
3834
3835 2003-07-18 Bernhard Herzog <[email protected]>
3836
3837 * test/runtests.py: The test suite can now be run without an X
3838 connection. To make sure this remains true, remove the DISPLAY
3839 environment variable so that an error occurs if the wxGTK is
3840 imported accidentally
3841
3842 2003-07-18 Bernhard Herzog <[email protected]>
3843
3844 * Thuban/UI/viewport.py: Remove unused imports
3845
3846 * Thuban/UI/view.py: Remove unused imports
3847
3848 2003-07-18 Bernhard Herzog <[email protected]>
3849
3850 * test/test_export.py Remove unused imports. The OutputTransform
3851 function is now in viewport.py and is called output_transform
3852 (TestScalebar.test_output_transform)
3853 (TestScalebar.test_OutputTransform): Renamed to
3854 test_output_transform and updated to use output_transform instead
3855 of OutputTransform
3856
3857 * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
3858 renamed.
3859 (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
3860 renamed to output_transform
3861
3862 * Thuban/UI/viewport.py (OutputTransform, output_transform):
3863 Rename to output_transform
3864
3865 2003-07-18 Bernhard Herzog <[email protected]>
3866
3867 * Thuban/Model/layer.py (Layer.__init__): Rename
3868 classificationField to classificatin_column and init it here so
3869 that it can be used in SetClassificationColumn
3870 (Layer.GetClassificationColumn, Layer.GetClassificationField):
3871 Rename to GetClassificationColumn.
3872 (Layer.SetClassificationColumn, Layer.SetClassificationField):
3873 Rename to SetClassificationColumn and issue a LAYER_CHANGED
3874 message if the column changes.
3875 (Layer._classification_changed, Layer.ClassChanged): Rename to
3876 _classification_changed. Update the callers.
3877 (Layer.SetShapeStore): Further field->column renames.
3878
3879 * Thuban/Model/load.py (SessionLoader.start_classification)
3880 (SessionLoader.start_clpoint): Updates because of
3881 field->column method name changes in the Layer class
3882
3883 * Thuban/Model/save.py (SessionSaver.write_classification): Updates
3884 because of field->column method name changes in the Layer class
3885
3886 * Thuban/UI/classifier.py (Classifier.__init__)
3887 (Classifier._OnTry, Classifier._OnRevert): Updates because of
3888 field->column method name changes in the Layer class
3889
3890 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
3891 because of field->column method name changes in the Layer class
3892
3893 * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
3894 of field->column method name changes in the Layer class
3895
3896 * test/test_save.py (SaveSessionTest.testClassifiedLayer)
3897 (SaveSessionTest.testClassifiedLayer): Update because of
3898 field->column method name changes in the Layer class
3899
3900 * test/test_layer.py (SetShapeStoreTests.setUp)
3901 (SetShapeStoreTests.test_sanity): Update because of field->column
3902 method name changes in the Layer class
3903 (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
3904 (TestLayerModification.test_sanity)
3905 (TestLayerModification.test_initial_settings): remove unsued code
3906 and rename to test_sanity.
3907 (TestLayerModification.test_set_classification): New test for
3908 SetClassification and SetClassificationField.
3909
3910 2003-07-18 Bernhard Herzog <[email protected]>
3911
3912 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
3913 the non-fixed values as well. The old test would have accepted a
3914 fixed ramp that only returnes the fixed properties
3915
3916 2003-07-17 Jonathan Coles <[email protected]>
3917
3918 * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
3919 shots for the manual. The XCF file is the source image and
3920 has additional layers to support changes.
3921
3922 * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
3923
3924 * Thuban/UI/classifier.py (Classifier.__BuildClassification):
3925 Return both the new class and the field name.
3926
3927 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
3928 fit the map to the window as this changes any zoom level that
3929 the user may have set.
3930
3931 2003-07-16 Jonathan Coles <[email protected]>
3932
3933 * Thuban/Model/classgen.py (generate_singletons,
3934 generate_uniform_distribution, generate_quantiles): Remove
3935 fixes parameter, but maintain the same functionality by having
3936 the calling function pass a FixedRamp object for the ramp.
3937 (FixedRamp): New. Adapts a ramp to have fixed property values.
3938
3939 * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
3940 (Classification): Inherit from Publisher.
3941 (Classification.__init__): Remove the layer parameter.
3942 Classifications no longer need to have a parent layer.
3943 (Classification.GetField, Classification.GetFieldType,
3944 Classification.SetFieldInfo): Removed. The field name is stored
3945 in the layer, and the type can be retreived by calling
3946 Layer.GetFieldType().
3947 (Classification._set_layer, Classification.GetLayer): Removed.
3948 Classifications no longer have a parent layer.
3949
3950 * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
3951 classification.
3952 (Layer.SetShapeStore): Reset the classification first while
3953 we still have the old shape store to work with.
3954 (Layer.GetClassificationField, Layer.SetClassificationField):
3955 New. Method for getting/setting the field to classify on.
3956 (Layer.SetClassification): Simplified now that the layer
3957 simply has to hold a reference to the classification and not
3958 tell the classification who owns it.
3959 Fixes RTbug #2023.
3960
3961 * Thuban/Model/load.py (SessionLoader.start_classification):
3962 Set the field name on the layer, not the classification.
3963
3964 * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
3965 classification is modified.
3966
3967 * Thuban/Model/save.py (SessionSaver.write_classification):
3968 Get the field name and type from the layer.
3969
3970 * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
3971 parameter records to rows and add docstring. Fixes RTbug #1997.
3972
3973 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
3974 ramp when we need to fix certain values of a ramp rather than
3975 using the old fixes parameter. Fixes RTbug #2024.
3976
3977 * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
3978 parameter.
3979 (ClassTable.Reset): Add fieldType parameter and use it, rather
3980 than asking the classification.
3981 (Classifier.__init__): Remember the original class's field
3982 and ask the layer for the field type, rather than the classification.
3983 (Classifier.__SetGridTable): Retrieve the field and field type
3984 for the table because they are not in the classification.
3985 (Classifier._OnTry, Classifier._OnRevert): Set the classification
3986 field on the layer in addition to the classification itself.
3987
3988 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
3989 classification field from layer.
3990
3991 * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
3992 classification field from layer. Split up tests and remove
3993 *-imports. Fixes RTbug #1992.
3994
3995 * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
3996
3997 * test/test_classification.py
3998 (TestClassification.test_classification): Remove tests for methods
3999 that no longer exist.
4000
4001 * test/test_layer.py (SetShapeStoreTests.setUp): Classification
4002 __init__ no longer has a field parameter, use SetClassificationField.
4003 (SetShapeStoreTests.test_sanity): Use layer object to get class
4004 field info.
4005
4006 * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
4007 SetClassificationField on layer to set class field info.
4008
4009 * test/test_viewport.py: Renamed from test/test_view.py.
4010
4011 2003-07-16 Jan-Oliver Wagner <[email protected]>
4012
4013 * Doc/manual/thuban-manual.xml: Added authors and an initial
4014 coarse structure.
4015
4016 2003-07-15 Bernhard Herzog <[email protected]>
4017
4018 * test/support.py (FloatComparisonMixin): This is a mix-in class
4019 and therefore should not be derived from any other class.
4020
4021 * test/test_range.py (RangeTest): FloatComparisonMixin is a
4022 mix-in, so derive from TestCase as well.
4023
4024 2003-07-15 Bernhard Herzog <[email protected]>
4025
4026 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
4027 draw_func handling a bit to remove one layer of indirection. This
4028 makes the renderer about 10% faster in the non-classifying case
4029 and the code a bit cleaner
4030 (MapRenderer.draw_point_shape): Add the pen and brush parameters
4031 and set them in the dc. Now the draw_point_shape method and
4032 wxproj's draw_polygon_shape function have basically the same
4033 signature so that both can be directly used as draw_func
4034
4035 2003-07-15 Bernhard Herzog <[email protected]>
4036
4037 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
4038 string values (in addition to the labels) as UTF 8
4039
4040 * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
4041 values if the field type is string
4042
4043 * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
4044 saving a session with non-ascii string classification values.
4045
4046 * test/test_load.py (TestClassification.file_contents)
4047 (TestClassification.test): Check for non-ascii values in string
4048 classifications
4049
4050 2003-07-14 Jonathan Coles <[email protected]>
4051
4052 * test/test_view.py: New. Tests for ViewPort.
4053
4054 2003-07-14 Frank Koormann <[email protected]>
4055
4056 * Thuban/Model/load.py (SessionLoader.start_map): Encode map
4057 title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
4058
4059 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
4060 unicode strings from session file: session title, map title and
4061 projection name.
4062
4063 2003-07-10 Jonathan Coles <[email protected]>
4064
4065 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
4066 drag_stop, not drag_move when the mouse is released.
4067
4068 2003-07-10 Jonathan Coles <[email protected]>
4069
4070 The most important part of this is the seperation of view.py into
4071 two pieces. viewport.py now has a class called ViewPort which
4072 contains all the non-wx parts of view.py and can therefore be
4073 tested. view.py contains only the wx-specific parts and is fairly
4074 simple.
4075
4076 * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
4077 RTTbug #1992.
4078 * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
4079 RTTbug #1992.
4080
4081 * Thuban/Model/classgen.py (generate_singletons,
4082 generate_uniform_distribution, generate_quantiles):
4083 Added 'fixes' parameter so that property attributes can
4084 be held constant over the generated classification groups.
4085 (CustomRamp.GetProperties): Remove unused variables.
4086
4087 * Thuban/Model/map.py (Map.SetProjection): Send the old
4088 projection as an argument to listeners of the MAP_PROJECTION_CHANGED
4089 event.
4090
4091 * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
4092 parameter which is a list of records that restricts which
4093 records are saved. Fixes RTbug #1997.
4094
4095 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4096 Port exception dialog from GREAT-ER. Fixes RTbug #1993.
4097
4098 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
4099 to allow the user to fix line color/width on generated groups.
4100 (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
4101 functions to optionally fix group properties.
4102
4103 * Thuban/UI/main.py (main): Set exception hook to the
4104 ShowExceptionDialog. Fixes RTbug #1993.
4105
4106 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
4107 the table window when it is selectd to be shown.
4108
4109 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
4110 Export Selection button and move the export buttons underneath
4111 the table.
4112 (QueryTableFrame.UpdateStatusText): Added event argument so
4113 that it can respond to grid selection events. The status text
4114 is now updated even when the table is not associated with a
4115 layer as was previously assumed.
4116 (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
4117 UpdateStatusText responds to these events.
4118 (QueryTableFrame.OnSaveAs): Renamed to doExport.
4119 (QueryTableFrame.doExport): Helper function that saves the
4120 entire table, or selected rows, to a file.
4121 (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
4122 Respond to export button events and call doExport.
4123
4124 * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
4125 the function doesn't return NULL without first setting a Python
4126 Error.
4127
4128 * test/runtests.py (main): Only print "Unknown option" for
4129 unsupported options.
4130
4131 * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
4132 optional epsilon argument to specify floating point accuracy.
4133 (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
4134 for each item test.
4135
4136 * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
4137 tests for saving selected records.
4138
4139 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
4140 tests for saving selected records.
4141
4142 * test/test_map.py (TestMapWithContents.test_set_projection):
4143 MAP_PROJECTION_CHANGED events send the old projection.
4144
4145 * test/test_session.py
4146 (TestSessionWithContent.test_forward_map_projection):
4147 MAP_PROJECTION_CHANGED events send the old projection.
4148
4149 * test/test_table.py (TableTest): Update tests to use non-deprecated
4150 functions.
4151
4152 2003-07-08 Bernhard Herzog <[email protected]>
4153
4154 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
4155 constants in the column objects are the standard ones defined in
4156 the table module.
4157
4158 * test/test_transientdb.py
4159 (TestTransientTable.test_transienttable_to_dbf): New. Test whether
4160 exporting transient tables as DBF works. This should catch the bug
4161 just fixed in TransientTableBase.Width.
4162
4163 2003-07-08 Bernhard Herzog <[email protected]>
4164
4165 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
4166 interpolated colors correctly.
4167
4168 * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
4169 New. Test case for the fix in classgen.py
4170
4171 2003-07-08 Bernhard Herzog <[email protected]>
4172
4173 * test/runtests.py (main): Make the default output less verbose
4174 and add a verbosity option (-v) to get the old output
4175
4176 2003-07-08 Bernhard Herzog <[email protected]>
4177
4178 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
4179 0.9.
4180
4181 * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
4182 New. Return the join type
4183
4184 * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
4185 DTD
4186 (SessionSaver.write_data_containers): Save the join type for
4187 joined tables
4188
4189 * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
4190 namespace
4191 (SessionLoader.start_jointable): Handle the jointype attribute
4192
4193 * test/test_load_0_8.py: New. Effectively a copy of test_load.py
4194 as of Thuban 0.8. These are now tests to determine whether Thuban
4195 can still read files generated by Thuban 0.8
4196
4197 * test/test_load.py (LoadSessionTest.dtd)
4198 (TestSingleLayer.file_contents)
4199 (TestLayerVisibility.file_contents, TestLabels.file_contents)
4200 (TestLayerProjection.file_contents)
4201 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4202 (TestJoinedTable.file_contents)
4203 (TestLoadError.file_contents): Update for new DTD
4204 (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
4205 for new join type attribute
4206
4207 * test/test_save.py (SaveSessionTest.dtd)
4208 (SaveSessionTest.testEmptySession)
4209 (SaveSessionTest.testSingleLayer)
4210 (SaveSessionTest.testLayerProjection)
4211 (SaveSessionTest.testRasterLayer)
4212 (SaveSessionTest.testClassifiedLayer)
4213 (SaveSessionTest.test_dbf_table)
4214 (SaveSessionTest.test_joined_table): Update for new DTD
4215 (SaveSessionTest.test_joined_table): Add test for new join type
4216 attribute
4217
4218 2003-07-04 Bernhard Herzog <[email protected]>
4219
4220 * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
4221 function for table_to_dbf
4222 (table_to_dbf): Deal with names longer than the 10 character limit
4223
4224 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
4225 doc-string
4226 (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
4227 long column names
4228
4229 2003-07-03 Bernhard Herzog <[email protected]>
4230
4231 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
4232
4233 2003-07-03 Bernhard Herzog <[email protected]>
4234
4235 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
4236 for the Thuban manual and README with some basic information about
4237 the manual
4238
4239 2003-07-03 Bernhard Herzog <[email protected]>
4240
4241 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
4242 Update doc-string
4243 (TransientJoinedTable.create): Do not modify the column objects of
4244 the input tables in place and copy all columns of the input tables
4245 into the joined table after all.
4246
4247 * test/test_transientdb.py
4248 (TestTransientTable.test_transient_joined_table_same_column_name):
4249 Update to reflect the new behavior
4250 (TestTransientTable.test_transient_joined_table_with_equal_column_names):
4251 Update to reflect the new behavior
4252 (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
4253 New test case for a bug which modified the column objects in place
4254
4255 2003-07-02 Jonathan Coles <[email protected]>
4256
4257 * Thuban/Model/classgen.py (generate_singletons,
4258 generate_uniform_distribution, generate_quantiles,
4259 GenQuantiles0): Make sure maxValue isn't less than
4260 one, otherwise we could divide by zero.
4261
4262 * test/test_classgen.py (ClassGenTest.doClassRangeTest,
4263 ClassGenTest.doClassSingleTest): Call doBoundsTest to
4264 check the end classification groups against the
4265 proper property values.
4266 (ClassGenTest.doBoundsTest): New. Checks the first and
4267 last classification groups to make sure their properties
4268 are the correct upper and lower bounds for a color ramp.
4269
4270 2003-07-02 Jonathan Coles <[email protected]>
4271
4272 * Thuban/Model/classgen.py (generate_singletons,
4273 generate_uniform_distribution, generate_quantiles,
4274 GenQuantiles0): The denominator was one to high when
4275 calculating the index for the ramp causing the index
4276 to never to reach one.
4277
4278 2003-07-02 Jonathan Coles <[email protected]>
4279
4280 Changed the singature of ClassGroupRange.__init__ and
4281 ClassGroupRange.SetRange() so that the min/max values are
4282 passed as a tuple. This makes a better calling scheme for
4283 when a Range object is passed instead.
4284
4285 * Thuban/Model/classgen.py: Fixed parameters to
4286 ClassGroupRange constructor.
4287
4288 * Thuban/Model/classification.py (ClassGroupRange.__init__):
4289 Consolidate the min/max parameters into a single _range which
4290 can either be a tuple or a Range object.
4291 (ClassGroupRange.SetRange): Consolidate the min/max parameters
4292 into a single _range which can either be a tuple or a Range object.
4293
4294 * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
4295 call to ClassGroupRange constructor to use a tuple.
4296
4297 * Thuban/Model/layer.py (Layer.SetClassification): Switch
4298 the classification instance variable to the new class
4299 before calling _set_layer otherwise subscribers to a
4300 LAYER_CHANGED event will not see any difference.
4301
4302 * test/test_classification.py: Fix tests of ClassGroupRange
4303 so that they use the new signature.
4304
4305 * test/test_load.py: Fix use of ClassGroupRange so that it
4306 uses the new signature.
4307
4308 * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
4309 uses the new signature.
4310
4311 * test/test_save.py: Fix use of ClassGroupRange so that it
4312 uses the new signature.
4313
4314
4315 2003-07-01 Jonathan Coles <[email protected]>
4316
4317 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
4318 Import used objects/class from color.
4319 (generate_singletons): We don't
4320 need the numGroups parameter anymore because we are using
4321 the new ramps with GetProperties().
4322 (generate_uniform_distribution): Use new ramp method
4323 GetProperties().
4324 (generate_quantiles, GenQuantiles0): Use new ramp method
4325 GetProperties().
4326 (CustomRamp.SetNumGroups): Removed. The ramps now map
4327 a value from 0 to 1 to class properties so the number
4328 of groups is not needed ahead of time.
4329 (CustomRamp.next): Removed. CustomRamp does not support
4330 interation anymore.
4331 (CustomRamp.GetProperties): Returns a ClassGroupProperties
4332 object based on the index value from 0 to 1 that is
4333 passed to it.
4334 (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
4335 Made into instances of Monochromatic class instread of
4336 deriving from it.
4337 (HotToCold.SetNumGroups): Removed. See CustomRamp.
4338 (HotToCold.next): Removed. See CustomRamp.
4339
4340 * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
4341 (Classification.SetField, Classification.SetFieldType):
4342 Replaced with SetFieldInfo.
4343 (Classification.SetFieldInfo): New. Does a better job of
4344 what SetField and SetFieldType used to do by combining
4345 their function since they should really always be done
4346 at the same time.
4347 (Classification.SetLayer): Renamed to _set_layer.
4348 (Classification._set_layer): Should only be called from
4349 Layer's SetClassification. This does not cause a recursive
4350 call as SetLayer did because we know that Layer knows about
4351 the classification.
4352
4353 * Thuban/Model/color.py: Fixes RTbug #1971.
4354 (_Transparent): Renamed from Transparent so it doesn't
4355 conflict with the module variable.
4356 (Transparent, Black): Renamed from Color.Transparent,
4357 Color.Black so they are not class variables.
4358
4359 * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
4360 (Layer.Destroy): We don't need to call SetClassification
4361 anymore to clear out the back reference in the classifcation
4362 to the layer. It's better to set it to None using _set_layer,
4363 and we won't be creating another clas object too.
4364 (Layer.SetClassification): Classification._set_layer is not
4365 recursive so remove all the locking variables. Also clean
4366 up the code so that it remains unchanged if something fails.
4367
4368 * Thuban/Model/load.py: Fixes RTbug #1971.
4369 (SessionLoader.start_classification): Call
4370 Classification.SetFieldInfo().
4371
4372 * Thuban/Model/save.py: Removed import of Color which wasn't
4373 being used.
4374
4375 * Thuban/UI/classgen.py: Fixes RTbug #1972.
4376 (ClassGenDialog.__init__): Color ramps are now instances
4377 already so we don't need to create any new objects.
4378 (ClassGenDialog.OnOK): Check for numGroups is no longer
4379 necessary because we never use it.
4380
4381 * Thuban/UI/classifier.py: Fixes RTbug #1971.
4382 (Classifier.__BuildClassification, Classifier.__SetGridTable):
4383 Call Classification.SetFieldInfo() instead of SetFieldType.
4384
4385 * Thuban/UI/renderer.py: Fixes RTbug #1971.
4386
4387 * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
4388 (MapCanvas.__init__): Subscribe to the idle time event. Set
4389 background color to white.
4390 (MapCanvas.OnPaint): Set a flag indicating that we should
4391 render the map during idle time. If we already have a bitmap
4392 just draw it now.
4393 (MapCanvas.OnIdle): New. Render the map only during idle time.
4394 This also fixes a problem with the busy cursor under gtk.
4395
4396 * test/test_classgen.py (ClassGenTest.test_generate_singletons):
4397 Fix calls to generate_singletons because the signature changed.
4398
4399 * test/test_classification.py: Fix color references and
4400 change calls to Classification.[SetField|SetFieldType] to
4401 SetFieldInfo.
4402
4403 * test/test_load.py: Fix color references.
4404
4405 * test/test_load_0_2.py: Fix color references.
4406
4407 * test/test_save.py (SaveSessionTest.testClassifiedLayer):
4408 Change calls to Classification.[SetField|SetFieldType] to
4409 SetFieldInfo.
4410
4411 2003-07-01 Frank Koormann <[email protected]>
4412
4413 MERGE from the greater-ms3 branch.
4414
4415 * test/test_transientdb.py
4416 (TestTransientTable.test_transient_joined_table_with_equal_column_names):
4417 New. Test join of two tables with partly equal column names.
4418
4419 * Thuban/Model/transientdb.py (TransientJoinedTable.create):
4420 If duplicates in left and right tables column names are found,
4421 append '_' (underscores) to the name until it is unique.
4422 Create always new internal names for the resulting table and reference
4423 columns in the join statement with <table>.<column>
4424
4425 2003-07-01 Bernhard Herzog <[email protected]>
4426
4427 * test/test_transientdb.py
4428 (TestTransientTable.test_transient_joined_table_same_column_name):
4429 New. Test whether joining on columns with the same names in both
4430 tables works.
4431
4432 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
4433 sure to use the right internal names even when joining on field
4434 with the same names in both tables. Also, detect duplicate names
4435 in the joined table correctly.
4436
4437 2003-07-01 Frank Koormann <[email protected]>
4438
4439 * Thuban/UI/renderer.py (ExportRenderer.render_legend):
4440 Reverse List of layers to render in same order as in desktop legend.
4441
4442 2003-06-30 Jonathan Coles <[email protected]>
4443
4444 * Thuban/version.py (make_tuple): Takes a version string
4445 and splits it into a tuple of at most three integers.
4446 Used make_tuple() to make tuple versions of the version
4447 numbers.
4448
4449 * Thuban/UI/about.py: Add Thuban email addresses.
4450
4451 2003-06-30 Jonathan Coles <[email protected]>
4452
4453 * Thuban/version.py: SQLite/PySQLite version dependencies
4454 were too high.
4455
4456 2003-06-30 Jonathan Coles <[email protected]>
4457
4458 * Thuban/version.py: Update version to 0.8.1
4459
4460 * MANIFEST.in: Added Projections so that default.proj is
4461 included.
4462
4463 2003-06-26 Jonathan Coles <[email protected]>
4464
4465 New About box with lots more information including library
4466 versions and credits. More/better version checking before
4467 Thuban starts.
4468
4469 * Thuban/UI/about.py: New. New About box that displays
4470 library version information and credits.
4471
4472 * Thuban/version.py: Added new 'versions' dictionary which
4473 contains the verions of various libraries which are checked
4474 when the module loads.
4475 (verify_versions): Check all version numbers and returns
4476 a list of errors.
4477
4478 * Thuban/UI/classifier.py (Classifier.__EnableButtons):
4479 Reset the status of the buttons as the situation warrants,
4480 but in a better more reliable way by not relying on the
4481 current status to determine what needs to change.
4482
4483 * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
4484 (verify_versions): Remove most of the code since it is
4485 now in Thuban.version.verify_versions.o
4486
4487 * Thuban/UI/mainwindow.py (MainWindow.About): Call new
4488 About box in Thuban.UI.about.
4489
4490 * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
4491 Returns the version of gdal library being used as a string.
4492
4493 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
4494 Removed.
4495 (get_proj_version): Return the version of PROJ that the file
4496 was compiled with.
4497 (get_gtk_version): Return th version of GTK that the file
4498 was compiled with.
4499
4500 2003-06-25 Jonathan Coles <[email protected]>
4501
4502 * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
4503 of the SelectPropertiesDialog should be self so the window
4504 appears on top.
4505 (ClassGroupPropertiesCtrl.DoEdit): The parent
4506 of the SelectPropertiesDialog should be self so the window
4507 appears on top.
4508
4509 * Thuban/UI/resource.py: Cleaned up how we determine file
4510 extensions.
4511 (GetImageResource): Return an wxImage from our Resources.
4512
4513 2003-06-24 Jonathan Coles <[email protected]>
4514
4515 * Thuban/UI/renderer.py (ExportRenderer.render_legend):
4516 Check that a layer has a classification before trying
4517 to get it. Raster layers don't have classifications.
4518
4519 2003-06-23 Jonathan Coles <[email protected]>
4520
4521 * setup.py: Add Resources/XML to resource list.
4522
4523 2003-06-23 Jonathan Coles <[email protected]>
4524
4525 * setup.cfg: Fix copyright dates
4526
4527 2003-06-23 Jonathan Coles <[email protected]>
4528
4529 * MANIFEST.in: Update with Resources/XML
4530
4531 * setup.py: Don't include Locale resources yet as we don't
4532 have any and it causes problems building the distribution
4533 for Windows. Update version to 0.8.0.
4534
4535 * Doc/thuban.dtd: Removed since it is now in Resources/XML.
4536
4537 * Thuban/UI/mainwindow.py: Add blank line at the end because
4538 file was not being read correctly building the Windows
4539 distribution.
4540
4541 2003-06-23 Jonathan Coles <[email protected]>
4542
4543 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
4544
4545 * Thuban/version.py: Temporarily update longversion for
4546 the 0.8 release so that it doesn't have the cvs revision.
4547
4548 2003-06-23 Jonathan Coles <[email protected]>
4549
4550 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
4551 to make sure that we don't create reentrant possibilities with
4552 wxYield.
4553
4554 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
4555 directly to avoid the wxSafeYield() call which generates an
4556 OnPaint event causing infinite recursion. Don't try to catch
4557 exception anymore. This was for before there were limits on map
4558 scaling.
4559
4560 2003-06-23 Bernhard Herzog <[email protected]>
4561
4562 Bug fix for RT #1961:
4563
4564 * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
4565 Register DerivedShapestores with the session
4566
4567 * Thuban/Model/session.py (Session.Tables): Make sure each table
4568 is only listed once.
4569
4570 * test/test_load.py (TestJoinedTable.test): Add check_format call.
4571 Update file contents to match the one written out.
4572
4573 2003-06-20 Bernhard Herzog <[email protected]>
4574
4575 * test/xmlsupport.py (SaxEventLister.startElementNS)
4576 (SaxEventLister.endElementNS): Do not include the qname. Python
4577 2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
4578 is (presumably incorrectly) None, whereas it's a string with the
4579 element name in the later versions.
4580
4581 * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
4582 (TestEventList.test_even_list_namespace): Update tests to reflect
4583 the new behaviour
4584 (TestEventList.test_even_list_id_normalization): Fix doc-string
4585
4586 2003-06-20 Jonathan Coles <[email protected]>
4587
4588 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
4589 by deriving classes to determine if that layer supports shapes.
4590 (Layer): Override HasShapes and return true.
4591
4592 * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
4593 instead of a direct call to wx[Begin|End]CusyCursor().
4594 (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
4595 table data.
4596
4597 * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
4598 New. Wrappers around the wxWindows functions that allow us to
4599 make additional calls such as wxYield which gives the native
4600 system a chance to update the cursor correctly.
4601
4602 * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
4603 instead of a direct call to wx[Begin|End]CusyCursor().
4604
4605 * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
4606 instead of a direct call to wx[Begin|End]CusyCursor().
4607 (MapCanvas.find_shape_at): Check if the current search layer
4608 support shapes, otherwise go on to the next layer.
4609
4610 * test/test_layer.py: Add tests in each type of layer for
4611 HasClassification() and HasShapes()
4612
4613 2003-06-20 Jonathan Coles <[email protected]>
4614
4615 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
4616 turning on the busy cursor to allow the system to change the
4617 cursor before we begin painting. This fixes a problem that
4618 was occuring only under GTK. Fixes RTbug #1840.
4619
4620 2003-06-20 Bernhard Herzog <[email protected]>
4621
4622 * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
4623 version.
4624
4625 * Thuban/Model/save.py (sort_data_stores): New. Make topological
4626 sort of the data sources so they can be written with sources that
4627 data sources that depend on other data sources come after the
4628 sources they depend on.
4629 (SessionSaver.__init__): Add idmap instance variable to map from
4630 objects to the ids used in the file.
4631 (SessionSaver.get_id, SessionSaver.define_id)
4632 (SessionSaver.has_id): New. Methods to manage the idmap
4633 (SessionSaver.write): Use thuban-0.8.dtd
4634 (SessionSaver.write_session): Add a namespace on the session and
4635 write out the data sources before the maps.
4636 (SessionSaver.write_data_containers): New. Write the data
4637 containers.
4638 (SessionSaver.write_layer): Layer elements now refer to a
4639 shapestore and don't contain filenames anymore.
4640
4641 * Thuban/Model/load.py (LoadError): Exception class to raise when
4642 errors in the files are discovered
4643 (SessionLoader.__init__): Define dispatchers for elements with a
4644 thuban-0.8 namespace too.
4645 (SessionLoader.check_attrs): New helper method to check and
4646 convert attributes
4647 (AttrDesc): New. Helper class for SessionLoader.check_attrs
4648 (SessionLoader.start_fileshapesource)
4649 (SessionLoader.start_derivedshapesource)
4650 (SessionLoader.start_filetable, SessionLoader.start_jointable):
4651 Handlers for the new elements in the new fileformat
4652 (SessionLoader.start_layer): Handle the shapestore attribute in
4653 addition to filename.
4654 (SessionLoader.start_table, SessionLoader.end_table): Removed.
4655 They were never used in the old formats and aren't needed for the
4656 new.
4657
4658 * Thuban/Model/session.py (Session.DataContainers): New method to
4659 return all "data containers", i.e. shapestores and tables
4660
4661 * test/xmlsupport.py (SaxEventLister.__init__)
4662 (SaxEventLister.startElementNS, sax_eventlist): Add support to
4663 normalize IDs.
4664
4665 * test/test_xmlsupport.py
4666 (TestEventList.test_even_list_id_normalization): New test case for
4667 id normalization
4668
4669 * test/test_load.py (LoadSessionTest.check_format): Use ID
4670 normalization
4671 (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
4672 class atrributes used for ID normalization
4673 (TestSingleLayer, TestLayerVisibility, TestLabels.test)
4674 (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
4675 file format
4676 (TestJoinedTable): New test for loading sessions with joined
4677 tables.
4678 (TestLoadError): New. Test whether missing required attributes
4679 cause a LoadError.
4680
4681 * test/test_save.py (SaveSessionTest.thubanids)
4682 (SaveSessionTest.thubanidrefs): New class attributes for ID
4683 normalization in .thuban files.
4684 (SaveSessionTest.compare_xml): Use id-normalization.
4685 (SaveSessionTest.testEmptySession)
4686 (SaveSessionTest.testLayerProjection)
4687 (SaveSessionTest.testRasterLayer)
4688 (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
4689 (SaveSessionTest.testLayerProjection): The filename used was the
4690 same as for testSingleLayer. Use a different one.
4691 (SaveSessionTest.test_dbf_table)
4692 (SaveSessionTest.test_joined_table): New test cases for saving the
4693 new data sources structures.
4694 (TestStoreSort, MockDataStore): Classes to test the sorting of the
4695 data stores for writing.
4696
4697 * test/runtests.py: Add CVS keywords
4698
4699 2003-06-20 Jonathan Coles <[email protected]>
4700
4701 * test/test_session.py
4702 (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
4703 Use the cultural_landmark-point.dbf file for the store so that
4704 the table rows and shape count match.
4705
4706 2003-06-20 Jonathan Coles <[email protected]>
4707
4708 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
4709 an exception if the number of shapes is different from the
4710 number of rows in the table. Address RTbug #1933.
4711
4712 * test/test_layer.py (TestLayer.test_derived_store): Add
4713 a test for the new exception in DerivedShapeStore.__init__.
4714
4715 * test/support.py (FloatTestCase): Removed since there is
4716 already FloatComparisonMixin. Fixes RTbug #1954.
4717 (FloatComparisonMixin.assertFloatEqual): Include test for
4718 infinity that was part of FloatTestCase.
4719
4720 * test/test_range.py (RangeTest): Inherit from
4721 support.FloatComparisonMixin now that we don't have
4722 support.FloatTestCase.
4723
4724 2003-06-20 Bernhard Herzog <[email protected]>
4725
4726 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
4727 the implementation in xmlsupport instead.
4728 (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
4729
4730 * test/test_proj.py: Import sax_eventlist from xmlsupport instead
4731 of test_save
4732
4733 2003-06-20 Bernhard Herzog <[email protected]>
4734
4735 * test/test_load.py (LoadSessionTest.check_format): New helper
4736 method to make sure the test files we load might have been written
4737 by the current thuban version.
4738 (ClassificationTest.TestLayers, TestSingleLayer.test)
4739 (TestLayerVisibility.test, TestClassification.test)
4740 (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
4741 Add check_format() calls and fix the thuban data to match the data
4742 that would be written by saving the session loaded from it.
4743
4744 * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
4745 the same class and function in test_save.
4746
4747 * test/test_xmlsupport.py (TestEventList): New. test cases for
4748 sax_eventlist
4749
4750 2003-06-20 Bernhard Herzog <[email protected]>
4751
4752 * Resources/XML/thuban.dtd: Add comment about which versions of
4753 Thuban are covered by this DTD
4754 (map): Fix content model for layers and raster layers. There can
4755 be any number or layers and raster layers in any order.
4756
4757 2003-06-20 Jonathan Coles <[email protected]>
4758
4759 This is mainly about fixing RTbug #1949.
4760
4761 * Thuban/Model/classification.py: Remove "from __future__"
4762 import statement since python 2.2 is the earliest supported
4763 version.
4764
4765 * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
4766 Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
4767 depending on the units this projection *forwards* into.
4768
4769 * Thuban/Model/save.py (SessionSaver.write_classification):
4770 Remove unnecessary use of lambdas and nested functions.
4771
4772 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
4773 adjustment here if the map projection uses degrees.
4774
4775 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
4776 scale adjust code since it is now done before calling
4777 this method. Don't do anything if the map projection
4778 is None.
4779
4780 2003-06-19 Bernhard Herzog <[email protected]>
4781
4782 Move version specific load tests to their own file.
4783
4784 * test/test_load.py: Expand the doc-string to explain a bit how to
4785 handle file format changes.
4786 (TestClassification.test): Update the docstring as this test is
4787 not about Thuban 0.2 anymore.
4788
4789 * test/test_load_0_2.py: New file with the load tests for thuban
4790 files created with Thuban 0.2 and earlier.
4791
4792 2003-06-19 Bernhard Herzog <[email protected]>
4793
4794 Add XML validation to some of the tests. Validation will only be
4795 done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
4796 To make the DTD available to the test cases it's moved into
4797 Resources/XML
4798
4799 * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
4800 for versions up to and including 0.2. Two slight changes: added an
4801 encoding specification and fixed the comment which refered to
4802 GRASS, not Thuban
4803
4804 * test/xmlsupport.py: New support module for tests involving XML.
4805 Currently there's a mix-in class for XML validation.
4806
4807 * test/test_xmlsupport.py: New. Tests for the xmlsupport module
4808
4809 * test/test_save.py (SaveSessionTest): Derive from ValidationTest
4810 so that we can validate the
4811 (SaveSessionTest.testEmptySession)
4812 (SaveSessionTest.testSingleLayer)
4813 (SaveSessionTest.testSingleLayer)
4814 (SaveSessionTest.testLayerProjection)
4815 (SaveSessionTest.testRasterLayer)
4816 (SaveSessionTest.testClassifiedLayer): Validate the generated XML
4817
4818 * test/runtests.py (main): Call print_additional_summary instead
4819 of print_garbage_information
4820
4821 * test/support.py (resource_dir): New function to return the
4822 "Resource" subdirectory
4823 (print_additional_summary): New function to combine several
4824 summary functions
4825 (run_tests): Use print_additional_summary instead of calling
4826 print_garbage_information directly
4827
4828 2003-06-19 Bernhard Herzog <[email protected]>
4829
4830 * Doc/thuban.dtd (classification): Correct the content model of
4831 the classification element.
4832 (projection): Add the "name" attribute
4833
4834 2003-06-19 Frank Koormann <[email protected]>
4835
4836 MERGE from the greater-ms3 branch.
4837
4838 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
4839 scale if projection is latlong to get better estimate.
4840
4841 Fix problem of hidden properties dialog under windows after double
4842 click on layer tree:
4843 The tree control always gets an Expanded / Collapsed event after
4844 the ItemActivated on double click, which raises the main window again.
4845 We add a second ItemActivated event to the queue, which simply
4846 raises the already displayed window.
4847
4848 * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
4849 raiseProperties initialized to prevent endless loops
4850 (LegendTree._OnItemActivated): Depending on self.raiseProperties
4851 simply raise the properties or open the dialog and issue a second
4852 event.
4853
4854 2003-06-18 Jonathan Coles <[email protected]>
4855
4856 * setup.py: Fix a few problems that occured under Windows.
4857
4858 2003-06-18 Jonathan Coles <[email protected]>
4859
4860 When Thuban loaded the map was redrawn twice because the
4861 legend was being opened after the mainwindow was created
4862 and not during its creation. This meant the map was drawn
4863 initially and then had to be redrawn when the legend
4864 caused the display to change. Now the legend is opened
4865 in the mainwindow constructor which resolves this issue.
4866
4867 Also, although we were checking for the existence of
4868 gdal and gdalwarp modules, the gdalwarp extension was
4869 still being compiled (which may fail if the system doesn't
4870 have gdal installed). the build_ext command to setup.py
4871 now accepts the flags --with-gdal and --without-gdal.
4872 If --without-gdal is specified setup.py will try to
4873 use the gdal parameters specified by gdal-config. Under
4874 windows, those parameters have to be set in setup.py
4875 as with proj4 an wxWindows.
4876
4877 * setup.py: Use a list instead of seperate variables for
4878 extension parameters so we can create a generic function
4879 that runs an appropriate *-config script.
4880 (run_cs_script): Renamed from run_wx_script and modified
4881 to accept a second argument which is a list of lists to
4882 be filled in by the values returned from running the command.
4883 (thuban_build_ext): New. Extends the build_ext command and
4884 provides the options --with-gdal/--without-gdal which then
4885 optionally includes the gdalwarp extension.
4886
4887 * Thuban/Model/resource.py: First check if we can import
4888 the gdalwarp Thuban extension before checking for gdal.
4889 Also added some comments.
4890
4891 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
4892 the map is None which may be the case if none has been loaded
4893 yet.
4894
4895 * Thuban/UI/main.py (main): Remove call to ShowLegend.
4896
4897 * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
4898
4899 * Thuban/UI/renderer.py: Check for gdal support before importing
4900 gdalwarp.
4901 (MapRenderer.render_map): Only try to optimize if we have gdal
4902 support otherwise nothing will get drawn.
4903
4904 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
4905 during startup before a map has been created. Check if map is None
4906 before using it and do nothing if it is.
4907
4908 2003-06-17 Jonathan Coles <[email protected]>
4909
4910 Fix the problem with raster layers under Windows that caused
4911 Thuban to crash. The view should respond to layer projection
4912 changed events to update the display. Changes to a projection
4913 should not cause the map to be set to full extent.
4914
4915 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4916 current_map_proj to remember the current map projection so that
4917 when the projection changes we know what the previous projection
4918 was.
4919 (MapCanvas.SetMap): Unsubscribe and subscribe to
4920 LAYER_PROJECTION_CHANGED events.
4921 (MapCanvas.projection_changed): Split into two methods that respond
4922 to map and layer projection changes.
4923 (MapCanvas.map_projection_changed): New. Takes the current view and
4924 projects it using the new projection. This does not cause the
4925 map to be redrawn at full extent.
4926 (MapCanvas.layer_projection_changed): New. Cause a redraw which
4927 will draw each layer in its new projection.
4928
4929 * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
4930 VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
4931 under Windows.
4932
4933 * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
4934 to twice sizeof(void*) because there are two digits for each
4935 hex byte.
4936
4937 2003-06-16 Bernhard Herzog <[email protected]>
4938
4939 Update to the layer interface: Direct access to the table,
4940 shapetable, shapefile and filename attributes is now actively
4941 deprecated by issuing deprecation warnings for all places where
4942 this happens.
4943
4944 * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
4945 to the instance variables table, shapetable, shapefile and
4946 filename via __getattr__ so that we can issue a deprecation
4947 warning.
4948 (Layer.SetShapeStore): Don't set the deprecated instance variables
4949 any more
4950 (Layer.SetShapeStore): Don't use deprecated layer instance
4951 variables
4952 (Layer.Destroy): No need to explicitly remove the instance
4953 variables any more
4954 (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
4955 instance variables
4956
4957 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
4958 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
4959 (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
4960 use deprecated layer instance variables
4961
4962 * Thuban/UI/classifier.py (Classifier.__init__): Don't use
4963 deprecated layer instance variables
4964
4965 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
4966 (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
4967 instance variables
4968
4969 * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
4970 deprecated layer instance variables
4971
4972 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
4973 deprecated layer instance variables
4974
4975 * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
4976 deprecated layer instance variables
4977
4978 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
4979 (MapRenderer.polygon_render_param): Don't use deprecated layer instance
4980 variables
4981
4982 * test/runtests.py (main): Turn Thuban's deprecation warnings into
4983 errors so that they're cought by the tests
4984
4985 * test/test_load.py (TestSingleLayer.test): Don't use deprecated
4986 layer instance variables
4987
4988 2003-06-16 Jonathan Coles <[email protected]>
4989
4990 Fix a problem under Windows whereby if the user double-clicks on a
4991 layer in the legend that tree item will expand or collapse as well
4992 as open the layer properties dialog. The state of the tree item
4993 should not be affected.
4994
4995 * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
4996 preventExpandCollapse and subscribe to expanding and collapsing
4997 events.
4998 (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
4999 collapsing events and will veto the event if it has been triggered
5000 by the user double clicking on a layer.
5001 (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
5002 that an expanding/collapsing event should be vetoed.
5003
5004 2003-06-13 Bernhard Herzog <[email protected]>
5005
5006 * Thuban/UI/classifier.py (Classifier.OnClose)
5007 (Classifier.map_layers_removed)
5008 (Classifier.layer_shapestore_replaced): Unsubscribe the messages
5009 in OnClose and not in map_layers_removed or
5010 layer_shapestore_replaced to make sure it always happens when the
5011 dialog is closed
5012
5013 2003-06-13 Jonathan Coles <[email protected]>
5014
5015 This puts back a fix for Windows where a panel is needed so that
5016 the background of the table view appears correctly.
5017
5018 * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
5019 object that can be used by derived classes to place any
5020 controls (including the grid) onto.
5021 (QueryTableFrame.__init__): Use the panel as the parent window
5022 for all the controls. Reparent the grid so that the panel is
5023 the parent. Call UpdateStatusText() to correctly initialize
5024 the status bar.
5025
5026 2003-06-13 Jonathan Coles <[email protected]>
5027
5028 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
5029 from wxFrame (as opposed to wxDialog like the other classes)
5030 but otherwise behaves like the other classes. This is needed
5031 for the TableView which isn't really a dialog and needs to
5032 have a status bar and control buttons.
5033
5034 * Thuban/UI/tableview.py (TableGrid.__init__): Create an
5035 instance variable to keep track of how many rows are selected.
5036 Subscribe once to the the events we are interested in.
5037 (ThubanGrid.OnRangeSelect): Only handle event if event handling
5038 hasn't been turned off.
5039 (ThubanGrid.OnSelectCell): Only handle event if event handling
5040 hasn't been turned off.
5041 (ThubanGrid.ToggleEventListeners): Rather than subscribe None
5042 as an event listener (which changes the event handler stack)
5043 simply set an instance variable to False. This is checked in
5044 the event handlers.
5045 (ThubanGrid.GetNumberSelected): Return the number of currently
5046 selected rows.
5047 (TableFrame): Inherit from ThubanFrame so we can have a
5048 status bar and control buttons.
5049 (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
5050 Explicitly set which items are selected in the operator choice and
5051 action choice so there is always a valid selection. Fixes RTbug #1941.
5052 Subscribe to grid cell selection events so we can update the
5053 status bar.
5054 (QueryTableFrame.UpdateStatusText): Update the status bar with
5055 how many rows are in the grid, how many columns, and how many
5056 rows are selected.
5057 (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
5058 Call UpdateStatusText when cells are (de)selected.
5059 (QueryTableFrame.OnQuery): Use the string value in the value
5060 combo if either the selected item index is 0 or if the string
5061 cannot be found in the predefined list (this happens if the
5062 user changes the text). Fixes RTbug #1940.
5063 Only turn off the grid event listeners if there a query comes
5064 back with a none empty list of ids. in the case that the list
5065 is empty this causes a grid.ClearSelection() call to actually
5066 clear the grid selection which causes the selected items in
5067 the map to be deselected. Fixes RTbug #1939.
5068
5069 * test/test_save.py (XMLWriterTest.Encode): Check return values.
5070 Fixes RTbug #1851.
5071
5072 2003-06-13 Bernhard Herzog <[email protected]>
5073
5074 * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
5075 self.selected_shape with the current selection to make sure the
5076 contents of the dialog are up to date when it's shown for the
5077 first time.
5078 The dialog used to work without this by luck. The recent fix to
5079 the connector module 'broke' a 'feature' the identify view was
5080 relying on, i.e that subscribing to a message in response to
5081 receiving a message of that type would mean that the new
5082 subscriber would also be called for the same message.
5083
5084 2003-06-12 Jonathan Coles <[email protected]>
5085
5086 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
5087 the image is rendered. Fixes RTbug #1937.
5088
5089 2003-06-12 Jonathan Coles <[email protected]>
5090
5091 * Thuban/Lib/fileutil.py: As is done under Windows, create the
5092 user directory if it doesn't exist on a posix system.
5093 Fixes RTbug #1815.
5094
5095 * Thuban/Model/resource.py (get_user_proj_files): Moved the
5096 called to get_application_dir here, so that the directory
5097 will only be called if this method is invoked.
5098
5099 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
5100 the projfilepath if no projection is selected.
5101
5102 2003-06-12 Jonathan Coles <[email protected]>
5103
5104 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
5105 the scalebar if the current map has no projection set.
5106
5107 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
5108 projfilepath label to just the basename of the projection file
5109 rather than include the entire path.
5110
5111 * Thuban/Model/resource.py: Fix missed proj functions that
5112 needed to be renamed.
5113
5114 2003-06-12 Jonathan Coles <[email protected]>
5115
5116 * Thuban/Model/classification.py: Removed assert statements that
5117 tested if the variable was an instance of Color.
5118
5119 * Thuban/Model/color.py (Color): Remove commented code that isn't
5120 used.
5121 (Transparent): Renamed from NoColor. Doesn't inherit from Color.
5122 Fixes RTbug #1835.
5123 (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
5124 Needed now that the class doesn't inherit from Color.
5125
5126 2003-06-12 Jonathan Coles <[email protected]>
5127
5128 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
5129 check unicode strings.
5130
5131 * test/test_layer.py: Check for existence of gdal.
5132
5133 2003-06-12 Jonathan Coles <[email protected]>
5134
5135 * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
5136 that was in load.py
5137
5138 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
5139 that was in save.py
5140
5141 2003-06-12 Jonathan Coles <[email protected]>
5142
5143 This is largely a collection of bug fixes. We also handle the
5144 case where gdal is not on the system. The XMLReader and XMLWriter
5145 classes were moved into there own files to resolve some circular
5146 import references and because they shouldn't really be in the
5147 file that is dediciated to reading/writing session files since
5148 they are also used elsewhere.
5149
5150 * Thuban/Model/classgen.py: Renamed functions to follow the
5151 function_names_with_underscores style. Fixes RTbug #1903.
5152 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
5153
5154 * Thuban/Model/layer.py: Import gdal only if it available.
5155 (RasterLayer): Handle the case where the gdal library is unavailable.
5156 Addresses RTbug #1877.
5157
5158 * Thuban/Model/load.py (XMLReader): Moved into seperate file
5159 xmlreader.py.
5160
5161 2003-06-12 Jonathan Coles <[email protected]>
5162
5163 This is largely a collection of bug fixes. We also handle the
5164 case where gdal is not on the system. The XMLReader and XMLWriter
5165 classes were moved into there own files to resolve some circular
5166 import references and because they shouldn't really be in the
5167 file that is dediciated to reading/writing session files since
5168 they are also used elsewhere.
5169
5170 * Thuban/Model/classgen.py: Renamed functions to follow the
5171 function_names_with_underscores style. Fixes RTbug #1903.
5172 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
5173
5174 * Thuban/Model/layer.py: Import gdal only if it available.
5175 (RasterLayer): Handle the case where the gdal library is unavailable.
5176 Addresses RTbug #1877.
5177
5178 * Thuban/Model/load.py (XMLReader): Moved into seperate file
5179 xmlreader.py.
5180
5181 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
5182 file xmlwriter.py.
5183
5184 * Thuban/Model/resource.py: Renamed functions to following the
5185 function_names_with_underscores style.
5186 (has_gdal_support): New function that returns true if the gdal
5187 library is available. Addresses RTbug #1877.
5188
5189 * Thuban/UI/application.py (ThubanApplication.OpenSession):
5190 Display a message box if the gdal library is not available, but
5191 only if there are any layers that would use it. Addresses RTbug #1877.
5192
5193 * Thuban/UI/classgen.py: Use renamed projection resource functions.
5194 (GenUniformPanel.__CalcStepping): Fix a slight discrepency
5195 when using integers versus floats.
5196
5197 * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
5198 determine if the "Add Image Layer" menu option should be
5199 greyed out or not. Addresses RTbug #1877.
5200
5201 * Thuban/UI/projdialog.py: Use renamed projection resource functions.
5202
5203 * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
5204 optimize if a raster layer is visible. Fixes RTbug #1931.
5205 Only draw the raster layer if the gdal library is available.
5206 Addresses RTbug #1877.
5207
5208 * test/test_classgen.py: Add tests for generate_singletons,
5209 generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
5210 (test_calculate_quantiles): Fix some tests to catch the new
5211 ValueError that is raised.
5212
5213 * test/test_proj.py: Use renamed projection resource functions.
5214
5215 * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
5216 test for saving classified layers. Fixes RTbug #1902.
5217 (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
5218
5219 2003-06-12 Jan-Oliver Wagner <[email protected]>
5220
5221 Fix for http://intevation.de/rt/webrt?serial_num=1900.
5222
5223 * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
5224
5225 * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
5226 multiplechoicedialog.py rather than from the wxPython library.
5227
5228 2003-06-11 Frank Koormann <[email protected]>
5229
5230 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
5231 update.
5232
5233 2003-06-11 Frank Koormann <[email protected]>
5234
5235 * Thuban/Lib/fileutil.py (get_application_dir): New function to
5236 determine the absolute .thuban/thuban directory under
5237 "posix" (os.expanduser) and "nt" (read AppData registry key).
5238
5239 * Thuban/Model/resource.py: Use get_application_dir
5240
5241 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
5242 Use get_application_dir.
5243
5244 2003-06-10 Bernhard Herzog <[email protected]>
5245
5246 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
5247 the messages MAP_LAYERS_REMOVED messages
5248 (LayerTableFrame.OnClose): Unsubscribe from it.
5249 (LayerTableFrame.map_layers_removed): New. Receiver for
5250 MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
5251 dialog is showing is removed.
5252
5253 2003-06-10 Bernhard Herzog <[email protected]>
5254
5255 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
5256 of the receivers list so that unsubscribing in a receiver doesn't
5257 modify it while iterating over it.
5258
5259 * test/test_connector.py
5260 (ConnectorTest.test_disconnect_in_receiver): New. Test whether
5261 unsubscribing in a receiver works correctly. See docstring for
5262 details
5263
5264 2003-06-10 Bernhard Herzog <[email protected]>
5265
5266 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
5267 message.
5268
5269 * Thuban/Model/layer.py (Layer.SetShapeStore): Send
5270 LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
5271 LAYER_CHANGED will still be sent if the classification changes.
5272
5273 * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
5274 parameter so we can subscribe to some of its messages
5275 (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
5276 and the layer's LAYER_SHAPESTORE_REPLACED
5277 (Classifier.unsubscribe_messages): New. Unsubscribe from message
5278 subscribed to in __init__
5279 (Classifier.map_layers_removed)
5280 (Classifier.layer_shapestore_replaced): receivers for the messages
5281 subscribed to in __init__. Unsubscribe and close the dialog
5282
5283 * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
5284 the map to the Classifier dialog
5285
5286 * test/test_layer.py (SetShapeStoreTests): Derive from
5287 SubscriberMixin as well so we can test messages
5288 (SetShapeStoreTests.setUp): Subscribe to some of the layer's
5289 messages
5290 (SetShapeStoreTests.tearDown): Clear the messages again
5291 (SetShapeStoreTests.test_sanity): Expand the doc-string and check
5292 for the modified flag too
5293 (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
5294 to check whether SetShapeStore sets the modified flag
5295 (SetShapeStoreTests.test_set_shape_store_different_field_name)
5296 (SetShapeStoreTests.test_set_shape_store_same_field)
5297 (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
5298 Add tests for the messages. This checks both the new
5299 LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
5300
5301 2003-06-06 Jan-Oliver Wagner <[email protected]>
5302
5303 * Thuban/UI/mainwindow.py: Improved and partly added help texts for
5304 the menu items.
5305
5306 2003-06-05 Frank Koormann <[email protected]>
5307
5308 * Thuban/UI/identifyview.py (IdentifyView.__init__):
5309 Layout reimplemented without panel. Make life easier to fit the list
5310 in the dialog.
5311
5312 2003-06-05 Frank Koormann <[email protected]>
5313
5314 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
5315 once on initialisation (Former implementation resulted in multiple
5316 entries for each projection).
5317 (ProjFrame.__FillAvailList): selectProj as second optional parameter,
5318 if set, select the projection found under the specified name. This
5319 overwrites any other selection estimate.
5320 Removed projchoice filling from this method.
5321 (ProjFrame._OnSave, ProjFrame._OnAddToList):
5322 Updated call of ProjFrame.__FillAvailList
5323 (LCCPanel._DoLayout): Moved parameter controls in more common order.
5324
5325 * Resources/Projections/defaults.proj: Extended defaults representing
5326 various common European projections.
5327
5328 2003-06-05 Frank Koormann <[email protected]>
5329
5330 * Thuban/UI/identifyview.py (IdentifyView.__init__):
5331 Use ListCtrl instead of GridCtrl
5332
5333 * Thuban/Model/resource.py:
5334 Guess location of .thuban directory from tempdir parent directory.
5335
5336 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
5337 Guess location of .thuban directory from tempdir parent directory.
5338
5339 2003-06-04 Bernhard Herzog <[email protected]>
5340
5341 Do not cache the values returned by the tree widget's
5342 GetFirstChild and GetNextChild methods because it led to lots of
5343 segfaults. The new way requires more brute force but is more
5344 reliable.
5345
5346 * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
5347 variable layer2id
5348 (LegendTree.find_layer): New method to do with brute force what
5349 layer2id tried to accomplish
5350 (LegendTree._OnMsgLayerChanged)
5351 (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
5352 Use find_layer instead of layer2id
5353 (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
5354 update layer2id anymore
5355 (LegendTree._OnMsgMapLayersRemoved)
5356 (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
5357
5358 2003-06-03 Thomas Koester <[email protected]>
5359
5360 * Thuban/Model/classgen.py (GenQuantiles0): New function.
5361
5362 2003-06-02 Bernhard Herzog <[email protected]>
5363
5364 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
5365 New commands.
5366 (main_menu): Add the new commands.
5367 (MainWindow.TableRename): New. Implementation of the table_rename
5368 command.
5369 (MainWindow.RenameLayer): New. Implementation of the layer_rename
5370 command.
5371
5372 * Thuban/Model/session.py (Session.AddTable): call self.changed to
5373 set the modified flag
5374
5375 * test/test_session.py (TestSessionSimple.test_add_table): Test
5376 whether the modified flag is set properly
5377
5378 * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
5379 instead of issue so that the modified flags get updated.
5380
5381 * test/test_base.py (SomeTitledObject): Derive from Modifiable
5382 instead of Publisher to reflect reality better and to accomodate
5383 the fact that SetTitle now calls changed instead of issue
5384
5385 2003-06-02 Bernhard Herzog <[email protected]>
5386
5387 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
5388 acquisition has to happen before the try in a try-finally.
5389
5390 2003-06-02 Bernhard Herzog <[email protected]>
5391
5392 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
5393 possible that a layer is removed that is not currently selected in
5394 the legend so don't check for this.
5395
5396 2003-05-30 Bernhard Herzog <[email protected]>
5397
5398 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
5399 variables to None that have direct or indirect references to
5400 shapefiles or dbf files to make sure that they do go away and the
5401 files are closed.
5402
5403 2003-05-30 Bernhard Herzog <[email protected]>
5404
5405 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
5406 availImgListIndices when a new image list is created
5407
5408 2003-05-30 Bernhard Herzog <[email protected]>
5409
5410 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
5411 changing_selection to indicate whether the LegendTree code itself
5412 is currently changing the selection
5413 (LegendTree.normalize_selection): New method to normalize the
5414 selection by selecting the layer item even if the user clicked on
5415 the classification.
5416 (LegendTree._OnSelChanged): normalize the selection. This works
5417 around a bug in wx which doesn't keep track of the selection
5418 properly when subtrees are deleted.
5419
5420 2003-05-30 Bernhard Herzog <[email protected]>
5421
5422 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
5423 maximum and minimum scale factors.
5424
5425 * test/test_classgen.py (ClassGenTest.test): Update to reflect the
5426 changes in classgen.py
5427
5428 2003-05-30 Jonathan Coles <[email protected]>
5429
5430 * Thuban/Model/classgen.py: Remove ClassGenerator class but make
5431 all the methods functions. Fixes RTBug #1903.
5432
5433 * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
5434 to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
5435 RTBug #1907.
5436
5437 * Thuban/UI/classgen.py: Use classgen functions that were part
5438 of the ClassGenerator class. Put try/finally blocks around
5439 code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
5440 RTBug #1904.
5441
5442 * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
5443
5444 * Thuban/UI/legend.py: The legend was cleared and repopulated any
5445 time something changed which caused some state to be lost such
5446 as which children were expanded or collapsed. Fixes RTBug #1901.
5447 (LegendTree._OnMsgMapLayersAdded): Add only new layers.
5448 (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
5449 the legend but not in the map.
5450 (LegendTree.__FillTree): Move main functionality out into smaller
5451 methods that can be used by other methods.
5452 (LegendTree.__FillTreeLayer): Reuse old slots in the image list
5453 if they are available.
5454 (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
5455 that we override the wxTreeCtrl method. Iterate over children
5456 and call __RemoveLayer.
5457 (LegendTree.__AddLayer): New. Add a new layer to the legend.
5458 (LegendTree.__RemoveLayer): Remove a layer from the legend.
5459 (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
5460 Should only be called with the id of a layer branch.
5461 (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
5462 Returns the root item or creates one if necessary.
5463
5464 * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
5465 ProjectRasterFile with tuple arguments instead of strings.
5466
5467 * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
5468 with try/finally. Fixes RTBug #1904.
5469
5470 * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
5471 with try/finally. Fixes RTBug #1904.
5472 (MapCanvas.FitSelectedToWindow): If a single point is selected
5473 simply center it on the display. Fixes RTBug #1849.
5474
5475 * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
5476 to be compiled as a standalone app. Now the code can only be
5477 called from Python which simplifies the parameter passing.
5478 (ProjectRasterFile): Handle Python arguments. Remove code that
5479 checks for a destination dataset. Add more clean up code.
5480
5481 * test/test_map.py (TestMapWithContents.test_raise_layer_top,
5482 TestMapWithContents.test_lower_layer_bottom):
5483 Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
5484 Fixes RTBug #1907.
5485
5486 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
5487 extent to the map when the legend is toggled. Fixes RTBug #1881.
5488
5489 2003-05-29 Jan-Oliver Wagner <[email protected]>
5490
5491 * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
5492 unsubscribes all that is subcribed in __init__.
5493
5494 2003-05-28 Bernhard Herzog <[email protected]>
5495
5496 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
5497 (MainWindow.CanDuplicateLayer): New methods to implement the
5498 Layer/Duplicate command.
5499 (layer_duplicate command): New.
5500 (main_menu): Add layer_duplicate to the Layer menu.
5501
5502 2003-05-28 Bernhard Herzog <[email protected]>
5503
5504 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
5505 renderer so that NULL/None values get displayed differently (by a
5506 gray rectangle).
5507 (TableGrid.__init__): Override the default renderers
5508
5509 2003-05-28 Bernhard Herzog <[email protected]>
5510
5511 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
5512 classification to "None" if the type of the field has changed.
5513
5514 * test/test_layer.py (SetShapeStoreTests): New. Class with a few
5515 test for the Layer.SetShapeStore method
5516
5517 2003-05-28 Jan-Oliver Wagner <[email protected]>
5518
5519 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
5520 does not necessarily have a filename).
5521
5522 2003-05-28 Jan-Oliver Wagner <[email protected]>
5523
5524 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
5525 sort the selection list for the dialog.
5526
5527 2003-05-28 Frank Koormann <[email protected]>
5528
5529 * extensions/thuban/wxproj.cpp
5530 (project_point): Removed cast to int for projected point coordinates.
5531 (shape_centroid): Return last point if all polygon vertices fall
5532 to one point.
5533
5534 2003-05-28 Bernhard Herzog <[email protected]>
5535
5536 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
5537 with layers that don't have shapestores, i.e. raster layers.
5538
5539 2003-05-28 Bernhard Herzog <[email protected]>
5540
5541 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
5542 when determining the title from the filename.
5543
5544 * test/test_dbf_table.py (TestDBFTable.test_title): Update to
5545 reflect changes in the way the title is derived from the filename
5546
5547 2003-05-28 Frank Koormann <[email protected]>
5548
5549 * Thuban/UI/mainwindow.py (MainWindow.TableShow):
5550 Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
5551
5552 2003-05-27 Bernhard Herzog <[email protected]>
5553
5554 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
5555 delegate SelectedLayer.
5556 (MainWindow.LayerUnjoinTable): Implement.
5557 (_can_unjoin): New. Helper function for the sensitivity of the
5558 layer/unjoin command.
5559
5560 * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
5561 (DerivedShapeStore.OrigShapeStore): New. Return the original
5562 shapestore. Used to figure out how to unjoin.
5563 (DerivedShapeStore.Shapefile): Fix a typo.
5564
5565 2003-05-27 Bernhard Herzog <[email protected]>
5566
5567 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
5568 well
5569 (JoinDialog.__init__): Use the layer parameter and only build the
5570 left choice when a layer is given
5571 (JoinDialog.OnJoin): Handle layer joins as well
5572 (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
5573 that the user selects the "Select..." item. The sensitivitly
5574 updating is now in update_sensitivity
5575 (JoinDialog.y): New method to refactor the sensitivity update of
5576 the join button into its own method.
5577
5578 * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
5579
5580 2003-05-27 Bernhard Herzog <[email protected]>
5581
5582 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
5583 iff there are unreferenced tables in the session
5584
5585 2003-05-27 Bernhard Herzog <[email protected]>
5586
5587 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
5588
5589 * Thuban/Model/session.py (Session.UnreferencedTables): New method
5590 to return tables that are not referenced by other tables or shape
5591 stores and can be removed.
5592 (Session.RemoveTable): Issue a TABLE_REMOVED message after
5593 removing the table
5594
5595 * Thuban/UI/mainwindow.py: Remove unused imports
5596 (MainWindow.TableClose): Implement.
5597
5598 * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
5599 messages so that the frame will be automatically closed when a new
5600 session is opened or the table is removed.
5601 (TableFrame.OnClose): Unsubscribe the Subscriptions made in
5602 __init__
5603 (TableFrame.close_on_session_replaced)
5604 (TableFrame.close_on_table_removed): New. Subscribers that close
5605 the window
5606
5607 * test/test_session.py (TestSessionMessages.test_remove_table)
5608 (TestSessionSimple.test_remove_table): Move the test to
5609 TestSessionSimple and add test for the TABLE_REMOVED message
5610 (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
5611 (TestSessionSimple.test_unreferenced_tables) New. Test for the
5612 UnreferencedTables method.
5613 (UnreferencedTablesTests): New. Class with some more sophisticated
5614 tests for UnreferencedTables.
5615
5616 2003-05-27 Frank Koormann <[email protected]>
5617
5618 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
5619 display has some unwanted side effects. Removed again.
5620
5621 2003-05-27 Frank Koormann <[email protected]>
5622
5623 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
5624
5625 * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
5626
5627 2003-05-27 Jan-Oliver Wagner <[email protected]>
5628
5629 * test/test_menu.py (MenuTest.test): Added test for
5630 Menu.RemoveItem().
5631
5632 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
5633 the menu.
5634
5635 2003-05-27 Frank Koormann <[email protected]>
5636
5637 Nonmodal dialogs without parent (i.e. they can fall behind the main
5638 window)
5639
5640 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
5641 all dialogs in the dialogs dictionary and the canvas.
5642
5643 * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
5644 parent, i.e. can fall behind other windows.
5645 (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
5646 dictionary before removing it.
5647
5648 * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
5649
5650 * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
5651 * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
5652 * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
5653
5654 2003-05-27 Bernhard Herzog <[email protected]>
5655
5656 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
5657 tableview dialog
5658 (MainWindow.TableShow): Use ShowTableView to open the dialogs.
5659 Also, don't use the table's titles as the dialog names. The titles
5660 aren't guaranteed to be unique.
5661 (MainWindow.TableOpen): Open a table view dialog after opening the
5662 table
5663
5664 2003-05-27 Bernhard Herzog <[email protected]>
5665
5666 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
5667 effect can be achieved by simply closing the window showing the
5668 table.
5669 (MainWindow.TableHide): Removed.
5670 (main_menu): Removed "table_hide"
5671
5672 2003-05-27 Frank Koormann <[email protected]>
5673
5674 Fix legend tree display problems under Win32
5675
5676 * Thuban/UI/legend.py: BMP_SIZE_W = 15
5677 (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
5678 (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
5679
5680 * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
5681
5682 2003-05-27 Jan-Oliver Wagner <[email protected]>
5683
5684 * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
5685 'after' now allows to insert separators almost anywhere in the menu.
5686
5687 2003-05-27 Frank Koormann <[email protected]>
5688
5689 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
5690 "S" of selection box label to hint on hot key (Alt-S). Works under
5691 Win32 but is ignored under GTK.
5692
5693 2003-05-26 Frank Koormann <[email protected]>
5694
5695 * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
5696 Center Choices.
5697
5698 2003-05-26 Bernhard Herzog <[email protected]>
5699
5700 Remove the Precision methods again. They're too DBF specific to be
5701 part of the table interface and they're only used in table_to_dbf
5702 anyway.
5703
5704 * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
5705 fixed precision of 12 for doubles.
5706 (TransientTableBase.Precision): Removed
5707 (AutoTransientTable.Width): Delegate to self.table.
5708
5709 * Thuban/Model/table.py (DBFTable.Precision)
5710 (MemoryTable.Precision): Removed.
5711 (MemoryTable.Width): Use a fixed precision of 12 for doubles.
5712 (table_to_dbf): Use a fixed precision of 12 for floats unless the
5713 column object specifies something else.
5714
5715 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
5716 test for table_to_dbf
5717
5718 2003-05-26 Bernhard Herzog <[email protected]>
5719
5720 * test/test_transientdb.py
5721 (TestTransientTable.run_iceland_political_tests): Fix a comment.
5722
5723 2003-05-26 Bernhard Herzog <[email protected]>
5724
5725 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
5726 implementation. Mark parts of the file format strings for
5727 localization.
5728
5729 * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
5730 file and add the table to the tables managed by the session
5731
5732 * test/test_session.py (TestSessionSimple.test_open_table_file):
5733 New. test case for OpenTableFile
5734
5735 2003-05-26 Jan-Oliver Wagner <[email protected]>
5736
5737 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
5738 Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
5739 Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
5740 Replace the true/false of wxWindows by True/False of Python 2.2.1.
5741
5742 2003-05-26 Jan-Oliver Wagner <[email protected]>
5743
5744 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
5745 already a selection present, update the grid accordingly.
5746
5747 * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
5748 resizeable and increase its initial size.
5749
5750 2003-05-26 Frank Koormann <[email protected]>
5751
5752 Table export functionality
5753
5754 * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
5755 Return width (in characters) for a column.
5756 (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
5757 (table_to_dbf): Write table to dbf file.
5758 (table_to_csv): Write table to csv file.
5759
5760 * Thuban/Model/transientdb.py (TransientTableBase.Width,
5761 TransientTableBase.Precision): Return column width and precision.
5762
5763 * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
5764 or table_to_csv depending on file selection.
5765
5766 * test/test_dbf_table.py:
5767 Test table_to_dbf (extension of former part of test).
5768
5769 * test/test_csv_table.py:
5770 Test table_to_csv.
5771
5772 2003-05-23 Jan-Oliver Wagner <[email protected]>
5773
5774 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
5775 Use QueryTableFrame instead of TableFrame.
5776
5777 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
5778 table window with 'Layer Table:' instead of 'Table:'.
5779
5780 2003-05-23 Jan-Oliver Wagner <[email protected]>
5781
5782 Give all tables a title via mix-in TitledObject.LayerShowTable
5783
5784 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
5785 only if it exists.
5786
5787 * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
5788 and call its init-method with a default title. Remove Title() method.
5789
5790 * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
5791 AutoTransientTable): mix-in TitledObject and call its init-method with
5792 a default title. Remove Title() method.
5793
5794 2003-05-23 Bernhard Herzog <[email protected]>
5795
5796 * Thuban/Model/session.py (Session.AddShapeStore): Define
5797 AddShapeStore analogously to AddTable.
5798
5799 * test/test_session.py (TestSessionSimple.test_add_shapestore):
5800 New. Test for AddShapeStore
5801
5802 2003-05-23 Jan-Oliver Wagner <[email protected]>
5803
5804 Introducing QueryTableFrame and a very coarse ShowTable implementation.
5805
5806 * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
5807 class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
5808 The latter implements the selection GUI without dependency on a layer.
5809 LayerTableFrame now is derived from QueryTableFrame and connects
5810 to a layer.
5811
5812 * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
5813 implementation that still needs work.
5814
5815 * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
5816
5817 2003-05-22 Frank Koormann <[email protected]>
5818
5819 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
5820 Added "outer_join = False" as optional parameter.
5821 (TransientJoinedTable.create): If outer join is true, perform a
5822 "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
5823 the left table. Records not matching are filled with 0 / None.
5824
5825 * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
5826 (JoinDialog.OnJoin): Consider outer join check box.
5827
5828 2003-05-22 Bernhard Herzog <[email protected]>
5829
5830 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
5831 somewhat safer way. Storing the traceback in a local variable can
5832 lead to memory leaks
5833
5834 2003-05-22 Bernhard Herzog <[email protected]>
5835
5836 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
5837 the wxMessageDialog's Destroy() method.
5838
5839 2003-05-22 Frank Koormann <[email protected]>
5840
5841 * Thuban/UI/join.py (JoinDialog.__init__): Make use of
5842 TransientTable.Title()
5843
5844 2003-05-22 Frank Koormann <[email protected]>
5845
5846 Join Dialog, initial version.
5847
5848 * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
5849
5850 * Thuban/UI/join.py (JoinDialog): Functional implementation of
5851 former framework. Renamed Table1/Table2 to LeftTable/RightTable
5852 in all occurences.
5853
5854 * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
5855 Typo fixed.
5856
5857 2003-05-22 Bernhard Herzog <[email protected]>
5858
5859 Give the tables titles so that the GUI can display more meaningful
5860 names. For now the titles are fixed but depend on e.g. filenames
5861 or the titles of the joined tables.
5862
5863 * Thuban/Model/transientdb.py (TransientTable.Title)
5864 (TransientJoinedTable.Title, AutoTransientTable.Title): New.
5865
5866 * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
5867
5868 * test/test_transientdb.py
5869 (TestTransientTable.test_auto_transient_table_title): New. Test
5870 for the Title method
5871 (TestTransientTable.test_transient_joined_table)
5872 (TestTransientTable.test_transient_table): Add test for the Title
5873 methods
5874
5875 * test/test_memory_table.py (TestMemoryTable.test_title): New.
5876 Test for the Title method
5877
5878 * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
5879 the Title method
5880
5881 2003-05-22 Bernhard Herzog <[email protected]>
5882
5883 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
5884 Provide a better way to destroy the layers
5885 (TestLayer.test_base_layer, TestLayer.test_arc_layer)
5886 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
5887 (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
5888 the new way to destroy the layers.
5889 (TestLayer.test_derived_store): New. Test for using a layer with a
5890 DerivedShapeStore
5891
5892 * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
5893 filename if the shape store actually has one.
5894
5895 2003-05-22 Bernhard Herzog <[email protected]>
5896
5897 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
5898 for the filename
5899
5900 * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
5901 for the FileName method
5902 (TestDBFTableWriting.test_write): Fix spelling of filename
5903
5904 2003-05-22 Thomas Koester <[email protected]>
5905
5906 * Thuban/Model/range.py, test/test_range.py: Brought over new Range
5907 from SciParam that now really is immutable.
5908
5909 2003-05-22 Frank Koormann <[email protected]>
5910
5911 Layer Top/Bottom placement added to legend.
5912
5913 * Thuban/UI/legend.py
5914 (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
5915 bound to tool events.
5916 (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
5917 New, methods binding the event methods with the map methods.
5918
5919 * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
5920 layer at top/bottom of layer stack.
5921
5922 * Resources/Bitmaps/top_layer.xpm: New button icon.
5923
5924 * Resources/Bitmaps/bottom_layer.xpm: New button icon.
5925
5926 2003-05-22 Bernhard Herzog <[email protected]>
5927
5928 * Thuban/Model/session.py (Session.RemoveTable): New method to
5929 remove tables
5930
5931 * test/test_session.py (TestSessionSimple.test_remove_table): New.
5932 Test for RemoveTable
5933
5934 2003-05-22 Thomas Koester <[email protected]>
5935
5936 * Thuban/Model/classgen.py: Added short module doc string and CVS id.
5937 (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
5938
5939 2003-05-22 Bernhard Herzog <[email protected]>
5940
5941 Implement a way to discover dependencies between tables and
5942 shapestores.
5943
5944 * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
5945 (TransientJoinedTable.Dependencies)
5946 (AutoTransientTable.SimpleQuery): New. Implement the dependencies
5947 interface
5948 (TransientJoinedTable.__init__): Keep tack of the original table
5949 objects in addition to the corresponding transient tables.
5950
5951 * Thuban/Model/table.py (DBFTable.Dependencies)
5952 (MemoryTable.Dependencies): New. Implement the dependencies
5953 interface
5954
5955 * Thuban/Model/data.py (ShapeTable): New. Helper class for
5956 ShapefileStore
5957 (ShapefileStore.__init__): Use ShapeTable instead of
5958 AutoTransientTable
5959 (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
5960 (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
5961 methods for filename and type
5962 (ShapefileStore.Dependencies): New. Implement the dependencies
5963 interface
5964 (DerivedShapeStore): New class to replace SimpleStore. The main
5965 difference to SimpleStore is that it depends not on a shapefile
5966 but another shapestore which expresses the dependencies a bit
5967 better
5968 (SimpleStore.__init__): Add deprecation warning.
5969
5970 * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
5971 Test for the Dependencies method.
5972
5973 * test/test_memory_table.py (TestMemoryTable.test_dependencies):
5974 New. Test for the Dependencies method.
5975
5976 * test/test_transientdb.py
5977 (TestTransientTable.test_auto_transient_table_dependencies): New.
5978 Test for the Dependencies method.
5979 (TestTransientTable.test_transient_joined_table): Add test for the
5980 Dependencies method.
5981
5982 * test/test_session.py (TestSessionSimple.setUp)
5983 (TestSessionSimple.tearDown): New. Implement a better way to
5984 destroy the sessions.
5985 (TestSessionSimple.test_initial_state)
5986 (TestSessionSimple.test_add_table): Bind session to self.session
5987 so that it's destroyed by tearDown
5988 (TestSessionSimple.test_open_shapefile): New. Test for
5989 OpenShapefile and the object it returns
5990
5991 2003-05-22 Bernhard Herzog <[email protected]>
5992
5993 * Thuban/Model/session.py (Session.AddTable): New method to
5994 register tables with the session.
5995 (Session.Tables): Return the tables registered with AddTable too.
5996
5997 * test/test_session.py (TestSessionSimple.test_add_table): New.
5998 Test case for the AddTable method
5999
6000 2003-05-22 Frank Koormann <[email protected]>
6001
6002 UI polishing updates: Place main buttons (OK, Cancel, etc) in the
6003 lower right corner, center labels for selections, initialize controls
6004 in reasonable order for keyboard navigation.
6005
6006 * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
6007 (ProjFrame.__DoOnProjAvail): Determine position of current projection
6008 using the wxListBox.FindString() method. Still a problem (#1886)
6009
6010 * Thuban/UI/classifier.py
6011 (Classifier.__init__, SelectPropertiesDialog.__init__)
6012
6013 * Thuban/UI/classgen.py (ClassGenDialog.__init__,
6014 (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
6015 different classification types from here to __init__.
6016 (GenUniquePanel.__init__): Set the column width of the first field
6017 in the Field ListCtrl to the full width.
6018
6019 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
6020 Button to 'Export'. Center Buttons in Selection Box, set Focus to
6021 Grid.
6022 (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
6023 changes focus to the Selection when pressing "Alt-S".
6024
6025 * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
6026 the text if not visible. The italic font sometimes exceeds the
6027 rendering area.
6028
6029 2003-05-21 Jonathan Coles <[email protected]>
6030
6031 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
6032 to OnClose so that Thuban closes correctly.
6033
6034 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
6035 DockFrame.OnClose, not DockFrame._OnClose.
6036
6037 2003-05-21 Jonathan Coles <[email protected]>
6038
6039 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
6040 references to 'inf' and use new Range __init__ to pass floats
6041 directly rather than converting them to strings first.
6042 Fixes RTBug #1876.
6043
6044 * Thuban/Model/classification.py (ClassGroupRange.SetRange):
6045 Use new Range ___init__ to pass floats.
6046
6047 * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
6048 filename is a valid image file. Throw IOError otherwise.
6049
6050 * Thuban/Model/range.py: Brought over new Range from SciParam that
6051 is immutable and has an __init__ which can accept floats.
6052
6053 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
6054 into try block. AddLayer doesn't throw any exceptions anymore.
6055 (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
6056 try block.
6057
6058 * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
6059 the first item in choices. Fixes RTBug #1882.
6060
6061 * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
6062 has gone to 0 which is a serious problem. abort.
6063 (MapRenderer.draw_raster_layer): Catch IOError seperately and
6064 print the error from GDAL.
6065
6066 * Thuban/UI/tableview.py (TableGrid.__init__): Call
6067 ToggleEventListeners to turn on listening.
6068 (TableGrid.ToggleEventListeners): New. Turns event listening on
6069 and off so as to prevent excessive messages.
6070 (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
6071 to suppress excessive messages when selecting many rows.
6072 Fixes RTBug #1880.
6073
6074 * Thuban/UI/view.py: Added checks against if scale == 0. This
6075 is a serious problem that can occur when an image without
6076 geo data is loading and causes the map projection bounds to
6077 go to infinity. Right now, the solution is to simply try
6078 to recover.
6079
6080 * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
6081 to set the MFILEReceiver attributes even if the data is NULL.
6082
6083 * extensions/thuban/gdalwarp.cpp: Improved the error handling
6084 and passed GDAL messages back up to the Python layer. Also
6085 tried to fix some memory leaks that were present in the original
6086 utility but didn't matter because the program aborted.
6087
6088 * test/test_range.py: Copied over tests from SciParam. Removed
6089 tests against importing. Fixes RTBug #1867.
6090
6091 2003-05-21 Bernhard Herzog <[email protected]>
6092
6093 * test/test_load.py: Remove unused imports and restructure the
6094 test code
6095 (LoadSessionTest): Split into one class for each test and turn
6096 LoadSessionTest itself into the base class for all such session
6097 tests.
6098 (ClassificationTest): New base class for load tests that test
6099 classifications
6100 (TestSingleLayer, TestLayerVisibility, TestClassification)
6101 (TestLabels, TestLayerProjection, TestRasterLayer): New classes
6102 for the individual tests
6103
6104 * test/support.py (FileLoadTestCase.filename): New base class for
6105 file loading tests
6106
6107 2003-05-21 Jan-Oliver Wagner <[email protected]>
6108
6109 * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
6110 Mercator' to 'UTM Zone 32' as a more convenient example.
6111 Added 'Gauss Krueger Zone 6'.
6112
6113 * Data/iceland_sample_raster.thuban: political polygon now
6114 filled transparent to have the raster image visible at once.
6115
6116 2003-05-21 Frank Koormann <[email protected]>
6117
6118 * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
6119 OnClose() to keep in sync with extensions. Internally Thuban
6120 still uses "underscored" names.
6121
6122 2003-05-20 Jonathan Coles <[email protected]>
6123
6124 This puts back Raster layer support. These layers support projections
6125 through the GDAL library. Currently, the CVS version is being used.
6126 There are no Debian packages available although this may change soon.
6127 A GDAL driver was extended to support writing to memory rather to
6128 files.
6129
6130 There is still some work that needs to be done, such as some error
6131 handling when loading invalid images or when there is a problem
6132 projecting the image. This putback simply checks in the majority
6133 of the work.
6134
6135 * setup.py: Add gdalwarp library extension.
6136
6137 * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
6138 Defaults to False, but can be overridden by subclasses if they
6139 support classification.
6140 (RasterLayer): New. Defines a new layer that represents an
6141 image.
6142
6143 * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
6144 tag handler.
6145 (SessionLoader.start_layer): Encode the filename.
6146 (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
6147 New. Supports reading a rasterlayer tag.
6148
6149 * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
6150
6151 * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
6152 get a string in Latin1. If we get such as string convert it to
6153 unicode first, otherwise leave if alone before encoding.
6154 (SessionSaver.write_layer): Add support for writing both Layers
6155 and RasterLayers.
6156
6157 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
6158 The right argument may not be a string, it could also be a Column.
6159
6160 * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
6161 Make initial window size 600x400. Fixes RTBug #1872.
6162
6163 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
6164 the dialog is constructed so that we can support layers that
6165 do not have classifications.
6166 (Classifier._OnTry): Only build a classification if the layer
6167 supports one.
6168
6169 * Thuban/UI/legend.py: Change all checks that a layer is an
6170 instance of Layer into checks against BaseLayer.
6171 (LegendTree.__FillTreeLayer): Only add children to a branch if
6172 the layer supports classification.
6173
6174 * Thuban/UI/mainwindow.py (MainWindow.NewSession,
6175 MainWindow.OpenSession): Don't proceed with an action if the
6176 user chooses Cancel when they are asked to save changes.
6177 (MainWindow.AddRasterLayer): New. Open a dialog to allow the
6178 user to select an image file. Create a new RasterLayer and add
6179 it to the map.
6180
6181 * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
6182 for rendering RasterLayer layers.
6183 (MapRenderer.draw_raster_layer): Actually method that calls
6184 the GDALWarp python wrapper and constructs an image from the
6185 data returned.
6186
6187 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
6188 Choices symbols to match those used in the table query method.
6189 Replace deprecated method calls on table with new method names.
6190
6191 * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
6192 how small the scale can get. This still needs more testing.
6193
6194 * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
6195 Provides a driver to output in .bmp format.
6196
6197 * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
6198 New. Provides IO routines which write to memory, rather than a file.
6199
6200 * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
6201 of the gdalwarp utility provided in GDAL. Added function calls
6202 that can be accessed from python.
6203
6204 * Data/iceland_sample_raster.thuban: New. Sample file that uses
6205 a raster layer.
6206
6207 * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
6208 layer image data.
6209
6210 * Doc/thuban.dtd: Added rasterlayer attribute definition.
6211
6212 * test/test_layer.py, test/test_load.py, test/test_save.py: Added
6213 tests associated with the raster layer code.
6214
6215 * test/test_transientdb.py
6216 (TestTransientTable.test_auto_transient_table_query): Added a test
6217 for using a Column object as the "right" parameter to a query.
6218
6219 2003-05-19 Frank Koormann <[email protected]>
6220
6221 * Thuban/version.py (get_changelog_date):
6222 Catch exceptions if ChangeLog does not exist.
6223
6224 * Thuban/UI/view.py (MapCanvas.Export): Bugfix
6225
6226 2003-05-19 Frank Koormann <[email protected]>
6227
6228 Extended version information for Thuban
6229
6230 * Thuban/version.py: New, version information for Thuban: Last
6231 modification date and last ChangeLog entry date.
6232
6233 * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
6234 information: Display Thuban, wxPython and Python version.
6235
6236 2003-05-16 Bernhard Herzog <[email protected]>
6237
6238 * Thuban/Model/save.py: Remove some unused imports including the
6239 __future__ import for nested_scopes as Thuban relies on Python 2.2
6240 now.
6241 (XMLWriter.encode): Remove the special case for a None argument.
6242 In the saver encode is always called with a string argument.
6243
6244 2003-05-16 Bernhard Herzog <[email protected]>
6245
6246 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
6247 in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
6248 of the bug was that e.g. float("1.2") would fail. Thuban now
6249 requires 2.4.x.
6250
6251 2003-05-16 Frank Koormann <[email protected]>
6252
6253 Printing enhancement and WMF export (under Win32)
6254
6255 * Thuban/UI/renderer.py (ExportRenderer): New, derived from
6256 ScreenRenderer. Renders Map, Legend and Scalebar for export.
6257 (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
6258 PrintRender.
6259
6260 * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
6261 to fullfil information needed for PrinterRenderer.
6262 (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
6263 (MapCanvas.Print): Adapted to new MapPrintout.
6264 (OutputTransform): General calculations to transform from canvas
6265 coordinates to export/printing devices.
6266
6267 * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
6268 new method_command to call ExportMap, with platform dependency (only
6269 __WXMSW__)
6270
6271 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
6272 of scalebar drawing area as new parameters.
6273
6274 * Thuban/Model/scalebar.py (roundInterval): round long instead of int
6275
6276 * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
6277 Update to extended scalebar.DrawScalebar header.
6278
6279 * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
6280
6281 * test/test_scalebar.py: Made test executable as standalone.
6282
6283 2003-05-16 Bernhard Herzog <[email protected]>
6284
6285 * Thuban/Model/table.py (Table): Remove this compatibility alias
6286 for DBFTable.
6287
6288 * test/test_table.py: Import DBFTable as Table because that alias
6289 doesn't exist anymore.
6290
6291 * Thuban/UI/classgen.py: Remove some unused imports
6292
6293 2003-05-14 Jonathan Coles <[email protected]>
6294
6295 * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
6296 Fix docstring.
6297 (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
6298 (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
6299 values of the supplied range to determine the beginning and end
6300 bounds of the generated classes.
6301
6302 * Thuban/Model/range.py (Range.number_re): Now accepts floats that
6303 do not have a leading 0 (.5 is now accepted as well as 0.5).
6304
6305 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
6306 call to ClassGenerator.GenUniformDistribution.
6307
6308 * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
6309 layout bug with the 'Projection' label.
6310
6311 * test/support.py (FloatTestCase): New. Needed for the Range tests.
6312
6313 * test/test_range.py: New. Imported from SciParam.
6314
6315 2003-05-12 Jonathan Coles <[email protected]>
6316
6317 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
6318 to table.UniqueValues() with calls that retrieve all the values
6319 from the table. This will need to be replaced by a method on table
6320 which can simply return the list (perhaps more efficiently).
6321
6322 2003-05-12 Jonathan Coles <[email protected]>
6323
6324 The return value of ClassGenerator.CalculateQuantiles has changed.
6325 Refer to the documentation for details.
6326
6327 * test/test_classgen.py: Modified Quantile tests to use the
6328 new return values.
6329
6330 * Thuban/Model/classgen.py
6331 (ClassGenerator.GenQuantiles): Add comments describing the parameters,
6332 use new return values from CalculateQuantiles to produce the correct
6333 range bounds in the Classification.
6334 (ClassGenerator.CalculateQuantiles): Add more comments describing
6335 the return values and parameters. Make minor adjustments to improve
6336 the legibility of the code. Fix problem with adjusted not being set
6337 in most cases.
6338
6339 2003-05-12 Frank Koormann <[email protected]>
6340
6341 * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
6342 and latin1. Fixes #1851 finally.
6343
6344 2003-05-09 Jonathan Coles <[email protected]>
6345
6346 * test/test_classgen.py: New. Tests the Quantile algorithm.
6347
6348 * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
6349 Clean up debugging statement, add comments, fix a small bug in the
6350 returned adjusted percentiles.
6351
6352 2003-05-09 Jonathan Coles <[email protected]>
6353
6354 Introduces Range class from SciParam into the ClassGroupRange class,
6355 and such ranges can now be saved and loaded from disk.
6356
6357 Quantiles are now available in the Classification Generator.
6358
6359 Initial support for building Queries on a table. Doesn't do anything
6360 but run some tests.
6361
6362 * Thuban/Model/classification.py: Explicit imports.
6363 (ClassGroupRange): Use the Range class to store the underlying
6364 range information. The interface remains the same, except for
6365 GetRange(), and you can also supply a Range object as the min
6366 parameter to SetRange or __init__.
6367
6368 * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
6369 string appropriately for use in Thuban. Fixes RTbug #1851.
6370 (SessionLoader.end_projection): Handle the context of the
6371 projection tag a bit better by looking at what objects are not
6372 None. There was an assumption that a projection tag for a map
6373 could occur before any layers.
6374 (SessionLoader.start_clrange): Provide backward compatibility for
6375 reading min/max values as well as the new range parameter.
6376
6377 * Thuban/Model/map.py: Explicit imports.
6378
6379 * Thuban/Model/resource.py: Import _.
6380 (ProjFileSaver.write): write header using projfile.dtd.
6381
6382 * Thuban/Model/save.py: Explicit imports.
6383 (XMLWriter.encode): New. Encode the given string from a format
6384 used by Thuban into UTF-8. Fixes RTbug #1851.
6385
6386 * Thuban/UI/classgen.py: Explicit imports.
6387 (ClassGenDialog.__init__): Clean up the code and add support
6388 for Quantiles.
6389 (ClassGenDialog.OnOK): Add support for Quantiles.
6390 (GenQuantilesPanel): New. Input panel for Quantiles.
6391 (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
6392 GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
6393
6394 * Thuban/Model/classgen.py: New. Contains all the classes named above.
6395
6396 * Thuban/UI/classifier.py: Explicit imports.
6397 (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
6398 ClassTable.SetValueAsCustom): Reworked to use new Range class.
6399
6400 * Thuban/UI/legend.py: Explicit imports.
6401
6402 * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
6403 a Table menu and associated method calls.
6404 (MainWindow.choose_color): Removed. No longer needed.
6405
6406 * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
6407 should be disabled if no projection is selected in the available
6408 list.
6409
6410 * Thuban/UI/renderer.py: Explicit imports.
6411
6412 * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
6413 with correctly selecting the rows and issuing the right events.
6414 Be sure to call Skip() to allow the grid to do some of its own
6415 handling which allows the rows to actually be selected.
6416 (LayerTableGrid.select_shapes): Rename from select_shape. Supports
6417 selecting multiple shapes.
6418 (LayerTableFrame): Support for building Queries.
6419 (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
6420
6421 * Thuban/UI/tree.py: Explicit imports.
6422
6423 * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
6424 table view can call it.
6425
6426 * test/test_classification.py: Explicit imports.
6427 (TestClassification.test_ClassGroupRange): Fix test for new
6428 Range class.
6429
6430 * Doc/thuban.dtd: Add range parameter for clrange.
6431
6432 * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
6433 object in ClassGroupRange, and also uesd for inputting ranges in
6434 the classifer table and elsewhere.
6435
6436 * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
6437 yet.
6438
6439 2003-05-09 Frank Koormann <[email protected]>
6440
6441 * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
6442
6443 2003-05-08 Frank Koormann <[email protected]>
6444
6445 Coding style updates
6446
6447 * test/test_scalebar.py: Replaced tab indentation by spaces.
6448
6449 * Thuban/UI/scalebar.py: Explicit imports.
6450
6451 2003-05-08 Frank Koormann <[email protected]>
6452
6453 * Thuban/UI/scalebar.py
6454 (ScaleBar.DrawScalebar): Format string bug fixed.
6455
6456 2003-05-08 Frank Koormann <[email protected]>
6457
6458 Reorganization of scalebar component (no wx in Thuban/Model)
6459
6460 * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
6461 (deriveInterval):
6462 Calculate scalebar interval and unit which fits in width for scale.
6463 (roundInterval): Round float.
6464
6465 * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
6466
6467 * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
6468
6469 * Thuban/UI/legend.py: Import Thuban.UI.scalebar
6470
6471 2003-05-08 Frank Koormann <[email protected]>
6472
6473 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
6474 Initialize ScaleBar with canvas.map
6475
6476 * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
6477 round intervals to display smarter lengths
6478 (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
6479 layer. If the maps has no projection applied grey the scalebar.
6480
6481 2003-05-07 Frank Koormann <[email protected]>
6482
6483 Basic Scalebar features added.
6484
6485 * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
6486
6487 * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
6488 (ScaleBarBitmap): New, links the scalebar bitmap with view messages
6489 and the renderer.
6490
6491 * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
6492
6493 * Thuban/UI/messages.py: SCALE_CHANGED added.
6494
6495 2003-05-07 Bernhard Herzog <[email protected]>
6496
6497 * Thuban/Model/session.py (Session.__init__): New instance
6498 variable shapestores to hold a list of all open shapestore objects
6499 (Session.ShapeStores): New. Accessor method for the shapestores
6500 list.
6501 (Session._add_shapestore, Session._clean_weak_store_refs): New.
6502 Internal methods to maintain the shapestores list.
6503 (Session.Tables): New. Return all tables open in the session.
6504 (Session.OpenShapefile): Insert the new ShapeStore into the
6505 shapestores list.
6506
6507 * test/test_session.py (TestSessionSimple.test_initial_state): Add
6508 tests for ShapeStores and Tables
6509 (TestSessionWithContent.test_shape_stores)
6510 (TestSessionWithContent.test_tables): New. Test cases for
6511 ShapeStores and Tables
6512
6513 2003-05-07 Bernhard Herzog <[email protected]>
6514
6515 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
6516 Add comments about the optimizations used.
6517 (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
6518 Implement the ReadValue table interface method.
6519
6520 * test/test_transientdb.py
6521 (TestTransientTable.run_iceland_political_tests)
6522 (TestTransientTable.test_transient_joined_table): Add tests for
6523 ReadValue
6524
6525 2003-05-07 Frank Koormann <[email protected]>
6526
6527 * Resources/Bitmaps/fulllayerextent.xpm,
6528 Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
6529 new icons.
6530
6531 2003-05-06 Bernhard Herzog <[email protected]>
6532
6533 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
6534 New. Simply delegate to the transient table's version.
6535
6536 * test/test_transientdb.py
6537 (TestTransientTable.test_auto_transient_table_query): New. Test
6538 case for AutoTransientTable's SimpleQuery
6539
6540 2003-05-06 Bernhard Herzog <[email protected]>
6541
6542 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
6543 Implement a simple query method for the query dialog
6544 (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
6545 the row index or shapeid.
6546 (TransientTable.create): Insert the right value of the row index
6547 (TransientJoinedTable.create): Copy the row index of the left
6548 table to the joined result table
6549
6550 * test/test_transientdb.py
6551 (TestTransientTable.test_transient_table_read_twice): Fix
6552 doc-string
6553 (TestTransientTable.test_transient_table_query): New. Test for the
6554 SimpleQuery method
6555
6556 2003-05-06 Bernhard Herzog <[email protected]>
6557
6558 Convert all table users to use the new table interface. This only
6559 covers Thuban itself, not GREAT-ER or other applications built on
6560 Thuban yet, so the compatibility interface stays in place for the
6561 time being but it now issues DeprecationWarnings.
6562
6563 Finally, the new Table interface has a new method, HasColumn.
6564
6565 * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
6566 issue deprecation warnings when they're. The warnings refer to the
6567 caller of the method.
6568 (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
6569 for the deprecation warnings
6570
6571 * test/test_table.py: Ignore the deprecation warnings for the old
6572 table in the tests in this module. The purpose of the tests is to
6573 test the old interface, after all.
6574
6575 * test/test_transientdb.py
6576 (TestTransientTable.run_iceland_political_tests): Use the
6577 constants for the types. Add a test for HasColumn
6578 (TestTransientTable.test_transient_joined_table): Adapt to new
6579 table interface. Add a test for HasColumn
6580 (TestTransientTable.test_transient_table_read_twice): Adapt to new
6581 table interface
6582
6583 * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
6584 Adapt to new table interface
6585
6586 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
6587 new table interface
6588
6589 * Thuban/UI/controls.py (RecordListCtrl.fill_list)
6590 (RecordTable.SetTable): Adapt to new table interface
6591
6592 * Thuban/UI/classifier.py (Classifier.__init__)
6593 (Classifier.__init__): Adapt to new table interface
6594
6595 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
6596 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
6597 to new table interface
6598
6599 * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
6600 (AutoTransientTable.HasColumn): Implement the new table interface
6601 method
6602 (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
6603 (AutoTransientTable.UniqueValues): Adapt to new table interface
6604
6605 * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
6606 Adapt to new table interface
6607
6608 * test/test_layer.py (TestLayer.open_shapefile): Helper method to
6609 simplify opening shapefiles a bit easier.
6610 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
6611 (TestLayer.test_point_layer): Use the new helper method
6612 (TestLayer.test_get_field_type): New. Test for the GetFieldType
6613 method
6614
6615 * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
6616 the new table method
6617
6618 * test/test_memory_table.py (TestMemoryTable.test_has_column):
6619 Test for the new table method HasColumn
6620
6621 2003-05-06 Jonathan Coles <[email protected]>
6622
6623 Addresses the "Selection Extent" wish of RTbug #1787.
6624
6625 * Resources/Bitmaps/fulllayerextent.xpm,
6626 Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
6627 extent. These are just place holders for the real bitmaps.
6628
6629 * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
6630 calculate the bounding box once (the first time compute_bbox() is
6631 called).
6632 (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
6633 the bounding box for the shapes in lat/long coordinates.
6634
6635 * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
6636 option.
6637 (MainWindow.has_selected_shapes): New. Returns true if there are
6638 any selected shapes.
6639 (MainWindow.FullSelectionExtent): New. Calls
6640 MapCanvas.FitSelectedToWindow() when the user selects the menu option.
6641 (_has_selected_shapes): New. Returns true if there are any
6642 selected shapes.
6643
6644 * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
6645 true if there are any selected shapes.
6646
6647 * Thuban/UI/view.py (MapCanvas): Added delegated method
6648 HasSelectedShapes.
6649 (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
6650 shapes on the canvas using the map projection (if any).
6651
6652 * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
6653 for Layer.ShapesBoundingBox().
6654
6655 2003-05-06 Bernhard Herzog <[email protected]>
6656
6657 * Resources/Projections/defaults.proj: Fix spelling of Mercator
6658
6659 2003-05-05 Jonathan Coles <[email protected]>
6660
6661 Addresses the "Full Layer Extent" wish of RTbug #1787.
6662
6663 * Resources/Projections/defaults.proj: Added UK National Grid.
6664
6665 * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
6666 (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
6667 when the user selects the menu option.
6668
6669 * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
6670 scales the given layer on the canvas using the map projection.
6671
6672 2003-05-05 Bernhard Herzog <[email protected]>
6673
6674 Convert the table implementations to a new table interface. All
6675 tables use a common mixin class to provide backwards compatibility
6676 until all table users have been updated.
6677
6678 * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
6679 provide backwards compatibility for table classes implementing the
6680 new interface
6681 (DBFTable, MemoryTable): Implement the new table interface. Use
6682 OldTableInterfaceMixin as base for compatibility
6683 (DBFColumn, MemoryColumn): New. Column description for DBFTable
6684 and MemoryTable resp.
6685
6686 * test/test_dbf_table.py: New. Test cases for the DBFTable with
6687 the new table interface.
6688
6689 * test/test_memory_table.py: New. Test cases for the MemoryTable
6690 with the new table interface.
6691
6692 * test/test_table.py: Document the all tests in this file as only
6693 for backwards compatibility. The equivalent tests for the new
6694 interface are in test_memory_table.py and test_dbf_table.py
6695 (MemoryTableTest.test_read): field_info should be returning tuples
6696 with four items
6697 (MemoryTableTest.test_write): Make doc-string a more precise.
6698
6699 * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
6700 table interface. Derive from from OldTableInterfaceMixin for
6701 compatibility.
6702 (TransientTableBase.create): New intance variable column_map to
6703 map from names and indices to column objects
6704 (TransientTable.create): Use the new table interface of the input
6705 table
6706 (AutoTransientTable): Convert to new table interface. Derive from
6707 from OldTableInterfaceMixin for compatibility.
6708 (AutoTransientTable.write_record): Removed. It's not implemented
6709 yet and we still have to decide how to handle writing with the new
6710 table and data framework.
6711
6712 * test/test_transientdb.py
6713 (TestTransientTable.run_iceland_political_tests)
6714 (TestTransientTable.test_transient_joined_table): Use the new
6715 table interface
6716
6717 2003-05-05 Jonathan Coles <[email protected]>
6718
6719 This is namely a collection of UI updates to improve user interactivity.
6720 Tabbing between controls now exists and you can use ESC to close dialog
6721 boxes; ENTER will active the default button.
6722
6723 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
6724 order that the controls are created so that tabbing works correctly.
6725 (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
6726 wxDialog can handle the default button correctly.
6727 (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
6728 same reasons as for OnOK.
6729 (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
6730 when we ask the table for the maximum/minimum values of a field
6731 which could take a very long time.
6732
6733 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
6734 order that the controls are created so that tabbing works correctly.
6735 (SelectPropertiesDialog.__init__): Rearrange the order that the
6736 controls are created so that tabbing works correctly.
6737
6738 * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
6739 to derive from a wxDialog but behave like the original implementation
6740 which was derived from a wxFrame. wxDialog provides useful key
6741 handling functionality like ESC calling OnCancel and ENTER calling
6742 OnOK which is lost with wxFrame.
6743
6744 * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
6745 new dialogs.
6746
6747 * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
6748 order that the controls are created so that tabbing works correctly.
6749 (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
6750 (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
6751 (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
6752 (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
6753 can provide the "UK National Grid" as a default projection.
6754 (UTMPanel.__init__): Rearrange the order that the controls are
6755 created so that tabbing works correctly.
6756
6757 2003-05-05 Bernhard Herzog <[email protected]>
6758
6759 * extensions/thuban/wxproj.cpp: Fix some of the comments.
6760 (project_point): If a map projection but no layer projection is
6761 given, convert degrees to radians before applying the map
6762 projection.
6763
6764 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
6765 (TableGrid.allow_messages): New methods to make it possible to
6766 inhibit message sending.
6767 (TableGrid.issue): Only send the message if not inhibited.
6768 (LayerTableGrid.select_shape): Use the new methods to make sure
6769 that no ROW_SELECTED message is sent while we're updating the
6770 selected rows to match the selected shapes.
6771
6772 2003-05-02 Jan-Oliver Wagner <[email protected]>
6773
6774 Implementation of MemoryTable.
6775
6776 * Thuban/Model/table.py (MemoryTable): New. Quite simple table
6777 implementation that operates on a list of tuples. All of the data
6778 are kept in the memory.
6779
6780 * test/test_table.py (MemoryTableTest): New.
6781
6782 * test/test_transientdb.py (SimpleTable): Removed.
6783 (TestTransientTable.test_transient_joined_table,
6784 (TestTransientTable.test_transient_table_read_twice): Replaced
6785 SimpleTable by MemoryTable.
6786
6787 2003-04-30 Jonathan Coles <[email protected]>
6788
6789 * Data/iceland_sample.thuban: Now contains correct projections
6790 for each of the layers.
6791
6792 * Resources/Projections/defaults.proj: Geographic projection
6793 contains unit conversion parameter.
6794
6795 2003-04-30 Jonathan Coles <[email protected]>
6796
6797 The most important part of this putback is the projection changes.
6798 It should now be possible to specify the projection that a layer
6799 is in and then specify a different projection for the map. The
6800 projection dialog has an extra parameter for a geographic projection
6801 which lets the user select if the input is in degrees or radians.
6802
6803 * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
6804 to say that the parameter is a tuple of unprojected
6805 points (which is what the callers to this method were assuming).
6806 Also, since the points are unprojected we need to projected them.
6807
6808 * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
6809 LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
6810 groups are selected, move the layer up/down. Fixes RTbug #1833.
6811
6812 * Thuban/UI/mainwindow.py: Move menu item map_rename up.
6813
6814 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
6815 parameter in call to SetClientData.
6816 (GeoPanel): Add support for selecting the units that the
6817 source data is in (Radians or Degrees).
6818
6819 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
6820 the rendering loop by reducing the number of if's, removing the
6821 unnecessary try/except block, and checking if the old group
6822 is the same as the new one (which happens a lot if there is
6823 no classification, or lots of shapes are in the same group).
6824
6825 * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
6826 around the redraw routine to try to catch problems that the user
6827 may create by selecting invalid projections for the data set and
6828 map. Clears the display if there are any problems and prints the
6829 error.
6830 (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
6831 rectangle.
6832
6833 * extensions/thuban/wxproj.cpp (project_point): First invert the
6834 supplied point (which should be in projected coordinates) using
6835 the layer's projection and then project the point using the
6836 map's projection.
6837 (project_points): Use project_point() to project each point.
6838
6839 2003-04-30 Jan-Oliver Wagner <[email protected]>
6840
6841 * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
6842 don't set the Classification to None if the classfication field
6843 is None (ie only a DEFAULT).
6844
6845 2003-04-30 Bernhard Herzog <[email protected]>
6846
6847 * Thuban/UI/view.py: Fix some typos.
6848
6849 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
6850 not pop up the dialog if the selection becomes empty (this could
6851 happen if e.g. a new selection is opened while the identify tool
6852 is active and dialog had been closed)
6853
6854 2003-04-30 Bernhard Herzog <[email protected]>
6855
6856 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
6857 instance variable read_record_last_result
6858 (TransientTableBase.read_record): Make sure reading the same
6859 record twice works. The implementation uses the new instance
6860 variable read_record_last_result
6861
6862 * test/test_transientdb.py
6863 (TestTransientTable.test_transient_table_read_twice): New test
6864 case for the above bug-fix.
6865
6866 2003-04-29 Jonathan Coles <[email protected]>
6867
6868 * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
6869
6870 * Thuban/UI/classgen.py: Remove all uses of Str2Num.
6871
6872 * Thuban/UI/classifier.py: Remove all uses of Str2Num.
6873 (ClassTable.SetValueAsCustom): Rename keyword argument in
6874 ClassGroup* constructors to match argument name.
6875
6876 2003-04-29 Bernhard Herzog <[email protected]>
6877
6878 * Thuban/Model/session.py (Session.Destroy): Explicitly close the
6879 transient DB if it exists to make sure it doesn't leave a journal
6880 file in the temp directory.
6881
6882 * Thuban/Model/transientdb.py (TransientDatabase.close): Set
6883 self.conn to None after closing the connection to make sure it's
6884 not closed twice
6885
6886 2003-04-29 Jonathan Coles <[email protected]>
6887
6888 Add a visible parameter in the layer XML tag. The default value is
6889 "true". If anything other than "false" is specified we also assume
6890 "true". Addresses RTbug #1025.
6891
6892 * Doc/thuban.dtd: Add visible parameter to a layer.
6893
6894 * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
6895 of visible from 1 to True.
6896 (Layer.__init__): Change default value of visible from 1 to True.
6897
6898 * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
6899 parameter.
6900
6901 * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
6902 parameter.
6903
6904 * test/test_load.py: Add new test data contents_test_visible.
6905 (LoadSessionTest.setUp): save test data.
6906 (LoadSessionTest.testLayerVisibility): Test if the visible flag
6907 is loaded correctly.
6908
6909 * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
6910 for saving an invisible layer.
6911
6912 2003-04-29 Jonathan Coles <[email protected]>
6913
6914 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
6915 legend dialog box and tell it to change its map to the one
6916 supplied to SetMap(). Fixes RTbug #1770.
6917
6918 2003-04-29 Bernhard Herzog <[email protected]>
6919
6920 Next step of table implementation. Introduce a transient database
6921 using SQLite that some of the data is copied to on demand. This
6922 allows us to do joins and other operations that require an index
6923 for good performance with reasonable efficiency. Thuban now needs
6924 SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
6925 haven't tested that.
6926
6927 * Thuban/Model/transientdb.py: New. Transient database
6928 implementation.
6929
6930 * test/test_transientdb.py: New. Tests for the transient DB
6931 classes.
6932
6933 * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
6934 classes to help automatically remove temporary files and
6935 directories.
6936 (Session.__init__): New instance variables temp_dir for the
6937 temporary directory and transient_db for the SQLite database
6938 (Session.temp_directory): New. Create a temporary directory if not
6939 yet done and return its name. Use AutoRemoveDir to have it
6940 automatically deleted
6941 (Session.TransientDB): Instantiate the transient database if not
6942 done yet and return it.
6943
6944 * Thuban/Model/data.py (ShapefileStore.__init__): Use an
6945 AutoTransientTable so that data is copied to the transient DB on
6946 demand.
6947 (SimpleStore): New class that simply combines a table and a
6948 shapefile
6949
6950 * Thuban/Model/table.py (Table, DBFTable): Rename Table into
6951 DBFTable and update its doc-string to reflect the fact that this
6952 is only the table interface to a DBF file. Table is now an alias
6953 for DBFTable for temporary backwards compatibility.
6954
6955 * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
6956 the last reference to the session goes away so that the temporary
6957 files are removed properly.
6958
6959 * test/test_load.py (LoadSessionTest.tearDown): Remove the
6960 reference to the session to make sure the temporary files are
6961 removed.
6962
6963 2003-04-29 Bernhard Herzog <[email protected]>
6964
6965 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
6966 the __parser instance variable into a normal local variable in
6967 read. It's only used there and read will never be called more than
6968 once. Plus it introduces a reference cycle that keeps can keep the
6969 session object alive for a long time.
6970
6971 2003-04-29 Jonathan Coles <[email protected]>
6972
6973 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
6974 Projection an immutable item. Fixes RTbug #1825.
6975 (Projection.__init__): Initialize instance variables here.
6976 (ProjFile.Replace): New. Replace the given projection object with
6977 the new projection object. This solves the problem of needing the
6978 mutator Projection.SetProjection() in the ProjFrame class and
6979 allows a projection to change parameters without changing its
6980 location in the file.
6981
6982 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
6983 be of type wxSAVE and should verify overwriting a file.
6984
6985 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
6986 ProjFile.Replace() method instead of the mutator
6987 Projection.SetProjection(). Also requires that we reassign the
6988 client data to the new projection.
6989
6990 * test/test_proj.py (TestProjection.test): Test GetName() and
6991 GetAllParameters()
6992 (TestProjFile.test): Remove tests for Set*() methods. Add tests
6993 for Replace().
6994
6995 2003-04-25 Jonathan Coles <[email protected]>
6996
6997 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
6998 to save the name of the projection.
6999
7000 * test/test_save.py (SaveSessionTest.testLayerProjection): New
7001 test to verify layer projections are saved correctly.
7002
7003 2003-04-25 Jonathan Coles <[email protected]>
7004
7005 * Thuban/Model/proj.py (Projection.SetName): Set the name
7006 to "Unknown" if name is None.
7007 (Projection.SetAllParameters): New. Set the projection's
7008 parameter list to the one supplied.
7009 (Projection.SetProjection): New. Set the projection's
7010 properties to those of the supplied Projection.
7011
7012 * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
7013 the dialog title to include the map's title.
7014 (MainWindow.LayerProjection): Set the dialog title to include
7015 the layer's title.
7016
7017 * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
7018 error dialogs into a single method call.
7019 (ProjFrame.__VerifyButtons): Add more states to check.
7020 (ProjFrame.__GetProjection): Return the current state of an
7021 edited projection or None.
7022 (ProjFrame.__FillAvailList): Remove checks for states that
7023 shouldn't exist.
7024 (ProjFrame._OnNew): Clear all selected items and supply
7025 a projection panel if necessary.
7026
7027 * test/test_proj.py (TestProjFile.test): Add tests for
7028 ProjFile.SetAllParameters, ProjFile.SetProjection,
7029 ProjFile.SetName.
7030
7031 2003-04-25 Jonathan Coles <[email protected]>
7032
7033 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
7034 takes an optional argument to select the current projection.
7035 This does not guarantee that the item is visible due to
7036 limited wxWindows functionality. Fixes RTBug #1821.
7037
7038 2003-04-25 Jonathan Coles <[email protected]>
7039
7040 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
7041 the projection name and use it when constructing the Projection
7042 object.
7043
7044 * Thuban/Model/proj.py (Projection.__init__): Change the default
7045 value for 'name' to None and then test if name is equal to None
7046 in the body of the constructor. This way the caller doesn't have to
7047 know what the default value should be. Namely, useful in load.py
7048 where we have to pick a default value if the 'name' parameter
7049 doesn't exist in the XML file.
7050
7051 * test/test_load.py (LoadSessionTest.testLayerProjection): New.
7052 Tests a file where a layer has a projection.
7053
7054 2003-04-25 Jonathan Coles <[email protected]>
7055
7056 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
7057 tree for projection information.
7058
7059 * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
7060 XMLReader.GetFileName.
7061 (SessionLoader): Added support for loading projection tags that
7062 appear inside a layer.
7063
7064 * Thuban/Model/proj.py (ProjFile): Document the class. Move
7065 back to using a list because the order of the projections in
7066 the file is important to maintain. Fixes RTbug #1817.
7067
7068 * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
7069 to ProjFile.GetFilename.
7070
7071 * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
7072 information.
7073
7074 * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
7075 ProjFrame._OnSaveAs. Removed old dead code from previous
7076 implementation.
7077 (ProjFrame._OnExport): Add support for exporting more than one
7078 projection to a single file.
7079 (ProjFrame.__FillAvailList): use string formatting (% operator)
7080 to build strings that are (partly) translated. Fixes RTbug #1818.
7081
7082 * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
7083 class.
7084
7085 2003-04-24 Bernhard Herzog <[email protected]>
7086
7087 * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
7088
7089 * po/fr.po: New. French translation by Daniel Calvelo Aros
7090
7091 * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
7092 empty strings.
7093
7094 2003-04-24 Jonathan Coles <[email protected]>
7095
7096 * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
7097 implement the interface that the ProjFrame dialog expects.
7098
7099 * Thuban/Model/proj.py (Projection.SetName): New. Allows the
7100 name of the projection to be changed.
7101 (ProjFile): Use a dictionary instead of a list so that removing
7102 projections is easier and we are sure about uniqueness.
7103 (ProjFile.Remove): Remove the given projection object.
7104
7105 * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
7106 Return a list with only one projection file instead of searching for
7107 any projection file. This simplifies many things if the user can
7108 only have one system file and one user file.
7109
7110 * Thuban/UI/classgen.py: Change all references to
7111 genCombo to genChoice.
7112
7113 * Thuban/UI/mainwindow.py: Add a Projection option under the
7114 layer menu.
7115 (MainWindow.LayerProjection): New. Open up a projection window
7116 for a layer.
7117
7118 * Thuban/UI/projdialog.py: Large changes to how the dialog is
7119 laid out. Use three panels instead of one. One for the list of
7120 projections, one for the edit controls, and one for the buttons.
7121 Fixed resizing problems so that the dialog resizes correctly
7122 when the projection panel changes. Added import/export, save, and
7123 new buttons/functionality.
7124
7125 2003-04-24 Bernhard Herzog <[email protected]>
7126
7127 First step towards table management. Introduce a simple data
7128 abstraction so that we replace the data a layer uses more easily
7129 in the next step.
7130
7131 * Thuban/Model/data.py: New file with a simple data abstraction
7132 that bundles shapefile and dbffile into one object.
7133
7134 * Thuban/Model/session.py (Session.OpenShapefile): New method to
7135 open shapefiles and return a shape store object
7136
7137 * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
7138 object instead of a shapefile filename. This introduces a new
7139 instance variable store holding the datastore. For intermediate
7140 backwards compatibility keep the old instance variables.
7141 (open_shapefile): Removed. No longer needed with the shape store.
7142 (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
7143 get the shape store used by a layer.
7144 (Layer.Destroy): No need to explicitly destroy the shapefile or
7145 table anymore.
7146
7147 * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
7148 (MainWindow.AddLayer): Use the session's OpenShapefile method to
7149 open shapefiles
7150
7151 * Thuban/Model/load.py (ProcessSession.start_layer): Use the
7152 session's OpenShapefile method to open shapefiles
7153
7154 * test/test_classification.py
7155 (TestClassification.test_classification): Use the session's
7156 OpenShapefile method to open shapefiles and build the filename in
7157 a more platform independed way
7158
7159 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
7160 Implement to have a session to use in the tests
7161 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
7162 (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
7163 session's OpenShapefile method to open shapefiles
7164 (TestLayerLegend.setUp): Instantiate a session so that we can use
7165 it to open shapefiles.
7166 (TestLayerLegend.tearDown): Make sure that all references to
7167 layers and session are removed otherwise we may get a resource
7168 leak
7169
7170 * test/test_map.py (TestMapAddLayer.test_add_layer)
7171 (TestMapWithContents.setUp): Instantiate a session so that we can
7172 use it to open shapefiles.
7173 (TestMapWithContents.tearDown): Make sure that all references to
7174 layers, maps and sessions are removed otherwise we may get a
7175 resource leak
7176 ("__main__"): use support.run_tests() so that more info about
7177 uncollected garbage is printed
7178
7179 * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
7180 session's OpenShapefile method to open shapefiles
7181 ("__main__"): use support.run_tests() so that more info about
7182 uncollected garbage is printed
7183
7184 * test/test_selection.py (TestSelection.tearDown): Make sure that
7185 all references to the session and the selection are removed
7186 otherwise we may get a resource leak
7187 (TestSelection.get_layer): Instantiate a session so that we can
7188 use it to open shapefiles.
7189 ("__main__"): use support.run_tests() so that more info about
7190 uncollected garbage is printed
7191
7192 * test/test_session.py (TestSessionBase.tearDown)
7193 (TestSessionWithContent.tearDown): Make sure that all references
7194 to the session and layers are removed otherwise we may get a
7195 resource leak
7196 (TestSessionWithContent.setUp): Use the session's OpenShapefile
7197 method to open shapefiles
7198
7199 2003-04-24 Jonathan Coles <[email protected]>
7200
7201 * Thuban/Model/load.py (XMLReader.read): Should have been checking
7202 if the file_or_filename object had the 'read' attribute.
7203
7204 2003-04-23 Jonathan Coles <[email protected]>
7205
7206 * Thuban/Model/resource.py: Fixes RTbug #1813.
7207 (ReadProjFile): Add documentation about which exceptions are raised.
7208 Always pass the exceptions up to the caller.
7209 (GetProjFiles): If the directory can't be read return an empty list.
7210 If any of the proj files can't be read skip that file and go
7211 on to the next one.
7212
7213 * test/test_proj.py: Added test cases to handle nonexistent files,
7214 unreadable files, and files that don't parse correctly.
7215
7216 2003-04-23 Jonathan Coles <[email protected]>
7217
7218 Projection dialog. Allows the user to select from a list
7219 of projection templates and optionally edit them and save new ones.
7220
7221 * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
7222 (ProjPanel): Base class for projection specific panels.
7223 (TMPanel): Projection panel for Transverse Mercartor.
7224 (UTMPanel): Projection panel for Universal Transverse Mercartor.
7225 (LCCPanel): Projection panel for Lambert Conic Conformal.
7226 (GeoPanel): Projetion panel for Geographic Projection.
7227
7228 2003-04-23 Jonathan Coles <[email protected]>
7229
7230 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
7231 promote symmetry. There now exists XMLReader and XMLWriter.
7232 (XMLReader.read): New. Call to read the given file descriptor or
7233 filename.
7234 (XMLReader.close): New. Make sure the file is closed.
7235 (XMLReader.GetFileName): New. Return just the file name that is being
7236 read from.
7237 (XMLReader.GetDirectory): New. Return just the directory of the file
7238 that is being read.
7239 (XMLReader.AddDispatchers): New. Take a dictionary which contains
7240 the names of functions to call as the XML tree is parsed.
7241 (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
7242 (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
7243 (SessionLoader): Removed class variables start_dispatcher and
7244 end_dispatcher since this functionality is now part of a class
7245 instance. Fixes RTbug #1808.
7246 (SessionLoader.__init__): Add dispatcher functions.
7247 (load_xmlfile): Code was moved into the XMLReader.read().
7248 (load_session): Use modified SessionLoader.
7249
7250 * Thuban/Model/map.py (Map.GetProjection): New. Returns the
7251 map's projection.
7252
7253 * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
7254 GetAllParameters.
7255 (Projection.GetParameter): Returns the value for the given parameter.
7256
7257 * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
7258 (GetProjFiles): Renamed from GetProjections. Now returns a list
7259 of ProjFile objects.
7260 (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
7261 a list of ProjFile objects whose files are not user defined.
7262 (GetUserProjFiles): Renamed from GetUserProjections. Returns a
7263 list of ProjFile objects whose files are user defined.
7264 (ProjFileReader): Extend new XMLReader.
7265
7266 * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
7267 promote symmetry.
7268
7269 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
7270 control instead of a wxComboBox. wxChoice controls do not generate
7271 events as the uses highlights possible choices which fixes problems
7272 with resizing the dialog when the use selects an option.
7273
7274 * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
7275 control instead of a wxComboBox.
7276
7277 * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
7278 dialog.
7279
7280 * test/test_proj.py (TestProjection.test): New tests for GetParameter
7281 method.
7282
7283 2003-04-22 Bernhard Herzog <[email protected]>
7284
7285 * Thuban/UI/mainwindow.py: Remove some unused imports and global
7286 constants
7287
7288 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
7289 (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
7290
7291 2003-04-17 Bernhard Herzog <[email protected]>
7292
7293 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
7294 (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
7295 anymore.
7296 (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
7297 (Layer.ShapeType, Layer.Shape): No need to call
7298 self.open_shapefile since it's always called in __init__
7299
7300 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
7301 In wxPython 2.4 there's no need to extend MainLoop anymore since
7302 wxPython itself makes sure OnExit is called.
7303
7304 2003-04-16 Jonathan Coles <[email protected]>
7305
7306 Initial putback of projection management code. Includes new
7307 classes to read and write projection files. The current load
7308 and save classes were abstracted a bit so they could be reused.
7309 The Projection class was extended to provide new methods and
7310 have a name.
7311
7312 * Thuban/Model/load.py (XMLProcessor): New. Contains all the
7313 general XML reading methods that were part of ProcessSession.
7314
7315 * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
7316 name.
7317 (ProjFile): New. Represents a file that contains projection
7318 information.
7319
7320 * Thuban/Model/resource.py: New. Contains general utilities
7321 for read and writing projection files.
7322
7323 * Thuban/Model/save.py (XMLSaver): New. Contains all the
7324 general XML writing methods that were part of SessionSaver.
7325 (SessionSaver): Renamed from Saver.
7326
7327 * test/test_proj.py: New test cases for the projection
7328 file read and write functions.
7329
7330 2003-04-16 Jonathan Coles <[email protected]>
7331
7332 * Thuban/Model/classification.py: Use repr() around values
7333 in the ClassGroup*.__repr__() methods so it is clearer when
7334 a value is a string and when it is a number.
7335
7336 * test/test_load.py: Rework the classification test to test
7337 that we can load old files.
7338 (testLabels): Test a file where the groups have labels.
7339
7340 2003-04-16 Bernhard Herzog <[email protected]>
7341
7342 Safer implementation of the performance enhancements of the
7343 low-level renderer:
7344
7345 * extensions/thuban/wxproj.cpp (extract_projection)
7346 (extract_pointer): Rename extract_projection to extract_pointer
7347 and redefine its purpose to return the pointer stored in a CObject
7348 returned by the object's cobject method. Update all callers.
7349 (s_draw_info, free_draw_info, draw_polygon_init): Implement the
7350 handling of these low-level parameters so that each s_draw_info
7351 instance is handled as a CObject at python level that also
7352 contains real references to the actual python objects which
7353 contain the values in the struct. Add free_draw_info as the
7354 destructor.
7355 (draw_polygon_shape): Add the py_draw_info parameter which must a
7356 cobject containing an s_draw_info pointer.
7357
7358 * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
7359 method to instantiat the low-level render parameter
7360 (MapRenderer.draw_shape_layer): Use the new method. Remove some
7361 commented out code.
7362 (MapRenderer.draw_polygon_shape): Make the first parameter not the
7363 layer but the low-level render parameter
7364 (ScreenRenderer.draw_shape_layer): Use the low-level render
7365 parameter.
7366
7367 2003-04-15 Jonathan Coles <[email protected]>
7368
7369 * Thuban/Model/classification.py: Implemented __repr__ for
7370 the ClassGroup* classes to make debugging a bit easier.
7371 (ClassGroup.SetLabel): Check that the string is an instance
7372 of StringTypes not StringType. Accounts for Unicode strings.
7373
7374 * Thuban/Model/color.py: Implemented __repr__ to make
7375 debugging a bit easier.
7376
7377 * Thuban/Model/save.py (Saver.write_classification): Need to
7378 save the group label.
7379
7380 * test/test_load.py (testClassification): New. Loads the
7381 iceland_sample_test.thuban file and checks if it was loaded
7382 correctly.
7383
7384 2003-04-15 Jonathan Coles <[email protected]>
7385
7386 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
7387 to improve rendering performance by initializing the variables
7388 that are not change each time draw_polygon_shape() is called.
7389 The values are stored in a global struct draw_info.
7390 (draw_polygon_shape): Removed initialization code that is
7391 now in draw_polygon_init().
7392
7393 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
7394 drawing initialization call to draw_polygon_init()
7395 (MapRenderer.draw_polygon_shape): Use new signature of
7396 draw_polygon_shape.
7397
7398 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
7399 weirdness by setting the range to (1, maxint).
7400
7401 * Thuban/Model/classification.py (ClassGroupProperties): Make
7402 instance variables private and optimize comparison operator
7403 by first checking if the color references are the same.
7404 (ClassGroupSingleton): Make instance variables private.
7405 (ClassGroupRange): Make instance variables private.
7406
7407 * HOWTO-Release: Filled in missing steps for releasing packages.
7408
7409 2003-04-15 Bernhard Herzog <[email protected]>
7410
7411 First stab at internationalized messages:
7412
7413 * Thuban/__init__.py (_): Implement the translation function for
7414 real using the python gettext module.
7415
7416 * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
7417 translate empty strings.
7418
7419 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7420 Add a missing space to a warning message
7421
7422 * po/README: New. Notes about the management of the translation
7423 files.
7424
7425 * po/Makefile: New. Makefile to help manage the translation files.
7426
7427 * po/es.po: New. Spanish translation by Daniel Calvelo Aros
7428
7429 * MANIFEST.in: Include the *.mo files in Resources/Locale and the
7430 translations and support files in po/
7431
7432 * setup.py (data_files): Add the *.mo files to the data_files too
7433
7434 * README: Add note about the translations when building from CVS
7435
7436 2003-04-14 Jonathan Coles <[email protected]>
7437
7438 * Thuban/UI/dock.py: Fixes some window resizing problems most
7439 noticable under windows. Always assume the button bitmaps will
7440 be there. Code clean up.
7441 (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
7442 images for the dock/undock button to the same images.
7443 Work around for RTbug #1801.
7444
7445 * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
7446 be allowed to grow within the sizer. Fixes a bug under Windows
7447 where the toolbar wasn't being drawn.
7448
7449 2003-04-14 Frank Koormann <[email protected]>
7450
7451 * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
7452 Updated design to try to make the button functionality more
7453 transparent.
7454
7455 2003-04-14 Jonathan Coles <[email protected]>
7456
7457 * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
7458 finalize the intialization of the panel.
7459
7460 * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
7461 creation of the panel. Should be the last thing called in the
7462 initializer of a subclass.
7463
7464 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
7465 set the current selections in the combo boxes. This is needed
7466 under Windows.
7467
7468 * Thuban/UI/classifier.py (Classifier.__init__): Add a top
7469 level panel to the dialog so that the background colors are
7470 consistent under Windows.
7471
7472 2003-04-11 Jonathan Coles <[email protected]>
7473
7474 * Thuban/UI/classgen.py: Change color ramps to start at white
7475 not black.
7476
7477 * Thuban/UI/legend.py: Enable/disable the legend buttons when
7478 the legend changes. Fixes RTbug #1793.
7479
7480 * test/test_classification.py: Added test for copying of
7481 classifications.
7482
7483 2003-04-11 Jonathan Coles <[email protected]>
7484
7485 * Thuban/UI/resource.py: New. Centralize the loading of resources
7486 such as bitmaps.
7487
7488 * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
7489 added images to the move buttons, added 'reverse' button.
7490 (CustomRampPanel.__init__): Added images to the move buttons.
7491 (GreyRamp): New. Generates a ramp from white to black.
7492 (HotToColdRamp): New. Generates a ramp from cold to hot colors.
7493
7494 * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
7495 ID_PROPERTY_*.
7496 (Classifier.__init__): Minor changes to the layout.
7497 (Classifier._OnTitleChanged): Listen for when the user edits the
7498 title and update the dialog's title and the layer's title.
7499
7500 * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
7501
7502 * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
7503 (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
7504 if the layer's title changes.
7505
7506 * Thuban/UI/mainwindow.py: Added new menu item and associated code
7507 to open a dialog to rename the map.
7508 (MainWindow): Use new resource class to import bitmaps.
7509
7510 2003-04-11 Jonathan Coles <[email protected]>
7511
7512 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
7513 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
7514 Resources/Bitmaps/group_use_none.xpm,
7515 Resources/Bitmaps/group_use_not.xpm,
7516 Resources/Bitmaps/hide_layer.xpm,
7517 Resources/Bitmaps/layer_properties.xpm,
7518 Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
7519 Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
7520 New.
7521
7522 2003-04-10 Jonathan Coles <[email protected]>
7523
7524 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
7525 Should pass group to ClassGroup constructor.
7526
7527 2003-04-10 Jonathan Coles <[email protected]>
7528
7529 * Thuban/Model/classification.py: (ClassGroup): Move all the common
7530 methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
7531 here. Implement SetVisible(), IsVisible().
7532 (ClassGroup.__init__): Add group parameter which acts as a copy
7533 constructor.
7534
7535 * Thuban/UI/classifier.py (ClassTable): Add a new column for the
7536 "Visible" check boxes.
7537 (Classifier): Rename the buttons and refactor the code to match
7538 the new labels.
7539
7540 * Thuban/UI/legend.py: Classify button is now called "Properties".
7541 Refactored the code to change variable names.
7542 (LegendTree.__FillTreeLayer): Only list a group if it is visible.
7543
7544 * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
7545 MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
7546 renamed to MainWindow.LayerEditProperties.
7547 (MainWindow.ToggleLegend): Don't include map name in legend title.
7548 (MainWindow.SetMap): Added the map name to the window title.
7549 (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
7550 MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
7551 Functionality is found in the layer properties dialog.
7552
7553 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
7554 draw visible groups.
7555
7556 2003-04-09 Jonathan Coles <[email protected]>
7557
7558 * Thuban/UI/classgen.py: Modifications to allow simple
7559 addition and selection of new color schemes.
7560 (MonochromaticRamp): New. Generates a ramp between two colors.
7561 (RedRamp): New. Generates a ramp of all red.
7562 (GreenRamp): New. Generates a ramp of all green.
7563 (BlueRamp): New. Generates a ramp of all blue.
7564
7565 2003-04-09 Jonathan Coles <[email protected]>
7566
7567 * Thuban/Model/classification.py (Classification.__deepcopy__):
7568 Need to copy over field and fieldType attributes.
7569
7570 * Thuban/Model/table.py (Table.field_range): New. Retrive the
7571 maximum and minimum values over the entire table for a given
7572 field.
7573 (Table.GetUniqueValues): New. Retrieve all the unique values
7574 in the table for a given field.
7575
7576 * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
7577 (GenUniquePanel): New. Controls to allow the user to select
7578 which unique field values they would like in the classification.
7579 (CustomRampPanel): Code that was in ClassGenDialog that allows
7580 the user to select the properties for a custom ramp.
7581 (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
7582
7583 * Thuban/UI/classifier.py: Removed a lot of debugging code.
7584 (Classifier._SetClassification): Callback method so that the
7585 class generator can set the classification in the grid.
7586 (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
7587 editing of a group properties class into a wxWindows control.
7588
7589 * Thuban/UI/dock.py: It was decided that if the user closes
7590 a dockable window the window should simply hide itself. That
7591 way if the user wants to show the dock again it appears in the
7592 same place as it was when it was closed.
7593 (DockableWindow.Destroy): Call renamed method OnDockDestroy().
7594 (DockableWindow._OnButtonClose): Hide the window instead of
7595 destroying it.
7596 (DockableWindow._OnClose): Hide the window instead of
7597 destroying it.
7598
7599 * Thuban/UI/legend.py (LegendTree): Use a private method to
7600 consistently set the font and style of the text. Fixes RTbug #1786.
7601
7602 * Thuban/UI/mainwindow.py: Import just the Classifier class.
7603
7604 2003-04-07 Bernhard Herzog <[email protected]>
7605
7606 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
7607 to the map module
7608
7609 2003-04-07 Bernhard Herzog <[email protected]>
7610
7611 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
7612 favor of ToggleSessionTree
7613 (MainWindow.ToggleSessionTree): New method to toggle visibility of
7614 the session tree.
7615 (MainWindow.SessionTreeShown): New method to return whether the
7616 session tree is currently shown.
7617 (MainWindow.ToggleLegend): New method to toggle visibility of the
7618 legend
7619 (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
7620 LegendShown
7621 (MainWindow.LegendShown): New method to return whether the legend
7622 is currently shown.
7623 (_method_command): Add checked parameter so we can define check
7624 menu items
7625 (_has_tree_window_shown, _has_legend_shown): Use the appropriate
7626 mainwindow methods.
7627 (show_session_tree, show_legend commands): Removed.
7628 (toggle_session_tree, toggle_legend commands): New commands to
7629 toggle the visibility of the dialogs
7630
7631 2003-04-07 Jonathan Coles <[email protected]>
7632
7633 * Thuban/UI/classgen.py: Fix Windows problem.
7634
7635 * Thuban/UI/dock.py: Fix Windows problem.
7636
7637 * Thuban/UI/mainwindow.py: Use False instead of false.
7638 (MainWindow.ShowLegend): Remove unnecessary switch parameter.
7639
7640 2003-04-07 Jonathan Coles <[email protected]>
7641
7642 Since we now say that the order of the groups in a classification
7643 matters, it makes sense to be able to manipulate that order. Most
7644 of the changes to Thuban/Model/classification.py are to that end.
7645
7646 * Thuban/Model/classification.py (Classification.AppendGroup,
7647 Classification.InsertGroup, Classification.ReplaceGroup,
7648 Classification.RemoveGroup, Classification.GetGroup): Do as the
7649 names imply.
7650 (Classification.FindGroup): This was called GetGroup, but GetGroup
7651 takes an index, while FindGroup takes a value.
7652 (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
7653 REFERENCE. Currently there is a cyclic reference between the layer
7654 and its classification. If the classification doesn't need to know
7655 its owning layer we can change this, since it may make sense to be
7656 able to use the same classification with different layers.
7657
7658 * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
7659
7660 * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
7661 not AddGroup()
7662
7663 * Thuban/UI/classifier.py: Now that we can depend on the order in
7664 a Classification and have methods to manipulate that order we don't
7665 need to use our own data structures in the grid. We can simply make
7666 the grid/table access the information they need from a copy of
7667 the classification object.
7668 (Classifier._OnCloseBtn): Event handler for when the user clicks
7669 'Close'. This is needed so if the user applies changes and then
7670 continues to change the table the user has the option of discarding
7671 the most recent changes and keeping what they applied.
7672
7673 * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
7674 into the same group.
7675
7676 * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
7677 with a really old version of proj, PJ_VERSION won't even be defined.
7678 If it isn't defined then just compile so that the function always
7679 returns Py_False.
7680
7681 * test/test_classification.py: Fix tests to use the renamed methods.
7682 Still need to write tests for the new methods.
7683
7684 2003-04-04 Jonathan Coles <[email protected]>
7685
7686 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
7687 call to SetSelection out of the method and before the call
7688 to __SelectField in __init__. This prevents a recursion of events
7689 when _OnFieldSelect is triggered by the user.
7690
7691 2003-04-04 Jonathan Coles <[email protected]>
7692
7693 * Thuban/Model/classification.py: Rename Color.None to
7694 Color.Transparent.
7695 (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
7696 Don't bother copying the color, since Colors are immutable.
7697
7698 * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
7699 Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
7700 Thuban/UI/renderer.py, Thuban/UI/view.py:
7701 Rename Color.None to Color.Transparent.
7702
7703 * test/test_classification.py, test/test_load.py: Rename Color.None
7704 to Color.Transparent.
7705
7706 2003-04-04 Jonathan Coles <[email protected]>
7707
7708 * Thuban/Model/classification.py: Fix assert calls.
7709 (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
7710 Copy the color parameter rather than hold onto a reference.
7711
7712 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
7713 the color object.
7714 (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
7715 are sure there exists only one refernce to Color.None in the system.
7716 This allows us to use 'is' rather than the comparision functions.
7717
7718 * Thuban/Model/save.py: Fix assert calls.
7719
7720 * Thuban/UI/classifier.py: Fix assert calls.
7721 (ClassGrid._OnCellDClick): Call up to the classifier to open the
7722 dialog to edit the groups properties.
7723 (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
7724 correctly if a cell is resized.
7725 (ClassTable.SetClassification): New. Changes the classification
7726 that is in the table.
7727 (ClassTable.__SetRow): Allow groups to be prepended.
7728 (Classifier): New code for opening the EditProperties and
7729 GenerateRanges dialogs.
7730 (SelectPropertiesDialog.__GetColor): Only set the color in the
7731 color dialog if the current color is not None.
7732
7733 * Thuban/UI/dock.py: Fix assert calls.
7734
7735 * Thuban/UI/legend.py: Fix assert calls.
7736
7737 * Thuban/UI/renderer.py: Fix assert calls.
7738
7739 * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
7740 classifications.
7741 (GenRangePanel): Panel specific to range generation.
7742 (GenSingletonPanel): Panel specific to singleton generation.
7743 (ClassGenerator): Class responsible for actually generating
7744 the classification from the data gathered in the dialog box.
7745 (PropertyRamp): Generates properties whose values range from
7746 a starting property to an ending property.
7747
7748 2003-04-03 Bernhard Herzog <[email protected]>
7749
7750 * test/support.py (print_garbage_information): New function that
7751 prints information about still connected messages and memory
7752 leaks.
7753 (run_suite): Removed.
7754 (run_tests): New function for use as a replacement of
7755 unittest.main in the test_* files. This one calls
7756 print_garbage_information at the end.
7757
7758 * test/runtests.py (main): Use support.print_garbage_information
7759
7760 * test/test_layer.py: Use support.run_tests instead of
7761 unittest.main so we get memory leak information
7762 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
7763 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
7764 (TestLayerLegend.test_visibility): Call the layer's Destroy method
7765 to fix a memory leak.
7766
7767 * test/test_classification.py: Use support.run_tests instead of
7768 unittest.main so we get memory leak information
7769 (TestClassification.test_classification): Call the layer's Destroy
7770 method to fix a memory leak.
7771
7772 2003-04-02 Bernhard Herzog <[email protected]>
7773
7774 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
7775 Handle the reference counts of the return value and errors in
7776 PyArg_ParseTuple correctly.
7777
7778 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
7779 sure the filename is absolute to avoid problems when saving the
7780 session again
7781
7782 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
7783
7784 2003-04-01 Jonathan Coles <[email protected]>
7785
7786 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
7787 that there actually are points in the returned list of points
7788 before trying to index into the list. The list may be empty if
7789 the shape is a Null Shape.
7790
7791 2003-04-01 Bernhard Herzog <[email protected]>
7792
7793 * test/test_map.py: Don't use from <module> import *
7794
7795 2003-04-01 Jonathan Coles <[email protected]>
7796
7797 * Thuban/Model/session.py: Use LAYER_CHANGED instead of
7798 LAYER_LEGEND_CHANGED
7799
7800 * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
7801 self.Destroy() to close the window after yesterday's changes.
7802
7803 * test/test_map.py, test/test_session.py: Fix messages that
7804 are sent from maps and layers.
7805
7806 2003-03-31 Jonathan Coles <[email protected]>
7807
7808 * Thuban/UI/classifier.py: Commented out some debugging statements.
7809 (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
7810 RTbug #1769.
7811
7812 * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
7813 position (although position doesn't work yet under GTK).
7814 (DockableWindow.Destroy): New. Called when the window must be
7815 closed. Namely needed when the DockFrame closes and must close
7816 its children.
7817 (DockFrame): Listen for EVT_CLOSE and destroy all children.
7818
7819 * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
7820 when then window is told to close.
7821 (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
7822 comment in source for more info.
7823
7824 * Thuban/UI/main.py: Show the legend by default when Thuban starts.
7825
7826 * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
7827 symmetry with other such methods.
7828 (MainWindow.ShowLegend): Show the legend docked by default.
7829
7830 2003-03-28 Jonathan Coles <[email protected]>
7831
7832 * Thuban/UI/classifier.py: Support for highlighting a specific
7833 group within the grid when the classification dialog is opened.
7834 Also contains a lot of debugging printouts which will later
7835 be removed.
7836
7837 * Thuban/UI/dock.py: Complete rework on the dock code so that
7838 that it is fairly removed from the rest of the Thuban application.
7839 It is easy to add new docks which the rest of the program having
7840 to be aware of them.
7841
7842 * Thuban/UI/legend.py: Modifications to support selecting a
7843 specific group in the classification dialog. Changed how layers
7844 are drawn when the layer is visible/invisible.
7845
7846 * Thuban/UI/mainwindow.py: Removed legend specific code and
7847 replaced it with calls to the new dock code.
7848
7849 * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
7850 to check if scale > 0. Trying to track down a divide by zero.
7851
7852 2003-03-26 Jonathan Coles <[email protected]>
7853
7854 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
7855 (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
7856 now part of DockableWindow.
7857 (LegendPanel.DoOnSelChanged): Select the current layer in the
7858 map.
7859 (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
7860 with the selected layer and/or group.
7861
7862 2003-03-26 Jonathan Coles <[email protected]>
7863
7864 This putback contains the code for dockable windows. There is
7865 no support in wxWindows as of this date for windows that can
7866 attach themselves to other windows.
7867
7868 The current model contains a DockableWindow which has a parent
7869 window for when it is detached and a dock window that it puts
7870 its contents in when it is docked. The contents of a DockableWindow
7871 must be a DockPanel. DockPanel itself derives from wxPanel.
7872
7873 * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
7874 message, not a LAYER_LEGEND_CHANGED message.
7875
7876 * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
7877
7878 * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
7879 as one of the style properties for the fieldTypeText item to
7880 be sure that its size is correct when the text changes.
7881
7882 * Thuban/UI/dock.py: New. Classes for the DockPanel and
7883 DockableWindow.
7884
7885 * Thuban/UI/legend.py: Added some more buttons and made the
7886 LegendPanel a DockPanel.
7887
7888 * Thuban/UI/mainwindow.py: Added sash windows to the main window
7889 and supporting functions for manipulating the sashes.
7890 (MainWindow.ShowLegend): Create a DockableWindow with the
7891 LegendPanel as the contents.
7892
7893 * Thuban/UI/messages.py: Added DOCKABLE_* messages
7894
7895 * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
7896 not LAYER_LEGEND_CHANGED, messages.
7897
7898 2003-03-25 Jonathan Coles <[email protected]>
7899
7900 * setup.py: Added custom script bdist_rpm_build_script so that
7901 when the rpm is built the path to wx-config is correct.
7902
7903 * setup.cfg: Added line saying to use the custom build script
7904
7905 2003-03-20 Jonathan Coles <[email protected]>
7906
7907 Initial implementation of the Legend.
7908
7909 * Thuban/UI/legend.py: New. Creates a window that shows the map's
7910 Legend information and allows the user to add/modify classifications
7911 and how the layers are drawn on the map.
7912
7913 * setup.py: New command 'build_docs' which currently uses
7914 happydoc to generate html documentation for Thuban.
7915
7916 * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
7917 Returns a string which is appropriately describes the group.
7918
7919 * Thuban/Model/layer.py (Layer.SetClassification): Generate a
7920 LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
7921
7922 * Thuban/Model/map.py (Map): Rename messages and use new, more
7923 specific, messages.
7924
7925 * Thuban/Model/messages.py: New message to indicate that a layer's
7926 data has changed (LAYER_CHANGED). New map messages to indicate
7927 when layers have been added/removed/changed or if the stacking order
7928 of the layers has changed.
7929
7930 * Thuban/Model/session.py: Rename and use new messages.
7931
7932 * Thuban/UI/classifier.py: Remember if any changes have actually
7933 been applied so that if the dialog is cancelled without an application
7934 of changes we don't have to set a new classification.
7935 (ClassDataPreviewer): Pulled out the window specific code and put it
7936 ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
7937 symbols on any DC.
7938
7939 * Thuban/UI/mainwindow.py: New code to open the legend.
7940
7941 * Thuban/UI/view.py: Use new message names.
7942
7943 2003-03-19 Jonathan Coles <[email protected]>
7944
7945 * Thuban/UI/main.py (verify_versions): New. Checks the versions
7946 of Python, wxPython, and some other libraries.
7947
7948 * extensions/thuban/wxproj.cpp (check_version): Checks the given
7949 version against what wxproj was compiled with.
7950 (check_version_gtk): If wxproj was compiled with gtk then check
7951 the given version against the version of the gtk library
7952 currently being used.
7953
7954 2003-03-14 Bernhard Herzog <[email protected]>
7955
7956 * test/test_command.py: Run the tests when the module is run as a
7957 script
7958
7959 2003-03-14 Bernhard Herzog <[email protected]>
7960
7961 Implement selection of multiple selected shapes in the same layer:
7962
7963 - Introduce a new class to hold the selection. This basically
7964 replaces the interactor which was nothing more than the
7965 selection anyway. A major difference is of course that the new
7966 selection class supports multiple selected shapes in one layer
7967
7968 - Move the object that represents the selection from the
7969 application to the canvas. The canvas is a better place than the
7970 application because the selection represents which shapes and
7971 layer of the map displayed by the canvas are selected and
7972 affects how the map is drawn.
7973
7974 - Make the selection and its messages publicly available through
7975 the mainwindow.
7976
7977 - The non-modal dialogs do not get a reference to the interactor
7978 anymore as they can simply refer to their parent, the
7979 mainwindow, for the what the interactor had to offer.
7980
7981 * Thuban/UI/selection.py: New module with a class to represent the
7982 selection.
7983
7984 * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
7985 these unused messages
7986
7987 * Thuban/UI/application.py (ThubanApplication.OnInit)
7988 (ThubanApplication.OnExit, ThubanApplication.SetSession): The
7989 interactor is gone now.
7990 (ThubanApplication.CreateMainWindow): There is no interactor
7991 anymore so we pass None as the interactor argument for now for
7992 compatibility.
7993
7994 * Thuban/UI/view.py (MapCanvas.delegated_messages)
7995 (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
7996 Unsubscribe, delegate messages according to the delegated_messages
7997 class variable.
7998 (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
7999 attributes from instance variables as described with the
8000 delegated_methods class variable.
8001 (MapCanvas.__init__): New instance variable selection holding the
8002 current selection
8003 (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
8004 pass them on to the renderer
8005 (MapCanvas.SetMap): Clear the selection when a different map is
8006 selected.
8007 (MapCanvas.shape_selected): Simple force a complete redraw. The
8008 selection class now takes care of only issueing SHAPES_SELECTED
8009 messages when the set of selected shapes actually does change.
8010 (MapCanvas.SelectShapeAt): The selection is now managed in
8011 self.selection
8012
8013 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
8014 (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
8015 Unsubscribe, delegate messages according to the delegated_messages
8016 class variable.
8017 (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
8018 attributes from instance variables as described with the
8019 delegated_methods class variable.
8020 (MainWindow.__init__): The interactor as ivar is gone. The
8021 parameter is still there for compatibility. The selection messages
8022 now come from the canvas.
8023 (MainWindow.current_layer, MainWindow.has_selected_layer):
8024 Delegate to the the canvas.
8025 (MainWindow.LayerShowTable, MainWindow.Classify)
8026 (MainWindow.identify_view_on_demand): The dialogs don't need the
8027 interactor parameter anymore.
8028
8029 * Thuban/UI/tableview.py (TableFrame.__init__)
8030 (LayerTableFrame.__init__, LayerTableFrame.OnClose)
8031 (LayerTableFrame.row_selected): The interactor is gone. It's job
8032 from the dialog's point of view is now done by the mainwindow,
8033 i.e. the parent. Subscribe to SHAPES_SELECTED instead
8034 of SELECTED_SHAPE
8035
8036 * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
8037 is gone. It's job from the dialog's point of view is now done by
8038 the mainwindow, i.e. the parent.
8039
8040 * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
8041 gone. It's job from the dialog's point of view is now done by the
8042 mainwindow, i.e. the parent.
8043
8044 * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
8045 gone. It's job from the dialog's point of view is now done by the
8046 mainwindow, i.e. the parent.
8047 (SessionTreeCtrl.__init__): New parameter mainwindow which is
8048 stored as self.mainwindow. The mainwindow is need so that the tree
8049 can still subscribe to the selection messages.
8050 (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
8051 (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
8052 selection is now accessible through the mainwindow. Subscribe to
8053 SHAPES_SELECTED instead of SELECTED_SHAPE
8054
8055 * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
8056 SHAPES_SELECTED message now.
8057 (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
8058 so deal with multiple shapes
8059 (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
8060 gone. It's job from the dialog's point of view is now done by the
8061 mainwindow, i.e. the parent.
8062
8063 * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
8064 parameter is now a list of shape ids.
8065 (RecordTable.SetTable): The second parameter is now a list of
8066 indices.
8067
8068 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
8069 selected_shape parameter and ivar to selected_shapes. It's now a
8070 list of shape ids.
8071 (MapRenderer.draw_label_layer): Deal with multiple selected
8072 shapes. Rearrange the code a bit so that the setup and shape type
8073 distinctions are only executed once.
8074
8075 * test/test_selection.py: Test cases for the selection class
8076
8077 2003-03-11 Jonathan Coles <[email protected]>
8078
8079 * Thuban/Model/load.py: Temporary fix so that the xml reader
8080 doesn't cause Thuban to crash.
8081
8082 * Thuban/Model/layer.py: Handle the cyclic references between
8083 a layer and its classification better, and be sure to disconnect
8084 the classification from the layer when the layer is destroyed
8085 so that we don't maintain a cyclic reference that may not be
8086 garbage collected.
8087
8088 * Thuban/Model/classification.py: See comment for layer.py.
8089
8090 2003-03-12 Jan-Oliver Wagner <[email protected]>
8091
8092 * HOWTO-Release: New. Information on the steps for releasing
8093 a new version of Thuban.
8094
8095 2003-03-11 Jonathan Coles <[email protected]>
8096
8097 * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
8098 Use True instead of true.
8099 (Classifier): Should have a single panel in which all the controls lie.
8100
8101 * Thuban/UI/proj4dialog.py: Add normal border.
8102
8103 * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
8104
8105 * Thuban/UI/mainwindow.py: Use True instead of true.
8106
8107 * setup.py: Update some definitions to use wxWindows2.4 files
8108
8109 * Data/iceland_sample_class.thuban: Fixed file so that the
8110 field_type information is present.
8111
8112 2003-03-10 Jonathan Coles <[email protected]>
8113
8114 * Thuban/UI/classifier.py (Classifier.__init__): Make the
8115 field type label grow so that when the text changes the
8116 size is updated correctly. This may be a wxWindows bug.
8117
8118 2003-03-10 Jonathan Coles <[email protected]>
8119
8120 * Thuban/UI/application.py: Changed SESSION_CHANGED to
8121 SESSION_REPLACED.
8122
8123 * Thuban/UI/classifier.py: Wrap text with _().
8124 (ClassGrid.CreateTable): Set dimensions and size hints here,
8125 instead of in Reset, so we only set the size once.
8126
8127 * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
8128
8129 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
8130 Call Close() instead of Shutdown().
8131
8132 * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
8133
8134 * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
8135 Go back to using OnClose() instead of Shutdown().
8136
8137 2003-03-10 Jonathan Coles <[email protected]>
8138
8139 * Thuban/UI/classifier.py (Classifier): SelectField() needed
8140 to know the old field index as well as the new one.
8141
8142 2003-03-10 Jonathan Coles <[email protected]>
8143
8144 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
8145 to correctly set the table information and call this from
8146 __init__ and from _OnFieldSelect so that all the information
8147 is up to date when the dialog opens and when a field is changed.
8148
8149 2003-03-10 Jonathan Coles <[email protected]>
8150
8151 * Thuban/Model/classification.py (Classification): Don't use
8152 layer's message function directly, use the ClassChanged() method
8153 when then classification changes. SetField/SetFieldType/SetLayer
8154 must keep the information about field name and field type in
8155 sync when an owning layer is set or removed.
8156
8157 * Thuban/Model/layer.py: Added ClassChanged() so that the
8158 classification can tell the layer when its data has changed.
8159 (Layer.SetClassification): Accepts None as an arguement to
8160 remove the current classification and correctly handles
8161 adding a new classification.
8162
8163 * Thuban/Model/load.py: Comment out print statement
8164
8165 * test/test_classification.py, test/test_save.py: New and
8166 improved tests.
8167
8168 2003-03-07 Jonathan Coles <[email protected]>
8169
8170 * Thuban/Model/classification.py: Implemented __copy__ and
8171 __deepcopy__ for ClassGroup* and ClassGroupProperites so
8172 they can easily be copied by the classifier dialog.
8173 (ClassGroupProperites.__init__): The default line color should
8174 have been Color.Black.
8175
8176 * Thuban/UI/classifier.py: Setting and Getting table values now
8177 uses a consistent set of functions.
8178 (Classifier): Now non-modal. Has field type label which changes
8179 as the field changes. Keep track of buttons in a list so that
8180 we can enable/disable the buttons when the None field is selected.
8181 (SelectPropertiesDialog): Add buttons to make the colors transparent.
8182
8183 * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
8184 does what OnClose did, but can be called by the application to
8185 close a window. Needed when a session changes, and we have to
8186 close the classifier windows.
8187
8188 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
8189 Shuts down open dialogs. Used when a new session is created
8190 or a session is opened.
8191 (MainWindow.SaveSession): Should only call application.SaveSession()
8192 if we don't call SaveSessionAs first.
8193 (MainWindow.Classify): Allow different classifier dialogs for
8194 different layers.
8195
8196 * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
8197 the parent class handle it. Add Shutdown() to unsubscibe from
8198 event notification and call the parent Shutdown(). This was
8199 necessary so the application can close the tree window.
8200
8201 2003-03-06 Jonathan Coles <[email protected]>
8202
8203 * Thuban/Model/classification.py: Minor documentation changes,
8204 Addition of __eq__ and __ne__ methods.
8205 (Classification.SetLayer): prevent recursion between this method
8206 and Layer.SetClassification().
8207
8208 * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
8209
8210 * Thuban/Model/layer.py (SetClassification): prevent recursion
8211 between this method and Classification.SetLayer().
8212
8213 * test/test_classification.py, test/test_load.py,
8214 test/test_session.py: Fixed and added tests for the classification
8215 classes.
8216
8217 2003-03-06 Bernhard Herzog <[email protected]>
8218
8219 * Thuban/UI/classifier.py (ClassGrid.__init__)
8220 (ClassGrid.CreateTable): Move the SetSelectionMode call to
8221 CreateTable because otherwise it triggers an assertion in
8222 wxPython/wxGTK 2.4.
8223
8224 2003-03-05 Jonathan Coles <[email protected]>
8225
8226 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
8227
8228 * Thuban/Model/load.py: import FIELDTYPE constants from table.
8229
8230 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
8231
8232 * Thuban/Model/table.py: Put FIELDTYPE constants back.
8233
8234 2003-03-05 Jonathan Coles <[email protected]>
8235
8236 * Thuban/UI/classifier.py: Added class documentation.
8237 Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
8238 Store just the groups in the table and generate the other
8239 column information when it is requested. Add "None" field
8240 to pull-down to select no classification.
8241
8242 * Thuban/common.py: Moved FIELDTYPE constants from table.py
8243 (Str2Num): Only catch ValueError exceptions.
8244
8245 * Thuban/Model/classification.py: Class documentation. Renaming
8246 of methods with Stroke to Line. Groups are stored in a single
8247 list with the default as the first element. Groups are searched
8248 in the order they appear in the list.
8249
8250 * Thuban/Model/color.py: Documentation.
8251
8252 * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
8253 the kind of data represented by a field.
8254
8255 * Thuban/Model/load.py (ProcessSession): Use proper string
8256 conversion function; fixes RTbug #1713.
8257
8258 * Thuban/Model/save.py (Saver): Store field type information.
8259
8260 * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
8261 (Table): Add field_info_by_name() to retrieve field information
8262 by specifying the field name, not the number.
8263
8264 * Thuban/UI/mainwindow.py: Function name changes.
8265
8266 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
8267 get the layer classification once. Don't try to classify
8268 values when the field is None: just use the default properties.
8269
8270 * Thuban/UI/view.py: Function name changes.
8271
8272 * Doc/thuban.dtd: Add field_type attribute to a classification.
8273
8274 2003-03-04 Bernhard Herzog <[email protected]>
8275
8276 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
8277 the fill and stroke layer attributes optional with suitable
8278 default values. Add the stroke_width layer attribute. Use correct
8279 syntax for empty elements. Make the attribute list for labels
8280 refer to the label element.
8281
8282 2003-03-04 Bernhard Herzog <[email protected]>
8283
8284 * setup.py (thuban_build_py.build): Add a comment about distutils in
8285 Python 2.3 containing some of the functionality we implement in
8286 setup.py ourselves.
8287
8288 * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
8289 before the selection mode. Doing it the other way round triggers
8290 an assertion in wxWindows.
8291
8292 * Thuban/Model/save.py (escape): Fix typo in doc-string
8293
8294 * Thuban/Model/classification.py: Remove unnecessary wxPython
8295 import
8296
8297 2003-03-04 Jonathan Coles <[email protected]>
8298
8299 * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
8300 Parameter 'value' should default to None.
8301
8302 * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
8303 the class attribute __classification is now private.
8304
8305 * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
8306 Classifier to ClassGrid. Added support for removing selected rows,
8307 which including code for keeping track of when cells are selected,
8308 and deselected.
8309 (ClassTable): Support for added/removing rows. Fixed a problem
8310 with __ParseInput whereby it would not allow strings (only numbers)
8311 to be entered.
8312 (Classifier): Added button and supporting code for removing
8313 selected rows.
8314
8315 2003-02-27 Jonathan Coles <[email protected]>
8316
8317 * Thuban/common.py: Moved color conversion functions into
8318 Thuban/UI/common.py.
8319 (Str2Num): Now converts the float (not the string) to a long/int
8320 so that an exception isn't thrown.
8321
8322 * Thuban/UI/common.py: Common functions used in several UI modules
8323
8324 * Thuban/Model/classification.py: Changed the class hierarchy
8325 so that a Classification consists of Groups which return
8326 Properties when a value matches a Group.
8327
8328 * Thuban/Model/layer.py: Fixed name resolution problem.
8329
8330 * Thuban/Model/load.py: Use new Classification and Group functions.
8331
8332 * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
8333 failure.
8334 (Saver.write_classification): Use new Classification and Group
8335 functions.
8336
8337 * Thuban/UI/classifier.py: Changes to use new Classification and Group
8338 functions. Fix to create a tuple with a single value instead of
8339 simply returning the value.
8340
8341 * Thuban/UI/renderer.py: Use new Classification and Group functions.
8342 Use common.py functions.
8343
8344 * Thuban/UI/tree.py: Use common.py functions.
8345
8346 * test/test_classification.py: Use new Classification and Group
8347 classes.
8348
8349 2003-02-24 Jonathan Coles <[email protected]>
8350
8351 * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
8352 functions from Thuban color objects to wxWindow colour objects.
8353
8354 * Thuban/Model/classification.py (Classification): Renamed
8355 GetProperties() to GetClassData(). Used the new iterator
8356 in TreeInfo().
8357 (ClassIterator): Iterator implementation to iterate over the
8358 ClassData objects in a classification object.
8359
8360 * Thuban/Model/save.py (Saver.write_classificaton): Uses
8361 the new iterator to save the classification information.
8362
8363 * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
8364 for changing the stroke and fill colors and previewing the
8365 changes.
8366
8367 * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
8368 MainWindow.SaveSessionAs): Text string changes so the dialogs
8369 have more meaningful titles.
8370
8371 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
8372 Classification method name from GetProperties to GetClassData.
8373
8374 * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
8375 instead of accessing now non-existent class variables.
8376
8377 2003-02-24 Bernhard Herzog <[email protected]>
8378
8379 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
8380 unneeded Shape() call. Rendering is substantially faster without
8381 it and it avoids some problems with broken shape files.
8382
8383 2003-02-20 Frank Koormann <[email protected]>
8384
8385 Force minimal size of identify and label dialogs. The autosizing
8386 looked too ugly.
8387
8388 * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
8389 * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
8390 Set size of listctrl.
8391 * Thuban/UI/identifyview.py (IdentifyView.__init__):
8392 Set size of dialog.
8393
8394 2003-02-19 Jonathan Coles <[email protected]>
8395
8396 * test/test_classification.py, test/test_layer.py,
8397 test/test_load.py, test/test_map.py, test/test_session.py:
8398 Updated the tests to use the new functions that are in the
8399 respective classes.
8400
8401 * Thuban/Model/classification.py (Classification):
8402 Uses the new ClassData* classes. Modification messages are
8403 passed up to the parent layer (if it exists).
8404 (ClassData): New class to encapsulate the common data in each
8405 classification property.
8406 (ClassDataDefault): Represents the Default class. data.
8407 (ClassDataPoint): Represents a single class. data point
8408 (ClassDataRange): Represents a class. range
8409 (ClassDataMap): Represents a class. map (unused).
8410
8411 * Thuban/Model/color.py: Added Color.None to represent something
8412 with no color. Color.Black represents the color black.
8413 (NoColor): Helper class derived from Color to represent something
8414 with no color.
8415
8416 * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
8417 stroke_width attributes. Made the 'classification' attribute private.
8418 New methods for setting/getting the classification.
8419
8420 * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
8421 to get the classifcation and use the new ClassData* classes to
8422 hold the classification data. Use Str2Num to convert numbers
8423 properly.
8424
8425 * Thuban/Model/save.py (Saver): Use new Color and Classification
8426 methods
8427
8428 * Thuban/UI/classifier.py (ClassGrid): New class to represent a
8429 custom grid.
8430 (ClassTable): Support for editing Values and Labels and for
8431 changing what type (point or range) of data is stored in each
8432 property based on how the user enters the data.
8433 (Classifier): Support for saving the new classifications and
8434 launching the dialog to edit a property.
8435 (SelectPropertiesDialog): New class for editing the visual
8436 properties of a classification (stroke color, width, and fill color)
8437 (ClassPreviewer): Took the Draw method from ClassRenderer and
8438 made most of it into this new class. Intend to use this class in
8439 the SelectPropertiesDialog for previewing changes.
8440
8441 * Thuban/UI/renderer.py: Use new Color and Classification methods.
8442
8443 * Thuban/UI/tree.py: Formatting changes.
8444
8445 * Doc/thuban.dtd: Add 'label' element
8446
8447 * Thuban/common.py: New. Contains common routines used throughout
8448 the code.
8449 (Str2Num): Takes a string and converts it to the "best" type of
8450 number.
8451
8452 2003-02-14 Bernhard Herzog <[email protected]>
8453
8454 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
8455 dragging flag is always set to 0 even when the tool implementation
8456 raises an exception
8457
8458 2003-02-11 Bernhard Herzog <[email protected]>
8459
8460 * Thuban/UI/application.py (ThubanApplication.splash_screen): New
8461 method to create a splash screen.
8462 (ThubanApplication.ShowMainWindow): New. Show the main window.
8463 Needed so the splash screen can display the mainwindow
8464 (ThubanApplication.OnInit): Call the
8465 new splash_screen method to determine whether the application
8466 should display a splash screen. If it displays a splash screen do
8467 not immediately show the main window.
8468
8469 2003-02-11 Jonathan Coles <[email protected]>
8470
8471 * Thuban/Model/classification.py: Added import line to fix
8472 feature conflicts between running on python2.2 and python2.1.
8473
8474 * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
8475 onto the clinfo parameter, so removed the deepcopy().
8476
8477 2003-02-10 Jonathan Coles <[email protected]>
8478
8479 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
8480 Added element_open variable to track opening and closing of tags
8481 so that tags that don't span more than one line are closed with
8482 /> instead of </tag_name>. Use the GetDefault*() methods of
8483 the Classification class.
8484
8485 * Thuban/Model/classification.py (Classificaton): Added set and
8486 get methods for the default data. The class also takes a layer
8487 reference so that modification messages can be sent. Fixed the
8488 methods to use the new ClassData class.
8489 (ClassData): New class to encapsulate the classification data
8490
8491 * Thuban/Model/layer.py (Layer): Remove the
8492 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
8493 SetDefault*() methods on the layer's classification object.
8494 (Layer.__init__): Use the new SetDefault*() methods in the
8495 Classification class.
8496
8497 * Thuban/Model/load.py (ProcessSession): Use the new ClassData
8498 object instead of a dictionary.
8499
8500 * Thuban/UI/classifier.py (ClassRenderer): New class to
8501 draw the classifications in the dialog box's table.
8502 (Classifier): Modified to use the ClassRenderer class.
8503
8504 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
8505 methods of the Classification class.
8506
8507 * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
8508 of the ClassData class.
8509
8510 * test/test_classification.py, test/test_layer.py,
8511 test/test_map.py, test/test_session.py: Fix the tests to work
8512 with the above code changes.
8513
8514 2003-02-03 Jonathan Coles <[email protected]>
8515
8516 * Thuban/Model/classification.py (Classification): Added getNull()
8517 to return the NullData reference
8518
8519 * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
8520 Layer.SetStrokeWidth): Modified these functions to change the
8521 null data in the classification rather than keep these values
8522 directly in the Layer class. Menu options to change these values
8523 work again.
8524
8525 2003-01-28 Jonathan Coles <[email protected]>
8526
8527 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
8528 Fixed crashing problem on some systems. Dialog box shows
8529 classification data.
8530
8531 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
8532 Colors in the tree view.
8533
8534 * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
8535 the tree info for classifications. Commented out unnecessary lines.
8536
8537 * Thuban/Model/classification.py (Classification.TreeInfo): New
8538 function to add information about the classification into the
8539 tree view.
8540
8541 2003-01-27 Jan-Oliver Wagner <[email protected]>
8542
8543 * Thuban/__init__.py (_): New.
8544
8545 * Thuban/Model/classification.py, Thuban/Model/extension.py,
8546 Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
8547 Thuban/Model/session.py, Thuban/UI/application.py,
8548 Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
8549 Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
8550 Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
8551 Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
8552 Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
8553
8554 2003-01-27 Jonathan Coles <[email protected]>
8555
8556 * Thuban/Model/layer.py: Classification initialization calls.
8557
8558 * Thuban/Model/classification.py: Created class to encapsulate
8559 a layer classification. Supports specific data points and
8560 ranges.
8561
8562 * Thuban/Model/load.py: Added support for loading classification
8563 information.
8564
8565 * Thuban/Model/save.py: Added support for saving classification
8566 information.
8567
8568 * Thuban/UI/classifier.py: Initial class for a dialog box for
8569 specifying classification information.
8570
8571 * Thuban/UI/mainwindows.py: Support for opening the classifier
8572 dialog.
8573
8574 * Thuban/UI/renderer.py: Support for drawing a layer with the
8575 classification information.
8576
8577 * Data/iceland_sample_class.thuban: iceland_sample with
8578 classification data.
8579
8580 * test/test_classification: Tests for the Classification class.
8581
8582 2002-12-09 Bernhard Herzog <[email protected]>
8583
8584 * test/test_command.py: New. Tests for the command classes.
8585
8586 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
8587 (Command.IsTool): New method to distinguish between command
8588 switching tools and other commands.
8589
8590 * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
8591 the tool to avoid direct assignments to instance variables
8592 (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
8593 (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
8594 change the tool
8595
8596 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
8597 active tool's command turns insensitive, disable the tool.
8598 (_tool_command): Use the new ToolCommand class
8599
8600 * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
8601 SelectTool method to change the tool
8602 (iconfile): Use the ToolCommand class
8603
8604 2002-12-03 Bernhard Herzog <[email protected]>
8605
8606 * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
8607 the case of selected items that are not children of Layers or Maps
8608 properly. Previously this bug would trigger an assertion in
8609 wxWindows.
8610
8611 2002-11-06 Frank Koormann <[email protected]>
8612
8613 * Thuban/UI/mainwindow.py: Altered the order of tools in the
8614 toolbar: First now are all navigation tools (Zoom In/Out, Pan,
8615 Full Extent).
8616
8617 2002-10-23 Bernhard Herzog <[email protected]>
8618
8619 * setup.py (setup call): version now 0.1.3
8620
8621 * MANIFEST.in: Add the files in test/
8622
8623 * test/README: Add note about tests requiring the iceland data
8624
8625 * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
8626 copyright notice.
8627
8628 2002-10-18 Bernhard Herzog <[email protected]>
8629
8630 * test/test_map.py
8631 (TestMapWithContents.test_projected_bounding_box): Use an explicit
8632 epsilon.
8633
8634 * test/support.py (FloatComparisonMixin.assertFloatEqual)
8635 (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
8636 message if the assertion fails and don't return the return value
8637 of self.assert_. In assertFloatSeqEqual the return meant that not
8638 all items of the sequence were compared.
8639
8640 2002-09-20 Bernhard Herzog <[email protected]>
8641
8642 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
8643
8644 * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
8645
8646 * test/test_map.py (TestMapWithContents.test_tree_info): Create
8647 the string with the bounding box on the fly because of platform
8648 differences in the way %g is handled.
8649
8650 * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
8651 DBFfile too because Thuban layers can't yet cope missing DBF
8652 files.
8653
8654 2002-09-20 Bernhard Herzog <[email protected]>
8655
8656 * test/test_menu.py: Use initthuban instead of
8657 add_thuban_dir_to_path to initialize Thuban.
8658
8659 * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
8660 Mixin class for float comparisons
8661 (SubscriberMixin): New. Mixin class to test messages sent through
8662 the Connector class
8663
8664 * test/README: Fix a typo and add the -v flag to the command for
8665 individual tests
8666
8667 * test/test_session.py: New. Test cases for Thuban.Model.session
8668
8669 * test/test_proj.py: New. Test cases for Thuban.Model.proj
8670
8671 * test/test_map.py: New. Test cases for Thuban.Model.map
8672
8673 * test/test_layer.py: New. Test cases for Thuban.Model.layer
8674
8675 * test/test_label.py: New. Test cases for Thuban.Model.label
8676
8677 * test/test_connector.py: New. Test cases for Thuban.Lib.connector
8678
8679 * test/test_color.py: New. Test cases for Thuban.Model.color
8680
8681 * test/test_base.py: New. Test cases for Thuban.Model.base
8682
8683 2002-09-13 Bernhard Herzog <[email protected]>
8684
8685 * Thuban/Model/session.py (Session.forwarded_channels): Forward
8686 the CHANGED channel too.
8687
8688 * Thuban/Model/map.py (Map.forwarded_channels): Forward the
8689 CHANGED channel too.
8690 (Map.__init__): Call the Modifiable constructor as well.
8691
8692 * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
8693 event if the modified flag changes.
8694 (Modifiable.changed): Tweak the doc-string.
8695
8696 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
8697 (MainWindow.set_position_text): Put the code that puts the text
8698 with the mouse position into the status bar into the new method
8699 set_position_text so that it can overwritten in derived classes.
8700
8701 2002-09-12 Bernhard Herzog <[email protected]>
8702
8703 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
8704 message box on the main window.
8705
8706 2002-09-11 Bernhard Herzog <[email protected]>
8707
8708 * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
8709 the 'E' because it's less likely to interfere with other menu
8710 entries.
8711 (MainWindow.build_menu): remove an incorrect comment.
8712
8713 2002-09-10 Bernhard Herzog <[email protected]>
8714
8715 * Thuban/UI/mainwindow.py (MainWindow.Map): New.
8716 (_tool_command): Add sensitive parameter
8717 (_has_visible_map): Sensitivity callback to tools and other
8718 commands that require a visible map. Use it in map_zoom_in_tool,
8719 map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
8720 and map_full_extent
8721
8722 2002-09-06 Bernhard Herzog <[email protected]>
8723
8724 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
8725 VIEW_POSITION
8726
8727 2002-09-04 Frank Koormann <[email protected]>
8728
8729 * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
8730
8731 2002-09-02 Bernhard Herzog <[email protected]>
8732
8733 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
8734 wxWindows already and our implementation doesn't work correctly
8735 with wxGTK 2.3:
8736 (MapCanvas.__init__): Remove the instance variable
8737 (MapCanvas.OnPaint): Always call do_redraw when there's a map to
8738 be drawin
8739 (MapCanvas.OnIdle): Removed.
8740
8741 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
8742 a parameter to determine the size of the rectangle.
8743 (MapCanvas.find_shape_at): Create the box around the point on a
8744 layer by layer basis and make the size depend on the shape type.
8745 This solves a problem with the selection of point shapes at the
8746 border of the layer's bounding box
8747
8748 2002-08-30 Bernhard Herzog <[email protected]>
8749
8750 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
8751 for the sensitivity of remove layer.
8752 (_can_remove_layer): New. Sensitivity callback for remove layer
8753 (Command layer_remove): Use _can_remove_layer
8754
8755 * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
8756 determine whether a given layer can be deleted.
8757
8758 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
8759 (MapCanvas.do_redraw): Get rid of the unused update_region
8760 instance variable
8761
8762 * Thuban/UI/view.py: Add/update some doc-strings.
8763
8764 * test/: new subdirectory with a bunch of unit tests.
8765
8766 * test/README, test/test_table.py, test/test_save.py,
8767 test/test_menu.py, test/test_load.py: Initial set of tests and
8768 brief instructions on how to run them
8769
8770 2002-08-29 Bernhard Herzog <[email protected]>
8771
8772 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
8773 arcs with multiple parts.
8774
8775 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
8776 Handle degenrate rectangles.
8777
8778 * Thuban/Model/table.py: Make writing records work correctly:
8779 (Table.__init__): Keep track of whether the DBF is open for
8780 writing
8781 (Table.write_record): Open the DBF file for writing when necessary
8782
8783 2002-08-27 Bernhard Herzog <[email protected]>
8784
8785 * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
8786 dbf files only for reading by default. Use a new writable dbf
8787 object for writing.
8788
8789 2002-08-26 Bernhard Herzog <[email protected]>
8790
8791 * Thuban/UI/mainwindow.py: Refactor the context creation:
8792 (MainWindow.Context): New method to return a context
8793 (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
8794 new method
8795
8796 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
8797 layer table specific code from TableGrid into LayerTableGrid
8798 (TableFrame, LayerTableFrame): Split the layer table specific code
8799 from TableFrame into LayerTableFrame
8800 (LayerTableGrid.select_shape): Remove a debug print
8801
8802 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
8803 LayerTableFrame
8804
8805 2002-08-23 Bernhard Herzog <[email protected]>
8806
8807 * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
8808 absolute filename.
8809
8810 2002-08-22 Bernhard Herzog <[email protected]>
8811
8812 * Thuban/Model/table.py (Table.write_record): New method to write
8813 records.
8814 (Table.__init__): Open the DBF file for writing too.
8815
8816 * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
8817 into the underlying table.
8818
8819 * extensions/shapelib/shapefil.h (DBFCommit),
8820 extensions/shapelib/dbfopen.c (DBFCommit): New API function to
8821 commit any changes made to the DBF file.
8822
8823 * Thuban/UI/mainwindow.py (make_check_current_tool)
8824 (_tool_command): Put the code that generates the "checked"
8825 callback into a separate function so that we can reuse it
8826 elsewhere
8827
8828 * Thuban/Model/save.py (Saver): New class to handle serializing a
8829 session into an XML file. The main reason to introduce a class is
8830 that applications built on Thuban can derive from it so that they
8831 can save additional information in a session file.
8832 (save_session): Delegate almost all the work to the Saver class.
8833 Rename the filename argument to file because it may be a file like
8834 object now.
8835
8836 * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
8837 code. Remove the little test code which would be executed when the
8838 module is run as a script which didn't work anymore since it can't
8839 import the other Thuban modules.
8840 (ProcessSession, load_session): Refactor the ProcessSession to
8841 have one method for each element start and end tag so that derived
8842 classes can easily override the processing of individual tags.
8843 Also, always parse with namespaces enabled because applications
8844 built on top of Thuban will likely use namespaces if they extend
8845 the session file format.
8846
8847 2002-08-21 Bernhard Herzog <[email protected]>
8848
8849 * setup.py (ThubanInstall.run): Don't repr install_lib_orig
8850 because thubaninit_contents will do it for us.
8851
8852 2002-08-16 Jan-Oliver Wagner <[email protected]>
8853
8854 * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
8855 tree window already open
8856
8857 2002-08-15 Bernhard Herzog <[email protected]>
8858
8859 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
8860 with self.
8861
8862 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
8863 when we have actually captured it.
8864
8865 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
8866 shapefile and destroy the table.
8867
8868 * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
8869
8870 2002-08-14 Bernhard Herzog <[email protected]>
8871
8872 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
8873 instance variable columns
8874 (RecordTable.GetTypeName): row and col may be negative in some
8875 cases.
8876
8877 * setup.py (InstallLocal.initialize_options)
8878 (InstallLocal.finalize_options, InstallLocal.user_options): New
8879 option create-init-file to build a thubaninit.py when running
8880 install_local
8881 (InstallLocal.run): Create the thubaninit.py module when requested
8882 (thubaninit_contents): Split the template into several parts and
8883 create a new function thubaninit_contents that creates the
8884 contents of a thubaninit module.
8885 (ThubanInstall.run): Use the new function to create the thubaninit
8886 module.
8887
8888 2002-07-30 Bernhard Herzog <[email protected]>
8889
8890 * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
8891 cleanup.
8892 (ThubanApplication.MainLoop): Extend to automatically call OnExit.
8893
8894 * Thuban/Model/session.py (Session.Destroy): Don't bypass the
8895 direct base class' Destroy method.
8896
8897 * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
8898 layers.
8899 (Map.Destroy): Destroy the label_layer as well and call the
8900 inherited Desatroymethod first so that no more messages are
8901 issued.
8902 (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
8903 message if the stacking order actually has changed. Add
8904 doc-strings.
8905 (Map.BoundingBox): Correct the doc-string.
8906 (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
8907 (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
8908
8909 * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
8910 all labels.
8911
8912 2002-07-29 Bernhard Herzog <[email protected]>
8913
8914 * Thuban/Model/map.py (Map.subscribe_layer_channels)
8915 (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
8916 to a layer's channels into separate methods.
8917 (Map.RemoveLayer, Map.AddLayer): Call the new methods
8918 (Map.Destroy): Unsubscribe from a layer's channels before
8919 destroying it.
8920
8921 * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
8922 selected_layer parameter to searched_layer which is the layer to
8923 search in.
8924 (MapCanvas.SelectShapeAt): New parameter layer to restrict the
8925 search to that layer. Return the selected layer and shape.
8926
8927 * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
8928 typo
8929
8930 2002-07-24 Bernhard Herzog <[email protected]>
8931
8932 * Thuban/UI/application.py (ThubanApplication.create_session):
8933 Extend the doc string.
8934 (ThubanApplication.subscribe_session)
8935 (ThubanApplication.unsubscribe_session): New methods to
8936 subscribe/unsubscribe to/from session channels.
8937 (ThubanApplication.SetSession): Call the new methods here.
8938 (ThubanApplication.maps_changed, ThubanApplication.set_map):
8939 Renamed set_map to maps_changed. Its now a subscriber for
8940 MAPS_CHANGED.
8941
8942 * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
8943 x-coordinate in case of simple clicks
8944
8945 * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
8946 don't pass it as a parameter
8947
8948 * Thuban/Model/session.py (Session.RemoveMap): New
8949
8950 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
8951 window size into a parameter.
8952
8953 2002-07-23 Bernhard Herzog <[email protected]>
8954
8955 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
8956 just commands.
8957
8958 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
8959 parameter list a bit to allow setting the window title and the
8960 initial message in the status bar. Update the callers.
8961
8962 * Thuban/UI/application.py (ThubanApplication.OnInit)
8963 (ThubanApplication.CreateMainWindow): Put the mainwindow
8964 instantiation into a separate method so that it can be overridden
8965 by a subclass.
8966
8967 2002-07-19 Bernhard Herzog <[email protected]>
8968
8969 * Thuban/Model/session.py: Issue a CHANGED message every time
8970 another changed message is issued to make it easier to get
8971 notified of changes.
8972 (Session): Update the doc string
8973 (Session.forward): Issue changed-events as CHANGED as well.
8974 (Session.changed): Overwrite the inherited version to issue
8975 CHANGED events as well.
8976
8977 * Thuban/UI/tree.py: We can now simply subscribe to the session's
8978 CHANGED channel to be informed of changes.
8979 (SessionTreeCtrl.session_channels): Not needed any longer.
8980 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
8981 Only have to (un)subscribe CHANGED
8982
8983 * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
8984
8985 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
8986 for the wxPython locale bug to __init__.py so that it's
8987 automatically executed by anybody using UI code from Thuban.
8988
8989 2002-07-18 Bernhard Herzog <[email protected]>
8990
8991 * Thuban/UI/main.py (main): app no longer needs to be global
8992
8993 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
8994 as parameter and store it in an instance variable
8995 (MainWindow.invoke_command, MainWindow.update_command_ui)
8996 (MainWindow.save_modified_session, MainWindow.NewSession)
8997 (MainWindow.OpenSession, MainWindow.SaveSession)
8998 (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
8999 application object.
9000
9001 * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
9002 the main window with self.
9003
9004 * Thuban/UI/context.py: New module with the context class
9005
9006 * Thuban/UI/command.py (Command): Update doc string.
9007
9008 * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
9009 MainWindow.update_command_ui): Pass an instance of the context
9010 class to the command's methods
9011 (check_current_tool, call_method): Handle the new context
9012 implementation
9013
9014 * Examples/simple_extensions/simple_tool.py (simple_tool,
9015 check_simple_tool): Handle the new context implementation
9016
9017 * Examples/simple_extensions/simple_command.py (simple_command):
9018 Handle the new context implementation. Update the comments about
9019 the context.
9020
9021 * Thuban/UI/application.py (ThubanApplication.SetSession): Add
9022 doc-string
9023 (ThubanApplication.Session): New method to return the session
9024 object
9025
9026 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
9027 interactor's selected_layer may not be a layer of the current
9028 session when the tree is updated while a new session is being set.
9029
9030 2002-07-17 Bernhard Herzog <[email protected]>
9031
9032 * Thuban/UI/tree.py (color_string): Removed. No longer used.
9033 (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
9034 update_tree into update_tree and add_items. The tree now uses a
9035 more generic way to display the contents of the tree.
9036 (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
9037
9038 * Thuban/Model/layer.py (Layer.TreeInfo),
9039 Thuban/Model/extension.py (Extension.TreeInfo),
9040 Thuban/Model/map.py (Map.TreeInfo),
9041 Thuban/Model/session.py (Session.TreeInfo):
9042 Add TreeInfo methods to implement the new tree view update scheme
9043
9044 2002-07-16 Bernhard Herzog <[email protected]>
9045
9046 * Thuban/UI/application.py: Don't use "import from" for the
9047 MainWindow. It can't always be resolved.
9048 (ThubanApplication.OnInit): change reference to MainWindow
9049 accordingly.
9050
9051 * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
9052 completely
9053
9054 2002-07-10 Bernhard Herzog <[email protected]>
9055
9056 * setup.py (create_init_module): New configurable variable whose
9057 default depends on the platform we're running on.
9058 (ThubanInstall.initialize_options): Initialize
9059 self.create_init_module from the global create_init_module
9060 (ThubanInstall.user_options): indictate that the options
9061 create-init-module and init-module-dir have arguments.
9062
9063 * setup.py: In the setup call change the version number to include
9064 cvs.
9065
9066 * MANIFEST.in: Add the files in Examples
9067
9068 2002-07-09 Bernhard Herzog <[email protected]>
9069
9070 * setup.py: In the setup call, use the thuban homepage as the
9071 value of the url parameter.
9072
9073 * Examples: New subdirectory for examples.
9074
9075 * Examples/simple_extensions/simple_tool.xpm,
9076 Examples/simple_extensions/simple_tool.py,
9077 Examples/simple_extensions/simple_command.py,
9078 Examples/simple_extensions/README: Simple examples showing how to
9079 add new commands and tools.
9080
9081 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
9082 bdist_rpm that we also have an install script.
9083 (bdist_inno): Add 2002 to the copyright notice.
9084
9085 * setup.py: Create a file in python's site-packages directory to
9086 make installation of Thuban as a library easier.
9087 (ThubanInstall.user_options): Add two new options,
9088 create-init-module and init-module-dir
9089 (ThubanInstall.expand_with_pure_python_dirs): New method to expand
9090 filenames for installation in the default directories.
9091 (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
9092 the inherited methods to capture some filenames before they're
9093 transformed too much by distutils.
9094 (ThubanInstall.run): Create the init module if requested.
9095 (ThubanInstall.thuban_init_filename): New method to return the
9096 full name of the init module.
9097 (ThubanInstall.get_outputs): Append the filename of the init
9098 module.
9099
9100 2002-07-08 Bernhard Herzog <[email protected]>
9101
9102 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
9103 handle the prefix properly which means that the default for the
9104 installation prefix should be /usr for RPMs and /usr/local when
9105 doing a normal source install.
9106 (bdist_rpm_install_script): Script to override the default install
9107 commands in the specfile generated by the bdist_rpm command.
9108 (thuban_bdist_rpm.user_options): Add a prefix option
9109 (thuban_bdist_rpm.initialize_options): Init the prefix option.
9110 Create the script files for the spec files as empty files here
9111 (thuban_bdist_rpm._make_spec_file): Override the inherited method
9112 to fill the script files with content.
9113
9114 * Thuban/Model/save.py (relative_filename): Wrapper around
9115 Thuban.Lib.fileutil.relative_filename that accepts an empty dir
9116 argument. save_session now automatically uses this version,
9117 solving a problem when saving to a relative filename.
9118
9119 * setup.py: In the setup call, make sure that the library
9120 directories are under $prefix/lib not directly under $prefix.
9121
9122 2002-06-20 Jan-Oliver Wagner <[email protected]>
9123
9124 * Thuban/Model/extension.py: new module to handle extension objects.
9125 * Thuban/Model/messages.py: new messages for extensions.
9126 * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
9127 Session.AddExtension): new for handling extensions.
9128 Also some other minor changes to round up extension handling.
9129 * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
9130 of Extension titles and title and names of its objects.
9131
9132 2002-05-29 Bernhard Herzog <[email protected]>
9133
9134 * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
9135 the events for a command.
9136 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
9137 Call bind_command_events to bind the events. add_toolbar_command
9138 can now bind events too so that it's possible to have commands
9139 that are only available through the toolbar.
9140 (MainWindow.init_ids): New instance variable events_bound to keep
9141 track of for which commands events have been bound.
9142
9143 2002-05-28 Bernhard Herzog <[email protected]>
9144
9145 * Thuban/UI/menu.py: New module to build and manage menus.
9146
9147 * Thuban/UI/mainwindow.py: Remove some unused imports.
9148 (MainWindow.__init__, main_menu): move the definition of the main
9149 menu from __init__ to the Menu instance main_menu.
9150 (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
9151 build the menu bar and sub-menus from a menu description.
9152
9153 * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
9154 startup file
9155 (ThubanApplication.read_startup_files): New method to run
9156 ~/.thuban/thubanstart.py
9157
9158 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
9159 Move the toolbar definition to the Menu instance main_toolbar.
9160 (MainWindow.build_toolbar): New method to build the toolbar
9161 similar to the build_menu methods
9162
9163 2002-05-23 Bernhard Herzog <[email protected]>
9164
9165 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
9166 layer_outline_color. Fix it in the definition of the command too.
9167
9168 * Thuban/UI/command.py (Command): Fix typo in doc string
9169
9170 2002-05-22 Bernhard Herzog <[email protected]>
9171
9172 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
9173 in the docstring
9174
9175 2002-05-15 Bernhard Herzog <[email protected]>
9176
9177 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
9178 when the shapefile is empty.
9179 (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
9180 now return None for empty shapefiles. Update doc-strings.
9181
9182 * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
9183 the layer's bbox being None.
9184
9185 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
9186 layer's bbox being None.
9187
9188 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
9189 necessary.
9190 (MapCanvas.__init__): New instance variables, last_selected_layer
9191 and last_selected_shape to determine how the selection has
9192 changed.
9193
9194 * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
9195 AutoSizeColumns because it will cause a traversal of the entire
9196 table which for large .dbf files will take a very long time.
9197
9198 2002-05-14 Bernhard Herzog <[email protected]>
9199
9200 * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
9201 maximum depth for the tree than shapelib does by default.
9202
9203 2002-05-10 Bernhard Herzog <[email protected]>
9204
9205 * setup.py (py_modules): The shptree modules doesn't have a
9206 wrapper, so don't include it in the py_modules
9207
9208 2002-05-08 Bernhard Herzog <[email protected]>
9209
9210 * extensions/shapelib/shptree.c (compare_ints): Make arguments
9211 const void * as in the qsort prototype
9212 (SHPTreeFindLikelyShapes): Remove some unused variables.
9213
9214 * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
9215 maintains to redraw the window during a drag.
9216 (MapCanvas.unprojected_rect_around_point): New method to determine
9217 a small region around a point for hit-testing.
9218 (MapCanvas.find_shape_at): Only test the shapes in a small region
9219 around the point.
9220
9221 * setup.py: Increment the version to 0.1.2
9222
9223 * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
9224 debug print and set session to None after unsubscribing
9225
9226 2002-05-07 Bernhard Herzog <[email protected]>
9227
9228 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
9229 the file to have a .thuban extension.
9230
9231 * Thuban/UI/tree.py (session_channels): New class constant with
9232 all the session channels to subscribe to to update the tree
9233 (SessionTreeCtrl.session_changed): Remember the session so that we
9234 can unsubscribe properly. Use the new class constant to
9235 unsubscribe from the old session and subscribe to the new one.
9236 (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
9237 subscriptions of the SessionTreeCtrl.
9238 (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
9239
9240 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
9241 Session Tree" command to the file menu.
9242
9243 * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
9244 as update_region to the renderer.
9245
9246 * Thuban/UI/renderer.py
9247 (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
9248 update box is now directly a tuple, not a wxRect anymore.
9249
9250 * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
9251 prints.
9252
9253 2002-05-07 Bernhard Herzog <[email protected]>
9254
9255 * setup.py: Add the shptree extension module. See
9256 extensions/pyshapelib/ChangeLog for more details.
9257
9258 * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
9259 extensions/shapelib/dbfopen.c: Really update to the versions of
9260 shapelib 1.2.9. For some reason it wasn't really done on
9261 2002-04-11.
9262
9263 * extensions/shapelib/shptree.c: Modified version of shptree.c of
9264 shapelib 1.2.9. The only real difference is the use of qsort
9265 instead of a bubble sort implementation
9266
9267 * Thuban/Model/layer.py (Layer.__init__): New instance variable
9268 shapetree to hold the shapelib quadtree for the shapefile
9269 (Layer.open_shapefile): Create the quad tree.
9270 (Layer.ShapesInRegion): New method to return the ids of shapes in
9271 a given region using the quad tree.
9272
9273 * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
9274 comment
9275 (draw_polygon_shape): Accept both arcs and polygons.
9276 (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
9277 the api.
9278
9279 * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
9280 return the shape ids to be rendered in a given layer.
9281 (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
9282 ids. Use draw_polygon_shape to draw arc shapes as well.
9283 (ScreenRenderer.RenderMap): New parameter for the rectangle that
9284 has to be updated
9285 (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
9286 calling it's ShapesInRegion method.
9287
9288 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
9289 update_region for the update region.
9290 (MapCanvas.OnPaint): Maintain the update region
9291 (MapCanvas.do_redraw): Pass the bounding box of the update_region
9292 to the renderer when drawing the bitmap. Reset the update_region.
9293
9294 2002-05-03 Bernhard Herzog <[email protected]>
9295
9296 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
9297 MainWindow.OpenSession): Change the file extension of the session
9298 files to .thuban
9299
9300 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
9301 Move the map channels to be forwarded by the session into the
9302 class constant with forwarded_channels. Also add
9303 LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
9304 forwarded_channels
9305
9306 * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
9307 typo and some rewording).
9308
9309 2002-05-02 Bernhard Herzog <[email protected]>
9310
9311 * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
9312 around to speed up most redraws:
9313 (MapCanvas.__init__): New instance variable bitmap which holds the
9314 bitmap
9315 (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
9316 self.bitmap to draw.
9317 (MapCanvas.full_redraw): New method to force a full redraw
9318 including the bitmap
9319 (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
9320 make sure the bitmap is redrawn.
9321 (MapCanvas.projection_changed, MapCanvas.set_view_transform,
9322 MapCanvas.shape_selected): Call full_redraw instead of readraw to
9323 make sure the bitmap is redrawn.
9324 (MapCanvas.OnSize): New method to handle size events so that the
9325 bitmap can be redrawn.
9326
9327 2002-04-29 Bernhard Herzog <[email protected]>
9328
9329 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
9330 canvas' VIEW_POSITION event
9331 (MainWindow.view_position_changed): Handler for VIEW_POSITION.
9332 Update the text in the status-bar accordingly.
9333
9334 * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
9335 (MapCanvas.__del__): Implement because Publisher.__del__ has to be
9336 called.
9337 (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
9338 current_position
9339 (MapCanvas.set_current_position): New method to set
9340 current_position. Issue a VIEW_POSITION event
9341 (MapCanvas.CurrentPosition): New public method to return the value
9342 of current_position. Should be called when the VIEW_POSITION event
9343 is processed.
9344 (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
9345 Update the position.
9346 (MapCanvas.OnLeaveWindow): Set the position to None.
9347
9348 * Thuban/UI/messages.py (VIEW_POSITION): New message for the
9349 position in the statusbar
9350
9351 2002-04-26 Frank Koormann <[email protected]>
9352
9353 * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
9354
9355 2002-04-24 Frank Koormann <[email protected]>
9356
9357 * Resources/Bitmaps/identify.xpm: shadow added
9358
9359 * Resources/Bitmaps/fullextent.xpm: new
9360
9361 2002-04-22 Jan-Oliver Wagner <[email protected]>
9362
9363 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
9364 box
9365
9366 2002-04-21 Jan-Oliver Wagner <[email protected]>
9367
9368 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
9369
9370 * Thuban/UI/tree.py (update_tree): added added map extent
9371
9372 * Thuban/UI/mainwindow.py (_method_command): extended by parameter
9373 icon; added map_full_extend as tool
9374
9375 2002-04-19 Jan-Oliver Wagner <[email protected]>
9376
9377 * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
9378 saving _new_ sessions
9379
9380 * Thuban/Model/session.py (create_empty_session): new session
9381 don't have a filename (set to None)
9382
9383 * Thuban/UI/tree.py (update_tree): added filename and modified flag
9384
9385 * Thuban/Model/load.py (ProcessSession): convert projection
9386 parameters from unicode to regular string
9387
9388 * Data/iceland_sample.session: Added UTM Zone 26 projection.
9389
9390 2002-04-11 Bernhard Herzog <[email protected]>
9391
9392 * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
9393 extensions/shapelib/dbfopen.c: Update to the versions of shapelib
9394 1.2.9
9395
9396 * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
9397 the pyshapelib directoy into the list of include dirs, so that
9398 pyshapelib_api.h can be found.
9399
9400 * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
9401 holds the pyshapelib C-API
9402 (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
9403 pyshapelib_api to access the shapelib functions.
9404 (initwxproj): Import the c_api from the shapelib module and
9405 initialize pyshapelib_api.
9406
9407 2002-04-04 Bernhard Herzog <[email protected]>
9408
9409 * setup.py (thuban_bdist_rpm.initialize_options): Use
9410 initialize_options to create the scripts for the rpm.
9411
9412 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
9413
9414 2002-04-03 Bernhard Herzog <[email protected]>
9415
9416 * setup.py: Increment version to 0.1.1
9417
9418 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
9419 Layer" and "Remove Layer" commands from the layer menu to the map
9420 menu
9421
9422 2002-02-15 Bernhard Herzog <[email protected]>
9423
9424 * Thuban/Model/layer.py (Layer.Shape): list append only takes one
9425 argument (python <= 1.5.2 erroneously accepted multiuple
9426 arguments)
9427
9428 2002-02-04 Bernhard Herzog <[email protected]>
9429
9430 * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
9431 RecordGrid in the identifyview.
9432 (IdentifyView.__init__): Use IdentifyGridCtrl instead of
9433 IdentifyListCtrl. The grid allows editing of the values.
9434
9435 * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
9436 implementing a grid for a single row of a thuban table.
9437
9438 * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
9439 layers by default. Easier to use than the previous default of only
9440 searching through the select layer which meant that if no layer
9441 was selected, you couldn't select a shape.
9442
9443 * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
9444
9445 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
9446 stroke_width attribute
9447
9448 * Thuban/Model/save.py (save_session): Write the new stroke_width
9449 attribute
9450
9451 * Thuban/Model/load.py (ProcessSession.startElement): Read the
9452 stroke_width attribute
9453
9454 * Thuban/Model/layer.py (Layer.__init__): New parameter and
9455 instance variable stroke_width
9456 (Layer.SetStrokeWidth): Set the stroke_width.
9457
9458 2002-02-01 Bernhard Herzog <[email protected]>
9459
9460 * extensions/thuban/wxproj.cpp (project_points): Fix two
9461 off-by-one errors in the last loop that joins the various parts
9462 together.
9463
9464 2002-01-14 Bernhard Herzog <[email protected]>
9465
9466 * setup.py (data_dist.make_distribution): Fix some typos
9467
9468 2001-09-18 Bernhard Herzog <[email protected]>
9469
9470 * README: Slight tweaking in preparation for the 0.1 release
9471
9472 * setup.cfg: Add section for sdist to create both tgz and zip
9473 archives
9474
9475 * setup.py: increase version number to 0.1
9476 (data_dist): New command class for data distribution
9477
9478 2001-09-14 Bernhard Herzog <[email protected]>
9479
9480 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
9481 Handle the case of no layer (i.e. layer is None) properly.
9482
9483 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
9484 Set the initial selection of the combo boxes to reflect the
9485 projection we're starting with in a way that works on windows,
9486 too.
9487
9488 * Thuban/Lib/connector.py (Connector.print_connections): Print the
9489 puiblisher's ids in hex to make it easier to compare them to the
9490 standard repr of python methods
9491
9492 * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
9493 messages
9494
9495 2001-09-13 Bernhard Herzog <[email protected]>
9496
9497 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
9498 deselect the layer if no layer is selected
9499
9500 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
9501 idle time when there actually is something to draw. If there's
9502 nothing to draw simply clear the window
9503 (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
9504 (MapCanvas.SetMap): force a redraw in all cases because
9505 FitMapToWindow doesn't always do it.
9506 (MapCanvas.ZoomFactor): Add an optional parameter, center, to
9507 specify the point to move into the center of the window
9508 (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
9509 dragged, zoon in/out by a factor of 2
9510 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
9511 index, i.e. reversed drawing order) so that objects appearing to
9512 be in from of others are selected first. This is probably mostly
9513 relevant for point shapes where the symbols used may overlap
9514
9515 * Thuban/Model/session.py (create_empty_session): Unset the
9516 modified bit before returning it
9517
9518 * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
9519 create_empty_session session to create the new, empty session.
9520
9521 * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
9522 the tool bitmaps.
9523 (MainWindow.OnClose, MainWindow.save_modified_session): Separate
9524 the code that asks whether the session should be saved into the
9525 new method save_modified_session.
9526 (MainWindow.OpenSession, MainWindow.NewSession): Use the new
9527 method to save modified session here too.
9528
9529 2001-09-11 Bernhard Herzog <[email protected]>
9530
9531 * setup.py (InnoIconItem): fix typo
9532
9533 (thuban_bdist_inno.run):
9534 (bdist_inno.run): Move the decision not to create symlinks on
9535 non-nt platforms to thuban_bdist_inno and do it unconditinally
9536 since we never want to create the symlinks here
9537
9538 2001-09-10 Bernhard Herzog <[email protected]>
9539
9540 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
9541 identify view immediately
9542
9543 * Thuban/UI/controls.py: New file with two classes RecordListCtrl
9544 and SelectableRecordListCtrl that implement the code shared by the
9545 identify view and the label dialog
9546
9547 * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
9548 new class RecordListCtrl
9549
9550 * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
9551 return value of GetValue is None instead of using it as a boolean
9552 directly so that Zero numbers are handled properly.
9553 (LabelListCtrl): Derive from the new class
9554 SelectableRecordListCtrl
9555
9556 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
9557 (Proj4Dialog.dialogLayout): Make the window resizable and set the
9558 size of the text control explicitly to make the sizers work on
9559 both Windows and X.
9560
9561 2001-09-07 Bernhard Herzog <[email protected]>
9562
9563 * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
9564 that can limit the search to the currently selected layer.
9565 (MapCanvas.SelectShapeAt): Make sure that the currently selected
9566 layer stays selected even when no shape is found
9567 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
9568 height do nothing (avoids zero division errors)
9569
9570 2001-09-06 Bernhard Herzog <[email protected]>
9571
9572 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
9573 Correct the spelling of SessionTreeCtrl. dabbrev is too damn
9574 convenient :-)
9575 (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
9576 a new instvar layer_to_item to map layers to tree items
9577 (SessionTreeCtrl.layer_selected): Select the appropriate tree item
9578 to match the current selection in the interactor
9579
9580 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
9581 (Interactor.HasSelectedLayer): New methods to query the current
9582 selection
9583
9584 * Thuban/UI/mainwindow.py (MainWindow.current_layer):
9585 (MainWindow.has_selected_layer): Simply call the appropriate
9586 interactor method
9587
9588 * Thuban/UI/mainwindow.py (MainWindow.__init__):
9589 (MainWindow.LayerShowTable):
9590 (MainWindow.identify_view_on_demand): Store the interactor in an
9591 instvar and use that reference instead of going through main.app
9592
9593 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
9594 * Thuban/UI/application.py (ThubanApplication.OnInit):
9595 * Thuban/UI/main.py (main): Create the session tree view in main
9596 with the new mainwindow method ShowSessionTree and not directly
9597 the application's OnInit method
9598
9599 * Thuban/UI/tree.py (myTreeCtrlPanel):
9600 (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
9601 TreeCtrl isntead of a panel. This affects most method since we now
9602 refer to self instead of self.tree
9603 (SessionTreeView): New class implementing a non-modal dialog
9604 showing the session tree.
9605
9606 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
9607 layer to the tableview dialog.
9608
9609 * Thuban/UI/tableview.py: Add some doc-strings
9610 (TableGrid):
9611 (TableGrid.OnRangeSelect):
9612 (TableGrid.OnSelectCell):
9613 (TableFrame.__init__):
9614 (TableFrame.row_selected):
9615 Selecting rows in the grid view now updates the selected shapes
9616 through the TableFrame. To achieve this we derive TableGrid from
9617 Publisher and introduce the message type ROW_SELECTED which the
9618 TableFrame subscribes to and which is issued by OnRangeSelect and
9619 OnSelectCell
9620
9621 (DataTable.SelectRow): Removed because it's no longer needed in
9622 the row/shape selection scheme
9623
9624 * Thuban/UI/dialogs.py: New file implementing common classes for
9625 dialogs
9626
9627 * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
9628 the SELECTED_SHAPE message anymore. This is now handled by the
9629 parent.
9630 (TableGrid.select_shape): Only update the selection if the shape
9631 is not None.
9632 (TableFrame): Inherit from the new NonModalDialog class.
9633 (TableFrame.__init__, TableFrame.select_shape): Handle the
9634 SELECT_SHAPE message.
9635 (TableFrame.OnClose): Extend the inherited method to unsubscribe
9636 SELECT_SHAPE
9637
9638 * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
9639 (MainWindow.add_dialog):
9640 (MainWindow.dialog_open):
9641 (MainWindow.remove_dialog):
9642 (MainWindow.get_open_dialog): New methods to maintain a dictionary
9643 of opened non-modal dialogs.
9644
9645 (MainWindow.__init__): Initialize the new non-modal dictionary
9646 management code
9647 (MainWindow.LayerShowTable): maintain separate dialogs for each
9648 table using the non-modal dialog management code to only open a
9649 view once for each table.
9650
9651 (MainWindow.IdentifyTool):
9652 (MainWindow.__init__):
9653 (MainWindow.identify_view_on_demand): Don't open the identify view
9654 in IdentifyTool anymore. This will be done automatically by the
9655 new method identify_view_on_demand which handles the
9656 SELECTED_SHAPE message so that the identify view will be opened on
9657 demand
9658
9659 * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
9660 the interactor argument. The SELECTED_SHAPE message is now handled
9661 by the parent.
9662 (IdentifyView.__init__): Add the interactor argument so that we
9663 can handle the SELECTED_SHAPE message here
9664 (IdentifyView.selected_shape): New method to handle the
9665 SELECTED_SHAPE messages
9666
9667 * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
9668 NonModalDialog class
9669 (IdentifyView.OnClose): Extend the inherited version to
9670 unsubscribe SELECT_SHAPE
9671
9672 * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
9673
9674 2001-09-05 Bernhard Herzog <[email protected]>
9675
9676 * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
9677
9678 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
9679 interactor to pass through to the MapCanvas
9680
9681 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
9682 argument to the MainWindow constructor to get rid of the ugly hack
9683 that made main.app available early just so that the mapcanvas
9684 could access the interactor object.
9685
9686 2001-09-04 Bernhard Herzog <[email protected]>
9687
9688 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
9689 that runs a modal message box
9690 (MainWindow.OnClose): Use the new method
9691 (MainWindow.RemoveLayer): Just do nothing in case no layer is
9692 selected. The command should be grayed out anyway, so there's no
9693 need to pop up a message box.
9694 (MainWindow.AddLayer): Pop up a message box with an error message
9695 if the shape file can't be opened
9696
9697 * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
9698 immediately. This will cause an exception in case the file can't
9699 be opened and we can display an appropriate message.
9700
9701 * MANIFEST.in: Add extensions/pyprojection/LICENSE
9702
9703 * setup.py (thuban_bdist_rpm): New class implementing a Thuban
9704 specific bdist_rpm command.
9705
9706 * Thuban/UI/main.py: Catch ImportError exceptions when importing
9707 the locale module because it may not be available on some
9708 installations.
9709
9710 * extensions/pyprojection/LICENSE: Copy of the license text in
9711 Projection.i. Having it in a separate file makes it easier to
9712 refer to license text in e.g. RPMs
9713
9714 2001-09-03 Bernhard Herzog <[email protected]>
9715
9716 * setup.py: use wx-config instead of wxgtk-config because it's
9717 more generic
9718
9719 * setup.py (ThubanInstall.get_outputs): Add the symlink in
9720 <prefix>/bin to the outputs
9721 (ThubanInstall.link_file): New method to link files. We need this
9722 because the standard copy_files refuses to link non-existing
9723 files.
9724 (ThubanInstall.run): Remove the leading install root from the
9725 script filename if an install root was specified and use the new
9726 link_file method
9727
9728 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
9729 the window when the first layer is added to the map.
9730
9731 * setup.py (ThubanInstall.run): Honor the build root (self.root)
9732 when linking thuban.py to <prefix>/bin
9733
9734 2001-08-31 Bernhard Herzog <[email protected]>
9735
9736 * setup.py: In the setup call, the install parameters shouldn't
9737 have trailing slashes because distutils on non-posix platforms
9738 doesn't like that. The same applies to other directories like
9739 "Resources/Bitmaps"
9740
9741 In the configuration section for nt, move the wxWindows directory
9742 optins into the part clearly marked as editable.
9743
9744 (InstallLocal.initialize_options):
9745 (InstallLocal.user_options): remove the currently unused debug
9746 flag
9747 (thuban_build_py.find_all_modules): Add this method so that it
9748 works for our case of having packages and modules in one
9749 distribution as well.
9750 (ThubanInstall.initialize_options):
9751 (ThubanInstall.finalize_options):
9752 (ThubanInstall.user_options):
9753 (ThubanInstall.boolean_options): Add new options, do-symlink and
9754 extra files. Since these are the first ThubanInstall specific
9755 options, override user_options and boolean_options
9756 (ThubanInstall.run): Honor the new do-symlink and extra-files
9757 options.
9758 (ThubanInstall.get_outputs): Add to override the base-class's
9759 version and add the extra-files to the outputs
9760 (bdist_inno): New class for windows distributions with Inno Setup
9761 (InnoIconItem): Helper class for bdist_inno
9762 (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
9763 this together with the appropriate parameters, to the setup call.
9764
9765 * setup.cfg (bdist_inno): added new section for the inno setup
9766 installer
9767
9768 * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
9769 changing_selection to avoid recursive selection events when
9770 modifying the selection in response to a selection event.
9771 (myTreeCtrlPanel.normalize_selection): Set the new inst var when
9772 changing the tree's selection.
9773 (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
9774 we're not being called indirectly from normalize_selection.
9775
9776 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
9777 event.Check only if the command is actuall checkable.
9778 (MainWindow.__init__): Call the toolbar's Realize method to make
9779 sure that the items are actually shown
9780
9781 2001-08-28 Bernhard Herzog <[email protected]>
9782
9783 * setup.py: Fix some doc strings
9784
9785 * ChangeLog: started
9786

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26