/[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 1112 by bh, Fri May 30 09:55:04 2003 UTC revision 2055 by frank, Fri Feb 6 08:42:03 2004 UTC
# Line 1  Line 1 
1    2004-02-06  Frank Koormann  <[email protected]>
2    
3            * po/pt_BR.po: Fixed charset
4    
5    2004-02-05  Frank Koormann  <[email protected]>
6    
7            * po/pt_BR.po: Fixed format string for error message, missing %s
8            added (Thuban/UI/application.py:273)
9    
10    2004-02-03  Frank Koormann  <[email protected]>
11            
12            First version of Portuguese (Brazilian) translation
13    
14            * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
15            Brazilian Portuguese by Eduardo Patto Kanegae.
16    
17            * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
18            translators.
19    
20    
21    2004-01-22  Frank Koormann  <[email protected]>
22    
23            * Doc/manual/thuban-manual.xml: Added section on installation of
24            Thuban under Win32 systems. Fixed image path references in the postgis
25            section. Some minor source formattings.
26    
27    2004-01-21  Frank Koormann  <[email protected]>
28    
29            Make Thuban remember path selections (at least for one application run).
30    
31            * Thuban/UI/application.py (Application.OnInit): Initialize path as a
32            attribute of application object. Path is a dictionary of
33            strings, currently with the items "data" and "projection".  
34            (Application.SetPath): New, stores path for the specified item.
35            (Application.Path): New, return path for the specified item.
36    
37            * Thuban/UI/mainwindow.py
38            (MainWindow.OpenSession, MainWindow.SaveSessionAs,
39            MainWindow.AddLayer, MainWindow.AddRasterLayer,
40            MainWindow.TableOpen): Access "data" path information of the
41            application.
42            
43            * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
44            Access "projection" path information of the application.
45    
46    2004-01-05  Bernhard Herzog  <[email protected]>
47    
48            * po/ru.po: Updated translations from Alex Shevlakov
49    
50    2004-01-05  Bernhard Herzog  <[email protected]>
51    
52            * po/Makefile, po/README: Move the description of how to generate
53            the translation statistics to the README.
54    
55    2003-12-23  Bernhard Herzog  <[email protected]>
56    
57            * NEWS: Update for 1.0.0
58    
59            * po/it.po: Another update from Maurizio Napolitano
60    
61    2003-12-23  Bernhard Herzog  <[email protected]>
62    
63            * po/it.po: Updated translation from Maurizio Napolitano
64    
65    2003-12-23  Bernhard Herzog  <[email protected]>
66    
67            * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
68            for translation
69    
70            * Thuban/UI/mainwindow.py (MainWindow.TableRename)
71            (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
72            strings for translation
73    
74            * po/de.po: Update with the newly marked strings.
75    
76    2003-12-22  Bernhard Herzog  <[email protected]>
77    
78            * HOWTO-Release: Fix the places where version numbers have to be
79            updated
80    
81    2003-12-22  Bernhard Herzog  <[email protected]>
82    
83            * setup.py (setup call): 1.0.0, yeah!
84    
85            * Thuban/version.py (longversion): 1.0.0, yeah!
86    
87            * Thuban/Model/load.py (SessionLoader.__init__): Accept the
88            1.0.0 namespace too
89    
90            * Thuban/Model/save.py (SessionSaver.write_session): Save with
91            1.0.0 namespace
92    
93            * test/test_load.py (LoadSessionTest.dtd)
94            (TestSingleLayer.file_contents)
95            (TestNonAsciiColumnName.file_contents)
96            (TestLayerVisibility.file_contents)
97            (TestClassification.file_contents, TestLabels.file_contents)
98            (TestLayerProjection.file_contents)
99            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
100            (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
101            (TestPostGISLayerPassword.file_contents)
102            (TestLoadError.file_contents, TestLoadError.test): Update for
103            1.0.0 namespace
104    
105            * test/test_save.py (SaveSessionTest.dtd)
106            (SaveSessionTest.testEmptySession)
107            (SaveSessionTest.testSingleLayer)
108            (SaveSessionTest.testLayerProjection)
109            (SaveSessionTest.testRasterLayer)
110            (SaveSessionTest.testClassifiedLayer)
111            (SaveSessionTest.test_dbf_table)
112            (SaveSessionTest.test_joined_table)
113            (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
114    
115    2003-12-22  Bernhard Herzog  <[email protected]>
116    
117            * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
118            alignment flags are byte strings not unicode and that they have
119            valid values
120    
121            * test/test_load.py (TestLabelLayer): New. Test loading (and
122            indirectly saving) of maps with labels.
123    
124    2003-12-22  Bernhard Herzog  <[email protected]>
125    
126            * Thuban/UI/tableview.py (TableGrid.OnDestroy)
127            (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
128            unsubscribe all subscribers.
129            (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
130            self.grid since it may already have been destroyed.
131            Fixes RT #2256
132    
133    2003-12-19  Bernhard Herzog  <[email protected]>
134    
135            * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
136    
137    2003-12-16  Bernhard Herzog  <[email protected]>
138            
139            * debian/bitmappath.patch, debian/setup.py.patch:
140                    added to ensure compliance with FHS for debian
141            * debian/rules, debian/changelog:
142                added patches in rules to ensure compliance with FHS for debian
143    
144    2003-12-16  Bernhard Herzog  <[email protected]>
145    
146            * po/Makefile (mo): Make the output a bit nicer so that it prints
147            statistics about the translations. Add a comment how produce even
148            nicer statistics with sed.
149    
150    2003-12-09  Frank Koormann   <[email protected]>
151    
152            * Resources/Projections/defaults.proj:
153            French projection sample with correct accents (UNICODE).
154    
155    2003-12-05  Bernhard Herzog  <[email protected]>
156    
157            * MANIFEST.in: Add the devtools directory
158    
159            * setup.py (setup call): Use license instead of licence. This
160            silences a deprecation warning on Python 2.3
161    
162    2003-12-05  Frank Koormann   <[email protected]>
163    
164            Documentation synced with 1.0rc1
165    
166            * Doc/manual/thuban-manual.xml:
167            Minor formatting changes and references to database layers .
168            Introduction.Internationalization: New section on i18n.
169            MapManagement.AddingandRemovingLayers: Added item on database layers.  
170            MapManagement.TheLegend: Added section and screenshot on popup menu.
171            ProjectionManagement: Updated screenshot and sentence on EPSG.
172            Appendix.SupportedDataSources: Added PostGIS.
173            Appendix.WorkingwithPostGIS: New section.
174    
175            * Doc/manual/images/6_projection.png: Updated screenshot including
176            EPSG checkboxes.
177    
178            * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
179    
180            * Doc/manual/images/app_postgis_add_layer.png,
181            Doc/manual/images/app_postgis_db_add.png,
182            Doc/manual/images/app_postgis_db_management.png:
183            New screenshots focussing on database layers
184    
185    2003-12-05  Frank Koormann   <[email protected]>
186    
187            * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
188            write warning to stderr instead of rising a warning dialog
189    
190    2003-12-03  Bernhard Herzog  <[email protected]>
191    
192            Fix for RT #2243
193    
194            * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
195            New. Like has_selected_layer but for shape layers only
196            (_has_selected_shape_layer): New. Like _has_selected_layer but for
197            shape layers only
198            (layer_show_table command, layer_jointable command): Use these
199            commands should only be available for shape layers
200    
201    2003-12-03  Bernhard Herzog  <[email protected]>
202    
203            * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
204            publishers that are wx objects and may have been destroyed by wx
205            already. Fixes RT #2242.
206    
207    2003-12-03  Bernhard Herzog  <[email protected]>
208    
209            * po/ru.po: Updates from Alex Shevlakov
210    
211    2003-12-03  Silke Reimer <silkeintevation.de>
212    
213            * debian/control, debian/changelog: Added gdal-support to
214                    debian package, updated to new thuban version
215    
216    
217    2003-12-03  Bernhard Herzog  <[email protected]>
218    
219            * Thuban/Lib/version.py: New. Module for version number
220            manipulations. The version of make_tuple here also deals better
221            with more unusual version number strings, such as e.g.
222            "1.2+cvs20031111"
223    
224            * Thuban/version.py (make_tuple): Removed. It's now in
225            Thuban.Lib.version. Use that implementation instead.
226    
227            * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
228    
229    2003-12-02  Bernhard Herzog  <[email protected]>
230    
231            * MANIFEST.in: Add debian files
232    
233            * setup.py (setup call): Add packages for the Extensions so that
234            they're installed too
235            (data_files): Add READMEs and sample data from some Extensions
236    
237            * NEWS: Add note about the extensions in binary packages
238    
239    2003-12-02  Bernhard Herzog  <[email protected]>
240    
241            * Thuban/Model/save.py (SessionSaver.write_session): Save files
242            with the thuban-1.0rc1
243    
244            * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
245            thuban-1.0rc1 namespace too
246    
247            * test/test_save.py (SaveSessionTest.dtd)
248            (SaveSessionTest.testEmptySession)
249            (SaveSessionTest.testSingleLayer)
250            (SaveSessionTest.testLayerProjection)
251            (SaveSessionTest.testRasterLayer)
252            (SaveSessionTest.testClassifiedLayer)
253            (SaveSessionTest.test_dbf_table)
254            (SaveSessionTest.test_joined_table)
255            (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
256            namespace
257    
258            * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
259            namespace
260            (TestSingleLayer.file_contents)
261            (TestNonAsciiColumnName.file_contents)
262            (TestLayerVisibility.file_contents)
263            (TestClassification.file_contents, TestLabels.file_contents)
264            (TestLayerProjection.file_contents)
265            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
266            (TestPostGISLayer.file_contents)
267            (TestPostGISLayerPassword.file_contents)
268            (TestLoadError.file_contents, TestLoadError.test): Update to
269            thuban-1.0rc1 namespace
270    
271    2003-12-01  Bernhard Herzog  <[email protected]>
272    
273            * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
274            nt to better match Intevation's current w32 setup
275    
276            * HOWTO-Release: Add note about updating MANIFEST.in
277    
278            * MANIFEST.in: Add the Extensions
279    
280            * NEWS: Update for 1.0rc1
281    
282    2003-12-01  Bernhard Herzog  <[email protected]>
283    
284            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
285            cards for the dialog so that shapefiles ending in all uppercase
286            SHP are listed too
287    
288    2003-11-28  Bernhard Herzog  <[email protected]>
289    
290            * Thuban/version.py (longversion): Update to 1.0rc1
291    
292            * setup.py (setup call): Update version to 1.0rc1. Use the
293            [email protected] email address as author email instead of my
294            personal one.
295    
296    2003-11-28  Bernhard Herzog  <[email protected]>
297    
298            * po/de.po: Update german translation.
299    
300    2003-11-28  Bernhard Herzog  <[email protected]>
301    
302            Unify the filenames stored in .thuban files so that the .thuban
303            files are more platform independend
304    
305            * Thuban/Model/save.py (unify_filename): New. Unify filenames so
306            that they can be used on both windows and unix
307            (SessionSaver.prepare_filename): New. Handle all filename
308            transformations for filenames stored in the thuban file
309            (SessionSaver.write_data_containers, SessionSaver.write_layer):
310            Use prepare_filename
311    
312            * test/test_save.py (SaveSessionTest.testSingleLayer)
313            (SaveSessionTest.testLayerProjection)
314            (SaveSessionTest.testRasterLayer)
315            (SaveSessionTest.testClassifiedLayer)
316            (SaveSessionTest.test_dbf_table)
317            (SaveSessionTest.test_joined_table): Filenames are always stored
318            with slashes on all currently supported platforms so adapt all
319            tests to this
320    
321            * test/test_load.py (LoadSessionTest.filenames): With the new
322            filename scheme the filenames in the tests should be
323            understandable on all currently supported platforms so we turn
324            this into an empty list because we don't have to normalize them
325            anymore
326    
327    2003-11-28  Bernhard Herzog  <[email protected]>
328    
329            * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
330            Add the ellipsoid to the projection since some Proj versions
331            complain if it's missing.
332    
333    2003-11-27  Bernhard Herzog  <[email protected]>
334    
335            Corect some bounding box projection problems
336    
337            * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
338            version of ForwardBBox
339            (Projection._transform_bbox): New. common implementation of
340            ForwardBBox and InverseBBox
341            (Projection.ForwardBBox): Use _transform_bbox.
342    
343            * test/test_proj.py (TestProjection.test): Add test for
344            InverseBBox
345    
346            * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
347            (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
348            new InverseBBox method to determine the unprojected bounding box
349            (Layer.ShapesInRegion): Use the ForwardBBox method to project the
350            bbox.
351    
352            * test/test_layer.py (TestLayer.test_point_layer_with_projection):
353            Removed.
354            (TestLayer.test_arc_layer_with_projection): New. This test is
355            better able to test whether bounding boxes are projected correctly
356            than test_point_layer_with_projection
357    
358            * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
359            InverseBBox to unproject bboxes
360    
361    2003-11-25  Bernhard Herzog  <[email protected]>
362    
363            * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
364            source code.
365    
366    2003-11-25  Bernhard Herzog  <[email protected]>
367    
368            * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
369            there for backwards compatibility and all code relying on that
370            should have been updated by now.
371    
372    2003-11-25  Bernhard Herzog  <[email protected]>
373    
374            * test/test_load.py (TestClassification.test): Add the missing
375            round trip test.
376            (TestClassification.file_contents): Update to the newest file
377            format
378    
379    2003-11-25  Bernhard Herzog  <[email protected]>
380    
381            Add very experimental (and possibly dangerous) extension to draw
382            polygons:
383    
384            * Extensions/drawshape/README: New. Brief installation
385            instructions
386    
387            * Extensions/drawshape/drawshape.py: New. Implementation of the
388            drawshape extensions
389    
390            * Extensions/drawshape/patch.diff: Patch to apply before the
391            extension can be used.
392    
393    2003-11-24  Bernhard Herzog  <[email protected]>
394    
395            * Thuban/Model/data.py (ShapefileStore._open_shapefile)
396            (ShapefileStore.__init__): Factor opening the shapefile into a
397            separate method (the new _open_shapefile). This makes the code a
398            bit more readable but the real reason is that it makes some evil
399            hacks easier. :-)
400    
401    2003-11-24  Bernhard Herzog  <[email protected]>
402    
403            * Thuban/Model/load.py (SessionLoader.check_attrs): If no
404            converter is specified for an attribute assume it's a string
405            containing only Latin1 characters. Update doc-string accordingly.
406            This change should fix many places where unicode objects might
407            accidentally enter Thuban.
408    
409            * test/test_load.py (TestNonAsciiColumnName): New test to check
410            what happens with column names in DBF files that contain non-ascii
411            characters
412    
413    2003-11-21  Bernhard Herzog  <[email protected]>
414    
415            Enable the experimental attribute editing again and introduce a
416            command line switch to actually activate it
417    
418            * Thuban/UI/main.py (options): New. Container for options set on
419            the commmand line
420            (main): Add the --enable-attribute-editing flag.
421    
422            * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
423            editing is enabled use the grid ctrl which allows editing of the
424            values
425    
426            * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
427            New. Just delegate this to the underlying table.
428    
429    2003-11-20  Bernhard Herzog  <[email protected]>
430    
431            * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
432            Skip this test if run under non-posix systems since it only works
433            there
434    
435    2003-11-19  Bernhard Herzog  <[email protected]>
436    
437            * Thuban/Model/resource.py: Rework the way gdal support is
438            determined so that we can give a reason in the about why gdal is
439            not supported.
440            (gdal_support_status): New. Variable holding a string with the
441            reason for no gdal support
442    
443            * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
444            not supported to the message
445    
446    2003-11-19  Bernhard Herzog  <[email protected]>
447    
448            Remove the old table interface and its test cases
449    
450            * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
451            (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
452            anymore
453    
454            * Thuban/Model/transientdb.py (TransientTableBase)
455            (AutoTransientTable): Do not derive from OldTableInterfaceMixin
456            anymore
457    
458            * test/test_table.py: Removed since the old interface it tests is
459            gone.
460    
461            * test/runtests.py (main): The old table interface is gone and
462            with it the deprecation warnings so remove the code that turns
463            these warnings into errors
464    
465    2003-11-19  Bernhard Herzog  <[email protected]>
466    
467            * test/test_table.py: Revert to revision 1.5 again. Changing the
468            tests to use the new table interface is completely wrong since the
469            whole purpose of the tests in this module is to test the old
470            interface.
471    
472    2003-11-18  Bernhard Herzog  <[email protected]>
473    
474            * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
475            New. Test whether the connection matches a set of connection
476            parameters
477    
478            * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
479            (DBFrame.OnAdd): Use the new MatchesParameters method when looking
480            for existing connections with the same parameters and break out of
481            the loop correctly.
482    
483            * test/test_postgis_db.py (TestBriefDescription)
484            (TestPostGISSimple.test_brief_description): Rename
485            TestBriefDescription to TestPostGISSimple and the test method to
486            test_brief_description so that we can add more test methods.
487            (TestPostGISSimple.test_matches_parameters): New. Test the new
488            MatchesParameters method
489    
490    2003-11-18  Bernhard Herzog  <[email protected]>
491    
492            * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
493            _was_destroyed, to indicate whether an publisher instance has
494            already been destroyed.
495            (Publisher.Unsubscribe): Only disconnect if the publisher has not
496            been destroyed yet.
497            (Publisher.Destroy): Set the _was_destroyed flag to true.
498    
499            * test/test_connector.py
500            (TestPublisher.test_unsubscribe_after_destroy): New. Test that
501            calling Unsubscribe after Destroy doesn't raise an exception
502    
503    2003-11-14  Bernhard Herzog  <[email protected]>
504    
505            * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
506            typo in doc-string
507    
508    2003-11-13  Bernhard Herzog  <[email protected]>
509    
510            Quote table and column names properly for postgis.
511    
512            * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
513            quote an identifier for use in an sql statement
514            (PostGISColumn.__init__): Add the quoted_name attribute
515            (PostGISTable.__init__): New instance variable quoted_tablename
516            (PostGISTable._fetch_table_information): Use the quoted table
517            name. New isntance variable quoted_geo_col with a quoted version
518            of geometry_column
519            (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
520            (PostGISTable.RowOrdinalToId): Use the quoted table name
521            (PostGISTable.ReadValue, PostGISTable.ValueRange)
522            (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
523            (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
524            (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
525            Use quoted table and column names
526    
527            * test/test_postgis_db.py (TestPostGISSpecialCases)
528            (TestPostGISIgnoredColumns): Rename the class to
529            TestPostGISSpecialCases because that better describes the new
530            cases
531            (TestPostGISSpecialCases.test_unsupported_types)
532            (TestPostGISSpecialCases.test): Rename the method to
533            test_unsupported_types because we need a more descriptive name now
534            that there are more methods
535            (TestPostGISSpecialCases.test_table_name_quoting)
536            (TestPostGISSpecialCases.test_column_name_quoting)
537            (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
538            cases to test quoting of table and column names in PostGISTable
539            and PostGISShapeStore
540    
541            * test/postgissupport.py
542            (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
543            AddGeometryColumn desn't support table or column names with sapces
544            or double quotes
545    
546    2003-11-12  Jan-Oliver Wagner <[email protected]>
547    
548            * Extensions/wms/__init__.py: New: Init to make this
549            directory a package.
550    
551            * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
552    
553    2003-11-11  Bernhard Herzog  <[email protected]>
554    
555            * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
556            Constant for the file woth deprecated epsg projections
557            (get_system_proj_file): Update doc-string
558    
559            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
560            above the EPS widgets, introduce a check box for the deprecated
561            eps projections and a label for the epsg widgets
562            (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
563            too
564    
565    2003-11-11  Bernhard Herzog  <[email protected]>
566    
567            Avoid warnings when run under Python 2.3
568    
569            * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
570            (BaseRenderer.draw_label_layer): Coordinates must be ints.
571    
572            * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
573            real method so that we can convert to int.
574            (MapRenderer.label_font): The font size mist be an int.
575    
576            * Thuban/UI/common.py (Color2wxColour): The color values must be
577            ints. Also, remove the unnecessary asserts.
578    
579            * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
580            (TestUnicodeStrings.test): Python source code should not contain
581            non-ascii characters unless an encoding is specified in the file.
582            Therefore use \x escapes in the string literals for non-ascii
583            characters.
584    
585    2003-11-11  Bernhard Herzog  <[email protected]>
586    
587            * Thuban/Model/resource.py (get_system_proj_file): Add a filename
588            parameter so that this function can be used for all proj files in
589            Resource/Projections
590            (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
591            get_system_proj_file
592    
593            * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
594            ProjFile self.__sysProjFile use a dictionary of system ProjFile
595            objects self._sys_proj_files
596            (ProjFrame.build_dialog): Adapt to the new changes in the
597            ProjectionList constructor. Add a check button to toggle whether
598            EPSG projections are shown
599            (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
600            events.
601            (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
602            the busy cursor if the files have not yet been loaded by the
603            dialog.
604            (ProjFrame.load_system_proj): Add a parameter for the name of the
605            proj file. Maintain the dictionary of system projections
606            self._sys_proj_files
607    
608            * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
609            user_projs parameters into one parameter proj_files which is a
610            list of proj files.
611            (ProjectionList._subscribe_proj_files)
612            (ProjectionList._unsubscribe_proj_files): New. Move
613            subscription/unsubscription of projfile messages to separate
614            methods
615            (ProjectionList.Destroy): The unsubscribe is now done in
616            _unsubscribe_proj_files
617            (ProjectionList.update_projections): We now have a list of proj
618            file objects
619            (ProjectionList.SetProjFiles): New method to set a new list of
620            proj file objects
621    
622            * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
623            Specify explicitly which system proj file to load.
624    
625    2003-11-11  Bernhard Herzog  <[email protected]>
626    
627            * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
628            instance variables to cut cyclic references. The GC would have
629            collected the loader eventually but it can happen that it doesn't
630            run at all until thuban is closed (2.3 but not 2.2 tries a bit
631            harder and forces a collection when the interpreter terminates)
632            (load_session): Call the handler's Destroy method to make sure
633            that it gets garbage collected early. Otherwise it will be
634            collected very late if at all and it holds some references to e.g.
635            shapestores and the session which can lead to leaks (of e.g. the
636            temporary files)
637    
638            * test/test_load.py (TestSingleLayer.test_leak): New. test for the
639            resource leak in load_session
640    
641    2003-11-10  Bernhard Herzog  <[email protected]>
642    
643            * Thuban/UI/baserenderer.py: Add a way to specify how layers in
644            extensions are to be rendered.
645            (_renderer_extensions): New. List with renderer for layers in
646            extensions
647            (add_renderer_extension): New. Add a renderer extension
648            (init_renderer_extensions): New. Init the renderer extensions
649            (BaseRenderer.render_map_incrementally): Search
650            _renderer_extensions for how to draw unknown layer types
651            (BaseRenderer.draw_raster_data): Add format parameter so that
652            formats other than BMP can be drawn
653            (BaseRenderer.draw_raster_layer): Pass an explicit format to
654            draw_raster_data
655    
656            * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
657            strings of the format parameter of draw_raster_data method to wx
658            constants
659            (MapRenderer.draw_raster_data): Add the format parameter and use
660            raster_format_map to map it to the right wxwindows constant for
661            wxImageFromStream
662    
663            * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
664            the format parameter and record it
665            (TestBaseRenderer.test_raster_no_projection): check the format
666            paramter of the draw_raster_data method
667            (TestBaseRenderer.test_renderer_extension): New. Test the renderer
668            extension facility
669    
670    2003-11-07  Bernhard Herzog  <[email protected]>
671    
672            Tweak the usage of the sqlite database to make common use cases
673            more responsive. In most cases copying the data to the sqlite
674            database takes so long that using sqlite doesn't have enough
675            advantages.
676    
677            * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
678            comments about performance and query the min and max in separate
679            statements because only that way will indexes be used.
680            (TransientTableBase.UniqueValues): Add some comments about
681            performance.
682            (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
683            Do not copy the data to the transient DB but use the transient
684            copy if it exists. See the new comments for the performance trade
685            offs
686    
687            * test/test_transientdb.py
688            (TestTransientTable.test_auto_transient_table): Make sure that the
689            data is copied to the transient database at some point.
690    
691    2003-11-03  Bernhard Herzog  <[email protected]>
692    
693            * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
694            globals to locals so that it's a bit faster
695    
696    2003-11-03  Bernhard Herzog  <[email protected]>
697    
698            * Thuban/UI/baserenderer.py
699            (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
700            method. ReadValue is faster than ReadRowAsDict since it only reads
701            one cell especially now that the dbf file objects actually
702            implement it.
703    
704            * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
705            read_attribute method of the dbf objects
706    
707    2003-11-03  Bernhard Herzog  <[email protected]>
708    
709            * Extensions/profiling/profiling.py (popup_dialog_box): New config
710            variable to indicate whether the result should be shown in a
711            dialog box
712            (profile_screen_renderer, time_screen_renderer): Only show a
713            dialog box if popup_dialog_box is true.
714            (profile_screen_renderer): Flush stdout after the printing the
715            first part of the "profiling..." message
716    
717            * Thuban/UI/baserenderer.py
718            (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
719            brushes for the groups so that they're not created over and over
720            again
721    
722            * Thuban/Model/classification.py (Classification.__getattr__)
723            (Classification._compile_classification)
724            (Classification._clear_compiled_classification): New. Methods to
725            manage a 'compiled' representation of the classification groups
726            which is created on demand
727            (Classification.InsertGroup, Classification.RemoveGroup)
728            (Classification.ReplaceGroup): reset the compiled representation
729            (Classification.FindGroup): Use the compiled representation to
730            find the matching group
731            (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
732    
733    2003-10-31  Bernhard Herzog  <[email protected]>
734    
735            * Thuban/Model/classification.py (Classification.SetDefaultGroup):
736            Send a CLASS_CHANGED message
737            (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
738            not return the removed group since it wasn't used.
739    
740            * test/test_classification.py
741            (TestClassification.test_set_default_group): New. Test the
742            SetDefaultGroup method
743            (TestClassification.test_insert_group): New. Test the InsertGroup
744            method
745            (TestClassification.test_remove_group): New. Test the RemoveGroup
746            method
747            (TestClassification.test_replace_group): New. Test the
748            ReplaceGroup method
749    
750    2003-10-31  Bernhard Herzog  <[email protected]>
751    
752            * test/test_classification.py (TestClassification.setUp):
753            Subscribe to the CLASS_CHANGED messages
754            (TestClassification.tearDown): New. Destroy the classification
755            properly
756            (TestClassification.test_defaults): Add tests for the default line
757            width and whether no messages were sent yet
758            (TestClassification.test_set_default_properties): Add tests for
759            messages and setting the default line width
760            (TestClassification.test_add_singleton)
761            (TestClassification.test_add_range)
762            (TestClassification.test_multiple_groups): Add tests for messages
763    
764    2003-10-31  Bernhard Herzog  <[email protected]>
765    
766            Some more refactoring in preparation for new tests:
767    
768            * test/test_classification.py (TestClassification.setUp): New.
769            Instantiate the classification here. Update the test methods
770            accordingly.
771            (TestClassification.test_multiple_groups): Make sure that the two
772            singletons matching 1 are considered different.
773    
774    2003-10-31  Bernhard Herzog  <[email protected]>
775    
776            * test/test_classification.py (red, green, blue): New. These
777            constants were used in several cases. Update the relevant methods.
778            (TestClassification.test_defaults)
779            (TestClassification.test_set_default_properties)
780            (TestClassification.test_add_singleton)
781            (TestClassification.test_add_range)
782            (TestClassification.test_multiple_groups)
783            (TestClassification.test_deepcopy): New. These were formerly all
784            part of the single method test.
785            (TestClassification.test_deepcopy): Removed.
786            (TestClassIterator): Removed. The test case is now a method of
787            TestClassification since it tests part of the public interface of
788            Classification
789            (TestClassification.test_iterator): New. Used to be
790            TestClassIterator effectively
791    
792    2003-10-31  Jan-Oliver Wagner <[email protected]>
793    
794            GUIfied the functions of the profiling extension.
795    
796            * /Extensions/profiling/__init__.py: New: Init to make this
797            directory a package.
798    
799            * Extensions/profiling/profiling.py: Moved menu entries to
800            the Extensions menu. Applied _() for strings.
801            (profile_screen_renderer): Catch the detailed printout and present
802            it in a dialog.
803            (time_screen_renderer): Raise a dialog to present the result instead
804            of printing it to stdout.
805    
806    2003-10-31  Bernhard Herzog  <[email protected]>
807    
808            * test/test_classification.py (TestClassGroupProperties)
809            (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
810            (TestClassGroupSingleton, TestClassIterator, TestClassification):
811            Split TestClassification into several classes, one for each class
812            being tested. TestClassification itself now only tests
813            Classification. This split makes changes to the tests a bit easier
814    
815    2003-10-31  Bernhard Herzog  <[email protected]>
816    
817            * Extensions/profiling/profiling.py: New. Extension to measure
818            Thuban performance
819    
820    2003-10-31  Frank Koormann <[email protected]>
821    
822            Added two items to legend popup menu: Remove Layer and Show Layer Table
823    
824            * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
825            LegendPanel._OnShowTable): New event handlers, call the corresponding
826            mainwindow methods.
827            (LegendTree._OnRightClick): Added items to popup menu.
828    
829    2003-10-30  Bernhard Herzog  <[email protected]>
830    
831            * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
832            EVT_WINDOW_DESTROY
833            (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
834            nothing but is convenient for the derived classes.
835    
836            * Thuban/UI/tableview.py
837            (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
838            Unsubscribe the messages here not in OnClose because that might
839            get called multiple times. Fixes RT #2196
840            (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
841            anymore.
842    
843            * README: Update the minimum requirement for wxPython. Since we
844            now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
845            the version in which that was introduced for all platforms
846    
847    2003-10-30  Frank Koormann <[email protected]>
848    
849            * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
850            the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
851            frame.
852    
853    2003-10-30  Jan-Oliver Wagner <[email protected]>
854    
855            Improved APR import extension, added further EPSG definitions
856            and some cleanup regarding string class.
857    
858            * test/test_proj.py (TestProjection.test_get_projection_units_geo):
859            Added test for alias 'longlat'.
860    
861            * Resources/Projections/epsg-deprecated.proj: New. Contains
862            deprecated EPSG definitions.
863    
864            * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
865            the variable names for objects.
866    
867            * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
868            Copied from importAPR and provided with documentation.
869    
870            * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
871            Moved to apr.py.
872            (APR_View): Added object ref 'ITheme'.
873    
874            * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
875            split function by corresponding use of the string class method.
876    
877            * Thuban/Model/xmlwriter.py: Replaced string replace function by
878            corresponding string method.
879    
880    2003-10-29  Bernhard Herzog  <[email protected]>
881    
882            * Thuban/UI/baserenderer.py
883            (BaseRenderer.draw_shape_layer_incrementally): Speed up the
884            special case of a classification that only has the default group
885    
886    2003-10-27  Bernhard Herzog  <[email protected]>
887    
888            * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
889    
890            * po/de.po: Update.
891    
892            * Thuban/UI/application.py
893            (ThubanApplication.ShowExceptionDialog): Handle translation of the
894            dialog message properly
895    
896    2003-10-27  Bernhard Herzog  <[email protected]>
897    
898            Rework how localization works so that we use wx's translation
899            functions when running Thuban as a normal application but not when
900            we don't need any UI, such as in the test suite. See the comment
901            in Thuban/__init__.py for details
902    
903            * Thuban/__init__.py (_): Add one level of indirection to make the
904            translation handling more flexible and to make it possible to use
905            either wx's translation services or not.
906            (gettext_identity, translation_function_installed)
907            (install_translation_function): New function to help with this
908    
909            * Thuban/UI/__init__.py: Install the wx specific translation
910            function if it's OK to do that
911    
912            * test/support.py (initthuban): Install a dummy translation
913            function so that importing Thuban.UI doesn't install a wx specific
914            one for which would need to import wxPython
915    
916    2003-10-27  Bernhard Herzog  <[email protected]>
917    
918            * HOWTO-Release: Source archives should be created first and the
919            binary packages should be created from the source archives.
920            There's an official debian package now so there's no need to test
921            the rpm on debian anymore
922    
923    2003-10-27  Bernhard Herzog  <[email protected]>
924    
925            Several rendering changes:
926    
927             - Render the selection into a separate bitmap so that only that
928               bitmap needs to be redrawn when the selection changes
929    
930             - Render incrementally showing previews and allowing interaction
931               before rendering is complete
932    
933             - Update the renderer interface a bit. Most parameters of
934               RenderMap are now parameters of the constructor
935    
936            * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
937            and the update region as parameters. Update the doc-string
938            (BaseRenderer.render_map_incrementally): New. Generator function
939            to renders the map incrementally
940            (BaseRenderer.render_map): Remove the map argument (it's now in
941            the constructor) and simply iterate over the
942            render_map_incrementally generator to draw the map.
943            (BaseRenderer.draw_shape_layer_incrementally)
944            (BaseRenderer.draw_shape_layer): Renamed to
945            draw_shape_layer_incrementally and changed into a generator that
946            yields True every 500 shapes. Used by render_map_incrementally to
947            render shape layers incrementally
948    
949            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
950            map and region parameters which are now in the constructor
951            (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
952            the inherited render_map_incrementally.
953            (BaseRenderer.draw_shape_layer): Removed.
954            (ScreenRenderer.draw_selection_incrementally): New. The selection
955            drawing part of the removed draw_shape_layer as a generator
956            (ScreenRenderer.layer_shapes): Update because of the region
957            parameter change
958            (ExportRenderer.__init__): New. Extend the inherited constructor
959            with the destination region for the drawing
960            (ExportRenderer.RenderMap): Removed the map and region parameters
961            which are now in the constructor
962    
963            * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
964            bitmap suitable for a preview in a tool
965            (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
966            bitmap
967            (MapPrintout.draw_on_dc): Adapt to new renderer interface
968            (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
969            exists
970            (MapCanvas.OnIdle): Update the logic to deal with incremental
971            rendering and the selection bitmap
972            (MapCanvas._do_redraw): Handle the instantiation of the render
973            iterator and the redraws during rendering
974            (MapCanvas._render_iterator): New. Generator to incrementally
975            redraw both bitmaps
976            (MapCanvas.Export): Adapt to new renderer interface.
977            (MapCanvas.full_redraw): Reset the selection bitmap and the
978            renderer iterator too
979            (MapCanvas.redraw_selection): New. Force a redraw of the selection
980            bitmap
981            (MapCanvas.shape_selected): Only redraw the selection bitmap
982    
983            * test/test_baserenderer.py
984            (TestBaseRenderer.test_polygon_no_projection)
985            (TestBaseRenderer.test_raster_no_projection)
986            (TestBaseRenderer.test_point_map_projection)
987            (TestBaseRenderer.test_point_layer_and_map_projection)
988            (TestBaseRenderer.test_point_layer_projection)
989            (TestBaseRenderer.test_point_with_classification): Adapt to new
990            renderer interface
991    
992    2003-10-24  Bernhard Herzog  <[email protected]>
993    
994            * libraries/thuban/wxproj.cpp (draw_polygon_shape)
995            (point_in_polygon_shape, shape_centroid): Raise an exception if
996            the shape can't be read. Previously invalid shape ids would lead
997            to a segfault.
998    
999            * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
1000            New. test whether an exception is raised for invalid shape ids
1001    
1002    2003-10-24  Jan-Oliver Wagner <[email protected]>
1003    
1004            * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
1005            as alias for 'latlong'.
1006    
1007            * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
1008            as alias for 'latlong'.
1009    
1010    2003-10-24  Jan-Oliver Wagner <[email protected]>
1011    
1012            * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
1013            the projection even for the UnknownPanel.
1014            (UnknownProjPanel.__init__): Define the text and create the textctrl
1015            widget.
1016            (UnknownProjPanel._DoLayout): Replaced static text widget by the
1017            textctrl created in __init__.
1018            (UnknownProjPanel.SetProjection): Set the text for the text ctrl
1019            including the parameters of the projection.
1020            
1021    2003-10-24  Jan-Oliver Wagner <[email protected]>
1022    
1023            * Resources/Projections/epsg.proj: New. This is a list of
1024            EPSG codes with parameters for proj. The list has been
1025            generated using devtools/create_epsg.py based on the
1026            file nad/epsg of the proj 4.4.7 package. Four projection
1027            definitions have been deleted as they are not accepted by proj:
1028            "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
1029            and "HD72 / EOV".
1030    
1031    2003-10-22  Bernhard Herzog  <[email protected]>
1032    
1033            Some more tweaks to the projection dialog which should fix RT
1034            #1886.
1035    
1036            * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
1037            the ProjFile's messages and call the base class methods correctly
1038            (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
1039            flag on the newly selected item too. Otherwise some other item is
1040            focused and the first time the focus is moved with the keyboard
1041            the selection moves in unexpected ways.
1042    
1043            * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
1044            focus on the OK button, only on the projection list. That way the
1045            list really has the focus initially
1046            (ProjFrame.OnClose): Call the projection list's Destroy method to
1047            make it unsubscribe all messages
1048    
1049    2003-10-21  Bernhard Herzog  <[email protected]>
1050    
1051            Rework the projection dialog to fix a few bugs, including RT 2166
1052            and most of 2168
1053    
1054            * Thuban/UI/projlist.py: New. The class ProjectionList is a
1055            special wxListCtrl to show a list of projections in a more MVC
1056            fashion
1057    
1058            * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
1059            throughout the class. The main change is to use the ProjectionList
1060            class instead of a normal wxListBox. Also, add an explicit
1061            "Unknown" projection to the projection choice control.
1062            (ProjPanel.__init__): Add an "unknown" ellipsoid
1063            (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
1064            instantiation of the panel's controls to make the tab-order more
1065            natural
1066    
1067    2003-10-21  Bernhard Herzog  <[email protected]>
1068    
1069            * test/test_load.py (TestSingleLayer.file_contents)
1070            (TestSingleLayer.test): Add non-ascii characters to the titles of
1071            session, map and layer. This is effectively a port of the
1072            TestUnicodeStrings test in test_load_0_8.py which for some reason
1073            was only added there.
1074    
1075            * test/test_load_0_9.py (TestSingleLayer.file_contents)
1076            (TestSingleLayer.test): Same as in test_load.py: add non-ascii
1077            characters to the titles of session, map and layer,.
1078    
1079    2003-10-21  Bernhard Herzog  <[email protected]>
1080    
1081            Add EPSG projection handling to .thuban files
1082    
1083            * test/test_save.py (SaveSessionTest.dtd)
1084            (SaveSessionTest.testEmptySession)
1085            (SaveSessionTest.testLayerProjection)
1086            (SaveSessionTest.testRasterLayer)
1087            (SaveSessionTest.testClassifiedLayer)
1088            (SaveSessionTest.test_dbf_table)
1089            (SaveSessionTest.test_joined_table)
1090            (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
1091            (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
1092            use a and epsg projection to test saving them
1093    
1094            * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
1095            namespace
1096            (TestLayerVisibility.file_contents, TestLabels.file_contents)
1097            (TestLayerProjection.file_contents)
1098            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
1099            (TestPostGISLayer.file_contents)
1100            (TestPostGISLayerPassword.file_contents)
1101            (TestLoadError.file_contents, TestLoadError.test): Update to use
1102            1.0-dev namespace
1103            (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
1104            use 1.0-dev namespace and use an EPSG projection to test whether
1105            loading it works
1106    
1107            * test/test_load_0_9.py: New. Effectively a copy of test_load.py
1108            as of Thuban 0.9. These are now tests to determine whether Thuban
1109            can still read files generated by Thuban 0.9
1110    
1111            * Thuban/Model/save.py (SessionSaver.write)
1112            (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
1113            namespace
1114            (SessionSaver.write_projection): Write the projection's epsg
1115            attribute
1116    
1117            * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
1118            thuban-1.0-dev.dtd namespace
1119            (SessionLoader.check_attrs): Allow a callable object as conversion
1120            too
1121            (SessionLoader.start_projection, SessionLoader.end_projection)
1122            (SessionLoader.start_parameter): Handle the epsg attribute and
1123            rename a few instance variables to lower case
1124    
1125            * Resources/XML/thuban-1.0.dtd: New. Only difference to
1126            thuban-0.9.dtd is the epsg attribute for projections.
1127    
1128    2003-10-21  Bernhard Herzog  <[email protected]>
1129    
1130            * test/runtests.py (main): Let the user specify which tests to run
1131            on the command line
1132    
1133            * test/support.py (ThubanTestResult.getDescription): Override to
1134            give a better short description. The description can be used as a
1135            parameter to run_tests to run that particular test in isolation.
1136    
1137    2003-10-21  Frank Koormann   <[email protected]>
1138    
1139            Popup menu for legend. Scheduled for the 1.2 release this was too
1140            simple to implement: The popup menu is bound to the legend tree, while
1141            the events are hanlded by its anchestor, the legend panel. This
1142            allows reuse of all the event handlers already implemented for the
1143            legend toolbar buttons.
1144    
1145            * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
1146            to add handlers for the events issued by the popup menu.
1147            (LegendPanel._OnToggleVisibility): Handler for toggling layer
1148            visibility event
1149            (LegendPanel._OnProjection): Handler for layer projection event.
1150            (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
1151            (LegendTree._OnRightClick): Event handler for right click, select item
1152            and pop up menu.
1153            (LegendTree.ToggleVisibility): Toggle layer visibility
1154            (LegendTree.LayerProjection): Raise layer projection dialog for
1155            current layer.
1156    
1157    2003-10-21  Bernhard Herzog  <[email protected]>
1158    
1159            * Resources/Projections/defaults.proj: Use correct DOCTYPE
1160            declaration. The top-level element is projectionlist not projfile
1161    
1162    2003-10-20  Bernhard Herzog  <[email protected]>
1163    
1164            * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
1165            method to write a projfile and display a busy cursor and error
1166            dialogs.
1167            (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
1168            (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
1169            (ProjFrame.__FillAvailList): Translate "<None>" too and display a
1170            busy cursor while loading the user and system prj files.
1171    
1172    2003-10-16  Bernhard Herzog  <[email protected]>
1173    
1174            * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
1175            ProjFile objects
1176            (clear_proj_file_cache): New function to clear the cache. Mainly
1177            useful for use by the test suite
1178            (read_proj_file): Use the cache.
1179    
1180            * test/test_proj.py (TestProjFile): Clarify the doc-string
1181            (ProjFileReadTests): Update doc-string
1182            (ProjFileReadTests.test_get_system_proj_file): Check whether the
1183            system proj files is cached.
1184            (ProjFileLoadTestCase): New base class for the proj file tests
1185            derived from support.FileLoadTestCase to provide some common
1186            behavior.
1187            (TestLoadingProjFile)
1188            (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
1189            (TestProjFileWithInvalidParameters.file_contents): Derive from
1190            ProjFileLoadTestCase
1191            (TestLoadingProjFile.test_caching): New. Test whether the cache
1192            works
1193    
1194    2003-10-16      Silke Reimer    <[email protected]>
1195    
1196            * debian/*: New directory with configuration files for building a thuban
1197              deb-package.
1198    
1199    2003-10-14  Bernhard Herzog  <[email protected]>
1200    
1201            * test/test_proj.py: Execute support.run_tests when run as
1202            __main__ so that missing unsubscribes are detected
1203            (TestProjFile.tearDown): Destroy the proj_file properly
1204    
1205    2003-10-14  Bernhard Herzog  <[email protected]>
1206    
1207            * Thuban/Model/messages.py (PROJECTION_ADDED)
1208            (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
1209            the ProjFile objects
1210    
1211            * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
1212            easily send messages when the projections change
1213            (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
1214            when the change was successful
1215    
1216            * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
1217            proj file messages
1218            (TestProjFile.test_add_remove)
1219            (TestProjFile.test_remove_non_existing)
1220            (TestProjFile.test_replace)
1221            (TestProjFile.test_replace_non_existing): Test whether the right
1222            messages are sent
1223    
1224    2003-10-14  Bernhard Herzog  <[email protected]>
1225    
1226            * test/test_proj.py (TestProjFile.test): Refactor into several
1227            tests
1228            (TestProjFile.test_add_remove)
1229            (TestProjFile.test_remove_non_existing)
1230            (TestProjFile.test_replace)
1231            (TestProjFile.test_replace_non_existing): Some of the new
1232            individual test cases
1233            (TestProjFileSimple): New class for the rest of the test cases
1234            that came out of the refactoring
1235            (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
1236            derived classes don't have to
1237    
1238    2003-10-13  Bernhard Herzog  <[email protected]>
1239    
1240            Add an optional EPSG code to the projection objects and extend the
1241            .proj file format accordingly.
1242    
1243            * Resources/XML/projfile.dtd (element projection): Add epsg
1244            attribute
1245    
1246            * Thuban/Model/proj.py (Projection.__init__): New parameter and
1247            instance variable epsg. Update doc-string
1248            (Projection.EPSGCode, Projection.Label): New methods to provide
1249            access to EPSG code and a label for use in dialogs
1250    
1251            * Thuban/Model/resource.py (ProjFileReader.start_projection)
1252            (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
1253            Handle the epsg code attribute when reading or writing proj files
1254    
1255            * Thuban/UI/projdialog.py (ProjFrame._OnSave)
1256            (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
1257            (ProjFrame.__FillAvailList): Use the projection's Label method to
1258            get the string for the list box
1259    
1260            * test/test_proj.py (TestProjection.test_label)
1261            (TestProjection.test_label_epsg)
1262            (TestProjection.test_epsgcode_for_non_epsg_projection)
1263            (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
1264            for the label and EPSGCode methods
1265            (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
1266            (WriteProjFileTests.test_write_empty_file): Create the ProjFile
1267            objects in the test cases and put the expected contents into the
1268            test case methods too. Update doTestWrite accordingly
1269            (TestLoadingProjFile)
1270            (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
1271            read tests from TestProjFile.
1272            (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
1273            tests are now in the new classes.
1274            (sample_projfile, sample_projfile_data)
1275            (sample_projfile2, sample_projfile_data2): Removed. Not used
1276            anymore.
1277            (TestProjFile.test_read_unreadable_file): No need to reset the
1278            permissions at the end anymore since we use a unique filename
1279    
1280    2003-10-13  Bernhard Herzog  <[email protected]>
1281    
1282            * test/test_proj.py: Some more refactoring of the test cases
1283            (ProjFileTest): New base class for the proj file tests.
1284            (TestProjFile): Derive from ProjFileTest
1285            (TestProjFile.test_read_unreadable_file)
1286            (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
1287            the new filename method to get a unique filename
1288            (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
1289            (WriteProjFileTests): New class for proj file write tests.
1290            Contains the write test that were in TestProjFile originally.
1291    
1292    2003-10-13  Bernhard Herzog  <[email protected]>
1293    
1294            * test/test_proj.py (TestProjFile.testRead)
1295            (TestProjFile.test_read_non_existing_file)
1296            (TestProjFile.test_read_unreadable_file)
1297            (TestProjFile.test_read_empty_file): Split into several methods.
1298    
1299    2003-10-10  Bernhard Herzog  <[email protected]>
1300    
1301            * Thuban/UI/sizers.py: New file with custom sizers.
1302    
1303            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
1304            all projection type specific panels and put them into a
1305            NotebookLikeSizer. This way the dialog doesn't change its size
1306            when a different projection is selected
1307            (ProjFrame.__init__): Rename projection_panels
1308            projection_panel_defs and reuse projection_panels for a list of
1309            the instantiated panels.
1310            (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
1311            (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
1312            the panels
1313            (UnknownProjPanel._DoLayout): Place the newlines in the message
1314            differently to make the panel narrower.
1315            (TMPanel._DoLayout): Layout the parameters in one column.
1316    
1317    2003-10-10  Bernhard Herzog  <[email protected]>
1318    
1319            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
1320            that contains all the setup for the dialog's widgets, layout and
1321            event handling.
1322            (__): Call build_dialog to build the dialog.
1323            (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
1324            Their functionality is now in build_dialog
1325            (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
1326            (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
1327            (ProjFrame.__DoOnProjChoice): Small updates due to slightly
1328            different widget names and hierarchy introduced with build_dialog.
1329    
1330    2003-10-10  Bernhard Herzog  <[email protected]>
1331    
1332            * README: Fix typo.
1333    
1334    2003-10-09  Bernhard Herzog  <[email protected]>
1335    
1336            * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
1337            projection is already in the list. This is *a lot* faster when
1338            loading files with hundreds of projections since it saves a linear
1339            search. OTOH this will allow adding the same projection to the
1340            user.proj file multiple times in the projection dialog but we'll
1341            deal with that later
1342    
1343    2003-10-09  Jan-Oliver Wagner <[email protected]>
1344    
1345            * devtools: New. Directory for developer tools that are not intended
1346            for the regular user.
1347    
1348            * devtools/create_epsg.py: New. Convert the epsg file of proj into
1349            a python .proj file.
1350    
1351    2003-10-09  Bernhard Herzog  <[email protected]>
1352    
1353            * test/test_proj.py
1354            (TestProjection.test_get_parameter_without_equals_sign): New. Test
1355            whether GetParameter handles parameters without "=" sign correctly
1356    
1357            * Thuban/Model/proj.py (Projection.GetParameter): Handle
1358            parameters that do not contain a "=". Update the doc-string
1359    
1360    2003-10-08  Bernhard Herzog  <[email protected]>
1361    
1362            * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
1363            length limit on the projname text control
1364    
1365    2003-10-08  Bernhard Herzog  <[email protected]>
1366    
1367            * test/test_proj.py (TestProjection.test_get_projection_units_geo)
1368            (TestProjection.test_get_projection_units_normal): New. Tests for
1369            the Projection.GetProjectedUnits method
1370    
1371    2003-10-08  Jan-Oliver Wagner <[email protected]>
1372    
1373            * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
1374            Added missing 'val' parameter.
1375    
1376    2003-10-08  Bernhard Herzog  <[email protected]>
1377    
1378            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
1379            projection type of the currently selected projection is not known,
1380            i.e. there's no panel for it, use the UnknownProjPanel
1381            (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
1382            the actual replacing of the proj panel into the new method
1383            _show_proj_panel.
1384            (UnknownProjPanel): Add doc-string.
1385            (UnknownProjPanel._DoLayout): Insert a newline into the text so
1386            that the panel is not so wide.
1387    
1388    2003-10-08  Bernhard Herzog  <[email protected]>
1389    
1390            * Thuban/Model/resource.py (read_proj_file): Return the warnings
1391            too. Update the doc-string
1392            (get_proj_files): Removed. It wasn't used anywhere
1393            (get_system_proj_files, get_system_proj_file): Rename to
1394            get_system_proj_file and return the ProjFile object and not a list
1395            of ProjFile objects. Update the callers.
1396            (get_user_proj_files, get_user_proj_file): Rename to
1397            get_user_proj_file return the ProjFile object and not a list of
1398            ProjFile objects. Update the callers.
1399            (ProjFileReader.__init__): New instance variable for the warnings.
1400            Rename the __pf ivar to projfile. Update the methods referring to
1401            __pf
1402            (ProjFileReader.end_projection): Catch any errors raised when
1403            instantiating the projection and record that as an error. The
1404            projection will not be in the final ProjFile object.
1405            (ProjFileReader.GetWarnings): New method to return the warnings.
1406    
1407            * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
1408            show the warnings from the projfile reader
1409            (ProjFrame._OnImport): Deal with any warnings returned by
1410            read_proj_file
1411            (ProjFrame.__FillAvailList): Deal with any warnings returned by
1412            get_system_proj_file or get_user_proj_file.
1413    
1414            * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
1415            (TestProjFileWithInvalidParameters.file_contents): New test cases
1416            to test whether read_proj_file handles invalid projection
1417            parameters correctly
1418            (TestProjFile.test_get_system_proj_file): New. Simple test for
1419            resource.get_system_proj_file
1420    
1421    2003-10-07  Bernhard Herzog  <[email protected]>
1422    
1423            * test/test_derivedshapestore.py
1424            (TestDerivedShapeStoreExceptions.tearDown): Clear the session
1425            properly so that the temporary directories get deleted correctly
1426    
1427    2003-10-06  Bernhard Herzog  <[email protected]>
1428    
1429            Handle the title changes in a proper MVC way.
1430    
1431            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
1432            canvas' TITLE_CHANGED messages
1433            (MainWindow.update_title): New. Update the main window's title
1434            (MainWindow.__SetTitle): Removed. Use update_title instead.
1435            (MainWindow.SetMap): Use update_title instead of __SetTitle
1436            (MainWindow.RenameMap): Do change the window title explicitly
1437            here. That's handled in a proper MVC way now.
1438            (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
1439            messages
1440    
1441            * Thuban/Lib/connector.py (Conduit): New class to help classes
1442            that forward messages
1443    
1444            * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
1445            (ViewPort): Derive from Conduit instead of Publisher
1446            (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
1447            when calling the inherited versions
1448            (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
1449            methods to subscribe and unsubscribe map messages
1450            (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
1451            handle the map subscriptions
1452            (ViewPort.Map, ViewPort.map_projection_changed)
1453            (ViewPort.layer_projection_changed): Add or update doc-strings
1454    
1455            * test/test_connector.py (TestPublisher.test_issue_simple): Fix
1456            typo
1457            (MyConduit): Helper class for the Conduit test.
1458            (TestConduit): Test cases for Conduit
1459    
1460            * test/test_connector.py: Use support.run_tests as main.
1461    
1462            * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
1463            the TITLE_CHANGED messages
1464            (ViewPortTest.test_forwarding_title_changed): New test to check
1465            whether the viewport forwards the map's TITLE_CHANGED messages
1466            (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
1467            after the port's because the latter may require a still functional
1468            map.
1469    
1470    2003-10-06  Bernhard Herzog  <[email protected]>
1471    
1472            * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
1473            doc-string
1474    
1475    2003-10-06  Bernhard Herzog  <[email protected]>
1476    
1477            * test/test_viewport.py (ViewPortTest.setUp)
1478            (SimpleViewPortTest.test_init_with_size): Move the test for the
1479            initial size as a constructor parameter from ViewPortTest.setUp
1480            method to a new separate test in SimpleViewPortTest.
1481    
1482    2003-10-06  Bernhard Herzog  <[email protected]>
1483    
1484            * test/test_viewport.py (MockView): New class derived from
1485            ViewPort with a mock implementation of GetTextExtent to be used in
1486            the test cases
1487            (ViewPortTest.setUp): Use MockView instead of ViewPort
1488    
1489            * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
1490            into what would be a "pure virtual function" in C++: always raise
1491            NotImplementedError. Mock implementations for test cases don't
1492            belong into the real code
1493    
1494    2003-10-02  Bernhard Herzog  <[email protected]>
1495    
1496            * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
1497            close the dbf file we create so that it's contents have been
1498            written properly.
1499    
1500            * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
1501            libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
1502            Update to shapelib 1.2.10
1503    
1504    2003-10-01  Jan-Oliver Wagner <[email protected]>
1505    
1506            * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
1507            it annoys lintian which warns about these files not being
1508            executable. The #! isn't necessary here since if you absolutely
1509            must execute them you can always say "python <filename>".
1510    
1511    2003-09-26  Bernhard Herzog  <[email protected]>
1512    
1513            * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
1514            only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
1515            is ported to a newer the import will fail, so it should be noticed
1516            immediately that this function is gone.
1517            Fixes RT#1919
1518    
1519    2003-09-26  Bernhard Herzog  <[email protected]>
1520    
1521            Add a DTD for the projection files and make thuban write valid
1522            projection files
1523    
1524            * Resources/XML/projfile.dtd: New. DTD for thuban's projection
1525            files
1526    
1527            * Thuban/Model/resource.py (ProjFileSaver.write): Use
1528            'projectionlist' as the name in the document type declaration so
1529            that it matches the element type of the root element.
1530    
1531            * test/test_proj.py (sample_projfile, sample_projfile2): Use
1532            'projectionlist' as the name in the document type declaration just
1533            as it is done now in the files thuban would write
1534            (sample_projfile, sample_projfile_data): Fix spelling of
1535            "Mercator"
1536            (TestProjFile.doTestWrite): Validate the written and the expected
1537            XML data
1538            (TestProjFile): Derive from ValidationTest so that we can run xml
1539            validation tests
1540    
1541    2003-09-24  Bernhard Herzog  <[email protected]>
1542    
1543            * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
1544            modify the list returned by map.Layers() in place since it is the
1545            actual list of layers used by the map.
1546    
1547    2003-09-23  Jan-Oliver Wagner <[email protected]>
1548    
1549            * Doc/manual/thuban-manual.xml: Added subsection to chapter
1550            Extensions to describe the extensions coming with the Thuban
1551            standard package (gns2shp and importAPR).
1552    
1553    2003-09-23  Bernhard Herzog  <[email protected]>
1554    
1555            * libraries/thuban/wxproj.cpp (project_point): if there's an
1556            inverse but no forward projection, convert to degrees after
1557            applying the inverse projection. Fixes RT#2096
1558    
1559            * test/test_wxproj.py: New. Test cases for wxproj.so. One test
1560            implicitly tests for the fix to RT#2096
1561    
1562            * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
1563            Check that the sequences have the same lengths
1564    
1565            * Resources/Projections/defaults.proj (Geographic projection): Use
1566            a much more precise value for the to_meter attribute.
1567    
1568    2003-09-22  Bernhard Herzog  <[email protected]>
1569    
1570            * test/support.py (initthuban): Make sure to unset the LANG env.
1571            var. so that tests that compare translated strings work. Solves RT
1572            #2094
1573    
1574    2003-09-22  Jan-Oliver Wagner <[email protected]>
1575    
1576            Small improvement of APR import.
1577    
1578            * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
1579            Added tests for text-ranges.
1580    
1581            * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
1582            returns a string object if the range is based on text.
1583    
1584            * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
1585            range retrieval.
1586    
1587    2003-09-22  Jan-Oliver Wagner <[email protected]>
1588    
1589            Initial version of the importAPR extension which is in
1590            experimental state.
1591    
1592            * /Extensions/importAPR/, /Extensions/importAPR/samples/,
1593            /Extensions/importAPR/test/: New directories.
1594    
1595            * /Extensions/importAPR/samples/README: New: Howto load the samples.
1596    
1597            * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
1598            file which refers to the Thuban Iceland demo data.
1599    
1600            * /Extensions/importAPR/test/README: New: Howto execute the tests.
1601    
1602            * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
1603    
1604            * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
1605            as in '.apr'-files.
1606    
1607            * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
1608            ODB Objects as in '.apr', '.avl' and other files.
1609    
1610            * /Extensions/importAPR/__init__.py: New: Init to make this
1611            directory a package.
1612    
1613            * /Extensions/importAPR/importAPR.py: New: Import a ArcView
1614            project file (.apr) and convert it to Thuban.
1615    
1616    2003-09-22  Jan-Oliver Wagner <[email protected]>
1617    
1618            * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
1619    
1620    2003-09-19  Jan-Oliver Wagner <[email protected]>
1621    
1622            * Doc/manual/thuban-manual.xml: Extended section 'Installation'
1623            with description on RPM installation and RPM binary package
1624            creation.
1625    
1626    2003-09-18  Bernhard Herzog  <[email protected]>
1627    
1628            * setup.py (data_files): Only add the mo files if the Locales
1629            directory actually exists, so that setup.py works with a fresh CVS
1630            checkout
1631    
1632    2003-09-12  Jan-Oliver Wagner <[email protected]>
1633    
1634            * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
1635            in viewport, not anymore in view
1636    
1637    2003-09-04  Jan-Oliver Wagner <[email protected]>
1638    
1639            Introducing first Extension (gns2shp).
1640    
1641            * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
1642    
1643            * Extensions/__init__.py: New. init to make this dir a package.
1644    
1645            * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
1646    
1647            * Extensions/gns2shp/test/README: New. some info on this test directory.
1648    
1649            * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
1650    
1651            * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
1652            of Shapefile from GNS text file format
1653    
1654    2003-09-03  Jan-Oliver Wagner <[email protected]>
1655    
1656            Fix/workaround for bug #2019:
1657            https://intevation.de/rt/webrt?serial_num=2019
1658    
1659            * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
1660            (IdentifyView.__init__): Added another button that allows to
1661            stop the identify mode.
1662            (IdentifyView.OnStop): New. Stops the identify mode.
1663    
1664    2003-09-03  Jan-Oliver Wagner <[email protected]>
1665    
1666            Introducing a new exception dialog that allows to exit the
1667            application immediately.
1668            This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
1669    
1670            * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
1671    
1672            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
1673            Made strings available to translations. Exchanged the simple
1674            ScrolledMessageDialog by the new ExceptionDialog.
1675    
1676    2003-09-01  Bernhard Herzog  <[email protected]>
1677    
1678            * NEWS: New. Summary of changes and release notes.
1679    
1680            * MANIFEST.in: Add NEWS
1681    
1682    2003-09-01  Bernhard Herzog  <[email protected]>
1683    
1684            * MANIFEST.in: Correct the include statement for the mo-files and
1685            include the documentation too.
1686    
1687            * setup.py (data_files): Add the .mo files
1688            (setup call): Up to version 0.9.0
1689    
1690    2003-09-01  Bernhard Herzog  <[email protected]>
1691    
1692            * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
1693            parameter list to just parent and session
1694            (ChooseDBTableDialog.__set_properties): Removed. Setting the
1695            selection of empty list boxes is not allowed (and produces C++
1696            assertion errors) and the rest of the setup is better done in
1697            __init__ anyway.
1698            (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
1699            (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
1700            builtins True/False for booleans to avoid warnings from wxPython
1701    
1702            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
1703            ChooseDBTableDialog constructor parameters.
1704    
1705    2003-09-01  Bernhard Herzog  <[email protected]>
1706    
1707            * Thuban/Model/postgisdb.py
1708            (PostGISTable): Extend doc-string
1709            (PostGISTable._fetch_table_information): Set the column index
1710            correctly, pretending ignored columns don't exist.
1711    
1712            * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
1713            for postgis tables with data types not yet supported by thuban.
1714    
1715    2003-08-29  Bernhard Herzog  <[email protected]>
1716    
1717            * HOWTO-Release: Tweak item about running the tests.
1718    
1719    2003-08-29  Jan-Oliver Wagner <[email protected]>
1720    
1721            * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
1722    
1723    2003-08-29  Bernhard Herzog  <[email protected]>
1724    
1725            Add some missing parameters to projections. Proj complains about
1726            them on windows but for some reason not on Linux.
1727    
1728            * test/test_save.py (SaveSessionTest.testLayerProjection): Add
1729            missing required projection parameters
1730    
1731            * test/test_proj.py (TestProjFile.test): Add missing required
1732            projection parameters
1733    
1734            * test/test_load_0_8.py (TestLayerProjection.file_contents)
1735            (TestLayerProjection.test): Add missing required projection
1736            parameters and tests for them
1737    
1738            * test/test_load.py (TestLayerProjection.file_contents)
1739            (TestLayerProjection.test): Add missing required projection
1740            parameters and tests for them
1741    
1742            * test/test_layer.py (TestLayer.test_base_layer): Add missing
1743            required projection parameters
1744    
1745    2003-08-29  Bernhard Herzog  <[email protected]>
1746    
1747            * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
1748            access the pj_errno because directly accessing pj_errno doesn't
1749            work on windows if the proj library is in a DLL
1750    
1751            * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
1752    
1753    2003-08-28  Bernhard Herzog  <[email protected]>
1754    
1755            * test/test_proj.py: Import things from Thuban after calling
1756            initthuban
1757    
1758            * test/test_load.py (LoadSessionTest.filenames): New class
1759            variable with the filename attributes to normalize
1760            (LoadSessionTest.check_format): Pass self.filenames to
1761            sax_eventlist to normalize the filename attributes
1762    
1763            * test/xmlsupport.py: Add cvs keywords
1764            (SaxEventLister.__init__): New parameter filenames which indicates
1765            attributes that contain filenames
1766            (SaxEventLister.startElementNS): Normalize the filename attributes
1767            with os.path.normpath
1768            (sax_eventlist): New parameter filenames to pass through to
1769            SaxEventLister
1770    
1771            * test/test_derivedshapestore.py: Make this file callable as a
1772            program to execute the tests
1773            (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
1774            the session to self.session so that it gets destroyed properly
1775    
1776            * test/test_layer.py (TestLayer.tearDown): Call the session's
1777            Destroy method
1778    
1779            * test/test_map.py (TestMapBase.tearDown): Destroy self.session
1780            too if it exists
1781            (TestMapAddLayer.test_add_layer): Bind the session to self.session
1782            so that it gets destroyed properly
1783    
1784            * test/postgissupport.py (reason_for_not_running_tests): Add a
1785            test for the existence of popen2.Popen4.
1786    
1787            * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
1788            reliable way to destroy the sessions created in the test cases
1789            (SaveSessionTest.test_dbf_table): Bind the session to self.session
1790            so that it gets destroyed properly
1791            (SaveSessionTest.testLayerProjection): Bind the session to
1792            self.session so that it gets destroyed properly
1793    
1794            * test/test_session.py (UnreferencedTablesTests.tearDown): Make
1795            sure that the session is destroyed properly
1796    
1797            * test/test_shapefilestore.py: Make this callable as a program to
1798            execute the tests
1799    
1800            * test/test_scalebar.py: Remove unnecessary import of _ from
1801            Thuban
1802    
1803            * test/support.py (print_garbage_information): Call initthuban
1804            here because it may be called indirectly from test cases that test
1805            test support modules which do not use anything from thuban itself
1806            (ThubanTestProgram.runTests): Remove unnecessary debug print
1807    
1808    2003-08-28  Bernhard Herzog  <[email protected]>
1809    
1810            * Thuban/version.py (longversion): Update to 0.9
1811    
1812            * Thuban/UI/mainwindow.py: Remove some unused imports
1813    
1814            * README: Add section about required additional software. Add date
1815            and revision CVS keywords
1816    
1817            * HOWTO-Release: Add item about the translations. Add date and
1818            revision CVs keywords and change formatting to match README a bit
1819            better
1820    
1821            * po/de.po: Update for 0.9
1822    
1823            * test/README: Tweak the wording a little because many tests are
1824            not really unittest.
1825    
1826    2003-08-27  Bernhard Herzog  <[email protected]>
1827    
1828            As preparation for the 0.9 release, switch thuban files to a
1829            non-dev namespace
1830    
1831            * Thuban/Model/save.py (SessionSaver.write_session): Write files
1832            with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
1833            namespace
1834    
1835            * Thuban/Model/load.py (SessionLoader.__init__): Accept the
1836            http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
1837    
1838            * test/test_save.py (SaveSessionTest.dtd)
1839            (SaveSessionTest.testEmptySession)
1840            (SaveSessionTest.testSingleLayer)
1841            (SaveSessionTest.testLayerProjection)
1842            (SaveSessionTest.testRasterLayer)
1843            (SaveSessionTest.testClassifiedLayer)
1844            (SaveSessionTest.test_dbf_table)
1845            (SaveSessionTest.test_joined_table)
1846            (SaveSessionTest.test_save_postgis): Update for new namespace
1847    
1848            * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
1849            (TestLayerVisibility.file_contents, TestLabels.file_contents)
1850            (TestLayerProjection.file_contents)
1851            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
1852            (TestPostGISLayer.file_contents)
1853            (TestPostGISLayerPassword.file_contents)
1854            (TestLoadError.file_contents, TestLoadError.test): Update for new
1855            namespace
1856    
1857    2003-08-27  Bernhard Herzog  <[email protected]>
1858    
1859            Make the table interface distinguish between row ids (an integer
1860            that uniquely identifies a row) and row ordinals (a simple row
1861            count from 0 to NumRows() - 1)
1862    
1863            * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
1864            (PostGISTable.RowOrdinalToId): New methods to conver between row
1865            ids and row ordinals
1866            (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
1867            parameter row_is_ordinal to indicate whether the row parameter is
1868            the row id or the ordinal
1869    
1870            * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
1871            (TransientTableBase.RowOrdinalToId)
1872            (AutoTransientTable.RowIdToOrdinal)
1873            (AutoTransientTable.RowOrdinalToId): Same new methods as in
1874            PostGISTable.
1875            (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
1876            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
1877            Same new parameter as in PostGISTable.
1878    
1879            * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
1880            (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
1881            (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
1882            (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
1883            (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
1884            parameter as in PostGISTable.
1885    
1886            * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
1887            (DataTable.RowOrdinalToId): New methods to convert between row ids
1888            and row ordinals.
1889            (TableGrid.SelectRowById): New method to select a row based on its
1890            ID as opposed to its ordinal
1891            (DataTable.GetValue, TableGrid.OnRangeSelect)
1892            (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
1893            (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
1894            (LayerTableFrame.__init__): Convert between row ids and row
1895            ordinals as appropriate
1896    
1897            * test/postgissupport.py (PostGISDatabase.__init__): Add
1898            doc-string.
1899            (PostGISDatabase.initdb): The optional third item in a tuple in
1900            tables is now a (key, value) list with additional arguments to
1901            pass to upload_shapefile
1902            (upload_shapefile): New parameter gid_offset to allow gids that
1903            are not the same as the shapeids in the shapefile
1904            (PostgreSQLServer.get_default_static_data_db): Use the new
1905            gid_offset to make the gids in landmarks 1000 higher than the
1906            shapeids in the shapefile
1907    
1908            * test/test_viewport.py
1909            (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
1910            new shapeids in the landmarks table
1911    
1912            * test/test_transientdb.py
1913            (TestTransientTable.run_iceland_political_tests)
1914            (TestTransientTable.test_transient_joined_table): Add tests for
1915            the new table methods and new keywords arguments.
1916    
1917            * test/test_postgis_db.py
1918            (TestPostGISTable.test_read_row_as_dict_row_count_mode)
1919            (TestPostGISTable.test_read_value_row_count_mode)
1920            (TestPostGISTable.test_row_id_to_ordinal)
1921            (TestPostGISTable.test_row_oridnal_to_id): New test for the new
1922            table methods and the new arguments
1923            (TestPostGISShapestorePoint.test_shapes_in_region)
1924            (TestPostGISShapestorePoint.test_shape_raw_data)
1925            (TestPostGISShapestorePoint.test_shape_points)
1926            (TestPostGISShapestorePoint.test_shape_shapeid)
1927            (TestPostGISShapestorePoint.test_all_shapes)
1928            (TestPostGISTable.test_simple_query)
1929            (TestPostGISTable.test_simple_query)
1930            (TestPostGISTable.test_simple_query)
1931            (TestPostGISTable.test_read_value)
1932            (TestPostGISTable.test_read_row_as_dict): Adapt to the new
1933            shapeids in the landmarks table
1934    
1935            * test/test_memory_table.py
1936            (TestMemoryTable.test_read_row_as_dict_row_count_mode)
1937            (TestMemoryTable.test_read_value_row_count_mode)
1938            (TestMemoryTable.test_row_id_to_ordinal)
1939            (TestMemoryTable.test_row_oridnal_to_id): New test for the new
1940            table methods and the new arguments
1941    
1942            * test/test_dbf_table.py
1943            (TestDBFTable.test_read_row_as_dict_row_count_mode)
1944            (TestDBFTable.test_read_value_row_count_mode)
1945            (TestDBFTable.test_row_id_to_ordinal)
1946            (TestDBFTable.test_row_oridnal_to_id): New test for the new table
1947            methods and the new arguments
1948    
1949    2003-08-26  Bernhard Herzog  <[email protected]>
1950    
1951            * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
1952            more postgis specific but much faster method to get the bounding
1953            box
1954    
1955    2003-08-26  Bernhard Herzog  <[email protected]>
1956    
1957            * Thuban/Model/postgisdb.py (PostGISTable.Title)
1958            (PostGISShapeStore.AllShapes): Add these missing methods.
1959            (PostGISShapeStore.ShapesInRegion): No need to raise
1960            StopIteration. We can simply return
1961    
1962            * test/test_postgis_db.py (TestPostGISTable.test_title)
1963            (TestPostGISShapestorePoint.test_all_shapes): New tests for the
1964            new methods
1965    
1966    2003-08-25  Bernhard Herzog  <[email protected]>
1967    
1968            * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
1969    
1970            * test/test_postgis_db.py (PolygonTests): New class containing
1971            those tests from TestPostGISShapestorePolygon that can also be
1972            used to test MUTLIPOLYGON tables
1973            (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
1974            so derive from that
1975            (TestPostGISShapestoreMultiPolygon): New class with tests for
1976            MUTLIPOLYGON tables
1977    
1978            * test/postgissupport.py (PostGISDatabase.initdb): Allow the
1979            tables argument to have tuples with three items to override the
1980            WKT type used.
1981            (PostgreSQLServer.get_default_static_data_db): Use the above to
1982            create a polygon table with MUTLIPOLYGONs
1983            (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
1984            (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
1985            coords_to*
1986            (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
1987            (wkt_converter): New. Map WKT types to converters
1988            (upload_shapefile): New parameter force_wkt_type to use a
1989            different WKT type than the default
1990    
1991    2003-08-25  Bernhard Herzog  <[email protected]>
1992    
1993            * Thuban/UI/application.py
1994            (ThubanApplication.run_db_param_dialog): New. Suitable as a
1995            db_connection_callback. Main difference is that the dialog run
1996            from this method doesn't have a parent so it can be used even when
1997            there is no main window
1998            (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
1999            no db_connection_callback was given. This way the dialog pops up
2000            even when the .thuban file was given as a command line parameter.
2001    
2002    2003-08-25  Bernhard Herzog  <[email protected]>
2003    
2004            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
2005            before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
2006            which leads to an effectively frozen X session because the user
2007            can only interact with the dialog but the mouse is still grabbed
2008            by the canvas.
2009            Also, call the tool's Hide method before MouseLeftUp because
2010            MouseLeftUp may change the tool's coordinates.
2011    
2012    2003-08-25  Bernhard Herzog  <[email protected]>
2013    
2014            * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
2015            LoadCancelled exceptions and handle them by returning immediately.
2016    
2017    2003-08-25  Bernhard Herzog  <[email protected]>
2018    
2019            GUI part of loading sessions with postgis connections which may
2020            require user interaction to get passwords or updated parameters
2021    
2022            * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
2023            bit nucer and be more generic.
2024            (DBFrame.OnAdd): Adapt to new DBDialog interface
2025    
2026            * Thuban/UI/application.py (ThubanApplication.OpenSession): New
2027            optional parameter db_connection_callback which is passed to
2028            load_session.
2029    
2030            * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
2031            Suitable as a db_connection_callback
2032            (MainWindow.OpenSession): Use self.run_db_param_dialog as the
2033            db_connection_callback of the application's OpenSession method
2034    
2035    
2036    2003-08-25  Bernhard Herzog  <[email protected]>
2037    
2038            Basic loading of sessions containing postgis connections:
2039    
2040            * Thuban/Model/load.py (LoadError): Add doc-string
2041            (LoadCancelled): New exception class to indicate a cancelled load
2042            (SessionLoader.__init__): Add the db_connection_callback parameter
2043            which will be used by the loader to get updated parameters and a
2044            password for a database connection
2045            (SessionLoader.__init__): Add the new XML elements to the
2046            dispatchers dictionary
2047            (SessionLoader.check_attrs): Two new conversions, ascii to convert
2048            to a byte-string object and idref as a generic id reference
2049            (SessionLoader.start_dbconnection)
2050            (SessionLoader.start_dbshapesource): New. Handlers for the new XML
2051            elements
2052            (load_session): Add the db_connection_callback to pass through the
2053            SessionLoader
2054    
2055            * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
2056            New classes to test loading of sessions with postgis database
2057            connections.
2058    
2059    2003-08-25  Bernhard Herzog  <[email protected]>
2060    
2061            * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
2062            replace it and the comment with __BuildDate__ by the Source: and
2063            Id: cvs keywords as used in the other files.
2064    
2065    2003-08-25  Bernhard Herzog  <[email protected]>
2066    
2067            * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
2068            LoadError when a required attribute is missing. The code used to
2069            be commented out for some reason, but probably should have been
2070            active.
2071    
2072            * test/test_load.py (TestLoadError.test): Test the message in the
2073            LoadError too to make sure it really is about the missing
2074            attribute
2075    
2076    2003-08-22  Bernhard Herzog  <[email protected]>
2077    
2078            * test/test_save.py (SaveSessionTest.test_dbf_table)
2079            (SaveSessionTest.test_joined_table): Add XML validation tests.
2080    
2081    2003-08-22  Bernhard Herzog  <[email protected]>
2082    
2083            Implement saving a session with a postgis connection
2084    
2085            * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
2086            elements for database connections and shapestores using db
2087            connections
2088            (session): Add the dbconnections to the content model
2089    
2090            * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
2091            Write the db connections
2092            (SessionSaver.write_session): Call write_db_connections to write
2093            the connection before the data sources
2094            (SessionSaver.write_data_containers): Handle postgis shapestores
2095    
2096            * test/test_save.py (SaveSessionTest.thubanids)
2097            (SaveSessionTest.thubanidrefs): Update for new DTD
2098            (SaveSessionTest.test_save_postgis): New. Test saving a session
2099            with postgis connections
2100    
2101            * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
2102            (PostGISTable.TableName): New accessor methods for the connection
2103            and table name
2104    
2105            * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
2106            (TestPostGISTable.test_dbname): New methods to test the new
2107            PostGISConnection methods
2108    
2109    2003-08-22  Bernhard Herzog  <[email protected]>
2110    
2111            * Thuban/Model/postgisdb.py (ConnectionError): New exception class
2112            for exceptions occurring when establishing a Database connection
2113            (PostGISConnection.connect): Catch psycopg.OperationalError during
2114            connects and raise ConnectionError.
2115    
2116            * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
2117            tests for database exceptions
2118    
2119    2003-08-22  Bernhard Herzog  <[email protected]>
2120    
2121            Prepare the test suite for tests with required authentication
2122    
2123            * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
2124            variables with two predefined users/passwords, one for the admin
2125            and one for a non-privileged user.
2126            (PostgreSQLServer.createdb): Pass the admin name to initdb and add
2127            the non-privileged user to the database and set the admin password
2128            (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
2129            Better error reporting
2130            (PostgreSQLServer.connection_params)
2131            (PostgreSQLServer.connection_string): New methods to return
2132            information about how to connect to the server
2133            (PostgreSQLServer.execute_sql): New. Convenience method to execute
2134            SQL statements
2135            (PostgreSQLServer.require_authentication): Toggle whether the
2136            server requires authentication
2137            (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
2138            Add or alter users
2139            (PostGISDatabase.initdb): Pass the admin name one the
2140            subprocesses' command lines. Grant select rights on
2141            geometry_columns to everybody.
2142            (upload_shapefile): Use the admin name and password when
2143            connecting. Grant select rights on the new table to everybody.
2144    
2145            * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
2146            server's new methods to get the connection parameters.
2147    
2148            * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
2149            (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
2150            server's new methods to get the connection parameters.
2151    
2152            * test/test_postgis_db.py
2153            (TestPostGISConnection.test_gis_tables_empty)
2154            (TestPostGISConnection.test_gis_tables_non_empty)
2155            (PostGISStaticTests.setUp): Use the server's new methods to get
2156            the connection parameters.
2157    
2158    2003-08-22  Bernhard Herzog  <[email protected]>
2159    
2160            * Thuban/UI/about.py (About.__init__): Add the psycopg version.
2161    
2162            * Thuban/version.py: Add psycopg version
2163    
2164            * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
2165            version of the psycopg module
2166    
2167    2003-08-22  Bernhard Herzog  <[email protected]>
2168    
2169            * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
2170            (DBFrame.OnEdit): Removed because it's not used and wouldn't work
2171            at the moment. The functionality should probably be implemented
2172            some time, though.
2173            (DBFrame.OnRemove): Display a message if the connection can't be
2174            removed because it's still in use.
2175    
2176    2003-08-22  Jan-Oliver Wagner <[email protected]>
2177    
2178            * Thuban/UI/about.py (About.__init__): split up the huge about
2179            text into elements/lists for easier translation. This fixes bug
2180            https://intevation.de/rt/webrt?serial_num=2058
2181            Also, made some forgotten string available for the i18n.
2182    
2183    2003-08-21  Bernhard Herzog  <[email protected]>
2184    
2185            Make postgis support really optional including insensitive menu
2186            items.
2187    
2188            * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
2189            whether the postgis is supported.
2190    
2191            * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
2192            to make postgis support optional
2193    
2194            * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
2195            version of Thuban.Model.postgisdb.has_postgis_support
2196            (database_management command): Make it only sensitive if postgis
2197            is supported.
2198    
2199    2003-08-21  Jan-Oliver Wagner <[email protected]>
2200    
2201            * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
2202            (section Adding and Removing Layers): Added text and described
2203            multi-selection.
2204            (chapter Extensions): New.
2205    
2206    2003-08-21  Jan-Oliver Wagner <[email protected]>
2207    
2208            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
2209            settings to allow multiple files to load into the map.
2210            Also reduced selection to *.shp as a default.
2211    
2212    2003-08-20  Bernhard Herzog  <[email protected]>
2213    
2214            Add dialogs and commands to open database connections and add
2215            database layers.
2216    
2217            * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
2218            method to open the database connection management dialog
2219            (MainWindow.AddDBLayer): New method to add a layer from a database
2220            (_has_dbconnections): New helper function to use for sensitivity
2221            (database_management command, layer_add_db command): New commands
2222            that call the above new methods.
2223            (main_menu): Add the new commands to the menu.
2224    
2225            * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
2226            (PostGISConnection.connect): Establish the actual connection in a
2227            separate method and call it in __init__. This makes it easier to
2228            override the behavior in test cases
2229            (PostGISConnection.BriefDescription): New method to return a brief
2230            description for use in dialogs.
2231    
2232            * test/test_postgis_db.py (NonConnection): DB connection that
2233            doesn't actually connect
2234            (TestBriefDescription): New class with tests for the new
2235            BriefDescription method
2236    
2237    2003-08-19  Jan-Oliver Wagner <[email protected]>
2238    
2239            Moved anything from extensions to libraries.
2240    
2241            * libraries: New.
2242    
2243            * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
2244    
2245            * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
2246            Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
2247            been moved here from thuban/extensions/pyprojection/
2248            See there in the Attic for the older history.
2249    
2250            * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
2251            dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
2252            shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
2253            have been moved here from thuban/extensions/pyshapelib/
2254            See there in the Attic for the older history.
2255    
2256            * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
2257            files have been moved here from thuban/extensions/shapelib/
2258            See there in the Attic for the older history.
2259    
2260            * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
2261            gdalwarp.cpp, wxproj.cpp: These files have been moved here from
2262            thuban/extensions/thuban/
2263            See there in the Attic for the older history.
2264    
2265            * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
2266    
2267            * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
2268            gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
2269    
2270            * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
2271            Moved to libraries/shapelib.
2272    
2273            * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
2274            shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
2275            ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
2276            Moved to libraries/pyshapelib.
2277    
2278            * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
2279            LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
2280            Moved to libraries/pyprojection.
2281    
2282            * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
2283    
2284            * extensions: Removed.
2285    
2286    2003-08-19  Bernhard Herzog  <[email protected]>
2287    
2288            * test/test_viewport.py (ViewPortTest): We don't use the
2289            facilities of FileTestMixin so don't derive from it.
2290            (TestViewportWithPostGIS): New class with tests for using a
2291            viewport on a map with postgis layers.
2292    
2293    2003-08-19  Bernhard Herzog  <[email protected]>
2294    
2295            Add the db connection management to the session.
2296    
2297            * Thuban/Model/session.py (Session.__init__): New instance
2298            variable db_connections
2299            (Session.AddDBConnection, Session.DBConnections)
2300            (Session.HasDBConnections, Session.CanRemoveDBConnection)
2301            (Session.RemoveDBConnection): New methods to manage and query the
2302            db connections managed by the session
2303            (Session.OpenDBShapeStore): New method to open a shapestore from a
2304            db connection
2305    
2306            * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
2307            messages for the db connection handling in the session
2308    
2309            * test/test_postgis_session.py: New. test cases for the session's
2310            db connection handling with postgis connections
2311    
2312    2003-08-19  Bernhard Herzog  <[email protected]>
2313    
2314            Add very basic postgis database support and the corresponding test
2315            cases. The test cases require a PostgreSQL + postgis installation
2316            but no existing database. The database will be created
2317            automatically by the test cases
2318    
2319            * test/README: Add note about skipped tests and the requirements
2320            of the postgis tests.
2321    
2322            * Thuban/Model/postgisdb.py: New. Basic postgis database support.
2323    
2324            * test/test_postgis_db.py: New. Test cases for the postgis
2325            support.
2326    
2327            * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
2328            format
2329    
2330            * test/test_wellknowntext.py: New. Test cases for the
2331            wellknowntext parser
2332    
2333            * test/postgissupport.py: New. Support module for tests involving
2334            a postgis database.
2335    
2336            * test/support.py (execute_as_testsuite): Shut down the postmaster
2337            if it's still running after the tests
2338    
2339            * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
2340            well known text format
2341    
2342    2003-08-19  Jan-Oliver Wagner <[email protected]>
2343    
2344            * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
2345            message dialog.
2346    
2347    2003-08-18  Bernhard Herzog  <[email protected]>
2348    
2349            * test/support.py (ThubanTestResult.printErrors): Indent the
2350            reason for the skips in the output to make it a bit more readable.
2351            (execute_as_testsuite): New helper function to run a test suite
2352            and print some more information.
2353            (run_tests): Use execute_as_testsuite to run the tests
2354    
2355            * test/runtests.py (main): Use execute_as_testsuite to run the
2356            tests
2357    
2358    2003-08-18  Bernhard Herzog  <[email protected]>
2359    
2360            Fix some bugs in Thuban and the test suite that were uncovered by
2361            changes introduced in Python 2.3:
2362    
2363            * Thuban/Model/table.py (DBFTable.__init__): Make sure the
2364            filename is an absolute name
2365    
2366            * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
2367            filename is an absolute name
2368    
2369            * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
2370            unique filename to save to and use the correct relative filename
2371            in the expected output.
2372            (SaveSessionTest.test_dbf_table): Use the correct relative
2373            filename in the expected output.
2374    
2375            * test/test_layer.py (TestLayer.test_raster_layer): Update the
2376            test to check whether the filename is absolute.
2377    
2378    2003-08-18  Jan-Oliver Wagner <[email protected]>
2379    
2380            * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
2381    
2382    2003-08-15  Bernhard Herzog  <[email protected]>
2383    
2384            Change the way shapes are returned by a shape store. The
2385            ShapesInRegion method returns an iterator over actual shape
2386            objects instead of a list of shape ids.
2387    
2388            * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
2389            id.
2390            (ShapefileStore.ShapesInRegion): Return an iterator over the
2391            shapes which yields shape objects instead of returning a list of
2392            shape ids
2393            (ShapefileStore.AllShapes): New. Return an iterator over all
2394            shapes in the shape store
2395            (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
2396    
2397            * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
2398            doc-string.
2399    
2400            * Thuban/UI/baserenderer.py
2401            (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
2402            layer_shapes and make it return an iterator containg shapes
2403            instead of a list of ids.
2404            (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
2405            layer_shapes() change
2406    
2407            * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
2408            (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
2409    
2410            * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
2411            changes in the ShapesInRegion return value.
2412            (ViewPort._get_hit_tester): Remove commented out code
2413    
2414            * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
2415            new return value.
2416            (SimpleShapeStore.AllShapes): New. Implement this method too.
2417    
2418            * test/test_layer.py (TestLayer.test_arc_layer)
2419            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
2420            (TestLayer.test_point_layer_with_projection)
2421            (TestLayer.test_derived_store): Adapt to changes in the
2422            ShapesInRegion return value.
2423    
2424            * test/test_shapefilestore.py
2425            (TestShapefileStoreArc.test_shapes_in_region)
2426            (TestShapefileStorePolygon.test_shapes_in_region)
2427            (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
2428            in the ShapesInRegion return value.
2429            (TestShapefileStorePoint.test_all_shapes)
2430            (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
2431            methods
2432    
2433            * test/test_derivedshapestore.py
2434            (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
2435            the ShapesInRegion return value.
2436            (TestDerivedShapeStore.test_all_shapes)
2437            (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
2438            methods
2439    
2440    2003-08-15  Bernhard Herzog  <[email protected]>
2441    
2442            Make the renderers deal correctly with raw vs. python level
2443            representation of shape geometries
2444    
2445            * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
2446            Return a flag useraw in addition to the callable and the parameter
2447            to indicate whether the callable can deal with the raw shape data
2448            or uses the higher level python lists of coordinates. The callable
2449            now should accept either the raw data or the return value of the
2450            shape's Points() method.
2451            (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
2452            change
2453            (BaseRenderer.projected_points): Instead of the shape id use the
2454            points list as parameter.
2455            (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
2456            (BaseRenderer.draw_point_shape): Adapt to projected_points()
2457            change and accept the points list as parameter instead of the
2458            shape id.
2459    
2460            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
2461            the useraw flag as required by the BaseRenderer
2462            (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
2463            changes.
2464    
2465            * test/test_baserenderer.py
2466            (TestBaseRenderer.test_point_with_classification): New test for
2467            rendering a map with classifications.
2468    
2469    2003-08-15  Bernhard Herzog  <[email protected]>
2470    
2471            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
2472            (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
2473            (ViewPort._get_hit_tester, ViewPort.projected_points)
2474            (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
2475            (ViewPort._find_label_at): Split the find_shape_at method into
2476            several new methods and use the functions in the hit-test module.
2477    
2478            * Thuban/UI/hittest.py: New module with Python-level hit-testing
2479            functions
2480    
2481            * test/test_hittest.py: New. Test for the new hittest module
2482    
2483    2003-08-15  Bernhard Herzog  <[email protected]>
2484    
2485            * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
2486            projection to all corners of the bounding box to get a better
2487            approximation of the projected bounding box
2488    
2489            * test/test_layer.py (TestLayer.test_point_layer_with_projection):
2490            New. Test coordinate handling of a layer with a projection.
2491            Catches the bug fixed in Layer.ShapesInRegion
2492    
2493    2003-08-15  Bernhard Herzog  <[email protected]>
2494    
2495            Move some of the mock objects in test_baserenderer into their own
2496            module so they can easily be used from other tests
2497    
2498            * test/mockgeo.py: New test helper module with some mock objects
2499            for geometry related things like shapes, shapestores and
2500            projections.
2501    
2502            * test/test_mockgeo.py: New. Tests for the new helper module
2503    
2504            * test/test_baserenderer.py: Some of the mock-objects are in
2505            mockgeo now.
2506    
2507    2003-08-12  Jan-Oliver Wagner <[email protected]>
2508    
2509            * Thuban/UI/about.py (About.__init__): Added Bj�rn Broscheit.
2510    
2511    2003-08-12  Bernhard Herzog  <[email protected]>
2512    
2513            * po/de.po: New. German translations by Bjoern Broscheit
2514    
2515    2003-08-12  Bernhard Herzog  <[email protected]>
2516    
2517            * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
2518            strings have to be one string literal.
2519    
2520    2003-08-11  Bernhard Herzog  <[email protected]>
2521    
2522            * test/support.py (FloatComparisonMixin.assertPointListEquals):
2523            New. This method was used in various derived classes, but it's
2524            better to have it here.
2525    
2526            * test/test_shapefilestore.py
2527            (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
2528            FloatComparisonMixin
2529    
2530            * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
2531            It's now in FloatComparisonMixin
2532    
2533            * test/test_derivedshapestore.py
2534            (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
2535            in FloatComparisonMixin
2536    
2537    2003-08-11  Bernhard Herzog  <[email protected]>
2538    
2539            * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
2540            error message
2541    
2542    2003-08-08  Jan-Oliver Wagner <[email protected]>
2543    
2544            * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
2545            with version number.
2546            Changed title to reflect version number of Thuban.
2547    
2548    2003-08-08  Jan-Oliver Wagner <[email protected]>
2549    
2550            * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
2551            the list corresponds to the "About" web page.
2552    
2553    2003-08-08  Bernhard Herzog  <[email protected]>
2554    
2555            * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
2556            Make sure translated strings are recognized as one string literal.
2557    
2558            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
2559            Make sure translated strings are recognized as one string literal.
2560    
2561            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
2562            translated strings are recognized as one string literal.
2563    
2564            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
2565            sure translated strings are recognized as one string literal.
2566    
2567    2003-08-07  Bernhard Herzog  <[email protected]>
2568    
2569            * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
2570            Simply delegates to the original shapestore.
2571    
2572            * test/test_derivedshapestore.py
2573            (TestDerivedShapeStore.test_raw_format): New. Test case for
2574            DerivedShapeStore.RawShapeFormat
2575    
2576    2003-08-07  Bernhard Herzog  <[email protected]>
2577    
2578            Add raw data interface to shape objects.
2579    
2580            * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
2581            class to ShapefileShape which now holds shapefile specific
2582            information.
2583            (ShapefileShape.compute_bbox): Simplified to not cache any
2584            information. The way this method is used that shouldn't matter
2585            performance wise.
2586            (ShapefileShape.RawData): New. Return the shapeid which is the raw
2587            data format for shapes from shapefiles.
2588            (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
2589            in the shape objects returned by a shapestore. For a
2590            ShapefileStore this is always RAW_SHAPEFILE.
2591            (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
2592            method.
2593    
2594            * test/test_shapefilestore.py
2595            (TestShapefileStore.test_raw_format): New test to test the raw
2596            format feature of shapes.
2597    
2598            * Thuban/Model/layer.py: Remove the unused import of Shape from
2599            data. It was only there for interface compatibility but it's not
2600            used inside of Thuban and the generic Shape class has gone away.
2601    
2602            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
2603            the raw data format and only use an optimized version of its a
2604            shapefile.
2605    
2606    2003-08-07  Bernhard Herzog  <[email protected]>
2607    
2608            * test/test_baserenderer.py (SimpleShape): Shape class for the
2609            tests.
2610            (SimpleShapeStore.Shape): Use SimpleShape instead of
2611            Thuban.Model.data.Shape to make the tests independed of the coming
2612            changes.
2613    
2614    2003-08-07  Bernhard Herzog  <[email protected]>
2615    
2616            * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
2617            (ThubanTestProgram): New classes that extend the respective
2618            classes from unittest. These new version support skipping tests
2619            under certain expected conditions. In the Thuban test suite we
2620            uses this for tests that require the optional gdal support.
2621            (run_tests): Use ThubanTestProgram instead of the unittest.main()
2622    
2623            * test/runtests.py (main): Use the new ThubanTestRunner instead of
2624            the normal one from unittest
2625    
2626            * test/test_layer.py (TestLayer.test_raster_layer): If this test
2627            is not run because gdal support isn't available report this to the
2628            runner.
2629    
2630            * test/test_baserenderer.py
2631            (TestBaseRenderer.test_raster_no_projection): Do not run this test
2632            if gdal support isn't available and report this to the runner.
2633    
2634    2003-08-06  Bernhard Herzog  <[email protected]>
2635    
2636            Rearrange the renderers a bit, partly in preparation for changes
2637            required for the postgis merge, partly to make it more testable.
2638            Also make the representation of coordinates in Shapes more
2639            consistent.
2640    
2641            * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
2642            this class is now in BaseRenderer. This class is now practically
2643            only a specialization of BaseRenderer for rendering to an actual
2644            wx DC.
2645            (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
2646            to get the shapetype specific rendering functions.
2647    
2648            * Thuban/UI/baserenderer.py: New file with the basic rendering
2649            logic. The code in this file is completely independend of wx.
2650            (BaseRenderer): Class with the basic rendering logic
2651    
2652            * test/test_baserenderer.py: New. Test cases for BaseRenderer
2653    
2654            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
2655            error_on_redraw to guard agains endless loops and stack overflows
2656            when there's a bug in the rendering code that raises exceptions.
2657            (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
2658            rendering into a separate method _do_redraw so that error handling
2659            is a bit easier. When an exception occurs, set error_on_redraw to
2660            true. When it's true on entry to OnIdle do nothing and return
2661            immediately.
2662    
2663            * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
2664            Shape object will always have the coordinates as a list of list of
2665            coordinate pairs (tuples).
2666            (Shape.compute_bbox): Adapt to new representation.
2667    
2668            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
2669            (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
2670            Shape objects.
2671    
2672            * test/test_shapefilestore.py
2673            (ShapefileStoreTests.assertFloatTuplesEqual)
2674            (ShapefileStoreTests.assertPointListEquals): Rename to
2675            assertPointListEquals and change purpose to checking equality of
2676            the lists returned by Shape.Points().
2677            (TestShapefileStoreArc.test_shape)
2678            (TestShapefileStorePolygon.test_shape)
2679            (TestShapefileStorePoint.test_shape): Use the new
2680            assertPointListEquals instead of assertFloatTuplesEqual
2681    
2682            * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
2683            (TestLayer.assertPointListEquals): Rename to assertPointListEquals
2684            and change purpose to checking equality of the lists returned by
2685            Shape.Points().
2686            (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
2687            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
2688            (TestLayer.test_derived_store): Use the new assertPointListEquals
2689            instead of assertFloatTuplesEqual
2690    
2691            * test/test_derivedshapestore.py
2692            (TestDerivedShapeStore.assertFloatTuplesEqual)
2693            (TestDerivedShapeStore.assertPointListEquals): Rename to
2694            assertPointListEquals and change purpose to checking equality of
2695            the lists returned by Shape.Points().
2696            (TestDerivedShapeStore.test_shape): Use the new
2697            assertPointListEquals instead of assertFloatTuplesEqual
2698    
2699    2003-08-06  Jan-Oliver Wagner <[email protected]>
2700    
2701            * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
2702            a bounding box. A dialog is raised in case, no bounding box
2703            is found. This fixes bug #2043:
2704            https://intevation.de/rt/webrt?serial_num=2043
2705    
2706    2003-08-05  Bernhard Herzog  <[email protected]>
2707    
2708            * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
2709            object look like a Color instantiation. Formerly it looked like a
2710            tuple.
2711    
2712            * test/test_color.py (TestColor.test_repr)
2713            (TestColor.test_equality, TestColor.test_inequality): New. test
2714            some more apects of the Color class
2715            (TestTransparent.test_repr, TestTransparent.test_hex)
2716            (TestTransparent.test_equality): New. Test cases for the
2717            Transparent object.
2718    
2719    2003-08-04  Jan-Oliver Wagner <[email protected]>
2720    
2721            * Doc/manual/thuban-manual.xml: a number of small improvements.
2722            The resulting file is the version submitted for GREAT-ER II.
2723    
2724    2003-08-01  Bernhard Herzog  <[email protected]>
2725    
2726            * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
2727            Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
2728            Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
2729    
2730            * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
2731            (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
2732            (ThubanEndBusyCursor): Add doc-strings
2733    
2734    2003-08-01  Bernhard Herzog  <[email protected]>
2735    
2736            First step towards PostGIS integration. More abstraction by movin
2737            more code from the layer to the shapestore. More methods of the
2738            layer are now simply delegated to the equivalent method of the
2739            shapestore. The SHAPETYPE_* constants are now in data not in
2740            layer.
2741    
2742            * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
2743            (SHAPETYPE_POINT, Shape): Move these constants and classes from
2744            layer.py to data.py
2745            (ShapefileStore.__init__): More Initialization for the new methods
2746            and functionality.
2747            (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
2748            (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
2749            (ShapefileStore.Shape): New methods that were formerly implemented
2750            in the layer.
2751            (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
2752            (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
2753            (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
2754            equivalents of the new shape methods. These versions are simply
2755            delegated to the original shapstore.
2756    
2757            * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
2758            (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
2759            (Layer.SetShapeStore): Removed the initializatin of instance
2760            variables that were needed for the stuff that's now in
2761            ShapefileStore
2762            (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
2763            (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
2764            shapestore.
2765    
2766            * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
2767            Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
2768            instead of layer.
2769    
2770            * test/test_shapefilestore.py: New. Tests for ShapefileStore.
2771    
2772            * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
2773    
2774            * test/test_layer.py: Import the SHAPETYPE_* constants from data
2775            instead of layer.
2776            (TestLayer.test_derived_store): Remove the test for the exception
2777            when instantiating the DerivedShapeStore with an incompatible
2778            table which is now in test_derivedshapestore.py. Add some more
2779            tests of the layer methods to determine whether they work for a
2780            DerivedShapeStore as well.
2781    
2782    2003-07-31  Jonathan Coles   <[email protected]>
2783    
2784            * Doc/manual/thuban-manual.xml: Fix the list of required packages
2785            by just listing the name and where they can be found.
2786    
2787    2003-07-31  Frank Koormann   <[email protected]>
2788    
2789            * Doc/manual/thuban-manual.xml:
2790            Changed the screenshot elements to figure.
2791            Changed some variablelist elements to itemizedlist.
2792            Added section on GDAL formats.
2793    
2794    2003-07-31  Jonathan Coles   <[email protected]>
2795    
2796            * Doc/manual/thuban-manual.xml: Added a few sentences about
2797            the Fix Border Color option when generating classes.
2798    
2799    2003-07-30  Jonathan Coles   <[email protected]>
2800    
2801            * Thuban/Model/classgen.py: Add docstrings. Rename specific
2802            Ramp instances to use lower_case_style.
2803    
2804            * Thuban/UI/classgen.py: Use renamed Ramp instances.
2805            
2806            * Thuban/UI/classifier.py: Add docstrings.
2807    
2808            * Thuban/UI/dock.py: Add docstrings.
2809    
2810            * test/test_classgen.py: Use renamed Ramp instances.
2811    
2812    2003-07-30  Bernhard Herzog  <[email protected]>
2813    
2814            * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
2815            was never used in Thuban.
2816    
2817    2003-07-30  Bernhard Herzog  <[email protected]>
2818    
2819            * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
2820            method directly instead of going through the transient_table
2821            method. This faster because transient_table may force the copy of
2822            a DBF file into the transient database and setting a table's title
2823            doesnm't affect the title of the associated transient table, so
2824            this fixes RT #2042
2825    
2826            * Thuban/UI/main.py (__version__): Don't import the already
2827            removed show_exception_dialog.
2828    
2829    2003-07-29  Jonathan Coles   <[email protected]>
2830    
2831            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
2832            Put back this method and remove the equivalent function since we
2833            are setting the exception hook from within this class (OnInit).
2834    
2835    2003-07-29  Jonathan Coles   <[email protected]>
2836    
2837            * Doc/manual/images/5_2_custom_ramp.png,
2838            Doc/manual/images/5_2_quantiles.png,
2839            Doc/manual/images/5_2_uniform_dist.png,
2840            Doc/manual/images/5_2_unique_values.png,
2841            Doc/manual/images/8_int_error.png: New screen shots.
2842    
2843            * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
2844            some points, and added more screen shots.
2845    
2846    2003-07-29  Bernhard Herzog  <[email protected]>
2847    
2848            * Thuban/Model/data.py: Remove the now unused import of warnings
2849    
2850    2003-07-29  Bernhard Herzog  <[email protected]>
2851    
2852            * Thuban/Model/data.py (SimpleStore): Removed. This class has been
2853            deprecated since before the 0.8 release and isn't used in Thuban
2854            itself anymore.
2855    
2856            * Thuban/Model/transientdb.py: Remove some unnecessary imports
2857    
2858    2003-07-29  Jonathan Coles   <[email protected]>
2859    
2860            * Thuban/UI/application.py (ThubanApplication.OnInit): set the
2861            python exception hook here so that we are sure to catch any
2862            Thuban exception that happen during initialization.
2863    
2864            * Thuban/UI/main.py (main): Don't set the exception hook here,
2865            it will get set in ThubanApplication.OnInit.
2866    
2867    2003-07-29  Jonathan Coles   <[email protected]>
2868                                                                                
2869            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
2870            Removed and called it show_exception_dialog() so that the exception
2871            handler can be set before the class is created.
2872                                                                                
2873            * Thuban/UI/main.py (main): Install the exception handler before
2874            a ThubanApplication is created.
2875                                                                                    
2876    2003-07-29  Bernhard Herzog  <[email protected]>
2877    
2878            * po/it.po: New. Italian translation by Maurizio Napolitano
2879    
2880            * po/ru.po: New. Russian translation by Alex Shevlakov
2881    
2882    2003-07-29  Frank Koormann   <[email protected]>
2883    
2884            * Doc/manual/thuban-manual.xml: Extended section on supported
2885            projections.
2886            
2887    2003-07-29  Frank Koormann   <[email protected]>
2888    
2889            * Doc/manual/thuban-manual.xml: gaspell-checked.
2890    
2891    2003-07-29  Jonathan Coles   <[email protected]>
2892    
2893            * Doc/manual/images/3_5_legend.png: Added border to improve look
2894            on white background.
2895    
2896    2003-07-29  Jonathan Coles   <[email protected]>
2897    
2898            * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
2899            descriptions for the legend toolbar.
2900    
2901            * Doc/manual/images/4_2_raster_layer_properties.png: Removed
2902            cursor from dialog box.
2903    
2904    2003-07-28  Jonathan Coles   <[email protected]>
2905    
2906            * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
2907    
2908            * Doc/manual/images/2_4_session_tree.png,
2909            Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
2910            Doc/manual/images/4_2_layer_properties.png,
2911            Doc/manual/images/4_2_raster_layer_properties.png,
2912            Doc/manual/images/5_3_genclass.png,
2913            Doc/manual/images/5_classification.png,
2914            Doc/manual/images/6_projection.png,
2915            Doc/manual/images/7_1_table_view.png,
2916            Doc/manual/images/7_2_5_join.png: New screenshots.
2917    
2918    2003-07-24  Jonathan Coles   <[email protected]>
2919    
2920            * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
2921    
2922    2003-07-24  Jonathan Coles   <[email protected]>
2923    
2924            * Doc/manual/thuban-manual.xml: Added EPS images and wrote
2925            chapter on Layer Management.
2926    
2927            * Doc/manual/Makefile: New. Makefile to generate all formats for the
2928            manual and images.
2929    
2930    2003-07-24  Bernhard Herzog  <[email protected]>
2931    
2932            * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
2933            it annoys lintian which warns about these files not being
2934            executable. The #! isn't necessary here since if you absolutely
2935            must execute them you can always say "python <filename>".
2936    
2937            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
2938            superfluous code to set brush and pen for point shapes
2939    
2940            * Thuban/UI/viewport.py: Remove commented out code that wouldn't
2941            belong in viewport anyway
2942    
2943    2003-07-24  Frank Koormann   <[email protected]>
2944    
2945            * Doc/manual/thuban-manual.xml: Added section on table management.
2946    
2947    2003-07-24  Bernhard Herzog  <[email protected]>
2948    
2949            * test/runtests.py (main): Recognize the long "verbose" option
2950            correctly.
2951    
2952    2003-07-22  Jonathan Coles   <[email protected]>
2953    
2954            * Doc/manual/thuban-manual.xml: Continue to write first revision
2955            of the manual.
2956    
2957            * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
2958            with Begin/EndDrawing() calls to ensure we aren't doing to
2959            many updates to the dc during rendering.
2960            (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
2961            a pen and brush argument so they need to be passed to the function.
2962    
2963            * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
2964            Calculates the minimum and maximum scale values. Factored out
2965            of set_view_transform so that it could be used to zoom all the
2966            way into a single point.
2967            (ViewPort.set_view_transform): Call calc_min_max_scales().
2968            (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
2969            if only a single point is selected.
2970    
2971            * Doc/manual/images/1_2_legend_close.png,
2972            Doc/manual/images/1_2_legend_dock.png,
2973            Doc/manual/images/1_2_mainwindow.png,
2974            Doc/manual/images/1_2_mainwindow.ps,
2975            Doc/manual/images/1_2_mainwindow.sk,
2976            Doc/manual/images/3_2_fullextent.png,
2977            Doc/manual/images/3_2_fulllayerextent.png,
2978            Doc/manual/images/3_2_fullshapeextent.png,
2979            Doc/manual/images/3_2_pan.png,
2980            Doc/manual/images/3_2_zoomin.png,
2981            Doc/manual/images/3_2_zoomout.png,
2982            Doc/manual/images/3_3_identify.png,
2983            Doc/manual/images/3_3_label.png,
2984            Doc/manual/images/3_5_invisible.png,
2985            Doc/manual/images/3_5_movedown.png,
2986            Doc/manual/images/3_5_moveup.png,
2987            Doc/manual/images/3_5_props.png,
2988            Doc/manual/images/3_5_tobottom.png,
2989            Doc/manual/images/3_5_totop.png,
2990            Doc/manual/images/3_5_visible.png: New. Images for the documentation.
2991    
2992    2003-07-18  Bernhard Herzog  <[email protected]>
2993    
2994            * Thuban/UI/messages.py (MAP_REPLACED): New message.
2995    
2996            * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
2997            after the new map has been assigned
2998    
2999            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
3000            Delegate MAP_REPLACED to the canvas too
3001            (MainWindow.prepare_new_session): Removed. Thanks to the new
3002            MAP_REPLACED message it's no longer needed
3003            (MainWindow.OpenSession, MainWindow.NewSession):
3004            prepare_new_session has been removed.
3005    
3006            * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
3007            MAP_REPLACED so that we can close the dialog if a new map is set.
3008            (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
3009            (Classifier.map_replaced): Handle MAP_REPLACED by closing the
3010            dialog
3011    
3012            * test/test_viewport.py (SimpleViewPortTest)
3013            (SimpleViewPortTest.test_default_size): Add doc-strings
3014            (ViewPortTest.setUp): Bind map to self.map so we can use it in
3015            tests. Subscribe to MAP_REPLACED messages too.
3016            (ViewPortTest.tearDown): No need to explicitly unsubscribe
3017            (ViewPortTest.test_set_map): New test for the SetMap method.
3018    
3019    2003-07-18  Bernhard Herzog  <[email protected]>
3020    
3021            * test/test_viewport.py (SimpleViewPortTest.test_default_size):
3022            Move this test from ViewPortTest.setUp to this new separate test
3023            case. setUp is not the place for the actual tests.
3024            (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
3025            more of the test from setUp to the new test test_inital_settings.
3026            (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
3027            (ViewPortTest.test_proj_conv): Split test_proj_conv into
3028            test_win_to_proj and test_proj_to_win and make the tests easier to
3029            understand
3030            (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
3031            (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
3032            (ViewPortTest.test_unprojected_rect_around_point)
3033            (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
3034            Reformat to increase readability.
3035    
3036    2003-07-18  Bernhard Herzog  <[email protected]>
3037    
3038            * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
3039    
3040    2003-07-18  Bernhard Herzog  <[email protected]>
3041    
3042            * test/runtests.py: The test suite can now be run without an X
3043            connection. To make sure this remains true, remove the DISPLAY
3044            environment variable so that an error occurs if the wxGTK is
3045            imported accidentally
3046    
3047    2003-07-18  Bernhard Herzog  <[email protected]>
3048    
3049            * Thuban/UI/viewport.py: Remove unused imports
3050    
3051            * Thuban/UI/view.py: Remove unused imports
3052    
3053    2003-07-18  Bernhard Herzog  <[email protected]>
3054    
3055            * test/test_export.py Remove unused imports. The OutputTransform
3056            function is now in viewport.py and is called output_transform
3057            (TestScalebar.test_output_transform)
3058            (TestScalebar.test_OutputTransform): Renamed to
3059            test_output_transform and updated to use output_transform instead
3060            of OutputTransform
3061    
3062            * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
3063            renamed.
3064            (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
3065            renamed to output_transform
3066    
3067            * Thuban/UI/viewport.py (OutputTransform, output_transform):
3068            Rename to output_transform
3069    
3070    2003-07-18  Bernhard Herzog  <[email protected]>
3071    
3072            * Thuban/Model/layer.py (Layer.__init__): Rename
3073            classificationField to classificatin_column and init it here so
3074            that it can be used in SetClassificationColumn
3075            (Layer.GetClassificationColumn, Layer.GetClassificationField):
3076            Rename to GetClassificationColumn.
3077            (Layer.SetClassificationColumn, Layer.SetClassificationField):
3078            Rename to SetClassificationColumn and issue a LAYER_CHANGED
3079            message if the column changes.
3080            (Layer._classification_changed, Layer.ClassChanged): Rename to
3081            _classification_changed. Update the callers.
3082            (Layer.SetShapeStore): Further field->column renames.
3083    
3084            * Thuban/Model/load.py (SessionLoader.start_classification)
3085            (SessionLoader.start_clpoint): Updates because of
3086            field->column method name changes in the Layer class
3087    
3088            * Thuban/Model/save.py (SessionSaver.write_classification): Updates
3089            because of field->column method name changes in the Layer class
3090    
3091            * Thuban/UI/classifier.py (Classifier.__init__)
3092            (Classifier._OnTry, Classifier._OnRevert): Updates because of
3093            field->column method name changes in the Layer class
3094    
3095            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
3096            because of field->column method name changes in the Layer class
3097    
3098            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
3099            of field->column method name changes in the Layer class
3100    
3101            * test/test_save.py (SaveSessionTest.testClassifiedLayer)
3102            (SaveSessionTest.testClassifiedLayer): Update because of
3103            field->column method name changes in the Layer class
3104    
3105            * test/test_layer.py (SetShapeStoreTests.setUp)
3106            (SetShapeStoreTests.test_sanity): Update because of field->column
3107            method name changes in the Layer class
3108            (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
3109            (TestLayerModification.test_sanity)
3110            (TestLayerModification.test_initial_settings): remove unsued code
3111            and rename to test_sanity.
3112            (TestLayerModification.test_set_classification): New test for
3113            SetClassification and SetClassificationField.
3114    
3115    2003-07-18  Bernhard Herzog  <[email protected]>
3116    
3117            * test/test_classgen.py (TestFixedRamp.test): Extend test to check
3118            the non-fixed values as well. The old test would have accepted a
3119            fixed ramp that only returnes the fixed properties
3120    
3121    2003-07-17  Jonathan Coles   <[email protected]>
3122    
3123            * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
3124            shots for the manual. The XCF file is the source image and
3125            has additional layers to support changes.
3126    
3127            * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
3128    
3129            * Thuban/UI/classifier.py (Classifier.__BuildClassification):
3130            Return both the new class and the field name.
3131    
3132            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
3133            fit the map to the window as this changes any zoom level that
3134            the user may have set.
3135    
3136    2003-07-16  Jonathan Coles   <[email protected]>
3137    
3138            * Thuban/Model/classgen.py (generate_singletons,
3139            generate_uniform_distribution, generate_quantiles): Remove
3140            fixes parameter, but maintain the same functionality by having
3141            the calling function pass a FixedRamp object for the ramp.
3142            (FixedRamp): New. Adapts a ramp to have fixed property values.
3143    
3144            * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
3145            (Classification): Inherit from Publisher.
3146            (Classification.__init__): Remove the layer parameter.
3147            Classifications no longer need to have a parent layer.
3148            (Classification.GetField, Classification.GetFieldType,
3149            Classification.SetFieldInfo): Removed. The field name is stored
3150            in the layer, and the type can be retreived by calling
3151            Layer.GetFieldType().
3152            (Classification._set_layer, Classification.GetLayer): Removed.
3153            Classifications no longer have a parent layer.
3154    
3155            * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
3156            classification.
3157            (Layer.SetShapeStore): Reset the classification first while
3158            we still have the old shape store to work with.
3159            (Layer.GetClassificationField, Layer.SetClassificationField):
3160            New. Method for getting/setting the field to classify on.
3161            (Layer.SetClassification): Simplified now that the layer
3162            simply has to hold a reference to the classification and not
3163            tell the classification who owns it.
3164            Fixes RTbug #2023.
3165    
3166            * Thuban/Model/load.py (SessionLoader.start_classification):
3167            Set the field name on the layer, not the classification.
3168    
3169            * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
3170            classification is modified.
3171    
3172            * Thuban/Model/save.py (SessionSaver.write_classification):
3173            Get the field name and type from the layer.
3174    
3175            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
3176            parameter records to rows and add docstring. Fixes RTbug #1997.
3177    
3178            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
3179            ramp when we need to fix certain values of a ramp rather than
3180            using the old fixes parameter. Fixes RTbug #2024.
3181    
3182            * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
3183            parameter.
3184            (ClassTable.Reset): Add fieldType parameter and use it, rather
3185            than asking the classification.
3186            (Classifier.__init__): Remember the original class's field
3187            and ask the layer for the field type, rather than the classification.
3188            (Classifier.__SetGridTable): Retrieve the field and field type
3189            for the table because they are not in the classification.
3190            (Classifier._OnTry, Classifier._OnRevert): Set the classification
3191            field on the layer in addition to the classification itself.
3192    
3193            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
3194            classification field from layer.
3195    
3196            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
3197            classification field from layer. Split up tests and remove
3198            *-imports. Fixes RTbug #1992.
3199    
3200            * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
3201    
3202            * test/test_classification.py
3203            (TestClassification.test_classification): Remove tests for methods
3204            that no longer exist.
3205    
3206            * test/test_layer.py (SetShapeStoreTests.setUp): Classification
3207            __init__ no longer has a field parameter, use SetClassificationField.
3208            (SetShapeStoreTests.test_sanity): Use layer object to get class
3209            field info.
3210    
3211            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
3212            SetClassificationField on layer to set class field info.
3213    
3214            * test/test_viewport.py: Renamed from test/test_view.py.
3215    
3216    2003-07-16  Jan-Oliver Wagner <[email protected]>
3217    
3218            * Doc/manual/thuban-manual.xml: Added authors and an initial
3219            coarse structure.
3220    
3221    2003-07-15  Bernhard Herzog  <[email protected]>
3222    
3223            * test/support.py (FloatComparisonMixin): This is a mix-in class
3224            and therefore should not be derived from any other class.
3225    
3226            * test/test_range.py (RangeTest): FloatComparisonMixin is a
3227            mix-in, so derive from TestCase as well.
3228    
3229    2003-07-15  Bernhard Herzog  <[email protected]>
3230    
3231            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
3232            draw_func handling a bit to remove one layer of indirection. This
3233            makes the renderer about 10% faster in the non-classifying case
3234            and the code a bit cleaner
3235            (MapRenderer.draw_point_shape): Add the pen and brush parameters
3236            and set them in the dc. Now the draw_point_shape method and
3237            wxproj's draw_polygon_shape function have basically the same
3238            signature so that both can be directly used as draw_func
3239    
3240    2003-07-15  Bernhard Herzog  <[email protected]>
3241    
3242            * Thuban/Model/save.py (SessionSaver.write_classification): Encode
3243            string values (in addition to the labels) as UTF 8
3244    
3245            * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
3246            values if the field type is string
3247    
3248            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
3249            saving a session with non-ascii string classification values.
3250    
3251            * test/test_load.py (TestClassification.file_contents)
3252            (TestClassification.test): Check for non-ascii values in string
3253            classifications
3254    
3255    2003-07-14  Jonathan Coles   <[email protected]>
3256    
3257            * test/test_view.py: New. Tests for ViewPort.
3258    
3259    2003-07-14  Frank Koormann   <[email protected]>
3260    
3261            * Thuban/Model/load.py (SessionLoader.start_map): Encode map
3262            title to latin1.  Fixes https://intevation.de/rt/webrt?serial_num=2013
3263    
3264            * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
3265            unicode strings from session file: session title, map title and
3266            projection name.
3267            
3268    2003-07-10  Jonathan Coles   <[email protected]>
3269    
3270            * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
3271            drag_stop, not drag_move when the mouse is released.
3272    
3273    2003-07-10  Jonathan Coles   <[email protected]>
3274    
3275            The most important part of this is the seperation of view.py into
3276            two pieces. viewport.py now has a class called ViewPort which
3277            contains all the non-wx parts of view.py and can therefore be
3278            tested. view.py contains only the wx-specific parts and is fairly
3279            simple.
3280    
3281            * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
3282            RTTbug #1992.
3283            * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
3284            RTTbug #1992.
3285    
3286            * Thuban/Model/classgen.py (generate_singletons,
3287            generate_uniform_distribution, generate_quantiles):
3288            Added 'fixes' parameter so that property attributes can
3289            be held constant over the generated classification groups.
3290            (CustomRamp.GetProperties): Remove unused variables.
3291    
3292            * Thuban/Model/map.py (Map.SetProjection): Send the old
3293            projection as an argument to listeners of the MAP_PROJECTION_CHANGED
3294            event.
3295    
3296            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
3297            parameter which is a list of records that restricts which
3298            records are saved. Fixes RTbug #1997.
3299    
3300            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3301            Port exception dialog from GREAT-ER. Fixes RTbug #1993.
3302    
3303            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
3304            to allow the user to fix line color/width on generated groups.
3305            (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
3306            functions to optionally fix group properties.
3307    
3308            * Thuban/UI/main.py (main): Set exception hook to the
3309            ShowExceptionDialog. Fixes RTbug #1993.
3310    
3311            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
3312            the table window when it is selectd to be shown.
3313    
3314            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
3315            Export Selection button and move the export buttons underneath
3316            the table.
3317            (QueryTableFrame.UpdateStatusText): Added event argument so
3318            that it can respond to grid selection events. The status text
3319            is now updated even when the table is not associated with a
3320            layer as was previously assumed.
3321            (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
3322            UpdateStatusText responds to these events.
3323            (QueryTableFrame.OnSaveAs): Renamed to doExport.
3324            (QueryTableFrame.doExport): Helper function that saves the
3325            entire table, or selected rows, to a file.
3326            (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
3327            Respond to export button events and call doExport.
3328    
3329            * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
3330            the function doesn't return NULL without first setting a Python
3331            Error.
3332    
3333            * test/runtests.py (main): Only print "Unknown option" for
3334            unsupported options.
3335    
3336            * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
3337            optional epsilon argument to specify floating point accuracy.
3338            (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
3339            for each item test.
3340    
3341            * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
3342            tests for saving selected records.
3343    
3344            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
3345            tests for saving selected records.
3346    
3347            * test/test_map.py (TestMapWithContents.test_set_projection):
3348            MAP_PROJECTION_CHANGED events send the old projection.
3349    
3350            * test/test_session.py
3351            (TestSessionWithContent.test_forward_map_projection):
3352            MAP_PROJECTION_CHANGED events send the old projection.
3353    
3354            * test/test_table.py (TableTest): Update tests to use non-deprecated
3355            functions.
3356    
3357    2003-07-08  Bernhard Herzog  <[email protected]>
3358    
3359            * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
3360            constants in the column objects are the standard ones defined in
3361            the table module.
3362    
3363            * test/test_transientdb.py
3364            (TestTransientTable.test_transienttable_to_dbf): New. Test whether
3365            exporting transient tables as DBF works. This should catch the bug
3366            just fixed in TransientTableBase.Width.
3367    
3368    2003-07-08  Bernhard Herzog  <[email protected]>
3369    
3370            * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
3371            interpolated colors correctly.
3372    
3373            * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
3374            New. Test case for the fix in classgen.py
3375    
3376    2003-07-08  Bernhard Herzog  <[email protected]>
3377    
3378            * test/runtests.py (main): Make the default output less verbose
3379            and add a verbosity option (-v) to get the old output
3380    
3381    2003-07-08  Bernhard Herzog  <[email protected]>
3382    
3383            * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
3384            0.9.
3385    
3386            * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
3387            New. Return the join type
3388    
3389            * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
3390            DTD
3391            (SessionSaver.write_data_containers): Save the join type for
3392            joined tables
3393    
3394            * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
3395            namespace
3396            (SessionLoader.start_jointable): Handle the jointype attribute
3397    
3398            * test/test_load_0_8.py: New. Effectively a copy of test_load.py
3399            as of Thuban 0.8. These are now tests to determine whether Thuban
3400            can still read files generated by Thuban 0.8
3401    
3402            * test/test_load.py (LoadSessionTest.dtd)
3403            (TestSingleLayer.file_contents)
3404            (TestLayerVisibility.file_contents, TestLabels.file_contents)
3405            (TestLayerProjection.file_contents)
3406            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3407            (TestJoinedTable.file_contents)
3408            (TestLoadError.file_contents): Update for new DTD
3409            (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
3410            for new join type attribute
3411    
3412            * test/test_save.py (SaveSessionTest.dtd)
3413            (SaveSessionTest.testEmptySession)
3414            (SaveSessionTest.testSingleLayer)
3415            (SaveSessionTest.testLayerProjection)
3416            (SaveSessionTest.testRasterLayer)
3417            (SaveSessionTest.testClassifiedLayer)
3418            (SaveSessionTest.test_dbf_table)
3419            (SaveSessionTest.test_joined_table): Update for new DTD
3420            (SaveSessionTest.test_joined_table): Add test for new join type
3421            attribute
3422    
3423    2003-07-04  Bernhard Herzog  <[email protected]>
3424    
3425            * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
3426            function for table_to_dbf
3427            (table_to_dbf): Deal with names longer than the 10 character limit
3428    
3429            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
3430            doc-string
3431            (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
3432            long column names
3433    
3434    2003-07-03  Bernhard Herzog  <[email protected]>
3435    
3436            * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
3437    
3438    2003-07-03  Bernhard Herzog  <[email protected]>
3439    
3440            * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
3441            for the Thuban manual and README with some basic information about
3442            the manual
3443    
3444    2003-07-03  Bernhard Herzog  <[email protected]>
3445    
3446            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
3447            Update doc-string
3448            (TransientJoinedTable.create): Do not modify the column objects of
3449            the input tables in place and copy all columns of the input tables
3450            into the joined table after all.
3451    
3452            * test/test_transientdb.py
3453            (TestTransientTable.test_transient_joined_table_same_column_name):
3454            Update to reflect the new behavior
3455            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
3456            Update to reflect the new behavior
3457            (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
3458            New test case for a bug which modified the column objects in place
3459    
3460    2003-07-02  Jonathan Coles   <[email protected]>
3461    
3462            * Thuban/Model/classgen.py (generate_singletons,
3463            generate_uniform_distribution, generate_quantiles,
3464            GenQuantiles0): Make sure maxValue isn't less than
3465            one, otherwise we could divide by zero.
3466    
3467            * test/test_classgen.py (ClassGenTest.doClassRangeTest,
3468            ClassGenTest.doClassSingleTest): Call doBoundsTest to
3469            check the end classification groups against the
3470            proper property values.
3471            (ClassGenTest.doBoundsTest): New. Checks the first and
3472            last classification groups to make sure their properties
3473            are the correct upper and lower bounds for a color ramp.
3474    
3475    2003-07-02  Jonathan Coles   <[email protected]>
3476    
3477            * Thuban/Model/classgen.py (generate_singletons,
3478            generate_uniform_distribution, generate_quantiles,
3479            GenQuantiles0): The denominator was one to high when
3480            calculating the index for the ramp causing the index
3481            to never to reach one.
3482    
3483    2003-07-02  Jonathan Coles   <[email protected]>
3484    
3485            Changed the singature of ClassGroupRange.__init__ and
3486            ClassGroupRange.SetRange() so that the min/max values are
3487            passed as a tuple. This makes a better calling scheme for
3488            when a Range object is passed instead.
3489    
3490            * Thuban/Model/classgen.py: Fixed parameters to
3491            ClassGroupRange constructor.
3492    
3493            * Thuban/Model/classification.py (ClassGroupRange.__init__):
3494            Consolidate the min/max parameters into a single _range which
3495            can either be a tuple or a Range object.
3496            (ClassGroupRange.SetRange): Consolidate the min/max parameters
3497            into a single _range which can either be a tuple or a Range object.
3498    
3499            * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
3500            call to ClassGroupRange constructor to use a tuple.
3501    
3502            * Thuban/Model/layer.py (Layer.SetClassification): Switch
3503            the classification instance variable to the new class
3504            before calling _set_layer otherwise subscribers to a
3505            LAYER_CHANGED event will not see any difference.
3506    
3507            * test/test_classification.py: Fix tests of ClassGroupRange
3508            so that they use the new signature.
3509    
3510            * test/test_load.py: Fix use of ClassGroupRange so that it
3511            uses the new signature.
3512    
3513            * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
3514            uses the new signature.
3515    
3516            * test/test_save.py: Fix use of ClassGroupRange so that it
3517            uses the new signature.
3518    
3519    
3520    2003-07-01  Jonathan Coles   <[email protected]>
3521    
3522            * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
3523            Import used objects/class from color.
3524            (generate_singletons): We don't
3525            need the numGroups parameter anymore because we are using
3526            the new ramps with GetProperties().
3527            (generate_uniform_distribution): Use new ramp method
3528            GetProperties().
3529            (generate_quantiles, GenQuantiles0): Use new ramp method
3530            GetProperties().
3531            (CustomRamp.SetNumGroups): Removed. The ramps now map
3532            a value from 0 to 1 to class properties so the number
3533            of groups is not needed ahead of time.
3534            (CustomRamp.next): Removed. CustomRamp does not support
3535            interation anymore.
3536            (CustomRamp.GetProperties): Returns a ClassGroupProperties
3537            object based on the index value from 0 to 1 that is
3538            passed to it.
3539            (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
3540            Made into instances of Monochromatic class instread of
3541            deriving from it.
3542            (HotToCold.SetNumGroups): Removed. See CustomRamp.
3543            (HotToCold.next): Removed. See CustomRamp.
3544    
3545            * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
3546            (Classification.SetField, Classification.SetFieldType):
3547            Replaced with SetFieldInfo.
3548            (Classification.SetFieldInfo): New. Does a better job of
3549            what SetField and SetFieldType used to do by combining
3550            their function since they should really always be done
3551            at the same time.
3552            (Classification.SetLayer): Renamed to _set_layer.
3553            (Classification._set_layer): Should only be called from
3554            Layer's SetClassification. This does not cause a recursive
3555            call as SetLayer did because we know that Layer knows about
3556            the classification.
3557    
3558            * Thuban/Model/color.py: Fixes RTbug #1971.
3559            (_Transparent): Renamed from Transparent so it doesn't
3560            conflict with the module variable.
3561            (Transparent, Black): Renamed from Color.Transparent,
3562            Color.Black so they are not class variables.
3563    
3564            * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
3565            (Layer.Destroy): We don't need to call SetClassification
3566            anymore to clear out the back reference in the classifcation
3567            to the layer. It's better to set it to None using _set_layer,
3568            and we won't be creating another clas object too.
3569            (Layer.SetClassification): Classification._set_layer is not
3570            recursive so remove all the locking variables. Also clean
3571            up the code so that it remains unchanged if something fails.
3572    
3573            * Thuban/Model/load.py: Fixes RTbug #1971.
3574            (SessionLoader.start_classification): Call
3575            Classification.SetFieldInfo().
3576    
3577            * Thuban/Model/save.py: Removed import of Color which wasn't
3578            being used.
3579    
3580            * Thuban/UI/classgen.py: Fixes RTbug #1972.
3581            (ClassGenDialog.__init__): Color ramps are now instances
3582            already so we don't need to create any new objects.
3583            (ClassGenDialog.OnOK): Check for numGroups is no longer
3584            necessary because we never use it.
3585    
3586            * Thuban/UI/classifier.py: Fixes RTbug #1971.
3587            (Classifier.__BuildClassification, Classifier.__SetGridTable):
3588            Call Classification.SetFieldInfo() instead of SetFieldType.
3589    
3590            * Thuban/UI/renderer.py: Fixes RTbug #1971.
3591    
3592            * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
3593            (MapCanvas.__init__): Subscribe to the idle time event. Set
3594            background color to white.
3595            (MapCanvas.OnPaint): Set a flag indicating that we should
3596            render the map during idle time. If we already have a bitmap
3597            just draw it now.
3598            (MapCanvas.OnIdle): New. Render the map only during idle time.
3599            This also fixes a problem with the busy cursor under gtk.
3600    
3601            * test/test_classgen.py (ClassGenTest.test_generate_singletons):
3602            Fix calls to generate_singletons because the signature changed.
3603    
3604            * test/test_classification.py: Fix color references and
3605            change calls to Classification.[SetField|SetFieldType] to
3606            SetFieldInfo.
3607    
3608            * test/test_load.py: Fix color references.
3609    
3610            * test/test_load_0_2.py: Fix color references.
3611    
3612            * test/test_save.py (SaveSessionTest.testClassifiedLayer):
3613            Change calls to Classification.[SetField|SetFieldType] to
3614            SetFieldInfo.
3615    
3616    2003-07-01  Frank Koormann   <[email protected]>
3617    
3618            MERGE from the greater-ms3 branch.
3619    
3620            * test/test_transientdb.py
3621            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
3622            New. Test join of two tables with partly equal column names.
3623    
3624            * Thuban/Model/transientdb.py (TransientJoinedTable.create):
3625            If duplicates in left and right tables column names are found,
3626            append '_' (underscores) to the name until it is unique.
3627            Create always new internal names for the resulting table and reference
3628            columns in the join statement with <table>.<column>
3629    
3630    2003-07-01  Bernhard Herzog  <[email protected]>
3631    
3632            * test/test_transientdb.py
3633            (TestTransientTable.test_transient_joined_table_same_column_name):
3634            New. Test whether joining on columns with the same names in both
3635            tables works.
3636            
3637            * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
3638            sure to use the right internal names even when joining on field
3639            with the same names in both tables. Also, detect duplicate names
3640            in the joined table correctly.
3641    
3642    2003-07-01  Frank Koormann   <[email protected]>
3643    
3644            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
3645            Reverse List of layers to render in same order as in desktop legend.
3646    
3647    2003-06-30  Jonathan Coles   <[email protected]>
3648    
3649            * Thuban/version.py (make_tuple): Takes a version string
3650            and splits it into a tuple of at most three integers.
3651            Used make_tuple() to make tuple versions of the version
3652            numbers.
3653    
3654            * Thuban/UI/about.py: Add Thuban email addresses.
3655    
3656    2003-06-30  Jonathan Coles   <[email protected]>
3657    
3658            * Thuban/version.py: SQLite/PySQLite version dependencies
3659            were too high.
3660    
3661    2003-06-30  Jonathan Coles   <[email protected]>
3662    
3663            * Thuban/version.py: Update version to 0.8.1
3664            
3665            * MANIFEST.in: Added Projections so that default.proj is
3666            included.
3667    
3668    2003-06-26  Jonathan Coles   <[email protected]>
3669    
3670            New About box with lots more information including library
3671            versions and credits. More/better version checking before
3672            Thuban starts.
3673    
3674            * Thuban/UI/about.py: New. New About box that displays
3675            library version information and credits.
3676    
3677            * Thuban/version.py: Added new 'versions' dictionary which
3678            contains the verions of various libraries which are checked
3679            when the module loads.
3680            (verify_versions): Check all version numbers and returns
3681            a list of errors.
3682    
3683            * Thuban/UI/classifier.py (Classifier.__EnableButtons):
3684            Reset the status of the buttons as the situation warrants,
3685            but in a better more reliable way by not relying on the
3686            current status to determine what needs to change.
3687    
3688            * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
3689            (verify_versions): Remove most of the code since it is
3690            now in Thuban.version.verify_versions.o
3691    
3692            * Thuban/UI/mainwindow.py (MainWindow.About): Call new
3693            About box in Thuban.UI.about.
3694    
3695            * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
3696            Returns the version of gdal library being used as a string.
3697    
3698            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
3699            Removed.
3700            (get_proj_version): Return the version of PROJ that the file
3701            was compiled with.
3702            (get_gtk_version): Return th version of GTK that the file
3703            was compiled with.
3704    
3705    2003-06-25  Jonathan Coles   <[email protected]>
3706    
3707            * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
3708            of the SelectPropertiesDialog should be self so the window
3709            appears on top.
3710            (ClassGroupPropertiesCtrl.DoEdit): The parent
3711            of the SelectPropertiesDialog should be self so the window
3712            appears on top.
3713    
3714            * Thuban/UI/resource.py: Cleaned up how we determine file
3715            extensions.
3716            (GetImageResource): Return an wxImage from our Resources.
3717    
3718    2003-06-24  Jonathan Coles   <[email protected]>
3719    
3720            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
3721            Check that a layer has a classification before trying
3722            to get it. Raster layers don't have classifications.
3723    
3724    2003-06-23  Jonathan Coles   <[email protected]>
3725            
3726            * setup.py: Add Resources/XML to resource list.
3727        
3728    2003-06-23  Jonathan Coles   <[email protected]>
3729    
3730            * setup.cfg: Fix copyright dates
3731        
3732    2003-06-23  Jonathan Coles   <[email protected]>
3733    
3734            * MANIFEST.in: Update with Resources/XML
3735    
3736            * setup.py: Don't include Locale resources yet as we don't
3737            have any and it causes problems building the distribution
3738            for Windows. Update version to 0.8.0.
3739    
3740            * Doc/thuban.dtd: Removed since it is now in Resources/XML.
3741    
3742            * Thuban/UI/mainwindow.py: Add blank line at the end because
3743            file was not being read correctly building the Windows
3744            distribution.
3745    
3746    2003-06-23  Jonathan Coles   <[email protected]>
3747    
3748            * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
3749    
3750            * Thuban/version.py: Temporarily update longversion for
3751            the 0.8 release so that it doesn't have the cvs revision.
3752    
3753    2003-06-23  Jonathan Coles   <[email protected]>
3754    
3755            * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
3756            to make sure that we don't create reentrant possibilities with
3757            wxYield.
3758    
3759            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
3760            directly to avoid the wxSafeYield() call which generates an
3761            OnPaint event causing infinite recursion. Don't try to catch
3762            exception anymore. This was for before there were limits on map
3763            scaling.
3764    
3765    2003-06-23  Bernhard Herzog  <[email protected]>
3766    
3767            Bug fix for RT #1961:
3768    
3769            * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
3770            Register DerivedShapestores with the session
3771    
3772            * Thuban/Model/session.py (Session.Tables): Make sure each table
3773            is only listed once.
3774    
3775            * test/test_load.py (TestJoinedTable.test): Add check_format call.
3776            Update file contents to match the one written out.
3777    
3778    2003-06-20  Bernhard Herzog  <[email protected]>
3779    
3780            * test/xmlsupport.py (SaxEventLister.startElementNS)
3781            (SaxEventLister.endElementNS): Do not include the qname. Python
3782            2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
3783            is (presumably incorrectly) None, whereas it's a string with the
3784            element name in the later versions.
3785    
3786            * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
3787            (TestEventList.test_even_list_namespace): Update tests to reflect
3788            the new behaviour
3789            (TestEventList.test_even_list_id_normalization): Fix doc-string
3790    
3791    2003-06-20  Jonathan Coles   <[email protected]>
3792    
3793            * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
3794            by deriving classes to determine if that layer supports shapes.
3795            (Layer): Override HasShapes and return true.
3796    
3797            * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
3798            instead of a direct call to wx[Begin|End]CusyCursor().
3799            (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
3800            table data.
3801    
3802            * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
3803            New. Wrappers around the wxWindows functions that allow us to
3804            make additional calls such as wxYield which gives the native
3805            system a chance to update the cursor correctly.
3806    
3807            * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
3808            instead of a direct call to wx[Begin|End]CusyCursor().
3809    
3810            * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
3811            instead of a direct call to wx[Begin|End]CusyCursor().
3812            (MapCanvas.find_shape_at): Check if the current search layer
3813            support shapes, otherwise go on to the next layer.
3814    
3815            * test/test_layer.py: Add tests in each type of layer for
3816            HasClassification() and HasShapes()
3817    
3818    2003-06-20  Jonathan Coles   <[email protected]>
3819    
3820            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
3821            turning on the busy cursor to allow the system to change the
3822            cursor before we begin painting. This fixes a problem that
3823            was occuring only under GTK. Fixes RTbug #1840.
3824    
3825    2003-06-20  Bernhard Herzog  <[email protected]>
3826    
3827            * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
3828            version.
3829    
3830            * Thuban/Model/save.py (sort_data_stores): New. Make topological
3831            sort of the data sources so they can be written with sources that
3832            data sources that depend on other data sources come after the
3833            sources they depend on.
3834            (SessionSaver.__init__): Add idmap instance variable to map from
3835            objects to the ids used in the file.
3836            (SessionSaver.get_id, SessionSaver.define_id)
3837            (SessionSaver.has_id): New. Methods to manage the idmap
3838            (SessionSaver.write): Use thuban-0.8.dtd
3839            (SessionSaver.write_session): Add a namespace on the session and
3840            write out the data sources before the maps.
3841            (SessionSaver.write_data_containers): New. Write the data
3842            containers.
3843            (SessionSaver.write_layer): Layer elements now refer to a
3844            shapestore and don't contain filenames anymore.
3845    
3846            * Thuban/Model/load.py (LoadError): Exception class to raise when
3847            errors in the files are discovered
3848            (SessionLoader.__init__): Define dispatchers for elements with a
3849            thuban-0.8 namespace too.
3850            (SessionLoader.check_attrs): New helper method to check and
3851            convert attributes
3852            (AttrDesc): New. Helper class for SessionLoader.check_attrs
3853            (SessionLoader.start_fileshapesource)
3854            (SessionLoader.start_derivedshapesource)
3855            (SessionLoader.start_filetable, SessionLoader.start_jointable):
3856            Handlers for the new elements in the new fileformat
3857            (SessionLoader.start_layer): Handle the shapestore attribute in
3858            addition to filename.
3859            (SessionLoader.start_table, SessionLoader.end_table): Removed.
3860            They were never used in the old formats and aren't needed for the
3861            new.
3862    
3863            * Thuban/Model/session.py (Session.DataContainers): New method to
3864            return all "data containers", i.e. shapestores and tables
3865    
3866            * test/xmlsupport.py (SaxEventLister.__init__)
3867            (SaxEventLister.startElementNS, sax_eventlist): Add support to
3868            normalize IDs.
3869    
3870            * test/test_xmlsupport.py
3871            (TestEventList.test_even_list_id_normalization): New test case for
3872            id normalization
3873    
3874            * test/test_load.py (LoadSessionTest.check_format): Use ID
3875            normalization
3876            (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
3877            class atrributes used for ID normalization
3878            (TestSingleLayer, TestLayerVisibility, TestLabels.test)
3879            (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
3880            file format
3881            (TestJoinedTable): New test for loading sessions with joined
3882            tables.
3883            (TestLoadError): New. Test whether missing required attributes
3884            cause a LoadError.
3885    
3886            * test/test_save.py (SaveSessionTest.thubanids)
3887            (SaveSessionTest.thubanidrefs): New class attributes for ID
3888            normalization in .thuban files.
3889            (SaveSessionTest.compare_xml): Use id-normalization.
3890            (SaveSessionTest.testEmptySession)
3891            (SaveSessionTest.testLayerProjection)
3892            (SaveSessionTest.testRasterLayer)
3893            (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
3894            (SaveSessionTest.testLayerProjection): The filename used was the
3895            same as for testSingleLayer. Use a different one.
3896            (SaveSessionTest.test_dbf_table)
3897            (SaveSessionTest.test_joined_table): New test cases for saving the
3898            new data sources structures.
3899            (TestStoreSort, MockDataStore): Classes to test the sorting of the
3900            data stores for writing.
3901    
3902            * test/runtests.py: Add CVS keywords
3903    
3904    2003-06-20  Jonathan Coles   <[email protected]>
3905    
3906            * test/test_session.py
3907            (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
3908            Use the cultural_landmark-point.dbf file for the store so that
3909            the table rows and shape count match.
3910    
3911    2003-06-20  Jonathan Coles   <[email protected]>
3912    
3913            * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
3914            an exception if the number of shapes is different from the
3915            number of rows in the table. Address RTbug #1933.
3916    
3917            * test/test_layer.py (TestLayer.test_derived_store): Add
3918            a test for the new exception in DerivedShapeStore.__init__.
3919    
3920            * test/support.py (FloatTestCase): Removed since there is
3921            already FloatComparisonMixin. Fixes RTbug #1954.
3922            (FloatComparisonMixin.assertFloatEqual): Include test for
3923            infinity that was part of FloatTestCase.
3924    
3925            * test/test_range.py (RangeTest): Inherit from
3926            support.FloatComparisonMixin now that we don't have
3927            support.FloatTestCase.
3928    
3929    2003-06-20  Bernhard Herzog  <[email protected]>
3930    
3931            * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
3932            the implementation in xmlsupport instead.
3933            (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
3934    
3935            * test/test_proj.py: Import sax_eventlist from xmlsupport instead
3936            of test_save
3937    
3938    2003-06-20  Bernhard Herzog  <[email protected]>
3939    
3940            * test/test_load.py (LoadSessionTest.check_format): New helper
3941            method to make sure the test files we load might have been written
3942            by the current thuban version.
3943            (ClassificationTest.TestLayers, TestSingleLayer.test)
3944            (TestLayerVisibility.test, TestClassification.test)
3945            (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
3946            Add check_format() calls and fix the thuban data to match the data
3947            that would be written by saving the session loaded from it.
3948    
3949            * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
3950            the same class and function in test_save.
3951    
3952            * test/test_xmlsupport.py (TestEventList): New. test cases for
3953            sax_eventlist
3954    
3955    2003-06-20  Bernhard Herzog  <[email protected]>
3956    
3957            * Resources/XML/thuban.dtd: Add comment about which versions of
3958            Thuban are covered by this DTD
3959            (map): Fix content model for layers and raster layers. There can
3960            be any number or layers and raster layers in any order.
3961    
3962    2003-06-20  Jonathan Coles   <[email protected]>
3963    
3964            This is mainly about fixing RTbug #1949.
3965    
3966            * Thuban/Model/classification.py: Remove "from __future__"
3967            import statement since python 2.2 is the earliest supported
3968            version.
3969    
3970            * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
3971            Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
3972            depending on the units this projection *forwards* into.
3973    
3974            * Thuban/Model/save.py (SessionSaver.write_classification):
3975            Remove unnecessary use of lambdas and nested functions.
3976    
3977            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
3978            adjustment here if the map projection uses degrees.
3979    
3980            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
3981            scale adjust code since it is now done before calling
3982            this method. Don't do anything if the map projection
3983            is None.
3984    
3985    2003-06-19  Bernhard Herzog  <[email protected]>
3986    
3987            Move version specific load tests to their own file.
3988    
3989            * test/test_load.py: Expand the doc-string to explain a bit how to
3990            handle file format changes.
3991            (TestClassification.test): Update the docstring as this test is
3992            not about Thuban 0.2 anymore.
3993    
3994            * test/test_load_0_2.py: New file with the load tests for thuban
3995            files created with Thuban 0.2 and earlier.
3996    
3997    2003-06-19  Bernhard Herzog  <[email protected]>
3998    
3999            Add XML validation to some of the tests. Validation will only be
4000            done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
4001            To make the DTD available to the test cases it's moved into
4002            Resources/XML
4003    
4004            * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
4005            for versions up to and including 0.2. Two slight changes: added an
4006            encoding specification and fixed the comment which refered to
4007            GRASS, not Thuban
4008    
4009            * test/xmlsupport.py: New support module for tests involving XML.
4010            Currently there's a mix-in class for XML validation.
4011    
4012            * test/test_xmlsupport.py: New. Tests for the xmlsupport module
4013    
4014            * test/test_save.py (SaveSessionTest): Derive from ValidationTest
4015            so that we can validate the
4016            (SaveSessionTest.testEmptySession)
4017            (SaveSessionTest.testSingleLayer)
4018            (SaveSessionTest.testSingleLayer)
4019            (SaveSessionTest.testLayerProjection)
4020            (SaveSessionTest.testRasterLayer)
4021            (SaveSessionTest.testClassifiedLayer): Validate the generated XML
4022    
4023            * test/runtests.py (main): Call print_additional_summary instead
4024            of print_garbage_information
4025    
4026            * test/support.py (resource_dir): New function to return the
4027            "Resource" subdirectory
4028            (print_additional_summary): New function to combine several
4029            summary functions
4030            (run_tests): Use print_additional_summary instead of calling
4031            print_garbage_information directly
4032    
4033    2003-06-19  Bernhard Herzog  <[email protected]>
4034    
4035            * Doc/thuban.dtd (classification): Correct the content model of
4036            the classification element.
4037            (projection): Add the "name" attribute
4038    
4039    2003-06-19  Frank Koormann   <[email protected]>
4040    
4041            MERGE from the greater-ms3 branch.
4042    
4043            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
4044            scale if projection is latlong to get better estimate.
4045    
4046            Fix problem of hidden properties dialog under windows after double
4047            click on layer tree:
4048            The tree control always gets an Expanded / Collapsed event after
4049            the ItemActivated  on double click, which raises the main window again.         We add a second ItemActivated event to the queue, which simply
4050            raises the already displayed window.
4051    
4052            * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
4053            raiseProperties initialized to prevent endless loops
4054            (LegendTree._OnItemActivated): Depending on self.raiseProperties
4055            simply raise the properties or open the dialog and issue a second
4056            event.
4057    
4058    2003-06-18  Jonathan Coles   <[email protected]>
4059    
4060            * setup.py: Fix a few problems that occured under Windows.
4061    
4062    2003-06-18  Jonathan Coles   <[email protected]>
4063    
4064            When Thuban loaded the map was redrawn twice because the
4065            legend was being opened after the mainwindow was created
4066            and not during its creation. This meant the map was drawn
4067            initially and then had to be redrawn when the legend
4068            caused the display to change. Now the legend is opened
4069            in the mainwindow constructor which resolves this issue.
4070    
4071            Also, although we were checking for the existence of
4072            gdal and gdalwarp modules, the gdalwarp extension was
4073            still being compiled (which may fail if the system doesn't
4074            have gdal installed). the build_ext command to setup.py
4075            now accepts the flags --with-gdal and --without-gdal.
4076            If --without-gdal is specified setup.py will try to
4077            use the gdal parameters specified by gdal-config. Under
4078            windows, those parameters have to be set in setup.py
4079            as with proj4 an wxWindows.
4080    
4081            * setup.py: Use a list instead of seperate variables for
4082            extension parameters so we can create a generic function
4083            that runs an appropriate *-config script.
4084            (run_cs_script): Renamed from run_wx_script and modified
4085            to accept a second argument which is a list of lists to
4086            be filled in by the values returned from running the command.
4087            (thuban_build_ext): New. Extends the build_ext command and
4088            provides the options --with-gdal/--without-gdal which then
4089            optionally includes the gdalwarp extension.
4090    
4091            * Thuban/Model/resource.py: First check if we can import
4092            the gdalwarp Thuban extension before checking for gdal.
4093            Also added some comments.
4094            
4095            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
4096            the map is None which may be the case if none has been loaded
4097            yet.
4098    
4099            * Thuban/UI/main.py (main): Remove call to ShowLegend.
4100    
4101            * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
4102    
4103            * Thuban/UI/renderer.py: Check for gdal support before importing
4104            gdalwarp.
4105            (MapRenderer.render_map): Only try to optimize if we have gdal
4106            support otherwise nothing will get drawn.
4107    
4108            * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
4109            during startup before a map has been created. Check if map is None
4110            before using it and do nothing if it is.
4111    
4112    2003-06-17  Jonathan Coles   <[email protected]>
4113    
4114            Fix the problem with raster layers under Windows that caused
4115            Thuban to crash. The view should respond to layer projection
4116            changed events to update the display. Changes to a projection
4117            should not cause the map to be set to full extent.
4118            
4119            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4120            current_map_proj to remember the current map projection so that
4121            when the projection changes we know what the previous projection
4122            was.
4123            (MapCanvas.SetMap): Unsubscribe and subscribe to
4124            LAYER_PROJECTION_CHANGED events.
4125            (MapCanvas.projection_changed): Split into two methods that respond
4126            to map and layer projection changes.
4127            (MapCanvas.map_projection_changed): New. Takes the current view and
4128            projects it using the new projection. This does not cause the
4129            map to be redrawn at full extent.
4130            (MapCanvas.layer_projection_changed): New. Cause a redraw which
4131            will draw each layer in its new projection.
4132            
4133            * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
4134            VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
4135            under Windows.
4136            
4137            * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
4138            to twice sizeof(void*) because there are two digits for each
4139            hex byte.
4140    
4141    2003-06-16  Bernhard Herzog  <[email protected]>
4142    
4143            Update to the layer interface: Direct access to the table,
4144            shapetable, shapefile and filename attributes is now actively
4145            deprecated by issuing deprecation warnings for all places where
4146            this happens.
4147    
4148            * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
4149            to the instance variables table, shapetable, shapefile and
4150            filename via __getattr__ so that we can issue a deprecation
4151            warning.
4152            (Layer.SetShapeStore): Don't set the deprecated instance variables
4153            any more
4154            (Layer.SetShapeStore): Don't use deprecated layer instance
4155            variables
4156            (Layer.Destroy): No need to explicitly remove the instance
4157            variables any more
4158            (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
4159            instance variables
4160    
4161            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
4162            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
4163            (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
4164            use deprecated layer instance variables
4165    
4166            * Thuban/UI/classifier.py (Classifier.__init__): Don't use
4167            deprecated layer instance variables
4168    
4169            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
4170            (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
4171            instance variables
4172    
4173            * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
4174            deprecated layer instance variables
4175    
4176            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
4177            deprecated layer instance variables
4178    
4179            * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
4180            deprecated layer instance variables
4181    
4182            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
4183            (MapRenderer.polygon_render_param): Don't use deprecated layer instance
4184            variables
4185    
4186            * test/runtests.py (main): Turn Thuban's deprecation warnings into
4187            errors so that they're cought by the tests
4188    
4189            * test/test_load.py (TestSingleLayer.test): Don't use deprecated
4190            layer instance variables
4191    
4192    2003-06-16  Jonathan Coles   <[email protected]>
4193    
4194            Fix a problem under Windows whereby if the user double-clicks on a
4195            layer in the legend that tree item will expand or collapse as well
4196            as open the layer properties dialog. The state of the tree item
4197            should not be affected.
4198    
4199            * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
4200            preventExpandCollapse and subscribe to expanding and collapsing
4201            events.
4202            (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
4203            collapsing events and will veto the event if it has been triggered
4204            by the user double clicking on a layer.
4205            (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
4206            that an expanding/collapsing event should be vetoed.
4207    
4208    2003-06-13  Bernhard Herzog  <[email protected]>
4209    
4210            * Thuban/UI/classifier.py (Classifier.OnClose)
4211            (Classifier.map_layers_removed)
4212            (Classifier.layer_shapestore_replaced): Unsubscribe the messages
4213            in OnClose and not in map_layers_removed or
4214            layer_shapestore_replaced to make sure it always happens when the
4215            dialog is closed
4216    
4217    2003-06-13  Jonathan Coles   <[email protected]>
4218    
4219            This puts back a fix for Windows where a panel is needed so that
4220            the background of the table view appears correctly.
4221    
4222            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
4223            object that can be used by derived classes to place any
4224            controls (including the grid) onto.
4225            (QueryTableFrame.__init__): Use the panel as the parent window
4226            for all the controls. Reparent the grid so that the panel is
4227            the parent. Call UpdateStatusText() to correctly initialize
4228            the status bar.
4229    
4230    2003-06-13  Jonathan Coles   <[email protected]>
4231    
4232            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
4233            from wxFrame (as opposed to wxDialog like the other classes)
4234            but otherwise behaves like the other classes. This is needed
4235            for the TableView which isn't really a dialog and needs to
4236            have a status bar and control buttons.
4237    
4238            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
4239            instance variable to keep track of how many rows are selected.
4240            Subscribe once to the the events we are interested in.
4241            (ThubanGrid.OnRangeSelect): Only handle event if event handling
4242            hasn't been turned off.
4243            (ThubanGrid.OnSelectCell): Only handle event if event handling
4244            hasn't been turned off.
4245            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
4246            as an event listener (which changes the event handler stack)
4247            simply set an instance variable to False. This is checked in
4248            the event handlers.
4249            (ThubanGrid.GetNumberSelected): Return the number of currently
4250            selected rows.
4251            (TableFrame): Inherit from ThubanFrame so we can have a
4252            status bar and control buttons.
4253            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
4254            Explicitly set which items are selected in the operator choice and
4255            action choice so there is always a valid selection. Fixes RTbug #1941.
4256            Subscribe to grid cell selection events so we can update the
4257            status bar.
4258            (QueryTableFrame.UpdateStatusText): Update the status bar with
4259            how many rows are in the grid, how many columns, and how many
4260            rows are selected.
4261            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
4262            Call UpdateStatusText when cells are (de)selected.
4263            (QueryTableFrame.OnQuery): Use the string value in the value
4264            combo if either the selected item index is 0 or if the string
4265            cannot be found in the predefined list (this happens if the
4266            user changes the text). Fixes RTbug #1940.
4267            Only turn off the grid event listeners if there a query comes
4268            back with a none empty list of ids. in the case that the list
4269            is empty this causes a grid.ClearSelection() call to actually
4270            clear the grid selection which causes the selected items in
4271            the map to be deselected. Fixes RTbug #1939.
4272    
4273            * test/test_save.py (XMLWriterTest.Encode): Check return values.
4274            Fixes RTbug #1851.
4275    
4276    2003-06-13  Bernhard Herzog  <[email protected]>
4277    
4278            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
4279            self.selected_shape with the current selection to make sure the
4280            contents of the dialog are up to date when it's shown for the
4281            first time.
4282            The dialog used to work without this by luck. The recent fix to
4283            the connector module 'broke' a 'feature' the identify view was
4284            relying on, i.e that subscribing to a message in response to
4285            receiving a message of that type would mean that the new
4286            subscriber would also be called for the same message.
4287            
4288    2003-06-12  Jonathan Coles   <[email protected]>
4289    
4290            * extensions/thuban/gdalwarp.cpp: Removed debug printing as
4291            the image is rendered. Fixes RTbug #1937.
4292    
4293    2003-06-12  Jonathan Coles   <[email protected]>
4294    
4295            * Thuban/Lib/fileutil.py: As is done under Windows, create the
4296            user directory if it doesn't exist on a posix system.
4297            Fixes RTbug #1815.
4298    
4299            * Thuban/Model/resource.py (get_user_proj_files): Moved the
4300            called to get_application_dir here, so that the directory
4301            will only be called if this method is invoked.
4302    
4303            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
4304            the projfilepath if no projection is selected.
4305    
4306    2003-06-12  Jonathan Coles   <[email protected]>
4307    
4308            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
4309            the scalebar if the current map has no projection set.
4310    
4311            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
4312            projfilepath label to just the basename of the projection file
4313            rather than include the entire path.
4314    
4315            * Thuban/Model/resource.py: Fix missed proj functions that
4316            needed to be renamed.
4317    
4318    2003-06-12  Jonathan Coles   <[email protected]>
4319    
4320            * Thuban/Model/classification.py: Removed assert statements that
4321            tested if the variable was an instance of Color.
4322    
4323            * Thuban/Model/color.py (Color): Remove commented code that isn't
4324            used.
4325            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
4326            Fixes RTbug #1835.
4327            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
4328            Needed now that the class doesn't inherit from Color.
4329    
4330    2003-06-12  Jonathan Coles   <[email protected]>
4331    
4332            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
4333            check unicode strings.
4334    
4335            * test/test_layer.py: Check for existence of gdal.
4336    
4337    2003-06-12  Jonathan Coles   <[email protected]>
4338        
4339            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
4340            that was in load.py
4341    
4342            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
4343            that was in save.py
4344    
4345    2003-06-12  Jonathan Coles   <[email protected]>
4346    
4347            This is largely a collection of bug fixes. We also handle the
4348            case where gdal is not on the system. The XMLReader and XMLWriter
4349            classes were moved into there own files to resolve some circular
4350            import references and because they shouldn't really be in the
4351            file that is dediciated to reading/writing session files since
4352            they are also used elsewhere.
4353    
4354            * Thuban/Model/classgen.py: Renamed functions to follow the
4355            function_names_with_underscores style. Fixes RTbug #1903.
4356            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
4357    
4358            * Thuban/Model/layer.py: Import gdal only if it available.
4359            (RasterLayer): Handle the case where the gdal library is unavailable.
4360            Addresses RTbug #1877.
4361    
4362            * Thuban/Model/load.py (XMLReader): Moved into seperate file
4363            xmlreader.py.
4364    
4365    2003-06-12  Jonathan Coles   <[email protected]>
4366    
4367            This is largely a collection of bug fixes. We also handle the
4368            case where gdal is not on the system. The XMLReader and XMLWriter
4369            classes were moved into there own files to resolve some circular
4370            import references and because they shouldn't really be in the
4371            file that is dediciated to reading/writing session files since
4372            they are also used elsewhere.
4373    
4374            * Thuban/Model/classgen.py: Renamed functions to follow the
4375            function_names_with_underscores style. Fixes RTbug #1903.
4376            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
4377    
4378            * Thuban/Model/layer.py: Import gdal only if it available.
4379            (RasterLayer): Handle the case where the gdal library is unavailable.
4380            Addresses RTbug #1877.
4381    
4382            * Thuban/Model/load.py (XMLReader): Moved into seperate file
4383            xmlreader.py.
4384    
4385            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
4386            file xmlwriter.py.
4387    
4388            * Thuban/Model/resource.py: Renamed functions to following the
4389            function_names_with_underscores style.
4390            (has_gdal_support): New function that returns true if the gdal
4391            library is available. Addresses RTbug #1877.
4392    
4393            * Thuban/UI/application.py (ThubanApplication.OpenSession):
4394            Display a message box if the gdal library is not available, but
4395            only if there are any layers that would use it. Addresses RTbug #1877.
4396    
4397            * Thuban/UI/classgen.py: Use renamed projection resource functions.
4398            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
4399            when using integers versus floats.
4400    
4401            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
4402            determine if the "Add Image Layer" menu option should be
4403            greyed out or not. Addresses RTbug #1877.
4404    
4405            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
4406    
4407            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
4408            optimize if a raster layer is visible. Fixes RTbug #1931.
4409            Only draw the raster layer if the gdal library is available.
4410            Addresses RTbug #1877.
4411    
4412            * test/test_classgen.py: Add tests for generate_singletons,
4413            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
4414            (test_calculate_quantiles): Fix some tests to catch the new
4415            ValueError that is raised.
4416    
4417            * test/test_proj.py: Use renamed projection resource functions.
4418    
4419            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
4420            test for saving classified layers. Fixes RTbug #1902.
4421            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
4422    
4423    2003-06-12  Jan-Oliver Wagner <[email protected]>
4424    
4425            Fix for http://intevation.de/rt/webrt?serial_num=1900.
4426    
4427            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
4428    
4429            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
4430            multiplechoicedialog.py rather than from the wxPython library.
4431    
4432    2003-06-11  Frank Koormann  <[email protected]>
4433    
4434            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
4435            update.
4436    
4437    2003-06-11  Frank Koormann  <[email protected]>
4438    
4439            * Thuban/Lib/fileutil.py (get_application_dir): New function to
4440            determine the absolute .thuban/thuban directory under
4441            "posix" (os.expanduser) and "nt" (read AppData registry key).
4442    
4443            * Thuban/Model/resource.py: Use get_application_dir
4444    
4445            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
4446            Use get_application_dir.
4447    
4448    2003-06-10  Bernhard Herzog  <[email protected]>
4449    
4450            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
4451            the messages MAP_LAYERS_REMOVED messages
4452            (LayerTableFrame.OnClose): Unsubscribe from it.
4453            (LayerTableFrame.map_layers_removed): New. Receiver for
4454            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
4455            dialog is showing is removed.
4456    
4457    2003-06-10  Bernhard Herzog  <[email protected]>
4458    
4459            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
4460            of the receivers list so that unsubscribing in a receiver doesn't
4461            modify it while iterating over it.
4462    
4463            * test/test_connector.py
4464            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
4465            unsubscribing in a receiver works correctly. See docstring for
4466            details
4467    
4468    2003-06-10  Bernhard Herzog  <[email protected]>
4469    
4470            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
4471            message.
4472    
4473            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
4474            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
4475            LAYER_CHANGED will still be sent if the classification changes.
4476    
4477            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
4478            parameter so we can subscribe to some of its messages
4479            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
4480            and the layer's LAYER_SHAPESTORE_REPLACED
4481            (Classifier.unsubscribe_messages): New. Unsubscribe from message
4482            subscribed to in __init__
4483            (Classifier.map_layers_removed)
4484            (Classifier.layer_shapestore_replaced): receivers for the messages
4485            subscribed to in __init__. Unsubscribe and close the dialog
4486    
4487            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
4488            the map to the Classifier dialog
4489    
4490            * test/test_layer.py (SetShapeStoreTests): Derive from
4491            SubscriberMixin as well so we can test messages
4492            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
4493            messages
4494            (SetShapeStoreTests.tearDown): Clear the messages again
4495            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
4496            for the modified flag too
4497            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
4498            to check whether SetShapeStore sets the modified flag
4499            (SetShapeStoreTests.test_set_shape_store_different_field_name)
4500            (SetShapeStoreTests.test_set_shape_store_same_field)
4501            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
4502            Add tests for the messages. This checks both the new
4503            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
4504    
4505    2003-06-06  Jan-Oliver Wagner <[email protected]>
4506    
4507            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
4508            the menu items.
4509    
4510    2003-06-05  Frank Koormann  <[email protected]>
4511    
4512            * Thuban/UI/identifyview.py (IdentifyView.__init__):
4513            Layout reimplemented without panel. Make life easier to fit the list
4514            in the dialog.
4515    
4516    2003-06-05  Frank Koormann  <[email protected]>
4517    
4518            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
4519            once on initialisation (Former implementation resulted in multiple
4520            entries for each projection).
4521            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
4522            if set, select the projection found under the specified name. This
4523            overwrites any other selection estimate.
4524            Removed projchoice filling from this method.
4525            (ProjFrame._OnSave, ProjFrame._OnAddToList):
4526            Updated call of ProjFrame.__FillAvailList
4527            (LCCPanel._DoLayout): Moved parameter controls in more common order.
4528    
4529            * Resources/Projections/defaults.proj: Extended defaults representing
4530            various common European projections.
4531    
4532    2003-06-05  Frank Koormann  <[email protected]>
4533    
4534            * Thuban/UI/identifyview.py (IdentifyView.__init__):
4535            Use ListCtrl instead of GridCtrl
4536    
4537            * Thuban/Model/resource.py:
4538            Guess location of .thuban directory from tempdir parent directory.
4539    
4540            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
4541            Guess location of .thuban directory from tempdir parent directory.
4542    
4543    2003-06-04  Bernhard Herzog  <[email protected]>
4544    
4545            Do not cache the values returned by the tree widget's
4546            GetFirstChild and GetNextChild methods because it led to lots of
4547            segfaults. The new way requires more brute force but is more
4548            reliable.
4549    
4550            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
4551            variable layer2id
4552            (LegendTree.find_layer): New method to do with brute force what
4553            layer2id tried to accomplish
4554            (LegendTree._OnMsgLayerChanged)
4555            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
4556            Use find_layer instead of layer2id
4557            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
4558            update layer2id anymore
4559            (LegendTree._OnMsgMapLayersRemoved)
4560            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
4561    
4562    2003-06-03  Thomas Koester  <[email protected]>
4563    
4564            * Thuban/Model/classgen.py (GenQuantiles0): New function.
4565    
4566    2003-06-02  Bernhard Herzog  <[email protected]>
4567    
4568            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
4569            New commands.
4570            (main_menu): Add the new commands.
4571            (MainWindow.TableRename): New. Implementation of the table_rename
4572            command.
4573            (MainWindow.RenameLayer): New. Implementation of the layer_rename
4574            command.
4575    
4576            * Thuban/Model/session.py (Session.AddTable): call self.changed to
4577            set the modified flag
4578    
4579            * test/test_session.py (TestSessionSimple.test_add_table): Test
4580            whether the modified flag is set properly
4581    
4582            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
4583            instead of issue so that the modified flags get updated.
4584    
4585            * test/test_base.py (SomeTitledObject): Derive from Modifiable
4586            instead of Publisher to reflect reality better and to accomodate
4587            the fact that SetTitle now calls changed instead of issue
4588    
4589    2003-06-02  Bernhard Herzog  <[email protected]>
4590    
4591            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
4592            acquisition has to happen before the try in a try-finally.
4593    
4594    2003-06-02  Bernhard Herzog  <[email protected]>
4595    
4596            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
4597            possible that a layer is removed that is not currently selected in
4598            the legend so don't check for this.
4599    
4600    2003-05-30  Bernhard Herzog  <[email protected]>
4601    
4602            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
4603            variables to None that have direct or indirect references to
4604            shapefiles or dbf files to make sure that they do go away and the
4605            files are closed.
4606    
4607    2003-05-30  Bernhard Herzog  <[email protected]>
4608    
4609            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
4610            availImgListIndices when a new image list is created
4611            
4612    2003-05-30  Bernhard Herzog  <[email protected]>
4613    
4614            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
4615            changing_selection to indicate whether the LegendTree code itself
4616            is currently changing the selection
4617            (LegendTree.normalize_selection): New method to normalize the
4618            selection by selecting the layer item even if the user clicked on
4619            the classification.
4620            (LegendTree._OnSelChanged): normalize the selection. This works
4621            around a bug in wx which doesn't keep track of the selection
4622            properly when subtrees are deleted.
4623    
4624  2003-05-30  Bernhard Herzog  <[email protected]>  2003-05-30  Bernhard Herzog  <[email protected]>
4625    
4626          * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the          * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the

Legend:
Removed from v.1112  
changed lines
  Added in v.2055

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26