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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.59  
changed lines
  Added in v.2087

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26