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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2250 - (show annotations)
Wed Jun 16 11:01:42 2004 UTC (20 years, 9 months ago) by jschuengel
Original Path: trunk/thuban/ChangeLog
File size: 378375 byte(s)
Add a sample and make some changes.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26